From a00b50bf5954c96173e83054b22aaf9a58022667 Mon Sep 17 00:00:00 2001 From: Ste3et_C0st Date: Thu, 4 Jan 2024 01:32:57 +0100 Subject: [PATCH] Add PermissionLimitation (PERMISSION aka globalPermission) and add PermissionKits for WORLD & CHUNK --- .gradle/7.2/fileHashes/fileHashes.lock | Bin 17 -> 17 bytes .gradle/checksums/checksums.lock | Bin 17 -> 17 bytes .../FurnitureLib/Crafting/Project.java | 4 + .../LimitationManager/ChunkLimitation.java | 13 +++- .../LimitationManager/Limitation.java | 26 ++++--- .../LimitationManager/LimitationManager.java | 27 +------ .../LimitationManager/PermissionKitLimit.java | 71 ++++++++++++++++++ .../PermissionLimitation.java | 52 +++++++++++++ .../LimitationManager/PlayerLimitation.java | 13 +++- .../LimitationManager/WorldLimitation.java | 2 +- .../Ste3et_C0st/FurnitureLib/main/Type.java | 3 +- .../src/main/resources/config.yml | 4 +- .../executionHistory/executionHistory.lock | Bin 17 -> 17 bytes .../buildOutputCleanup.lock | Bin 17 -> 17 bytes 14 files changed, 170 insertions(+), 45 deletions(-) create mode 100644 FurnitureLib-Core/src/main/java/de/Ste3et_C0st/FurnitureLib/LimitationManager/PermissionKitLimit.java create mode 100644 FurnitureLib-Core/src/main/java/de/Ste3et_C0st/FurnitureLib/LimitationManager/PermissionLimitation.java diff --git a/.gradle/7.2/fileHashes/fileHashes.lock b/.gradle/7.2/fileHashes/fileHashes.lock index 1e09c74d8c56af6dc84680e0f662ac3b38937c36..bc8057284b0c11459e354000f7e86d1ba93a8a59 100644 GIT binary patch literal 17 WcmZR+8NTkp`M*207(jq&wFm%4hz2qM literal 17 WcmZR+8NTkp`M*207(jrj?I{394+h=< diff --git a/.gradle/checksums/checksums.lock b/.gradle/checksums/checksums.lock index 8983f179698ddbb7d48a37eb07fd9b4e73f1cb37..77435b5f2e2505651950baec18e54fa5cd7d6fea 100644 GIT binary patch literal 17 VcmZSP&(z<0PD6Ah0~qi}001T*1A_nn literal 17 VcmZSP&(z<0PD6Ah0~qjo001Tr19JcX diff --git a/FurnitureLib-Core/src/main/java/de/Ste3et_C0st/FurnitureLib/Crafting/Project.java b/FurnitureLib-Core/src/main/java/de/Ste3et_C0st/FurnitureLib/Crafting/Project.java index 7e10f906..1841be56 100644 --- a/FurnitureLib-Core/src/main/java/de/Ste3et_C0st/FurnitureLib/Crafting/Project.java +++ b/FurnitureLib-Core/src/main/java/de/Ste3et_C0st/FurnitureLib/Crafting/Project.java @@ -354,4 +354,8 @@ public ObjectID createObjectID(Location location) { public ObjectID spawnProject(Location location) { return FurnitureLib.getInstance().spawn(this, location); } + + public String toString() { + return this.getSystemID(); + } } diff --git a/FurnitureLib-Core/src/main/java/de/Ste3et_C0st/FurnitureLib/LimitationManager/ChunkLimitation.java b/FurnitureLib-Core/src/main/java/de/Ste3et_C0st/FurnitureLib/LimitationManager/ChunkLimitation.java index 05d69035..90d7d96b 100644 --- a/FurnitureLib-Core/src/main/java/de/Ste3et_C0st/FurnitureLib/LimitationManager/ChunkLimitation.java +++ b/FurnitureLib-Core/src/main/java/de/Ste3et_C0st/FurnitureLib/LimitationManager/ChunkLimitation.java @@ -2,6 +2,7 @@ import java.util.Arrays; import java.util.List; +import java.util.OptionalInt; import java.util.function.Predicate; import org.bukkit.Location; @@ -14,7 +15,7 @@ import de.Ste3et_C0st.FurnitureLib.main.ObjectID; import de.Ste3et_C0st.FurnitureLib.main.Type.LimitationType; -public class ChunkLimitation extends Limitation{ +public class ChunkLimitation extends PermissionKitLimit{ private static final String KEY = "Chunk"; private static final String headString = KEY + "Limit"; @@ -28,15 +29,21 @@ public ChunkLimitation() { public int getAmount(Predicate predicate) { return (int) FurnitureManager.getInstance().getAllExistObjectIDs().filter(predicate).count(); } + + @Override + public int getLimit(Project project, Location location, Player player) { + OptionalInt kitLimit = super.getKitLimit(project, location, player); + return kitLimit.isPresent() ? kitLimit.getAsInt() : super.getLimit(project, location, player); + } @Override public boolean canPlace(Location location, Project project, Player player) { - return getAmount(buildFilter(location, project, player)) < getLimit(project, location); + return getAmount(buildFilter(location, project, player)) < getLimit(project, location, player); } @Override public void writeConfig() { - final List headerConfig = Arrays.asList( + List headerConfig = Arrays.asList( "This is the ChunkLimitation file", "You can limit the max amount of Furnitures each chunk", "total.enable = (bool) | set default value for each project", diff --git a/FurnitureLib-Core/src/main/java/de/Ste3et_C0st/FurnitureLib/LimitationManager/Limitation.java b/FurnitureLib-Core/src/main/java/de/Ste3et_C0st/FurnitureLib/LimitationManager/Limitation.java index 73fa60e9..a62d2b5a 100644 --- a/FurnitureLib-Core/src/main/java/de/Ste3et_C0st/FurnitureLib/LimitationManager/Limitation.java +++ b/FurnitureLib-Core/src/main/java/de/Ste3et_C0st/FurnitureLib/LimitationManager/Limitation.java @@ -2,6 +2,7 @@ import java.io.File; import java.io.IOException; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Objects; @@ -13,8 +14,11 @@ import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; +import com.google.common.collect.Lists; + import de.Ste3et_C0st.FurnitureLib.Crafting.Project; import de.Ste3et_C0st.FurnitureLib.main.FurnitureConfig; +import de.Ste3et_C0st.FurnitureLib.main.FurnitureLib; import de.Ste3et_C0st.FurnitureLib.main.ObjectID; import de.Ste3et_C0st.FurnitureLib.main.Type; import de.Ste3et_C0st.FurnitureLib.main.Type.LimitationType; @@ -47,20 +51,22 @@ protected File getFile() { } public YamlConfiguration loadYaml() { - return this.loadYaml(""); - } - - public YamlConfiguration loadYaml(final List headerList) { - final String headerString = String.join("\n", headerList.toArray(new String[headerList.size()])); - return this.loadYaml(headerString); + return this.loadYaml(Lists.newArrayList()); } @SuppressWarnings("deprecation") - public YamlConfiguration loadYaml(String headerString) { + public YamlConfiguration loadYaml(List headerList) { final YamlConfiguration configuration = YamlConfiguration.loadConfiguration(getFile()); configuration.options().copyDefaults(true); configuration.options().copyHeader(true); - configuration.options().header(headerString); + if(headerList.isEmpty() == false) { + if(FurnitureLib.getVersionInt() > 18) { + configuration.options().setHeader(headerList); + }else { + final String headerString = String.join("\n", headerList.toArray(new String[headerList.size()])); + configuration.options().header(headerString); + } + } return configuration; } @@ -109,10 +115,10 @@ protected void save(YamlConfiguration configuration, File file) { } public Optional buildInforamtion(Player player, Location location, Project project) { - return Optional.of(new LimitationInforamtion(getEnum().name().toLowerCase(), getLimit(project, location), getAmount(buildFilter(location, project, player)))); + return Optional.of(new LimitationInforamtion(getEnum().name().toLowerCase(), getLimit(project, location, player), getAmount(buildFilter(location, project, player)))); } - public int getLimit(Project project, Location location) { + public int getLimit(Project project, Location location, Player player) { if(getEnum() == LimitationType.WORLD) { final String world = location.getWorld().getName(); return worldMap.getOrDefault(world, -1); diff --git a/FurnitureLib-Core/src/main/java/de/Ste3et_C0st/FurnitureLib/LimitationManager/LimitationManager.java b/FurnitureLib-Core/src/main/java/de/Ste3et_C0st/FurnitureLib/LimitationManager/LimitationManager.java index c8585481..f59b4441 100644 --- a/FurnitureLib-Core/src/main/java/de/Ste3et_C0st/FurnitureLib/LimitationManager/LimitationManager.java +++ b/FurnitureLib-Core/src/main/java/de/Ste3et_C0st/FurnitureLib/LimitationManager/LimitationManager.java @@ -1,13 +1,10 @@ package de.Ste3et_C0st.FurnitureLib.LimitationManager; import de.Ste3et_C0st.FurnitureLib.Crafting.Project; -import de.Ste3et_C0st.FurnitureLib.main.FurnitureConfig; import de.Ste3et_C0st.FurnitureLib.main.FurnitureLib; -import de.Ste3et_C0st.FurnitureLib.main.FurnitureManager; import de.Ste3et_C0st.FurnitureLib.main.ObjectID; import de.Ste3et_C0st.FurnitureLib.main.Type.LimitationType; -import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.entity.Player; @@ -21,7 +18,7 @@ public class LimitationManager { - private final List limitationListener = Arrays.asList(new ChunkLimitation(), new WorldLimitation(), new PlayerLimitation()); + private final List limitationListener = Arrays.asList(new ChunkLimitation(), new WorldLimitation(), new PlayerLimitation(), new PermissionLimitation()); private boolean global = false; public LimitationManager(FurnitureLib lib, LimitationType ... limitationType) { @@ -46,10 +43,6 @@ public boolean isGlobal() { return this.global; } - private Integer returnIntProjectTotal(Player p) { - return FurnitureManager.getInstance().getFromPlayer(p.getUniqueId()).size(); - } - public boolean canPlace(Player player, ObjectID obj) { if (player.isOp()) return true; if (FurnitureLib.getInstance().getPermission().hasPerm(player, "furniture.admin")) return true; @@ -59,28 +52,12 @@ public boolean canPlace(Player player, ObjectID obj) { final Location location = obj.getStartLocation(); if(Objects.isNull(project)) return false; - final int limitGlobal = FurnitureConfig.getFurnitureConfig().getLimitGlobal(); final List informationList = new ArrayList(); - if(limitGlobal > 1) { - int playerTotal = returnIntProjectTotal(player); - if (limitGlobal > 0) { - //Bukkit.broadcastMessage("[DEBUG] config.yml limit: " + limitGlobal); - for (int i = limitGlobal; i > 0; i--) { - if (player.hasPermission("furniture.globallimit." + i)) { - informationList.add(new LimitationInforamtion("permission", i, playerTotal)); - //Bukkit.broadcastMessage("[DEBUG] config.yml limit: ✅"); - break; - } - } - } - } - limitationListener.stream().filter(Limitation::isActivate).forEach(entry -> { - final int maxSize = entry.getLimit(project, location), amountSize = entry.getAmount(entry.buildFilter(obj.getStartLocation(), project, player)); + final int maxSize = entry.getLimit(project, location, player), amountSize = entry.getAmount(entry.buildFilter(obj.getStartLocation(), project, player)); final Optional inforamtion = entry.buildInforamtion(player, obj.getStartLocation(), project); if(inforamtion.isPresent()) informationList.add(inforamtion.get()); - //Bukkit.broadcastMessage("[§7DEBUG§f] Limit Type {§d" + entry.getEnum().name() +"}: §a" + amountSize + "§f/§e" + maxSize + ":" + (inforamtion.isPresent() ? "§cX" : "§2✅")); FurnitureLib.debug("LimitationManager -> {" + entry.getEnum().name() + "} " + amountSize + "/" + maxSize + " passed"); }); diff --git a/FurnitureLib-Core/src/main/java/de/Ste3et_C0st/FurnitureLib/LimitationManager/PermissionKitLimit.java b/FurnitureLib-Core/src/main/java/de/Ste3et_C0st/FurnitureLib/LimitationManager/PermissionKitLimit.java new file mode 100644 index 00000000..41cf0837 --- /dev/null +++ b/FurnitureLib-Core/src/main/java/de/Ste3et_C0st/FurnitureLib/LimitationManager/PermissionKitLimit.java @@ -0,0 +1,71 @@ +package de.Ste3et_C0st.FurnitureLib.LimitationManager; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.OptionalInt; +import java.util.function.Supplier; +import java.util.stream.Collectors; + +import org.bukkit.Location; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.entity.Player; + +import de.Ste3et_C0st.FurnitureLib.Crafting.Project; +import de.Ste3et_C0st.FurnitureLib.main.Type.LimitationType; + +public abstract class PermissionKitLimit extends Limitation{ + + private static final String KEY = "Permission"; + private static final String headString = KEY + "Kit"; + private static final String PERMISSION = "furniture.limit."; + + private HashMap> kitMap = new HashMap<>(); + + private Supplier permissionConsumer = () -> PERMISSION + getEnum().name().toLowerCase() + "."; + + public PermissionKitLimit(LimitationType type) { + super(type); + } + + public YamlConfiguration loadYaml(List headerList) { + if(headerList.isEmpty() == false) { + List headerConfig = new ArrayList<>(); + headerConfig.addAll(headerList); + headerConfig.addAll(Arrays.asList( + "----------------------", + "These Limitation type support permission Kits!", + "PermissionKit:", + " :", + " chair: -1", + "---------------------", + "the permission for these kit is " + permissionConsumer.get() + )); + headerList = headerConfig; + } + return super.loadYaml(headerList); + } + + @Override + protected void ioProjectLimit(String headerString, Project project, YamlConfiguration configuration) { + if(configuration.isConfigurationSection(headString)) { + configuration.getConfigurationSection(headString).getKeys(false).forEach(key -> { + final String kit = headString + "." + key; + if(configuration.contains(kit + "." + project.getName())) { + final int amount = configuration.getInt(kit + "." + project.getName(), -1); + final HashMap kitMap = this.kitMap.getOrDefault(kit, new HashMap<>()); + kitMap.put(project, amount); + this.kitMap.put(key, kitMap); + } + }); + } + + super.ioProjectLimit(headerString, project, configuration); + } + + public OptionalInt getKitLimit(Project project, Location location, Player player) { + final List permissionMap = kitMap.keySet().stream().filter(entry -> player.hasPermission(permissionConsumer.get().replace("", entry.toLowerCase()))).collect(Collectors.toList()); + return permissionMap.stream().filter(kitMap::containsKey).map(kitMap::get).mapToInt(entry -> entry.get(project)).max(); + } +} diff --git a/FurnitureLib-Core/src/main/java/de/Ste3et_C0st/FurnitureLib/LimitationManager/PermissionLimitation.java b/FurnitureLib-Core/src/main/java/de/Ste3et_C0st/FurnitureLib/LimitationManager/PermissionLimitation.java new file mode 100644 index 00000000..0fb363e9 --- /dev/null +++ b/FurnitureLib-Core/src/main/java/de/Ste3et_C0st/FurnitureLib/LimitationManager/PermissionLimitation.java @@ -0,0 +1,52 @@ +package de.Ste3et_C0st.FurnitureLib.LimitationManager; + +import java.util.function.Predicate; + +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import de.Ste3et_C0st.FurnitureLib.Crafting.Project; +import de.Ste3et_C0st.FurnitureLib.main.FurnitureConfig; +import de.Ste3et_C0st.FurnitureLib.main.FurnitureManager; +import de.Ste3et_C0st.FurnitureLib.main.ObjectID; +import de.Ste3et_C0st.FurnitureLib.main.Type.LimitationType; + +public class PermissionLimitation extends Limitation{ + + private static final String PERMISSION = "furniture.globallimit."; + + public PermissionLimitation() { + super(LimitationType.PERMISSION); + } + + @Override + public int getAmount(Predicate projectAmount) { + return (int) FurnitureManager.getInstance().getAllExistObjectIDs().filter(projectAmount).count(); + } + + @Override + public boolean canPlace(Location location, Project project, Player player) { + return getAmount(buildFilter(location, project, player)) < getLimit(project, location, player); + } + + @Override + public int getLimit(Project project, Location location, Player player) { + for (int i = FurnitureConfig.getFurnitureConfig().getLimitGlobal(); i > 0; i--) { + if (player.hasPermission(PERMISSION + i)) { + return i; + } + } + return 0; + } + + @Override + public void writeConfig() {} + + @Override + public void updateConfig(Project project) {} + + @Override + public Predicate buildFilter(Location location, Project project, Player player) { + return objectID -> objectID.hasProjectOBJ() && objectID.getUUID().equals(player.getUniqueId()); + } +} diff --git a/FurnitureLib-Core/src/main/java/de/Ste3et_C0st/FurnitureLib/LimitationManager/PlayerLimitation.java b/FurnitureLib-Core/src/main/java/de/Ste3et_C0st/FurnitureLib/LimitationManager/PlayerLimitation.java index b691ebe5..db590c7d 100644 --- a/FurnitureLib-Core/src/main/java/de/Ste3et_C0st/FurnitureLib/LimitationManager/PlayerLimitation.java +++ b/FurnitureLib-Core/src/main/java/de/Ste3et_C0st/FurnitureLib/LimitationManager/PlayerLimitation.java @@ -2,6 +2,7 @@ import java.util.Arrays; import java.util.List; +import java.util.OptionalInt; import java.util.function.Predicate; import org.bukkit.Location; @@ -13,7 +14,7 @@ import de.Ste3et_C0st.FurnitureLib.main.ObjectID; import de.Ste3et_C0st.FurnitureLib.main.Type.LimitationType; -public class PlayerLimitation extends Limitation{ +public class PlayerLimitation extends PermissionKitLimit{ private static final String KEY = "Player"; private static final String headString = KEY + "Limit"; @@ -27,15 +28,21 @@ public PlayerLimitation() { public int getAmount(Predicate projectAmount) { return (int) FurnitureManager.getInstance().getAllExistObjectIDs().filter(projectAmount).count(); } + + @Override + public int getLimit(Project project, Location location, Player player) { + OptionalInt kitLimit = super.getKitLimit(project, location, player); + return kitLimit.isPresent() ? kitLimit.getAsInt() : super.getLimit(project, location, player); + } @Override public boolean canPlace(Location location, Project project, Player player) { - return getAmount(buildFilter(location, project, player)) < getLimit(project, location); + return getAmount(buildFilter(location, project, player)) < getLimit(project, location, player); } @Override public void writeConfig() { - final List headerConfig = Arrays.asList( + List headerConfig = Arrays.asList( "This is the PlayerLimitation file", "You can limit the max amount of Furnitures each Player", "total.enable = (bool) | set default value for each project", diff --git a/FurnitureLib-Core/src/main/java/de/Ste3et_C0st/FurnitureLib/LimitationManager/WorldLimitation.java b/FurnitureLib-Core/src/main/java/de/Ste3et_C0st/FurnitureLib/LimitationManager/WorldLimitation.java index 7e10d65f..a194602f 100644 --- a/FurnitureLib-Core/src/main/java/de/Ste3et_C0st/FurnitureLib/LimitationManager/WorldLimitation.java +++ b/FurnitureLib-Core/src/main/java/de/Ste3et_C0st/FurnitureLib/LimitationManager/WorldLimitation.java @@ -31,7 +31,7 @@ public int getAmount(Predicate predicate) { @Override public boolean canPlace(Location location, Project project, Player player) { - return getAmount(buildFilter(location, project, player)) < getLimit(project, location); + return getAmount(buildFilter(location, project, player)) < getLimit(project, location, player); } @Override diff --git a/FurnitureLib-Core/src/main/java/de/Ste3et_C0st/FurnitureLib/main/Type.java b/FurnitureLib-Core/src/main/java/de/Ste3et_C0st/FurnitureLib/main/Type.java index 71d0cf95..80c904f1 100644 --- a/FurnitureLib-Core/src/main/java/de/Ste3et_C0st/FurnitureLib/main/Type.java +++ b/FurnitureLib-Core/src/main/java/de/Ste3et_C0st/FurnitureLib/main/Type.java @@ -38,7 +38,8 @@ public enum ColorType {BLOCK, BANNER} public enum LimitationType { PLAYER, CHUNK, - WORLD; + WORLD, + PERMISSION; } public enum SQLAction { diff --git a/FurnitureLib-Core/src/main/resources/config.yml b/FurnitureLib-Core/src/main/resources/config.yml index ee074d32..6c3eb096 100644 --- a/FurnitureLib-Core/src/main/resources/config.yml +++ b/FurnitureLib-Core/src/main/resources/config.yml @@ -61,8 +61,8 @@ world-options: packetRenderMethode: false # send the furniture models if the player move packet have been triggered limit-options: - limitConfig: PLAYER # there is only these options avaiable: PLAYER, WORLD, CHUNK you can simple combine then and the FurnitureLib use the config with the lowest value limitConfig: "PLAYER,WORLD" - limitGlobal: 150 # You can give your player the permissions furniture.globallimit.# | furniture.globallimit.125 -> let the player can place 125 furnitures objects it override the limitconfig + limitConfig: PERMISSION,PLAYER # there is only these options avaiable: PERMISSION, PLAYER, WORLD, CHUNK you can simple combine then and the FurnitureLib use the config with the lowest value limitConfig: "PERMISSION,PLAYER" + limitGlobal: 150 # PERMISSION: You can give your player the permissions furniture.globallimit.# | furniture.globallimit.125 -> let the player can place 125 furnitures objects it override the limitconfig creative-options: removeItems: false # remove the item if it placed via creative diff --git a/buildSrc/.gradle/7.2/executionHistory/executionHistory.lock b/buildSrc/.gradle/7.2/executionHistory/executionHistory.lock index e0600c671a77d298136c2e80b9c0f71f6902e065..d825c0e28f46738bcebf76b7ed1c5a7ad53f7a46 100644 GIT binary patch literal 17 VcmZQxe$jdJx4`B63}7I93jjLA1zZ3C literal 17 VcmZQxe$jdJx4`B63}7Ji6aYHS1!e#M diff --git a/buildSrc/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/buildSrc/.gradle/buildOutputCleanup/buildOutputCleanup.lock index 7af7d0ba43586b7a37f93cac4255cd954b2b8e96..6d2e789f203878baef7e6749b7fa0de89bdf099b 100644 GIT binary patch literal 17 UcmZRMl@gMkSI&5x0SuVr03D?Qr2qf` literal 17 UcmZRMl@gMkSI&5x0SuVL03DqIod5s;