From 1184ce24f31a6e852138609390e14f549884f35e Mon Sep 17 00:00:00 2001 From: Brianna Date: Wed, 17 Jul 2019 08:56:50 -0400 Subject: [PATCH] Made it so entities spawn directly into stacks from spawners. --- .gitlab-ci.yml | 2 +- pom.xml | 2 +- .../ultimatestacker/UltimateStacker.java | 1 + .../listeners/EntityListeners.java | 1 - .../listeners/SpawnerListeners.java | 33 +++++++++++++++++++ .../ultimatestacker/spawner/SpawnerStack.java | 14 +++++++- .../ultimatestacker/tasks/StackingTask.java | 14 +++++++- 7 files changed, 62 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/songoda/ultimatestacker/listeners/SpawnerListeners.java diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 89aecae..9f3be73 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -4,7 +4,7 @@ stages: variables: name: "UltimateStacker" path: "/builds/$CI_PROJECT_PATH" - version: "1.6.7" + version: "1.6.8" build: stage: build diff --git a/pom.xml b/pom.xml index 5c863e9..54752df 100644 --- a/pom.xml +++ b/pom.xml @@ -91,7 +91,7 @@ com.bgsoftware WildStacker - 2.8.1 + 2-9-0 uk.antiperson diff --git a/src/main/java/com/songoda/ultimatestacker/UltimateStacker.java b/src/main/java/com/songoda/ultimatestacker/UltimateStacker.java index b112e9a..f1d15d6 100644 --- a/src/main/java/com/songoda/ultimatestacker/UltimateStacker.java +++ b/src/main/java/com/songoda/ultimatestacker/UltimateStacker.java @@ -174,6 +174,7 @@ public class UltimateStacker extends JavaPlugin { pluginManager.registerEvents(new EntityListeners(this), this); pluginManager.registerEvents(new ItemListeners(this), this); pluginManager.registerEvents(new TameListeners(this), this); + pluginManager.registerEvents(new SpawnerListeners(this), this); pluginManager.registerEvents(new SheepDyeListeners(this), this); if (Setting.CLEAR_LAG.getBoolean() && pluginManager.isPluginEnabled("ClearLag")) diff --git a/src/main/java/com/songoda/ultimatestacker/listeners/EntityListeners.java b/src/main/java/com/songoda/ultimatestacker/listeners/EntityListeners.java index 3933822..996b39e 100644 --- a/src/main/java/com/songoda/ultimatestacker/listeners/EntityListeners.java +++ b/src/main/java/com/songoda/ultimatestacker/listeners/EntityListeners.java @@ -8,7 +8,6 @@ import com.songoda.ultimatestacker.utils.Methods; import com.songoda.ultimatestacker.utils.ServerVersion; import com.songoda.ultimatestacker.utils.settings.Setting; import org.bukkit.Bukkit; -import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; diff --git a/src/main/java/com/songoda/ultimatestacker/listeners/SpawnerListeners.java b/src/main/java/com/songoda/ultimatestacker/listeners/SpawnerListeners.java new file mode 100644 index 0000000..29bb40a --- /dev/null +++ b/src/main/java/com/songoda/ultimatestacker/listeners/SpawnerListeners.java @@ -0,0 +1,33 @@ +package com.songoda.ultimatestacker.listeners; + +import com.songoda.ultimatestacker.UltimateStacker; +import com.songoda.ultimatestacker.entity.EntityStack; +import com.songoda.ultimatestacker.spawner.SpawnerStack; +import com.songoda.ultimatestacker.spawner.SpawnerStackManager; +import com.songoda.ultimatestacker.utils.settings.Setting; +import org.bukkit.entity.LivingEntity; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.SpawnerSpawnEvent; + +public class SpawnerListeners implements Listener { + + private final UltimateStacker instance; + + public SpawnerListeners(UltimateStacker instance) { + this.instance = instance; + } + + @EventHandler + public void onSpawn(SpawnerSpawnEvent event) { + if (!Setting.STACK_ENTITIES.getBoolean()) return; + SpawnerStackManager spawnerStackManager = instance.getSpawnerStackManager(); + if (!spawnerStackManager.isSpawner(event.getSpawner().getLocation())) return; + + SpawnerStack spawnerStack = spawnerStackManager.getSpawner(event.getSpawner().getLocation()); + + EntityStack stack = instance.getEntityStackManager().addStack(event.getEntity().getUniqueId(), spawnerStack.calculateSpawnCount()); + + instance.getStackingTask().attemptSplit(stack, (LivingEntity)event.getEntity()); + } +} diff --git a/src/main/java/com/songoda/ultimatestacker/spawner/SpawnerStack.java b/src/main/java/com/songoda/ultimatestacker/spawner/SpawnerStack.java index bb591c0..dae4a8f 100644 --- a/src/main/java/com/songoda/ultimatestacker/spawner/SpawnerStack.java +++ b/src/main/java/com/songoda/ultimatestacker/spawner/SpawnerStack.java @@ -3,10 +3,13 @@ package com.songoda.ultimatestacker.spawner; import com.songoda.ultimatestacker.UltimateStacker; import com.songoda.ultimatestacker.utils.Reflection; import com.songoda.ultimatestacker.utils.ServerVersion; +import com.songoda.ultimatestacker.utils.settings.Setting; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.block.CreatureSpawner; +import java.util.Random; + public class SpawnerStack { private final Location location; @@ -30,7 +33,7 @@ public class SpawnerStack { Bukkit.getScheduler().runTaskLater(UltimateStacker.getInstance(), () -> { if (!(location.getBlock().getState() instanceof CreatureSpawner)) return; - int count = 4 * amount; + int count = Setting.STACK_ENTITIES.getBoolean() ? 1 : calculateSpawnCount(); int maxNearby = amount > 6 ? amount + 3 : 6; CreatureSpawner creatureSpawner = (CreatureSpawner) location.getBlock().getState(); if (UltimateStacker.getInstance().isServerVersionAtLeast(ServerVersion.V1_12)) { @@ -55,4 +58,13 @@ public class SpawnerStack { + "}" + "}"; } + + public int calculateSpawnCount() { + Random random = new Random(); + int count = 0; + for (int i = 0; i < getAmount(); i ++) { + count += random.nextInt(3 - 1 + 1) + 1; + } + return count; + } } diff --git a/src/main/java/com/songoda/ultimatestacker/tasks/StackingTask.java b/src/main/java/com/songoda/ultimatestacker/tasks/StackingTask.java index efa4ec2..2ad75c2 100644 --- a/src/main/java/com/songoda/ultimatestacker/tasks/StackingTask.java +++ b/src/main/java/com/songoda/ultimatestacker/tasks/StackingTask.java @@ -182,6 +182,19 @@ public class StackingTask extends BukkitRunnable { return false; } + public void attemptSplit(EntityStack stack, LivingEntity entity) { + int stackSize = stack.getAmount(); + int maxEntityStackAmount = Setting.MAX_STACK_ENTITIES.getInt(); + + if (stackSize <= maxEntityStackAmount) return; + + for (int i = stackSize; i > 0; i -= maxEntityStackAmount) { + instance.getEntityStackManager().addStack(Methods.newEntity(entity), i > 25 ? 25 : i); + } + entity.remove(); + + } + private void fixHealth(LivingEntity entity, LivingEntity initialEntity) { if (!Setting.STACK_ENTITY_HEALTH.getBoolean() && Setting.CARRY_OVER_LOWEST_HEALTH.getBoolean() && initialEntity.getHealth() < entity.getHealth()) entity.setHealth(initialEntity.getHealth()); @@ -191,5 +204,4 @@ public class StackingTask extends BukkitRunnable { if (Setting.STACK_ENTITY_HEALTH.getBoolean()) stack.updateHealth(stack.getEntity()); } - }