Add support for Wild Stacker (#124)

* Add support for Wild Stackers (Blocks Only)

* Shorten my recent commit, modified checkBlock method slightly to not pass full BlockData; rather just the Material that is used in the method
This commit is contained in:
Dalton Burchard 2020-01-28 08:32:52 -08:00 committed by tastybento
parent 1de94afe7e
commit f779f0ca95
3 changed files with 46 additions and 9 deletions

11
pom.xml
View File

@ -147,6 +147,11 @@
<id>codemc-public</id>
<url>https://repo.codemc.org/repository/maven-public/</url>
</repository>
<!--Wild Stacker repo-->
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
<dependencies>
@ -182,6 +187,12 @@
<version>${bentobox.version}</version>
<scope>provided</scope>
</dependency>
<!-- Wild Stacker dependency-->
<dependency>
<groupId>com.github.OmerBenGera</groupId>
<artifactId>WildStackerAPI</artifactId>
<version>b17</version>
</dependency>
</dependencies>
<build>

View File

@ -13,6 +13,7 @@ import world.bentobox.bentobox.api.addons.Addon;
import world.bentobox.bentobox.api.user.User;
import world.bentobox.bentobox.database.Database;
import world.bentobox.bentobox.database.objects.Island;
import world.bentobox.level.calculators.CalcIslandLevel;
import world.bentobox.level.commands.admin.AdminLevelCommand;
import world.bentobox.level.commands.admin.AdminTopCommand;
import world.bentobox.level.commands.island.IslandLevelCommand;
@ -199,6 +200,13 @@ public class Level extends Addon {
registerRequestHandler(new LevelRequestHandler(this));
registerRequestHandler(new TopTenRequestHandler(this));
// Check if WildStackers is enabled on the server
if (getPlugin().getServer().getPluginManager().getPlugin("WildStacker") != null) {
// I only added support for counting blocks into the island level
// Someone else can PR if they want spawners added to the Leveling system :)
CalcIslandLevel.stackersEnabled = true;
} else CalcIslandLevel.stackersEnabled = false;
// Done
}

View File

@ -13,12 +13,15 @@ import java.util.UUID;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
import com.bgsoftware.wildstacker.api.WildStackerAPI;
import com.bgsoftware.wildstacker.api.objects.StackedBarrel;
import org.bukkit.Bukkit;
import org.bukkit.Chunk;
import org.bukkit.ChunkSnapshot;
import org.bukkit.Material;
import org.bukkit.Tag;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.block.data.BlockData;
import org.bukkit.block.data.type.Slab;
@ -37,7 +40,8 @@ public class CalcIslandLevel {
private static final String LINE_BREAK = "==================================";
public static final long MAX_AMOUNT = 10000;
public static final long MAX_AMOUNT = 10000;
public static Boolean stackersEnabled;
private final Level addon;
@ -122,7 +126,7 @@ public class CalcIslandLevel {
ChunkSnapshot snapShot = ch.getChunkSnapshot();
Bukkit.getScheduler().runTaskAsynchronously(addon.getPlugin(), () -> {
this.scanChunk(snapShot);
this.scanChunk(snapShot, ch);
count.getAndIncrement();
if (count.get() == total) {
Bukkit.getScheduler().cancelTask(queueid);
@ -131,7 +135,7 @@ public class CalcIslandLevel {
});
}
private void scanChunk(ChunkSnapshot chunk) {
private void scanChunk(ChunkSnapshot chunk, Chunk physicalChunk) {
World chunkWorld = Bukkit.getWorld(chunk.getWorldName());
if (chunkWorld == null) return;
int maxHeight = chunkWorld.getMaxHeight();
@ -155,23 +159,37 @@ public class CalcIslandLevel {
if (Tag.SLABS.isTagged(blockData.getMaterial())) {
Slab slab = (Slab)blockData;
if (slab.getType().equals(Slab.Type.DOUBLE)) {
checkBlock(blockData, belowSeaLevel);
checkBlock(blockData.getMaterial(), belowSeaLevel);
}
}
checkBlock(blockData, belowSeaLevel);
// Hook for Wild Stackers (Blocks Only)
if (stackersEnabled && blockData.getMaterial() == Material.CAULDRON) {
Block cauldronBlock = physicalChunk.getBlock(x, y, z);
if (WildStackerAPI.getWildStacker().getSystemManager().isStackedBarrel(cauldronBlock)) {
StackedBarrel barrel = WildStackerAPI.getStackedBarrel(cauldronBlock);
int barrelAmt = WildStackerAPI.getBarrelAmount(cauldronBlock);
for (int _x = 0; _x < barrelAmt; _x++) {
checkBlock(barrel.getType(), belowSeaLevel);
}
}
}
checkBlock(blockData.getMaterial(), belowSeaLevel);
}
}
}
}
private void checkBlock(BlockData bd, boolean belowSeaLevel) {
int count = limitCount(bd.getMaterial());
// Didnt see a reason to pass BlockData when all that's used was the material
private void checkBlock(Material mat, boolean belowSeaLevel) {
int count = limitCount(mat);
if (belowSeaLevel) {
result.underWaterBlockCount.addAndGet(count);
result.uwCount.add(bd.getMaterial());
result.uwCount.add(mat);
} else {
result.rawBlockCount.addAndGet(count);
result.mdCount.add(bd.getMaterial());
result.mdCount.add(mat);
}
}