diff --git a/src/main/java/net/modfest/fireblanket/FireblanketMixin.java b/src/main/java/net/modfest/fireblanket/FireblanketMixin.java index fe3ab53..171d601 100644 --- a/src/main/java/net/modfest/fireblanket/FireblanketMixin.java +++ b/src/main/java/net/modfest/fireblanket/FireblanketMixin.java @@ -56,6 +56,10 @@ public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { return FireblanketConfig.get(ConfigSpecs.FLATTEN_CHUNK_PALETTES); } + if (mixinClassName.contains("entity_immutability")) { + return FireblanketConfig.get(ConfigSpecs.ENTITY_IMMUTABILITY); + } + if (mixinClassName.contains("ai") || mixinClassName.contains("sounds")) { return FireblanketConfig.get(ConfigSpecs.GAMEPLAY_CHANGES); } diff --git a/src/main/java/net/modfest/fireblanket/config/ConfigSpecs.java b/src/main/java/net/modfest/fireblanket/config/ConfigSpecs.java index 4968e05..20fe95b 100644 --- a/src/main/java/net/modfest/fireblanket/config/ConfigSpecs.java +++ b/src/main/java/net/modfest/fireblanket/config/ConfigSpecs.java @@ -44,6 +44,11 @@ public final class ConfigSpecs { Disables the usage of zstd to save world data and compress network connections. """, "no", ConfigParsers.BOOLEAN); + public static final ConfigSpec ENTITY_IMMUTABILITY = new ConfigSpec<>("entity-immutability", "Entity Immutability by Default", + """ + Makes entities default to being immutable. For example, it will set frames to fixed by default. + """, "no", ConfigParsers.BOOLEAN); + public static final ConfigSpec GAMEPLAY_CHANGES = new ConfigSpec<>("gameplay-changes", "Gameplay Changes", """ Allow altering features in a way that impacts gameplay. @@ -67,6 +72,7 @@ private static void buildMap() { ALL_SPECS.add(FLATTEN_CHUNK_PALETTES); ALL_SPECS.add(ALLOW_FOOTGUNS); ALL_SPECS.add(AVOID_ZSTD); + ALL_SPECS.add(ENTITY_IMMUTABILITY); ALL_SPECS.add(GAMEPLAY_CHANGES); // We have registries at home: diff --git a/src/main/java/net/modfest/fireblanket/mixin/entity_immutability/MixinArmorStand.java b/src/main/java/net/modfest/fireblanket/mixin/entity_immutability/MixinArmorStand.java new file mode 100644 index 0000000..8bdf8e0 --- /dev/null +++ b/src/main/java/net/modfest/fireblanket/mixin/entity_immutability/MixinArmorStand.java @@ -0,0 +1,27 @@ +package net.modfest.fireblanket.mixin.entity_immutability; + +import net.minecraft.entity.EntityType; +import net.minecraft.entity.decoration.ArmorStandEntity; +import net.minecraft.world.World; +import net.modfest.fireblanket.mixinsupport.ImmmovableLivingEntity; +import org.spongepowered.asm.mixin.Mixin; +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; + +@Mixin(ArmorStandEntity.class) +public class MixinArmorStand { + @Shadow + private int disabledSlots; + + @Inject(method = "(Lnet/minecraft/entity/EntityType;Lnet/minecraft/world/World;)V", at = @At("RETURN")) + private void onInit(EntityType entityType, World world, CallbackInfo ci) { + // Disable all slots by default + this.disabledSlots = 4144959; + // Disable movement (prevents abuse of fishing rods) + if (this instanceof ImmmovableLivingEntity im) { + im.setNoMovement(true); + } + } +} diff --git a/src/main/java/net/modfest/fireblanket/mixin/entity_immutability/MixinItemFrame.java b/src/main/java/net/modfest/fireblanket/mixin/entity_immutability/MixinItemFrame.java new file mode 100644 index 0000000..082a446 --- /dev/null +++ b/src/main/java/net/modfest/fireblanket/mixin/entity_immutability/MixinItemFrame.java @@ -0,0 +1,21 @@ +package net.modfest.fireblanket.mixin.entity_immutability; + +import net.minecraft.entity.EntityType; +import net.minecraft.entity.decoration.ItemFrameEntity; +import net.minecraft.world.World; +import org.spongepowered.asm.mixin.Mixin; +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; + +@Mixin(ItemFrameEntity.class) +public class MixinItemFrame { + @Shadow + private boolean fixed; + + @Inject(method = "(Lnet/minecraft/entity/EntityType;Lnet/minecraft/world/World;)V", at = @At("RETURN")) + private void onInit(EntityType entityType, World world, CallbackInfo ci) { + this.fixed = true; + } +} diff --git a/src/main/resources/fireblanket.mixins.json b/src/main/resources/fireblanket.mixins.json index 822e8aa..6ee460e 100644 --- a/src/main/resources/fireblanket.mixins.json +++ b/src/main/resources/fireblanket.mixins.json @@ -9,7 +9,7 @@ "accessor.EntityTypeAccessor", "accessor.ServerChunkManagerAccessor", "accessor.ServerLoginNetworkHandlerAccessor", - "adventure_fix.MixinItemStack", + "adventure_fix.MixinItemStack", "adventure_fix.MixinPlayerInteractEntityC2SPacketHandler", "adventure_fix.MixinServerPlayerInteractionManager", "ai.MixinTemptGoal", @@ -17,13 +17,14 @@ "be_sync.MixinChunkHolder", "block.MixinCommandBlock", "block_format.MixinChunkSection", + "entity_immutability.MixinArmorStand", + "entity_immutability.MixinItemFrame", "entity_ticking.MixinDebugStickItem", "entity_ticking.MixinEntity", "entity_ticking.MixinItemGroups", "entity_ticking.MixinLivingEntity", "entity_ticking.MixinMinecraftServer", "entity_ticking.MixinServerChunkLoadingManager", - "mods.create.MixinSuperGlueEntity", "footgun.MixinEntitySelectorOptions", "footgun.MixinEntitySelectorReader", "fsc.MixinClientConnection", @@ -32,6 +33,7 @@ "io_uring.MixinServerNetworkIo", "mods.create.AccessorSmartBlockEntity", "mods.create.MixinMechanicalBearingBlockEntity", + "mods.create.MixinSuperGlueEntity", "mods.mythicmetals.MixinCarmotShield", "mods.pehkui.MixinScaleUtils", "mods.pswg.MixinComplexCollisionManager", @@ -61,7 +63,6 @@ "client.adventure_fix.MixinClientPlayerInteractionManager", "client.be_masking.MixinBlockEntityRenderDispatcher", "client.be_masking.MixinRebuildTask", - "mods.masking.sodium.MixinChunkRenderRebuildTask", "client.bufferbuilder_opto.MixinBufferBuilder", "client.bufferbuilder_opto.MixinVertexFormat", "client.entity_masking.MixinEntityRenderer", @@ -79,6 +80,7 @@ "client.vbo_opto.MixinShaderProgram", "client.vbo_opto.MixinVertexBuffer", "gamemode_selection.MixinKeyboard", - "gamemode_selection.MixinSelectionScreen" + "gamemode_selection.MixinSelectionScreen", + "mods.masking.sodium.MixinChunkRenderRebuildTask" ] }