package net.minecraft.world.level.block.entity; import net.minecraft.core.BlockPos; import net.minecraft.core.HolderLookup; import net.minecraft.core.component.DataComponentGetter; import net.minecraft.core.component.DataComponentMap; import net.minecraft.core.component.DataComponents; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtOps; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.ComponentSerialization; import net.minecraft.util.Mth; import net.minecraft.util.RandomSource; import net.minecraft.world.Nameable; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; import org.jetbrains.annotations.Nullable; public class EnchantingTableBlockEntity extends BlockEntity implements Nameable { public int time; public float flip; public float oFlip; public float flipT; public float flipA; public float open; public float oOpen; public float rot; public float oRot; public float tRot; private static final RandomSource RANDOM = RandomSource.create(); @Nullable private Component name; public EnchantingTableBlockEntity(BlockPos pos, BlockState state) { super(BlockEntityType.ENCHANTING_TABLE, pos, state); } @Override protected void saveAdditional(CompoundTag tag, HolderLookup.Provider registries) { super.saveAdditional(tag, registries); if (this.hasCustomName()) { tag.store("CustomName", ComponentSerialization.CODEC, registries.createSerializationContext(NbtOps.INSTANCE), this.name); } } @Override protected void loadAdditional(CompoundTag tag, HolderLookup.Provider registries) { super.loadAdditional(tag, registries); this.name = parseCustomNameSafe(tag.get("CustomName"), registries); } public static void bookAnimationTick(Level level, BlockPos pos, BlockState state, EnchantingTableBlockEntity enchantingTable) { enchantingTable.oOpen = enchantingTable.open; enchantingTable.oRot = enchantingTable.rot; Player player = level.getNearestPlayer(pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, 3.0, false); if (player != null) { double d = player.getX() - (pos.getX() + 0.5); double e = player.getZ() - (pos.getZ() + 0.5); enchantingTable.tRot = (float)Mth.atan2(e, d); enchantingTable.open += 0.1F; if (enchantingTable.open < 0.5F || RANDOM.nextInt(40) == 0) { float f = enchantingTable.flipT; do { enchantingTable.flipT = enchantingTable.flipT + (RANDOM.nextInt(4) - RANDOM.nextInt(4)); } while (f == enchantingTable.flipT); } } else { enchantingTable.tRot += 0.02F; enchantingTable.open -= 0.1F; } while (enchantingTable.rot >= (float) Math.PI) { enchantingTable.rot -= (float) (Math.PI * 2); } while (enchantingTable.rot < (float) -Math.PI) { enchantingTable.rot += (float) (Math.PI * 2); } while (enchantingTable.tRot >= (float) Math.PI) { enchantingTable.tRot -= (float) (Math.PI * 2); } while (enchantingTable.tRot < (float) -Math.PI) { enchantingTable.tRot += (float) (Math.PI * 2); } float g = enchantingTable.tRot - enchantingTable.rot; while (g >= (float) Math.PI) { g -= (float) (Math.PI * 2); } while (g < (float) -Math.PI) { g += (float) (Math.PI * 2); } enchantingTable.rot += g * 0.4F; enchantingTable.open = Mth.clamp(enchantingTable.open, 0.0F, 1.0F); enchantingTable.time++; enchantingTable.oFlip = enchantingTable.flip; float h = (enchantingTable.flipT - enchantingTable.flip) * 0.4F; float i = 0.2F; h = Mth.clamp(h, -0.2F, 0.2F); enchantingTable.flipA = enchantingTable.flipA + (h - enchantingTable.flipA) * 0.9F; enchantingTable.flip = enchantingTable.flip + enchantingTable.flipA; } @Override public Component getName() { return (Component)(this.name != null ? this.name : Component.translatable("container.enchant")); } public void setCustomName(@Nullable Component customName) { this.name = customName; } @Nullable @Override public Component getCustomName() { return this.name; } @Override protected void applyImplicitComponents(DataComponentGetter componentGetter) { super.applyImplicitComponents(componentGetter); this.name = componentGetter.get(DataComponents.CUSTOM_NAME); } @Override protected void collectImplicitComponents(DataComponentMap.Builder components) { super.collectImplicitComponents(components); components.set(DataComponents.CUSTOM_NAME, this.name); } @Override public void removeComponentsFromTag(CompoundTag tag) { tag.remove("CustomName"); } }