Skip to content

Commit ad4085f

Browse files
authored
Merge pull request #20 from ModFest/feature/entity_modif
Allow entities to be "immutable" by default
2 parents 846f0f7 + 6398edf commit ad4085f

File tree

10 files changed

+153
-11
lines changed

10 files changed

+153
-11
lines changed

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ authors=jaskarth, unascribed
1717
contributors=Patbox, IThundxr
1818
license=AGPL-3.0-or-later
1919
# Mod Version
20-
baseVersion=0.6.1
20+
baseVersion=0.6.2
2121
# Branch Metadata
2222
branch=1.21
2323
tagBranch=1.21

src/main/java/net/modfest/fireblanket/Fireblanket.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@
77
import net.fabricmc.fabric.api.entity.event.v1.ServerEntityWorldChangeEvents;
88
import net.fabricmc.fabric.api.event.Event;
99
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerWorldEvents;
10-
import net.fabricmc.fabric.api.event.player.UseBlockCallback;
1110
import net.fabricmc.fabric.api.event.registry.RegistryEntryAddedCallback;
11+
import net.fabricmc.fabric.api.gamerule.v1.GameRuleFactory;
12+
import net.fabricmc.fabric.api.gamerule.v1.GameRuleRegistry;
1213
import net.fabricmc.fabric.api.networking.v1.PacketByteBufs;
1314
import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry;
1415
import net.fabricmc.fabric.api.networking.v1.ServerLoginConnectionEvents;
@@ -28,6 +29,7 @@
2829
import net.minecraft.server.world.ServerWorld;
2930
import net.minecraft.util.Identifier;
3031
import net.minecraft.util.math.ChunkPos;
32+
import net.minecraft.world.GameRules;
3133
import net.modfest.fireblanket.command.CmdFindReplaceCommand;
3234
import net.modfest.fireblanket.command.DumpCommand;
3335
import net.modfest.fireblanket.command.RegionCommand;
@@ -49,9 +51,6 @@
4951
import org.slf4j.Logger;
5052
import org.slf4j.LoggerFactory;
5153

