diff --git a/patches/minecraft/net/minecraft/enchantment/FrostWalkerEnchantment.java.patch b/patches/minecraft/net/minecraft/enchantment/FrostWalkerEnchantment.java.patch index 89dbd7257..420e09ec9 100644 --- a/patches/minecraft/net/minecraft/enchantment/FrostWalkerEnchantment.java.patch +++ b/patches/minecraft/net/minecraft/enchantment/FrostWalkerEnchantment.java.patch @@ -9,7 +9,7 @@ BlockState blockstate2 = p_185266_1_.func_180495_p(blockpos); - if (blockstate2.func_185904_a() == Material.field_151586_h && blockstate2.func_177229_b(FlowingFluidBlock.field_176367_b) == 0 && blockstate.func_196955_c(p_185266_1_, blockpos) && p_185266_1_.func_226663_a_(blockstate, blockpos, ISelectionContext.func_216377_a())) { + boolean isFull = blockstate2.func_177230_c() == Blocks.field_150355_j && blockstate2.func_177229_b(FlowingFluidBlock.field_176367_b) == 0; //TODO: Forge, modded waters? -+ if (blockstate2.func_185904_a() == Material.field_151586_h && isFull && blockstate.func_196955_c(p_185266_1_, blockpos) && p_185266_1_.func_226663_a_(blockstate, blockpos, ISelectionContext.func_216377_a()) && !net.minecraftforge.event.ForgeEventFactory.onBlockPlace(p_185266_0_, new net.minecraftforge.common.util.BlockSnapshot(p_185266_1_, blockpos, blockstate2), net.minecraft.util.Direction.UP)) { ++ if (blockstate2.func_185904_a() == Material.field_151586_h && isFull && blockstate.func_196955_c(p_185266_1_, blockpos) && p_185266_1_.func_226663_a_(blockstate, blockpos, ISelectionContext.func_216377_a()) && !net.minecraftforge.event.ForgeEventFactory.onBlockPlace(p_185266_0_, net.minecraftforge.common.util.BlockSnapshot.create(p_185266_1_, blockpos), net.minecraft.util.Direction.UP)) { p_185266_1_.func_175656_a(blockpos, blockstate); p_185266_1_.func_205220_G_().func_205360_a(blockpos, Blocks.field_185778_de, MathHelper.func_76136_a(p_185266_0_.func_70681_au(), 60, 120)); } diff --git a/patches/minecraft/net/minecraft/entity/monster/EndermanEntity.java.patch b/patches/minecraft/net/minecraft/entity/monster/EndermanEntity.java.patch index 3682acc2d..2dc88ed77 100644 --- a/patches/minecraft/net/minecraft/entity/monster/EndermanEntity.java.patch +++ b/patches/minecraft/net/minecraft/entity/monster/EndermanEntity.java.patch @@ -41,7 +41,7 @@ BlockState blockstate1 = iworld.func_180495_p(blockpos1); BlockState blockstate2 = this.field_179475_a.func_195405_dq(); - if (blockstate2 != null && this.func_220836_a(iworld, blockpos, blockstate2, blockstate, blockstate1, blockpos1)) { -+ if (blockstate2 != null && this.func_220836_a(iworld, blockpos, blockstate2, blockstate, blockstate1, blockpos1) && !net.minecraftforge.event.ForgeEventFactory.onBlockPlace(field_179475_a, new net.minecraftforge.common.util.BlockSnapshot(iworld, blockpos, blockstate1), net.minecraft.util.Direction.UP)) { ++ if (blockstate2 != null && this.func_220836_a(iworld, blockpos, blockstate2, blockstate, blockstate1, blockpos1) && !net.minecraftforge.event.ForgeEventFactory.onBlockPlace(field_179475_a, net.minecraftforge.common.util.BlockSnapshot.create(iworld, blockpos1), net.minecraft.util.Direction.UP)) { iworld.func_180501_a(blockpos, blockstate2, 3); this.field_179475_a.func_195406_b((BlockState)null); } diff --git a/patches/minecraft/net/minecraft/world/World.java.patch b/patches/minecraft/net/minecraft/world/World.java.patch index 99193ab1e..337a8d938 100644 --- a/patches/minecraft/net/minecraft/world/World.java.patch +++ b/patches/minecraft/net/minecraft/world/World.java.patch @@ -24,7 +24,7 @@ private final RegistryKey field_234915_C_; + public boolean restoringBlockSnapshots = false; + public boolean captureBlockSnapshots = false; -+ public java.util.ArrayList capturedBlockSnapshots = new java.util.ArrayList(); ++ public java.util.ArrayList capturedBlockSnapshots = new java.util.ArrayList<>(); protected World(ISpawnWorldInfo p_i231617_1_, RegistryKey p_i231617_2_, RegistryKey p_i231617_3_, DimensionType p_i231617_4_, Supplier p_i231617_5_, boolean p_i231617_6_, boolean p_i231617_7_, long p_i231617_8_) { + super(World.class); @@ -39,7 +39,7 @@ + p_241211_1_ = p_241211_1_.func_185334_h(); // Forge - prevent mutable BlockPos leaks + net.minecraftforge.common.util.BlockSnapshot blockSnapshot = null; + if (this.captureBlockSnapshots && !this.field_72995_K) { -+ blockSnapshot = net.minecraftforge.common.util.BlockSnapshot.getBlockSnapshot(this, p_241211_1_, p_241211_3_); ++ blockSnapshot = net.minecraftforge.common.util.BlockSnapshot.create(this, p_241211_1_, p_241211_3_); + this.capturedBlockSnapshots.add(blockSnapshot); + } + diff --git a/src/main/java/net/minecraftforge/common/ForgeHooks.java b/src/main/java/net/minecraftforge/common/ForgeHooks.java index 1ccc7ada8..42bb9bdfe 100644 --- a/src/main/java/net/minecraftforge/common/ForgeHooks.java +++ b/src/main/java/net/minecraftforge/common/ForgeHooks.java @@ -603,7 +603,7 @@ public class ForgeHooks world.captureBlockSnapshots = false; - if (ret == ActionResultType.SUCCESS) + if (ret.isSuccessOrConsume()) { // save new item data int newSize = itemstack.getCount(); @@ -654,12 +654,12 @@ public class ForgeHooks int updateFlag = snap.getFlag(); BlockState oldBlock = snap.getReplacedBlock(); BlockState newBlock = world.getBlockState(snap.getPos()); - if (!newBlock.getBlock().hasTileEntity(newBlock)) // Containers get placed automatically + if (!newBlock.hasTileEntity()) // Containers get placed automatically { newBlock.onBlockAdded(world, snap.getPos(), oldBlock, false); } - world.markAndNotifyBlock(snap.getPos(), null, oldBlock, newBlock, updateFlag, 512); + world.markAndNotifyBlock(snap.getPos(), world.getChunkAt(snap.getPos()), oldBlock, newBlock, updateFlag, 512); } player.addStat(Stats.ITEM_USED.get(item)); } diff --git a/src/main/java/net/minecraftforge/common/util/BlockSnapshot.java b/src/main/java/net/minecraftforge/common/util/BlockSnapshot.java index 91b899f9b..af234dddc 100644 --- a/src/main/java/net/minecraftforge/common/util/BlockSnapshot.java +++ b/src/main/java/net/minecraftforge/common/util/BlockSnapshot.java @@ -23,8 +23,10 @@ import java.lang.ref.WeakReference; import java.util.Objects; import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.RegistryKey; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IWorld; @@ -45,98 +47,60 @@ public class BlockSnapshot { private static final boolean DEBUG = Boolean.parseBoolean(System.getProperty("forge.debugBlockSnapshot", "false")); + private final RegistryKey dim; private final BlockPos pos; - private final int dimId; - @Nullable - private BlockState replacedBlock; - private int flag; + private final int flags; + private final BlockState block; @Nullable private final CompoundNBT nbt; + @Nullable private WeakReference world; - private final ResourceLocation registryName; - private final int meta = 0; // TODO BlockSnapshot needs a total refactor for the absence of metadata + private String toString = null; - public BlockSnapshot(IWorld world, BlockPos pos, BlockState state) + private BlockSnapshot(IWorld world, BlockPos pos, BlockState state, @Nullable CompoundNBT nbt, int flags) { - this(world, pos, state, getTileNBT(world.getTileEntity(pos))); - } - - public BlockSnapshot(IWorld world, BlockPos pos, BlockState state, @Nullable CompoundNBT nbt) - { - this.setWorld(world); - this.dimId = 0; //world.getDimension().getType().getId(); //TODO + this.dim = world.getWorld().func_234923_W_(); this.pos = pos.toImmutable(); - this.setReplacedBlock(state); - this.registryName = state.getBlock().getRegistryName(); - this.setFlag(3); + this.block = state; + this.flags = flags; this.nbt = nbt; + + this.world = new WeakReference<>(world); + if (DEBUG) - { - System.out.printf("Created BlockSnapshot - [World: %s ][Location: %d,%d,%d ][Block: %s ][Meta: %d ]", world.getWorldInfo()/*TODO .getWorldName()*/, pos.getX(), pos.getY(), pos.getZ(), getRegistryName(), getMeta()); - } + System.out.println("Created " + this.toString()); } - public BlockSnapshot(IWorld world, BlockPos pos, BlockState state, int flag) + public static BlockSnapshot create(IWorld world, BlockPos pos) { - this(world, pos, state); - this.setFlag(flag); + return create(world, pos, 3); } - /** - * Raw constructor designed for serialization usages. - */ - public BlockSnapshot(int dimension, BlockPos pos, ResourceLocation registryName, int meta, int flag, @Nullable CompoundNBT nbt) + public static BlockSnapshot create(IWorld world, BlockPos pos, int flag) { - this.dimId = dimension; - this.pos = pos.toImmutable(); - this.setFlag(flag); - this.registryName = registryName; - this.nbt = nbt; - } - - public static BlockSnapshot getBlockSnapshot(IWorld world, BlockPos pos) - { - return new BlockSnapshot(world, pos, world.getBlockState(pos)); - } - - public static BlockSnapshot getBlockSnapshot(IWorld world, BlockPos pos, int flag) - { - return new BlockSnapshot(world, pos, world.getBlockState(pos), flag); - } - - public static BlockSnapshot readFromNBT(CompoundNBT tag) - { - return new BlockSnapshot( - tag.getInt("dimension"), - new BlockPos(tag.getInt("posX"), tag.getInt("posY"), tag.getInt("posZ")), - new ResourceLocation(tag.getString("blockMod"), tag.getString("blockName")), - tag.getInt("metadata"), - tag.getInt("flag"), - tag.getBoolean("hasTE") ? tag.getCompound("tileEntity") : null); + return new BlockSnapshot(world, pos, world.getBlockState(pos), getTileNBT(world.getTileEntity(pos)), flag); } @Nullable private static CompoundNBT getTileNBT(@Nullable TileEntity te) { - if (te == null) return null; - CompoundNBT nbt = new CompoundNBT(); - te.write(nbt); - return nbt; + return te == null ? null : te.write(new CompoundNBT()); } public BlockState getCurrentBlock() { - return getWorld().getBlockState(getPos()); + IWorld world = getWorld(); + return world == null ? Blocks.AIR.getDefaultState() : world.getBlockState(this.pos); } + @Nullable public IWorld getWorld() { IWorld world = this.world != null ? this.world.get() : null; if (world == null) { - //TODO - //world = ServerLifecycleHooks.getCurrentServer().getWorld(DimensionType.getById(getDimId())); + world = ServerLifecycleHooks.getCurrentServer().getWorld(this.dim); this.world = new WeakReference(world); } return world; @@ -144,11 +108,7 @@ public class BlockSnapshot public BlockState getReplacedBlock() { - if (this.replacedBlock == null) - { - this.replacedBlock = ForgeRegistries.BLOCKS.getValue(getRegistryName()).getStateById(getMeta()); - } - return this.replacedBlock; + return this.block; } @Nullable @@ -182,13 +142,9 @@ public class BlockSnapshot if (current != replaced) { if (force) - { world.setBlockState(pos, replaced, flags); - } else - { return false; - } } world.setBlockState(pos, replaced, flags); @@ -207,31 +163,10 @@ public class BlockSnapshot } if (DEBUG) - { - System.out.printf("Restored BlockSnapshot with data [World: %s ][Location: %d,%d,%d ][State: %s ][Block: %s ][TileEntity: %s ][force: %s ][notifyNeighbors: %s]", world.getWorldInfo()/*TODO .getWorldName()*/, pos.getX(), pos.getY(), pos.getZ(), replaced, replaced.getBlock().delegate.name(), te, force, notifyNeighbors); - } + System.out.println("Restored " + this.toString()); return true; } - public void writeToNBT(CompoundNBT compound) - { - compound.putString("blockMod", getRegistryName().getNamespace()); - compound.putString("blockName", getRegistryName().getPath()); - compound.putInt("posX", getPos().getX()); - compound.putInt("posY", getPos().getY()); - compound.putInt("posZ", getPos().getZ()); - compound.putInt("flag", getFlag()); - compound.putInt("dimension", getDimId()); - compound.putInt("metadata", getMeta()); - - compound.putBoolean("hasTE", getNbt() != null); - - if (getNbt() != null) - { - compound.put("tileEntity", getNbt()); - } - } - @Override public boolean equals(Object obj) { @@ -241,43 +176,48 @@ public class BlockSnapshot return false; final BlockSnapshot other = (BlockSnapshot) obj; - if (this.getMeta() != other.getMeta() || - this.getDimId() != other.getDimId() || - !this.getPos().equals(other.getPos()) || - !this.getRegistryName().equals(other.getRegistryName()) || - !Objects.equals(this.getNbt(), other.getNbt())) - return false; - return true; + return this.dim.equals(other.dim) && + this.pos.equals(other.pos) && + this.block == other.block && + this.flags == other.flags && + Objects.equals(this.nbt, other.nbt); } @Override public int hashCode() { int hash = 7; - hash = 73 * hash + this.getMeta(); - hash = 73 * hash + this.getDimId(); - hash = 73 * hash + this.getPos().hashCode(); - hash = 73 * hash + this.getRegistryName().hashCode(); + hash = 73 * hash + this.dim.hashCode(); + hash = 73 * hash + this.pos.hashCode(); + hash = 73 * hash + this.block.hashCode(); + hash = 73 * hash + this.flags; hash = 73 * hash + Objects.hashCode(this.getNbt()); return hash; } + @Override + public String toString() + { + if (toString == null) + { + this.toString = + "BlockSnapshot[" + + "World:" + this.dim.func_240901_a_() + ',' + + "Pos: " + this.pos + ',' + + "State: " + this.block + ',' + + "Flags: " + this.flags + ',' + + "NBT: " + (this.nbt == null ? "null" : this.nbt.toString()) + + ']'; + } + return this.toString; + } + public BlockPos getPos() { return pos; } - public int getDimId() { return dimId; } - public void setReplacedBlock(BlockState replacedBlock) { this.replacedBlock = replacedBlock; } - - public int getFlag() { return flag; } - - public void setFlag(int flag) { this.flag = flag; } + public int getFlag() { return flags; } @Nullable public CompoundNBT getNbt() { return nbt; } - public void setWorld(IWorld world) { this.world = new WeakReference<>(world); } - - public ResourceLocation getRegistryName() { return registryName; } - - public int getMeta() { return meta; } }