208 lines
9.6 KiB
Java
208 lines
9.6 KiB
Java
package com.massivecraft.factions.listeners;
|
|
|
|
import com.massivecraft.factions.*;
|
|
import com.massivecraft.factions.struct.ChatMode;
|
|
import com.massivecraft.factions.struct.Relation;
|
|
import com.massivecraft.factions.struct.Role;
|
|
import com.massivecraft.factions.util.WarmUpUtil;
|
|
import com.massivecraft.factions.zcore.util.TL;
|
|
import org.bukkit.Bukkit;
|
|
import org.bukkit.ChatColor;
|
|
import org.bukkit.entity.Player;
|
|
import org.bukkit.event.EventHandler;
|
|
import org.bukkit.event.EventPriority;
|
|
import org.bukkit.event.Listener;
|
|
import org.bukkit.event.player.AsyncPlayerChatEvent;
|
|
|
|
import java.util.UnknownFormatConversionException;
|
|
import java.util.logging.Level;
|
|
|
|
public class FactionsChatListener implements Listener {
|
|
|
|
// this is for handling slashless command usage and faction/alliance chat, set at lowest priority so Factions gets to them first
|
|
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
|
|
public void onPlayerEarlyChat(AsyncPlayerChatEvent event) {
|
|
Player talkingPlayer = event.getPlayer();
|
|
String msg = event.getMessage();
|
|
FPlayer me = FPlayers.getInstance().getByPlayer(talkingPlayer);
|
|
ChatMode chat = me.getChatMode();
|
|
// Is the player entering a password for a warp?
|
|
if (me.isEnteringPassword()) {
|
|
event.setCancelled(true);
|
|
me.sendMessage(ChatColor.DARK_GRAY + event.getMessage().replaceAll("(?s).", "*"));
|
|
if (me.getFaction().isWarpPassword(me.getEnteringWarp(), event.getMessage())) {
|
|
doWarmup(me.getEnteringWarp(), me);
|
|
} else {
|
|
// Invalid Password
|
|
me.msg(TL.COMMAND_FWARP_INVALID_PASSWORD);
|
|
}
|
|
me.setEnteringPassword(false, "");
|
|
return;
|
|
}
|
|
|
|
//Is it a MOD chat
|
|
if (chat == ChatMode.MOD) {
|
|
Faction myFaction = me.getFaction();
|
|
|
|
String message = String.format(Conf.modChatFormat, ChatColor.stripColor(me.getNameAndTag()), msg);
|
|
|
|
//Send to all mods
|
|
if (me.getRole().isAtLeast(Role.MODERATOR)) {
|
|
// Iterates only through the factions' members so we enhance performance.
|
|
for (FPlayer fplayer : myFaction.getFPlayers()) {
|
|
if (fplayer.getRole().isAtLeast(Role.MODERATOR)) {
|
|
fplayer.sendMessage(message);
|
|
} else if (fplayer.isSpyingChat() && me != fplayer) {
|
|
fplayer.sendMessage("[MCspy]: " + message);
|
|
}
|
|
}
|
|
} else {
|
|
// Just in case player gets demoted while in faction chat.
|
|
me.msg(TL.COMMAND_CHAT_MOD_ONLY);
|
|
event.setCancelled(true);
|
|
me.setChatMode(ChatMode.FACTION);
|
|
return;
|
|
}
|
|
|
|
|
|
Bukkit.getLogger().log(Level.INFO, ChatColor.stripColor("Mod Chat: " + message));
|
|
|
|
event.setCancelled(true);
|
|
} else if (chat == ChatMode.FACTION) {
|
|
Faction myFaction = me.getFaction();
|
|
|
|
String message = String.format(Conf.factionChatFormat, me.describeTo(myFaction), msg);
|
|
myFaction.sendMessage(message);
|
|
|
|
Bukkit.getLogger().log(Level.INFO, ChatColor.stripColor("FactionChat " + myFaction.getTag() + ": " + message));
|
|
|
|
//Send to any players who are spying chat
|
|
for (FPlayer fplayer : FPlayers.getInstance().getOnlinePlayers()) {
|
|
if (fplayer.isSpyingChat() && fplayer.getFaction() != myFaction && me != fplayer) {
|
|
fplayer.sendMessage("[FCspy] " + myFaction.getTag() + ": " + message);
|
|
}
|
|
}
|
|
|
|
event.setCancelled(true);
|
|
} else if (chat == ChatMode.ALLIANCE) {
|
|
Faction myFaction = me.getFaction();
|
|
|
|
String message = String.format(Conf.allianceChatFormat, ChatColor.stripColor(me.getNameAndTag()), msg);
|
|
|
|
//Send message to our own faction
|
|
myFaction.sendMessage(message);
|
|
|
|
//Send to all our allies
|
|
for (FPlayer fplayer : FPlayers.getInstance().getOnlinePlayers()) {
|
|
if (myFaction.getRelationTo(fplayer) == Relation.ALLY && !fplayer.isIgnoreAllianceChat()) {
|
|
fplayer.sendMessage(message);
|
|
} else if (fplayer.isSpyingChat() && me != fplayer) {
|
|
fplayer.sendMessage("[ACspy]: " + message);
|
|
}
|
|
}
|
|
|
|
Bukkit.getLogger().log(Level.INFO, ChatColor.stripColor("AllianceChat: " + message));
|
|
|
|
event.setCancelled(true);
|
|
} else if (chat == ChatMode.TRUCE) {
|
|
Faction myFaction = me.getFaction();
|
|
|
|
String message = String.format(Conf.truceChatFormat, ChatColor.stripColor(me.getNameAndTag()), msg);
|
|
|
|
//Send message to our own faction
|
|
myFaction.sendMessage(message);
|
|
|
|
//Send to all our truces
|
|
for (FPlayer fplayer : FPlayers.getInstance().getOnlinePlayers()) {
|
|
if (myFaction.getRelationTo(fplayer) == Relation.TRUCE) {
|
|
fplayer.sendMessage(message);
|
|
} else if (fplayer.isSpyingChat() && fplayer != me) {
|
|
fplayer.sendMessage("[TCspy]: " + message);
|
|
}
|
|
}
|
|
|
|
Bukkit.getLogger().log(Level.INFO, ChatColor.stripColor("TruceChat: " + message));
|
|
event.setCancelled(true);
|
|
}
|
|
}
|
|
|
|
|
|
// this is for handling insertion of the player's faction tag, set at highest priority to give other plugins a chance to modify chat first
|
|
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
|
public void onPlayerChat(AsyncPlayerChatEvent event) {
|
|
// Are we to insert the Faction tag into the format?
|
|
// If we are not to insert it - we are done.
|
|
if (!Conf.chatTagEnabled || Conf.chatTagHandledByAnotherPlugin) {
|
|
return;
|
|
}
|
|
|
|
Player talkingPlayer = event.getPlayer();
|
|
String msg = event.getMessage();
|
|
String eventFormat = event.getFormat();
|
|
FPlayer me = FPlayers.getInstance().getByPlayer(talkingPlayer);
|
|
int InsertIndex;
|
|
|
|
if (!Conf.chatTagReplaceString.isEmpty() && eventFormat.contains(Conf.chatTagReplaceString)) {
|
|
// we're using the "replace" method of inserting the faction tags
|
|
if (eventFormat.contains("[FACTION_TITLE]")) {
|
|
eventFormat = eventFormat.replace("[FACTION_TITLE]", me.getTitle());
|
|
}
|
|
|
|
InsertIndex = eventFormat.indexOf(Conf.chatTagReplaceString);
|
|
eventFormat = eventFormat.replace(Conf.chatTagReplaceString, "");
|
|
Conf.chatTagPadAfter = false;
|
|
Conf.chatTagPadBefore = false;
|
|
} else if (!Conf.chatTagInsertAfterString.isEmpty() && eventFormat.contains(Conf.chatTagInsertAfterString)) {
|
|
// we're using the "insert after string" method
|
|
InsertIndex = eventFormat.indexOf(Conf.chatTagInsertAfterString) + Conf.chatTagInsertAfterString.length();
|
|
} else if (!Conf.chatTagInsertBeforeString.isEmpty() && eventFormat.contains(Conf.chatTagInsertBeforeString)) {
|
|
// we're using the "insert before string" method
|
|
InsertIndex = eventFormat.indexOf(Conf.chatTagInsertBeforeString);
|
|
} else {
|
|
// we'll fall back to using the index place method
|
|
InsertIndex = Conf.chatTagInsertIndex;
|
|
if (InsertIndex > eventFormat.length()) {
|
|
return;
|
|
}
|
|
}
|
|
|
|
String formatStart = eventFormat.substring(0, InsertIndex) + ((Conf.chatTagPadBefore && !me.getChatTag().isEmpty()) ? " " : "");
|
|
String formatEnd = ((Conf.chatTagPadAfter && !me.getChatTag().isEmpty()) ? " " : "") + eventFormat.substring(InsertIndex);
|
|
|
|
String nonColoredMsgFormat = formatStart + me.getChatTag().trim() + formatEnd;
|
|
|
|
// Relation Colored?
|
|
if (Conf.chatTagRelationColored) {
|
|
for (Player listeningPlayer : event.getRecipients()) {
|
|
FPlayer you = FPlayers.getInstance().getByPlayer(listeningPlayer);
|
|
String yourFormat = formatStart + me.getChatTag(you).trim() + formatEnd;
|
|
try {
|
|
listeningPlayer.sendMessage(String.format(yourFormat, talkingPlayer.getDisplayName(), msg));
|
|
} catch (UnknownFormatConversionException ex) {
|
|
Conf.chatTagInsertIndex = 0;
|
|
FactionsPlugin.getInstance().log(Level.SEVERE, "Critical error in chat message formatting!");
|
|
FactionsPlugin.getInstance().log(Level.SEVERE, "NOTE: This has been automatically fixed right now by setting chatTagInsertIndex to 0.");
|
|
FactionsPlugin.getInstance().log(Level.SEVERE, "For a more proper fix, please read this regarding chat configuration: http://massivecraft.com/plugins/factions/config#Chat_configuration");
|
|
return;
|
|
}
|
|
}
|
|
|
|
// Messages are sent to players individually
|
|
// This still leaves a chance for other plugins to pick it up
|
|
event.getRecipients().clear();
|
|
}
|
|
// Message with no relation color.
|
|
event.setFormat(nonColoredMsgFormat);
|
|
}
|
|
|
|
private void doWarmup(final String warp, final FPlayer fme) {
|
|
WarmUpUtil.process(fme, WarmUpUtil.Warmup.WARP, TL.WARMUPS_NOTIFY_TELEPORT, warp, () -> {
|
|
Player player = Bukkit.getPlayer(fme.getPlayer().getUniqueId());
|
|
if (player != null) {
|
|
player.teleport(fme.getFaction().getWarp(warp).getLocation());
|
|
fme.msg(TL.COMMAND_FWARP_WARPED, warp);
|
|
}
|
|
}, FactionsPlugin.getInstance().getConfig().getLong("warmups.f-warp", 0));
|
|
}
|
|
|
|
} |