This repository has been archived on 2024-07-25. You can view files and clone it, but you cannot make any changes to it's state, such as pushing and creating new issues, pull requests or comments.
Thresholds/src/main/java/dev/zontreck/otemod/zschem/StoredBlock.java
2023-01-08 01:50:47 -07:00

158 lines
3.5 KiB
Java

package dev.zontreck.otemod.zschem;
import dev.zontreck.libzontreck.exceptions.InvalidDeserialization;
import dev.zontreck.libzontreck.vectors.Vector3;
import dev.zontreck.libzontreck.vectors.WorldPosition;
import net.minecraft.core.BlockPos;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.NbtUtils;
import net.minecraft.nbt.Tag;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.state.BlockState;
public class StoredBlock
{
public CompoundTag blockData;
private WorldPosition position;
private BlockState state;
private CompoundTag blockEntity;
private int tick;
private int tries;
public void setPosition(Vector3 pos)
{
position.Position=pos;
}
public void updateWorld(ServerLevel lv)
{
position = new WorldPosition(position.Position, lv);
}
public void tick(){
this.tick--;
}
public void setTick(int tick){
this.tick=tick;
}
public boolean isExpired() {
return tick <= 0;
}
public void replaceBlockState(BlockState state)
{
this.state=state;
}
public StoredBlock(final BlockPos pos, final BlockState toSave, final ServerLevel lvl)
{
position = new WorldPosition(new Vector3(pos), lvl);
this.state=toSave;
}
public StoredBlock(final CompoundTag tag)
{
this.deserialize(tag);
}
public final BlockPos getPos()
{
return position.Position.asBlockPos();
}
public final WorldPosition getWorldPosition()
{
return position;
}
public final BlockState getState()
{
return state;
}
public final long getChunkX()
{
Vector3 pos = position.Position;
return pos.rounded().x >> 4;
}
public final long getChunkZ()
{
Vector3 pos = position.Position;
return pos.rounded().z >> 4;
}
public void setBlockEntity(BlockEntity entity)
{
CompoundTag tag = entity.saveWithoutMetadata();
this.blockEntity=tag;
}
public final CompoundTag getBlockEntity(){
return blockEntity;
}
public static boolean hasBlockEntity(final CompoundTag tag){
return tag.contains("entity", Tag.TAG_COMPOUND);
}
public CompoundTag serialize()
{
final CompoundTag tag = new CompoundTag();
tag.put("pos", position.serialize());
tag.put("state", NbtUtils.writeBlockState(state));
tag.putInt("tick", tick);
tag.putInt("tries", tries);
if(blockEntity != null) tag.put("entity", blockEntity);
return tag;
}
public int getTries(){
return tries;
}
public int getTickValue()
{
return tick;
}
public void tickTries(){
tries++;
}
public void deserialize(final CompoundTag tag)
{
try {
position = new WorldPosition(tag.getCompound("pos"), false);
} catch (InvalidDeserialization e) {
e.printStackTrace();
}
state = NbtUtils.readBlockState(tag.getCompound("state"));
final CompoundTag tmp = tag.getCompound("entity");
blockEntity = tmp.isEmpty() ? null : tmp;
tick = tag.getInt("tick");
tries=tag.getInt("tries");
}
}