EpicBosses/plugin-modules/Core/src/com/songoda/epicbosses/listeners/pre/BossSpawnListener.java

167 lines
6.0 KiB
Java

package com.songoda.epicbosses.listeners.pre;
import com.songoda.epicbosses.EpicBosses;
import com.songoda.epicbosses.api.BossAPI;
import com.songoda.epicbosses.entity.BossEntity;
import com.songoda.epicbosses.events.BossSpawnEvent;
import com.songoda.epicbosses.events.PreBossSpawnEvent;
import com.songoda.epicbosses.events.PreBossSpawnItemEvent;
import com.songoda.epicbosses.holder.ActiveBossHolder;
import com.songoda.epicbosses.managers.BossEntityManager;
import com.songoda.epicbosses.managers.BossLocationManager;
import com.songoda.epicbosses.managers.BossTauntManager;
import com.songoda.epicbosses.utils.*;
import com.songoda.epicbosses.utils.itemstack.ItemStackUtils;
import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.ItemStack;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* @author Charles Cullen
* @version 1.0.0
* @since 15-Oct-18
*/
public class BossSpawnListener implements Listener {
private BossLocationManager bossLocationManager;
private BossEntityManager bossEntityManager;
private BossTauntManager bossTauntManager;
public BossSpawnListener(EpicBosses epicBosses) {
this.bossTauntManager = epicBosses.getBossTauntManager();
this.bossEntityManager = epicBosses.getBossEntityManager();
this.bossLocationManager = epicBosses.getBossLocationManager();
}
@EventHandler
public void onInteract(PlayerInteractEvent event) {
Player player = event.getPlayer();
Block block = event.getClickedBlock();
BlockFace blockFace = event.getBlockFace();
Action action = event.getAction();
if (!event.hasItem()) return;
Map<BossEntity, ItemStack> entitiesAndSpawnItems = this.bossEntityManager.getMapOfEntitiesAndSpawnItems();
ItemStack itemStack = player.getItemInHand();
BossEntity bossEntity = null;
for (Map.Entry<BossEntity, ItemStack> entry : entitiesAndSpawnItems.entrySet()) {
if (ItemStackUtils.isItemStackSame(itemStack, entry.getValue())) {
bossEntity = entry.getKey();
break;
}
}
if (bossEntity == null)
return;
else {
if (action != Action.RIGHT_CLICK_BLOCK
|| block.getType() == Material.AIR) {
event.setCancelled(true);
return;
}
}
if (bossEntity.isEditing()) {
Message.Boss_Edit_CannotSpawn.msg(player);
event.setCancelled(true);
return;
}
Location location = block.getLocation().clone();
if (blockFace == BlockFace.UP) {
location.add(0, 1, 0);
}
if (!this.bossLocationManager.canSpawnBoss(player, location.clone())) {
Message.General_CannotSpawn.msg(player);
event.setCancelled(true);
return;
}
event.setCancelled(true);
ActiveBossHolder activeBossHolder = BossAPI.spawnNewBoss(bossEntity, location, player, itemStack, false);
if (activeBossHolder == null) {
event.setCancelled(true);
}
}
@EventHandler
public void onPreBossSpawnItem(PreBossSpawnItemEvent event) {
handleEvent(event);
}
@EventHandler
public void onPreBossSpawnEvent(PreBossSpawnEvent event) {
handleEvent(event);
}
private void handleEvent(PreBossSpawnEvent event) {
ActiveBossHolder activeBossHolder = event.getActiveBossHolder();
BossEntity bossEntity = activeBossHolder.getBossEntity();
Location location = activeBossHolder.getLocation();
List<String> commands = new ArrayList(this.bossEntityManager.getOnSpawnCommands(bossEntity));
List<String> messages = new ArrayList(this.bossEntityManager.getOnSpawnMessage(bossEntity));
int messageRadius = this.bossEntityManager.getOnSpawnMessageRadius(bossEntity);
ServerUtils serverUtils = ServerUtils.get();
if (event instanceof PreBossSpawnItemEvent) {
PreBossSpawnItemEvent preBossSpawnItemEvent = (PreBossSpawnItemEvent) event;
ItemStack itemStack = preBossSpawnItemEvent.getItemStackUsed().clone();
Player player = preBossSpawnItemEvent.getPlayer();
if (player.getGameMode() != GameMode.CREATIVE) {
itemStack.setAmount(1);
player.getInventory().removeItem(itemStack);
player.updateInventory();
}
if (!commands.isEmpty())
commands.replaceAll(s -> s.replaceAll("%player%", player.getName()));
if (!messages.isEmpty() && !activeBossHolder.isCustomSpawnMessage())
messages.replaceAll(s -> s.replace("{name}", player.getName()));
} else {
if (!messages.isEmpty() && !activeBossHolder.isCustomSpawnMessage())
messages.replaceAll(s -> s.replace("{name}", "Console"));
}
if (!commands.isEmpty())
commands.forEach(serverUtils::sendConsoleCommand);
if (!messages.isEmpty() && !activeBossHolder.isCustomSpawnMessage()) {
if (activeBossHolder.getName() != null)
messages.replaceAll(s -> s.replace("{boss}", activeBossHolder.getName()));
final String locationString = StringUtils.get().translateLocation(location);
messages.replaceAll(s -> s.replace("{location}", locationString));
MessageUtils.get().sendMessage(location, NumberUtils.get().getSquared(messageRadius), messages);
}
activeBossHolder.getTargetHandler().runTargetCycle();
this.bossTauntManager.handleTauntSystem(activeBossHolder);
BossSpawnEvent bossSpawnEvent = new BossSpawnEvent(activeBossHolder, false);
ServerUtils.get().callEvent(bossSpawnEvent);
}
}