فهرست منبع

Don't run party chat on a separate thread

Fixes #2080
TfT_02 11 سال پیش
والد
کامیت
96fdf265d5

+ 1 - 0
Changelog.txt

@@ -32,6 +32,7 @@ Version 1.5.01-dev
  = Fixed bug where falling blocks were incorrectly tracked
  = Fixed bug where items would get deleted when in Berserk with a full inventory
  = Fixed bug where the console would not correctly show party chat colors
+ = Fixed bug where party chat was using non thread safe methods
  ! Changed SecondaryAbilityEvent to implement Cancellable and it now gets fired for damage related secondary abilities
  ! Changed the way mcMMO handles bonus damage, updated for the new damage event API
  ! Changed player data saving. Save tasks are now asynchronous

+ 2 - 22
src/main/java/com/gmail/nossr50/chat/PartyChatManager.java

@@ -1,16 +1,11 @@
 package com.gmail.nossr50.chat;
 
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.bukkit.ChatColor;
-import org.bukkit.entity.Player;
 import org.bukkit.plugin.Plugin;
 
 import com.gmail.nossr50.config.Config;
 import com.gmail.nossr50.datatypes.party.Party;
 import com.gmail.nossr50.events.chat.McMMOPartyChatEvent;
-import com.gmail.nossr50.locale.LocaleLoader;
+import com.gmail.nossr50.runnables.party.PartyChatTask;
 
 public class PartyChatManager extends ChatManager {
     private Party party;
@@ -30,21 +25,6 @@ public class PartyChatManager extends ChatManager {
 
     @Override
     protected void sendMessage() {
-        if (Config.getInstance().getPartyChatColorLeaderName() && senderName.equalsIgnoreCase(party.getLeader())) {
-            message = message.replaceFirst(Pattern.quote(displayName), ChatColor.GOLD + Matcher.quoteReplacement(displayName) + ChatColor.RESET);
-        }
-
-        for (Player member : party.getOnlineMembers()) {
-            member.sendMessage(message);
-        }
-
-        if (party.getAlly() != null) {
-            for (Player member : party.getAlly().getOnlineMembers()) {
-                String allyPrefix = LocaleLoader.formatString(Config.getInstance().getPartyChatPrefixAlly());
-                member.sendMessage(allyPrefix + message);
-            }
-        }
-
-        plugin.getServer().getConsoleSender().sendMessage("[mcMMO] [P]<" + party.getName() + ">" + message);
+        new PartyChatTask(plugin, party, senderName, displayName, message).runTask(plugin);
     }
 }

+ 51 - 0
src/main/java/com/gmail/nossr50/runnables/party/PartyChatTask.java

@@ -0,0 +1,51 @@
+package com.gmail.nossr50.runnables.party;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.bukkit.ChatColor;
+import org.bukkit.entity.Player;
+import org.bukkit.plugin.Plugin;
+import org.bukkit.scheduler.BukkitRunnable;
+
+import com.gmail.nossr50.config.Config;
+import com.gmail.nossr50.datatypes.party.Party;
+import com.gmail.nossr50.locale.LocaleLoader;
+
+public class PartyChatTask extends BukkitRunnable {
+    private Plugin plugin;
+
+    private Party party;
+    private String senderName;
+    private String displayName;
+    private String message;
+
+    public PartyChatTask(Plugin plugin, Party party, String senderName, String displayName, String message) {
+        this.plugin = plugin;
+
+        this.party = party;
+        this.senderName = senderName;
+        this.displayName = displayName;
+        this.message = message;
+    }
+
+    @Override
+    public void run() {
+        if (Config.getInstance().getPartyChatColorLeaderName() && senderName.equalsIgnoreCase(party.getLeader())) {
+            message = message.replaceFirst(Pattern.quote(displayName), ChatColor.GOLD + Matcher.quoteReplacement(displayName) + ChatColor.RESET);
+        }
+
+        for (Player member : party.getOnlineMembers()) {
+            member.sendMessage(message);
+        }
+
+        if (party.getAlly() != null) {
+            for (Player member : party.getAlly().getOnlineMembers()) {
+                String allyPrefix = LocaleLoader.formatString(Config.getInstance().getPartyChatPrefixAlly());
+                member.sendMessage(allyPrefix + message);
+            }
+        }
+
+        plugin.getServer().getConsoleSender().sendMessage("[mcMMO] [P]<" + party.getName() + ">" + message);
+    }
+}