bind tracker to server instead of static instance

This commit is contained in:
Flemmli97 2021-08-13 11:40:24 +02:00
parent 9058aa58fe
commit 53983ae5c7
13 changed files with 62 additions and 34 deletions

View File

@ -256,7 +256,7 @@ public class Claim implements IPermissionContainer {
player.sendMessage(PermHelper.simpleColoredText(ConfigHandler.lang.noPermissionSimple, Formatting.DARK_RED), true); player.sendMessage(PermHelper.simpleColoredText(ConfigHandler.lang.noPermissionSimple, Formatting.DARK_RED), true);
return false; return false;
} }
if(ConfigHandler.config.offlineProtectActivation != -1 && (LogoutTracker.getInstance().justLoggedOut(this.getOwner()) || this.getOwnerPlayer().isPresent())) { if(ConfigHandler.config.offlineProtectActivation != -1 && (LogoutTracker.getInstance(this.world.getServer()).justLoggedOut(this.getOwner()) || this.getOwnerPlayer().isPresent())) {
return global == Config.GlobalType.NONE || global.getValue(); return global == Config.GlobalType.NONE || global.getValue();
} }
} }

View File

@ -18,6 +18,7 @@ public class PlayerEvents {
} }
public static void onLogout(PlayerEntity player) { public static void onLogout(PlayerEntity player) {
LogoutTracker.getInstance().track(player.getUuid()); if(player.getServer() != null)
LogoutTracker.getInstance(player.getServer()).track(player.getUuid());
} }
} }

View File

@ -8,6 +8,7 @@ import net.minecraft.block.BlockState;
import net.minecraft.entity.LightningEntity; import net.minecraft.entity.LightningEntity;
import net.minecraft.entity.SpawnGroup; import net.minecraft.entity.SpawnGroup;
import net.minecraft.entity.mob.MobEntity; import net.minecraft.entity.mob.MobEntity;
import net.minecraft.server.MinecraftServer;
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.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
@ -94,7 +95,7 @@ public class WorldEvents {
return true; return true;
} }
public static void serverTick() { public static void serverTick(MinecraftServer server) {
LogoutTracker.getInstance().tick(); LogoutTracker.getInstance(server).tick();
} }
} }

View File

@ -18,36 +18,36 @@ import java.util.UUID;
public abstract class ItemEntityMixin implements IOwnedItem { public abstract class ItemEntityMixin implements IOwnedItem {
@Unique @Unique
private UUID playerOrigin; private UUID flanPlayerOrigin;
@Unique @Unique
private UUID deathPlayerOrigin; private UUID flanDeathPlayerOrigin;
@Inject(method = "readCustomDataFromTag", at = @At("RETURN")) @Inject(method = "readCustomDataFromTag", at = @At("RETURN"))
private void readData(CompoundTag tag, CallbackInfo info) { private void readData(CompoundTag tag, CallbackInfo info) {
if (tag.contains("Flan:PlayerOrigin")) if (tag.contains("Flan:PlayerOrigin"))
this.playerOrigin = tag.getUuid("Flan:PlayerOrigin"); this.flanPlayerOrigin = tag.getUuid("Flan:PlayerOrigin");
} }
@Inject(method = "writeCustomDataToTag", at = @At("RETURN")) @Inject(method = "writeCustomDataToTag", at = @At("RETURN"))
private void writeData(CompoundTag tag, CallbackInfo info) { private void writeData(CompoundTag tag, CallbackInfo info) {
if (this.playerOrigin != null) if (this.flanPlayerOrigin != null)
tag.putUuid("Flan:PlayerOrigin", this.playerOrigin); tag.putUuid("Flan:PlayerOrigin", this.flanPlayerOrigin);
} }
@Override @Override
public void setOriginPlayer(PlayerEntity player) { public void setOriginPlayer(PlayerEntity player) {
this.playerOrigin = player.getUuid(); this.flanPlayerOrigin = player.getUuid();
if (player instanceof ServerPlayerEntity && PlayerClaimData.get((ServerPlayerEntity) player).setDeathItemOwner()) if (player instanceof ServerPlayerEntity && PlayerClaimData.get((ServerPlayerEntity) player).setDeathItemOwner())
this.deathPlayerOrigin = this.playerOrigin; this.flanDeathPlayerOrigin = this.flanPlayerOrigin;
} }
@Override @Override
public UUID getDeathPlayer() { public UUID getDeathPlayer() {
return this.deathPlayerOrigin; return this.flanDeathPlayerOrigin;
} }
@Override @Override
public UUID getPlayerOrigin() { public UUID getPlayerOrigin() {
return this.playerOrigin; return this.flanPlayerOrigin;
} }
} }

