141 lines
4.3 KiB
Java
141 lines
4.3 KiB
Java
package net.minecraft.world.level.block.entity;
|
|
|
|
import net.minecraft.core.BlockPos;
|
|
import net.minecraft.core.HolderLookup;
|
|
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.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.putString("CustomName", Component.Serializer.toJson(this.name, registries));
|
|
}
|
|
}
|
|
|
|
@Override
|
|
protected void loadAdditional(CompoundTag tag, HolderLookup.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");
|
|
}
|
|
}
|