package in.twizmwaz.cardinal.module.modules.classModule;
import com.google.common.base.Optional;
import in.twizmwaz.cardinal.GameHandler;
import in.twizmwaz.cardinal.chat.ChatConstant;
import in.twizmwaz.cardinal.chat.LocalizedChatMessage;
import in.twizmwaz.cardinal.event.CardinalSpawnEvent;
import in.twizmwaz.cardinal.event.ClassChangeEvent;
import in.twizmwaz.cardinal.module.Module;
import in.twizmwaz.cardinal.module.modules.kit.KitNode;
import in.twizmwaz.cardinal.module.modules.team.TeamModule;
import in.twizmwaz.cardinal.util.Teams;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.HandlerList;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
public class ClassModule implements Module {
public static Map<UUID, ClassModule> playerClass = new HashMap<>();
private final String name;
private final String description;
private final String longDescription;
private final Material icon;
private final boolean sticky;
private final boolean defaultClass;
private final boolean restrict;
private final KitNode kit;
protected ClassModule(final String name, final String description, final String longDescription, final Material icon, final boolean sticky, final boolean defaultClass, final boolean restrict, final KitNode kit) {
this.name = name;
this.description = description;
this.longDescription = longDescription;
this.icon = icon;
this.sticky = sticky;
this.defaultClass = defaultClass;
this.restrict = restrict;
this.kit = kit;
}
public static ClassModule getClassByPlayer(Player player) {
if (playerClass.containsKey(player.getUniqueId())) return playerClass.get(player.getUniqueId());
return null;
}
public static ClassModule getClassByName(String name) {
for (ClassModule classModule : GameHandler.getGameHandler().getMatch().getModules().getModules(ClassModule.class)) {
if (classModule.getName().equalsIgnoreCase(name) || classModule.getName().toLowerCase().startsWith(name.toLowerCase()))
return classModule;
}
return null;
}
public static boolean defaultClassPresent() {
for (ClassModule classModule : GameHandler.getGameHandler().getMatch().getModules().getModules(ClassModule.class)) {
if (classModule.isDefaultClass()) return true;
}
return false;
}
@EventHandler
public void onClassChange(ClassChangeEvent event) {
if (event.getClassModule().equals(this)) {
Optional<TeamModule> team = Teams.getTeamByPlayer(event.getPlayer());
if (sticky && team.isPresent() && !Teams.getTeamByPlayer(event.getPlayer()).get().isObserver()) {
event.setCancelled(true);
event.getPlayer().sendMessage(ChatColor.RED + new LocalizedChatMessage(ChatConstant.ERROR_NO_CLASS_CHANGE).getMessage(event.getPlayer().getLocale()));
}
if (restrict && !event.getPlayer().isOp()) {
event.setCancelled(true);
event.getPlayer().sendMessage(ChatColor.RED + new LocalizedChatMessage(ChatConstant.ERROR_CLASS_RESTRICTED, ChatColor.AQUA + name + ChatColor.RED).getMessage(event.getPlayer().getLocale()));
}
if (!event.isCancelled()) {
event.getPlayer().sendMessage(ChatColor.GREEN + new LocalizedChatMessage(ChatConstant.GENERIC_HAVE_SELECTED, ChatColor.GOLD + "" + ChatColor.UNDERLINE + name + ChatColor.GREEN).getMessage(event.getPlayer().getLocale()));
}
}
}
@EventHandler(priority = EventPriority.HIGHEST)
public void onPgmSpawn(CardinalSpawnEvent event) {
if (event.isCancelled()) return;
if (!playerClass.containsKey(event.getPlayer().getUniqueId()) && (this.defaultClass || (!defaultClassPresent() && GameHandler.getGameHandler().getMatch().getModules().getModule(ClassModule.class).equals(this))))
playerClass.put(event.getPlayer().getUniqueId(), this);
if (playerClass.containsKey(event.getPlayer().getUniqueId()) && playerClass.get(event.getPlayer().getUniqueId()).equals(this)) {
if (kit != null) kit.apply(event.getPlayer(), null);
}
}
@Override
public void unload() {
HandlerList.unregisterAll(this);
}
public Material getIcon() {
return icon;
}
public String getName() {
return name;
}
public String getLongDescription() {
return longDescription;
}
public boolean isDefaultClass() {
return defaultClass;
}
public String getDescription() {
return description;
}
}