Code cleanup
This commit is contained in:
parent
4247fad3c0
commit
b297ae6cbe
|
@ -9,6 +9,7 @@ import org.samo_lego.simpleauth.utils.PlayerAuth;
|
||||||
|
|
||||||
import static net.minecraft.server.command.CommandManager.literal;
|
import static net.minecraft.server.command.CommandManager.literal;
|
||||||
import static org.samo_lego.simpleauth.SimpleAuth.config;
|
import static org.samo_lego.simpleauth.SimpleAuth.config;
|
||||||
|
import static org.samo_lego.simpleauth.SimpleAuth.mojangAccountNamesCache;
|
||||||
|
|
||||||
public class LogoutCommand {
|
public class LogoutCommand {
|
||||||
|
|
||||||
|
@ -22,8 +23,12 @@ public class LogoutCommand {
|
||||||
private static int logout(ServerCommandSource serverCommandSource) throws CommandSyntaxException {
|
private static int logout(ServerCommandSource serverCommandSource) throws CommandSyntaxException {
|
||||||
ServerPlayerEntity player = serverCommandSource.getPlayer();
|
ServerPlayerEntity player = serverCommandSource.getPlayer();
|
||||||
|
|
||||||
|
if(mojangAccountNamesCache.contains(player.getGameProfile().getName().toLowerCase())) {
|
||||||
((PlayerAuth) player).setAuthenticated(false);
|
((PlayerAuth) player).setAuthenticated(false);
|
||||||
player.sendMessage(new LiteralText(config.lang.successfulLogout), false);
|
player.sendMessage(new LiteralText(config.lang.successfulLogout), false);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
player.sendMessage(new LiteralText(config.lang.cannotLogout), false);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -63,7 +63,6 @@ public class AuthEventHandler {
|
||||||
|
|
||||||
// Player joining the server
|
// Player joining the server
|
||||||
public static void onPlayerJoin(ServerPlayerEntity player) {
|
public static void onPlayerJoin(ServerPlayerEntity player) {
|
||||||
// If player is fake auth is not needed
|
|
||||||
if (((PlayerAuth) player).canSkipAuth())
|
if (((PlayerAuth) player).canSkipAuth())
|
||||||
return;
|
return;
|
||||||
// Checking if session is still valid
|
// Checking if session is still valid
|
||||||
|
@ -76,22 +75,12 @@ public class AuthEventHandler {
|
||||||
playerCache.validUntil >= System.currentTimeMillis() &&
|
playerCache.validUntil >= System.currentTimeMillis() &&
|
||||||
player.getIp().equals(playerCache.lastIp)
|
player.getIp().equals(playerCache.lastIp)
|
||||||
) {
|
) {
|
||||||
|
// Valid session
|
||||||
((PlayerAuth) player).setAuthenticated(true);
|
((PlayerAuth) player).setAuthenticated(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
player.setInvulnerable(config.experimental.playerInvulnerable);
|
|
||||||
player.setInvisible(config.experimental.playerInvisible);
|
|
||||||
|
|
||||||
// Invalidating session
|
|
||||||
playerCache.isAuthenticated = false;
|
|
||||||
if(config.main.spawnOnJoin)
|
|
||||||
((PlayerAuth) player).hidePosition(true);
|
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
((PlayerAuth) player).setAuthenticated(false);
|
((PlayerAuth) player).setAuthenticated(false);
|
||||||
playerCache = playerCacheMap.get(uuid);
|
|
||||||
playerCache.wasOnFire = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Tries to rescue player from nether portal
|
// Tries to rescue player from nether portal
|
||||||
|
@ -116,10 +105,8 @@ public class AuthEventHandler {
|
||||||
String uuid = ((PlayerAuth) player).getFakeUuid();
|
String uuid = ((PlayerAuth) player).getFakeUuid();
|
||||||
PlayerCache playerCache = playerCacheMap.get(uuid);
|
PlayerCache playerCache = playerCacheMap.get(uuid);
|
||||||
|
|
||||||
if(((PlayerAuth) player).isAuthenticated()) {
|
if(playerCache.isAuthenticated) {
|
||||||
playerCache.lastIp = player.getIp();
|
playerCache.lastIp = player.getIp();
|
||||||
playerCache.lastAir = player.getAir();
|
|
||||||
playerCache.wasOnFire = player.isOnFire();
|
|
||||||
playerCache.wasInPortal = player.getBlockState().getBlock().equals(Blocks.NETHER_PORTAL);
|
playerCache.wasInPortal = player.getBlockState().getBlock().equals(Blocks.NETHER_PORTAL);
|
||||||
|
|
||||||
// Setting the session expire time
|
// Setting the session expire time
|
||||||
|
@ -151,13 +138,8 @@ public class AuthEventHandler {
|
||||||
public static ActionResult onPlayerMove(PlayerEntity player) {
|
public static ActionResult onPlayerMove(PlayerEntity player) {
|
||||||
// Player will fall if enabled (prevent fly kick)
|
// Player will fall if enabled (prevent fly kick)
|
||||||
boolean auth = ((PlayerAuth) player).isAuthenticated();
|
boolean auth = ((PlayerAuth) player).isAuthenticated();
|
||||||
if(!auth && config.main.allowFalling && !player.isOnGround() && !player.isInsideWaterOrBubbleColumn()) {
|
|
||||||
if(player.isInvulnerable())
|
|
||||||
player.setInvulnerable(false);
|
|
||||||
return ActionResult.PASS;
|
|
||||||
}
|
|
||||||
// Otherwise movement should be disabled
|
// Otherwise movement should be disabled
|
||||||
else if(!auth && !config.experimental.allowMovement) {
|
if(!auth && !config.experimental.allowMovement) {
|
||||||
if(!player.isInvulnerable())
|
if(!player.isInvulnerable())
|
||||||
player.setInvulnerable(true);
|
player.setInvulnerable(true);
|
||||||
return ActionResult.FAIL;
|
return ActionResult.FAIL;
|
||||||
|
|
|
@ -1,231 +1,17 @@
|
||||||
package org.samo_lego.simpleauth.mixin;
|
package org.samo_lego.simpleauth.mixin;
|
||||||
|
|
||||||
import com.mojang.authlib.GameProfile;
|
|
||||||
import net.fabricmc.loader.api.FabricLoader;
|
|
||||||
import net.minecraft.entity.player.PlayerEntity;
|
import net.minecraft.entity.player.PlayerEntity;
|
||||||
import net.minecraft.network.packet.s2c.play.ScreenHandlerSlotUpdateS2CPacket;
|
|
||||||
import net.minecraft.server.MinecraftServer;
|
|
||||||
import net.minecraft.server.network.ServerPlayerEntity;
|
import net.minecraft.server.network.ServerPlayerEntity;
|
||||||
import net.minecraft.text.LiteralText;
|
|
||||||
import net.minecraft.text.Text;
|
|
||||||
import net.minecraft.util.ActionResult;
|
import net.minecraft.util.ActionResult;
|
||||||
import net.minecraft.util.Identifier;
|
|
||||||
import net.minecraft.util.math.BlockPos;
|
|
||||||
import net.minecraft.util.registry.Registry;
|
|
||||||
import net.minecraft.util.registry.RegistryKey;
|
|
||||||
import net.minecraft.world.World;
|
|
||||||
import org.samo_lego.simpleauth.SimpleAuth;
|
|
||||||
import org.samo_lego.simpleauth.event.item.DropItemCallback;
|
import org.samo_lego.simpleauth.event.item.DropItemCallback;
|
||||||
import org.samo_lego.simpleauth.storage.PlayerCache;
|
|
||||||
import org.samo_lego.simpleauth.utils.PlayerAuth;
|
|
||||||
import org.spongepowered.asm.mixin.Final;
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
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.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||||
|
|
||||||
import static org.samo_lego.simpleauth.SimpleAuth.config;
|
|
||||||
import static org.samo_lego.simpleauth.SimpleAuth.playerCacheMap;
|
|
||||||
import static org.samo_lego.simpleauth.utils.CarpetHelper.isPlayerCarpetFake;
|
|
||||||
import static org.samo_lego.simpleauth.utils.SimpleLogger.logInfo;
|
|
||||||
|
|
||||||
@Mixin(PlayerEntity.class)
|
@Mixin(PlayerEntity.class)
|
||||||
public abstract class MixinPlayerEntity implements PlayerAuth {
|
public class MixinPlayerEntity {
|
||||||
|
|
||||||
@Shadow @Final private GameProfile gameProfile;
|
|
||||||
private final ServerPlayerEntity player = (ServerPlayerEntity) (Object) this;
|
|
||||||
|
|
||||||
// * 20 for 20 ticks in second
|
|
||||||
private int kickTimer = config.main.kickTime * 20;
|
|
||||||
|
|
||||||
private final boolean isRunningCarpet = FabricLoader.getInstance().isModLoaded("carpet");
|
|
||||||
|
|
||||||
private final MinecraftServer server = player.getServer();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Teleports player to spawn or last location that is recorded.
|
|
||||||
* Last location means the location before de-authentication.
|
|
||||||
*
|
|
||||||
* @param hide whether to teleport player to spawn (provided in config) or last recorded position
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void hidePosition(boolean hide) {
|
|
||||||
assert server != null;
|
|
||||||
|
|
||||||
PlayerCache cache = playerCacheMap.get(this.getFakeUuid());
|
|
||||||
if(config.main.spawnOnJoin)
|
|
||||||
logInfo("Teleporting " + player.getName().asString() + (hide ? " to spawn." : " to original position."));
|
|
||||||
if (hide) {
|
|
||||||
// Saving position
|
|
||||||
cache.lastLocation.dimension = player.getServerWorld();
|
|
||||||
cache.lastLocation.position = player.getPos();
|
|
||||||
cache.lastLocation.yaw = player.yaw;
|
|
||||||
cache.lastLocation.pitch = player.pitch;
|
|
||||||
|
|
||||||
// Teleports player to spawn
|
|
||||||
player.teleport(
|
|
||||||
server.getWorld(RegistryKey.of(Registry.DIMENSION, new Identifier(config.worldSpawn.dimension))),
|
|
||||||
config.worldSpawn.x,
|
|
||||||
config.worldSpawn.y,
|
|
||||||
config.worldSpawn.z,
|
|
||||||
config.worldSpawn.yaw,
|
|
||||||
config.worldSpawn.pitch
|
|
||||||
);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Puts player to last cached position
|
|
||||||
player.teleport(
|
|
||||||
cache.lastLocation.dimension,
|
|
||||||
cache.lastLocation.position.getX(),
|
|
||||||
cache.lastLocation.position.getY(),
|
|
||||||
cache.lastLocation.position.getZ(),
|
|
||||||
cache.lastLocation.yaw,
|
|
||||||
cache.lastLocation.pitch
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Converts player uuid, to ensure player with "nAmE" and "NamE" get same uuid.
|
|
||||||
* Both players are not allowed to play, since mod mimics Mojang behaviour.
|
|
||||||
* of not allowing accounts with same names but different capitalization.
|
|
||||||
*
|
|
||||||
* @return converted UUID as string
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String getFakeUuid() {
|
|
||||||
// If server is in online mode online-mode UUIDs should be used
|
|
||||||
assert server != null;
|
|
||||||
if(server.isOnlineMode() && this.isUsingMojangAccount())
|
|
||||||
return player.getUuidAsString();
|
|
||||||
/*
|
|
||||||
Lower case is used for Player and PlAyEr to get same UUID (for password storing)
|
|
||||||
Mimicking Mojang behaviour, where players cannot set their name to
|
|
||||||
ExAmple if Example is already taken.
|
|
||||||
*/
|
|
||||||
// Getting player+s name via GameProfile, in order to be compatible with Drogtor mod
|
|
||||||
String playername = player.getGameProfile().getName().toLowerCase();
|
|
||||||
return PlayerEntity.getOfflinePlayerUuid(playername).toString();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the authentication status of the player.
|
|
||||||
*
|
|
||||||
* @param authenticated whether player should be authenticated
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void setAuthenticated(boolean authenticated) {
|
|
||||||
PlayerCache playerCache;
|
|
||||||
|
|
||||||
if(!playerCacheMap.containsKey(this.getFakeUuid())) {
|
|
||||||
// First join
|
|
||||||
playerCache = new PlayerCache(this.getFakeUuid(), player);
|
|
||||||
playerCacheMap.put(this.getFakeUuid(), playerCache);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
playerCache = playerCacheMap.get(this.getFakeUuid());
|
|
||||||
if(this.isAuthenticated() == authenticated)
|
|
||||||
return;
|
|
||||||
playerCache.isAuthenticated = authenticated;
|
|
||||||
}
|
|
||||||
|
|
||||||
player.setInvulnerable(!authenticated && config.experimental.playerInvulnerable);
|
|
||||||
player.setInvisible(!authenticated && config.experimental.playerInvisible);
|
|
||||||
|
|
||||||
// Teleporting player (hiding / restoring position)
|
|
||||||
if(config.main.spawnOnJoin)
|
|
||||||
this.hidePosition(!authenticated);
|
|
||||||
|
|
||||||
if(authenticated) {
|
|
||||||
kickTimer = config.main.kickTime * 20;
|
|
||||||
// Updating blocks if needed (if portal rescue action happened)
|
|
||||||
if(playerCache.wasInPortal) {
|
|
||||||
World world = player.getEntityWorld();
|
|
||||||
BlockPos pos = player.getBlockPos();
|
|
||||||
|
|
||||||
// Sending updates to portal blocks
|
|
||||||
// This is technically not needed, but it cleans the "messed portal" on the client
|
|
||||||
world.updateListeners(pos, world.getBlockState(pos), world.getBlockState(pos), 3);
|
|
||||||
world.updateListeners(pos.up(), world.getBlockState(pos.up()), world.getBlockState(pos.up()), 3);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Setting last air to player
|
|
||||||
if(player.isSubmergedInWater())
|
|
||||||
player.setAir(playerCache.lastAir);
|
|
||||||
|
|
||||||
// In case player is in lava during authentication proccess
|
|
||||||
if(!playerCache.wasOnFire)
|
|
||||||
player.setFireTicks(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the text which tells the player
|
|
||||||
* to login or register, depending on account status.
|
|
||||||
*
|
|
||||||
* @return LiteralText with appropriate string (login or register)
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public Text getAuthMessage() {
|
|
||||||
final PlayerCache cache = playerCacheMap.get(((PlayerAuth) player).getFakeUuid());
|
|
||||||
if(SimpleAuth.config.main.enableGlobalPassword || cache.isRegistered)
|
|
||||||
return new LiteralText(
|
|
||||||
SimpleAuth.config.lang.notAuthenticated + "\n" + SimpleAuth.config.lang.loginRequired
|
|
||||||
);
|
|
||||||
return new LiteralText(
|
|
||||||
SimpleAuth.config.lang.notAuthenticated+ "\n" + SimpleAuth.config.lang.registerRequired
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks whether player can skip authentication process.
|
|
||||||
*
|
|
||||||
* @return true if can skip authentication process, otherwise false
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public boolean canSkipAuth() {
|
|
||||||
// We ask CarpetHelper class since it has the imports needed
|
|
||||||
return (this.isRunningCarpet && isPlayerCarpetFake(this.player)) || (isUsingMojangAccount() && config.experimental.premiumAutologin);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Whether the player is using the mojang account.
|
|
||||||
* @return true if paid, otherwise false
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public boolean isUsingMojangAccount() {
|
|
||||||
return !gameProfile.getId().equals(PlayerEntity.getOfflinePlayerUuid(gameProfile.getName()));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks whether player is authenticated.
|
|
||||||
*
|
|
||||||
* @return false if player is not authenticated, otherwise true.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public boolean isAuthenticated() {
|
|
||||||
String uuid = ((PlayerAuth) player).getFakeUuid();
|
|
||||||
return this.canSkipAuth() || (playerCacheMap.containsKey(uuid) && playerCacheMap.get(uuid).isAuthenticated);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Inject(method = "tick()V", at = @At("HEAD"), cancellable = true)
|
|
||||||
private void tick(CallbackInfo ci) {
|
|
||||||
if(!this.isAuthenticated()) {
|
|
||||||
// Checking player timer
|
|
||||||
if(kickTimer <= 0 && player.networkHandler.getConnection().isOpen()) {
|
|
||||||
player.networkHandler.disconnect(new LiteralText(config.lang.timeExpired));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// Sending authentication prompt every 10 seconds
|
|
||||||
if(kickTimer % 200 == 0)
|
|
||||||
player.sendMessage(this.getAuthMessage(), false);
|
|
||||||
kickTimer--;
|
|
||||||
}
|
|
||||||
ci.cancel();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Player item dropping
|
// Player item dropping
|
||||||
@Inject(method = "dropSelectedItem(Z)Z", at = @At("HEAD"), cancellable = true)
|
@Inject(method = "dropSelectedItem(Z)Z", at = @At("HEAD"), cancellable = true)
|
||||||
|
@ -234,14 +20,6 @@ public abstract class MixinPlayerEntity implements PlayerAuth {
|
||||||
ActionResult result = DropItemCallback.EVENT.invoker().onDropItem(player);
|
ActionResult result = DropItemCallback.EVENT.invoker().onDropItem(player);
|
||||||
|
|
||||||
if (result == ActionResult.FAIL) {
|
if (result == ActionResult.FAIL) {
|
||||||
// Canceling the item drop, as well as giving the items back to player (and updating inv with packet)
|
|
||||||
player.networkHandler.sendPacket(
|
|
||||||
new ScreenHandlerSlotUpdateS2CPacket(
|
|
||||||
-2,
|
|
||||||
player.inventory.selectedSlot,
|
|
||||||
player.inventory.getStack(player.inventory.selectedSlot))
|
|
||||||
);
|
|
||||||
player.networkHandler.sendPacket(new ScreenHandlerSlotUpdateS2CPacket(-1, -1, player.inventory.getCursorStack()));
|
|
||||||
cir.setReturnValue(false);
|
cir.setReturnValue(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,216 @@
|
||||||
|
package org.samo_lego.simpleauth.mixin;
|
||||||
|
|
||||||
|
import net.fabricmc.loader.api.FabricLoader;
|
||||||
|
import net.minecraft.entity.player.PlayerEntity;
|
||||||
|
import net.minecraft.server.MinecraftServer;
|
||||||
|
import net.minecraft.server.network.ServerPlayerEntity;
|
||||||
|
import net.minecraft.text.LiteralText;
|
||||||
|
import net.minecraft.text.Text;
|
||||||
|
import net.minecraft.util.Identifier;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.util.registry.Registry;
|
||||||
|
import net.minecraft.util.registry.RegistryKey;
|
||||||
|
import net.minecraft.world.World;
|
||||||
|
import org.samo_lego.simpleauth.SimpleAuth;
|
||||||
|
import org.samo_lego.simpleauth.storage.PlayerCache;
|
||||||
|
import org.samo_lego.simpleauth.utils.PlayerAuth;
|
||||||
|
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.*;
|
||||||
|
import static org.samo_lego.simpleauth.utils.CarpetHelper.isPlayerCarpetFake;
|
||||||
|
import static org.samo_lego.simpleauth.utils.SimpleLogger.logInfo;
|
||||||
|
|
||||||
|
@Mixin(ServerPlayerEntity.class)
|
||||||
|
public class MixinServerPlayerEntity implements PlayerAuth {
|
||||||
|
|
||||||
|
private final ServerPlayerEntity player = (ServerPlayerEntity) (Object) this;
|
||||||
|
|
||||||
|
// * 20 for 20 ticks in second
|
||||||
|
private int kickTimer = config.main.kickTime * 20;
|
||||||
|
|
||||||
|
private final boolean isRunningCarpet = FabricLoader.getInstance().isModLoaded("carpet");
|
||||||
|
|
||||||
|
@Final
|
||||||
|
@Shadow
|
||||||
|
public MinecraftServer server;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Teleports player to spawn or last location that is recorded.
|
||||||
|
* Last location means the location before de-authentication.
|
||||||
|
*
|
||||||
|
* @param hide whether to teleport player to spawn (provided in config) or last recorded position
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void hidePosition(boolean hide) {
|
||||||
|
assert server != null;
|
||||||
|
|
||||||
|
PlayerCache cache = playerCacheMap.get(this.getFakeUuid());
|
||||||
|
if(config.main.spawnOnJoin)
|
||||||
|
logInfo("Teleporting " + player.getName().asString() + (hide ? " to spawn." : " to original position."));
|
||||||
|
if (hide) {
|
||||||
|
// Saving position
|
||||||
|
cache.lastLocation.dimension = player.getServerWorld();
|
||||||
|
cache.lastLocation.position = player.getPos();
|
||||||
|
cache.lastLocation.yaw = player.yaw;
|
||||||
|
cache.lastLocation.pitch = player.pitch;
|
||||||
|
|
||||||
|
// Teleports player to spawn
|
||||||
|
player.teleport(
|
||||||
|
server.getWorld(RegistryKey.of(Registry.DIMENSION, new Identifier(config.worldSpawn.dimension))),
|
||||||
|
config.worldSpawn.x,
|
||||||
|
config.worldSpawn.y,
|
||||||
|
config.worldSpawn.z,
|
||||||
|
config.worldSpawn.yaw,
|
||||||
|
config.worldSpawn.pitch
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Puts player to last cached position
|
||||||
|
player.teleport(
|
||||||
|
cache.lastLocation.dimension,
|
||||||
|
cache.lastLocation.position.getX(),
|
||||||
|
cache.lastLocation.position.getY(),
|
||||||
|
cache.lastLocation.position.getZ(),
|
||||||
|
cache.lastLocation.yaw,
|
||||||
|
cache.lastLocation.pitch
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts player uuid, to ensure player with "nAmE" and "NamE" get same uuid.
|
||||||
|
* Both players are not allowed to play, since mod mimics Mojang behaviour.
|
||||||
|
* of not allowing accounts with same names but different capitalization.
|
||||||
|
*
|
||||||
|
* @return converted UUID as string
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String getFakeUuid() {
|
||||||
|
// If server is in online mode online-mode UUIDs should be used
|
||||||
|
assert server != null;
|
||||||
|
if(server.isOnlineMode() && this.isUsingMojangAccount())
|
||||||
|
return player.getUuidAsString();
|
||||||
|
/*
|
||||||
|
Lower case is used for Player and PlAyEr to get same UUID (for password storing)
|
||||||
|
Mimicking Mojang behaviour, where players cannot set their name to
|
||||||
|
ExAmple if Example is already taken.
|
||||||
|
*/
|
||||||
|
// Getting player+s name via GameProfile, in order to be compatible with Drogtor mod
|
||||||
|
String playername = player.getGameProfile().getName().toLowerCase();
|
||||||
|
return PlayerEntity.getOfflinePlayerUuid(playername).toString();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the authentication status of the player.
|
||||||
|
*
|
||||||
|
* @param authenticated whether player should be authenticated
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void setAuthenticated(boolean authenticated) {
|
||||||
|
PlayerCache playerCache;
|
||||||
|
|
||||||
|
if(!playerCacheMap.containsKey(this.getFakeUuid())) {
|
||||||
|
// First join
|
||||||
|
playerCache = new PlayerCache(this.getFakeUuid(), player);
|
||||||
|
playerCacheMap.put(this.getFakeUuid(), playerCache);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
playerCache = playerCacheMap.get(this.getFakeUuid());
|
||||||
|
if(this.isAuthenticated() == authenticated)
|
||||||
|
return;
|
||||||
|
playerCache.isAuthenticated = authenticated;
|
||||||
|
}
|
||||||
|
|
||||||
|
player.setInvulnerable(!authenticated && config.experimental.playerInvulnerable);
|
||||||
|
player.setInvisible(!authenticated && config.experimental.playerInvisible);
|
||||||
|
|
||||||
|
// Teleporting player (hiding / restoring position)
|
||||||
|
if(config.main.spawnOnJoin)
|
||||||
|
this.hidePosition(!authenticated);
|
||||||
|
|
||||||
|
if(authenticated) {
|
||||||
|
kickTimer = config.main.kickTime * 20;
|
||||||
|
// Updating blocks if needed (if portal rescue action happened)
|
||||||
|
if(playerCache.wasInPortal) {
|
||||||
|
World world = player.getEntityWorld();
|
||||||
|
BlockPos pos = player.getBlockPos();
|
||||||
|
|
||||||
|
// Sending updates to portal blocks
|
||||||
|
// This is technically not needed, but it cleans the "messed portal" on the client
|
||||||
|
world.updateListeners(pos, world.getBlockState(pos), world.getBlockState(pos), 3);
|
||||||
|
world.updateListeners(pos.up(), world.getBlockState(pos.up()), world.getBlockState(pos.up()), 3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the text which tells the player
|
||||||
|
* to login or register, depending on account status.
|
||||||
|
*
|
||||||
|
* @return LiteralText with appropriate string (login or register)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Text getAuthMessage() {
|
||||||
|
final PlayerCache cache = playerCacheMap.get(((PlayerAuth) player).getFakeUuid());
|
||||||
|
if(SimpleAuth.config.main.enableGlobalPassword || cache.isRegistered)
|
||||||
|
return new LiteralText(
|
||||||
|
SimpleAuth.config.lang.notAuthenticated + "\n" + SimpleAuth.config.lang.loginRequired
|
||||||
|
);
|
||||||
|
return new LiteralText(
|
||||||
|
SimpleAuth.config.lang.notAuthenticated+ "\n" + SimpleAuth.config.lang.registerRequired
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks whether player can skip authentication process.
|
||||||
|
*
|
||||||
|
* @return true if can skip authentication process, otherwise false
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean canSkipAuth() {
|
||||||
|
// We ask CarpetHelper class since it has the imports needed
|
||||||
|
return (this.isRunningCarpet && isPlayerCarpetFake(this.player)) || (isUsingMojangAccount() && config.experimental.premiumAutologin);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether the player is using the mojang account.
|
||||||
|
* @return true if paid, otherwise false
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean isUsingMojangAccount() {
|
||||||
|
return mojangAccountNamesCache.contains(player.getGameProfile().getName().toLowerCase());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks whether player is authenticated.
|
||||||
|
*
|
||||||
|
* @return false if player is not authenticated, otherwise true.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean isAuthenticated() {
|
||||||
|
String uuid = ((PlayerAuth) player).getFakeUuid();
|
||||||
|
return this.canSkipAuth() || (playerCacheMap.containsKey(uuid) && playerCacheMap.get(uuid).isAuthenticated);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Inject(method = "playerTick()V", at = @At("HEAD"), cancellable = true)
|
||||||
|
private void playerTick(CallbackInfo ci) {
|
||||||
|
if(!this.isAuthenticated()) {
|
||||||
|
// Checking player timer
|
||||||
|
if(kickTimer <= 0 && player.networkHandler.getConnection().isOpen()) {
|
||||||
|
player.networkHandler.disconnect(new LiteralText(config.lang.timeExpired));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Sending authentication prompt every 10 seconds
|
||||||
|
if(kickTimer % 200 == 0)
|
||||||
|
player.sendMessage(this.getAuthMessage(), false);
|
||||||
|
--kickTimer;
|
||||||
|
}
|
||||||
|
ci.cancel();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -81,11 +81,6 @@ public class AuthConfig {
|
||||||
*/
|
*/
|
||||||
public int sessionTimeoutTime = 60;
|
public int sessionTimeoutTime = 60;
|
||||||
|
|
||||||
/**
|
|
||||||
* Should deauthenticated players fall if the login mid-air?
|
|
||||||
*/
|
|
||||||
public boolean allowFalling = false;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Whether to tp player to spawn when joining (to hide original player coordinates)
|
* Whether to tp player to spawn when joining (to hide original player coordinates)
|
||||||
*/
|
*/
|
||||||
|
@ -125,7 +120,7 @@ public class AuthConfig {
|
||||||
public String timeExpired = "§cTime for authentication has expired.";
|
public String timeExpired = "§cTime for authentication has expired.";
|
||||||
public String registerRequired = "§6Type /register <password> <password> to claim this account.";
|
public String registerRequired = "§6Type /register <password> <password> to claim this account.";
|
||||||
public String alreadyRegistered = "§6This account name is already registered!";
|
public String alreadyRegistered = "§6This account name is already registered!";
|
||||||
public String registerSuccess = "§aYou are now authenticated.";
|
public String registerSuccess = "§aAccount was created.";
|
||||||
public String userdataDeleted = "§aUserdata deleted.";
|
public String userdataDeleted = "§aUserdata deleted.";
|
||||||
public String userdataUpdated = "§aUserdata updated.";
|
public String userdataUpdated = "§aUserdata updated.";
|
||||||
public String accountDeleted = "§aYour account was successfully deleted!";
|
public String accountDeleted = "§aYour account was successfully deleted!";
|
||||||
|
@ -137,6 +132,7 @@ public class AuthConfig {
|
||||||
public String worldSpawnSet = "§aSpawn for logging in was set successfully.";
|
public String worldSpawnSet = "§aSpawn for logging in was set successfully.";
|
||||||
public String corruptedPlayerData = "§cYour data is probably corrupted. Please contact admin.";
|
public String corruptedPlayerData = "§cYour data is probably corrupted. Please contact admin.";
|
||||||
public String userNotRegistered = "§cThis player is not registered!";
|
public String userNotRegistered = "§cThis player is not registered!";
|
||||||
|
public String cannotLogout = "§cYou cannot logout!";
|
||||||
}
|
}
|
||||||
public static class ExperimentalConfig {
|
public static class ExperimentalConfig {
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,16 +1,14 @@
|
||||||
package org.samo_lego.simpleauth.storage;
|
package org.samo_lego.simpleauth.storage;
|
||||||
|
|
||||||
import com.google.gson.*;
|
import com.google.gson.Gson;
|
||||||
|
import com.google.gson.JsonElement;
|
||||||
|
import com.google.gson.JsonNull;
|
||||||
|
import com.google.gson.JsonObject;
|
||||||
import net.minecraft.block.Blocks;
|
import net.minecraft.block.Blocks;
|
||||||
import net.minecraft.server.network.ServerPlayerEntity;
|
import net.minecraft.server.network.ServerPlayerEntity;
|
||||||
import net.minecraft.server.world.ServerWorld;
|
import net.minecraft.server.world.ServerWorld;
|
||||||
import net.minecraft.text.LiteralText;
|
import net.minecraft.text.LiteralText;
|
||||||
import net.minecraft.util.Identifier;
|
|
||||||
import net.minecraft.util.math.Vec3d;
|
import net.minecraft.util.math.Vec3d;
|
||||||
import net.minecraft.util.registry.Registry;
|
|
||||||
import net.minecraft.util.registry.RegistryKey;
|
|
||||||
|
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
import static org.samo_lego.simpleauth.SimpleAuth.DB;
|
import static org.samo_lego.simpleauth.SimpleAuth.DB;
|
||||||
import static org.samo_lego.simpleauth.SimpleAuth.config;
|
import static org.samo_lego.simpleauth.SimpleAuth.config;
|
||||||
|
@ -50,8 +48,6 @@ public class PlayerCache {
|
||||||
/**
|
/**
|
||||||
* Player stats before de-authentication.
|
* Player stats before de-authentication.
|
||||||
*/
|
*/
|
||||||
public int lastAir;
|
|
||||||
public boolean wasOnFire;
|
|
||||||
public boolean wasInPortal;
|
public boolean wasInPortal;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -78,9 +74,6 @@ public class PlayerCache {
|
||||||
logInfo("Creating cache for " + player.getName().asString());
|
logInfo("Creating cache for " + player.getName().asString());
|
||||||
this.lastIp = player.getIp();
|
this.lastIp = player.getIp();
|
||||||
|
|
||||||
this.lastAir = player.getAir();
|
|
||||||
this.wasOnFire = player.isOnFire();
|
|
||||||
|
|
||||||
// Setting position cache
|
// Setting position cache
|
||||||
this.lastLocation.dimension = player.getServerWorld();
|
this.lastLocation.dimension = player.getServerWorld();
|
||||||
this.lastLocation.position = player.getPos();
|
this.lastLocation.position = player.getPos();
|
||||||
|
@ -90,9 +83,7 @@ public class PlayerCache {
|
||||||
this.wasInPortal = player.getBlockState().getBlock().equals(Blocks.NETHER_PORTAL);
|
this.wasInPortal = player.getBlockState().getBlock().equals(Blocks.NETHER_PORTAL);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
this.wasOnFire = false;
|
|
||||||
this.wasInPortal = false;
|
this.wasInPortal = false;
|
||||||
this.lastAir = 300;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
String data = DB.getData(uuid);
|
String data = DB.getData(uuid);
|
||||||
|
@ -114,32 +105,6 @@ public class PlayerCache {
|
||||||
this.password = passwordElement.getAsString();
|
this.password = passwordElement.getAsString();
|
||||||
this.isRegistered = !this.password.isEmpty();
|
this.isRegistered = !this.password.isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// DEPRECATED, UGLY
|
|
||||||
if(config.main.spawnOnJoin) {
|
|
||||||
try {
|
|
||||||
JsonElement lastLoc = json.get("lastLocation");
|
|
||||||
if (lastLoc != null) {
|
|
||||||
// Getting DB coords
|
|
||||||
JsonObject lastLocation = gson.fromJson(lastLoc.getAsString(), JsonObject.class);
|
|
||||||
assert player != null;
|
|
||||||
this.lastLocation.dimension = Objects.requireNonNull(player.getServer()).getWorld(RegistryKey.of(Registry.DIMENSION, new Identifier(
|
|
||||||
lastLocation.get("dim").isJsonNull() ? config.worldSpawn.dimension : lastLocation.get("dim").getAsString())));
|
|
||||||
|
|
||||||
this.lastLocation.position = new Vec3d(
|
|
||||||
lastLocation.get("x").isJsonNull() ? config.worldSpawn.x : lastLocation.get("x").getAsDouble(),
|
|
||||||
lastLocation.get("y").isJsonNull() ? config.worldSpawn.y : lastLocation.get("y").getAsDouble(),
|
|
||||||
lastLocation.get("z").isJsonNull() ? config.worldSpawn.z : lastLocation.get("z").getAsDouble()
|
|
||||||
);
|
|
||||||
this.lastLocation.yaw = lastLocation.get("yaw") == null ? 90 : lastLocation.get("yaw").getAsFloat();
|
|
||||||
this.lastLocation.pitch = lastLocation.get("pitch") == null ? 0 : lastLocation.get("pitch").getAsFloat();
|
|
||||||
|
|
||||||
}
|
|
||||||
} catch (JsonSyntaxException ignored) {
|
|
||||||
// Player didn't have any coords in db to tp to
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
this.isRegistered = false;
|
this.isRegistered = false;
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
"MixinPlayerEntity",
|
"MixinPlayerEntity",
|
||||||
"MixinPlayerManager",
|
"MixinPlayerManager",
|
||||||
"MixinServerLoginNetworkHandler",
|
"MixinServerLoginNetworkHandler",
|
||||||
|
"MixinServerPlayerEntity",
|
||||||
"MixinServerPlayNetworkHandler",
|
"MixinServerPlayNetworkHandler",
|
||||||
"MixinSlot",
|
"MixinSlot",
|
||||||
"MixinWorldSaveHandler"
|
"MixinWorldSaveHandler"
|
||||||
|
|
Loading…
Reference in New Issue