From 7cb8929027cedd238eea335b945a5063cfc29499 Mon Sep 17 00:00:00 2001 From: Charles Date: Thu, 3 Jan 2019 21:41:35 +0800 Subject: [PATCH] 1.0.0-SNAPSHOT-U170 + Continued to work on AutoSpawn + Added and completed the canSpawn method + Added and completed the delay handler --- .../Core/resources-json/autospawns.json | 2 +- .../epicbosses/autospawns/AutoSpawn.java | 7 ++- .../autospawns/IAutoSpawnElement.java | 12 +++++ .../types/IntervalSpawnElement.java | 10 +++- .../holder/ActiveAutoSpawnHolder.java | 8 +++ .../ActiveIntervalAutoSpawnHolder.java | 51 +++++++++++++------ .../songoda/epicbosses/utils/StringUtils.java | 2 + pom.xml | 3 +- 8 files changed, 73 insertions(+), 22 deletions(-) create mode 100644 plugin-modules/Core/src/com/songoda/epicbosses/autospawns/IAutoSpawnElement.java diff --git a/plugin-modules/Core/resources-json/autospawns.json b/plugin-modules/Core/resources-json/autospawns.json index 0ac00e3..799d6f3 100644 --- a/plugin-modules/Core/resources-json/autospawns.json +++ b/plugin-modules/Core/resources-json/autospawns.json @@ -5,7 +5,7 @@ "entities": [ "SkeletonKing" ], - "settings": { + "autoSpawnSettings": { "maxAliveAtOnce": 1, "amountPerSpawn": 1, "spawnWhenChunkIsntLoaded": false, diff --git a/plugin-modules/Core/src/com/songoda/epicbosses/autospawns/AutoSpawn.java b/plugin-modules/Core/src/com/songoda/epicbosses/autospawns/AutoSpawn.java index 3fb8340..69c8e60 100644 --- a/plugin-modules/Core/src/com/songoda/epicbosses/autospawns/AutoSpawn.java +++ b/plugin-modules/Core/src/com/songoda/epicbosses/autospawns/AutoSpawn.java @@ -20,13 +20,13 @@ public class AutoSpawn { @Expose @Getter @Setter private Boolean editing; @Expose @Getter @Setter private String type; @Expose @Getter @Setter private List entities; - @Expose @Getter @Setter private AutoSpawnSettings settings; + @Expose @Getter @Setter private AutoSpawnSettings autoSpawnSettings; @Expose @Getter @Setter private JsonObject customData; public AutoSpawn(boolean editing, List entities, AutoSpawnSettings autoSpawnSettings) { this.editing = editing; this.entities = entities; - this.settings = autoSpawnSettings; + this.autoSpawnSettings = autoSpawnSettings; } public IntervalSpawnElement getIntervalSpawnData() { @@ -37,6 +37,9 @@ public class AutoSpawn { return null; } + public boolean isLocked() { + return this.editing != null && this.editing; + } } diff --git a/plugin-modules/Core/src/com/songoda/epicbosses/autospawns/IAutoSpawnElement.java b/plugin-modules/Core/src/com/songoda/epicbosses/autospawns/IAutoSpawnElement.java new file mode 100644 index 0000000..1c56e33 --- /dev/null +++ b/plugin-modules/Core/src/com/songoda/epicbosses/autospawns/IAutoSpawnElement.java @@ -0,0 +1,12 @@ +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/types/IntervalSpawnElement.java b/plugin-modules/Core/src/com/songoda/epicbosses/autospawns/types/IntervalSpawnElement.java index be2a6cc..2e333e5 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,15 +1,18 @@ package com.songoda.epicbosses.autospawns.types; import com.google.gson.annotations.Expose; +import com.songoda.epicbosses.autospawns.IAutoSpawnElement; +import com.songoda.epicbosses.utils.StringUtils; import lombok.Getter; import lombok.Setter; +import org.bukkit.Location; /** * @author Charles Cullen * @version 1.0.0 * @since 02-Jan-19 */ -public class IntervalSpawnElement { +public class IntervalSpawnElement implements IAutoSpawnElement { @Expose @Getter @Setter private String location, placeholder; @Expose @Getter @Setter private Integer spawnRate; @@ -20,8 +23,13 @@ public class IntervalSpawnElement { this.spawnRate = spawnRate; } + @Override public void attemptSpawn() { } + public Location getSpawnLocation() { + return StringUtils.get().fromStringToLocation(this.location); + } + } diff --git a/plugin-modules/Core/src/com/songoda/epicbosses/holder/ActiveAutoSpawnHolder.java b/plugin-modules/Core/src/com/songoda/epicbosses/holder/ActiveAutoSpawnHolder.java index 6b775a0..d00cbae 100644 --- a/plugin-modules/Core/src/com/songoda/epicbosses/holder/ActiveAutoSpawnHolder.java +++ b/plugin-modules/Core/src/com/songoda/epicbosses/holder/ActiveAutoSpawnHolder.java @@ -24,4 +24,12 @@ public class ActiveAutoSpawnHolder { this.spawnType = spawnType; } + public int getCurrentActiveBossHolders() { + return this.activeBossHolders.size(); + } + + protected boolean canSpawn() { + return true; + } + } 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 c818b0c..9d34b3e 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 @@ -1,15 +1,16 @@ package com.songoda.epicbosses.holder.autospawn; -import com.songoda.epicbosses.CustomBosses; 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.holder.ActiveAutoSpawnHolder; 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.scheduler.BukkitRunnable; +import org.bukkit.Location; import org.bukkit.scheduler.BukkitTask; /** @@ -19,41 +20,57 @@ import org.bukkit.scheduler.BukkitTask; */ public class ActiveIntervalAutoSpawnHolder extends ActiveAutoSpawnHolder { + @Getter private final IntervalSpawnElement intervalSpawnElement; + @Getter private BukkitTask intervalTask = null; @Getter private long nextCompletedTime = 0L; public ActiveIntervalAutoSpawnHolder(SpawnType spawnType, AutoSpawn autoSpawn) { super(spawnType, autoSpawn); + + this.intervalSpawnElement = autoSpawn.getIntervalSpawnData(); + } + + @Override + public boolean canSpawn() { + if(getAutoSpawn().isLocked()) return false; + + int currentActiveAmount = getCurrentActiveBossHolders(); + int maxAmount = getAutoSpawn().getAutoSpawnSettings().getMaxAliveAtOnce(); + + Location location = this.intervalSpawnElement.getSpawnLocation(); + boolean spawnIfChunkNotLoaded = ObjectUtils.getValue(getAutoSpawn().getAutoSpawnSettings().getSpawnWhenCheckIsntLoaded(), false); + + if(location == null) return false; + if(!spawnIfChunkNotLoaded && !location.getChunk().isLoaded()) return false; + + return currentActiveAmount < maxAmount; } public void restartInterval() { stopInterval(); - if(getAutoSpawn().getEditing() != null && getAutoSpawn().getEditing()) return; + if(getAutoSpawn().isLocked()) return; - Integer delay = getAutoSpawn().getIntervalSpawnData().getSpawnRate(); + Integer delay = this.intervalSpawnElement.getSpawnRate(); if(delay == null) { Debug.AUTOSPAWN_INTERVALNOTREAL.debug("null", BossAPI.getAutoSpawnName(getAutoSpawn())); return; } - long currentMs = System.currentTimeMillis(); long delayMs = (long) TimeUnit.SECONDS.to(TimeUnit.MILLISECONDS, delay); - this.nextCompletedTime = currentMs + delayMs; - this.intervalTask = new BukkitRunnable() { - private int timerTime = delay; + updateNextCompleteTime(delayMs); - public void run() { - this.timerTime -= 1; - - if(this.timerTime <= 0) { - - } + this.intervalTask = ServerUtils.get().runTimer(delayMs, delayMs, () -> { + if(!canSpawn()) { + updateNextCompleteTime(delayMs); + return; } - }.runTaskTimer(CustomBosses.get(), 20L, 20L); + + }); } public long getRemainingMs() { @@ -68,6 +85,8 @@ public class ActiveIntervalAutoSpawnHolder extends ActiveAutoSpawnHolder { if(this.intervalTask != null) ServerUtils.get().cancelTask(this.intervalTask); } - + private void updateNextCompleteTime(long delayMs) { + this.nextCompletedTime = System.currentTimeMillis() + delayMs; + } } diff --git a/plugin-modules/Core/src/com/songoda/epicbosses/utils/StringUtils.java b/plugin-modules/Core/src/com/songoda/epicbosses/utils/StringUtils.java index da5a1d2..dcd42fc 100644 --- a/plugin-modules/Core/src/com/songoda/epicbosses/utils/StringUtils.java +++ b/plugin-modules/Core/src/com/songoda/epicbosses/utils/StringUtils.java @@ -53,6 +53,8 @@ public class StringUtils { } public Location fromStringToLocation(String input) { + if(input == null) return null; + String[] split = input.split(","); if(split.length != 4) return null; diff --git a/pom.xml b/pom.xml index 2d813c1..e38895b 100644 --- a/pom.xml +++ b/pom.xml @@ -19,8 +19,7 @@ - - 1.0.0-U169 + 1.0.0-U170 EpicBosses com.songoda.epicbosses.CustomBosses AMinecraftDev