option to only protect offline players. closes #83
This commit is contained in:
parent
1c405b9e96
commit
cb9c333f3b
@ -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) {
|
||||
|
@ -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);
|
||||
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
@ -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");
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user