1.0.0-SNAPSHOT-U171

+ Added IBossDeathHandler to add custom handlers for AutoSpawn
+ Modified AutoSpawnSettings to have a new method shuffleEntitiesList for when a boss is attempted to spawn
+ Modified IntervalSpawnElement to have a new method spawnAfterLastBossIsKilled
+ Added implementation of IBossDeathHandler into BossDeathListener
This commit is contained in:
Charles 2019-01-03 22:58:21 +08:00
parent 7cb8929027
commit 3744dbf0cd
10 changed files with 68 additions and 26 deletions

View File

@ -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

View File

@ -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();
}

View File

@ -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;
}
}

View File

@ -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() {

View File

@ -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<Integer, ActiveMinionHolder> activeMinionHolderMap = new HashMap<>();
@Getter private Map<Integer, LivingEntity> livingEntityMap = new HashMap<>();
@Getter private List<IBossDeathHandler> postBossDeathHandlers = new ArrayList<>();
@Getter private Map<UUID, Double> mapOfDamagingUsers = new HashMap<>();
@Getter @Setter private TargetHandler<ActiveBossHolder> targetHandler = null;

View File

@ -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();
}
}
};
}
}

View File

@ -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);
}

View File

@ -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);

View File

@ -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;

View File

@ -19,7 +19,7 @@
</modules>
<properties>
<plugin.version>1.0.0-U170</plugin.version>
<plugin.version>1.0.0-U171</plugin.version>
<plugin.name>EpicBosses</plugin.name>
<plugin.main>com.songoda.epicbosses.CustomBosses</plugin.main>
<plugin.author>AMinecraftDev</plugin.author>