TileSpectral
Reaviik opened this issue ยท 7 comments
Issue Description:
Note: If this bug occurs in a modpack, please report this to the modpack author. Otherwise, delete this line and add your description here. If this is a feature request, this template does not apply to you. Just delete everything.
What happens: An error in the TileSpectral block prohibits sending and rendering the chunk where it is to the client
What you expected to happen:
Steps to reproduce:
-
It happens occasionally, as I own a server and several players reported this error to me, I bring it here. Not even WorldEdit can replace the block. however, this block appears in places where players had not yet started playing blood magic
-
This server is running Arclight version arclight-1.20.1-1.0.4-fd335c1 (MC: 1.20.1) (Implementing API version 1.20.1-R0.1-SNAPSHOT)
...
Affected Versions (Do not use "latest"):
- BloodMagic: 1.20.1-3.3.2-44
- Minecraft: 1.20.1
- Forge: 47.0.20
Sorry about my English. Is there any way to remove this block through the mod? or get his coordinates
I got a command from ATM's redit to remove the blocks, from the sigil of suppression
/fill ~-10 ~-10 ~-10 ~25 ~14 ~25 minecraft:air replace bloodmagic:spectral
apparently happens when there are more than 1000 blocks
I'm also experiencing this issue while using 1.20.1-3.3.3.45 in ATM9 (also Forge 47.2.20). I've been successful in using Reaviik's command to remove some of the offending blocks from around the server, but the warnings have completely eclipsed my console and the corrupted areas are causing players to fail to render nearby chunks or be disconnected outright.
I'm unable to upload a patch file. But for those who know how to make a build and apply a git patch.
It's not a good way to resolve it. But it does the trick on my server .. Not sure if it is breaking any logic.
Only required on the server.
diff --git a/src/main/java/wayoftime/bloodmagic/common/tile/TileSpectral.java b/src/main/java/wayoftime/bloodmagic/common/tile/TileSpectral.java
index e78e24861..1579f5767 100644
--- a/src/main/java/wayoftime/bloodmagic/common/tile/TileSpectral.java
+++ b/src/main/java/wayoftime/bloodmagic/common/tile/TileSpectral.java
@@ -6,6 +6,7 @@ import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.NbtUtils;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Block;
+import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.LiquidBlock;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.BlockEntityType;
@@ -55,7 +56,12 @@ public class TileSpectral extends TileBase
public void revertToFluid()
{
- level.setBlock(worldPosition, storedBlock, 3);
+ if (storedBlock != null) {
+ level.setBlock(worldPosition, storedBlock, 3);
+ } else {
+ com.mojang.logging.LogUtils.getLogger().error("Removing spectral with air at {}", worldPosition.toString());
+ level.setBlock(worldPosition, Blocks.AIR.defaultBlockState(), 20);
+ }
// BlockState fluidState = Block.getStateById(meta);
}
@@ -67,19 +73,24 @@ public class TileSpectral extends TileBase
public void setContainedBlockInfo(BlockState state)
{
storedBlock = state;
-
}
@Override
public void deserialize(CompoundTag tag)
{
- storedBlock = NbtUtils.readBlockState(this.level.holderLookup(Registries.BLOCK), tag.getCompound("BlockState"));
+ try {
+ storedBlock = NbtUtils.readBlockState(this.level.holderLookup(Registries.BLOCK), tag.getCompound("BlockState"));
+ } catch (Exception ignored) {
+ }
}
@Override
public CompoundTag serialize(CompoundTag tag)
{
- tag.put("BlockState", NbtUtils.writeBlockState(storedBlock));
+ try {
+ tag.put("BlockState", NbtUtils.writeBlockState(storedBlock));
+ } catch (Exception ignored) {
+ }
return tag;
}
}
I'm unable to upload a patch file. But for those who know how to make a build and apply a git patch.
It's not a good way to resolve it. But it does the trick on my server .. Not sure if it is breaking any logic. Only required on the server.
diff --git a/src/main/java/wayoftime/bloodmagic/common/tile/TileSpectral.java b/src/main/java/wayoftime/bloodmagic/common/tile/TileSpectral.java index e78e24861..1579f5767 100644 --- a/src/main/java/wayoftime/bloodmagic/common/tile/TileSpectral.java +++ b/src/main/java/wayoftime/bloodmagic/common/tile/TileSpectral.java @@ -6,6 +6,7 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtUtils; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.LiquidBlock; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; @@ -55,7 +56,12 @@ public class TileSpectral extends TileBase public void revertToFluid() { - level.setBlock(worldPosition, storedBlock, 3); + if (storedBlock != null) { + level.setBlock(worldPosition, storedBlock, 3); + } else { + com.mojang.logging.LogUtils.getLogger().error("Removing spectral with air at {}", worldPosition.toString()); + level.setBlock(worldPosition, Blocks.AIR.defaultBlockState(), 20); + } // BlockState fluidState = Block.getStateById(meta); } @@ -67,19 +73,24 @@ public class TileSpectral extends TileBase public void setContainedBlockInfo(BlockState state) { storedBlock = state; - } @Override public void deserialize(CompoundTag tag) { - storedBlock = NbtUtils.readBlockState(this.level.holderLookup(Registries.BLOCK), tag.getCompound("BlockState")); + try { + storedBlock = NbtUtils.readBlockState(this.level.holderLookup(Registries.BLOCK), tag.getCompound("BlockState")); + } catch (Exception ignored) { + } } @Override public CompoundTag serialize(CompoundTag tag) { - tag.put("BlockState", NbtUtils.writeBlockState(storedBlock)); + try { + tag.put("BlockState", NbtUtils.writeBlockState(storedBlock)); + } catch (Exception ignored) { + } return tag; } }
Patch threw an error when trying to apply. Here is my manual application of this patch for anyone else who is going down this blood magic rabbit hole:
package wayoftime.bloodmagic.common.tile;
import net.minecraft.core.BlockPos;
import net.minecraft.core.registries.Registries;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.NbtUtils;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.LiquidBlock;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
import wayoftime.bloodmagic.common.block.BlockSpectral;
import wayoftime.bloodmagic.common.block.BloodMagicBlocks;
import wayoftime.bloodmagic.common.block.type.SpectralBlockType;
import wayoftime.bloodmagic.common.tile.base.TileBase;
public class TileSpectral extends TileBase
{
public BlockState storedBlock;
public TileSpectral(BlockEntityType<?> type, BlockPos pos, BlockState state)
{
super(type, pos, state);
}
public TileSpectral(BlockPos pos, BlockState state)
{
this(BloodMagicTileEntities.SPECTRAL_TYPE.get(), pos, state);
}
public static void createOrRefreshSpectralBlock(Level world, BlockPos pos)
{
if (world.isEmptyBlock(pos))
{
return;
}
BlockState potentialFluidBlockState = world.getBlockState(pos);
if (isFluidBlock(potentialFluidBlockState.getBlock()))
{
world.setBlock(pos, BloodMagicBlocks.SPECTRAL.get().defaultBlockState(), 3);
BlockEntity spectralTile = world.getBlockEntity(pos);
if (spectralTile instanceof TileSpectral)
{
((TileSpectral) spectralTile).setContainedBlockInfo(potentialFluidBlockState);
world.scheduleTick(pos, spectralTile.getBlockState().getBlock(), BlockSpectral.DECAY_RATE);
}
} else if (potentialFluidBlockState.getBlock() == BloodMagicBlocks.SPECTRAL.get() && potentialFluidBlockState.getValue(BlockSpectral.SPECTRAL_STATE) == SpectralBlockType.LEAKING)
{
world.setBlock(pos, BloodMagicBlocks.SPECTRAL.get().defaultBlockState(), 0);
}
}
public void revertToFluid()
{
if (storedBlock != null) {
level.setBlock(worldPosition, storedBlock, 3);
} else {
com.mojang.logging.LogUtils.getLogger().error("Removing spectral with air at {}", worldPosition.toString());
level.setBlock(worldPosition, Blocks.AIR.defaultBlockState(), 20);
}
// BlockState fluidState = Block.getStateById(meta);
}
public static boolean isFluidBlock(Block block)
{
return block instanceof LiquidBlock;
}
public void setContainedBlockInfo(BlockState state)
{
storedBlock = state;
}
@Override
public void deserialize(CompoundTag tag)
{
try {
storedBlock = NbtUtils.readBlockState(this.level.holderLookup(Registries.BLOCK), tag.getCompound("BlockState"));
} catch (Exception ignored) {
}
}
@Override
public CompoundTag serialize(CompoundTag tag)
{
try {
tag.put("BlockState", NbtUtils.writeBlockState(storedBlock));
} catch (Exception ignored) {
}
return tag;
}
}