Jump to content

Nalator

Members
  • Posts

    2
  • Joined

  • Last visited

  • Days Won

    1

Everything posted by Nalator

  1. Fixed the problem by changing the way the OldBlockFields are passed to the FrozenBlock Entity : public FrozenBlockEntity(BlockPos blockPos, BlockState blockState) { super(BlockRegister.FROZEN_BLOCK_ENTITY.get(), blockPos, blockState); this.frozenBlockPos = blockPos; this.frozenBlock = ((FrozenBlock) blockState.getBlock()).getOldBlockState() != null ? ((FrozenBlock) blockState.getBlock()).getOldBlockState() : Blocks.AIR.defaultBlockState(); this.frozenEntity = ((FrozenBlock) blockState.getBlock()).getOldBlockEntity(); this.frozenEntityData = ((FrozenBlock) blockState.getBlock()).getOldBlockEntityData(); } public FrozenBlockEntity(BlockPos blockPos, BlockState blockState, BlockState oldBlockState, @Nullable BlockEntity frozenBlockEntity, @Nullable CompoundTag frozenEntityData) { super(BlockRegister.FROZEN_BLOCK_ENTITY.get(), blockPos, blockState); this.frozenBlockPos = blockPos; this.frozenBlock = oldBlockState != null ? oldBlockState : Blocks.AIR.defaultBlockState(); this.frozenEntity = frozenBlockEntity; this.frozenEntityData = frozenEntityData; }
  2. 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; }
×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.