From cb9c333f3b86ede88338ef1bb91cbc9acf268121 Mon Sep 17 00:00:00 2001 From: Flemmli97 Date: Fri, 13 Aug 2021 11:20:55 +0200 Subject: [PATCH] option to only protect offline players. closes #83 --- .../io/github/flemmli97/flan/claim/Claim.java | 20 ++++--- .../github/flemmli97/flan/config/Config.java | 4 ++ .../flemmli97/flan/event/PlayerEvents.java | 5 ++ .../flemmli97/flan/event/WorldEvents.java | 5 ++ .../flemmli97/flan/player/LogoutTracker.java | 58 +++++++++++++++++++ .../io/github/flemmli97/flan/FlanFabric.java | 8 ++- .../io/github/flemmli97/flan/FlanForge.java | 2 + .../flan/forgeevent/ServerEvents.java | 11 ++++ 8 files changed, 105 insertions(+), 8 deletions(-) create mode 100644 common/src/main/java/io/github/flemmli97/flan/player/LogoutTracker.java diff --git a/common/src/main/java/io/github/flemmli97/flan/claim/Claim.java b/common/src/main/java/io/github/flemmli97/flan/claim/Claim.java index aea1e15..572a57f 100644 --- a/common/src/main/java/io/github/flemmli97/flan/claim/Claim.java +++ b/common/src/main/java/io/github/flemmli97/flan/claim/Claim.java @@ -13,6 +13,7 @@ import io.github.flemmli97.flan.api.permission.ClaimPermission; import io.github.flemmli97.flan.api.permission.PermissionRegistry; import io.github.flemmli97.flan.config.Config; import io.github.flemmli97.flan.config.ConfigHandler; +import io.github.flemmli97.flan.player.LogoutTracker; import io.github.flemmli97.flan.player.PlayerClaimData; import net.minecraft.entity.effect.StatusEffect; import net.minecraft.entity.effect.StatusEffectInstance; @@ -246,13 +247,18 @@ public class Claim implements IPermissionContainer { return true; } } - Config.GlobalType global = ConfigHandler.config.getGlobal(this.world, perm); - if (!this.isAdminClaim() && !global.canModify()) { - if (global.getValue() || (player != null && this.isAdminIgnore(player))) - return true; - if (message) - player.sendMessage(PermHelper.simpleColoredText(ConfigHandler.lang.noPermissionSimple, Formatting.DARK_RED), true); - return false; + if (!this.isAdminClaim()) { + Config.GlobalType global = ConfigHandler.config.getGlobal(this.world, perm); + if(!global.canModify()) { + if (global.getValue() || (player != null && this.isAdminIgnore(player))) + return true; + if (message) + player.sendMessage(PermHelper.simpleColoredText(ConfigHandler.lang.noPermissionSimple, Formatting.DARK_RED), true); + return false; + } + if(ConfigHandler.config.offlineProtectActivation != -1 && (LogoutTracker.getInstance().justLoggedOut(this.getOwner()) || this.getOwnerPlayer().isPresent())) { + return global == Config.GlobalType.NONE || global.getValue(); + } } if (PermissionRegistry.globalPerms().contains(perm)) { for (Claim claim : this.subClaims) { diff --git a/common/src/main/java/io/github/flemmli97/flan/config/Config.java b/common/src/main/java/io/github/flemmli97/flan/config/Config.java index 4da8f10..6083f16 100644 --- a/common/src/main/java/io/github/flemmli97/flan/config/Config.java +++ b/common/src/main/java/io/github/flemmli97/flan/config/Config.java @@ -68,6 +68,8 @@ public class Config { public boolean deletePlayerFile = false; public int bannedDeletionTime = 30; + public int offlineProtectActivation = -1; + public boolean log; public int configVersion = 2; @@ -187,6 +189,7 @@ public class Config { this.inactivityBlocksMax = ConfigHandler.fromJson(obj, "inactivityBlocksMax", this.inactivityBlocksMax); this.deletePlayerFile = ConfigHandler.fromJson(obj, "deletePlayerFile", this.deletePlayerFile); this.bannedDeletionTime = ConfigHandler.fromJson(obj, "bannedDeletionTime", this.bannedDeletionTime); + this.offlineProtectActivation = ConfigHandler.fromJson(obj, "offlineProtectActivation", this.offlineProtectActivation); } catch (IOException e) { e.printStackTrace(); } @@ -248,6 +251,7 @@ public class Config { obj.addProperty("inactivityBlocksMax", this.inactivityBlocksMax); obj.addProperty("deletePlayerFile", this.deletePlayerFile); obj.addProperty("bannedDeletionTime", this.bannedDeletionTime); + obj.addProperty("offlineProtectActivation", this.offlineProtectActivation); try { FileWriter writer = new FileWriter(this.config); ConfigHandler.GSON.toJson(obj, writer); diff --git a/common/src/main/java/io/github/flemmli97/flan/event/PlayerEvents.java b/common/src/main/java/io/github/flemmli97/flan/event/PlayerEvents.java index a1e412b..5e380e9 100644 --- a/common/src/main/java/io/github/flemmli97/flan/event/PlayerEvents.java +++ b/common/src/main/java/io/github/flemmli97/flan/event/PlayerEvents.java @@ -1,5 +1,6 @@ package io.github.flemmli97.flan.event; +import io.github.flemmli97.flan.player.LogoutTracker; import io.github.flemmli97.flan.player.PlayerClaimData; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.server.network.ServerPlayerEntity; @@ -15,4 +16,8 @@ public class PlayerEvents { if (player instanceof ServerPlayerEntity) PlayerClaimData.get((ServerPlayerEntity) player).read(player.getServer()); } + + public static void onLogout(PlayerEntity player) { + LogoutTracker.getInstance().track(player.getUuid()); + } } diff --git a/common/src/main/java/io/github/flemmli97/flan/event/WorldEvents.java b/common/src/main/java/io/github/flemmli97/flan/event/WorldEvents.java index 247f210..273180e 100644 --- a/common/src/main/java/io/github/flemmli97/flan/event/WorldEvents.java +++ b/common/src/main/java/io/github/flemmli97/flan/event/WorldEvents.java @@ -3,6 +3,7 @@ package io.github.flemmli97.flan.event; import io.github.flemmli97.flan.api.data.IPermissionContainer; import io.github.flemmli97.flan.api.permission.PermissionRegistry; import io.github.flemmli97.flan.claim.ClaimStorage; +import io.github.flemmli97.flan.player.LogoutTracker; import net.minecraft.block.BlockState; import net.minecraft.entity.LightningEntity; import net.minecraft.entity.SpawnGroup; @@ -92,4 +93,8 @@ public class WorldEvents { } return true; } + + public static void serverTick() { + LogoutTracker.getInstance().tick(); + } } diff --git a/common/src/main/java/io/github/flemmli97/flan/player/LogoutTracker.java b/common/src/main/java/io/github/flemmli97/flan/player/LogoutTracker.java new file mode 100644 index 0000000..2f1bf3a --- /dev/null +++ b/common/src/main/java/io/github/flemmli97/flan/player/LogoutTracker.java @@ -0,0 +1,58 @@ +package io.github.flemmli97.flan.player; + +import io.github.flemmli97.flan.config.ConfigHandler; + +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; +import java.util.stream.Collectors; + +public class LogoutTracker { + + private static final LogoutTracker INSTANCE = new LogoutTracker(); + + private final Set tracker = new HashSet<>(); + private final Set trackerUUID = new HashSet<>(); + + public static LogoutTracker getInstance() { + return INSTANCE; + } + + public void track(UUID player) { + if(ConfigHandler.config.offlineProtectActivation == -1) + return; + this.trackerUUID.add(player); + this.tracker.add(new LogoutTicket(player)); + } + + public boolean justLoggedOut(UUID uuid) { + return this.trackerUUID.contains(uuid); + } + + public void tick() { + this.tracker.stream().filter(LogoutTicket::tick) + .collect(Collectors.toSet()) + .forEach(ticket -> { + this.tracker.remove(ticket); + this.trackerUUID.remove(ticket.uuid); + }); + } + + private static class LogoutTicket { + private final UUID uuid; + private int time = ConfigHandler.config.offlineProtectActivation; + + public LogoutTicket(UUID player) { + this.uuid = player; + } + + public boolean tick() { + return --this.time <= 0; + } + + @Override + public String toString() { + return String.format("LogoutTicket: UUID=%s, TimeLeft=%d", this.uuid, this.time); + } + } +} diff --git a/fabric/src/main/java/io/github/flemmli97/flan/FlanFabric.java b/fabric/src/main/java/io/github/flemmli97/flan/FlanFabric.java index 6a80e7e..fa5ba97 100644 --- a/fabric/src/main/java/io/github/flemmli97/flan/FlanFabric.java +++ b/fabric/src/main/java/io/github/flemmli97/flan/FlanFabric.java @@ -6,17 +6,22 @@ import io.github.flemmli97.flan.config.ConfigHandler; import io.github.flemmli97.flan.event.BlockInteractEvents; import io.github.flemmli97.flan.event.EntityInteractEvents; import io.github.flemmli97.flan.event.ItemInteractEvents; +import io.github.flemmli97.flan.event.PlayerEvents; +import io.github.flemmli97.flan.event.WorldEvents; import io.github.flemmli97.flan.integration.playerability.PlayerAbilityEvents; import io.github.flemmli97.flan.player.PlayerDataHandler; import io.github.flemmli97.flan.scoreboard.ClaimCriterias; import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.command.v1.CommandRegistrationCallback; +import net.fabricmc.fabric.api.event.lifecycle.v1.ServerEntityEvents; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; +import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents; import net.fabricmc.fabric.api.event.player.AttackBlockCallback; import net.fabricmc.fabric.api.event.player.AttackEntityCallback; import net.fabricmc.fabric.api.event.player.PlayerBlockBreakEvents; import net.fabricmc.fabric.api.event.player.UseEntityCallback; import net.fabricmc.fabric.api.event.player.UseItemCallback; +import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents; import net.fabricmc.loader.api.FabricLoader; import net.minecraft.server.MinecraftServer; @@ -31,7 +36,8 @@ public class FlanFabric implements ModInitializer { UseItemCallback.EVENT.register(ItemInteractEvents::useItem); ServerLifecycleEvents.SERVER_STARTING.register(FlanFabric::serverLoad); ServerLifecycleEvents.SERVER_STARTED.register(FlanFabric::serverFinishLoad); - + ServerTickEvents.START_SERVER_TICK.register(server->WorldEvents.serverTick()); + ServerPlayConnectionEvents.DISCONNECT.register((handler,server)->PlayerEvents.onLogout(handler.player)); CommandRegistrationCallback.EVENT.register(CommandClaim::register); Flan.permissionAPI = FabricLoader.getInstance().isModLoaded("fabric-permissions-api-v0"); diff --git a/forge/src/main/java/io/github/flemmli97/flan/FlanForge.java b/forge/src/main/java/io/github/flemmli97/flan/FlanForge.java index d3a4977..ab3b337 100644 --- a/forge/src/main/java/io/github/flemmli97/flan/FlanForge.java +++ b/forge/src/main/java/io/github/flemmli97/flan/FlanForge.java @@ -42,6 +42,8 @@ public class FlanForge { forge.addListener(ServerEvents::savePlayer); forge.addListener(ServerEvents::readPlayer); forge.addListener(ServerEvents::serverFinishLoad); + forge.addListener(ServerEvents::disconnect); + forge.addListener(ServerEvents::serverTick); ClaimCriterias.init(); } diff --git a/forge/src/main/java/io/github/flemmli97/flan/forgeevent/ServerEvents.java b/forge/src/main/java/io/github/flemmli97/flan/forgeevent/ServerEvents.java index 00523be..d6d23e8 100644 --- a/forge/src/main/java/io/github/flemmli97/flan/forgeevent/ServerEvents.java +++ b/forge/src/main/java/io/github/flemmli97/flan/forgeevent/ServerEvents.java @@ -5,8 +5,10 @@ import io.github.flemmli97.flan.api.permission.ObjectToPermissionMap; import io.github.flemmli97.flan.commands.CommandClaim; import io.github.flemmli97.flan.config.ConfigHandler; import io.github.flemmli97.flan.event.PlayerEvents; +import io.github.flemmli97.flan.player.LogoutTracker; import io.github.flemmli97.flan.player.PlayerDataHandler; import net.minecraftforge.event.RegisterCommandsEvent; +import net.minecraftforge.event.TickEvent; import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.fml.event.server.FMLServerAboutToStartEvent; import net.minecraftforge.fml.event.server.FMLServerStartedEvent; @@ -34,4 +36,13 @@ public class ServerEvents { public static void readPlayer(PlayerEvent.LoadFromFile event) { PlayerEvents.readClaimData(event.getPlayer()); } + + public static void disconnect(PlayerEvent.PlayerLoggedOutEvent event) { + PlayerEvents.onLogout(event.getPlayer()); + } + + public static void serverTick(TickEvent.ServerTickEvent event) { + if(event.phase == TickEvent.Phase.START) + LogoutTracker.getInstance().tick(); + } }