diff --git a/gradle.properties b/gradle.properties index 7681710..3cd1458 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,6 +6,6 @@ loader_version=0.16.10 # Fabric API fabric_version=0.119.5+1.21.5 # Mod Properties -mod_version=1.0.0 +mod_version=1.1 maven_group=io.ib67 archives_base_name=sfcraft \ No newline at end of file diff --git a/src/main/java/io/ib67/sfcraft/mixin/common/EntityMixin.java b/src/main/java/io/ib67/sfcraft/mixin/common/EntityMixin.java index da41e24..14fc00e 100644 --- a/src/main/java/io/ib67/sfcraft/mixin/common/EntityMixin.java +++ b/src/main/java/io/ib67/sfcraft/mixin/common/EntityMixin.java @@ -1,13 +1,21 @@ package io.ib67.sfcraft.mixin.common; +import io.ib67.sfcraft.SFCraft; import io.ib67.sfcraft.callback.SFCallbacks; +import io.ib67.sfcraft.module.RoomModule; +import io.ib67.sfcraft.registry.RoomRegistry; import net.minecraft.entity.Entity; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.world.TeleportTarget; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; 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; + +import java.util.UUID; @Mixin(Entity.class) public abstract class EntityMixin { @@ -18,6 +26,25 @@ public abstract class EntityMixin { } } + @Shadow + public abstract UUID getUuid(); + + @Inject(at = @At("HEAD"), method = "teleportTo", cancellable = true) + private void sf$redirectTeleport(TeleportTarget teleportTarget, CallbackInfoReturnable cir) { + if (RoomModule.isVirtual(this.getUuid())) { + cir.setReturnValue((Entity) (Object) this); + } + } + + @Inject(at = @At("HEAD"), method = "canUsePortals", cancellable = true) + private void sf$disablePortal(boolean allowVehicles, CallbackInfoReturnable cir) { + var registry = SFCraft.getInjector().getInstance(RoomRegistry.class); + var $this = (Entity) (Object) this; + if (registry.isRoomWorld($this.getWorld().getRegistryKey())) { + cir.setReturnValue(false); + } + } + @Unique private Entity $this() { return (Entity) (Object) this; diff --git a/src/main/java/io/ib67/sfcraft/mixin/server/ServerChunkManagerMixin.java b/src/main/java/io/ib67/sfcraft/mixin/common/bridge/ServerChunkManagerBridge.java similarity index 77% rename from src/main/java/io/ib67/sfcraft/mixin/server/ServerChunkManagerMixin.java rename to src/main/java/io/ib67/sfcraft/mixin/common/bridge/ServerChunkManagerBridge.java index 0cc1785..d9d6b11 100644 --- a/src/main/java/io/ib67/sfcraft/mixin/server/ServerChunkManagerMixin.java +++ b/src/main/java/io/ib67/sfcraft/mixin/common/bridge/ServerChunkManagerBridge.java @@ -1,4 +1,4 @@ -package io.ib67.sfcraft.mixin.server; +package io.ib67.sfcraft.mixin.common.bridge; import net.minecraft.server.world.ChunkLevelManager; import net.minecraft.server.world.ServerChunkManager; @@ -6,7 +6,7 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; @Mixin(ServerChunkManager.class) -public interface ServerChunkManagerMixin { +public interface ServerChunkManagerBridge { @Accessor("levelManager") ChunkLevelManager getLevelManager(); } diff --git a/src/main/java/io/ib67/sfcraft/mixin/server/fixes/EndermanEntityMixin.java b/src/main/java/io/ib67/sfcraft/mixin/common/fixes/EndermanEntityMixin.java similarity index 93% rename from src/main/java/io/ib67/sfcraft/mixin/server/fixes/EndermanEntityMixin.java rename to src/main/java/io/ib67/sfcraft/mixin/common/fixes/EndermanEntityMixin.java index 3b18ba4..0ac59a4 100644 --- a/src/main/java/io/ib67/sfcraft/mixin/server/fixes/EndermanEntityMixin.java +++ b/src/main/java/io/ib67/sfcraft/mixin/common/fixes/EndermanEntityMixin.java @@ -1,4 +1,4 @@ -package io.ib67.sfcraft.mixin.server.fixes; +package io.ib67.sfcraft.mixin.common.fixes; import io.ib67.sfcraft.mixin.common.MobEntityMixin; import net.minecraft.entity.mob.EndermanEntity; diff --git a/src/main/java/io/ib67/sfcraft/mixin/server/optimize/LivingEntityMixin.java b/src/main/java/io/ib67/sfcraft/mixin/common/fixes/LivingEntityMixin.java similarity index 93% rename from src/main/java/io/ib67/sfcraft/mixin/server/optimize/LivingEntityMixin.java rename to src/main/java/io/ib67/sfcraft/mixin/common/fixes/LivingEntityMixin.java index 25f3325..d9111eb 100644 --- a/src/main/java/io/ib67/sfcraft/mixin/server/optimize/LivingEntityMixin.java +++ b/src/main/java/io/ib67/sfcraft/mixin/common/fixes/LivingEntityMixin.java @@ -1,4 +1,4 @@ -package io.ib67.sfcraft.mixin.server.optimize; +package io.ib67.sfcraft.mixin.common.fixes; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.passive.BeeEntity; diff --git a/src/main/java/io/ib67/sfcraft/mixin/server/fixes/ProjectileEntityMixin.java b/src/main/java/io/ib67/sfcraft/mixin/common/fixes/ProjectileEntityMixin.java similarity index 97% rename from src/main/java/io/ib67/sfcraft/mixin/server/fixes/ProjectileEntityMixin.java rename to src/main/java/io/ib67/sfcraft/mixin/common/fixes/ProjectileEntityMixin.java index 947f44c..0f4270e 100644 --- a/src/main/java/io/ib67/sfcraft/mixin/server/fixes/ProjectileEntityMixin.java +++ b/src/main/java/io/ib67/sfcraft/mixin/common/fixes/ProjectileEntityMixin.java @@ -1,4 +1,4 @@ -package io.ib67.sfcraft.mixin.server.fixes; +package io.ib67.sfcraft.mixin.common.fixes; import net.minecraft.entity.Entity; import net.minecraft.entity.player.PlayerEntity; diff --git a/src/main/java/io/ib67/sfcraft/mixin/server/subserver/EntityMixin.java b/src/main/java/io/ib67/sfcraft/mixin/server/subserver/EntityMixin.java deleted file mode 100644 index 346d0ef..0000000 --- a/src/main/java/io/ib67/sfcraft/mixin/server/subserver/EntityMixin.java +++ /dev/null @@ -1,38 +0,0 @@ -package io.ib67.sfcraft.mixin.server.subserver; - -import io.ib67.sfcraft.SFCraft; -import io.ib67.sfcraft.module.RoomModule; -import io.ib67.sfcraft.registry.RoomRegistry; -import io.ib67.sfcraft.util.Helper; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.world.TeleportTarget; -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.CallbackInfoReturnable; - -import java.util.UUID; - -@Mixin(Entity.class) -public abstract class EntityMixin { - @Shadow - public abstract UUID getUuid(); - - @Inject(at = @At("HEAD"), method = "teleportTo", cancellable = true) - private void sf$redirectTeleport(TeleportTarget teleportTarget, CallbackInfoReturnable cir) { - if (RoomModule.isVirtual(this.getUuid())) { - cir.setReturnValue((Entity) (Object) this); - } - } - - @Inject(at = @At("HEAD"), method = "canUsePortals", cancellable = true) - private void sf$disablePortal(boolean allowVehicles, CallbackInfoReturnable cir) { - var registry = SFCraft.getInjector().getInstance(RoomRegistry.class); - var $this = (Entity) (Object) this; - if (registry.isRoomWorld($this.getWorld().getRegistryKey())) { - cir.setReturnValue(false); - } - } -} diff --git a/src/main/java/io/ib67/sfcraft/mixin/server/subserver/PlayerManagerMixin.java b/src/main/java/io/ib67/sfcraft/mixin/server/subserver/PlayerManagerMixin.java index 6a1b2f2..087c9ea 100644 --- a/src/main/java/io/ib67/sfcraft/mixin/server/subserver/PlayerManagerMixin.java +++ b/src/main/java/io/ib67/sfcraft/mixin/server/subserver/PlayerManagerMixin.java @@ -2,20 +2,16 @@ package io.ib67.sfcraft.mixin.server.subserver; import com.mojang.authlib.GameProfile; import io.ib67.sfcraft.SFCraft; -import io.ib67.sfcraft.mixin.server.ServerChunkManagerMixin; +import io.ib67.sfcraft.mixin.common.bridge.ServerChunkManagerBridge; import io.ib67.sfcraft.module.RoomModule; import io.ib67.sfcraft.registry.RoomRegistry; -import io.ib67.sfcraft.util.Helper; import net.minecraft.entity.Entity; import net.minecraft.network.ClientConnection; import net.minecraft.server.PlayerManager; import net.minecraft.server.network.ConnectedClientData; import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.server.world.ServerWorld; import net.minecraft.text.Text; import net.minecraft.util.math.GlobalPos; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.TeleportTarget; import org.slf4j.Logger; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -23,7 +19,6 @@ import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @@ -71,7 +66,7 @@ public abstract class PlayerManagerMixin { private void teleportToRoom(ServerPlayerEntity player, GlobalPos spawn) { var world = player.getServer().getWorld(spawn.dimension()); var pos = spawn.pos(); - ((ServerChunkManagerMixin)world.getChunkManager()).getLevelManager().handleChunkEnter(player.getWatchedSection(), player); + ((ServerChunkManagerBridge)world.getChunkManager()).getLevelManager().handleChunkEnter(player.getWatchedSection(), player); player.teleport(world, pos.getX(), pos.getY(), pos.getZ(), Set.of(), 0, 0, true); } diff --git a/src/main/java/io/ib67/sfcraft/mixin/server/subserver/command/GameRuleCommandMixin.java b/src/main/java/io/ib67/sfcraft/mixin/server/subserver/command/GameRuleCommandMixin.java deleted file mode 100644 index 0650c93..0000000 --- a/src/main/java/io/ib67/sfcraft/mixin/server/subserver/command/GameRuleCommandMixin.java +++ /dev/null @@ -1,29 +0,0 @@ -package io.ib67.sfcraft.mixin.server.subserver.command; - -import com.mojang.brigadier.context.CommandContext; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.command.GameRuleCommand; -import net.minecraft.server.command.ServerCommandSource; -import net.minecraft.world.GameRules; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; - -@Mixin(GameRuleCommand.class) -public abstract class GameRuleCommandMixin { - @Redirect(at = @At(value = "INVOKE", target = "Lnet/minecraft/server/MinecraftServer;getGameRules()Lnet/minecraft/world/GameRules;"), method = "executeSet") - private static GameRules sf$redirectSetForPerWorld(MinecraftServer instance, CommandContext context) { - return getGameRule(instance, context.getSource()); - } - - @Redirect(at = @At(value = "INVOKE", target = "Lnet/minecraft/server/MinecraftServer;getGameRules()Lnet/minecraft/world/GameRules;"), method = "executeQuery") - private static GameRules sf$redirectSetForPerWorld(MinecraftServer instance, ServerCommandSource context) { - return getGameRule(instance, context); - } - - private static GameRules getGameRule(MinecraftServer instance, ServerCommandSource source) { - var world = source.getWorld(); - if (world == null) return instance.getGameRules(); - return world.getGameRules(); // this is same as Server#getGameRule since one GameRules is shared across multiple worlds in vanilla. - } -} diff --git a/src/main/resources/sfcraft.mixins.json b/src/main/resources/sfcraft.mixins.json index 8ef23b3..5ac7b91 100644 --- a/src/main/resources/sfcraft.mixins.json +++ b/src/main/resources/sfcraft.mixins.json @@ -8,14 +8,17 @@ "common.bridge.ItemBridge", "common.bridge.ServerPlayerBridge", "common.bridge.ServerWorldBridge", - "server.ServerChunkManagerMixin" + "common.bridge.ServerChunkManagerBridge", + "common.fixes.EndermanEntityMixin", + "common.fixes.ProjectileEntityMixin", + "common.fixes.LivingEntityMixin", + "common.EntityMixin", + "common.MobEntityMixin", + "common.PlayerEntityMixin" ], "client": [ ], "server": [ - "common.EntityMixin", - "common.MobEntityMixin", - "common.PlayerEntityMixin", "server.AbstractFurnaceBlockMixin", "server.LegacyQueryHandlerMixin", "server.MinecraftServerMixin", @@ -25,16 +28,11 @@ "server.ServerPlayNetworkHandlerMixin", "server.ServerWorldMixin", "server.SleepManagerMixin", - "server.fixes.EndermanEntityMixin", - "server.fixes.ProjectileEntityMixin", - "server.optimize.LivingEntityMixin", - "server.subserver.EntityMixin", "server.subserver.PlayerListS2CPacket$EntryMixin", "server.subserver.PlayerManagerMixin", "server.subserver.PlayerSaveHandlerMixin", "server.subserver.ServerLoginNetworkHandlerMixin", - "server.subserver.ServerPlayerEntityMixin", - "server.subserver.command.GameRuleCommandMixin" + "server.subserver.ServerPlayerEntityMixin" ], "injectors": { "defaultRequire": 1