From 060f0230eb3a6418c72bfb9586910b1f90287127 Mon Sep 17 00:00:00 2001 From: iceBear67 Date: Sun, 14 Jul 2024 00:03:39 +0800 Subject: [PATCH] fix: ServerLoginNetworkHandlerMixin#isLocal is acting incorrectly --- .../io/ib67/sfcraft/callback/SFCallbacks.java | 7 ++----- .../server/ServerLoginNetworkHandlerMixin.java | 15 +++++---------- .../ib67/sfcraft/module/OfflineExemptModule.java | 13 ++++++++++--- .../io/ib67/sfcraft/module/PlayLimitModule.java | 3 +-- 4 files changed, 18 insertions(+), 20 deletions(-) diff --git a/src/main/java/io/ib67/sfcraft/callback/SFCallbacks.java b/src/main/java/io/ib67/sfcraft/callback/SFCallbacks.java index cc32c40..e82989e 100644 --- a/src/main/java/io/ib67/sfcraft/callback/SFCallbacks.java +++ b/src/main/java/io/ib67/sfcraft/callback/SFCallbacks.java @@ -19,7 +19,7 @@ import static io.ib67.sfcraft.callback.Utility.*; public interface SFCallbacks { Event PRE_LOGIN = EventFactory.createArrayBacked(PlayerPreLoginCallback.class, - (listeners) -> (s, c, d) -> anyMatch(listeners, i -> i.onPlayerPreLogin(s, c, d))); + (listeners) -> (s, c, d, o) -> forEach(listeners, i -> i.onPlayerPreLogin(s, c, d, o))); Event PLAYER_SLEEP = EventFactory.createArrayBacked(PlayerSleepCallback.class, l -> (pl, pos) -> anyMatch(l, i -> i.onPlayerSleep(pl, pos), a -> a.left().isPresent()) .orElse(getEitherUnitR())); @@ -38,10 +38,7 @@ public interface SFCallbacks { } interface PlayerPreLoginCallback { - /** - * @return if let in - */ - boolean onPlayerPreLogin(String currentPlayer, ClientConnection connection, Consumer disconnect); + void onPlayerPreLogin(String currentPlayer, ClientConnection connection, Consumer disconnect, boolean offline); } interface PlayerSleepCallback { diff --git a/src/main/java/io/ib67/sfcraft/mixin/server/ServerLoginNetworkHandlerMixin.java b/src/main/java/io/ib67/sfcraft/mixin/server/ServerLoginNetworkHandlerMixin.java index cc7a302..be43f34 100644 --- a/src/main/java/io/ib67/sfcraft/mixin/server/ServerLoginNetworkHandlerMixin.java +++ b/src/main/java/io/ib67/sfcraft/mixin/server/ServerLoginNetworkHandlerMixin.java @@ -44,19 +44,14 @@ public abstract class ServerLoginNetworkHandlerMixin { } var offlineProfile = Uuids.getOfflinePlayerProfile(currentPlayer); boolean _r; - if (server.getUserCache() == null) { - // falling back to whitelist + if (server.getUserCache() != null) { + _r = server.getUserCache().getByUuid(offlineProfile.getId()).isPresent(); + }else{ var wl = server.getPlayerManager().getWhitelist(); _r = wl.isAllowed(offlineProfile); - } else { - var profile = server.getUserCache().getByUuid(offlineProfile.getId()); - _r = profile.isPresent(); } - var result = SFCallbacks.PRE_LOGIN.invoker().onPlayerPreLogin(currentPlayer, connection, this::disconnect); - if (result) { - return _r; // (is offline -> !true -> startVerify) - } - return !_r; + SFCallbacks.PRE_LOGIN.invoker().onPlayerPreLogin(currentPlayer, connection, this::disconnect, _r); + return _r; } diff --git a/src/main/java/io/ib67/sfcraft/module/OfflineExemptModule.java b/src/main/java/io/ib67/sfcraft/module/OfflineExemptModule.java index 05d4881..ca89365 100644 --- a/src/main/java/io/ib67/sfcraft/module/OfflineExemptModule.java +++ b/src/main/java/io/ib67/sfcraft/module/OfflineExemptModule.java @@ -10,6 +10,7 @@ import io.ib67.sfcraft.util.SFConsts; import io.ib67.sfcraft.ServerModule; import io.ib67.sfcraft.callback.SFCallbacks; import io.ib67.sfcraft.config.SFConfig; +import lombok.Setter; import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; import net.minecraft.command.CommandRegistryAccess; import net.minecraft.network.ClientConnection; @@ -29,6 +30,8 @@ public class OfflineExemptModule extends ServerModule { @Inject private SFConfig config; private boolean state; + @Setter + private boolean temporallyState; @Override public void onInitialize() { @@ -63,6 +66,8 @@ public class OfflineExemptModule extends ServerModule { } var profile = Uuids.getOfflinePlayerProfile(player); wl.add(new WhitelistEntry(profile)); + var uc = source.getServer().getUserCache(); + if (uc != null) uc.add(profile); source.sendMessage(Text.of("[" + profile.getName() + "/" + profile.getId() + "]" + " is added!")); return 0; } @@ -85,10 +90,12 @@ public class OfflineExemptModule extends ServerModule { @Override public void onEnable() { - state = true; + state = temporallyState || config.enableOfflineExempt; } - private boolean onPreLogin(String s, ClientConnection connection, Consumer textConsumer) { - return state; + private void onPreLogin(String s, ClientConnection connection, Consumer textConsumer, boolean offline) { + if (!state && offline) { + textConsumer.accept(Text.of("盗版赦免现已关闭")); + } } } diff --git a/src/main/java/io/ib67/sfcraft/module/PlayLimitModule.java b/src/main/java/io/ib67/sfcraft/module/PlayLimitModule.java index bad0b16..56838ae 100644 --- a/src/main/java/io/ib67/sfcraft/module/PlayLimitModule.java +++ b/src/main/java/io/ib67/sfcraft/module/PlayLimitModule.java @@ -79,7 +79,7 @@ public class PlayLimitModule extends ServerModule { } - private boolean onPreLogin(String currentPlayer, ClientConnection connection, Consumer disconnect) { + private void onPreLogin(String currentPlayer, ClientConnection connection, Consumer disconnect, boolean offline) { if (isEnabled() && connection.getAddress() instanceof InetSocketAddress address) { try { var clock = geoIPService.clockOf(address.getAddress()); @@ -91,6 +91,5 @@ public class PlayLimitModule extends ServerModule { System.err.println("Failed to locate " + address.getAddress()); } } - return true; } }