EpicBosses/plugin-modules/Core/src/com/songoda/epicbosses/autospawns/types/IntervalSpawnElement.java

121 lines
6.0 KiB
Java

package com.songoda.epicbosses.autospawns.types;
import com.google.gson.annotations.Expose;
import com.songoda.epicbosses.api.BossAPI;
import com.songoda.epicbosses.autospawns.AutoSpawn;
import com.songoda.epicbosses.autospawns.IAutoSpawnCustomSettingsHandler;
import com.songoda.epicbosses.autospawns.handlers.IntervalSpawnHandler;
import com.songoda.epicbosses.autospawns.settings.AutoSpawnSettings;
import com.songoda.epicbosses.entity.BossEntity;
import com.songoda.epicbosses.events.BossSpawnEvent;
import com.songoda.epicbosses.holder.ActiveBossHolder;
import com.songoda.epicbosses.holder.autospawn.ActiveIntervalAutoSpawnHolder;
import com.songoda.epicbosses.listeners.IBossDeathHandler;
import com.songoda.epicbosses.managers.AutoSpawnManager;
import com.songoda.epicbosses.skills.interfaces.ICustomSettingAction;
import com.songoda.epicbosses.utils.*;
import com.songoda.epicbosses.utils.panel.base.ClickAction;
import com.songoda.epicbosses.utils.panel.base.handlers.VariablePanelHandler;
import lombok.Getter;
import lombok.Setter;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import java.util.*;
/**
* @author Charles Cullen
* @version 1.0.0
* @since 02-Jan-19
*/
public class IntervalSpawnElement implements IAutoSpawnCustomSettingsHandler {
@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, boolean spawnAfterLastBossIsKilled) {
this.location = location;
this.placeholder = placeholder;
this.spawnRate = spawnRate;
this.spawnAfterLastBossIsKilled = spawnAfterLastBossIsKilled;
}
@Override
public List<ICustomSettingAction> getCustomSettingActions(AutoSpawn autoSpawn, VariablePanelHandler<AutoSpawn> variablePanelHandler) {
List<ICustomSettingAction> clickActions = new ArrayList<>();
ItemStack clickStack = new ItemStack(Material.IRON_BLOCK);
IntervalSpawnHandler intervalSpawnHandler = new IntervalSpawnHandler();
ClickAction lastBossKilledAction = intervalSpawnHandler.getSpawnAfterLastBossIsKilledAction(this, autoSpawn, variablePanelHandler);
ClickAction locationAction = intervalSpawnHandler.getLocationAction(this, autoSpawn, variablePanelHandler);
ClickAction placeholderAction = intervalSpawnHandler.getPlaceholderAction(this, autoSpawn, variablePanelHandler);
ClickAction spawnRateAction = intervalSpawnHandler.getSpawnRateAction(this, autoSpawn, variablePanelHandler);
clickActions.add(AutoSpawnManager.createAutoSpawnAction("Spawn After Last Boss Is Killed", getSpawnAfterLastBossIsKilled()+"", intervalSpawnHandler.getSpawnAfterLastBossIsKilledExtraInformation(), clickStack.clone(), lastBossKilledAction));
clickActions.add(AutoSpawnManager.createAutoSpawnAction("Location", getLocation(), intervalSpawnHandler.getLocationExtraInformation(), clickStack.clone(), locationAction));
clickActions.add(AutoSpawnManager.createAutoSpawnAction("Placeholder", getPlaceholder(), intervalSpawnHandler.getPlaceholderExtraInformation(), clickStack.clone(), placeholderAction));
clickActions.add(AutoSpawnManager.createAutoSpawnAction("Spawn Rate", getSpawnRate()+"", intervalSpawnHandler.getSpawnRateExtraInformation(), clickStack.clone(), spawnRateAction));
return clickActions;
}
public boolean attemptSpawn(ActiveIntervalAutoSpawnHolder activeAutoSpawnHolder) {
IBossDeathHandler bossDeathHandler = activeAutoSpawnHolder.getPostDeathHandler();
AutoSpawn autoSpawn = activeAutoSpawnHolder.getAutoSpawn();
AutoSpawnSettings autoSpawnSettings = autoSpawn.getAutoSpawnSettings();
boolean customSpawnMessage = ObjectUtils.getValue(autoSpawnSettings.getOverrideDefaultSpawnMessage(), false);
String spawnMessage = autoSpawnSettings.getSpawnMessage();
int amountToSpawn = ObjectUtils.getValue(autoSpawnSettings.getAmountPerSpawn(), 1);
boolean shuffleList = ObjectUtils.getValue(autoSpawnSettings.getShuffleEntitiesList(), false);
List<String> bosses = autoSpawn.getEntities();
Location location = getSpawnLocation();
if(bosses == null || bosses.isEmpty()) {
ServerUtils.get().logDebug("BOSSES IS EMPTY!");
return false;
}
if(shuffleList) Collections.shuffle(bosses);
Queue<String> queue = new LinkedList<>(bosses);
for(int i = 1; i <= amountToSpawn; i++) {
if(queue.isEmpty()) queue = new LinkedList<>(bosses);
BossEntity bossEntity = BossAPI.getBossEntity(queue.poll());
ActiveBossHolder activeBossHolder = BossAPI.spawnNewBoss(bossEntity, location, null, null, customSpawnMessage);
if(activeBossHolder == null) continue;
activeBossHolder.getPostBossDeathHandlers().add(bossDeathHandler);
activeAutoSpawnHolder.getActiveBossHolders().add(activeBossHolder);
BossSpawnEvent bossSpawnEvent = new BossSpawnEvent(activeBossHolder, true);
ServerUtils.get().callEvent(bossSpawnEvent);
}
if(customSpawnMessage && spawnMessage != null) {
String x = NumberUtils.get().formatDouble(location.getBlockX());
String y = NumberUtils.get().formatDouble(location.getBlockY());
String z = NumberUtils.get().formatDouble(location.getBlockZ());
String world = StringUtils.get().formatString(location.getWorld().getName());
List<String> spawnMessages = BossAPI.getStoredMessages(spawnMessage);
if(spawnMessages != null) {
spawnMessages.replaceAll(s -> s.replace("{x}", x).replace("{y}", y).replace("{z}", z).replace("{world}", world));
MessageUtils.get().sendMessage(location, -1, spawnMessages);
}
}
return true;
}
public Location getSpawnLocation() {
return StringUtils.get().fromStringToLocation(this.location);
}
}