package in.twizmwaz.cardinal.module.modules.score;
import in.twizmwaz.cardinal.GameHandler;
import in.twizmwaz.cardinal.event.ScoreUpdateEvent;
import in.twizmwaz.cardinal.module.Module;
import in.twizmwaz.cardinal.module.modules.team.TeamModule;
import in.twizmwaz.cardinal.module.modules.tntTracker.TntTracker;
import in.twizmwaz.cardinal.util.TeamUtils;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.HandlerList;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.PlayerDeathEvent;
public class ScoreModule implements Module {
private final TeamModule team;
private int score;
private final int pointsPerKill;
private final int pointsPerDeath;
private final int max;
public ScoreModule(final TeamModule team, final int pointsPerKill, final int pointsPerDeath, final int max) {
this.team = team;
this.score = 0;
this.pointsPerKill = pointsPerKill;
this.pointsPerDeath = pointsPerDeath;
this.max = max;
}
@Override
public void unload() {
HandlerList.unregisterAll(this);
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
public int getPointsPerKill() {
return pointsPerKill;
}
public int getPointsPerDeath() {
return pointsPerDeath;
}
public int getMax() {
return max;
}
public TeamModule getTeam() {
return team;
}
@EventHandler
public void onPlayerDeath(PlayerDeathEvent event) {
if (matchHasScoring()) {
if (event.getEntity().getKiller() != null) {
if (TeamUtils.getTeamByPlayer(event.getEntity().getKiller()) != null) {
if (TeamUtils.getTeamByPlayer(event.getEntity().getKiller()) == team) {
score += pointsPerKill;
Bukkit.getServer().getPluginManager().callEvent(new ScoreUpdateEvent(this));
}
}
} else {
if (TeamUtils.getTeamByPlayer(event.getEntity()) != null) {
if (TeamUtils.getTeamByPlayer(event.getEntity()) == team) {
try {
EntityDamageEvent.DamageCause cause = event.getEntity().getLastDamageCause().getCause();
if (cause.equals(EntityDamageEvent.DamageCause.BLOCK_EXPLOSION) || cause.equals(EntityDamageEvent.DamageCause.ENTITY_EXPLOSION)) {
if (event.getEntity().getLastDamageCause() instanceof EntityDamageByEntityEvent) {
EntityDamageByEntityEvent damageByEntityEvent = (EntityDamageByEntityEvent) event.getEntity().getLastDamageCause();
if (TntTracker.getWhoPlaced(damageByEntityEvent.getDamager()) != null) {
if (Bukkit.getOfflinePlayer(TntTracker.getWhoPlaced(damageByEntityEvent.getDamager())).isOnline()) {
Player source = Bukkit.getPlayer(TntTracker.getWhoPlaced(damageByEntityEvent.getDamager()));
if (TeamUtils.getTeamByPlayer(source) != team) {
return;
}
}
}
}
}
score -= pointsPerDeath;
Bukkit.getServer().getPluginManager().callEvent(new ScoreUpdateEvent(this));
} catch (NullPointerException e) {
}
} else {
try {
EntityDamageEvent.DamageCause cause = event.getEntity().getLastDamageCause().getCause();
if (cause.equals(EntityDamageEvent.DamageCause.BLOCK_EXPLOSION) || cause.equals(EntityDamageEvent.DamageCause.ENTITY_EXPLOSION)) {
if (event.getEntity().getLastDamageCause() instanceof EntityDamageByEntityEvent) {
EntityDamageByEntityEvent damageByEntityEvent = (EntityDamageByEntityEvent) event.getEntity().getLastDamageCause();
if (TntTracker.getWhoPlaced(damageByEntityEvent.getDamager()) != null) {
if (Bukkit.getOfflinePlayer(TntTracker.getWhoPlaced(damageByEntityEvent.getDamager())).isOnline()) {
Player source = Bukkit.getPlayer(TntTracker.getWhoPlaced(damageByEntityEvent.getDamager()));
if (TeamUtils.getTeamByPlayer(source) != team) {
score += pointsPerKill;
Bukkit.getServer().getPluginManager().callEvent(new ScoreUpdateEvent(this));
}
}
}
}
}
} catch (NullPointerException e) {
}
}
}
}
}
}
public static boolean matchHasScoring() {
return matchHasPointsPerKill() || matchHasPointsPerDeath() || matchHasMax();
}
public static boolean matchHasPointsPerKill() {
for (ScoreModule score : GameHandler.getGameHandler().getMatch().getModules().getModules(ScoreModule.class)) {
if (score.getPointsPerKill() != 0) {
return true;
}
}
return false;
}
public static boolean matchHasPointsPerDeath() {
for (ScoreModule score : GameHandler.getGameHandler().getMatch().getModules().getModules(ScoreModule.class)) {
if (score.getPointsPerDeath() != 0) {
return true;
}
}
return false;
}
public static boolean matchHasMax() {
for (ScoreModule score : GameHandler.getGameHandler().getMatch().getModules().getModules(ScoreModule.class)) {
if (score.getMax() != 0) {
return true;
}
}
return false;
}
public static int max() {
int max = 0;
for (ScoreModule score : GameHandler.getGameHandler().getMatch().getModules().getModules(ScoreModule.class)) {
max = score.getMax();
}
return max;
}
}