Skip to content

Commit

Permalink
v2.2.0
Browse files Browse the repository at this point in the history
- Added individual scanning
- Fixed %world% placeholder in scanworld locale
  • Loading branch information
FrankHeijden committed May 27, 2019
1 parent 16904b6 commit 54cbea1
Show file tree
Hide file tree
Showing 9 changed files with 500 additions and 59 deletions.
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

<groupId>net.frankheijden</groupId>
<artifactId>blocklimiter</artifactId>
<version>2.1.1</version>
<version>2.2.0</version>
<name>BlockLimiter</name>

<build>
Expand Down
6 changes: 3 additions & 3 deletions src/main/java/net/frankheijden/blocklimiter/Listeners.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,10 @@ public void onBlockBreak(BlockBreakEvent event) {
MemorySection materials = (MemorySection) plugin.config.get("general.materials");
if (materials != null) {
for (String materialString : materials.getKeys(false)) {
Material material = Material.valueOf(materialString);
Material material = Material.getMaterial(materialString);
if (event.getBlock().getType() == material) {
int limit = plugin.config.getInt("general.materials." + materialString);
int current = plugin.utils.getAmountInChunk(event.getBlock().getChunk(), material, true);
int current = plugin.utils.updateCachedAmountInChunk(event.getBlock().getChunk(), material, true);

if (player.hasPermission("blocklimiter.check.realtime") && plugin.sqLite.hasRealtimeCheckEnabled(player)) {
plugin.utils.sendActionBar(player, "messages.realtime_check_custom", "%count%", String.valueOf(current), "%material%", plugin.utils.capitalizeName(material.name().toLowerCase()), "%limit%", String.valueOf(limit));
Expand All @@ -55,7 +55,7 @@ public void onBlockPlace(BlockPlaceEvent event) {
Material material = Material.valueOf(materialString);
if (event.getBlockPlaced().getType() == material) {
int limit = plugin.config.getInt("general.materials." + materialString);
int current = plugin.utils.getAmountInChunk(event.getBlockPlaced().getChunk(), material, false);
int current = plugin.utils.updateCachedAmountInChunk(event.getBlockPlaced().getChunk(), material, false);
if (current > limit) {
if (!player.hasPermission("blocklimiter.bypass." + materialString)) {
String n = event.getBlockPlaced().getChunk().getX() + "_" + event.getBlockPlaced().getChunk().getZ();
Expand Down
88 changes: 72 additions & 16 deletions src/main/java/net/frankheijden/blocklimiter/Utils.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;

import java.io.File;
Expand Down Expand Up @@ -48,26 +49,42 @@ public Set<Map.Entry<String, Integer>> getEntitiesAndTilesInChunk(Chunk chunk) {
return entryTreeMap.entrySet();
}

public int getAmountInChunk(Chunk chunk, Material material, Boolean isBreak) {
String chunkName = chunk.getX() + "_" + chunk.getZ();

if (plugin.chunkSnapshotHashMap.containsKey(chunkName)) {
HashMap<Material, Integer> materials = plugin.chunkSnapshotHashMap.get(chunkName);
int newCount;
Integer i = materials.get(material);
i = (i == null ? 0 : i);
if (!isBreak) {
newCount = i + 1;
} else {
newCount = i - 1;
public ChunkSnapshot[][] getChunkSnapshots(Chunk centerChunk, int radius) {
ChunkSnapshot[][] snapshots = new ChunkSnapshot[2 * radius + 1][2 * radius + 1];
for (int x = 0; x < snapshots.length; x++) {
for (int z = 0; z < snapshots[0].length; z++) {
snapshots[x][z] = null;
}
}

materials.put(material, newCount);
plugin.chunkSnapshotHashMap.put(chunkName, materials);
World world = centerChunk.getWorld();
int minX = centerChunk.getX() - radius;
int minZ = centerChunk.getZ() - radius;
for (int x = 0; x < snapshots.length; x++) {
for (int z = 0; z < snapshots[0].length; z++) {
if (snapshots[x][z] != null) continue;

return newCount;
Chunk chunk = world.getChunkAt(x + minX, z + minZ);
if (chunk.isLoaded() || chunk.load(true)) {
ChunkSnapshot snapshot = chunk.getChunkSnapshot();
snapshots[x][z] = snapshot;
}
}
}
return snapshots;
}

public int getAmountInChunk(Chunk chunk, EntityType entityType) {
int count = 0;
for (Entity entity : chunk.getEntities()) {
if (entity.getType() == entityType) {
count++;
}
}
return count;
}

public int getAmountInChunk(Chunk chunk, Material material) {
ChunkSnapshot chunkSnapshot = chunk.getChunkSnapshot();

int count = 0;
Expand All @@ -80,13 +97,52 @@ public int getAmountInChunk(Chunk chunk, Material material, Boolean isBreak) {
}
}
}
return count;
}

public int updateCachedAmountInChunk(Chunk chunk, Material material, Boolean isBreak) {
String chunkName = chunk.getX() + "_" + chunk.getZ();

if (plugin.chunkSnapshotHashMap.containsKey(chunkName) && plugin.chunkSnapshotHashMap.get(chunkName).containsKey(material)) {
HashMap<Material, Integer> materials = plugin.chunkSnapshotHashMap.get(chunkName);
Integer i = materials.get(material);
int newCount = (i == null ? 0 : i);
if (isBreak != null) {
if (!isBreak) {
newCount = newCount + 1;
} else {
newCount = newCount - 1;
}
}

materials.put(material, newCount);
plugin.chunkSnapshotHashMap.put(chunkName, materials);

return newCount;
}

HashMap<Material, Integer> materials = new HashMap<>();
int count = getAmountInChunk(chunk, material);

HashMap<Material, Integer> materials;
if (plugin.chunkSnapshotHashMap.containsKey(chunkName)) {
materials = plugin.chunkSnapshotHashMap.get(chunkName);
} else {
materials = new HashMap<>();
}
materials.put(material, count);
plugin.chunkSnapshotHashMap.put(chunkName, materials);

return count;
}

public EntityType getEntityType(String entityType) {
try {
return EntityType.valueOf(entityType);
} catch (IllegalArgumentException ignored) {
//
}
return null;
}

public Material getMaterial(ChunkSnapshot chunkSnapshot, int x, int y, int z) {
try {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@

import net.frankheijden.blocklimiter.BlockLimiter;
import org.bukkit.Chunk;
import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabExecutor;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import org.bukkit.util.StringUtil;

Expand Down Expand Up @@ -87,6 +89,29 @@ public boolean onCommand(CommandSender sender, Command cmd, String label, String
}
return true;
}
} else if (args.length == 2) {
if (args[0].equalsIgnoreCase("individual")) {
Material material = Material.getMaterial(args[1]);
EntityType entityType = plugin.utils.getEntityType(args[1]);
if (material != null) {
if (player.hasPermission("blocklimiter.scan.individual. " + material.name())) {
int materialCount = plugin.utils.getAmountInChunk(player.getLocation().getChunk(), material);
plugin.utils.sendMessage(player, "messages.scan.individual.total", "%entry%", plugin.utils.capitalizeName(material.name().toLowerCase()), "%count%", String.valueOf(materialCount));
} else {
plugin.utils.sendMessage(player, "messages.no_permission");
}
} else if (entityType != null) {
if (player.hasPermission("blocklimiter.scan.individual. " + entityType.name())) {
int entityCount = plugin.utils.getAmountInChunk(player.getLocation().getChunk(), entityType);
plugin.utils.sendMessage(player, "messages.scan.individual.total", "%entry%", plugin.utils.capitalizeName(entityType.name().toLowerCase()), "%count%", String.valueOf(entityCount));
} else {
plugin.utils.sendMessage(player, "messages.scan.individual");
}
} else {
plugin.utils.sendMessage(player, "messages.scan.individual.invalid_argument");
}
return true;
}
}
} else {
sender.sendMessage("This command cannot be executed from console!");
Expand All @@ -102,10 +127,41 @@ public List<String> onTabComplete(CommandSender sender, Command cmd, String labe
if (sender.hasPermission("blocklimiter.scan.entity")) {
list.add("entity");
}
for (Material material : Material.values()) {
if (material.isBlock()) {
if (sender.hasPermission("blocklimiter.scan.individual." + material.name())) {
list.add("individual");
break;
}
}
}
if (!list.contains("individual")) {
for (EntityType entityType : EntityType.values()) {
if (sender.hasPermission("blocklimiter.scan.individual." + entityType.name())) {
list.add("individual");
break;
}
}
}
if (sender.hasPermission("blocklimiter.scan.tile")) {
list.add("tile");
}
return StringUtil.copyPartialMatches(args[0], list, new ArrayList<>());
} else if (args.length == 2 && args[0].equalsIgnoreCase("individual") && args[1].length() > 0) {
List<String> list = new ArrayList<>();
for (Material material : Material.values()) {
if (material.isBlock()) {
if (sender.hasPermission("blocklimiter.scan.individual." + material.name())) {
list.add(material.name());
}
}
}
for (EntityType entityType : EntityType.values()) {
if (sender.hasPermission("blocklimiter.scan.individual." + entityType.name())) {
list.add(entityType.name());
}
}
return StringUtil.copyPartialMatches(args[1], list, new ArrayList<>());
}
return Collections.emptyList();
}
Expand Down
Loading

0 comments on commit 54cbea1

Please sign in to comment.