diff --git a/plugin-modules/Core/resources-json/autospawns.json b/plugin-modules/Core/resources-json/autospawns.json index 799d6f3..558c738 100644 --- a/plugin-modules/Core/resources-json/autospawns.json +++ b/plugin-modules/Core/resources-json/autospawns.json @@ -6,6 +6,7 @@ "SkeletonKing" ], "autoSpawnSettings": { + "shuffleEntitiesList": true, "maxAliveAtOnce": 1, "amountPerSpawn": 1, "spawnWhenChunkIsntLoaded": false, @@ -13,6 +14,7 @@ "spawnMessage": "MiddleOfTheEarthSpawnMessage" }, "customData": { + "spawnAfterLastBossIsKilled": false, "location": "world,0,150,0", "placeholder": "{customBosses_1}", "spawnRate": 30 diff --git a/plugin-modules/Core/src/com/songoda/epicbosses/autospawns/IAutoSpawnElement.java b/plugin-modules/Core/src/com/songoda/epicbosses/autospawns/IAutoSpawnElement.java deleted file mode 100644 index 1c56e33..0000000 --- a/plugin-modules/Core/src/com/songoda/epicbosses/autospawns/IAutoSpawnElement.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.songoda.epicbosses.autospawns; - -/** - * @author Charles Cullen - * @version 1.0.0 - * @since 03-Jan-19 - */ -public interface IAutoSpawnElement { - - void attemptSpawn(); - -} diff --git a/plugin-modules/Core/src/com/songoda/epicbosses/autospawns/settings/AutoSpawnSettings.java b/plugin-modules/Core/src/com/songoda/epicbosses/autospawns/settings/AutoSpawnSettings.java index 246e8e0..66802df 100644 --- a/plugin-modules/Core/src/com/songoda/epicbosses/autospawns/settings/AutoSpawnSettings.java +++ b/plugin-modules/Core/src/com/songoda/epicbosses/autospawns/settings/AutoSpawnSettings.java @@ -12,13 +12,14 @@ import lombok.Setter; public class AutoSpawnSettings { @Expose @Getter @Setter private Integer maxAliveAtOnce, amountPerSpawn; - @Expose @Getter @Setter private Boolean spawnWhenCheckIsntLoaded, overrideDefaultSpawnMessage; + @Expose @Getter @Setter private Boolean spawnWhenCheckIsntLoaded, overrideDefaultSpawnMessage, shuffleEntitiesList; @Expose @Getter @Setter private String spawnMessage; - public AutoSpawnSettings(int maxAliveAtOnce, int amountPerSpawn, boolean spawnWhenCheckIsntLoaded) { + public AutoSpawnSettings(int maxAliveAtOnce, int amountPerSpawn, boolean spawnWhenCheckIsntLoaded, boolean shuffleEntitiesList) { this.maxAliveAtOnce = maxAliveAtOnce; this.amountPerSpawn = amountPerSpawn; this.spawnWhenCheckIsntLoaded = spawnWhenCheckIsntLoaded; + this.shuffleEntitiesList = shuffleEntitiesList; } } diff --git a/plugin-modules/Core/src/com/songoda/epicbosses/autospawns/types/IntervalSpawnElement.java b/plugin-modules/Core/src/com/songoda/epicbosses/autospawns/types/IntervalSpawnElement.java index 2e333e5..e6c58f3 100644 --- a/plugin-modules/Core/src/com/songoda/epicbosses/autospawns/types/IntervalSpawnElement.java +++ b/plugin-modules/Core/src/com/songoda/epicbosses/autospawns/types/IntervalSpawnElement.java @@ -1,31 +1,34 @@ package com.songoda.epicbosses.autospawns.types; import com.google.gson.annotations.Expose; -import com.songoda.epicbosses.autospawns.IAutoSpawnElement; +import com.songoda.epicbosses.listeners.IBossDeathHandler; import com.songoda.epicbosses.utils.StringUtils; import lombok.Getter; import lombok.Setter; import org.bukkit.Location; +import org.bukkit.event.Listener; /** * @author Charles Cullen * @version 1.0.0 * @since 02-Jan-19 */ -public class IntervalSpawnElement implements IAutoSpawnElement { +public class IntervalSpawnElement { + @Expose @Getter @Setter private Boolean spawnAfterLastBossIsKilled; @Expose @Getter @Setter private String location, placeholder; @Expose @Getter @Setter private Integer spawnRate; - public IntervalSpawnElement(String location, String placeholder, Integer spawnRate) { + public IntervalSpawnElement(String location, String placeholder, Integer spawnRate, boolean spawnAfterLastBossIsKilled) { this.location = location; this.placeholder = placeholder; this.spawnRate = spawnRate; + this.spawnAfterLastBossIsKilled = spawnAfterLastBossIsKilled; } - @Override - public void attemptSpawn() { + public boolean attemptSpawn(IBossDeathHandler bossDeathHandler) { + return true; } public Location getSpawnLocation() { diff --git a/plugin-modules/Core/src/com/songoda/epicbosses/holder/ActiveBossHolder.java b/plugin-modules/Core/src/com/songoda/epicbosses/holder/ActiveBossHolder.java index d60e206..d30a411 100644 --- a/plugin-modules/Core/src/com/songoda/epicbosses/holder/ActiveBossHolder.java +++ b/plugin-modules/Core/src/com/songoda/epicbosses/holder/ActiveBossHolder.java @@ -1,5 +1,6 @@ package com.songoda.epicbosses.holder; +import com.songoda.epicbosses.listeners.IBossDeathHandler; import lombok.Getter; import lombok.Setter; import com.songoda.epicbosses.targeting.TargetHandler; @@ -24,6 +25,7 @@ public class ActiveBossHolder implements IActiveHolder { @Getter private Map activeMinionHolderMap = new HashMap<>(); @Getter private Map livingEntityMap = new HashMap<>(); + @Getter private List postBossDeathHandlers = new ArrayList<>(); @Getter private Map mapOfDamagingUsers = new HashMap<>(); @Getter @Setter private TargetHandler targetHandler = null; diff --git a/plugin-modules/Core/src/com/songoda/epicbosses/holder/autospawn/ActiveIntervalAutoSpawnHolder.java b/plugin-modules/Core/src/com/songoda/epicbosses/holder/autospawn/ActiveIntervalAutoSpawnHolder.java index 9d34b3e..f053aa7 100644 --- a/plugin-modules/Core/src/com/songoda/epicbosses/holder/autospawn/ActiveIntervalAutoSpawnHolder.java +++ b/plugin-modules/Core/src/com/songoda/epicbosses/holder/autospawn/ActiveIntervalAutoSpawnHolder.java @@ -4,13 +4,19 @@ import com.songoda.epicbosses.api.BossAPI; import com.songoda.epicbosses.autospawns.AutoSpawn; import com.songoda.epicbosses.autospawns.SpawnType; import com.songoda.epicbosses.autospawns.types.IntervalSpawnElement; +import com.songoda.epicbosses.events.BossDeathEvent; +import com.songoda.epicbosses.events.PreBossDeathEvent; import com.songoda.epicbosses.holder.ActiveAutoSpawnHolder; +import com.songoda.epicbosses.holder.ActiveBossHolder; +import com.songoda.epicbosses.listeners.IBossDeathHandler; import com.songoda.epicbosses.utils.Debug; import com.songoda.epicbosses.utils.ObjectUtils; import com.songoda.epicbosses.utils.ServerUtils; import com.songoda.epicbosses.utils.time.TimeUnit; import lombok.Getter; import org.bukkit.Location; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; import org.bukkit.scheduler.BukkitTask; /** @@ -40,6 +46,7 @@ public class ActiveIntervalAutoSpawnHolder extends ActiveAutoSpawnHolder { Location location = this.intervalSpawnElement.getSpawnLocation(); boolean spawnIfChunkNotLoaded = ObjectUtils.getValue(getAutoSpawn().getAutoSpawnSettings().getSpawnWhenCheckIsntLoaded(), false); + boolean spawnAfterLastBossIsKilled = ObjectUtils.getValue(this.intervalSpawnElement.getSpawnAfterLastBossIsKilled(), false); if(location == null) return false; if(!spawnIfChunkNotLoaded && !location.getChunk().isLoaded()) return false; @@ -60,16 +67,17 @@ public class ActiveIntervalAutoSpawnHolder extends ActiveAutoSpawnHolder { } long delayMs = (long) TimeUnit.SECONDS.to(TimeUnit.MILLISECONDS, delay); + boolean spawnAfterLastBossIsKilled = ObjectUtils.getValue(this.intervalSpawnElement.getSpawnAfterLastBossIsKilled(), false); updateNextCompleteTime(delayMs); this.intervalTask = ServerUtils.get().runTimer(delayMs, delayMs, () -> { - if(!canSpawn()) { - updateNextCompleteTime(delayMs); - return; + updateNextCompleteTime(delayMs); + + if(!canSpawn()) return; + if(this.intervalSpawnElement.attemptSpawn(getPostDeathHandler()) && spawnAfterLastBossIsKilled) { + stopInterval(); } - - }); } @@ -81,12 +89,31 @@ public class ActiveIntervalAutoSpawnHolder extends ActiveAutoSpawnHolder { return this.nextCompletedTime - currentMs; } - public void stopInterval() { + private void stopInterval() { if(this.intervalTask != null) ServerUtils.get().cancelTask(this.intervalTask); + + this.nextCompletedTime = 0; + + getActiveBossHolders().forEach(ActiveBossHolder::killAll); + getActiveBossHolders().clear(); } private void updateNextCompleteTime(long delayMs) { this.nextCompletedTime = System.currentTimeMillis() + delayMs; } + private IBossDeathHandler getPostDeathHandler() { + return event -> { + boolean spawnAfterLastBossIsKilled = ObjectUtils.getValue(this.intervalSpawnElement.getSpawnAfterLastBossIsKilled(), false); + ActiveBossHolder activeBossHolder = event.getActiveBossHolder(); + + if(getActiveBossHolders().contains(activeBossHolder)) { + getActiveBossHolders().remove(activeBossHolder); + + if(spawnAfterLastBossIsKilled) { + restartInterval(); + } + } + }; + } } diff --git a/plugin-modules/Core/src/com/songoda/epicbosses/listeners/IBossDeathHandler.java b/plugin-modules/Core/src/com/songoda/epicbosses/listeners/IBossDeathHandler.java new file mode 100644 index 0000000..fd001d1 --- /dev/null +++ b/plugin-modules/Core/src/com/songoda/epicbosses/listeners/IBossDeathHandler.java @@ -0,0 +1,14 @@ +package com.songoda.epicbosses.listeners; + +import com.songoda.epicbosses.events.PreBossDeathEvent; + +/** + * @author Charles Cullen + * @version 1.0.0 + * @since 03-Jan-19 + */ +public interface IBossDeathHandler { + + void onPreDeath(PreBossDeathEvent event); + +} diff --git a/plugin-modules/Core/src/com/songoda/epicbosses/listeners/after/BossDeathListener.java b/plugin-modules/Core/src/com/songoda/epicbosses/listeners/after/BossDeathListener.java index 813ee69..f2147c8 100644 --- a/plugin-modules/Core/src/com/songoda/epicbosses/listeners/after/BossDeathListener.java +++ b/plugin-modules/Core/src/com/songoda/epicbosses/listeners/after/BossDeathListener.java @@ -7,6 +7,7 @@ import com.songoda.epicbosses.events.BossDeathEvent; import com.songoda.epicbosses.events.PreBossDeathEvent; import com.songoda.epicbosses.holder.ActiveBossHolder; import com.songoda.epicbosses.holder.DeadBossHolder; +import com.songoda.epicbosses.listeners.IBossDeathHandler; import com.songoda.epicbosses.managers.BossEntityManager; import com.songoda.epicbosses.utils.Debug; import com.songoda.epicbosses.utils.MessageUtils; @@ -139,6 +140,8 @@ public class BossDeathListener implements Listener { } }); + activeBossHolder.getPostBossDeathHandlers().forEach(handler -> handler.onPreDeath(event)); + DeadBossHolder deadBossHolder = new DeadBossHolder(bossEntity, location, mapOfDamage, mapOfPercent); BossDeathEvent bossDeathEvent = new BossDeathEvent(activeBossHolder); DropTable dropTable = this.bossEntityManager.getDropTable(bossEntity); diff --git a/plugin-modules/Core/src/com/songoda/epicbosses/utils/panel/Panel.java b/plugin-modules/Core/src/com/songoda/epicbosses/utils/panel/Panel.java index 07d8cb3..6c09a92 100644 --- a/plugin-modules/Core/src/com/songoda/epicbosses/utils/panel/Panel.java +++ b/plugin-modules/Core/src/com/songoda/epicbosses/utils/panel/Panel.java @@ -13,10 +13,12 @@ import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.Sound; import org.bukkit.entity.Player; +import org.bukkit.event.Event; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.event.inventory.InventoryEvent; import org.bukkit.event.inventory.InventoryType; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; diff --git a/pom.xml b/pom.xml index e38895b..b5e9d39 100644 --- a/pom.xml +++ b/pom.xml @@ -19,7 +19,7 @@ - 1.0.0-U170 + 1.0.0-U171 EpicBosses com.songoda.epicbosses.CustomBosses AMinecraftDev