From d071928164ec1854aa19ab033effe74c7da045a4 Mon Sep 17 00:00:00 2001 From: gnembon Date: Sat, 18 May 2019 02:48:27 -0300 Subject: [PATCH 1/2] fillLimits --- .../java/carpet/mixins/CloneCommandMixin.java | 20 +++++++++++++++++++ .../java/carpet/mixins/FillCommandMixin.java | 20 +++++++++++++++++++ src/main/resources/carpet.mixins.json | 2 ++ 3 files changed, 42 insertions(+) create mode 100644 src/main/java/carpet/mixins/CloneCommandMixin.java create mode 100644 src/main/java/carpet/mixins/FillCommandMixin.java diff --git a/src/main/java/carpet/mixins/CloneCommandMixin.java b/src/main/java/carpet/mixins/CloneCommandMixin.java new file mode 100644 index 00000000..23b49877 --- /dev/null +++ b/src/main/java/carpet/mixins/CloneCommandMixin.java @@ -0,0 +1,20 @@ +package carpet.mixins; + +import carpet.CarpetSettings; +import net.minecraft.server.command.CloneCommand; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(CloneCommand.class) +public abstract class CloneCommandMixin +{ + @Redirect(method = "execute", at = @At( + value = "CONSTANT", + args = "intValue=32768" + )) + private static int fillLimit() + { + return CarpetSettings.getInt("fillLimit"); + } +} diff --git a/src/main/java/carpet/mixins/FillCommandMixin.java b/src/main/java/carpet/mixins/FillCommandMixin.java new file mode 100644 index 00000000..e4ab9967 --- /dev/null +++ b/src/main/java/carpet/mixins/FillCommandMixin.java @@ -0,0 +1,20 @@ +package carpet.mixins; + +import carpet.CarpetSettings; +import net.minecraft.server.command.FillCommand; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(FillCommand.class) +public abstract class FillCommandMixin +{ + @Redirect(method = "execute", at = @At( + value = "CONSTANT", + args = "intValue=32768" + )) + private static int fillLimit() + { + return CarpetSettings.getInt("fillLimit"); + } +} diff --git a/src/main/resources/carpet.mixins.json b/src/main/resources/carpet.mixins.json index d4e29dd4..73b6d215 100644 --- a/src/main/resources/carpet.mixins.json +++ b/src/main/resources/carpet.mixins.json @@ -4,6 +4,8 @@ "compatibilityLevel": "JAVA_8", "mixins": [ "CommandManagerMixin", + "FillCommandMixin", + "CloneCommandMixin", "MinecraftServer_coreMixin", "MinecraftServer_tickspeedMixin", "MinecraftServer_scarpetMixin", From d35b6bde3671a2b1af20cbd5637299fd824f99d6 Mon Sep 17 00:00:00 2001 From: gnembon Date: Sat, 18 May 2019 14:24:51 -0300 Subject: [PATCH 2/2] fill stuff --- src/main/java/carpet/CarpetServer.java | 2 ++ src/main/java/carpet/CarpetSettings.java | 4 ++- .../java/carpet/mixins/CloneCommandMixin.java | 23 +++++++++---- .../carpet/mixins/CommandManagerMixin.java | 15 ++++++++ .../java/carpet/mixins/FillCommandMixin.java | 22 ++++++++---- .../carpet/mixins/SetBlockCommandMixin.java | 23 +++++++++++++ ...tureBlockBlockEntity_fillUpdatesMixin.java | 33 ++++++++++++++++++ .../mixins/Structure_fillUpdatesMixin.java | 24 +++++++++++++ .../mixins/WorldChunk_fillUpdatesMixin.java | 34 +++++++++++++++++++ .../carpet/mixins/World_fillUpdatesMixin.java | 19 +++++++++++ src/main/resources/carpet.mixins.json | 7 ++++ 11 files changed, 193 insertions(+), 13 deletions(-) create mode 100644 src/main/java/carpet/mixins/SetBlockCommandMixin.java create mode 100644 src/main/java/carpet/mixins/StructureBlockBlockEntity_fillUpdatesMixin.java create mode 100644 src/main/java/carpet/mixins/Structure_fillUpdatesMixin.java create mode 100644 src/main/java/carpet/mixins/WorldChunk_fillUpdatesMixin.java create mode 100644 src/main/java/carpet/mixins/World_fillUpdatesMixin.java diff --git a/src/main/java/carpet/CarpetServer.java b/src/main/java/carpet/CarpetServer.java index 0c4cb056..46d193f0 100644 --- a/src/main/java/carpet/CarpetServer.java +++ b/src/main/java/carpet/CarpetServer.java @@ -46,6 +46,8 @@ public class CarpetServer // static for now - easier to handle all around the co { TickSpeed.tick(server); HUDController.update_hud(server); + //in case something happens + CarpetSettings.impendingFillSkipUpdates = false; } public static void registerCarpetCommands(CommandDispatcher dispatcher) diff --git a/src/main/java/carpet/CarpetSettings.java b/src/main/java/carpet/CarpetSettings.java index be0958d0..001eee83 100644 --- a/src/main/java/carpet/CarpetSettings.java +++ b/src/main/java/carpet/CarpetSettings.java @@ -45,6 +45,7 @@ public class CarpetSettings public static final String[] default_tags = {"tnt","fix","survival","creative", "experimental","optimizations","feature","commands"}; //tab completion only public static boolean skipGenerationChecks = false; + public static boolean impendingFillSkipUpdates = false; static { settings_store = new HashMap<>(); @@ -62,6 +63,7 @@ public class CarpetSettings public static boolean b_movableTileEntities = false; public static boolean b_huskSpawningInTemples = false; public static boolean b_stackableShulkerBoxes = false; + public static boolean b_fillUpdates = true; private static CarpetSettingEntry rule(String s1, String s2, String s3) { return CarpetSettingEntry.create(s1,s2,s3);} @@ -132,7 +134,7 @@ public class CarpetSettings rule("missingTools", "survival", "Pistons, Glass and Sponge can be broken faster with their appropriate tools"), rule("portalCaching", "survival experimental", "Alternative, persistent caching strategy for nether portals"), rule("calmNetherFires", "experimental", "Permanent fires don't schedule random updates"), - rule("fillUpdates", "creative", "fill/clone/setblock and structure blocks cause block updates").defaultTrue(), + rule("fillUpdates", "creative", "fill/clone/setblock and structure blocks cause block updates").defaultTrue().boolAccelerate(), rule("pushLimit", "creative","Customizable piston push limit") .choices("12","10 12 14 100").setNotStrict().numAccelerate(), rule("railPowerLimit", "creative", "Customizable powered rail power range") diff --git a/src/main/java/carpet/mixins/CloneCommandMixin.java b/src/main/java/carpet/mixins/CloneCommandMixin.java index 23b49877..3ccad37e 100644 --- a/src/main/java/carpet/mixins/CloneCommandMixin.java +++ b/src/main/java/carpet/mixins/CloneCommandMixin.java @@ -1,20 +1,31 @@ package carpet.mixins; import carpet.CarpetSettings; +import net.minecraft.block.Block; import net.minecraft.server.command.CloneCommand; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.math.BlockPos; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Constant; +import org.spongepowered.asm.mixin.injection.ModifyConstant; import org.spongepowered.asm.mixin.injection.Redirect; + @Mixin(CloneCommand.class) public abstract class CloneCommandMixin { - @Redirect(method = "execute", at = @At( - value = "CONSTANT", - args = "intValue=32768" - )) - private static int fillLimit() - { + @ModifyConstant(method = "execute", constant = @Constant(intValue = 32768)) + private static int fillLimit(int original) { return CarpetSettings.getInt("fillLimit"); } + + @Redirect(method = "execute", at = @At( + value = "INVOKE", + target = "Lnet/minecraft/server/world/ServerWorld;updateNeighbors(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/Block;)V" + )) + private static void conditionalUpdating(ServerWorld serverWorld, BlockPos blockPos_1, Block block_1) + { + if (CarpetSettings.b_fillUpdates) serverWorld.updateNeighbors(blockPos_1, block_1); + } } diff --git a/src/main/java/carpet/mixins/CommandManagerMixin.java b/src/main/java/carpet/mixins/CommandManagerMixin.java index 7f1262e9..05b6cbbc 100644 --- a/src/main/java/carpet/mixins/CommandManagerMixin.java +++ b/src/main/java/carpet/mixins/CommandManagerMixin.java @@ -1,6 +1,7 @@ package carpet.mixins; import carpet.CarpetServer; +import carpet.CarpetSettings; import com.mojang.brigadier.CommandDispatcher; import net.minecraft.server.command.CommandManager; import net.minecraft.server.command.ServerCommandSource; @@ -10,6 +11,7 @@ import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(CommandManager.class) @@ -24,4 +26,17 @@ public abstract class CommandManagerMixin private void onRegister(boolean boolean_1, CallbackInfo ci) { CarpetServer.registerCarpetCommands(this.dispatcher); } + + @Inject(method = "execute", at = @At("HEAD")) + private void onExecuteBegin(ServerCommandSource serverCommandSource_1, String string_1, CallbackInfoReturnable cir) + { + if (!CarpetSettings.b_fillUpdates) + CarpetSettings.impendingFillSkipUpdates = true; + } + + @Inject(method = "execute", at = @At("RETURN")) + private void onExecuteEnd(ServerCommandSource serverCommandSource_1, String string_1, CallbackInfoReturnable cir) + { + CarpetSettings.impendingFillSkipUpdates = false; + } } \ No newline at end of file diff --git a/src/main/java/carpet/mixins/FillCommandMixin.java b/src/main/java/carpet/mixins/FillCommandMixin.java index e4ab9967..04f66b26 100644 --- a/src/main/java/carpet/mixins/FillCommandMixin.java +++ b/src/main/java/carpet/mixins/FillCommandMixin.java @@ -1,20 +1,30 @@ package carpet.mixins; import carpet.CarpetSettings; +import net.minecraft.block.Block; import net.minecraft.server.command.FillCommand; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.math.BlockPos; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Constant; +import org.spongepowered.asm.mixin.injection.ModifyConstant; import org.spongepowered.asm.mixin.injection.Redirect; @Mixin(FillCommand.class) public abstract class FillCommandMixin { - @Redirect(method = "execute", at = @At( - value = "CONSTANT", - args = "intValue=32768" - )) - private static int fillLimit() - { + @ModifyConstant(method = "execute", constant = @Constant(intValue = 32768)) + private static int fillLimit(int original) { return CarpetSettings.getInt("fillLimit"); } + + @Redirect(method = "execute", at = @At( + value = "INVOKE", + target = "Lnet/minecraft/server/world/ServerWorld;updateNeighbors(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/Block;)V" + )) + private static void conditionalUpdating(ServerWorld serverWorld, BlockPos blockPos_1, Block block_1) + { + if (CarpetSettings.b_fillUpdates) serverWorld.updateNeighbors(blockPos_1, block_1); + } } diff --git a/src/main/java/carpet/mixins/SetBlockCommandMixin.java b/src/main/java/carpet/mixins/SetBlockCommandMixin.java new file mode 100644 index 00000000..a66035be --- /dev/null +++ b/src/main/java/carpet/mixins/SetBlockCommandMixin.java @@ -0,0 +1,23 @@ +package carpet.mixins; + +import carpet.CarpetSettings; +import net.minecraft.block.Block; +import net.minecraft.server.command.SetBlockCommand; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.math.BlockPos; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(SetBlockCommand.class) +public class SetBlockCommandMixin +{ + @Redirect(method = "execute", at = @At( + value = "INVOKE", + target = "Lnet/minecraft/server/world/ServerWorld;updateNeighbors(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/Block;)V" + )) + private static void conditionalUpdating(ServerWorld serverWorld, BlockPos blockPos_1, Block block_1) + { + if (CarpetSettings.b_fillUpdates) serverWorld.updateNeighbors(blockPos_1, block_1); + } +} diff --git a/src/main/java/carpet/mixins/StructureBlockBlockEntity_fillUpdatesMixin.java b/src/main/java/carpet/mixins/StructureBlockBlockEntity_fillUpdatesMixin.java new file mode 100644 index 00000000..c386905e --- /dev/null +++ b/src/main/java/carpet/mixins/StructureBlockBlockEntity_fillUpdatesMixin.java @@ -0,0 +1,33 @@ +package carpet.mixins; + +import carpet.CarpetSettings; +import net.minecraft.block.entity.StructureBlockBlockEntity; +import net.minecraft.structure.Structure; +import net.minecraft.structure.StructurePlacementData; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IWorld; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(StructureBlockBlockEntity.class) +public abstract class StructureBlockBlockEntity_fillUpdatesMixin +{ + @Redirect(method = "loadStructure(Z)Z", at = @At( + value = "INVOKE", + target = "Lnet/minecraft/structure/Structure;place(Lnet/minecraft/world/IWorld;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/structure/StructurePlacementData;)V" + )) + private void onStructurePlacen(Structure structure, IWorld iWorld_1, BlockPos blockPos_1, StructurePlacementData structurePlacementData_1) + { + if(!CarpetSettings.b_fillUpdates) + CarpetSettings.impendingFillSkipUpdates = true; + try + { + structure.place(iWorld_1, blockPos_1, structurePlacementData_1); + } + finally + { + CarpetSettings.impendingFillSkipUpdates = false; + } + } +} diff --git a/src/main/java/carpet/mixins/Structure_fillUpdatesMixin.java b/src/main/java/carpet/mixins/Structure_fillUpdatesMixin.java new file mode 100644 index 00000000..ef081a18 --- /dev/null +++ b/src/main/java/carpet/mixins/Structure_fillUpdatesMixin.java @@ -0,0 +1,24 @@ +package carpet.mixins; + +import carpet.CarpetSettings; +import net.minecraft.block.Block; +import net.minecraft.structure.Structure; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IWorld; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(Structure.class) +public class Structure_fillUpdatesMixin +{ + @Redirect( method = "method_15172", at = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/IWorld;updateNeighbors(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/Block;)V" + )) + private void skipUpdateNeighbours(IWorld iWorld, BlockPos var1, Block var2) + { + if (!CarpetSettings.impendingFillSkipUpdates) + iWorld.updateNeighbors(var1, var2); + } +} diff --git a/src/main/java/carpet/mixins/WorldChunk_fillUpdatesMixin.java b/src/main/java/carpet/mixins/WorldChunk_fillUpdatesMixin.java new file mode 100644 index 00000000..b780dd36 --- /dev/null +++ b/src/main/java/carpet/mixins/WorldChunk_fillUpdatesMixin.java @@ -0,0 +1,34 @@ +package carpet.mixins; + +import carpet.CarpetSettings; +import net.minecraft.block.BlockState; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraft.world.chunk.WorldChunk; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(WorldChunk.class) +public class WorldChunk_fillUpdatesMixin +{ + @Redirect(method = "setBlockState", at = @At( + value = "INVOKE", + target = "Lnet/minecraft/block/BlockState;onBlockAdded(Lnet/minecraft/world/World;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;Z)V" + )) + private void onAdded(BlockState blockState, World world_1, BlockPos blockPos_1, BlockState blockState_1, boolean boolean_1) + { + if (!CarpetSettings.impendingFillSkipUpdates) + blockState.onBlockAdded(world_1, blockPos_1, blockState_1, boolean_1); + } + + @Redirect(method = "setBlockState", at = @At( + value = "INVOKE", + target = "Lnet/minecraft/block/BlockState;onBlockRemoved(Lnet/minecraft/world/World;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;Z)V" + )) + private void onRemoved(BlockState blockState, World world_1, BlockPos blockPos_1, BlockState blockState_1, boolean boolean_1) + { + if (!CarpetSettings.impendingFillSkipUpdates) + blockState.onBlockRemoved(world_1, blockPos_1, blockState_1, boolean_1); + } +} diff --git a/src/main/java/carpet/mixins/World_fillUpdatesMixin.java b/src/main/java/carpet/mixins/World_fillUpdatesMixin.java new file mode 100644 index 00000000..8c80014a --- /dev/null +++ b/src/main/java/carpet/mixins/World_fillUpdatesMixin.java @@ -0,0 +1,19 @@ +package carpet.mixins; + +import carpet.CarpetSettings; +import net.minecraft.world.World; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.Constant; +import org.spongepowered.asm.mixin.injection.ModifyConstant; + +@Mixin(World.class) +public abstract class World_fillUpdatesMixin +{ + @ModifyConstant(method = "setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;I)Z", + constant = @Constant(intValue = 16)) + private int addFillUpdatesInt(int original) { + if (CarpetSettings.impendingFillSkipUpdates) + return -1; + return original; + } +} diff --git a/src/main/resources/carpet.mixins.json b/src/main/resources/carpet.mixins.json index 1f663fcc..8a615c4c 100644 --- a/src/main/resources/carpet.mixins.json +++ b/src/main/resources/carpet.mixins.json @@ -4,8 +4,15 @@ "compatibilityLevel": "JAVA_8", "mixins": [ "CommandManagerMixin", + "FillCommandMixin", "CloneCommandMixin", + "SetBlockCommandMixin", + "World_fillUpdatesMixin", + "WorldChunk_fillUpdatesMixin", + "StructureBlockBlockEntity_fillUpdatesMixin", + "Structure_fillUpdatesMixin", + "MinecraftServer_coreMixin", "MinecraftServer_tickspeedMixin",