mirror of
https://github.com/BentoBoxWorld/Limits.git
synced 2024-09-27 14:12:57 +02:00
Rework how offsets are used.
https://github.com/BentoBoxWorld/Upgrades/issues/40 https://github.com/BentoBoxWorld/Limits/issues/117
This commit is contained in:
parent
d038269f8c
commit
360ba0b2de
@ -209,6 +209,13 @@ public class BlockLimitsListener implements Listener {
|
|||||||
notify(e, User.getInstance(e.getPlayer()), process(e.getBlock(), true), e.getBlock().getType());
|
notify(e, User.getInstance(e.getPlayer()), process(e.getBlock(), true), e.getBlock().getType());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cancel the event and notify the user of failure
|
||||||
|
* @param e event
|
||||||
|
* @param user user
|
||||||
|
* @param limit maximum limit allowed
|
||||||
|
* @param m material
|
||||||
|
*/
|
||||||
private void notify(Cancellable e, User user, int limit, Material m) {
|
private void notify(Cancellable e, User user, int limit, Material m) {
|
||||||
if (limit > -1) {
|
if (limit > -1) {
|
||||||
user.notify("block-limits.hit-limit",
|
user.notify("block-limits.hit-limit",
|
||||||
@ -389,18 +396,18 @@ public class BlockLimitsListener implements Listener {
|
|||||||
*/
|
*/
|
||||||
private int checkLimit(World w, Material m, String id) {
|
private int checkLimit(World w, Material m, String id) {
|
||||||
// Check island limits
|
// Check island limits
|
||||||
IslandBlockCount island = islandCountMap.get(id);
|
IslandBlockCount ibc = islandCountMap.get(id);
|
||||||
if (island.isBlockLimited(m)) {
|
if (ibc.isBlockLimited(m)) {
|
||||||
return island.isAtLimit(m) ? island.getBlockLimit(m) : -1;
|
return ibc.isAtLimit(m) ? ibc.getBlockLimit(m) + ibc.getBlockLimitOffset(m) : -1;
|
||||||
}
|
}
|
||||||
// Check specific world limits
|
// Check specific world limits
|
||||||
if (worldLimitMap.containsKey(w) && worldLimitMap.get(w).containsKey(m)) {
|
if (worldLimitMap.containsKey(w) && worldLimitMap.get(w).containsKey(m)) {
|
||||||
// Material is overridden in world
|
// Material is overridden in world
|
||||||
return island.isAtLimit(m, worldLimitMap.get(w).get(m)) ? worldLimitMap.get(w).get(m) : -1;
|
return ibc.isAtLimit(m, worldLimitMap.get(w).get(m)) ? worldLimitMap.get(w).get(m) + ibc.getBlockLimitOffset(m) : -1;
|
||||||
}
|
}
|
||||||
// Check default limit map
|
// Check default limit map
|
||||||
if (defaultLimitMap.containsKey(m) && island.isAtLimit(m, defaultLimitMap.get(m))) {
|
if (defaultLimitMap.containsKey(m) && ibc.isAtLimit(m, defaultLimitMap.get(m))) {
|
||||||
return defaultLimitMap.get(m);
|
return defaultLimitMap.get(m) + ibc.getBlockLimitOffset(m);
|
||||||
}
|
}
|
||||||
// No limit
|
// No limit
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -30,6 +30,7 @@ import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason;
|
|||||||
import org.bukkit.event.entity.EntityBreedEvent;
|
import org.bukkit.event.entity.EntityBreedEvent;
|
||||||
import org.bukkit.event.hanging.HangingPlaceEvent;
|
import org.bukkit.event.hanging.HangingPlaceEvent;
|
||||||
import org.bukkit.event.vehicle.VehicleCreateEvent;
|
import org.bukkit.event.vehicle.VehicleCreateEvent;
|
||||||
|
import org.eclipse.jdt.annotation.Nullable;
|
||||||
|
|
||||||
import world.bentobox.bentobox.BentoBox;
|
import world.bentobox.bentobox.BentoBox;
|
||||||
import world.bentobox.bentobox.api.localization.TextVariables;
|
import world.bentobox.bentobox.api.localization.TextVariables;
|
||||||
@ -39,6 +40,7 @@ import world.bentobox.bentobox.util.Util;
|
|||||||
import world.bentobox.limits.Limits;
|
import world.bentobox.limits.Limits;
|
||||||
import world.bentobox.limits.Settings;
|
import world.bentobox.limits.Settings;
|
||||||
import world.bentobox.limits.Settings.EntityGroup;
|
import world.bentobox.limits.Settings.EntityGroup;
|
||||||
|
import world.bentobox.limits.objects.IslandBlockCount;
|
||||||
|
|
||||||
public class EntityLimitListener implements Listener {
|
public class EntityLimitListener implements Listener {
|
||||||
private static final String MOD_BYPASS = "mod.bypass";
|
private static final String MOD_BYPASS = "mod.bypass";
|
||||||
@ -369,11 +371,16 @@ public class EntityLimitListener implements Listener {
|
|||||||
// Check island settings first
|
// Check island settings first
|
||||||
int limitAmount = -1;
|
int limitAmount = -1;
|
||||||
Map<Settings.EntityGroup, Integer> groupsLimits = new HashMap<>();
|
Map<Settings.EntityGroup, Integer> groupsLimits = new HashMap<>();
|
||||||
if (addon.getBlockLimitListener().getIsland(island.getUniqueId()) != null) {
|
|
||||||
limitAmount = addon.getBlockLimitListener().getIsland(island.getUniqueId()).getEntityLimit(ent.getType());
|
@Nullable
|
||||||
|
IslandBlockCount ibc = addon.getBlockLimitListener().getIsland(island.getUniqueId());
|
||||||
|
if (ibc != null) {
|
||||||
|
// Get the limit amount for this type
|
||||||
|
limitAmount = ibc.getEntityLimit(ent.getType());
|
||||||
|
// Handle entity groups
|
||||||
List<Settings.EntityGroup> groupdefs = addon.getSettings().getGroupLimits().getOrDefault(ent.getType(), new ArrayList<>());
|
List<Settings.EntityGroup> groupdefs = addon.getSettings().getGroupLimits().getOrDefault(ent.getType(), new ArrayList<>());
|
||||||
groupdefs.forEach(def -> {
|
groupdefs.forEach(def -> {
|
||||||
int limit = addon.getBlockLimitListener().getIsland(island.getUniqueId()).getEntityGroupLimit(def.getName());
|
int limit = ibc.getEntityGroupLimit(def.getName());
|
||||||
if (limit >= 0)
|
if (limit >= 0)
|
||||||
groupsLimits.put(def, limit);
|
groupsLimits.put(def, limit);
|
||||||
});
|
});
|
||||||
@ -382,12 +389,15 @@ public class EntityLimitListener implements Listener {
|
|||||||
if (limitAmount < 0 && addon.getSettings().getLimits().containsKey(ent.getType())) {
|
if (limitAmount < 0 && addon.getSettings().getLimits().containsKey(ent.getType())) {
|
||||||
limitAmount = addon.getSettings().getLimits().get(ent.getType());
|
limitAmount = addon.getSettings().getLimits().get(ent.getType());
|
||||||
}
|
}
|
||||||
|
// Group limits
|
||||||
if (addon.getSettings().getGroupLimits().containsKey(ent.getType())) {
|
if (addon.getSettings().getGroupLimits().containsKey(ent.getType())) {
|
||||||
addon.getSettings().getGroupLimits().getOrDefault(ent.getType(), new ArrayList<>()).stream()
|
addon.getSettings().getGroupLimits().getOrDefault(ent.getType(), new ArrayList<>()).stream()
|
||||||
.filter(group -> !groupsLimits.containsKey(group) || groupsLimits.get(group) > group.getLimit())
|
.filter(group -> !groupsLimits.containsKey(group) || groupsLimits.get(group) > group.getLimit())
|
||||||
.forEach(group -> groupsLimits.put(group, group.getLimit()));
|
.forEach(group -> groupsLimits.put(group, group.getLimit()));
|
||||||
}
|
}
|
||||||
if (limitAmount < 0 && groupsLimits.isEmpty()) return new AtLimitResult();
|
if (limitAmount < 0 && groupsLimits.isEmpty()) {
|
||||||
|
return new AtLimitResult();
|
||||||
|
}
|
||||||
|
|
||||||
// We have to count the entities
|
// We have to count the entities
|
||||||
if (limitAmount >= 0)
|
if (limitAmount >= 0)
|
||||||
@ -396,14 +406,16 @@ public class EntityLimitListener implements Listener {
|
|||||||
.filter(e -> e.getType().equals(ent.getType()))
|
.filter(e -> e.getType().equals(ent.getType()))
|
||||||
.filter(e -> island.inIslandSpace(e.getLocation()))
|
.filter(e -> island.inIslandSpace(e.getLocation()))
|
||||||
.count();
|
.count();
|
||||||
if (count >= limitAmount) {
|
int max = limitAmount + ibc.getEntityLimitOffset(ent.getType());
|
||||||
return new AtLimitResult(ent.getType(), limitAmount);
|
if (count >= max) {
|
||||||
|
return new AtLimitResult(ent.getType(), max);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Merge in any permission-based limits
|
// Group limits
|
||||||
if (addon.getBlockLimitListener().getIsland(island.getUniqueId()) != null) {
|
if (ibc != null) {
|
||||||
Map<String, EntityGroup> groupbyname = groupsLimits.keySet().stream().collect(Collectors.toMap(EntityGroup::getName, e -> e));
|
Map<String, EntityGroup> groupbyname = groupsLimits.keySet().stream()
|
||||||
addon.getBlockLimitListener().getIsland(island.getUniqueId()).getEntityGroupLimits().entrySet().stream()
|
.collect(Collectors.toMap(EntityGroup::getName, e -> e));
|
||||||
|
ibc.getEntityGroupLimits().entrySet().stream()
|
||||||
.filter(e -> groupbyname.containsKey(e.getKey()))
|
.filter(e -> groupbyname.containsKey(e.getKey()))
|
||||||
.forEach(e -> groupsLimits.put(groupbyname.get(e.getKey()), e.getValue()));
|
.forEach(e -> groupsLimits.put(groupbyname.get(e.getKey()), e.getValue()));
|
||||||
}
|
}
|
||||||
@ -414,8 +426,10 @@ public class EntityLimitListener implements Listener {
|
|||||||
int count = (int) ent.getWorld().getEntities().stream()
|
int count = (int) ent.getWorld().getEntities().stream()
|
||||||
.filter(e -> group.getKey().contains(e.getType()))
|
.filter(e -> group.getKey().contains(e.getType()))
|
||||||
.filter(e -> island.inIslandSpace(e.getLocation())).count();
|
.filter(e -> island.inIslandSpace(e.getLocation())).count();
|
||||||
if (count >= group.getValue())
|
int max = group.getValue() + ibc.getEntityGroupLimitOffset(group.getKey().getName());
|
||||||
return new AtLimitResult(group.getKey(), group.getValue());
|
if (count >= max) {
|
||||||
|
return new AtLimitResult(group.getKey(), max);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return new AtLimitResult();
|
return new AtLimitResult();
|
||||||
}
|
}
|
||||||
|
@ -127,7 +127,7 @@ public class IslandBlockCount implements DataObject {
|
|||||||
* @return true if count is >= limit
|
* @return true if count is >= limit
|
||||||
*/
|
*/
|
||||||
public boolean isAtLimit(Material material, int limit) {
|
public boolean isAtLimit(Material material, int limit) {
|
||||||
return blockCounts.getOrDefault(material, 0) >= limit;
|
return blockCounts.getOrDefault(material, 0) >= limit + this.getBlockLimitOffset(material);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -137,7 +137,7 @@ public class IslandBlockCount implements DataObject {
|
|||||||
*/
|
*/
|
||||||
public boolean isAtLimit(Material m) {
|
public boolean isAtLimit(Material m) {
|
||||||
// Check island limits first
|
// Check island limits first
|
||||||
return blockLimits.containsKey(m) && blockCounts.getOrDefault(m, 0) >= getBlockLimit(m);
|
return blockLimits.containsKey(m) && blockCounts.getOrDefault(m, 0) >= getBlockLimit(m) + this.getBlockLimitOffset(m);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isBlockLimited(Material m) {
|
public boolean isBlockLimited(Material m) {
|
||||||
@ -164,8 +164,17 @@ public class IslandBlockCount implements DataObject {
|
|||||||
* @param m - material
|
* @param m - material
|
||||||
* @return limit or -1 for unlimited
|
* @return limit or -1 for unlimited
|
||||||
*/
|
*/
|
||||||
public Integer getBlockLimit(Material m) {
|
public int getBlockLimit(Material m) {
|
||||||
return blockLimits.getOrDefault(m, -1) + getBlockLimitsOffset().getOrDefault(m, 0);
|
return blockLimits.getOrDefault(m, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the block offset for this material for this island
|
||||||
|
* @param m - material
|
||||||
|
* @return offset
|
||||||
|
*/
|
||||||
|
public int getBlockLimitOffset(Material m) {
|
||||||
|
return getBlockLimitsOffset().getOrDefault(m, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -228,7 +237,16 @@ public class IslandBlockCount implements DataObject {
|
|||||||
* @return limit or -1 for unlimited
|
* @return limit or -1 for unlimited
|
||||||
*/
|
*/
|
||||||
public int getEntityLimit(EntityType t) {
|
public int getEntityLimit(EntityType t) {
|
||||||
return entityLimits.getOrDefault(t, -1) + getEntityLimitsOffset().getOrDefault(t, 0);
|
return entityLimits.getOrDefault(t, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the limit offset for an entity type
|
||||||
|
* @param t - entity type
|
||||||
|
* @return offset
|
||||||
|
*/
|
||||||
|
public int getEntityLimitOffset(EntityType t) {
|
||||||
|
return getEntityLimitsOffset().getOrDefault(t, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -270,7 +288,16 @@ public class IslandBlockCount implements DataObject {
|
|||||||
* @return limit or -1 for unlimited
|
* @return limit or -1 for unlimited
|
||||||
*/
|
*/
|
||||||
public int getEntityGroupLimit(String name) {
|
public int getEntityGroupLimit(String name) {
|
||||||
return entityGroupLimits.getOrDefault(name, -1) + getEntityGroupLimitsOffset().getOrDefault(name, 0);
|
return entityGroupLimits.getOrDefault(name, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the offset for an entity group
|
||||||
|
* @param name - entity group
|
||||||
|
* @return offset
|
||||||
|
*/
|
||||||
|
public int getEntityGroupLimitOffset(String name) {
|
||||||
|
return getEntityGroupLimitsOffset().getOrDefault(name, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user