change locking drops to a permission

This commit is contained in:
Flemmli97 2021-07-31 17:56:43 +02:00
parent 57e03502de
commit 731de0949b
8 changed files with 56 additions and 20 deletions

View File

@ -3,6 +3,8 @@ Flan 1.6.1
- Improve performance - Improve performance
- Support for Money and Sign Shops currency (forge) - Support for Money and Sign Shops currency (forge)
- Fix unusable admin cmd with FTBRanks if its not defined in Ranks - Fix unusable admin cmd with FTBRanks if its not defined in Ranks
- Change lockItems config to a permission
Global default is ALLTRUE
Flan 1.6.0 Flan 1.6.0
====================== ======================

View File

@ -85,6 +85,7 @@ public class PermissionRegistry {
public static ClaimPermission MOBSPAWN = global(new ClaimPermission("MOBSPAWN", () -> new ItemStack(Items.ZOMBIE_SPAWN_EGG), "Prevent hostile mobspawn in claim")); public static ClaimPermission MOBSPAWN = global(new ClaimPermission("MOBSPAWN", () -> new ItemStack(Items.ZOMBIE_SPAWN_EGG), "Prevent hostile mobspawn in claim"));
public static ClaimPermission ANIMALSPAWN = global(new ClaimPermission("ANIMALSPAWN", () -> new ItemStack(Items.PIG_SPAWN_EGG), "Prevent other spawn in claim")); public static ClaimPermission ANIMALSPAWN = global(new ClaimPermission("ANIMALSPAWN", () -> new ItemStack(Items.PIG_SPAWN_EGG), "Prevent other spawn in claim"));
public static ClaimPermission LIGHTNING = global(new ClaimPermission("LIGHTNING", () -> new ItemStack(Items.TRIDENT), "Allow lightning to affect claims", "e.g. set blocks on fire", "or affect animals (mobs are excluded)")); public static ClaimPermission LIGHTNING = global(new ClaimPermission("LIGHTNING", () -> new ItemStack(Items.TRIDENT), "Allow lightning to affect claims", "e.g. set blocks on fire", "or affect animals (mobs are excluded)"));
public static ClaimPermission LOCKITEMS = global(new ClaimPermission("LOCKITEMS", () -> new ItemStack(Items.FIREWORK_STAR), true, "If items should be locked on death"));
private static ClaimPermission register(ClaimPermission perm) { private static ClaimPermission register(ClaimPermission perm) {
if (locked) { if (locked) {

View File

@ -13,7 +13,6 @@ import io.github.flemmli97.flan.api.permission.ClaimPermission;
import io.github.flemmli97.flan.api.permission.PermissionRegistry; import io.github.flemmli97.flan.api.permission.PermissionRegistry;
import io.github.flemmli97.flan.config.Config; import io.github.flemmli97.flan.config.Config;
import io.github.flemmli97.flan.config.ConfigHandler; import io.github.flemmli97.flan.config.ConfigHandler;
import io.github.flemmli97.flan.config.ConfigUpdater;
import io.github.flemmli97.flan.player.PlayerClaimData; import io.github.flemmli97.flan.player.PlayerClaimData;
import net.minecraft.entity.effect.StatusEffect; import net.minecraft.entity.effect.StatusEffect;
import net.minecraft.entity.effect.StatusEffectInstance; import net.minecraft.entity.effect.StatusEffectInstance;
@ -103,7 +102,7 @@ public class Claim implements IPermissionContainer {
public static Claim fromJson(JsonObject obj, UUID owner, ServerWorld world) { public static Claim fromJson(JsonObject obj, UUID owner, ServerWorld world) {
Claim claim = new Claim(world); Claim claim = new Claim(world);
claim.readJson(obj, owner); claim.readJson(obj, owner);
ConfigUpdater.updateClaim(claim); ClaimUpdater.updateClaim(claim);
return claim; return claim;
} }
@ -727,4 +726,18 @@ public class Claim implements IPermissionContainer {
GLOBAL, GLOBAL,
GROUP GROUP
} }
interface ClaimUpdater {
Map<Integer, ClaimUpdater> updater = Config.createHashMap(map -> {
map.put(2, claim -> claim.globalPerm.put(PermissionRegistry.LOCKITEMS, true));
});
static void updateClaim(Claim claim) {
updater.entrySet().stream().filter(e -> e.getKey() > ConfigHandler.config.preConfigVersion).map(Map.Entry::getValue)
.forEach(up -> up.update(claim));
}
void update(Claim claim);
}
} }

View File

@ -59,7 +59,6 @@ public class Config {
public int sellPrice = -1; public int sellPrice = -1;
public int buyPrice = -1; public int buyPrice = -1;
public boolean lockDrops = true;
public int dropTicks = 6000; public int dropTicks = 6000;
public int inactivityTime = 30; public int inactivityTime = 30;
@ -67,7 +66,7 @@ public class Config {
public boolean log; public boolean log;
public int configVersion = 1; public int configVersion = 2;
public int preConfigVersion; public int preConfigVersion;
public Map<String, Map<ClaimPermission, Boolean>> defaultGroups = createHashMap(map -> { public Map<String, Map<ClaimPermission, Boolean>> defaultGroups = createHashMap(map -> {
@ -87,12 +86,13 @@ public class Config {
})); }));
}); });
private final Map<String, Map<ClaimPermission, GlobalType>> globalDefaultPerms = createHashMap(map -> map.put("*", createHashMap(perms -> { protected final Map<String, Map<ClaimPermission, GlobalType>> globalDefaultPerms = createHashMap(map -> map.put("*", createHashMap(perms -> {
perms.put(PermissionRegistry.FLIGHT, GlobalType.ALLTRUE); perms.put(PermissionRegistry.FLIGHT, GlobalType.ALLTRUE);
perms.put(PermissionRegistry.MOBSPAWN, GlobalType.ALLFALSE); perms.put(PermissionRegistry.MOBSPAWN, GlobalType.ALLFALSE);
perms.put(PermissionRegistry.TELEPORT, GlobalType.ALLFALSE); perms.put(PermissionRegistry.TELEPORT, GlobalType.ALLFALSE);
perms.put(PermissionRegistry.NOHUNGER, GlobalType.ALLFALSE); perms.put(PermissionRegistry.NOHUNGER, GlobalType.ALLFALSE);
perms.put(PermissionRegistry.EDITPOTIONS, GlobalType.ALLFALSE); perms.put(PermissionRegistry.EDITPOTIONS, GlobalType.ALLFALSE);
perms.put(PermissionRegistry.LOCKITEMS, GlobalType.ALLTRUE);
}))); })));
public Config(MinecraftServer server) { public Config(MinecraftServer server) {
@ -178,7 +178,6 @@ public class Config {
this.permissionLevel = ConfigHandler.fromJson(obj, "permissionLevel", this.permissionLevel); this.permissionLevel = ConfigHandler.fromJson(obj, "permissionLevel", this.permissionLevel);
this.sellPrice = ConfigHandler.fromJson(obj, "sellPrice", this.sellPrice); this.sellPrice = ConfigHandler.fromJson(obj, "sellPrice", this.sellPrice);
this.buyPrice = ConfigHandler.fromJson(obj, "buyPrice", this.buyPrice); this.buyPrice = ConfigHandler.fromJson(obj, "buyPrice", this.buyPrice);
this.lockDrops = ConfigHandler.fromJson(obj, "lockDrops", this.lockDrops);
this.dropTicks = ConfigHandler.fromJson(obj, "dropTicks", this.dropTicks); this.dropTicks = ConfigHandler.fromJson(obj, "dropTicks", this.dropTicks);
this.inactivityTime = ConfigHandler.fromJson(obj, "inactivityTimeDays", this.inactivityTime); this.inactivityTime = ConfigHandler.fromJson(obj, "inactivityTimeDays", this.inactivityTime);
this.inactivityBlocksMax = ConfigHandler.fromJson(obj, "inactivityBlocksMax", this.inactivityBlocksMax); this.inactivityBlocksMax = ConfigHandler.fromJson(obj, "inactivityBlocksMax", this.inactivityBlocksMax);
@ -238,7 +237,6 @@ public class Config {
obj.addProperty("enableLogs", this.log); obj.addProperty("enableLogs", this.log);
obj.addProperty("sellPrice", this.sellPrice); obj.addProperty("sellPrice", this.sellPrice);
obj.addProperty("buyPrice", this.buyPrice); obj.addProperty("buyPrice", this.buyPrice);
obj.addProperty("lockDrops", this.lockDrops);
obj.addProperty("dropTicks", this.dropTicks); obj.addProperty("dropTicks", this.dropTicks);
obj.addProperty("inactivityTimeDays", this.inactivityTime); obj.addProperty("inactivityTimeDays", this.inactivityTime);
obj.addProperty("inactivityBlocksMax", this.inactivityBlocksMax); obj.addProperty("inactivityBlocksMax", this.inactivityBlocksMax);

View File

@ -1,13 +1,24 @@
package io.github.flemmli97.flan.config; package io.github.flemmli97.flan.config;
import io.github.flemmli97.flan.claim.Claim; import io.github.flemmli97.flan.Flan;
import io.github.flemmli97.flan.api.permission.PermissionRegistry;
import java.util.Map; import java.util.Map;
public class ConfigUpdater { public class ConfigUpdater {
private static final Map<Integer, Updater> updater = Config.createHashMap(map -> { private static final Map<Integer, Updater> updater = Config.createHashMap(map -> {
map.put(2, () -> {
Flan.debug("Updating config to version 2");
ConfigHandler.config.globalDefaultPerms.compute("*", (k, v) -> {
if (v == null) {
return Config.createHashMap(map1 -> map1.put(PermissionRegistry.LOCKITEMS, Config.GlobalType.ALLTRUE));
} else {
v.put(PermissionRegistry.LOCKITEMS, Config.GlobalType.ALLTRUE);
return v;
}
});
});
}); });
public static void updateConfig(int preVersion) { public static void updateConfig(int preVersion) {
@ -15,16 +26,9 @@ public class ConfigUpdater {
.forEach(Updater::configUpdater); .forEach(Updater::configUpdater);
} }
public static void updateClaim(Claim claim) {
updater.entrySet().stream().filter(e -> e.getKey() > ConfigHandler.config.preConfigVersion).map(Map.Entry::getValue)
.forEach(up -> up.claimUpdater(claim));
}
interface Updater { interface Updater {
void configUpdater(); void configUpdater();
void claimUpdater(Claim claim);
} }
} }

View File

@ -228,7 +228,7 @@ public class EntityInteractEvents {
ServerPlayerEntity sPlayer = (ServerPlayerEntity) player; ServerPlayerEntity sPlayer = (ServerPlayerEntity) player;
if (entity instanceof ItemEntity) { if (entity instanceof ItemEntity) {
IOwnedItem ownedItem = (IOwnedItem) entity; IOwnedItem ownedItem = (IOwnedItem) entity;
if (ownedItem.getDeathPlayer() != null && ConfigHandler.config.lockDrops) { if (ownedItem.getDeathPlayer() != null) {
ServerPlayerEntity other = sPlayer.getServer().getPlayerManager().getPlayer(ownedItem.getDeathPlayer()); ServerPlayerEntity other = sPlayer.getServer().getPlayerManager().getPlayer(ownedItem.getDeathPlayer());
if (other == null) if (other == null)
return false; return false;

View File

@ -1,9 +1,11 @@
package io.github.flemmli97.flan.mixin; package io.github.flemmli97.flan.mixin;
import io.github.flemmli97.flan.player.IOwnedItem; import io.github.flemmli97.flan.player.IOwnedItem;
import io.github.flemmli97.flan.player.PlayerClaimData;
import net.minecraft.entity.ItemEntity; import net.minecraft.entity.ItemEntity;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.server.network.ServerPlayerEntity;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
@ -35,7 +37,7 @@ public abstract class ItemEntityMixin implements IOwnedItem {
@Override @Override
public void setOriginPlayer(PlayerEntity player) { public void setOriginPlayer(PlayerEntity player) {
this.playerOrigin = player.getUuid(); this.playerOrigin = player.getUuid();
if (player.isDead()) if (player instanceof ServerPlayerEntity && PlayerClaimData.get((ServerPlayerEntity) player).setDeathItemOwner())
this.deathPlayerOrigin = this.playerOrigin; this.deathPlayerOrigin = this.playerOrigin;
} }

View File

@ -75,6 +75,8 @@ public class PlayerClaimData implements IPlayerData {
private final Map<String, Map<ClaimPermission, Boolean>> defaultGroups = new HashMap<>(); private final Map<String, Map<ClaimPermission, Boolean>> defaultGroups = new HashMap<>();
private boolean shouldProtectDrop, calculateShouldDrop = true;
public PlayerClaimData(ServerPlayerEntity player) { public PlayerClaimData(ServerPlayerEntity player) {
this.player = player; this.player = player;
this.claimBlocks = ConfigHandler.config.startingBlocks; this.claimBlocks = ConfigHandler.config.startingBlocks;
@ -320,6 +322,8 @@ public class PlayerClaimData implements IPlayerData {
} }
} }
this.deathPickupTick--; this.deathPickupTick--;
if (!this.player.isDead())
this.calculateShouldDrop = true;
} }
public void unlockDeathItems() { public void unlockDeathItems() {
@ -335,7 +339,7 @@ public class PlayerClaimData implements IPlayerData {
this.additionalClaimBlocks = data.additionalClaimBlocks; this.additionalClaimBlocks = data.additionalClaimBlocks;
this.defaultGroups.clear(); this.defaultGroups.clear();
this.defaultGroups.putAll(data.defaultGroups); this.defaultGroups.putAll(data.defaultGroups);
if (ConfigHandler.config.lockDrops) if (data.setDeathItemOwner())
this.player.sendMessage(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.unlockDropsCmd, "/flan unlockDrops"), Formatting.GOLD), false); this.player.sendMessage(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.unlockDropsCmd, "/flan unlockDrops"), Formatting.GOLD), false);
} }
@ -371,6 +375,18 @@ public class PlayerClaimData implements IPlayerData {
return usedClaimsBlocks; return usedClaimsBlocks;
} }
public boolean setDeathItemOwner() {
if (!this.player.isDead())
return false;
if (this.calculateShouldDrop) {
BlockPos rounded = TeleportUtils.roundedBlockPos(this.player.getPos().add(0, this.player.getActiveEyeHeight(this.player.getPose(), this.player.getDimensions(this.player.getPose())), 0));
this.shouldProtectDrop = ClaimStorage.get(this.player.getServerWorld()).getForPermissionCheck(rounded)
.canInteract(this.player, PermissionRegistry.LOCKITEMS, rounded);
this.calculateShouldDrop = false;
}
return this.shouldProtectDrop;
}
public void save(MinecraftServer server) { public void save(MinecraftServer server) {
Flan.log("Saving player data for player {} with uuid {}", this.player.getName(), this.player.getUuid()); Flan.log("Saving player data for player {} with uuid {}", this.player.getName(), this.player.getUuid());
Path dir = ConfigHandler.getPlayerSavePath(server); Path dir = ConfigHandler.getPlayerSavePath(server);