mirror of
https://github.com/songoda/EpicBosses.git
synced 2024-09-28 21:37:33 +02:00
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:
parent
7cb8929027
commit
3744dbf0cd
@ -6,6 +6,7 @@
|
|||||||
"SkeletonKing"
|
"SkeletonKing"
|
||||||
],
|
],
|
||||||
"autoSpawnSettings": {
|
"autoSpawnSettings": {
|
||||||
|
"shuffleEntitiesList": true,
|
||||||
"maxAliveAtOnce": 1,
|
"maxAliveAtOnce": 1,
|
||||||
"amountPerSpawn": 1,
|
"amountPerSpawn": 1,
|
||||||
"spawnWhenChunkIsntLoaded": false,
|
"spawnWhenChunkIsntLoaded": false,
|
||||||
@ -13,6 +14,7 @@
|
|||||||
"spawnMessage": "MiddleOfTheEarthSpawnMessage"
|
"spawnMessage": "MiddleOfTheEarthSpawnMessage"
|
||||||
},
|
},
|
||||||
"customData": {
|
"customData": {
|
||||||
|
"spawnAfterLastBossIsKilled": false,
|
||||||
"location": "world,0,150,0",
|
"location": "world,0,150,0",
|
||||||
"placeholder": "{customBosses_1}",
|
"placeholder": "{customBosses_1}",
|
||||||
"spawnRate": 30
|
"spawnRate": 30
|
||||||
|
@ -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();
|
|
||||||
|
|
||||||
}
|
|
@ -12,13 +12,14 @@ import lombok.Setter;
|
|||||||
public class AutoSpawnSettings {
|
public class AutoSpawnSettings {
|
||||||
|
|
||||||
@Expose @Getter @Setter private Integer maxAliveAtOnce, amountPerSpawn;
|
@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;
|
@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.maxAliveAtOnce = maxAliveAtOnce;
|
||||||
this.amountPerSpawn = amountPerSpawn;
|
this.amountPerSpawn = amountPerSpawn;
|
||||||
this.spawnWhenCheckIsntLoaded = spawnWhenCheckIsntLoaded;
|
this.spawnWhenCheckIsntLoaded = spawnWhenCheckIsntLoaded;
|
||||||
|
this.shuffleEntitiesList = shuffleEntitiesList;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,31 +1,34 @@
|
|||||||
package com.songoda.epicbosses.autospawns.types;
|
package com.songoda.epicbosses.autospawns.types;
|
||||||
|
|
||||||
import com.google.gson.annotations.Expose;
|
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 com.songoda.epicbosses.utils.StringUtils;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Charles Cullen
|
* @author Charles Cullen
|
||||||
* @version 1.0.0
|
* @version 1.0.0
|
||||||
* @since 02-Jan-19
|
* @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 String location, placeholder;
|
||||||
@Expose @Getter @Setter private Integer spawnRate;
|
@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.location = location;
|
||||||
this.placeholder = placeholder;
|
this.placeholder = placeholder;
|
||||||
this.spawnRate = spawnRate;
|
this.spawnRate = spawnRate;
|
||||||
|
this.spawnAfterLastBossIsKilled = spawnAfterLastBossIsKilled;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public boolean attemptSpawn(IBossDeathHandler bossDeathHandler) {
|
||||||
public void attemptSpawn() {
|
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Location getSpawnLocation() {
|
public Location getSpawnLocation() {
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package com.songoda.epicbosses.holder;
|
package com.songoda.epicbosses.holder;
|
||||||
|
|
||||||
|
import com.songoda.epicbosses.listeners.IBossDeathHandler;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
import com.songoda.epicbosses.targeting.TargetHandler;
|
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, ActiveMinionHolder> activeMinionHolderMap = new HashMap<>();
|
||||||
@Getter private Map<Integer, LivingEntity> livingEntityMap = 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 private Map<UUID, Double> mapOfDamagingUsers = new HashMap<>();
|
||||||
|
|
||||||
@Getter @Setter private TargetHandler<ActiveBossHolder> targetHandler = null;
|
@Getter @Setter private TargetHandler<ActiveBossHolder> targetHandler = null;
|
||||||
|
@ -4,13 +4,19 @@ import com.songoda.epicbosses.api.BossAPI;
|
|||||||
import com.songoda.epicbosses.autospawns.AutoSpawn;
|
import com.songoda.epicbosses.autospawns.AutoSpawn;
|
||||||
import com.songoda.epicbosses.autospawns.SpawnType;
|
import com.songoda.epicbosses.autospawns.SpawnType;
|
||||||
import com.songoda.epicbosses.autospawns.types.IntervalSpawnElement;
|
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.ActiveAutoSpawnHolder;
|
||||||
|
import com.songoda.epicbosses.holder.ActiveBossHolder;
|
||||||
|
import com.songoda.epicbosses.listeners.IBossDeathHandler;
|
||||||
import com.songoda.epicbosses.utils.Debug;
|
import com.songoda.epicbosses.utils.Debug;
|
||||||
import com.songoda.epicbosses.utils.ObjectUtils;
|
import com.songoda.epicbosses.utils.ObjectUtils;
|
||||||
import com.songoda.epicbosses.utils.ServerUtils;
|
import com.songoda.epicbosses.utils.ServerUtils;
|
||||||
import com.songoda.epicbosses.utils.time.TimeUnit;
|
import com.songoda.epicbosses.utils.time.TimeUnit;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
import org.bukkit.scheduler.BukkitTask;
|
import org.bukkit.scheduler.BukkitTask;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -40,6 +46,7 @@ public class ActiveIntervalAutoSpawnHolder extends ActiveAutoSpawnHolder {
|
|||||||
|
|
||||||
Location location = this.intervalSpawnElement.getSpawnLocation();
|
Location location = this.intervalSpawnElement.getSpawnLocation();
|
||||||
boolean spawnIfChunkNotLoaded = ObjectUtils.getValue(getAutoSpawn().getAutoSpawnSettings().getSpawnWhenCheckIsntLoaded(), false);
|
boolean spawnIfChunkNotLoaded = ObjectUtils.getValue(getAutoSpawn().getAutoSpawnSettings().getSpawnWhenCheckIsntLoaded(), false);
|
||||||
|
boolean spawnAfterLastBossIsKilled = ObjectUtils.getValue(this.intervalSpawnElement.getSpawnAfterLastBossIsKilled(), false);
|
||||||
|
|
||||||
if(location == null) return false;
|
if(location == null) return false;
|
||||||
if(!spawnIfChunkNotLoaded && !location.getChunk().isLoaded()) 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);
|
long delayMs = (long) TimeUnit.SECONDS.to(TimeUnit.MILLISECONDS, delay);
|
||||||
|
boolean spawnAfterLastBossIsKilled = ObjectUtils.getValue(this.intervalSpawnElement.getSpawnAfterLastBossIsKilled(), false);
|
||||||
|
|
||||||
updateNextCompleteTime(delayMs);
|
updateNextCompleteTime(delayMs);
|
||||||
|
|
||||||
this.intervalTask = ServerUtils.get().runTimer(delayMs, delayMs, () -> {
|
this.intervalTask = ServerUtils.get().runTimer(delayMs, delayMs, () -> {
|
||||||
if(!canSpawn()) {
|
|
||||||
updateNextCompleteTime(delayMs);
|
updateNextCompleteTime(delayMs);
|
||||||
return;
|
|
||||||
|
if(!canSpawn()) return;
|
||||||
|
if(this.intervalSpawnElement.attemptSpawn(getPostDeathHandler()) && spawnAfterLastBossIsKilled) {
|
||||||
|
stopInterval();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -81,12 +89,31 @@ public class ActiveIntervalAutoSpawnHolder extends ActiveAutoSpawnHolder {
|
|||||||
return this.nextCompletedTime - currentMs;
|
return this.nextCompletedTime - currentMs;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void stopInterval() {
|
private void stopInterval() {
|
||||||
if(this.intervalTask != null) ServerUtils.get().cancelTask(this.intervalTask);
|
if(this.intervalTask != null) ServerUtils.get().cancelTask(this.intervalTask);
|
||||||
|
|
||||||
|
this.nextCompletedTime = 0;
|
||||||
|
|
||||||
|
getActiveBossHolders().forEach(ActiveBossHolder::killAll);
|
||||||
|
getActiveBossHolders().clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateNextCompleteTime(long delayMs) {
|
private void updateNextCompleteTime(long delayMs) {
|
||||||
this.nextCompletedTime = System.currentTimeMillis() + 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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
}
|
@ -7,6 +7,7 @@ import com.songoda.epicbosses.events.BossDeathEvent;
|
|||||||
import com.songoda.epicbosses.events.PreBossDeathEvent;
|
import com.songoda.epicbosses.events.PreBossDeathEvent;
|
||||||
import com.songoda.epicbosses.holder.ActiveBossHolder;
|
import com.songoda.epicbosses.holder.ActiveBossHolder;
|
||||||
import com.songoda.epicbosses.holder.DeadBossHolder;
|
import com.songoda.epicbosses.holder.DeadBossHolder;
|
||||||
|
import com.songoda.epicbosses.listeners.IBossDeathHandler;
|
||||||
import com.songoda.epicbosses.managers.BossEntityManager;
|
import com.songoda.epicbosses.managers.BossEntityManager;
|
||||||
import com.songoda.epicbosses.utils.Debug;
|
import com.songoda.epicbosses.utils.Debug;
|
||||||
import com.songoda.epicbosses.utils.MessageUtils;
|
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);
|
DeadBossHolder deadBossHolder = new DeadBossHolder(bossEntity, location, mapOfDamage, mapOfPercent);
|
||||||
BossDeathEvent bossDeathEvent = new BossDeathEvent(activeBossHolder);
|
BossDeathEvent bossDeathEvent = new BossDeathEvent(activeBossHolder);
|
||||||
DropTable dropTable = this.bossEntityManager.getDropTable(bossEntity);
|
DropTable dropTable = this.bossEntityManager.getDropTable(bossEntity);
|
||||||
|
@ -13,10 +13,12 @@ import org.bukkit.Bukkit;
|
|||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.Sound;
|
import org.bukkit.Sound;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.Event;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
import org.bukkit.event.inventory.InventoryClickEvent;
|
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||||
import org.bukkit.event.inventory.InventoryCloseEvent;
|
import org.bukkit.event.inventory.InventoryCloseEvent;
|
||||||
|
import org.bukkit.event.inventory.InventoryEvent;
|
||||||
import org.bukkit.event.inventory.InventoryType;
|
import org.bukkit.event.inventory.InventoryType;
|
||||||
import org.bukkit.inventory.Inventory;
|
import org.bukkit.inventory.Inventory;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
2
pom.xml
2
pom.xml
@ -19,7 +19,7 @@
|
|||||||
</modules>
|
</modules>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<plugin.version>1.0.0-U170</plugin.version>
|
<plugin.version>1.0.0-U171</plugin.version>
|
||||||
<plugin.name>EpicBosses</plugin.name>
|
<plugin.name>EpicBosses</plugin.name>
|
||||||
<plugin.main>com.songoda.epicbosses.CustomBosses</plugin.main>
|
<plugin.main>com.songoda.epicbosses.CustomBosses</plugin.main>
|
||||||
<plugin.author>AMinecraftDev</plugin.author>
|
<plugin.author>AMinecraftDev</plugin.author>
|
||||||
|
Loading…
Reference in New Issue
Block a user