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.ItemStack; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.MessageType; import net.minecraft.network.packet.s2c.play.GameMessageS2CPacket; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.stat.Stats; import net.minecraft.text.LiteralText; import net.minecraft.text.Text; import net.minecraft.text.TranslatableText; import net.minecraft.util.*; import net.minecraft.world.PersistentState; import net.minecraft.world.World; import java.util.List; public class TimeDilaterItem extends Item { public enum TimeSpeed { NORMAL, FAST, VERY_FAST } public static final String TIME_SPEED_KEY = new Identifier(RelicCraft.NAMESPACE, "time_speed").toString(); public static class TimeSpeedState extends PersistentState { private TimeSpeed timeSpeed = TimeSpeed.NORMAL; public TimeSpeedState() { super(TIME_SPEED_KEY); } public void setTimeSpeed(TimeSpeed timeSpeed) { this.timeSpeed = timeSpeed; markDirty(); } public TimeSpeed getTimeSpeed() { return timeSpeed; } @Override public void fromTag(CompoundTag tag) { timeSpeed = TimeSpeed.valueOf(tag.getString("TimeSpeed")); } @Override public CompoundTag toTag(CompoundTag tag) { tag.putString("TimeSpeed", timeSpeed.name()); return tag; } } public interface DilatedWorld { void setTimeSpeed(TimeSpeed speed); TimeSpeed getTimeSpeed(); } public TimeDilaterItem() { super(new Settings().group(RelicCraft.ITEM_GROUP).maxDamage(9).rarity(Rarity.UNCOMMON)); } @Override public TypedActionResult use(World world, PlayerEntity user, Hand hand) { ItemStack stack = user.getStackInHand(hand); user.incrementStat(Stats.USED.getOrCreateStat(this)); 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 GameMessageS2CPacket(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)), MessageType.CHAT, Util.NIL_UUID)); 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); } } public static long getTimeDilationFactor(TimeSpeed speed) { switch (speed) { case FAST: { return 4L; } case VERY_FAST: { return 8L; } default: case NORMAL: { return 1L; } } } }