Hello everyone, I'm making this post to seek help for my modded block,
It's a special block called FrozenBlock supposed to take the place of an old block, then after a set amount of ticks, it's supposed to revert its Block State, Entity, data... to the old block like this :
The problem I have is that the system breaks when handling multi blocks (I tried some fix but none of them worked) :
The bug I have identified is that the function "setOldBlockFields" in the item's "setFrozenBlock" function gets called once for the 1st block of multiblock getting frozen (as it should), but gets called a second time BEFORE creating the first FrozenBlock with the data of the 1st block, hence giving the same data to the two FrozenBlock :
Old Block Fields set
BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=head] BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@73681674 BlockEntityData : id:"minecraft:bed",x:3,y:-60,z:-6}
Old Block Fields set
BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=foot] BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@6d1aa3da BlockEntityData : {id:"minecraft:bed",x:2,y:-60,z:-6}
Frozen Block Entity set
BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=foot] BlockPos{x=3, y=-60, z=-6} BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@6d1aa3da BlockEntityData : {id:"minecraft:bed",x:2,y:-60,z:-6}
Frozen Block Entity set
BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=foot] BlockPos{x=2, y=-60, z=-6} BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@6d1aa3da BlockEntityData : {id:"minecraft:bed",x:2,y:-60,z:-6}
here is the code inside my custom "freeze" item :
@Override
public @NotNull InteractionResult useOn(@NotNull UseOnContext pContext) {
if (!pContext.getLevel().isClientSide() && pContext.getHand() == InteractionHand.MAIN_HAND) {
BlockPos blockPos = pContext.getClickedPos();
BlockPos secondBlockPos = getMultiblockPos(blockPos, pContext.getLevel().getBlockState(blockPos));
if (secondBlockPos != null) {
createFrozenBlock(pContext, secondBlockPos);
}
createFrozenBlock(pContext, blockPos);
return InteractionResult.SUCCESS;
}
return super.useOn(pContext);
}
public static void createFrozenBlock(UseOnContext pContext, BlockPos blockPos) {
BlockState oldState = pContext.getLevel().getBlockState(blockPos);
BlockEntity oldBlockEntity = oldState.hasBlockEntity() ? pContext.getLevel().getBlockEntity(blockPos) : null;
CompoundTag oldBlockEntityData = oldState.hasBlockEntity() ? oldBlockEntity.serializeNBT() : null;
if (oldBlockEntity != null) {
pContext.getLevel().removeBlockEntity(blockPos);
}
BlockState FrozenBlock = setFrozenBlock(oldState, oldBlockEntity, oldBlockEntityData);
pContext.getLevel().setBlockAndUpdate(blockPos, FrozenBlock);
}
public static BlockState setFrozenBlock(BlockState blockState, @Nullable BlockEntity blockEntity, @Nullable CompoundTag blockEntityData) {
BlockState FrozenBlock = BlockRegister.FROZEN_BLOCK.get().defaultBlockState();
((FrozenBlock) FrozenBlock.getBlock()).setOldBlockFields(blockState, blockEntity, blockEntityData);
return FrozenBlock;
}