diff --git a/build.gradle b/build.gradle index 0483335..36bb4d9 100644 --- a/build.gradle +++ b/build.gradle @@ -29,9 +29,11 @@ dependencies { // modImplementation so Loom loads it as a mod in the dev runtime; plain // implementation only adds it to the classpath, so Loader can't find the `fabric` mod. implementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" - shadow('com.maxmind.geoip2:geoip2:4.2.0') - shadow("io.javalin:javalin:6.4.0") - include(implementation "io.ib67.kiwi:lang:1.2.3-SNAPSHOT") + shadow('com.maxmind.geoip2:geoip2:5.2.0') + shadow("io.javalin:javalin:7.2.2") { + exclude group: "org.eclipse.jetty.ee10", module: "jetty-ee10-annotations" + } + shadow("io.ib67.kiwi:lang:1.2.3-SNAPSHOT") shadow('com.github.houbb:pinyin:0.4.0') shadow('com.google.inject:guice:7.0.0') { exclude group: 'com.google.guava', module: 'guava' @@ -44,6 +46,7 @@ configurations.implementation.extendsFrom(configurations.shadow) shadowJar { configurations = [project.configurations.shadow] exclude("META-INF") + relocate 'kotlin', 'sfcraft-kotlin' } processResources { diff --git a/src/main/java/io/ib67/sfcraft/geoip/MaxMindGeoIPService.java b/src/main/java/io/ib67/sfcraft/geoip/MaxMindGeoIPService.java index 04f14b9..03da3d9 100644 --- a/src/main/java/io/ib67/sfcraft/geoip/MaxMindGeoIPService.java +++ b/src/main/java/io/ib67/sfcraft/geoip/MaxMindGeoIPService.java @@ -40,19 +40,19 @@ public class MaxMindGeoIPService implements Module, GeoIPService { @Override @SneakyThrows public Clock clockOf(InetAddress address) throws GeoIp2Exception { - return Clock.system(TimeZone.getTimeZone(databaseReader.city(address).getLocation().getTimeZone()).toZoneId()); + return Clock.system(TimeZone.getTimeZone(databaseReader.city(address).location().timeZone()).toZoneId()); } @Override @SneakyThrows public City cityOf(InetAddress address) throws GeoIp2Exception { - return databaseReader.city(address).getCity(); + return databaseReader.city(address).city(); } @Override @SneakyThrows public Country countryOf(InetAddress address) throws GeoIp2Exception { - return databaseReader.country(address).getCountry(); + return databaseReader.country(address).country(); } @SneakyThrows diff --git a/src/main/java/io/ib67/sfcraft/mixin/common/ZombieMixin.java b/src/main/java/io/ib67/sfcraft/mixin/common/ZombieMixin.java index 11acfd3..17a94ef 100644 --- a/src/main/java/io/ib67/sfcraft/mixin/common/ZombieMixin.java +++ b/src/main/java/io/ib67/sfcraft/mixin/common/ZombieMixin.java @@ -1,7 +1,6 @@ package io.ib67.sfcraft.mixin.common; import net.minecraft.world.entity.monster.zombie.Zombie; -import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import org.spongepowered.asm.mixin.Mixin; diff --git a/src/main/java/io/ib67/sfcraft/mixin/common/bridge/ItemBridge.java b/src/main/java/io/ib67/sfcraft/mixin/common/bridge/ItemBridge.java deleted file mode 100644 index 4eeb7aa..0000000 --- a/src/main/java/io/ib67/sfcraft/mixin/common/bridge/ItemBridge.java +++ /dev/null @@ -1,12 +0,0 @@ -package io.ib67.sfcraft.mixin.common.bridge; - -import net.minecraft.core.Holder; -import net.minecraft.world.item.Item; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(Item.class) -public interface ItemBridge { - @Accessor - void setBuiltInRegistryHolder(Holder.Reference value); -} diff --git a/src/main/java/io/ib67/sfcraft/mixin/common/bridge/ServerWorldBridge.java b/src/main/java/io/ib67/sfcraft/mixin/common/bridge/ServerWorldBridge.java index b7f828a..8375a93 100644 --- a/src/main/java/io/ib67/sfcraft/mixin/common/bridge/ServerWorldBridge.java +++ b/src/main/java/io/ib67/sfcraft/mixin/common/bridge/ServerWorldBridge.java @@ -8,5 +8,5 @@ import org.spongepowered.asm.mixin.gen.Accessor; @Mixin(ServerLevel.class) public interface ServerWorldBridge { @Accessor - SleepStatus getDEEPSLATE_BRICKS(); + SleepStatus getSleepStatus(); } diff --git a/src/main/java/io/ib67/sfcraft/mixin/server/AbstractFurnaceBlockMixin.java b/src/main/java/io/ib67/sfcraft/mixin/server/AbstractFurnaceBlockMixin.java index 41cb00f..8821ba2 100644 --- a/src/main/java/io/ib67/sfcraft/mixin/server/AbstractFurnaceBlockMixin.java +++ b/src/main/java/io/ib67/sfcraft/mixin/server/AbstractFurnaceBlockMixin.java @@ -40,7 +40,7 @@ public abstract class AbstractFurnaceBlockMixin extends BaseEntityBlock { var world = (ServerLevel) _world; AbstractFurnaceBlockEntity.serverTick(world, pos, state, blockEntity); int i = world.getGameRules().get(GameRules.PLAYERS_SLEEPING_PERCENTAGE); - if (((ServerWorldBridge) world).getDEEPSLATE_BRICKS().areEnoughSleeping(i)) { + if (((ServerWorldBridge) world).getSleepStatus().areEnoughSleeping(i)) { AbstractFurnaceBlockEntity.serverTick(world, pos, state, blockEntity); //todo: config support? AbstractFurnaceBlockEntity.serverTick(world, pos, state, blockEntity); } diff --git a/src/main/java/io/ib67/sfcraft/mixin/server/ServerPlayNetworkHandlerMixin.java b/src/main/java/io/ib67/sfcraft/mixin/server/ServerPlayNetworkHandlerMixin.java index ee5095f..e6bfa85 100644 --- a/src/main/java/io/ib67/sfcraft/mixin/server/ServerPlayNetworkHandlerMixin.java +++ b/src/main/java/io/ib67/sfcraft/mixin/server/ServerPlayNetworkHandlerMixin.java @@ -24,12 +24,12 @@ public abstract class ServerPlayNetworkHandlerMixin { * @author icybear * @reason small method, overwrite to reduce overhead */ - @Redirect(method = "method_44900", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/MinecraftServer;getChatDecorator()Lnet/minecraft/network/chat/ChatDecorator;")) + @Redirect(method = "lambda$handleChat$0", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/MinecraftServer;getChatDecorator()Lnet/minecraft/network/chat/ChatDecorator;")) public ChatDecorator getMessageDecorator(MinecraftServer instance) { return SFCraft.getInjector().getInstance(SimpleMessageDecorator.class); } - @Redirect(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/network/ServerGamePacketListenerImpl;disconnect(Lnet/minecraft/network/chat/Component;)V", ordinal = 2)) + @Redirect(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/network/ServerGamePacketListenerImpl;disconnect(Lnet/minecraft/network/chat/Component;)V")) public void onPlayerIdling(ServerGamePacketListenerImpl instance, Component text) { ((ServerPlayerBridge) instance.player).setLastActionTime(Long.MAX_VALUE); SFCallbacks.PLAYER_IDLE.invoker().onSwitchIdle(instance.player, true); diff --git a/src/main/java/io/ib67/sfcraft/mixin/server/ServerWorldMixin.java b/src/main/java/io/ib67/sfcraft/mixin/server/ServerWorldMixin.java index 9964db9..a17fe9e 100644 --- a/src/main/java/io/ib67/sfcraft/mixin/server/ServerWorldMixin.java +++ b/src/main/java/io/ib67/sfcraft/mixin/server/ServerWorldMixin.java @@ -12,7 +12,7 @@ public abstract class ServerWorldMixin { @ModifyArg(method = "tickTime", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/storage/ServerLevelData;setGameTime(J)V")) public long setTimeOfDay(long timeOfDay) { int i = ((ServerLevel) (Object) this).getGameRules().get(GameRules.PLAYERS_SLEEPING_PERCENTAGE); - if (((ServerWorldBridge) this).getDEEPSLATE_BRICKS().areEnoughSleeping(i)) { + if (((ServerWorldBridge) this).getSleepStatus().areEnoughSleeping(i)) { MixinHelper.spedUp = true; return timeOfDay + 10; } diff --git a/src/main/java/io/ib67/sfcraft/mixin/server/subserver/PlayerSaveHandlerMixin.java b/src/main/java/io/ib67/sfcraft/mixin/server/subserver/PlayerSaveHandlerMixin.java index 678360b..e89299e 100644 --- a/src/main/java/io/ib67/sfcraft/mixin/server/subserver/PlayerSaveHandlerMixin.java +++ b/src/main/java/io/ib67/sfcraft/mixin/server/subserver/PlayerSaveHandlerMixin.java @@ -3,6 +3,7 @@ package io.ib67.sfcraft.mixin.server.subserver; import com.mojang.datafixers.DataFixer; import io.ib67.sfcraft.module.RoomModule; import io.ib67.sfcraft.util.Helper; +import net.minecraft.server.players.NameAndId; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -41,9 +42,9 @@ public class PlayerSaveHandlerMixin { } } - @Redirect(at = @At(value = "FIELD", target = "Lnet/minecraft/world/level/storage/PlayerDataStorage;playerDir:Ljava/io/File;"), method = "load(Lnet/minecraft/world/entity/player/Player;Ljava/lang/String;)Ljava/util/Optional;") - private File sf$saveGetPlayerFolder(PlayerDataStorage instance, Player player) { - if (RoomModule.isVirtual(player.getUUID())) { + @Redirect(at = @At(value = "FIELD", target = "Lnet/minecraft/world/level/storage/PlayerDataStorage;playerDir:Ljava/io/File;"), method = "Lnet/minecraft/world/level/storage/PlayerDataStorage;load(Lnet/minecraft/server/players/NameAndId;Ljava/lang/String;)Ljava/util/Optional;") + private File sf$saveGetPlayerFolder(PlayerDataStorage instance, NameAndId player) { + if (RoomModule.isVirtual(player.id())) { return virtualPlayerFolder; } else { return this.playerDir; diff --git a/src/main/java/io/ib67/sfcraft/module/command/BackModule.java b/src/main/java/io/ib67/sfcraft/module/command/BackModule.java index 78a6a33..f0b81a9 100644 --- a/src/main/java/io/ib67/sfcraft/module/command/BackModule.java +++ b/src/main/java/io/ib67/sfcraft/module/command/BackModule.java @@ -27,14 +27,14 @@ public class BackModule extends ServerModule { private void registerCommands(CommandDispatcher dispatcher, CommandBuildContext registryAccess, Commands.CommandSelection registrationEnvironment) { dispatcher.register(LiteralArgumentBuilder.literal("back") .requires(it -> this.isEnabled()) - .requires(it -> it.getPlayer() != null) - .requires(it -> it.getPlayer().getLastDeathLocation().isPresent()) + .requires(it -> it.getPlayer() != null && it.getPlayer().getLastDeathLocation().isPresent()) .requires(it -> SFConsts.COMMAND_BACK.hasPermission(it.getPlayer())) .executes(this::onBack)); } public int onBack(CommandContext it) { var player = it.getSource().getPlayer(); + if (player == null) return 0; var pos = player.getLastDeathLocation().get(); var wld = player.level().getServer().getLevel(pos.dimension()); var _pos = pos.pos(); diff --git a/src/main/java/io/ib67/sfcraft/module/command/ManagementModule.java b/src/main/java/io/ib67/sfcraft/module/command/ManagementModule.java index 80c2293..a326ab3 100644 --- a/src/main/java/io/ib67/sfcraft/module/command/ManagementModule.java +++ b/src/main/java/io/ib67/sfcraft/module/command/ManagementModule.java @@ -72,7 +72,7 @@ public class ManagementModule extends ServerModule { var city = geoIPService.cityOf(addr); src.sendSystemMessage( Component.literal(" - ") - .append(Component.literal("[" + city.getName() + "] ").withColor(CommonColors.BLUE)) + .append(Component.literal("[" + city.name() + "] ").withColor(CommonColors.BLUE)) .append(Component.literal(serverPlayerEntity.getName().tryCollapseToString())) .append(Component.literal(" (" + Helper.hideIp(addr) + ")").withColor(CommonColors.LIGHT_GRAY)) ); diff --git a/src/main/java/io/ib67/sfcraft/module/room/CreativeRoomModule.java b/src/main/java/io/ib67/sfcraft/module/room/CreativeRoomModule.java index 8b02eed..004b46a 100644 --- a/src/main/java/io/ib67/sfcraft/module/room/CreativeRoomModule.java +++ b/src/main/java/io/ib67/sfcraft/module/room/CreativeRoomModule.java @@ -34,6 +34,7 @@ import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.util.CommonColors; import net.minecraft.world.level.GameType; +import net.minecraft.world.level.gamerules.GameRules; import org.jetbrains.annotations.NotNull; import java.awt.*; diff --git a/src/main/java/io/ib67/sfcraft/module/supervisor/WebHandler.java b/src/main/java/io/ib67/sfcraft/module/supervisor/WebHandler.java index ba1355f..9e1e5ac 100644 --- a/src/main/java/io/ib67/sfcraft/module/supervisor/WebHandler.java +++ b/src/main/java/io/ib67/sfcraft/module/supervisor/WebHandler.java @@ -2,7 +2,8 @@ package io.ib67.sfcraft.module.supervisor; import io.ib67.sfcraft.ServerModule; import io.javalin.Javalin; +import io.javalin.config.JavalinConfig; public abstract class WebHandler extends ServerModule { - protected abstract void register(Javalin javalin); + protected abstract void register(JavalinConfig javalin); } diff --git a/src/main/java/io/ib67/sfcraft/module/supervisor/WebModule.java b/src/main/java/io/ib67/sfcraft/module/supervisor/WebModule.java index f45e0eb..8cce57d 100644 --- a/src/main/java/io/ib67/sfcraft/module/supervisor/WebModule.java +++ b/src/main/java/io/ib67/sfcraft/module/supervisor/WebModule.java @@ -17,13 +17,14 @@ public class WebModule extends ServerModule { @Override public void onEnable() { - javalin = Javalin.create(cfg -> cfg.useVirtualThreads = false); var moduleManager = SFCraft.getInjector().getInstance(ModuleManager.class); - for (ServerModule module : moduleManager.getModules()) { - if(module instanceof WebHandler webHandler) { - webHandler.register(javalin); + javalin = Javalin.create(cfg -> { + for (ServerModule module : moduleManager.getModules()) { + if(module instanceof WebHandler webHandler) { + webHandler.register(cfg); + } } - } + }); Thread.ofVirtual().name("SFCraft API Web").start(() -> javalin.start(config.httpPort)); } diff --git a/src/main/java/io/ib67/sfcraft/module/supervisor/web/SchematicUploader.java b/src/main/java/io/ib67/sfcraft/module/supervisor/web/SchematicUploader.java index a72c64f..c82c99d 100644 --- a/src/main/java/io/ib67/sfcraft/module/supervisor/web/SchematicUploader.java +++ b/src/main/java/io/ib67/sfcraft/module/supervisor/web/SchematicUploader.java @@ -9,10 +9,9 @@ import io.ib67.sfcraft.inject.MinecraftServerSupplier; import io.ib67.sfcraft.module.SignatureService; import io.ib67.sfcraft.module.supervisor.WebHandler; import io.ib67.sfcraft.util.Helper; -import io.ib67.sfcraft.util.Permission; import io.ib67.sfcraft.util.SFConsts; import io.ib67.sfcraft.util.litematic.LitematicConverterV3; -import io.javalin.Javalin; +import io.javalin.config.JavalinConfig; import io.javalin.http.Context; import io.javalin.http.UploadedFile; import io.netty.buffer.Unpooled; @@ -75,8 +74,8 @@ public class SchematicUploader extends WebHandler { } @Override - public void register(Javalin javalin) { - javalin.options("/api/schematics/{name}", this::onUploadOptions).put("/api/schematics/{name}", this::uploadSchematic); + public void register(JavalinConfig javalin) { + javalin.routes.options("/api/schematics/{name}", this::onUploadOptions).put("/api/schematics/{name}", this::uploadSchematic); } public String generateSchematicUrl(String issuer) { diff --git a/src/main/java/io/ib67/sfcraft/util/Permission.java b/src/main/java/io/ib67/sfcraft/util/Permission.java index bc6434e..2ad2fe9 100644 --- a/src/main/java/io/ib67/sfcraft/util/Permission.java +++ b/src/main/java/io/ib67/sfcraft/util/Permission.java @@ -15,6 +15,7 @@ public record Permission(String key, boolean byDefault) { } public boolean hasPermission(T t) { + if(t == null) return false; if (check(t, SFConsts.SPECIAL_SUDO)) return true; if (byDefault) { return !check(t, "-"+key); @@ -23,6 +24,7 @@ public record Permission(String key, boolean byDefault) { } private boolean check(T t, String permission){ + if(t == null) return false; if(t instanceof Player player) { if (player.entityTags().contains(permission)){ return true; diff --git a/src/main/resources/sfcraft.mixins.json b/src/main/resources/sfcraft.mixins.json index e6c7ecc..6964728 100644 --- a/src/main/resources/sfcraft.mixins.json +++ b/src/main/resources/sfcraft.mixins.json @@ -13,7 +13,6 @@ "common.PlayerEntityMixin", "common.ZombieMixin", "common.bridge.EntityBridge", - "common.bridge.ItemBridge", "common.bridge.ServerChunkManagerBridge", "common.bridge.ServerPlayerBridge", "common.bridge.ServerWorldBridge",