52-
import java.io.IOException;
53-
import java.nio.file.Files;
54-
import java.nio.file.Path;
5554
import java.util.concurrent.LinkedBlockingQueue;
5655
import java.util.concurrent.atomic.AtomicInteger;
5756
import java.util.function.Consumer;
@@ -61,6 +60,13 @@ public class Fireblanket implements ModInitializer {
6160
public static final Identifier FULL_STREAM_COMPRESSION = Identifier.of("fireblanket", "full_stream_compression");
6261
public static final Identifier REGIONS_UPDATE = Identifier.of("fireblanket", "regions_update");
6362

63+
/**
64+
* Whether new entities will be fixed.
65+
* @see net.modfest.fireblanket.mixin.entity_immutability
66+
*/
67+
public static final GameRules.Key<GameRules.BooleanRule> NEW_ENTITIES_IMMUTABLE =
68+
GameRuleRegistry.register("newEntitiesImmutable", GameRules.Category.MOBS, GameRuleFactory.createBooleanRule(true));
69+
6470
public static final Logger LOGGER = LoggerFactory.getLogger("Fireblanket");
6571

6672
public record QueuedPacket(ClientConnection conn, Packet<?> packet, PacketCallbacks listener) {
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package net.modfest.fireblanket.mixin.accessor;
2+
3+
import net.minecraft.entity.decoration.ArmorStandEntity;
4+
import org.spongepowered.asm.mixin.Mixin;
5+
import org.spongepowered.asm.mixin.gen.Accessor;
6+
7+
@Mixin(ArmorStandEntity.class)
8+
public interface ArmorStandEntityAccessor {
9+
@Accessor
10+
void setDisabledSlots(int d);
11+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package net.modfest.fireblanket.mixin.accessor;
2+
3+
import net.minecraft.entity.decoration.ItemFrameEntity;
4+
import org.spongepowered.asm.mixin.Mixin;
5+
import org.spongepowered.asm.mixin.gen.Accessor;
6+
7+
@Mixin(ItemFrameEntity.class)
8+
public interface ItemFrameAccessor {
9+
@Accessor
10+
void setFixed(boolean v);
11+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package net.modfest.fireblanket.mixin.adventure_fix;
2+
3+
import net.minecraft.block.BlockState;
4+
import net.minecraft.block.FarmlandBlock;
5+
import net.minecraft.entity.Entity;
6+
import net.minecraft.entity.player.PlayerEntity;
7+
import net.minecraft.util.math.BlockPos;
8+
import net.minecraft.world.World;
9+
import org.jetbrains.annotations.Nullable;
10+
import org.spongepowered.asm.mixin.Mixin;
11+
import org.spongepowered.asm.mixin.injection.At;
12+
import org.spongepowered.asm.mixin.injection.Inject;
13+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
14+
15+
@Mixin(FarmlandBlock.class)
16+
public class MixinFarmlandBlock {
17+
@Inject(
18+
method = "setToDirt",
19+
at = @At("HEAD"),
20+
cancellable = true
21+
)
22+
private static void doNotSetToDirt(@Nullable Entity entity, BlockState state, World world, BlockPos pos, CallbackInfo ci) {
23+
if (entity instanceof PlayerEntity player && !player.canModifyBlocks()) {
24+
ci.cancel();
25+
}
26+
}
27+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package net.modfest.fireblanket.mixin.entity_immutability;
2+
3+
import com.llamalad7.mixinextras.sugar.Local;
4+
import net.minecraft.entity.decoration.AbstractDecorationEntity;
5+
import net.minecraft.item.DecorationItem;
6+
import net.minecraft.item.ItemUsageContext;
7+
import net.minecraft.util.ActionResult;
8+
import net.modfest.fireblanket.Fireblanket;
9+
import net.modfest.fireblanket.util.ImmutableEntities;
10+
import org.spongepowered.asm.mixin.Mixin;
11+
import org.spongepowered.asm.mixin.injection.At;
12+
import org.spongepowered.asm.mixin.injection.Inject;
13+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
14+
15+
@Mixin(DecorationItem.class)
16+
public class MixinDecorationItem {
17+
@Inject(method = "useOnBlock(Lnet/minecraft/item/ItemUsageContext;)Lnet/minecraft/util/ActionResult;", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;getOrDefault(Lnet/minecraft/component/ComponentType;Ljava/lang/Object;)Ljava/lang/Object;"))
18+
private void onInitSpawnedEntity(ItemUsageContext context, CallbackInfoReturnable<ActionResult> cir, @Local AbstractDecorationEntity entity) {
19+
if (context.getWorld().getGameRules().getBoolean(Fireblanket.NEW_ENTITIES_IMMUTABLE)) {
20+
ImmutableEntities.makeImmutable(entity);
21+
}
22+
}
23+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package net.modfest.fireblanket.mixin.entity_immutability;
2+
3+
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
4+
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
5+
import net.minecraft.entity.Entity;
6+
import net.minecraft.entity.EntityType;
7+
import net.minecraft.entity.SpawnReason;
8+
import net.minecraft.server.world.ServerWorld;
9+
import net.minecraft.util.math.BlockPos;
10+
import net.minecraft.world.World;
11+
import net.modfest.fireblanket.Fireblanket;
12+
import net.modfest.fireblanket.util.ImmutableEntities;
13+
import org.jetbrains.annotations.Nullable;
14+
import org.spongepowered.asm.mixin.Mixin;
15+
import org.spongepowered.asm.mixin.injection.At;
16+
17+
import java.util.function.Consumer;
18+
19+
@Mixin(EntityType.class)
20+
public class MixinEntityType {
21+
@WrapOperation(method = "create(Lnet/minecraft/server/world/ServerWorld;Ljava/util/function/Consumer;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/entity/SpawnReason;ZZ)Lnet/minecraft/entity/Entity;", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/EntityType;create(Lnet/minecraft/world/World;)Lnet/minecraft/entity/Entity;"))
22+
private Entity afterCreated(EntityType<?> instance, World world, Operation<Entity> original, ServerWorld world2, @Nullable Consumer<Entity> afterConsumer, BlockPos pos, SpawnReason reason, boolean alignPosition, boolean invertY) {
23+
var entity = original.call(instance, world);
24+
if (world.getGameRules().getBoolean(Fireblanket.NEW_ENTITIES_IMMUTABLE) && reason == SpawnReason.SPAWN_EGG) {
25+
if (entity != null) {
26+
ImmutableEntities.makeImmutable(entity);
27+
}
28+
}
29+
return entity;
30+
}
31+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package net.modfest.fireblanket.util;
2+
3+
import net.minecraft.entity.Entity;
4+
import net.modfest.fireblanket.mixin.accessor.ArmorStandEntityAccessor;
5+
import net.modfest.fireblanket.mixin.accessor.ItemFrameAccessor;
6+
import net.modfest.fireblanket.mixinsupport.ImmmovableLivingEntity;
7+
8+
public class ImmutableEntities {
9+
public static void makeImmutable(Entity entity) {
10+
// Set invulnerability
11+
entity.setInvulnerable(true);
12+
13+
if (entity instanceof ArmorStandEntityAccessor ae) {
14+
// Disable all slots
15+
ae.setDisabledSlots(4144959);
16+
// Disable movement (prevents abuse of fishing rods)
17+
if (entity instanceof ImmmovableLivingEntity im) {
18+
im.setNoMovement(true);
19+
}
20+
}
21+
22+
if (entity instanceof ItemFrameAccessor ie) {
23+
// Make item frames fixed
24+
ie.setFixed(true);
25+
}
26+
}
27+
}
Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
{
22
"argument.entity.selector.limit.unforced": "Targeting too many entities with no distance filter; add `force=true` to the selector to bypass",
3-
"argument.entity.options.force.description": "Force-allow more than 50 entities targeted with no distance filter"
4-
}
3+
"argument.entity.options.force.description": "Force-allow more than 50 entities targeted with no distance filter",
4+
"gamerule.newEntitiesImmutable": "Whether newly spawned entities should be immutable. (Item frames will be fixed for example"
5+
}

src/main/resources/fireblanket.mixins.json

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,26 +4,30 @@
44
"compatibilityLevel": "JAVA_17",
55
"plugin": "net.modfest.fireblanket.FireblanketMixin",
66
"mixins": [
7+
"accessor.ArmorStandEntityAccessor",
78
"accessor.BlockEntityTypeAccessor",
89
"accessor.ClientConnectionAccessor",
910
"accessor.EntityTypeAccessor",
11+
"accessor.ItemFrameAccessor",
1012
"accessor.ServerChunkManagerAccessor",
1113
"accessor.ServerLoginNetworkHandlerAccessor",
12-
"adventure_fix.MixinItemStack",
14+
"adventure_fix.MixinItemStack",
1315
"adventure_fix.MixinPlayerInteractEntityC2SPacketHandler",
1416
"adventure_fix.MixinServerPlayerInteractionManager",
17+
"adventure_fix.MixinFarmlandBlock",
1518
"ai.MixinTemptGoal",
1619
"be_sync.MixinBlockEntity",
1720
"be_sync.MixinChunkHolder",
1821
"block.MixinCommandBlock",
1922
"block_format.MixinChunkSection",
23+
"entity_immutability.MixinDecorationItem",
24+
"entity_immutability.MixinEntityType",
2025
"entity_ticking.MixinDebugStickItem",
2126
"entity_ticking.MixinEntity",
2227
"entity_ticking.MixinItemGroups",
2328
"entity_ticking.MixinLivingEntity",
2429
"entity_ticking.MixinMinecraftServer",
2530
"entity_ticking.MixinServerChunkLoadingManager",
26-
"mods.create.MixinSuperGlueEntity",
2731
"footgun.MixinEntitySelectorOptions",
2832
"footgun.MixinEntitySelectorReader",
2933
"fsc.MixinClientConnection",
@@ -32,6 +36,7 @@
3236
"io_uring.MixinServerNetworkIo",
3337
"mods.create.AccessorSmartBlockEntity",
3438
"mods.create.MixinMechanicalBearingBlockEntity",
39+
"mods.create.MixinSuperGlueEntity",
3540
"mods.mythicmetals.MixinCarmotShield",
3641
"mods.pehkui.MixinScaleUtils",
3742
"mods.pswg.MixinComplexCollisionManager",
@@ -61,7 +66,6 @@
6166
"client.adventure_fix.MixinClientPlayerInteractionManager",
6267
"client.be_masking.MixinBlockEntityRenderDispatcher",
6368
"client.be_masking.MixinRebuildTask",
64-
"mods.masking.sodium.MixinChunkRenderRebuildTask",
6569
"client.bufferbuilder_opto.MixinBufferBuilder",
6670
"client.bufferbuilder_opto.MixinVertexFormat",
6771
"client.entity_masking.MixinEntityRenderer",
@@ -79,6 +83,7 @@
7983
"client.vbo_opto.MixinShaderProgram",
8084
"client.vbo_opto.MixinVertexBuffer",
8185
"gamemode_selection.MixinKeyboard",
82-
"gamemode_selection.MixinSelectionScreen"
86+
"gamemode_selection.MixinSelectionScreen",
87+
"mods.masking.sodium.MixinChunkRenderRebuildTask"
8388
]
8489
}

0 commit comments

Comments
 (0)