minecraft-src/net/minecraft/world/level/block/entity/EnchantingTableBlockEntity.java
2025-07-04 03:15:13 +03:00

142 lines
4.3 KiB
Java

package net.minecraft.world.level.block.entity;
import net.minecraft.core.BlockPos;
import net.minecraft.core.HolderLookup.Provider;
import net.minecraft.core.component.DataComponents;
import net.minecraft.core.component.DataComponentMap.Builder;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.Component.Serializer;
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, Provider registries) {
super.saveAdditional(tag, registries);
if (this.hasCustomName()) {
tag.putString("CustomName", Serializer.toJson(this.name, registries));
}
}
@Override
protected void loadAdditional(CompoundTag tag, Provider registries) {
super.loadAdditional(tag, registries);
if (tag.contains("CustomName", 8)) {
this.name = parseCustomNameSafe(tag.getString("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(BlockEntity.DataComponentInput componentInput) {
super.applyImplicitComponents(componentInput);
this.name = componentInput.get(DataComponents.CUSTOM_NAME);
}
@Override
protected void collectImplicitComponents(Builder components) {
super.collectImplicitComponents(components);
components.set(DataComponents.CUSTOM_NAME, this.name);
}
@Override
public void removeComponentsFromTag(CompoundTag tag) {
tag.remove("CustomName");
}
}