View File

@ -0,0 +1,19 @@
package io.github.flemmli97.flan.mixin;
import io.github.flemmli97.flan.player.LogoutImpl;
import io.github.flemmli97.flan.player.LogoutTracker;
import net.minecraft.server.MinecraftServer;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
@Mixin(MinecraftServer.class)
public abstract class MinecraftServerMixin implements LogoutImpl {
@Unique
private final LogoutTracker flanLogout = new LogoutTracker();
@Override
public LogoutTracker getInstance() {
return this.flanLogout;
}
}

View File

@ -16,17 +16,17 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
public abstract class PlayerClaimMixin implements IPlayerClaimImpl { public abstract class PlayerClaimMixin implements IPlayerClaimImpl {
@Unique @Unique
private PlayerClaimData claimData; private PlayerClaimData flanClaimData;
@Unique @Unique
private Claim currentClaim; private Claim flanCurrentClaim;
@Shadow @Shadow
private MinecraftServer server; private MinecraftServer server;
@Inject(method = "<init>*", at = @At("RETURN")) @Inject(method = "<init>*", at = @At("RETURN"))
private void initData(CallbackInfo info) { private void initData(CallbackInfo info) {
this.claimData = new PlayerClaimData((ServerPlayerEntity) (Object) this); this.flanClaimData = new PlayerClaimData((ServerPlayerEntity) (Object) this);
} }
/*@Inject(method = "readCustomDataFromTag", at = @At("RETURN")) /*@Inject(method = "readCustomDataFromTag", at = @At("RETURN"))
@ -41,21 +41,21 @@ public abstract class PlayerClaimMixin implements IPlayerClaimImpl {
@Inject(method = "tick", at = @At("HEAD")) @Inject(method = "tick", at = @At("HEAD"))
private void tickData(CallbackInfo info) { private void tickData(CallbackInfo info) {
this.claimData.tick(this.currentClaim, claim -> this.currentClaim = claim); this.flanClaimData.tick(this.flanCurrentClaim, claim -> this.flanCurrentClaim = claim);
} }
@Inject(method = "copyFrom", at = @At("RETURN")) @Inject(method = "copyFrom", at = @At("RETURN"))
private void copyOld(ServerPlayerEntity oldPlayer, boolean alive, CallbackInfo info) { private void copyOld(ServerPlayerEntity oldPlayer, boolean alive, CallbackInfo info) {
this.claimData.clone(PlayerClaimData.get(oldPlayer)); this.flanClaimData.clone(PlayerClaimData.get(oldPlayer));
} }
@Override @Override
public PlayerClaimData get() { public PlayerClaimData get() {
return this.claimData; return this.flanClaimData;
} }
@Override @Override
public Claim getCurrentClaim() { public Claim getCurrentClaim() {
return this.currentClaim; return this.flanCurrentClaim;
} }
} }

View File

@ -12,22 +12,22 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(ServerWorld.class) @Mixin(ServerWorld.class)
public abstract class ServerWorldMixin implements IClaimStorage { public abstract class ServerWorldMixin implements IClaimStorage {
@Unique @Unique
private ClaimStorage claimData; private ClaimStorage flanClaimData;
@Inject(method = "<init>*", at = @At("RETURN")) @Inject(method = "<init>*", at = @At("RETURN"))
private void initData(CallbackInfo info) { private void initData(CallbackInfo info) {
ServerWorld world = ((ServerWorld) (Object) this); ServerWorld world = ((ServerWorld) (Object) this);
this.claimData = new ClaimStorage(world.getServer(), world); this.flanClaimData = new ClaimStorage(world.getServer(), world);
} }
@Inject(method = "saveLevel()V", at = @At("RETURN")) @Inject(method = "saveLevel()V", at = @At("RETURN"))
private void saveClaimData(CallbackInfo info) { private void saveClaimData(CallbackInfo info) {
ServerWorld world = ((ServerWorld) (Object) this); ServerWorld world = ((ServerWorld) (Object) this);
this.claimData.save(world.getServer(), world.getRegistryKey()); this.flanClaimData.save(world.getServer(), world.getRegistryKey());
} }
@Override @Override
public ClaimStorage get() { public ClaimStorage get() {
return this.claimData; return this.flanClaimData;
} }
} }

View File

@ -0,0 +1,6 @@
package io.github.flemmli97.flan.player;
public interface LogoutImpl {
LogoutTracker getInstance();
}

View File

@ -1,6 +1,7 @@
package io.github.flemmli97.flan.player; package io.github.flemmli97.flan.player;
import io.github.flemmli97.flan.config.ConfigHandler; import io.github.flemmli97.flan.config.ConfigHandler;
import net.minecraft.server.MinecraftServer;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
@ -9,13 +10,11 @@ import java.util.stream.Collectors;
public class LogoutTracker { public class LogoutTracker {
private static final LogoutTracker INSTANCE = new LogoutTracker();
private final Set<LogoutTicket> tracker = new HashSet<>(); private final Set<LogoutTicket> tracker = new HashSet<>();
private final Set<UUID> trackerUUID = new HashSet<>(); private final Set<UUID> trackerUUID = new HashSet<>();
public static LogoutTracker getInstance() { public static LogoutTracker getInstance(MinecraftServer server) {
return INSTANCE; return ((LogoutImpl)server).getInstance();
} }
public void track(UUID player) { public void track(UUID player) {

View File

@ -23,7 +23,8 @@
"IHungerAccessor", "IHungerAccessor",
"FrostWalkerMixin", "FrostWalkerMixin",
"LightningFireEntityMixin", "LightningFireEntityMixin",
"BannedEntryAccessor" "BannedEntryAccessor",
"MinecraftServerMixin"
], ],
"server": [ "server": [
], ],

View File

@ -36,7 +36,7 @@ public class FlanFabric implements ModInitializer {
UseItemCallback.EVENT.register(ItemInteractEvents::useItem); UseItemCallback.EVENT.register(ItemInteractEvents::useItem);
ServerLifecycleEvents.SERVER_STARTING.register(FlanFabric::serverLoad); ServerLifecycleEvents.SERVER_STARTING.register(FlanFabric::serverLoad);
ServerLifecycleEvents.SERVER_STARTED.register(FlanFabric::serverFinishLoad); ServerLifecycleEvents.SERVER_STARTED.register(FlanFabric::serverFinishLoad);
ServerTickEvents.START_SERVER_TICK.register(server->WorldEvents.serverTick()); ServerTickEvents.START_SERVER_TICK.register(WorldEvents::serverTick);
ServerPlayConnectionEvents.DISCONNECT.register((handler,server)->PlayerEvents.onLogout(handler.player)); ServerPlayConnectionEvents.DISCONNECT.register((handler,server)->PlayerEvents.onLogout(handler.player));
CommandRegistrationCallback.EVENT.register(CommandClaim::register); CommandRegistrationCallback.EVENT.register(CommandClaim::register);

View File

@ -10,7 +10,7 @@ import org.spongepowered.asm.mixin.injection.ModifyVariable;
import java.util.List; import java.util.List;
@Mixin(LightningEntity.class) @Mixin(LightningEntity.class)
public class LightningHitMixin { public abstract class LightningHitMixin {
@ModifyVariable(method = "tick", at = @At(value = "INVOKE", target = "Ljava/util/List;iterator()Ljava/util/Iterator;"), require = 1) @ModifyVariable(method = "tick", at = @At(value = "INVOKE", target = "Ljava/util/List;iterator()Ljava/util/Iterator;"), require = 1)
private List<Entity> affectedEntities(List<Entity> list) { private List<Entity> affectedEntities(List<Entity> list) {

View File

@ -7,6 +7,7 @@ import io.github.flemmli97.flan.config.ConfigHandler;
import io.github.flemmli97.flan.event.PlayerEvents; import io.github.flemmli97.flan.event.PlayerEvents;
import io.github.flemmli97.flan.player.LogoutTracker; import io.github.flemmli97.flan.player.LogoutTracker;
import io.github.flemmli97.flan.player.PlayerDataHandler; import io.github.flemmli97.flan.player.PlayerDataHandler;
import net.minecraft.world.World;
import net.minecraftforge.event.RegisterCommandsEvent; import net.minecraftforge.event.RegisterCommandsEvent;
import net.minecraftforge.event.TickEvent; import net.minecraftforge.event.TickEvent;
import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.event.entity.player.PlayerEvent;
@ -41,8 +42,8 @@ public class ServerEvents {
PlayerEvents.onLogout(event.getPlayer()); PlayerEvents.onLogout(event.getPlayer());
} }
public static void serverTick(TickEvent.ServerTickEvent event) { public static void serverTick(TickEvent.WorldTickEvent event) {
if(event.phase == TickEvent.Phase.START) if(event.phase == TickEvent.Phase.START && event.world.getServer() != null && event.world.getRegistryKey() == World.OVERWORLD)
LogoutTracker.getInstance().tick(); LogoutTracker.getInstance(event.world.getServer()).tick();
} }
} }