summaryrefslogtreecommitdiffstats
path: root/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayerListenerNormal.java
diff options
context:
space:
mode:
Diffstat (limited to 'EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayerListenerNormal.java')
-rw-r--r--EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayerListenerNormal.java101
1 files changed, 89 insertions, 12 deletions
diff --git a/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayerListenerNormal.java b/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayerListenerNormal.java
index 910518302..4fe8e7df5 100644
--- a/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayerListenerNormal.java
+++ b/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayerListenerNormal.java
@@ -3,9 +3,17 @@ package com.earth2me.essentials.chat;
import static com.earth2me.essentials.I18n._;
import com.earth2me.essentials.IEssentials;
import com.earth2me.essentials.User;
+import static com.earth2me.essentials.chat.EssentialsChatPlayer.logger;
+import java.util.HashSet;
+import java.util.Iterator;
import java.util.Locale;
import java.util.Map;
+import java.util.Set;
+import net.ess3.api.events.LocalChatSpyEvent;
+import org.bukkit.Location;
import org.bukkit.Server;
+import org.bukkit.World;
+import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.player.AsyncPlayerChatEvent;
@@ -15,12 +23,11 @@ public class EssentialsChatPlayerListenerNormal extends EssentialsChatPlayer
{
public EssentialsChatPlayerListenerNormal(final Server server,
final IEssentials ess,
- final Map<String, IEssentialsChatListener> listeners,
final Map<AsyncPlayerChatEvent, ChatStore> chatStorage)
{
- super(server, ess, listeners, chatStorage);
+ super(server, ess, chatStorage);
}
-
+
@EventHandler(priority = EventPriority.NORMAL)
@Override
public void onPlayerChat(final AsyncPlayerChatEvent event)
@@ -33,40 +40,110 @@ public class EssentialsChatPlayerListenerNormal extends EssentialsChatPlayer
/**
* This file should handle detection of the local chat features... if local chat is enabled, we need to handle
* it here
- */
+ */
long radius = ess.getSettings().getChatRadius();
if (radius < 1)
{
return;
}
radius *= radius;
-
+
final ChatStore chatStore = getChatStore(event);
final User user = chatStore.getUser();
chatStore.setRadius(radius);
-
+
if (event.getMessage().length() > 1 && chatStore.getType().length() > 0)
{
final StringBuilder permission = new StringBuilder();
permission.append("essentials.chat.").append(chatStore.getType());
-
+
if (user.isAuthorized(permission.toString()))
{
final StringBuilder format = new StringBuilder();
format.append(chatStore.getType()).append("Format");
event.setMessage(event.getMessage().substring(1));
- event.setFormat(_(format.toString(), event.getFormat()));
+ event.setFormat(_(format.toString(), event.getFormat()));
return;
}
-
+
final StringBuilder errorMsg = new StringBuilder();
errorMsg.append("notAllowedTo").append(chatStore.getType().substring(0, 1).toUpperCase(Locale.ENGLISH)).append(chatStore.getType().substring(1));
-
+
user.sendMessage(_(errorMsg.toString()));
event.setCancelled(true);
return;
}
-
- sendLocalChat(event, chatStore);
+
+ final Location loc = user.getLocation();
+ final World world = loc.getWorld();
+
+ if (charge(event, chatStore) == false)
+ {
+ return;
+ }
+
+ Set<Player> outList = event.getRecipients();
+ Set<Player> spyList = new HashSet<Player>();
+
+ try
+ {
+ outList.add(event.getPlayer());
+ }
+ catch (UnsupportedOperationException ex)
+ {
+ if (ess.getSettings().isDebug())
+ {
+ ess.getLogger().info("Plugin triggered custom chat event, local chat handling aborted.");
+ }
+ return;
+ }
+
+ String type = _("chatTypeLocal");
+ event.setFormat(type.concat(event.getFormat()));
+
+ logger.info(_("localFormat", user.getName(), event.getMessage()));
+
+ final Iterator<Player> it = outList.iterator();
+ while (it.hasNext())
+ {
+ final Player onlinePlayer = it.next();
+ final User onlineUser = ess.getUser(onlinePlayer);
+ if (!onlineUser.equals(user))
+ {
+ boolean abort = false;
+ final Location playerLoc = onlineUser.getLocation();
+ if (playerLoc.getWorld() != world)
+ {
+ abort = true;
+ }
+ else
+ {
+ final double delta = playerLoc.distanceSquared(loc);
+ if (delta > chatStore.getRadius())
+ {
+ abort = true;
+ }
+ }
+ if (abort)
+ {
+ if (onlineUser.isAuthorized("essentials.chat.spy"))
+ {
+ spyList.add(onlinePlayer);
+ }
+ outList.remove(onlinePlayer);
+ }
+ }
+ }
+
+ LocalChatSpyEvent spyEvent = new LocalChatSpyEvent(event.isAsynchronous(), event.getPlayer(), event.getFormat(), event.getMessage(), spyList);
+ server.getPluginManager().callEvent(spyEvent);
+
+ if (!spyEvent.isCancelled())
+ {
+ for (Player onlinePlayer : spyEvent.getRecipients())
+ {
+ onlinePlayer.sendMessage(String.format(event.getFormat(), user.getDisplayName(), event.getMessage()));
+ }
+ }
}
}