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
- Support for Money and Sign Shops currency (forge)
- 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
======================

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 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 LOCKITEMS = global(new ClaimPermission("LOCKITEMS", () -> new ItemStack(Items.FIREWORK_STAR), true, "If items should be locked on death"));
private static ClaimPermission register(ClaimPermission perm) {
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.config.Config;
import io.github.flemmli97.flan.config.ConfigHandler;
import io.github.flemmli97.flan.config.ConfigUpdater;
import io.github.flemmli97.flan.player.PlayerClaimData;
import net.minecraft.entity.effect.StatusEffect;
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) {
Claim claim = new Claim(world);
claim.readJson(obj, owner);
ConfigUpdater.updateClaim(claim);
ClaimUpdater.updateClaim(claim);
return claim;
}
@ -727,4 +726,18 @@ public class Claim implements IPermissionContainer {
GLOBAL,
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 buyPrice = -1;
public boolean lockDrops = true;
public int dropTicks = 6000;
public int inactivityTime = 30;
@ -67,7 +66,7 @@ public class Config {
public boolean log;
public int configVersion = 1;
public int configVersion = 2;
public int preConfigVersion;
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.MOBSPAWN, GlobalType.ALLFALSE);
perms.put(PermissionRegistry.TELEPORT, GlobalType.ALLFALSE);
perms.put(PermissionRegistry.NOHUNGER, GlobalType.ALLFALSE);
perms.put(PermissionRegistry.EDITPOTIONS, GlobalType.ALLFALSE);
perms.put(PermissionRegistry.LOCKITEMS, GlobalType.ALLTRUE);
})));
public Config(MinecraftServer server) {
@ -178,7 +178,6 @@ public class Config {
this.permissionLevel = ConfigHandler.fromJson(obj, "permissionLevel", this.permissionLevel);
this.sellPrice = ConfigHandler.fromJson(obj, "sellPrice", this.sellPrice);
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.inactivityTime = ConfigHandler.fromJson(obj, "inactivityTimeDays", this.inactivityTime);
this.inactivityBlocksMax = ConfigHandler.fromJson(obj, "inactivityBlocksMax", this.inactivityBlocksMax);
@ -238,7 +237,6 @@ public class Config {
obj.addProperty("enableLogs", this.log);
obj.addProperty("sellPrice", this.sellPrice);
obj.addProperty("buyPrice", this.buyPrice);
obj.addProperty("lockDrops", this.lockDrops);
obj.addProperty("dropTicks", this.dropTicks);
obj.addProperty("inactivityTimeDays", this.inactivityTime);
obj.addProperty("inactivityBlocksMax", this.inactivityBlocksMax);

View File

@ -1,13 +1,24 @@
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;
public class ConfigUpdater {
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) {
@ -15,16 +26,9 @@ public class 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 {
void configUpdater();
void claimUpdater(Claim claim);
}
}
}

View File

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

View File

@ -1,9 +1,11 @@
package io.github.flemmli97.flan.mixin;
import io.github.flemmli97.flan.player.IOwnedItem;
import io.github.flemmli97.flan.player.PlayerClaimData;
import net.minecraft.entity.ItemEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.server.network.ServerPlayerEntity;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
@ -35,7 +37,7 @@ public abstract class ItemEntityMixin implements IOwnedItem {
@Override
public void setOriginPlayer(PlayerEntity player) {
this.playerOrigin = player.getUuid();
if (player.isDead())
if (player instanceof ServerPlayerEntity && PlayerClaimData.get((ServerPlayerEntity) player).setDeathItemOwner())
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 boolean shouldProtectDrop, calculateShouldDrop = true;
public PlayerClaimData(ServerPlayerEntity player) {
this.player = player;
this.claimBlocks = ConfigHandler.config.startingBlocks;
@ -320,6 +322,8 @@ public class PlayerClaimData implements IPlayerData {
}
}
this.deathPickupTick--;
if (!this.player.isDead())
this.calculateShouldDrop = true;
}
public void unlockDeathItems() {
@ -335,7 +339,7 @@ public class PlayerClaimData implements IPlayerData {
this.additionalClaimBlocks = data.additionalClaimBlocks;
this.defaultGroups.clear();
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);
}
@ -371,6 +375,18 @@ public class PlayerClaimData implements IPlayerData {
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) {
Flan.log("Saving player data for player {} with uuid {}", this.player.getName(), this.player.getUuid());
Path dir = ConfigHandler.getPlayerSavePath(server);