package in.twizmwaz.cardinal.module.modules.freeze;
import com.sk89q.minecraft.util.commands.ChatColor;
import in.twizmwaz.cardinal.chat.ChatConstant;
import in.twizmwaz.cardinal.chat.LocalizedChatMessage;
import in.twizmwaz.cardinal.chat.UnlocalizedChatMessage;
import in.twizmwaz.cardinal.match.Match;
import in.twizmwaz.cardinal.module.Module;
import in.twizmwaz.cardinal.module.modules.chatChannels.AdminChannel;
import in.twizmwaz.cardinal.module.modules.titleRespawn.TitleRespawn;
import in.twizmwaz.cardinal.util.ChatUtil;
import in.twizmwaz.cardinal.util.Players;
import net.md_5.bungee.api.chat.TextComponent;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.Sound;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.HandlerList;
import org.bukkit.event.player.PlayerAttackEntityEvent;
import org.bukkit.event.player.PlayerInteractEntityEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.player.PlayerTeleportEvent;
import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.inventory.ItemStack;
import java.util.HashSet;
import java.util.Set;
public class FreezeModule implements Module {
private TitleRespawn titleRespawn;
private Set<Player> frozenPlayers = new HashSet<>();
protected FreezeModule(Match match) {
this.titleRespawn = match.getModules().getModule(TitleRespawn.class);
}
public Set<Player> getFrozenPlayers() {
return frozenPlayers;
}
@Override
public void unload() {
for (Player player : frozenPlayers.toArray(new Player[frozenPlayers.size()])) unfreezePlayer(player, Bukkit.getConsoleSender());
HandlerList.unregisterAll(this);
}
public void togglePlayerFreeze(Player player, CommandSender freezer) {
if (!frozenPlayers.contains(player)) {
freezePlayer(player, freezer);
} else {
unfreezePlayer(player, freezer);
}
}
private void freezePlayer(Player player, CommandSender freezer) {
if (frozenPlayers.contains(player)) return;
ChatUtil.sendWarningMessage(player, new LocalizedChatMessage(ChatConstant.GENERIC_FROZEN_BY, Players.getName(freezer)));
ChatUtil.getAdminChannel().sendLocalizedMessage(new UnlocalizedChatMessage(AdminChannel.getPrefix() + "{0}", new LocalizedChatMessage(ChatConstant.GENERIC_FROZE, Players.getName(freezer) + ChatColor.RED, player.getDisplayName())));
player.playSound(player.getLocation(), Sound.ENTITY_ENDERDRAGON_GROWL, 1, 1);
titleRespawn.sendArmorStandPacket(player);
player.showTitle(new TextComponent(""), new TextComponent(ChatColor.RED + new LocalizedChatMessage(ChatConstant.GENERIC_FROZEN_BY, Players.getName(freezer)).getMessage(player.getLocale())), 0, Integer.MAX_VALUE, 0);
frozenPlayers.add(player);
}
private void unfreezePlayer(Player player, CommandSender freezer) {
if (!frozenPlayers.contains(player)) return;
player.sendMessage(ChatColor.GREEN + new LocalizedChatMessage(ChatConstant.GENERIC_UNFROZEN_BY, Players.getName(freezer)).getMessage(player.getLocale()));
ChatUtil.getAdminChannel().sendLocalizedMessage(new UnlocalizedChatMessage(AdminChannel.getPrefix() + "{0}", new LocalizedChatMessage(ChatConstant.GENERIC_UNFROZE, Players.getName(freezer) + ChatColor.RED, player.getDisplayName())));
player.playSound(player.getLocation(), Sound.ENTITY_ENDERDRAGON_GROWL, 1, 2);
titleRespawn.destroyArmorStandPacket(player);
player.hideTitle();
frozenPlayers.remove(player);
}
@EventHandler
public void onPlayerClick(PlayerAttackEntityEvent event) {
if (event.getPlayer().hasPermission("cardinal.punish.freeze") && event.getLeftClicked() instanceof Player) {
ItemStack item = event.getPlayer().getInventory().getItemInMainHand();
if (item != null && item.getType() == Material.ICE
&& item.getItemMeta() != null && item.getItemMeta().getDisplayName() != null
&& item.getItemMeta().getDisplayName().equals(ChatColor.AQUA + ChatConstant.UI_FREEZE_ITEM.getMessage(event.getPlayer().getLocale()))) {
togglePlayerFreeze((Player) event.getLeftClicked(), event.getPlayer());
}
}
}
@EventHandler(priority = EventPriority.LOW)
public void onPlayerInteractEvent(PlayerInteractEntityEvent event) {
if (event.getHand().equals(EquipmentSlot.HAND) && event.getPlayer().hasPermission("cardinal.punish.freeze") && event.getRightClicked() instanceof Player) {
ItemStack item = event.getPlayer().getInventory().getItem(event.getHand());
if (item != null && item.getType() == Material.ICE
&& item.getItemMeta() != null && item.getItemMeta().getDisplayName() != null
&& item.getItemMeta().getDisplayName().equals(ChatColor.AQUA + ChatConstant.UI_FREEZE_ITEM.getMessage(event.getPlayer().getLocale()))) {
event.setCancelled(true);
togglePlayerFreeze((Player) event.getRightClicked(), event.getPlayer());
}
}
}
@EventHandler
public void onPlayerTeleport(PlayerTeleportEvent event) {
if (frozenPlayers.contains(event.getPlayer())) event.setCancelled(true);
}
@EventHandler
public void onPlayerDisconnect(PlayerQuitEvent event) {
unfreezePlayer(event.getPlayer(), Bukkit.getConsoleSender());
}
}