2018-11-17 18:58:21 +01:00
|
|
|
package com.songoda.epicbosses.listeners.during;
|
|
|
|
|
2019-10-07 22:53:51 +02:00
|
|
|
import com.songoda.epicbosses.EpicBosses;
|
2018-11-17 18:58:21 +01:00
|
|
|
import com.songoda.epicbosses.api.BossAPI;
|
|
|
|
import com.songoda.epicbosses.entity.BossEntity;
|
|
|
|
import com.songoda.epicbosses.events.PreBossSkillEvent;
|
|
|
|
import com.songoda.epicbosses.holder.ActiveBossHolder;
|
|
|
|
import com.songoda.epicbosses.managers.BossEntityManager;
|
|
|
|
import com.songoda.epicbosses.managers.BossSkillManager;
|
|
|
|
import com.songoda.epicbosses.managers.files.SkillsFileManager;
|
|
|
|
import com.songoda.epicbosses.skills.Skill;
|
|
|
|
import com.songoda.epicbosses.utils.Debug;
|
|
|
|
import com.songoda.epicbosses.utils.RandomUtils;
|
|
|
|
import com.songoda.epicbosses.utils.ServerUtils;
|
|
|
|
import org.bukkit.entity.Entity;
|
|
|
|
import org.bukkit.entity.LivingEntity;
|
2019-04-10 01:06:14 +02:00
|
|
|
import org.bukkit.entity.Player;
|
|
|
|
import org.bukkit.entity.Projectile;
|
2018-11-17 18:58:21 +01:00
|
|
|
import org.bukkit.event.EventHandler;
|
|
|
|
import org.bukkit.event.EventPriority;
|
|
|
|
import org.bukkit.event.Listener;
|
|
|
|
import org.bukkit.event.entity.EntityDamageByEntityEvent;
|
|
|
|
|
2019-10-07 22:53:51 +02:00
|
|
|
import java.util.Arrays;
|
|
|
|
import java.util.Collections;
|
|
|
|
import java.util.List;
|
2018-11-17 18:58:21 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @author Charles Cullen
|
|
|
|
* @version 1.0.0
|
|
|
|
* @since 17-Nov-18
|
|
|
|
*/
|
|
|
|
public class BossSkillListener implements Listener {
|
|
|
|
|
|
|
|
private BossEntityManager bossEntityManager;
|
|
|
|
private SkillsFileManager skillsFileManager;
|
2018-11-18 09:29:58 +01:00
|
|
|
private BossSkillManager bossSkillManager;
|
2018-11-17 18:58:21 +01:00
|
|
|
|
2019-10-07 22:53:51 +02:00
|
|
|
public BossSkillListener(EpicBosses plugin) {
|
2018-11-18 09:29:58 +01:00
|
|
|
this.bossSkillManager = plugin.getBossSkillManager();
|
2018-11-17 18:58:21 +01:00
|
|
|
this.bossEntityManager = plugin.getBossEntityManager();
|
|
|
|
this.skillsFileManager = plugin.getSkillsFileManager();
|
|
|
|
}
|
|
|
|
|
|
|
|
@EventHandler(priority = EventPriority.MONITOR)
|
|
|
|
public void onBossDamage(EntityDamageByEntityEvent event) {
|
|
|
|
Entity entityBeingDamaged = event.getEntity();
|
|
|
|
Entity entityDamaging = event.getDamager();
|
|
|
|
|
2019-10-08 00:34:11 +02:00
|
|
|
if (!(entityBeingDamaged instanceof LivingEntity)) return;
|
2019-04-10 01:06:14 +02:00
|
|
|
|
|
|
|
if (entityDamaging instanceof Projectile) {
|
|
|
|
Projectile projectile = (Projectile) entityDamaging;
|
|
|
|
LivingEntity shooter = (LivingEntity) projectile.getShooter();
|
|
|
|
|
|
|
|
if (shooter instanceof Player) {
|
|
|
|
entityDamaging = shooter;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-10-08 00:34:11 +02:00
|
|
|
if (!(entityDamaging instanceof LivingEntity)) return;
|
2018-11-17 18:58:21 +01:00
|
|
|
|
|
|
|
LivingEntity livingEntity = (LivingEntity) entityBeingDamaged;
|
|
|
|
ActiveBossHolder activeBossHolder = this.bossEntityManager.getActiveBossHolder(livingEntity);
|
|
|
|
|
2019-10-08 00:34:11 +02:00
|
|
|
if (activeBossHolder == null) return;
|
2018-11-17 18:58:21 +01:00
|
|
|
|
|
|
|
BossEntity bossEntity = activeBossHolder.getBossEntity();
|
|
|
|
|
2019-10-08 00:34:11 +02:00
|
|
|
if (bossEntity.getSkills() == null || bossEntity.getSkills().getOverallChance() == null) return;
|
2018-11-17 18:58:21 +01:00
|
|
|
|
2019-10-08 00:34:11 +02:00
|
|
|
if (RandomUtils.get().canPreformAction(bossEntity.getSkills().getOverallChance())) {
|
2018-11-17 18:58:21 +01:00
|
|
|
PreBossSkillEvent preBossSkillEvent = new PreBossSkillEvent(activeBossHolder, livingEntity, (LivingEntity) entityDamaging);
|
|
|
|
|
|
|
|
ServerUtils.get().callEvent(preBossSkillEvent);
|
2018-11-18 09:56:06 +01:00
|
|
|
}
|
2018-11-17 18:58:21 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@EventHandler
|
|
|
|
public void onPreSkill(PreBossSkillEvent event) {
|
|
|
|
ActiveBossHolder activeBossHolder = event.getActiveBossHolder();
|
|
|
|
BossEntity bossEntity = event.getActiveBossHolder().getBossEntity();
|
|
|
|
LivingEntity damagingEntity = event.getDamagingEntity();
|
|
|
|
List<String> skills = bossEntity.getSkills().getSkills();
|
|
|
|
List<String> masterMessage = BossAPI.getStoredMessages(bossEntity.getSkills().getMasterMessage());
|
|
|
|
|
2019-10-08 00:34:11 +02:00
|
|
|
if (skills.isEmpty()) {
|
2018-11-17 18:58:21 +01:00
|
|
|
Debug.SKILL_EMPTY_SKILLS.debug(BossAPI.getBossEntityName(bossEntity));
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
Collections.shuffle(skills);
|
|
|
|
|
|
|
|
String skillInput = skills.get(0);
|
|
|
|
Skill skill = this.skillsFileManager.getSkill(skillInput);
|
|
|
|
|
2019-10-08 00:34:11 +02:00
|
|
|
if (skill == null) {
|
2018-11-17 18:58:21 +01:00
|
|
|
Debug.SKILL_NOT_FOUND.debug();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2019-04-06 08:34:35 +02:00
|
|
|
String customMessage = skill.getCustomMessage();
|
|
|
|
if (customMessage != null)
|
2020-05-09 21:44:36 +02:00
|
|
|
masterMessage = BossAPI.getStoredMessages(skill.getCustomMessage());
|
2019-04-06 08:34:35 +02:00
|
|
|
|
2018-11-18 09:56:06 +01:00
|
|
|
List<LivingEntity> targettedEntities = this.bossSkillManager.getTargetedEntities(activeBossHolder, skill, activeBossHolder.getLivingEntity().getLocation(), damagingEntity);
|
|
|
|
|
2018-12-09 16:36:59 +01:00
|
|
|
this.bossSkillManager.handleSkill(masterMessage, skill, targettedEntities, activeBossHolder, true, false);
|
2018-11-17 18:58:21 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|