option to only protect offline players. closes #83

This commit is contained in:
Flemmli97 2021-08-13 11:20:55 +02:00
parent 1c405b9e96
commit cb9c333f3b
8 changed files with 105 additions and 8 deletions

View File

@ -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) {

View File

@ -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);

View File

@ -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());
}
}

View File

@ -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();
}
}

View File

@ -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<LogoutTicket> tracker = new HashSet<>();
private final Set<UUID> 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);
}
}
}

View File

@ -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");

View File

@ -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();
}

View File

@ -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();
}
}