/* * CraftZ * Copyright (C) JangoBrick <http://jangobrick.de/> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package craftZ.modules; import java.util.Arrays; import java.util.List; import java.util.Map.Entry; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.World; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.block.Action; import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.player.AsyncPlayerChatEvent; import org.bukkit.event.player.PlayerChangedWorldEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerKickEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import craftZ.CraftZ; import craftZ.Module; public class ChatModule extends Module { public static final String CHAT_FORMAT = ChatColor.AQUA + "[%1$s]: \"%2$s" + ChatColor.AQUA + "\""; public ChatModule(CraftZ craftZ) { super(craftZ); } @EventHandler(priority = EventPriority.MONITOR) public void onPlayerChat(AsyncPlayerChatEvent event) { FileConfiguration config = getConfig("config"); if (event.isCancelled() || config.getBoolean("Config.chat.completely-disable-modifications")) return; Player p = event.getPlayer(); World world = p.getWorld(); boolean separate = config.getBoolean("Config.chat.separate-craftz-chat"); if (isWorld(world)) { if (config.getBoolean("Config.chat.modify-player-messages")) event.setFormat(CHAT_FORMAT); String s = String.format(event.getFormat(), event.getPlayer().getDisplayName(), event.getMessage()); event.setCancelled(true); boolean ranged = config.getBoolean("Config.chat.ranged.enable"); double range = config.getDouble("Config.chat.ranged.range"); Location ploc = event.getPlayer().getLocation(); boolean radio = config.getBoolean("Config.chat.ranged.enable-radio") && event.getPlayer().getItemInHand() != null && event.getPlayer().getItemInHand().getType() == Material.WATCH; int channel = 0; try { channel = Integer.parseInt(event.getPlayer().getItemInHand().getItemMeta().getLore().get(0).replace("Channel ", "")); } catch (Exception ex) { } for (Player rp : event.getRecipients()) { boolean send_separate = !separate || ploc.getWorld().equals(rp.getWorld()); boolean send_range = ploc.getWorld().equals(rp.getWorld()) && ploc.distance(rp.getLocation()) <= range; boolean send_radio = false; for (Entry<Integer, ? extends ItemStack> entry : rp.getInventory().all(Material.WATCH).entrySet()) { ItemStack stack = entry.getValue(); if (stack != null && stack.hasItemMeta()) { int ochannel = 0; try { ochannel = Integer.parseInt(stack.getItemMeta().getLore().get(0).replace("Channel ", "")); } catch (Exception ex) { } if (ochannel == channel) send_radio = true; } } if ((!ranged && send_separate) || (ranged && send_range) || (radio && send_radio)) rp.sendMessage(s); } Bukkit.getLogger().info(s); } else { event.setCancelled(true); String s = String.format(event.getFormat(), event.getPlayer().getDisplayName(), event.getMessage()); for (Player rp : event.getRecipients()) { if (!separate || !isWorld(rp.getWorld())) rp.sendMessage(s); } CraftZ.info(s); } } @EventHandler(priority = EventPriority.HIGHEST) public void onPlayerInteract(PlayerInteractEvent event) { if (isWorld(event.getPlayer().getWorld())) { FileConfiguration config = getConfig("config"); Player p = event.getPlayer(); ItemStack item = event.getItem(); Material type = event.getMaterial(); Action action = event.getAction(); if (type == Material.WATCH && config.getBoolean("Config.chat.ranged.enable-radio")) { ItemMeta meta = item.getItemMeta(); int channel = 0; if (meta != null && meta.hasLore()) { List<String> lore = meta.getLore(); if (!lore.isEmpty()) { try { channel = Integer.parseInt(ChatColor.stripColor(lore.get(0)).replace("Channel ", "")); } catch (NumberFormatException ex) { } } } if (action == Action.RIGHT_CLICK_AIR || action == Action.RIGHT_CLICK_BLOCK) { channel++; } else if (action == Action.LEFT_CLICK_AIR || action == Action.LEFT_CLICK_BLOCK) { channel--; } channel = Math.max(Math.min(channel, config.getInt("Config.chat.ranged.radio-channels")), 1); meta.setLore(Arrays.asList("" + ChatColor.RESET + ChatColor.GRAY + "Channel " + channel)); item.setItemMeta(meta); p.sendMessage(getMsg("Messages.radio-channel").replace("%c", "" + channel)); } } } @EventHandler(priority = EventPriority.HIGHEST) public void onPlayerDeath(PlayerDeathEvent event) { final Player p = event.getEntity(); if (isWorld(p.getWorld())) { if (getConfig("config").getBoolean("Config.chat.modify-death-messages")) event.setDeathMessage(p.getDisplayName() + " was killed."); } } @EventHandler(priority = EventPriority.HIGHEST) public void onPlayerJoin(PlayerJoinEvent event) { Player p = event.getPlayer(); if (isWorld(p.getWorld())) { if (getConfig("config").getBoolean("Config.chat.modify-join-and-quit-messages")) event.setJoinMessage(ChatColor.RED + "Player " + p.getDisplayName() + ChatColor.RESET + ChatColor.RED + " connected."); } } @EventHandler(priority = EventPriority.HIGHEST) public void onWorldChanged(PlayerChangedWorldEvent event) { if (!getConfig("config").getBoolean("Config.chat.modify-join-and-quit-messages")) return; Player p = event.getPlayer(); World w = p.getWorld(); World f = event.getFrom(); if (isWorld(f)) { CraftZ.broadcastToWorld((ChatColor.RED + "Player " + p.getDisplayName() + " disconnected."), f); } else if (isWorld(w)) { CraftZ.broadcastToWorld((ChatColor.RED + "Player " + p.getDisplayName() + " connected."), w); } } @EventHandler(priority = EventPriority.HIGHEST) public void onPlayerQuit(PlayerQuitEvent event) { Player p = event.getPlayer(); if (isWorld(p.getWorld())) { if (getConfig("config").getBoolean("Config.chat.modify-join-and-quit-messages")) event.setQuitMessage(ChatColor.RED + "Player " + p.getDisplayName() + ChatColor.RESET + ChatColor.RED + " disconnected."); } } @EventHandler(priority = EventPriority.HIGHEST) public void onPlayerKick(PlayerKickEvent event) { Player p = event.getPlayer(); if (isWorld(p.getWorld())) { if (!event.getReason().startsWith(getCraftZ().getPrefix())) { if (getConfig("config").getBoolean("Config.chat.modify-join-and-quit-messages")) event.setLeaveMessage(ChatColor.RED + "Player " + p.getDisplayName() + " disconnected."); } } } }