diff --git a/gradle.properties b/gradle.properties index dce7fd3..8bb6f61 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,12 +2,12 @@ org.gradle.jvmargs=-Xmx1G # Fabric properties -minecraft_version=20w15a -yarn_mappings=20w15a+build.1 +minecraft_version=20w16a +yarn_mappings=20w16a+build.1 loader_version=0.8.2+build.194 #Fabric api -fabric_version=0.5.9+build.319-1.16 +fabric_version=0.5.10+build.320-1.16 # Mod Properties mod_version = 1.3.3 diff --git a/src/main/java/org/samo_lego/simpleauth/SimpleAuth.java b/src/main/java/org/samo_lego/simpleauth/SimpleAuth.java index 32f057b..7d1e2ce 100644 --- a/src/main/java/org/samo_lego/simpleauth/SimpleAuth.java +++ b/src/main/java/org/samo_lego/simpleauth/SimpleAuth.java @@ -110,7 +110,7 @@ public class SimpleAuth implements DedicatedServerModInitializer { // Player no longer needs to be invisible and invulnerable player.setInvulnerable(false); player.setInvisible(false); - player.sendMessage(msg); + player.sendMessage(msg, false); } // De-authenticates player @@ -120,10 +120,10 @@ public class SimpleAuth implements DedicatedServerModInitializer { SimpleAuth.deauthenticatedUsers.put(uuid, new PlayerCache(uuid, player.getIp())); // Player is now not authenticated - player.sendMessage(notAuthenticated()); + player.sendMessage(notAuthenticated(), false); // Setting the player to be invisible to mobs and also invulnerable - player.setInvulnerable(SimpleAuth.config.main.playerInvulnerable); - player.setInvisible(SimpleAuth.config.main.playerInvisible); + player.setInvulnerable(SimpleAuth.config.experimental.playerInvulnerable); + player.setInvisible(SimpleAuth.config.experimental.playerInvisible); Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override diff --git a/src/main/java/org/samo_lego/simpleauth/mixin/MixinServerLoginNetworkHandler.java b/src/main/java/org/samo_lego/simpleauth/mixin/MixinServerLoginNetworkHandler.java new file mode 100644 index 0000000..a56ecd3 --- /dev/null +++ b/src/main/java/org/samo_lego/simpleauth/mixin/MixinServerLoginNetworkHandler.java @@ -0,0 +1,43 @@ +package org.samo_lego.simpleauth.mixin; + +import com.mojang.authlib.GameProfile; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.network.ServerLoginNetworkHandler; +import net.minecraft.text.LiteralText; +import org.spongepowered.asm.mixin.Final; +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; + +import static org.samo_lego.simpleauth.SimpleAuth.config; + + +@Mixin(ServerLoginNetworkHandler.class) +public abstract class MixinServerLoginNetworkHandler { + + @Shadow @Final + private MinecraftServer server; + + @Shadow + private GameProfile profile; + + @Inject(method = "acceptPlayer()V", at = @At("HEAD"), cancellable = true) + private void acceptPlayer(CallbackInfo ci) { + // Player pre-join event, we don't do standard callback, since + // there are lots of variables that would need to be passed over + PlayerEntity onlinePlayer = this.server.getPlayerManager().getPlayer(this.profile.getName()); + + // Getting network handler + ServerLoginNetworkHandler handler = (ServerLoginNetworkHandler) (Object) this; + + if (config.experimental.disableAnotherLocationKick && onlinePlayer != null) { + // Player needs to be kicked, since there's already a player with that name + // playing on the server + handler.disconnect(new LiteralText(String.format(config.lang.playerAlreadyOnline, onlinePlayer.getName().asString()))); + ci.cancel(); + } + } +} diff --git a/src/main/java/org/samo_lego/simpleauth/storage/AuthConfig.java b/src/main/java/org/samo_lego/simpleauth/storage/AuthConfig.java index 2b886dd..784c676 100644 --- a/src/main/java/org/samo_lego/simpleauth/storage/AuthConfig.java +++ b/src/main/java/org/samo_lego/simpleauth/storage/AuthConfig.java @@ -30,28 +30,8 @@ import java.io.IOException; public class AuthConfig { // If player is not authenticated, following conditions apply public static class MainConfig { - // Allows chat (but not commands, except for /login and /register) - public boolean allowChat = false; - // Allows player movement - public boolean allowMovement = false; - // Allows block "use" - right clicking (e.g. opening a chest) - public boolean allowBlockUse = false; - // Allows mining || punching blocks - public boolean allowBlockPunch = false; - // Allows dropping items from inventory - public boolean allowItemDrop = false; - // Allows moving item through inventory - public boolean allowItemMoving = false; - // Allows item "use" - right click function (e.g. using a bow) - public boolean allowItemUse = false; - // Allows attacking mobs - public boolean allowEntityPunch = false; - // Allows "right-clicking" on an entity (e.g. trading with villagers) + // Allows "right-clicking" on an entity (e.g. clicking on villagers) public boolean allowEntityInteract = false; - // If player should be invulnerable before authentication - public boolean playerInvulnerable = true; - // If player should be invisible to mobs before authentication - public boolean playerInvisible = true; // Maximum login tries before kicking the player from server // Set to -1 to allow unlimited, not recommended however public int maxLoginTries = 1; @@ -102,6 +82,31 @@ public class AuthConfig { public String maxPasswordChars = "§6Password can be at most %d characters long!"; public String minPasswordChars = "§6Password needs to be at least %d characters long!"; public String disallowedUsername = "§6Invalid username characters! Allowed character regex: %s"; + public String playerAlreadyOnline = "§cPlayer %s is already online!"; + } + public static class ExperimentalConfig { + // Prevents player being kicked because another player with the same name has joined the server + public boolean disableAnotherLocationKick = true; + // If player should be invulnerable before authentication + public boolean playerInvulnerable = true; + // If player should be invisible to mobs before authentication + public boolean playerInvisible = true; + // Allows chat (but not commands, except for /login and /register) + public boolean allowChat = false; + // Allows player movement + public boolean allowMovement = false; + // Allows block "use" - right clicking (e.g. opening a chest) + public boolean allowBlockUse = false; + // Allows mining || punching blocks + public boolean allowBlockPunch = false; + // Allows dropping items from inventory + public boolean allowItemDrop = false; + // Allows moving item through inventory + public boolean allowItemMoving = false; + // Allows item "use" - right click function (e.g. using a bow) + public boolean allowItemUse = false; + // Allows attacking mobs + public boolean allowEntityPunch = false; } private static final Logger LOGGER = LogManager.getLogger(); private static final Gson gson = new GsonBuilder() @@ -110,6 +115,7 @@ public class AuthConfig { public MainConfig main = new MainConfig(); public LangConfig lang = new LangConfig(); + public ExperimentalConfig experimental = new ExperimentalConfig(); public static AuthConfig load(File file) { AuthConfig config; diff --git a/src/main/resources/mixins.simpleauth.json b/src/main/resources/mixins.simpleauth.json index db96661..8c5a629 100644 --- a/src/main/resources/mixins.simpleauth.json +++ b/src/main/resources/mixins.simpleauth.json @@ -5,9 +5,10 @@ "mixins": [ ], "server": [ - "MixinServerPlayNetworkHandler", - "MixinPlayerManager", "MixinPlayerEntity", + "MixinPlayerManager", + "MixinServerLoginNetworkHandler", + "MixinServerPlayNetworkHandler", "MixinSlot" ], "injectors": {