package com.thebrokenrail.reliccraft.item; import com.thebrokenrail.reliccraft.RelicCraft; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.item.TooltipContext; import net.minecraft.entity.Entity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.Item; import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundTag; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.text.LiteralText; import net.minecraft.text.Text; import net.minecraft.text.TranslatableText; import net.minecraft.util.ActionResult; import net.minecraft.util.Formatting; import net.minecraft.util.Hand; import net.minecraft.util.Rarity; import net.minecraft.util.TypedActionResult; import net.minecraft.world.World; import java.util.List; public class TimeDilaterItem extends Item { public enum TimeSpeed { NORMAL, FAST, VERY_FAST } public interface DilatedWorld { void setTimeSpeed(TimeSpeed speed); TimeSpeed getTimeSpeed(); } public TimeDilaterItem() { super(new Settings().group(ItemGroup.MISC).maxDamage(9).rarity(Rarity.UNCOMMON)); } @Override public TypedActionResult use(World world, PlayerEntity user, Hand hand) { ItemStack stack = user.getStackInHand(hand); if (!world.isClient()) { DilatedWorld dilatedWorld = (DilatedWorld) world; switch (dilatedWorld.getTimeSpeed()) { case FAST: { dilatedWorld.setTimeSpeed(TimeSpeed.VERY_FAST); break; } case VERY_FAST: { dilatedWorld.setTimeSpeed(TimeSpeed.NORMAL); break; } case NORMAL: { dilatedWorld.setTimeSpeed(TimeSpeed.FAST); break; } } assert world.getServer() != null; world.getServer().getPlayerManager().sendToAll(new TranslatableText("chat." + RelicCraft.NAMESPACE + ".announce_time_speed_change", user.getDisplayName(), new LiteralText("[").append(new TranslatableText("chat." + RelicCraft.NAMESPACE + ".announce_time_speed_change." + dilatedWorld.getTimeSpeed().name().toLowerCase())).append("]").formatted(Formatting.YELLOW))); RelicCraft.DILATE_TIME_CRITERION.trigger((ServerPlayerEntity) user); } RelicCraft.playRelicSound(user); stack.damage(1, user, e -> e.sendToolBreakStatus(hand)); return new TypedActionResult<>(ActionResult.SUCCESS, stack); } @Override @Environment(EnvType.CLIENT) public void appendTooltip(ItemStack stack, World world, List tooltip, TooltipContext context) { super.appendTooltip(stack, world, tooltip, context); if (world != null) { tooltip.add(new TranslatableText("item." + RelicCraft.NAMESPACE + ".tooltip.time_dilater", new TranslatableText("chat." + RelicCraft.NAMESPACE + ".announce_time_speed_change." + ((DilatedWorld) world).getTimeSpeed().name().toLowerCase()).formatted(Formatting.GRAY)).formatted(Formatting.WHITE)); } } @Override public void inventoryTick(ItemStack stack, World world, Entity entity, int slot, boolean selected) { CompoundTag tag = stack.getTag(); if (tag == null) { tag = new CompoundTag(); } if (entity instanceof ServerPlayerEntity && tag.getByte("Artificial") == 1) { RelicCraft.DUPLICATE_TIME_DILATER_CRITERION.trigger((ServerPlayerEntity) entity); tag.putByte("Artificial", (byte) 2); } } }