aboutsummaryrefslogtreecommitdiff
path: root/mod/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'mod/src/main')
-rw-r--r--mod/src/main/java/kr/syeyoung/dungeonsguide/mod/chat/ChatProcessor.java2
-rw-r--r--mod/src/main/java/kr/syeyoung/dungeonsguide/mod/chat/ChatRoutine.java209
-rw-r--r--mod/src/main/java/kr/syeyoung/dungeonsguide/mod/commands/CommandDgDebug.java195
-rw-r--r--mod/src/main/java/kr/syeyoung/dungeonsguide/mod/party/MessageMatcher.java73
-rw-r--r--mod/src/main/java/kr/syeyoung/dungeonsguide/mod/party/PartyManager.java213
-rw-r--r--mod/src/main/resources/party_languages.json694
6 files changed, 1271 insertions, 115 deletions
diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/chat/ChatProcessor.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/chat/ChatProcessor.java
index 206aed96..6a2295d9 100644
--- a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/chat/ChatProcessor.java
+++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/chat/ChatProcessor.java
@@ -75,7 +75,7 @@ public class ChatProcessor {
Minecraft.getMinecraft().thePlayer.sendChatMessage(tuple.getFirst());
if (tuple.getSecond() != null)
tuple.getSecond().run();
- minimumNext = System.currentTimeMillis() + 200;
+ minimumNext = System.currentTimeMillis() + 700;
ChatTransmitter.sendDebugChat(new ChatComponentText("Sending " + tuple.getFirst() + " Secretly"));
}
diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/chat/ChatRoutine.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/chat/ChatRoutine.java
new file mode 100644
index 00000000..5339cb2f
--- /dev/null
+++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/chat/ChatRoutine.java
@@ -0,0 +1,209 @@
+/*
+ * Dungeons Guide - The most intelligent Hypixel Skyblock Dungeons Mod
+ * Copyright (C) 2023 cyoung06 (syeyoung)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+package kr.syeyoung.dungeonsguide.mod.chat;
+
+import kr.syeyoung.dungeonsguide.mod.DungeonsGuide;
+import kr.syeyoung.dungeonsguide.mod.chat.ChatProcessResult;
+import kr.syeyoung.dungeonsguide.mod.chat.ChatProcessor;
+import kr.syeyoung.dungeonsguide.mod.chat.ChatSubscriber;
+import kr.syeyoung.dungeonsguide.mod.chat.ChatTransmitter;
+import kr.syeyoung.dungeonsguide.mod.events.annotations.EventHandlerRegistry;
+import lombok.AllArgsConstructor;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.gui.GuiMainMenu;
+import net.minecraft.client.gui.GuiMultiplayer;
+import net.minecraft.client.multiplayer.WorldClient;
+import net.minecraft.realms.RealmsBridge;
+
+import java.net.HttpURLConnection;
+import java.net.ProtocolException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+import java.util.function.Consumer;
+import java.util.function.Predicate;
+
+public class ChatRoutine {
+ List<Action> actions = new ArrayList<>();
+
+ public static interface Action {
+ void execute(Runnable next);
+ }
+ @AllArgsConstructor
+ public static class ActionSay implements Action {
+ String str;
+
+ @Override
+ public void execute(Runnable next) {
+ ChatProcessor.INSTANCE.addToChatQueue(str, next, false);
+ }
+ }
+ @AllArgsConstructor
+ public static class ActionOtherSay implements Action {
+ String str;
+
+ @Override
+ public void execute(Runnable next) {
+ try {
+ HttpURLConnection huc = (HttpURLConnection) new URL("http://localhost:3000/").openConnection();
+ huc.setDoOutput(true);
+ huc.setRequestMethod("POST");
+ huc.getOutputStream().write(str.getBytes());
+ huc.connect();
+ huc.getResponseCode();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ next.run();
+ }
+ }
+
+ @AllArgsConstructor
+ public static class ActionListen implements Action{
+ Consumer<List<String>> callback;
+
+ @Override
+ public void execute(Runnable next) {
+ ChatProcessor.INSTANCE.subscribe(new ChatSubscriber() {
+ int state = 0;
+ List<String> lol = new ArrayList<>();
+ @Override
+ public ChatProcessResult process(String txt, Map<String, Object> context) {
+ if (txt.startsWith("§9§m----------")) {
+ state++;
+ }
+ if (state > 0) {
+ lol.add(txt);
+ }
+ if (state == 2){
+ callback.accept(lol);
+ Minecraft.getMinecraft().addScheduledTask(next);
+ return ChatProcessResult.REMOVE_LISTENER;
+ }
+ return ChatProcessResult.NONE;
+ }
+ });
+ }
+ }
+
+ @AllArgsConstructor
+ public static class ActionListen2 implements Action{
+ Predicate<String> starting;
+ Consumer<String> callback;
+
+ @Override
+ public void execute(Runnable next) {
+ ChatProcessor.INSTANCE.subscribe(new ChatSubscriber() {
+ @Override
+ public ChatProcessResult process(String txt, Map<String, Object> context) {
+ if (starting.test(txt)) {
+ callback.accept(txt);
+ Minecraft.getMinecraft().addScheduledTask(next);
+ return ChatProcessResult.REMOVE_LISTENER;
+ }
+ return ChatProcessResult.NONE;
+ }
+ });
+ }
+ }
+ private static final ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor(DungeonsGuide.THREAD_FACTORY);
+
+ public static class ActionRejoinHypickle implements Action {
+
+ @Override
+ public void execute(Runnable next) {
+ Minecraft.getMinecraft().theWorld.sendQuittingDisconnectingPacket();
+ Minecraft.getMinecraft().loadWorld((WorldClient)null);
+ GuiMultiplayer guiMultiplayer;
+ Minecraft.getMinecraft().displayGuiScreen(guiMultiplayer = new GuiMultiplayer(new GuiMainMenu()));
+ ses.schedule(() -> {
+ Minecraft.getMinecraft().addScheduledTask(() -> {
+ guiMultiplayer.selectServer(0);
+ guiMultiplayer.connectToSelected();
+
+ ses.schedule(() -> {
+ Minecraft.getMinecraft().addScheduledTask(next::run);
+ }, 10, TimeUnit.SECONDS);
+ });
+ }, 3, TimeUnit.SECONDS);
+ }
+ }
+
+ @AllArgsConstructor
+ public static class ActionRun implements Action {
+ private Runnable runnable;
+ @Override
+ public void execute(Runnable next) {
+ runnable.run();
+ next.run();
+ }
+ }
+ @AllArgsConstructor
+ public static class ActionWait implements Action {
+ private int ms;
+
+ @Override
+ public void execute(Runnable next) {
+ ses.schedule(() -> {
+ Minecraft.getMinecraft().addScheduledTask(next);
+ }, ms, TimeUnit.MILLISECONDS);
+ }
+ }
+
+ public void run() {
+
+ }
+
+ public void say(String a) {
+ actions.add(new ActionSay(a));
+ }
+ public void otherSay(String a) {
+ actions.add(new ActionOtherSay(a));
+ }
+ public void justRun(Runnable runnable) {
+ actions.add(new ActionRun(runnable));
+ }
+ public void waitForPartyMessage(Consumer<List<String>> callback) {
+ actions.add(new ActionListen(callback));
+ }
+ public void waitForSingleMessageMatching(Predicate<String> matcher, Consumer<String> callback) {
+ actions.add(new ActionListen2(matcher, callback));
+ }
+ public void justWait(int ms) {
+ actions.add(new ActionWait(ms));
+ }
+
+ public void rejoinHypickle() {
+ actions.add(new ActionRejoinHypickle());
+ }
+ Iterator<Action> iterator;
+ private void next() {
+ iterator.next().execute(this::next);
+ }
+ public void execute() {
+ run();
+ iterator = actions.iterator();
+ next();
+ }
+}
diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/commands/CommandDgDebug.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/commands/CommandDgDebug.java
index ad917532..28a702d3 100644
--- a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/commands/CommandDgDebug.java
+++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/commands/CommandDgDebug.java
@@ -25,6 +25,7 @@ import kr.syeyoung.dungeonsguide.dungeon.mechanics.dunegonmechanic.DungeonMechan
import kr.syeyoung.dungeonsguide.launcher.Main;
import kr.syeyoung.dungeonsguide.mod.DungeonsGuide;
import kr.syeyoung.dungeonsguide.mod.SkyblockStatus;
+import kr.syeyoung.dungeonsguide.mod.chat.ChatRoutine;
import kr.syeyoung.dungeonsguide.mod.chat.ChatTransmitter;
import kr.syeyoung.dungeonsguide.mod.dungeon.DungeonContext;
import kr.syeyoung.dungeonsguide.mod.dungeon.events.DungeonEventHolder;
@@ -67,6 +68,7 @@ import java.security.*;
import java.security.cert.CertificateException;
import java.util.List;
import java.util.*;
+import java.util.function.Consumer;
public class CommandDgDebug extends CommandBase {
@Override
@@ -106,7 +108,8 @@ public class CommandDgDebug extends CommandBase {
"clearprofile",
"fullbright",
"gimmebright",
- "pfall"
+ "pfall",
+ "partycollection"
};
@Override
@@ -202,6 +205,9 @@ public class CommandDgDebug extends CommandBase {
case "reloadshader":
ShaderManager.onResourceReload();
break;
+ case "partycollection":
+ partyCollectionCommand(args[1], args[2], args[3]);
+ break;
default:
ChatTransmitter.addToQueue(new ChatComponentText("ain't gonna find much anything here"));
ChatTransmitter.addToQueue(new ChatComponentText("§eDungeons Guide §7:: §e/dg loadrooms §7-§f Reloads dungeon roomdata."));
@@ -685,4 +691,191 @@ public class CommandDgDebug extends CommandBase {
t.printStackTrace();
}
}
+
+ private void partyCollectionCommand(String otherPlayerName, String fragbot, String offline) {
+
+ String sourcePlayer = Minecraft.getMinecraft().thePlayer.getName();
+ String targetPlayer = otherPlayerName;
+ String thirdPlayer = fragbot;
+ String offlinePlayer = offline;
+ StringBuilder sb = new StringBuilder();
+ Consumer writer = (obj) -> {
+ sb.append("\n***************************\n");
+ if (obj instanceof List) {
+ for (Object obj2: (List) obj) {
+ sb.append("\n> ");
+ sb.append(obj2);
+ }
+ } else {
+ sb.append("\n> ");
+ sb.append(obj);
+ }
+ sb.append("\n");
+ };
+
+ new ChatRoutine() {
+ @Override
+ public void run() {
+ String langs = "ENGLISH, GERMAN, FRENCH, DUTCH, SPANISH, ITALIAN, CHINESE_SIMPLIFIED, CHINESE_TRADITIONAL, PORTUGUESE_BR, RUSSIAN, KOREAN, POLISH, JAPANESE, PIRATE, NORWEGIAN, PORTUGUESE_PT, SWEDISH, TURKISH, DANISH, CZECH, FINNISH, GREEK, UKRAINIAN, ROMANIAN, HUNGARIAN";
+ for (String s : langs.split(",")) {
+ say("/lang "+s.trim());
+ waitForSingleMessageMatching(a -> a.startsWith("§r§a"), (a) -> {});
+ justWait(500);
+ justRun(() -> writer.accept("\n\n$$LANGUAGE$$: "+s+"\n\n"));
+ rejoinHypickle();
+
+ say("/p leave");
+ say("/chat a");
+
+ otherSay("/p "+sourcePlayer);
+ waitForSingleMessageMatching(a -> a.startsWith("§9§m-----------------------------------------------------§r§9"), (a) -> {});
+ say("/p accept "+targetPlayer);
+ waitForPartyMessage((a) -> {});
+
+ otherSay("/p promote "+sourcePlayer);
+ waitForPartyMessage((a) -> {});
+ otherSay("/p "+thirdPlayer);
+ waitForPartyMessage((a) -> {});
+ waitForPartyMessage((a) -> {});
+
+ otherSay("/p leave");
+ waitForPartyMessage(writer);
+
+ say("/p disband");
+ //~ §ehas disbanded the party!§r
+ waitForPartyMessage(writer);
+
+
+ say("/p settings allinvite");
+ // §cYou are not currently in a party.§r
+ waitForPartyMessage(writer);
+ say("/p mute");
+ // §cYou are not in a party!§r
+ waitForPartyMessage(writer);
+ say("/p disband");
+ // §cYou are not in a party right now.§r
+ waitForPartyMessage(writer);
+ say("/chat p");
+ // §cYou must be in a party to join the party channel!§r
+ waitForPartyMessage(writer);
+
+
+
+ say("/p "+targetPlayer);
+ // §b[MVP§r§a+§r§b] syeyoung §r§einvited §r§b[MVP§r§0+§r§b] Azael_Nya §r§eto the party! They have §r§c60 §r§eseconds to accept.§r
+ waitForPartyMessage(writer);
+ justWait(500);
+
+ otherSay("/p accept syeyoung");
+ // §b[MVP§r§0+§r§b] Azael_Nya §r§ejoined the party.§r
+ waitForPartyMessage(writer);
+
+ say("/chat p");
+ // §aYou are now in the §r§6PARTY§r§a channel§r
+ waitForSingleMessageMatching((a) -> a.startsWith("§a") || a.startsWith("§6"), writer);
+
+
+ say("/p settings allinvite");
+ // §b[MVP§r§a+§r§b] syeyoung §r§aenabled All Invite§r
+ waitForPartyMessage(writer);
+ say("/p settings allinvite");
+ // §b[MVP§r§a+§r§b] syeyoung §r§cdisabled All Invite§r
+ waitForPartyMessage(writer);
+
+ say("/p 99999999999999999");
+ // §cCouldn't find a player with that name!§r
+ waitForPartyMessage(writer);
+ say("/p "+offlinePlayer);
+ // §cYou cannot invite that player since they're not online.
+ waitForPartyMessage(writer);
+
+
+ say("/p promote "+targetPlayer);
+ // §b[MVP§r§f+§r§b] apotato321§r§e has promoted §r§a[VIP§r§6+§r§a] syeyoung §r§eto Party Moderator§r
+ waitForPartyMessage(writer);
+ say("/p promote "+targetPlayer);
+ // §a[VIP§r§6+§r§a] syeyoung§r§e has promoted §r§b[MVP§r§f+§r§b] apotato321 §r§eto Party Leader§r
+ waitForPartyMessage(writer);
+ otherSay("/p demote "+sourcePlayer);
+ // §b[MVP§r§a+§r§b] syeyoung§r§e has demoted §r§b[MVP§r§0+§r§b] Azael_Nya §r§eto Party Member§r
+ waitForPartyMessage(writer);
+ otherSay("/p transfer "+sourcePlayer);
+ // §eThe party was transferred to §r§b[MVP§r§f+§r§b] apotato321 §r§eby §r§a[VIP§r§6+§r§a] syeyoung§r
+ waitForPartyMessage(writer);
+
+ // leaves
+ otherSay("/p leave");
+ // §b[MVP§r§0+§r§b] Azael_Nya §r§ehas left the party.§r
+ waitForPartyMessage(writer);
+
+ otherSay("/p "+thirdPlayer);
+ // §cThe party was disbanded because all invites expired and the party was empty.§r
+ waitForPartyMessage(writer);
+
+ say("smth");
+ // §cYou are not in a party and were moved to the ALL channel.§r
+ waitForPartyMessage(writer);
+
+ otherSay("/p "+sourcePlayer);
+ // §r§b[MVP§r§0+§r§b] Azael_Nya §r§ehas invited you to join their party!
+ // §r§eYou have §r§c60 §r§eseconds to accept. §r§6Click here to join!§r§9
+ waitForSingleMessageMatching(a -> a.startsWith("§9§m-----------------------------------------------------§r§9"), writer);
+
+ justWait(1000);
+
+ say("/p "+targetPlayer);
+ // §eYou have joined §r§b[MVP§r§0+§r§b] Azael_Nya's §r§eparty!§r
+ waitForPartyMessage(writer);
+
+ say("/p "+offlinePlayer);
+ // §cYou are not allowed to invite players.§r
+ waitForPartyMessage(writer);
+
+ otherSay("/p kick "+thirdPlayer);
+ // §ehas been removed from the party.§r
+ waitForPartyMessage(writer);
+ otherSay("/p kick "+sourcePlayer);
+ // §eYou have been kicked from the party by
+ waitForPartyMessage(writer);
+
+ // invite
+ say("/p "+targetPlayer);
+ waitForPartyMessage((a) -> {});
+ justWait(500);
+ otherSay("/p accept "+sourcePlayer);
+ waitForPartyMessage((a) -> {});
+
+ say("/pl");
+ // §6Party Members
+ waitForPartyMessage(writer);
+ say("/p leave");
+ // §eYou left the party.§r
+ waitForPartyMessage(writer);
+ // --disbanded--
+ waitForPartyMessage((a) -> {});
+
+ justRun(() -> {
+
+ try {
+ String total = sb.toString();
+ FileOutputStream fos = new FileOutputStream("partymessages.txt");
+ fos.write(total.getBytes());
+ fos.flush();
+ fos.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ });
+
+ }
+
+ say("/lang ENGLISH");
+
+ }
+ }.execute();
+
+
+
+ }
}
diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/party/MessageMatcher.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/party/MessageMatcher.java
new file mode 100644
index 00000000..822af607
--- /dev/null
+++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/party/MessageMatcher.java
@@ -0,0 +1,73 @@
+/*
+ * Dungeons Guide - The most intelligent Hypixel Skyblock Dungeons Mod
+ * Copyright (C) 2023 cyoung06 (syeyoung)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+package kr.syeyoung.dungeonsguide.mod.party;
+
+import lombok.AllArgsConstructor;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class MessageMatcher {
+ List<String> simpleEquals = new ArrayList<>();
+ List<PatternData> regexPatterns = new ArrayList<>();
+
+ @AllArgsConstructor
+ public static class PatternData {
+ Pattern pattern;
+ int flags;
+ }
+
+ public MessageMatcher(List<String> patterns) {
+ for (String pattern : patterns) {
+ if (pattern.startsWith("=")) simpleEquals.add(pattern.substring(1));
+ else regexPatterns.add(new PatternData(Pattern.compile(pattern.substring(1), Pattern.DOTALL | Pattern.MULTILINE),
+ (pattern.contains("<p0>") ? 1 : 0) |
+ (pattern.contains("<p1>") ? 2 : 0) |
+ (pattern.contains("<p2>") ? 4 : 0)
+ ));
+ }
+ }
+
+ public boolean match(String str, Map<String, String> matchGroups) {
+ if (matchGroups != null)
+ matchGroups.clear();
+ for (String simpleEqual : simpleEquals) {
+ if (simpleEqual.equals(str)) return true;
+ }
+
+ for (PatternData regexPattern : regexPatterns) {
+ Matcher m = regexPattern.pattern.matcher(str);
+ if (m.matches()) {
+ if (matchGroups != null) {
+ if ((regexPattern.flags & 4) > 0)
+ matchGroups.put("2", m.group("p2"));
+ if ((regexPattern.flags & 2) > 0)
+ matchGroups.put("1", m.group("p1"));
+ if ((regexPattern.flags & 1) > 0)
+ matchGroups.put("0", m.group("p0"));
+ }
+ return true;
+ }
+ }
+ return false;
+ }
+}
diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/party/PartyManager.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/party/PartyManager.java
index 3a5d1f58..51d374d3 100644
--- a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/party/PartyManager.java
+++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/party/PartyManager.java
@@ -18,6 +18,7 @@
package kr.syeyoung.dungeonsguide.mod.party;
+import kr.syeyoung.dungeonsguide.mod.DungeonsGuide;
import kr.syeyoung.dungeonsguide.mod.chat.ChatProcessResult;
import kr.syeyoung.dungeonsguide.mod.chat.ChatProcessor;
import kr.syeyoung.dungeonsguide.mod.chat.ChatSubscriber;
@@ -34,12 +35,15 @@ import lombok.Setter;
import net.minecraft.client.Minecraft;
import net.minecraft.util.ChatComponentText;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
+import org.apache.commons.io.IOUtils;
import org.json.JSONArray;
import org.json.JSONObject;
+import java.io.IOException;
import java.security.SecureRandom;
import java.util.*;
import java.util.function.Consumer;
+import java.util.stream.Collectors;
public class PartyManager {
public static final PartyManager INSTANCE = new PartyManager();
@@ -65,21 +69,69 @@ public class PartyManager {
private Set<Consumer<PartyContext>> partyBuiltCallback = new HashSet<>();
+
+ private final MessageMatcher NOT_IN_PARTY;
+ private final MessageMatcher PARTY_CHANNEL;
+ private final MessageMatcher TRANSFER_LEFT;
+ private final MessageMatcher ALL_INVITE_ON;
+ private final MessageMatcher ALL_INVITE_OFF;
+ private final MessageMatcher PARTY_JOIN;
+ private final MessageMatcher PARTY_LEAVE;
+ private final MessageMatcher INVITED;
+ private final MessageMatcher INVITE_PERM;
+ private final MessageMatcher TRANSFER;
+ private final MessageMatcher PROMOTE_LEADER;
+ private final MessageMatcher PROMOTE_MODERATOR;
+ private final MessageMatcher MEMBER;
+ private final MessageMatcher ACCEPT_INVITE_LEADER;
+ private final MessageMatcher ACCEPT_INVITE_MEMBERS;
+
+ private MessageMatcher createMatcher(JSONObject object, String key) {
+ return new MessageMatcher(object.getJSONArray(key).toList().stream()
+ .filter(a -> a instanceof String)
+ .map(a -> (String) a)
+ .collect(Collectors.toList()));
+ }
+
+ private String processName(String name) {
+ String username = null;
+ for (String s : TextUtils.stripColor(name).split(" ")) {
+ if (s.startsWith("[")) continue;
+ username = s;
+ break;
+ }
+ return username;
+ }
+
public PartyManager() {
+ try {
+ JSONObject jsonObject = new JSONObject(IOUtils.toString(Objects.requireNonNull(DungeonsGuide.class.getResourceAsStream("/party_languages.json"))));
+ NOT_IN_PARTY = createMatcher(jsonObject, "not_in_party");
+ PARTY_CHANNEL = createMatcher(jsonObject, "party_channel");
+ ALL_INVITE_ON = createMatcher(jsonObject, "all_invite_on");
+ ALL_INVITE_OFF = createMatcher(jsonObject, "all_invite_off");
+ PARTY_JOIN = createMatcher(jsonObject, "party_join");
+ PARTY_LEAVE = createMatcher(jsonObject, "party_leave");
+ INVITED = createMatcher(jsonObject, "invited");
+ INVITE_PERM = createMatcher(jsonObject, "invite_perm");
+ TRANSFER = createMatcher(jsonObject, "transfer");
+ TRANSFER_LEFT = createMatcher(jsonObject, "transfer_left");
+ PROMOTE_LEADER = createMatcher(jsonObject, "promote_leader");
+ PROMOTE_MODERATOR = createMatcher(jsonObject, "promote_moderator");
+ MEMBER = createMatcher(jsonObject, "member");
+ ACCEPT_INVITE_LEADER = createMatcher(jsonObject, "accept_invite_leader");
+ ACCEPT_INVITE_MEMBERS = createMatcher(jsonObject, "accept_invite_members");
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+
+
ChatProcessor cp = ChatProcessor.INSTANCE;
// Not in Party
cp.subscribe(new ChatSubscriber() {
@Override
public ChatProcessResult process(String str, Map<String, Object> a) {
- if (str.equals("§cYou are not currently in a party.§r")
- || str.equals("§eYou left the party.§r")
- || str.equals("§cYou must be in a party to join the party channel!§r")
- || str.equals("§cThe party was disbanded because all invites expired and the party was empty§r")
- || str.equals("§cYou are not in a party and were moved to the ALL channel.§r")
- || str.startsWith("§cThe party was disbanded")
- || str.endsWith("§ehas disbanded the party!§r")
- || str.startsWith("§cYou are not in a party")
- || str.startsWith("§eYou have been kicked from the party by ")) {
+ if (NOT_IN_PARTY.match(str, null)) {
PartyManager.this.leaveParty();
for (Consumer<PartyContext> partyContextConsumer : partyBuiltCallback) {
@@ -99,11 +151,10 @@ public class PartyManager {
cp.subscribe(new ChatSubscriber() {
@Override
public ChatProcessResult process(String str, Map<String, Object> a) {
- if (str.endsWith("§aenabled All Invite§r")) {
+ if (ALL_INVITE_ON.match(str, null)) {
PartyManager.this.getPartyContext(true).setAllInvite(true);
a.put("type", "allinvite_on");
- } else if (str.endsWith("§cdisabled All Invite§r")
- || str.equals("§cYou are not allowed to invite players.§r")) {
+ } else if (ALL_INVITE_OFF.match(str, null)) {
PartyManager.this.getPartyContext(true).setAllInvite(false);
a.put("type", "allinvite_off");
PartyManager.this.potentialInvitenessChange();
@@ -183,39 +234,23 @@ public class PartyManager {
});
// Player party join / leave
cp.subscribe(new ChatSubscriber() {
+ Map<String, String> matches = new HashMap<>();
@Override
public ChatProcessResult process(String str, Map<String, Object> a) {
- if (str.endsWith("§ejoined the party.§r")) {
- String username = null;
- for (String s : TextUtils.stripColor(str).split(" ")) {
- if (s.startsWith("[")) continue;
- username = s;
- break;
- }
+ if (PARTY_JOIN.match(str, matches)) {
+ String username = processName(matches.get("1"));
if (username != null) {
PartyManager.this.getPartyContext(true).addPartyMember(username);
}
a.put("type", "party_join");
- } else if (str.endsWith("§ehas been removed from the party.§r")
- || str.endsWith("§ehas left the party.§r")) {
- String username = null;
- for (String s : TextUtils.stripColor(str).split(" ")) {
- if (s.startsWith("[")) continue;
- username = s;
- break;
- }
+ } else if (PARTY_LEAVE.match(str, matches)) {
+ String username = processName(matches.getOrDefault("1", matches.get("2")));
if (username != null && partyContext != null) {
PartyManager.this.getPartyContext().removeFromParty(username);
}
a.put("type", "party_leave");
- } else if (str.endsWith(" They have §r§c60 §r§eseconds to accept.§r")) {
- String[] messageSplit = TextUtils.stripColor(str).split(" ");
- String inviter = null;
- for (String s : messageSplit) {
- if (s.startsWith("[")) continue;
- inviter = s;
- break;
- }
+ } else if (INVITED.match(str, matches)) {
+ String inviter = processName(matches.get("0"));
if (inviter != null && partyContext != null) {
if (PartyManager.this.getPartyContext().hasMember(inviter)) {
PartyManager.this.getPartyContext().setAllInvite(true);
@@ -223,7 +258,7 @@ public class PartyManager {
}
PartyManager.this.getPartyContext(true).setPartyExistHypixel(true);
a.put("type", "party_invite_exist");
- } else if (str.equals("§cCouldn't find a player with that name!§r") || str.equals("§cYou cannot invite that player since they're not online.")) {
+ } else if (INVITE_PERM.match(str, null)) {
a.put("type", "party_invite_noexist");
String username = Minecraft.getMinecraft().getSession().getUsername();
if (partyContext != null && PartyManager.this.getPartyContext().hasMember(username)) {
@@ -235,51 +270,32 @@ public class PartyManager {
});
// Promotion
cp.subscribe(new ChatSubscriber() {
+ Map<String, String> matches = new HashMap<>();
@Override
public ChatProcessResult process(String str, Map<String, Object> a) {
- if (str.startsWith("§eThe party was transferred to ")) {
- // §eThe party was transferred to §r§b[MVP§r§f+§r§b] apotato321 §r§eby §r§a[VIP§r§6+§r§a] syeyoung§r
- String[] messageSplit = TextUtils.stripColor(str.substring(31)).split(" ");
- String newLeader = null;
- for (String s : messageSplit) {
- if (s.startsWith("[")) continue;
- newLeader = s;
- break;
- }
- String oldLeader;
- boolean left = false;
- if (str.endsWith("§r§eleft§r")) {
- oldLeader = messageSplit[messageSplit.length - 2];
- left = true;
- } else {
- oldLeader = messageSplit[messageSplit.length - 1];
- }
+ if (TRANSFER.match(str, matches)) {
+ String newLeader = processName(matches.get("0"));
+ String oldLeader = processName(matches.get("1"));
if (oldLeader != null && newLeader != null) {
PartyManager.this.getPartyContext(true).setPartyOwner(newLeader);
- if (left)
- PartyManager.this.getPartyContext(true).removeFromParty(oldLeader);
- else
- PartyManager.this.getPartyContext(true).addPartyModerator(oldLeader);
+ PartyManager.this.getPartyContext(true).addPartyModerator(oldLeader);
}
a.put("type", "party_transfer");
PartyManager.this.potentialInvitenessChange();
- } else if (str.endsWith("§eto Party Leader§r")) {
- // §a[VIP§r§6+§r§a] syeyoung§r§e has promoted §r§b[MVP§r§f+§r§b] apotato321 §r§eto Party Leader§r
- String[] messageSplit = TextUtils.stripColor(str).split(" ");
- String oldLeader = null;
- for (String s : messageSplit) {
- if (s.startsWith("[")) continue;
- oldLeader = s;
- break;
- }
- messageSplit = TextUtils.stripColor(str.substring(str.indexOf("has promoted") + 13)).split(" ");
- String newLeader = null;
- for (String s : messageSplit) {
- if (s.startsWith("[")) continue;
- newLeader = s;
- break;
+ } else if (TRANSFER_LEFT.match(str, matches)) {
+ String newLeader = processName(matches.get("0"));
+ String oldLeader = processName(matches.get("1"));
+
+ if (oldLeader != null && newLeader != null) {
+ PartyManager.this.getPartyContext(true).setPartyOwner(newLeader);
+ PartyManager.this.getPartyContext(true).removeFromParty(oldLeader);
}
+ a.put("type", "party_transfer");
+ PartyManager.this.potentialInvitenessChange();
+ } else if (PROMOTE_LEADER.match(str, matches)) {
+ String oldLeader = processName(matches.get("0"));
+ String newLeader = processName(matches.get("1"));
if (oldLeader != null && newLeader != null) {
PartyManager.this.getPartyContext(true).setPartyOwner(newLeader);
@@ -287,22 +303,9 @@ public class PartyManager {
}
a.put("type", "party_transfer");
PartyManager.this.potentialInvitenessChange();
- } else if (str.endsWith("§r§eto Party Moderator§r")) {
- // §b[MVP§r§f+§r§b] apotato321§r§e has promoted §r§a[VIP§r§6+§r§a] syeyoung §r§eto Party Moderator§r
- String[] messageSplit = TextUtils.stripColor(str).split(" ");
- String oldLeader = null;
- for (String s : messageSplit) {
- if (s.startsWith("[")) continue;
- oldLeader = s;
- break;
- }
- messageSplit = TextUtils.stripColor(str.substring(str.indexOf("has promoted") + 13)).split(" ");
- String newModerator = null;
- for (String s : messageSplit) {
- if (s.startsWith("[")) continue;
- newModerator = s;
- break;
- }
+ } else if (PROMOTE_MODERATOR.match(str, matches)) {
+ String oldLeader = processName(matches.get("0"));
+ String newModerator = processName(matches.get("1"));
if (oldLeader != null && newModerator != null) {
PartyManager.this.getPartyContext(true).setPartyOwner(oldLeader);
@@ -310,21 +313,9 @@ public class PartyManager {
}
a.put("type", "party_promotion");
PartyManager.this.potentialInvitenessChange();
- } else if (str.endsWith("§r§eto Party Member§r")) {
- String[] messageSplit = TextUtils.stripColor(str).split(" ");
- String oldLeader = null;
- for (String s : messageSplit) {
- if (s.startsWith("[")) continue;
- oldLeader = s;
- break;
- }
- messageSplit = TextUtils.stripColor(str.substring(str.indexOf("has demoted") + 12)).split(" ");
- String newMember = null;
- for (String s : messageSplit) {
- if (s.startsWith("[")) continue;
- newMember = s;
- break;
- }
+ } else if (MEMBER.match(str, matches)) {
+ String oldLeader = processName(matches.get("1"));
+ String newMember = processName(matches.get("0"));
if (oldLeader != null && newMember != null) {
PartyManager.this.getPartyContext(true).setPartyOwner(oldLeader);
@@ -339,24 +330,20 @@ public class PartyManager {
// Player Join
cp.subscribe(new ChatSubscriber() {
boolean joined;
+ Map<String, String> matches = new HashMap<>();
@Override
public ChatProcessResult process(String str, Map<String, Object> context) {
- if (str.startsWith("§eYou have joined ")) {
- String[] messageSplit = TextUtils.stripColor(str.substring(18)).split(" ");
- String leader = null;
- for (String s : messageSplit) {
- if (s.startsWith("[")) continue;
- leader = s;
- break;
- }
+ if (ACCEPT_INVITE_LEADER.match(str, matches)) {
+ String leader = processName(matches.get("1"));
+
leader = leader.substring(0, leader.length()-2); // remove 's
partyContext = new PartyContext();
getPartyContext().setPartyOwner(leader);
getPartyContext().addPartyMember(Minecraft.getMinecraft().getSession().getUsername());
context.put("type", "party_selfjoin_leader");
joined= true;
- } else if (str.startsWith("§eYou'll be partying with: ")) {
- String[] players = TextUtils.stripColor(str.substring(27)).split(" ");
+ } else if (ACCEPT_INVITE_MEMBERS.match(str, matches)) {
+ String[] players = TextUtils.stripColor(matches.get("2")).split(" ");
for (String player : players) {
if (player.startsWith("[")) continue;
getPartyContext().addRawMember(player);
diff --git a/mod/src/main/resources/party_languages.json b/mod/src/main/resources/party_languages.json
new file mode 100644
index 00000000..a3fd97d3
--- /dev/null
+++ b/mod/src/main/resources/party_languages.json
@@ -0,0 +1,694 @@
+{
+ "not_in_party": [
+ "R(?<p0>.+)\\ §r§ehas\\ disbanded\\ the\\ party!§r",
+ "=§cYou are not currently in a party.§r",
+ "=§cYou are not in a party!§r",
+ "=§cYou are not in a party right now.§r",
+ "=§cYou must be in a party to join the party channel!§r",
+ "=§cThe party was disbanded because all invites expired and the party was empty.§r",
+ "=§cYou are not in a party and were moved to the ALL channel.§r",
+ "R§eYou\\ have\\ been\\ kicked\\ from\\ the\\ party\\ by\\ §r(?<p1>.+)\\ §r§e§r",
+ "=§eYou left the party.§r",
+ "R(?<p0>.+)\\ §r§ehat\\ die\\ Party\\ aufgelöst!§r",
+ "=§cDu bist aktuell in keiner Party.§r",
+ "=§cYou are not in a party!§r",
+ "=§cDu bist im Moment in keiner Party.§r",
+ "=§cDu musst in einer Party sein um den Party-Chat betreten zu können!§r",
+ "=§cDie Party wurde aufgelöst, weil alle Einladungen abgelaufen sind und die Party leer war.§r",
+ "=§cDu befindest dich nicht in einer Party und wurdest in den ALL-Kanal verschoben.§r",
+ "R§eDu\\ wurdest\\ von\\ §r(?<p1>.+)\\ §r§eaus\\ der\\ Party\\ gekickt§r",
+ "=§eDu hast die Party verlassen.§r",
+ "R(?<p0>.+)\\ §r§ea\\ dissout\\ la\\ party!§r",
+ "=§cVous n'êtes pas actuellement dans une party.§r",
+ "=§cYou are not in a party!§r",
+ "=§cVous n'êtes pas actuellement dans une party.§r",
+ "=§cVous devez être dans une party pour rejoindre le canal de party!§r",
+ "=§cLa party a été dissoute car toutes les invitations ont expirées et la party était vide.§r",
+ "=§cVous n'êtes pas dans une party et avez été déplacé dans le canal PUBLIC.§r",
+ "R§eVous\\ avez\\ été\\ expulsé\\ de\\ la\\ party\\ par\\ §r(?<p1>.+)\\ §r§e§r",
+ "=§eVous avez quitté la party.§r",
+ "R(?<p0>.+)\\ §r§eheeft\\ de\\ party\\ ontbonden!§r",
+ "=§cJe bent momenteel niet in een party.§r",
+ "=§cYou are not in a party!§r",
+ "=§cJe zit nu niet in een party.§r",
+ "=§cJe moet in een party zitten om het partykanaal te kunnen betreden!§r",
+ "R(?<p1>.+)\\ §r§everliet\\ de\\ party\\.§r",
+ "=§cJe zit niet in een party en bent verplaatst naar het openbare kanaal.§r",
+ "R§eJe\\ bent\\ door\\ §r(?<p1>.+)\\ §r§euit\\ de\\ party\\ verwijderd§r",
+ "=§eJe verliet de party.§r",
+ "R§e¡§r(?<p0>.+)\\ §r§eha\\ disuelto\\ la\\ party!§r",
+ "=§cActualmente no estás en una party.§r",
+ "=§cYou are not in a party!§r",
+ "=§cNo estás en una party ahora mismo.§r",
+ "=§c¡Debes estar en una party para usar el canal de party!§r",
+ "=§cLa party fue disuelta porque todas las invitaciones expiraron y la party estaba vacía.§r",
+ "=§cNo estás en una party y fuiste movido al canal TODO.§r",
+ "R§eHas\\ sido\\ expulsado\\ de\\ la\\ party\\ por\\ §r(?<p1>.+)\\ §r§e§r",
+ "=§eHas abandonado la party.§r",
+ "R(?<p0>.+)\\ §r§eha\\ sciolto\\ il\\ party!§r",
+ "=§cNon sei in un party al momento.§r",
+ "=§cYou are not in a party!§r",
+ "=§cNon sei in un party al momento.§r",
+ "=§cDevi essere in un party per entrare nel canale party!§r",
+ "=§cIl party è stato sciolto perché tutti gli inviti sono scaduti e il party era vuoto.§r",
+ "=§cNon sei in un party e sei stato spostato nel canale TUTTI.§r",
+ "R§eSei\\ stato\\ cacciato\\ dal\\ party\\ da\\ §r(?<p1>.+)\\ §r§e§r",
+ "=§eHai lasciato il party.§r",
+ "R(?<p0>.+)§r§e解散了组队!§r",
+ "=§c你当前不在组队中。§r",
+ "=§cYou are not in a party!§r",
+ "=§c你当前不在组队中。§r",
+ "=§c你必须加入一个组队才能使用组队频道!§r",
+ "R(?<p1>.+)§r§e离开了组队。§r",
+ "=§c你不在任何组队中,故被移至公共频道。§r",
+ "R§e你已被§r(?<p1>.+)§r§e踢出组队§r",
+ "=§e你离开了组队。§r",
+ "R(?<p0>.+)§r§e\\ 解散了組隊!§r",
+ "=§c你目前不在組隊裡。§r",
+ "=§cYou are not in a party!§r",
+ "=§c你目前不在組隊裡。§r",
+ "=§c你必須在組隊裡才能使用組隊頻道!§r",
+ "=§c組隊因所有邀請均已過期且沒有沒有成員而解散。§r",
+ "=§c你並不在任何組隊裡,故將你移至公頻。§r",
+ "R§e你已被\\ §r(?<p1>.+)§r§e\\ 踢出組隊§r",
+ "=§e你離開了組隊。§r",
+ "R(?<p0>.+)\\ §r§edesfez\\ a\\ party!§r",
+ "=§cVocê não está em uma party.§r",
+ "=§cYou are not in a party!§r",
+ "=§cVocê não está em uma party.§r",
+ "=§cVocê precisa estar em uma party para usar este canal!§r",
+ "=§cA party foi desfeita pois todos os convites expiraram e a party estava vazia.§r",
+ "=§cVocê não está em uma party e foi movido para o canal PÚBLICO§r",
+ "R§eVocê\\ foi\\ expulso\\ da\\ party\\ por\\ §r(?<p1>.+)\\ §r§e§r",
+ "=§eVocê saiu da party.§r",
+ "R(?<p0>.+)\\ §r§eраспустил\\ компанию!§r",
+ "=§cВы не состоите в компании.§r",
+ "=§cYou are not in a party!§r",
+ "=§cВы не в компании.§r",
+ "=§cВы должны быть в компании, чтобы выбрать данный канал!§r",
+ "=§cКомпания была распущена, потому что все приглашения истекли и компания пуста.§r",
+ "=§cВы не в компании и были перемещены в ОБЩИЙ канал.§r",
+ "R§eВы\\ были\\ выгнаны\\ из\\ компании\\ игроком\\ §r(?<p1>.+)\\ §r§e§r",
+ "=§eВы покинули компанию.§r",
+ "R(?<p0>.+)§r§e이\\(가\\)\\ Party를\\ 해산했습니다!§r",
+ "=§c현재 Party에 있지 않습니다.§r",
+ "=§cYou are not in a party!§r",
+ "=§c지금은 Party에 있지 않습니다.§r",
+ "=§c참여한 Party가 있어야 Party 채널에 입장할 수 있습니다!§r",
+ "=§c모든 초대가 만료되고 Party가 비었기 때문에 Party가 해산되었습니다.§r",
+ "=§cParty에 있지 않아 전체 채널로 이동되었습니다.§r",
+ "R(?<p1>.+)§r§e에\\ 의해\\ Party에서\\ 추방되었습니다§r",
+ "=§eParty를 떠났습니다.§r",
+ "R(?<p0>.+)\\ §r§erozwiązuje\\ party!§r",
+ "=§cNie jesteś obecnie w party.§r",
+ "=§cYou are not in a party!§r",
+ "=§cNie jesteś teraz w party.§r",
+ "=§cMusisz być w party, żeby dołączyć do kanału party!§r",
+ "=§cThe party was disbanded because all invites expired and the party was empty.§r",
+ "=§cNie jesteś w party i został(a)sz przeniesiony(-a) do kanału WSZYSTKIE.§r",
+ "R§eZostałeś\\(\\-aś\\)\\ wyrzucony\\(\\-a\\)\\ z\\ party\\ przez\\ §r(?<p1>.+)\\ §r§e§r",
+ "=§eOpuszczono party.§r",
+ "R(?<p0>.+)\\ §r§eが\\ Party\\ を解散させました!§r",
+ "=§c現在あなたは Party に参加していません。§r",
+ "=§cYou are not in a party!§r",
+ "=§cあなたは現在 Party に参加していません。§r",
+ "=§cParty チャンネルに参加するには Party に参加している必要があります!§r",
+ "=§cすべての招待の有効期限が切れ、誰もいなくなったため、Partyは解散されました。§r",
+ "=§cParty から退出したため、全体チャンネルに移動しました。§r",
+ "R§eあなたは\\ §r(?<p1>.+)§r§e\\ によって\\ Party\\ から退出させられました§r",
+ "=§eParty から退出しました。§r",
+ "R(?<p0>.+)\\ §r§ehas\\ disbanded\\ th'\\ party!§r",
+ "=§cYe nah be in a party.§r",
+ "=§cYou are not in a party!§r",
+ "=§cYe nah be in a party right now.§r",
+ "=§cYe must be in a party t' join th' party channel!§r",
+ "=§cTh' party be disbanded because all invites expired an' th' party be empty.§r",
+ "=§cYe no longer be in a party! Ye be moved t' th' ALL channel.§r",
+ "R§eYe\\ be\\ kicked\\ from\\ th'\\ party\\ by\\ §r(?<p1>.+)\\ §r§e§r",
+ "=§eYe abandoned ship.§r",
+ "R(?<p0>.+)\\ §r§ehar\\ oppløst\\ partyet!§r",
+ "=§cDu er ikke i et party for øyeblikket.§r",
+ "=§cYou are not in a party!§r",
+ "=§cDu er ikke i et party akkurat nå.§r",
+ "=§cDu må være i et party for å bli med i partykanalen!§r",
+ "=§cPartyet ble oppløst fordi alle invitasjonene utløpte og partyet var tomt.§r",
+ "=§cDu er ikke i et party og ble flyttet til ALLE-kanalen.§r",
+ "R§eDu\\ ble\\ kastet\\ ut\\ av\\ partyet\\ av\\ §r(?<p1>.+)\\ §r§e§r",
+ "=§eDu forlot partyet.§r",
+ "R(?<p0>.+)\\ §r§edesfez\\ a\\ party!§r",
+ "=§cNão estás numa party.§r",
+ "=§cYou are not in a party!§r",
+ "=§cNão estás numa party.§r",
+ "=§cTens de estar numa party para acederes ao canal da party!§r",
+ "=§cA party foi desfeita porque estava vazia e todos os convites expiraram.§r",
+ "=§cNão estás numa party, logo foste movido para o canal GERAL.§r",
+ "R§eFoste\\ expulso\\ da\\ party\\ por\\ §r(?<p1>.+)\\ §r§e§r",
+ "=§eSaíste da party.§r",
+ "R(?<p0>.+)\\ §r§ehar\\ upplöst\\ partyt!§r",
+ "=§cDur är för närvarande inte med i ett party.§r",
+ "=§cYou are not in a party!§r",
+ "=§cDu är inte med i ett party just nu.§r",
+ "=§cDu måste vara i ett party att gå med i partykanalen!§r",
+ "=§cPartyt upplöstes eftersom alla inbjudningar gick ut och partyt var tomt.§r",
+ "=§cDu är inte med i ett party och flyttades till ALLA-kanalen.§r",
+ "R§eDu\\ har\\ sparkades\\ från\\ partyt\\ av\\ §r(?<p1>.+)\\ §r§e§r",
+ "=§eDu lämnade partyt.§r",
+ "R(?<p0>.+)\\ §r§epartiyi\\ dağıttı!§r",
+ "=§cŞu anda bir partide değilsin.§r",
+ "=§cYou are not in a party!§r",
+ "=§cŞu an herhangi bir partide değilsin.§r",
+ "=§cParti kanalına girmek için bir partide olmalısın!§r",
+ "=§cParti dağıtıldı çünkü tüm davetlerin süresi doldu ve parti boş.§r",
+ "=§cBir partide değilsiniz ve GENEL kanala taşındınız.§r",
+ "R(?<p1>.+)§r§e\\ tarafından\\ partiden\\ atıldınız\\.§r",
+ "=§ePartiden ayrıldın.§r",
+ "R(?<p0>.+)\\ §r§ehar\\ opløst\\ partyet!§r",
+ "=§cDu er i øjeblikket ikke i et party.§r",
+ "=§cYou are not in a party!§r",
+ "=§cDu er ikke i et party lige nu.§r",
+ "=§cDu skal være i et party for at tilmelde dig party kanalen!§r",
+ "=§cPartyet blev opløst fordi alle invitationer udløb, og partyet var tomt.§r",
+ "=§cDu er ikke i et party og blev flyttet til ALLE kanalen.§r",
+ "R§eDu\\ er\\ blevet\\ smidt\\ ud\\ af\\ partyet\\ af\\ §r(?<p1>.+)\\ §r§e§r",
+ "=§eDu har forladt partyet§r",
+ "R(?<p0>.+)\\ §r§erozpustil\\ party!§r",
+ "=§cMomentálně nejsi v party.§r",
+ "=§cYou are not in a party!§r",
+ "=§cMomentálně nejsi v party.§r",
+ "=§cYou must be in a party to join the party channel!§r",
+ "=§cThe party was disbanded because all invites expired and the party was empty.§r",
+ "=§cNejsi v party, takže jsi byl přesunut do chatu „ALL“.§r",
+ "R§eByl\\ jsi\\ vyhozen\\ z\\ party\\ hráčem\\ §r(?<p1>.+)\\ §r§e§r",
+ "=§eOpustil jsi party.§r",
+ "R(?<p0>.+)\\ §r§ehajotti\\ partyn!§r",
+ "=§cEt ole partyssa juuri nyt.§r",
+ "=§cYou are not in a party!§r",
+ "=§cEt ole partyssa juuri nyt.§r",
+ "=§cSinun tulee olla partyssa voidaksesi liittyä partyn kanavalle!§r",
+ "=§cParty hajotettiin, koska kaikki kutsut vanhentuivat ja party on tyhjä.§r",
+ "=§cEt ole partyssa, joten sinut siirrettiin kanavalle ALL.§r",
+ "R(?<p1>.+)§r§e\\ potki\\ sinut\\ partysta§r",
+ "=§ePoistuit partysta.§r",
+ "R§eΟ\\ §r(?<p0>.+)\\ §r§eδιέλυσε\\ το\\ party!§r",
+ "=§cΔεν είσαι προσωρινά σε party.§r",
+ "=§cYou are not in a party!§r",
+ "=§cΔεν είσαι σε κάποιο party αυτή τη στιγμή.§r",
+ "=§cΠρέπει να είσαι σε party για να συμμετέχεις στο κανάλι του party!§r",
+ "R§eΟ\\ §r(?<p1>.+)\\ §r§eβγήκε\\ από\\ το\\ party\\.§r",
+ "=§cΔεν είσαι σε party οπότε μετακινήθηκες στο κανάλι ΟΛΑ.§r",
+ "R§eέχεις\\ διωχθεί\\ από\\ το\\ party\\ από\\ τον\\ §r(?<p1>.+)\\ §r§e§r",
+ "=§eΈφυγες από το party.§r",
+ "R(?<p0>.+)\\ §r§eрозпустив\\ групу!§r",
+ "=§cВи не є членом групи.§r",
+ "=§cYou are not in a party!§r",
+ "=§cВи не в групі.§r",
+ "=§cВи повинні бути в групі, щоб вступити в канал групи!§r",
+ "R(?<p1>.+)\\ §r§eзалишив\\ групу\\.§r",
+ "=§cВи не в групі і були переміщені до ЗАГАЛЬНОГО каналу.§r",
+ "R§eВи\\ були\\ вигнані\\ з\\ групи\\ гравцем\\ §r(?<p1>.+)\\ §r§e§r",
+ "=§eВи покинули групу.§r",
+ "R(?<p0>.+)\\ §r§ea\\ destrămat\\ party\\-ul!§r",
+ "=§cÎn acest moment nu te afli în vreun party.§r",
+ "=§cYou are not in a party!§r",
+ "=§cNu te afli într-un party în acest moment.§r",
+ "=§cTrebuie să fii într-un party pentru a te alătura canalului de party!§r",
+ "=§cParty-ul a fost destrămat deoarece toate invitațiile au expirat iar party-ul a fost gol.§r",
+ "=§cNu ești într-un party așa că ai fost mutat în canalul ALL.§r",
+ "R§eAi\\ fost\\ dat\\ afară\\ din\\ party\\ de\\ către\\ §r(?<p1>.+)\\ §r§e§r",
+ "=§eAi ieșit din party.§r",
+ "R(?<p0>.+)\\ §r§efeloszlatta\\ a\\ partyt!§r",
+ "=§cJelenleg nem vagy egy party tagja.§r",
+ "=§cYou are not in a party!§r",
+ "=§cJelenleg nem vagy partyban.§r",
+ "=§cEgy partyban kell lenned hogy csatlakozhass a party csatornához!§r",
+ "=§cA party fel lett oszlatva mert az összes meghívás lejárt és a party üres volt.§r",
+ "=§cNem vagy egy party tagja se, ezért átraktunk az ALL csatornába.§r",
+ "R§eKi\\ lettél\\ rúgva\\ a\\ partyból\\ §r(?<p1>.+)\\ §r§eáltal§r",
+ "=§eKiléptél a partyból.§r"
+ ],
+ "party_channel": [
+ "=§aYou are now in the §r§6PARTY§r§a channel§r",
+ "=§aDu bist nun im §r§6PARTY§r§a Channel§r",
+ "=§aVous êtes maintenant dans le canal §r§6PARTY§r",
+ "=§aJe bent naar het §r§6partykanaal §r§averplaatst§r",
+ "=§aAhora estás en el canal de §r§6PARTY§r",
+ "=§aTi trovi nel canale: §r§6PARTY§r",
+ "=§aYou are now in the §r§6组队§r§a channel§r",
+ "=§aYou are now in the §r§6組隊§r§a channel§r",
+ "=§aYou are now in the §r§6КОМПАНИЯ§r§a channel§r",
+ "=§aYou are now in the §r§6PARTݧr§a channel§r",
+ "=§aYou are now in the §r§6ГРУПА§r§a channel§r",
+
+ "=§aYou are now in the §r§6PARTY§r§a channel§r",
+ "=§aDu bist nun im §r§6PARTY§r§a Channel§r",
+ "=§aVous êtes maintenant dans le canal §r§6PARTY§r",
+ "=§aJe bent naar het §r§6partykanaal §r§averplaatst§r",
+ "=§aAhora estás en el canal de §r§6PARTY§r",
+ "=§aTi trovi nel canale: §r§6PARTY§r",
+ "=§a你正处于§r§6组队§r§a频道中§r",
+ "=§a已切換聊天頻道至§r§6組隊§r§a頻道§r",
+ "=§aVocê está no canal §r§6PARTY§r§a§r",
+ "=§aТеперь вы находитесь в канале \"§r§6КОМПАНИЯ§r§a\"§r",
+ "=§6PARTY§r§a 채널에 입장했습니다§r",
+ "=§aJesteś teraz na kanale „§r§6PARTY§r§a”§r",
+ "=§aあなたは現在 §r§6PARTY§r§a チャンネルにいます§r",
+ "=§aYe now be in th' §r§6PARTY§r§a channel§r",
+ "=§aDu er nå i §r§6PARTY§r§a-kanalen§r",
+ "=§aFoste para o canal §r§6PARTY§r§a§r",
+ "=§aDu är nu i §r§6PARTY§r§a-kanalen§r",
+ "=§aŞimdi §r§6PARTݧr§a kanalındasın§r",
+ "=§aDu er nu i §r§6PARTY§r§a kanalen§r",
+ "=§aNyní jsi v kanálu §r§6PARTY§r§a§r",
+ "=§aOlet nyt kanavalla §r§6PARTY§r",
+ "=§aΕίσαι τώρα στο §r§6PARTY§r§a κανάλι§r",
+ "=§aYou are now in the §r§6ГРУПА§r§a channel§r",
+ "=§aAcum ești în canalul §r§6PARTY§r§a§r",
+ "=§aMost már a(z) §r§6PARTY§r§a csatornában vagy§r"
+ ],
+ "all_invite_on": [
+ "R(?<p0>.+)\\ §r§aenabled\\ All\\ Invite§r",
+ "R(?<p0>.+)\\ §r§ahat\\ die\\ Option\\ All\\ Invite\\ aktiviert§r",
+ "R(?<p0>.+)\\ §r§aa\\ activé\\ All\\ Invite§r",
+ "R(?<p0>.+)\\ §r§aheeft\\ All\\ Invite\\ §r§ageactiveerd§r",
+ "R(?<p0>.+)\\ §r§aha\\ activado\\ All\\ Invite§r",
+ "R(?<p0>.+)\\ §r§aha\\ abilitato\\ All\\ Invite§r",
+ "R(?<p0>.+)§r§a启用了All\\ Invite§r",
+ "R(?<p0>.+)\\ §r§a啟用了\\ All\\ Invite§r",
+ "R(?<p0>.+)\\ §r§aativou\\ a\\ opção\\ All\\ Invite§r",
+ "R(?<p0>.+)\\ §r§aвключил\\ All\\ Invite§r",
+ "R(?<p0>.+)§r§a\\ 님이\\ All\\ Invite§r§a을\\(를\\)\\ 활성화했습니다§r",
+ "R(?<p0>.+)\\ §r§awłącza\\ All\\ Invite§r",
+ "R(?<p0>.+)§r§a\\ が\\ All\\ Invite\\ を有効にしました§r",
+ "R(?<p0>.+)\\ §r§aenabled\\ All\\ Invite§r",
+ "R(?<p0>.+)\\ §r§aaktiverte\\ All\\ Invite§r",
+ "R(?<p0>.+)\\ §r§aativou\\ All\\ Invite§r",
+ "R(?<p0>.+)\\ §r§aaktiverade\\ All\\ Invite§r",
+ "R(?<p0>.+)§r§a,\\ All\\ Invite\\ ayarını\\ aktifleştirdi§r",
+ "R(?<p0>.+)\\ §r§aaktiverede\\ All\\ Invite§r",
+ "R§aHráč\\ §r(?<p0>.+)\\ §r§apovolil\\ All\\ Invite§r",
+ "R(?<p0>.+)\\ §r§aasetti\\ vaihtoehdon\\ All\\ Invite\\ päälle\\.§r",
+ "R§aΟ\\ §r(?<p0>.+)\\ §r§aενεργοποίησε\\ All\\ Invite§r",
+ "R(?<p0>.+)\\ §r§aувімкнув\\ All\\ Invite§r",
+ "R(?<p0>.+)\\ §r§aa\\ activat\\ All\\ Invite§r",
+ "R(?<p0>.+)\\ §r§abekapcsolta\\ ezt:\\ All\\ Invite§r"
+ ],
+ "all_invite_off": [
+ "R(?<p0>.+)\\ §r§cdisabled\\ All\\ Invite§r",
+ "=§cYou are not allowed to invite players.§r",
+ "R(?<p0>.+)\\ §r§chat\\ All\\ Invite\\ deaktiviert§r",
+ "=§cDu bist nicht berechtigt andere Spieler in die Party einzuladen.§r",
+ "R(?<p0>.+)\\ §r§ca\\ désactivé\\ All\\ Invite§r",
+ "=§cVous n'êtes pas autorisé à inviter des joueurs.§r",
+ "R(?<p0>.+)\\ §r§cheeft\\ All\\ Invite\\ §r§cuitgeschakeld§r",
+ "=§cJe bent niet toegestaan om spelers uit te nodigen.§r",
+ "R(?<p0>.+)\\ §r§cha\\ desactivado\\ All\\ Invite§r",
+ "=§cNo tienes permitido invitar jugadores.§r",
+ "R(?<p0>.+)\\ §r§cha\\ disabilitato\\ All\\ Invite§r",
+ "=§cNon sei autorizzato ad invitare giocatori.§r",
+ "R(?<p0>.+)\\ §r§c禁用了All\\ Invite§r",
+ "=§c你无权邀请其他玩家。§r",
+ "R(?<p0>.+)\\ §r§c停用了\\ All\\ Invite§r",
+ "=§c你沒有邀請其他玩家的權限。§r",
+ "R(?<p0>.+)\\ §r§cdesativou\\ a\\ opção\\ All\\ Invite§r",
+ "=§cVocê não possui permissão para convidar jogadores.§r",
+ "R(?<p0>.+)\\ §r§cотключил\\ All\\ Invite§r",
+ "=§cУ вас нет прав на приглашение игроков.§r",
+ "R(?<p0>.+)§r§c이\\(가\\)\\ All\\ Invite을\\(를\\)\\ 비활성화했습니다§r",
+ "=§c플레이어를 초대할 수 없습니다.§r",
+ "R(?<p0>.+)\\ §r§cwyłącza\\ All\\ Invite§r",
+ "=§cNie masz pozwolenia, aby zapraszać graczy.§r",
+ "R(?<p0>.+)\\ §r§cが\\ All\\ Invite\\ を無効化しました§r",
+ "=§cプレイヤーを招待する権限がありません。§r",
+ "R(?<p0>.+)\\ §r§cdisabled\\ All\\ Invite§r",
+ "=§cYe nah be allowed t' invite pirates.§r",
+ "R(?<p0>.+)\\ §r§cdeaktiverte\\ All\\ Invite§r",
+ "=§cDu har ikke lov til å invitere spillere.§r",
+ "R(?<p0>.+)\\ §r§cdesativou\\ All\\ Invite§r",
+ "=§cNão tens permissão para convidar jogadores.§r",
+ "R(?<p0>.+)\\ §r§cinaktiverade\\ All\\ Invite§r",
+ "=§cDu har inte tillåtelse att bjuda in spelare.§r",
+ "R(?<p0>.+)\\ All\\ Invite\\ §r§cayarını\\ devre\\ dışı\\ bıraktı§r",
+ "=§cOyuncu davet etme izniniz yok.§r",
+ "R(?<p0>.+)\\ §r§cdeaktiverede\\ All\\ Invite§r",
+ "=§cDu har ikke tilladelse til at invitere spillere.§r",
+ "R§cHráč\\ §r(?<p0>.+)\\ §r§czakázal\\ All\\ Invite§r",
+ "=§cNemáš povolení zvát hráče.§r",
+ "R(?<p0>.+)\\ §r§cotti\\ pois\\ päältä\\ asetuksen\\ All\\ Invite§r",
+ "=§cEt voi kutsua pelaajia.§r",
+ "R§cΟ\\ §r(?<p0>.+)\\ §r§cαπενεργοποίησε\\ All\\ Invite§r",
+ "=§cΔεν επιτρέπεται να προσκαλέσεις παίκτες.§r",
+ "R(?<p0>.+)\\ §r§cвимкнув\\ All\\ Invite§r",
+ "=§cУ вас немає прав на запрошення гравців.§r",
+ "R(?<p0>.+)\\ §r§ca\\ dezactivat\\ All\\ Invite§r",
+ "=§cNu ai permisiunea de a invita jucători în party.§r",
+ "R(?<p0>.+)\\ §r§ckikapcsolta\\ ezt\\ All\\ Invite§r",
+ "=§cTe nem hívhatsz meg játékosokat.§r"
+ ],
+ "party_join": [
+ "R(?<p1>.+)\\ §r§ejoined\\ the\\ party\\.§r",
+ "R(?<p1>.+)\\ §r§eist\\ der\\ Party\\ beigetreten\\.§r",
+ "R(?<p1>.+)\\ §r§ea\\ rejoint\\ la\\ party\\.§r",
+ "R(?<p1>.+)\\ §r§ejoined\\ the\\ party\\.§r",
+ "R(?<p1>.+)\\ §r§ese\\ unió\\ a\\ la\\ party\\.§r",
+ "R(?<p1>.+)\\ §r§eè\\ entrato\\ nel\\ party\\.§r",
+ "R(?<p1>.+)§r§e加入了组队。§r",
+ "R(?<p1>.+)\\ §r§e加入了組隊。§r",
+ "R(?<p1>.+)\\ §r§eentrou\\ na\\ party\\.§r",
+ "R(?<p1>.+)\\ §r§eприсоединился\\ к\\ компании\\.§r",
+ "R(?<p1>.+)§r§e\\ 님이\\ Party에\\ 참여했습니다\\.§r",
+ "R(?<p1>.+)\\ §r§edołącza\\ do\\ party\\.§r",
+ "R(?<p1>.+)\\ §r§ejoined\\ the\\ party\\.§r",
+ "R(?<p1>.+)\\ §r§eboarded\\ th'\\ party\\.§r",
+ "R(?<p1>.+)\\ §r§eble\\ med\\ i\\ partyet\\.§r",
+ "R(?<p1>.+)\\ §r§eentrou\\ na\\ party\\.§r",
+ "R(?<p1>.+)\\ §r§egick\\ med\\ i\\ party\\.§r",
+ "R(?<p1>.+)\\ §r§epartiye\\ katıldı\\.§r",
+ "R(?<p1>.+)\\ §r§etilsluttede\\ sig\\ partyet\\.§r",
+ "R§eHráč\\ §r(?<p1>.+)\\ §r§ese\\ připojil\\ do\\ party\\.§r",
+ "R(?<p1>.+)\\ §r§eliittyi\\ partyyn\\.§r",
+ "R§eΟ\\ §r(?<p1>.+)\\ §r§eμπήκε\\ στο\\ party\\.§r",
+ "R(?<p1>.+)\\ §r§eприєднався\\ до\\ групи\\.§r",
+ "R(?<p1>.+)\\ §r§es\\-a\\ alăturat\\ party\\-ului\\.§r",
+ "R(?<p1>.+)\\ §r§ecsatlakozott\\ a\\ partyhoz\\.§r"
+ ],
+ "party_leave": [
+ "R(?<p1>.+)\\ §r§ehas\\ left\\ the\\ party\\.§r",
+ "R(?<p2>.+)\\ §r§ehas\\ been\\ removed\\ from\\ the\\ party\\.§r",
+ "R(?<p1>.+)\\ §r§ehat\\ die\\ Party\\ verlassen\\.§r",
+ "R(?<p2>.+)\\ §r§ewurde\\ aus\\ der\\ Party\\ entfernt\\.§r",
+ "R(?<p1>.+)\\ §r§ea\\ quitté\\ la\\ party\\.§r",
+ "R(?<p2>.+)\\ §r§ea\\ été\\ retiré\\ de\\ la\\ party\\.§r",
+ "=§cThe party was disbanded because all invites expired and the party was empty.§r",
+ "R(?<p2>.+)\\ §r§eis\\ uit\\ de\\ party\\ verwijderd\\.§r",
+ "R(?<p1>.+)\\ §r§eabandonó\\ la\\ party\\.§r",
+ "R(?<p2>.+)\\ §r§eha\\ sido\\ expulsado\\ de\\ la\\ party\\.§r",
+ "R(?<p1>.+)\\ §r§eha\\ lasciato\\ il\\ party\\.§r",
+ "R(?<p2>.+)\\ §r§eè\\ stato\\ rimosso\\ dal\\ party\\.§r",
+ "=§c因组队中没有成员, 且所有邀请均已过期, 组队已被解散。§r",
+ "R(?<p2>.+)§r§e已被移出组队。§r",
+ "R(?<p1>.+)\\ §r§e離開了組隊。§r",
+ "R(?<p2>.+)\\ §r§e已被移出組隊。§r",
+ "R(?<p1>.+)\\ §r§esaiu\\ da\\ party\\.§r",
+ "R(?<p2>.+)\\ §r§efoi\\ removido\\ da\\ party\\.§r",
+ "R(?<p1>.+)\\ §r§eпокинул\\ компанию\\.§r",
+ "R(?<p2>.+)\\ §r§eбыл\\ выгнан\\ из\\ компании\\.§r",
+ "R(?<p1>.+)§r§e\\ 님이\\ Party에서\\ 나갔습니다\\.§r",
+ "R(?<p2>.+)§r§e\\ 님이\\ Party에서\\ 추방되었습니다\\.§r",
+ "R(?<p1>.+)\\ §r§eopuszcza\\ party\\.§r",
+ "R(?<p2>.+)\\ §r§ezostał\\(a\\)\\ usunięty\\(\\-a\\)\\ z\\ party\\.§r",
+ "R(?<p1>.+)\\ §r§eが\\ Party\\ から退出しました。§r",
+ "R(?<p2>.+)\\ §r§eが\\ Party\\ から削除されました。§r",
+ "R(?<p1>.+)\\ §r§eabandoned\\ ship\\.§r",
+ "R(?<p2>.+)\\ §r§ebe\\ kicked\\ out\\ from\\ th'\\ party\\.§r",
+ "R(?<p1>.+)\\ §r§eforlot\\ partyet\\.§r",
+ "R(?<p2>.+)\\ §r§ehar\\ blitt\\ fjernet\\ fra\\ partyet\\.§r",
+ "R(?<p1>.+)\\ §r§esaiu\\ da\\ party\\.§r",
+ "R(?<p2>.+)\\ §r§efoi\\ removido\\ da\\ party\\.§r",
+ "R(?<p1>.+)\\ §r§elämnade\\ partyt\\.§r",
+ "R(?<p2>.+)\\ §r§ehar\\ tagits\\ bort\\ från\\ partyt\\.§r",
+ "R(?<p1>.+)§r§epartiden\\ ayrıldı\\.§r",
+ "R(?<p2>.+)§r§epartiden\\ çıkarıldı\\.§r",
+ "R(?<p1>.+)\\ §r§eforlod\\ partyet\\.§r",
+ "R(?<p2>.+)\\ §r§eer\\ blevet\\ fjernet\\ fra\\ partyet\\.§r",
+ "R§eHráč\\ §r(?<p1>.+)\\ §r§eopustil\\ party\\.§r",
+ "R§eHráč\\ §r(?<p2>.+)\\ §r§ebyl\\ vyhozen\\ z\\ party\\.§r",
+ "R(?<p1>.+)\\ §r§epoistui\\ partysta\\.§r",
+ "R(?<p2>.+)\\ §r§epoistettiin\\ partysta§r",
+ "=§cΤο party διαλύθηκε επειδή όλες οι προσκλήσεις έληξαν και το party ήταν άδειο.§r",
+ "R§eΟ\\ §r(?<p2>.+)\\ §r§eέχει\\ αφαιρεθεί\\ από\\ το\\ party\\.§r",
+ "=§cThe party was disbanded because all invites expired and the party was empty.§r",
+ "R(?<p2>.+)\\ §r§eбув\\ вигнаний\\ з\\ групи\\.§r",
+ "R(?<p1>.+)\\ §r§ea\\ părăsit\\ party\\-ul\\.§r",
+ "R(?<p2>.+)\\ §r§ea\\ fost\\ înlăturat\\(ă\\)\\ din\\ party\\.§r",
+ "R(?<p1>.+)\\ §r§ekilépett\\ a\\ partyból\\.§r",
+ "R(?<p2>.+)\\ §r§eki\\ lett\\ rúgva\\ a\\ partyból\\.§r"
+ ],
+ "invited": [
+ "R(?<p0>.+)\\ §r§einvited\\ §r(?<p1>.+)\\ §r§eto\\ the\\ party!\\ They\\ have\\ §r§c60\\ §r§eseconds\\ to\\ accept\\.§r",
+ "R(?<p0>.+)\\ §r§ehat\\ §r(?<p1>.+)\\ §r§ein\\ die\\ Party\\ eingeladen!\\ §r\\k<p1>§r§e\\ hat\\ §r§c60\\ §r§eSekunden,\\ um\\ zu\\ akzeptieren\\.§r",
+ "R(?<p0>.+)\\ §r§ea\\ invité\\ §r(?<p1>.+)\\ §r§edans\\ la\\ party!\\ Cette\\ personne\\ a\\ §r§c60\\ §r§esecondes\\ pour\\ accepter\\.§r",
+ "R(?<p0>.+)\\ §r§eheeft\\ §r(?<p1>.+)\\ §r§euitgenodigd\\ voor\\ de\\ party!\\ Deze\\ speler\\ heeft\\ §r§c60\\ §r§eseconden\\ om\\ te\\ accepteren\\.§r",
+ "R§e¡§r(?<p0>.+)\\ §r§einvitó\\ a\\ §r(?<p1>.+)\\ §r§ea\\ la\\ party!\\ Tiene\\ §r§c60\\ §r§esegundos\\ para\\ aceptar\\.§r",
+ "R(?<p0>.+)\\ §r§eha\\ invitato\\ §r(?<p1>.+)\\ §r§enel\\ party!\\ Ha\\ §r§c60\\ §r§esecondi\\ per\\ accettare\\.§r",
+ "R(?<p0>.+)§r§e已邀请§r(?<p1>.+)§r§e到组队中!他们有§r§c60§r§e秒时间接受邀请。§r",
+ "R(?<p0>.+)§r§e\\ 邀請了\\ §r(?<p1>.+)§r§e\\ 到組隊裡!他們有\\ §r§c60§r§e\\ 秒的時間答覆。§r",
+ "R(?<p0>.+)\\ §r§econvidou\\ §r(?<p1>.+)\\ §r§epara\\ entrar\\ na\\ party!\\ Este\\ convite\\ expira\\ em\\ §r§c60\\ §r§esegundos\\.§r",
+ "R(?<p0>.+)\\ §r§eпригласил\\ §r(?<p1>.+)\\ §r§eв\\ компанию!\\ У\\ него\\ есть\\ §r§c60\\ §r§eсекунд,\\ чтобы\\ принять\\ приглашение\\.§r",
+ "R(?<p0>.+)§r§e\\ 님이\\ §r(?<p1>.+)§r§e\\ 님을\\ Party로\\ 초대했습니다!\\ §r§c60§r§e초\\ 내로\\ 수락하면\\ Party에\\ 참가합니다\\.§r",
+ "R(?<p0>.+)\\ §r§ezaprasza\\ §r(?<p1>.+)\\ §r§e\\ do\\ party!\\ Ma\\ §r§c60\\ §r§esekund\\ na\\ przyjęcie\\.§r",
+ "R(?<p0>.+)\\ §r§eが\\ §r(?<p1>.+)\\ §r§eを\\ Party\\ に招待しました!\\ 承認の有効時間は\\ §r§c60\\ §r§e秒です。§r",
+ "R(?<p0>.+)\\ §r§einvited\\ §r(?<p1>.+)\\ §r§et'\\ board\\ th'\\ party!\\ They\\ 'ave\\ §r§c60\\ §r§eseconds\\ t'\\ accept\\.§r",
+ "R(?<p0>.+)\\ §r§einviterte\\ §r(?<p1>.+)\\ §r§etil\\ partyet!\\ De\\ har\\ §r§c60\\ §r§esekunder\\ på\\ å\\ akseptere\\.§r",
+ "R(?<p0>.+)\\ §r§econvidou\\ §r(?<p1>.+)\\ §r§epara\\ a\\ party!\\ Ele\\ tem\\ §r§c60\\ §r§esegundos\\ para\\ aceitar\\.§r",
+ "R(?<p0>.+)\\ §r§ebjöd\\ in\\ §r(?<p1>.+)\\ §r§etill\\ partyt!\\ Hen\\ har\\ §r§c60\\ §r§esekunder\\ att\\ acceptera\\.§r",
+ "R(?<p0>.+)§r§e,\\ §r(?<p1>.+)§r§e\\ kişisini\\ partiye\\ davet\\ etti!\\ Kabul\\ etmeleri\\ için\\ §r§c60\\ §r§esaniyeleri\\ var\\.§r",
+ "R(?<p0>.+)\\ §r§einviterede\\ §r(?<p1>.+)\\ §r§etil\\ partyet!\\ De\\ har\\ §r§c60\\ §r§esekunder\\ til\\ at\\ acceptere\\.§r",
+ "R§eHráč\\ §r(?<p0>.+)\\ §r§epozval\\ hráče\\ §r(?<p1>.+)\\ §r§edo\\ party!\\ Nyní\\ má\\ §r§c60\\ §r§esekund\\ na\\ přijetí\\.§r",
+ "R(?<p0>.+)\\ §r§ekutsui\\ pelaajan\\ §r(?<p1>.+)\\ §r§epartyyn!\\ Hänellä\\ on\\ §r§c60\\ §r§esekuntia\\ aikaa\\ hyväksyä\\.§r",
+ "R§eΟ\\ §r(?<p0>.+)\\ §r§eπροσκάλεσε\\ τον\\ §r(?<p1>.+)\\ §r§eστο\\ party!\\ Έχει\\ §r§c60\\ §r§eδευτερόλεπτα\\ να\\ αποδεχτεί\\.§r",
+ "R(?<p0>.+)\\ §r§einvited\\ §r(?<p1>.+)\\ §r§eto\\ the\\ party!\\ They\\ have\\ §r§c60\\ §r§eseconds\\ to\\ accept\\.§r",
+ "R(?<p0>.+)\\ §r§ea\\ invitat\\ pe\\ §r(?<p1>.+)\\ §r§eîn\\ party!\\ Ei\\ au\\ §r§c60\\ §r§ede\\ secunde\\ să\\ accepte\\.§r",
+ "R(?<p0>.+)\\ §r§emeghívta\\ §r(?<p1>.+)§r§e\\-t\\ a\\ partyba!\\ §r§c60§r§e\\ másodperce\\ van\\ elfogadni\\.§r"
+ ],
+ "invite_perm": [
+ "=§cCouldn't find a player with that name!§r",
+ "=§cYou cannot invite that player since they're not online.§r",
+ "=§cKeinen Spieler mit diesem Namen gefunden!§r",
+ "=§cDu kannst diesen Spieler nicht einladen, da er nicht online ist.§r",
+ "=§cImpossible de trouver un joueur avec ce nom!§r",
+ "=§cVous ne pouvez pas inviter ce joueur puisqu'il n'est pas en ligne.§r",
+ "=§cKon geen speler vinden met die naam!§r",
+ "=§cJe kunt die speler niet uitnodigen, omdat deze niet online is.§r",
+ "=§c¡No se pudo encontrar un jugador con ese nombre!§r",
+ "=§cNo puedes invitar a ese jugador porque no está en línea.§r",
+ "=§cNon è stato possibile trovare un giocatore con quel nome!§r",
+ "=§cNon puoi invitare quel giocatore perché non è online.§r",
+ "=§c无法找到叫这个名字的玩家!§r",
+ "=§c你不能邀请离线的玩家。§r",
+ "=§c找不到叫做該名稱的玩家!§r",
+ "=§c你不能邀請不在線上的玩家。§r",
+ "=§cNão foi possível encontrar este jogador!§r",
+ "=§cVocê não pode convidar um jogador que não está online.§r",
+ "=§cНе получается найти игрока с этим именем!§r",
+ "=§cВы не можете пригласить этого игрока, потому что он не в сети.§r",
+ "=§c그 이름을 가진 플레이어를 찾을 수 없습니다!§r",
+ "=§c해당 플레이어는 접속 중이 아니기 때문에 초대할 수 없습니다.§r",
+ "=§cNie znaleziono gracza z tą nazwą!§r",
+ "=§cNie możesz zaprosić tego gracza, gdyż jest niedostępny.§r",
+ "=§c入力された名前のプレイヤーが見つかりませんでした!§r",
+ "=§cオンラインではないため、このプレイヤーを招待できません。§r",
+ "=§cCould nah find a pirate wit' that name!§r",
+ "=§cYe can nah invite that pirate since they be offline.§r",
+ "=§cKunne ikke finne en spiller med det navnet!§r",
+ "=§cDu kan ikke invitere den spilleren siden de ikke er pålogget.§r",
+ "=§cNão foi possível encontrar este jogador!§r",
+ "=§cNão podes convidar um jogador offline!§r",
+ "=§cKunde inte hitta en spelare med det namnet!§r",
+ "=§cDu kan inte bjuda in denna spelare eftersom hen inte är online.§r",
+ "=§cBu isimde bir oyuncu bulunamadı!§r",
+ "=§cBu kişiyi aktif olmadığı için davet edemezsin.§r",
+ "=§cKunne ikke finde en spiller med det navn!§r",
+ "=§cDu kan ikke invitere den spiller, da de ikke er online.§r",
+ "=§cNepodařilo se nám najít hráče s tímto jménem!§r",
+ "=§cTohoto hráče nemůžeš pozvat, protože není online.§r",
+ "=§cEi löydetty pelaajaa tuolla nimellä!§r",
+ "=§cEt voi kutsua tätä pelaajaa, sillä hän ei ole paikalla.§r",
+ "=§cΔεν μπόρεσε να βρεθεί παίκτης με αυτό το όνομα!§r",
+ "=§cΔεν μπορείς να προσκαλέσεις αυτό τον παίκτη εφόσον είναι εκτός σύνδεσης.§r",
+ "=§cНеможливо знайти гравця з цим ім’ям!§r",
+ "=§cВи не можете запросити цього гравця, тому що він не в мережі.§r",
+ "=§cNu s-a putut găsi un jucător cu acel nume!§r",
+ "=§cNu poți invita acel jucător deoarece ei nu sunt online.§r",
+ "=§cNem találtunk játékost ezzel a névvel!§r",
+ "=§cNem hívhatod meg ezt a játékost mert nem elérhető.§r"
+ ],
+ "transfer": [
+ "R§eThe\\ party\\ was\\ transferred\\ to\\ §r(?<p0>.+)\\ §r§eby\\ §r(?<p1>.+)§r",
+ "R§eDie\\ Party\\ wurde\\ von\\ §r(?<p1>.+)§r§e\\ an\\ §r(?<p0>.+)\\ §r§eübertragen\\.§r",
+ "R§eLa\\ party\\ a\\ été\\ transférée\\ à\\ §r(?<p0>.+)\\ §r§epar\\ §r(?<p1>.+)§r",
+ "R§eDe\\ party\\ is\\ overgebracht\\ naar\\ §r(?<p0>.+)\\ §r§edoor\\ §r(?<p1>.+)§r",
+ "R§eLa\\ party\\ fue\\ transferida\\ a\\ §r(?<p0>.+)\\ §r§epor\\ §r(?<p1>.+)§r",
+ "R§eIl\\ party\\ è\\ stato\\ trasferito\\ a\\ §r(?<p0>.+)\\ §r§eda\\ §r(?<p1>.+)§r",
+ "R(?<p1>.+)§r§e将组队移交给了§r(?<p0>.+)§r",
+ "R(?<p1>.+)\\ 將組隊轉移給了\\ §r(?<p0>.+)§r",
+ "R§eA\\ party\\ foi\\ transferida\\ para\\ §r(?<p0>.+)\\ §r§epor\\ §r(?<p1>.+)§r",
+ "R§eКомпания\\ была\\ передана\\ пользователю\\ §r(?<p0>.+)\\ §r§eигроком\\ §r(?<p1>.+)§r",
+ "R§eParty가\\ §r(?<p1>.+)§r§e에\\ 의해\\ §r(?<p0>.+)§r§e에게\\ 양도되었습니다§r",
+ "R§eParty\\ zostało\\ przeniesione\\ do\\ §r(?<p0>.+)\\ §r§eprzez\\ §r(?<p1>.+)§r",
+ "R§eParty\\ は\\ §r(?<p1>.+)\\ §r§eによって\\ §r(?<p0>.+)\\ §r§eへ譲渡されました§r",
+ "R§eTh'\\ party\\ be\\ given\\ t'\\ §r(?<p0>.+)\\ §r§eby\\ §r(?<p1>.+)§r",
+ "R§ePartyet\\ ble\\ overført\\ til\\ §r(?<p0>.+)\\ §r§eav\\ §r(?<p1>.+)§r",
+ "R§eA\\ party\\ foi\\ transferida\\ de\\ §r(?<p1>.+)\\ §r§epara\\ §r(?<p0>.+)§r",
+ "R§ePartyt\\ överfördes\\ till\\ §r(?<p0>.+)\\ §r§eav\\ §r(?<p1>.+)§r",
+ "R§eParti\\ §r(?<p1>.+)\\ §r§etarafından\\ §r(?<p0>.+)\\ §r§eoyuncusuna\\ transfer\\ edildi\\.§r",
+ "R§ePartyet\\ blev\\ overført\\ til\\ §r(?<p0>.+)\\ §r§eaf\\ §r(?<p1>.+)§r",
+ "R§eParty\\ byla\\ předána\\ hráči\\ §r(?<p0>.+)\\ §r§ehráčem\\ §r(?<p1>.+)§r",
+ "R(?<p1>.+)§r§e\\ siirsi\\ partyn\\ pelaajalle\\ §r(?<p0>.+)§r",
+ "R§eΤο\\ party\\ μεταφέρθηκε\\ στον\\ §r(?<p0>.+)\\ §r§eαπό\\ τον\\ §r(?<p1>.+)§r",
+ "R§eГрупу\\ було\\ передано\\ користувачу\\ §r(?<p0>.+)\\ §r§eгравцем\\ §r(?<p1>.+)§r",
+ "R§eParty\\-ul\\ a\\ fost\\ transferat\\ către\\ §r(?<p0>.+)\\ §r§ede\\ către\\ §r(?<p1>.+)§r",
+ "R§eA\\ party\\ át\\ lett\\ adva\\ §r(?<p0>.+)\\-nak/nek\\ §r(?<p1>.+)\\ által§r"
+ ],
+ "transfer_left": [
+ "R§eThe\\ party\\ was\\ transferred\\ to\\ §r(?<p0>.+)\\ §r§ebecause\\ §r(?<p1>.+)\\ §r§eleft§r",
+ "R§eDie\\ Party\\ wurde\\ §r(?<p0>.+)§r§e\\ übergeben,\\ weil\\ §r(?<p1>.+)\\ §r§egegangen\\ ist§r",
+ "R§eLa\\ party\\ a\\ été\\ transférée\\ à\\ §r(?<p0>.+)\\ §r§ecar\\ §r(?<p1>.+)\\ §r§eest\\ parti§r",
+ "R§eDe\\ party\\ is\\ overgezet\\ naar\\ §r(?<p0>.+)\\ §r§eomdat\\ §r(?<p1>.+)\\ §r§eis\\ weggegaan§r",
+ "R§eLa\\ party\\ fue\\ transferida\\ a\\ §r(?<p0>.+)\\ §r§eporque\\ §r(?<p1>.+)\\ §r§ese\\ fue§r",
+ "R§eIl\\ party\\ è\\ stato\\ trasferito\\ a\\ §r(?<p0>.+)\\ §r§eperché\\ §r(?<p1>.+)\\ §r§eè\\ uscito§r",
+ "R§e由于§r(?<p1>.+)§r§e离开了组队,组队被移交给了§r(?<p0>.+)§r",
+ "R§e由於\\ §r(?<p1>.+)§r§e\\ 離開了組隊,組隊隊長一職移交給了\\ §r(?<p0>.+)§r",
+ "R§eA\\ party\\ foi\\ transferida\\ para\\ §r(?<p0>.+)\\ §r§epois\\ §r(?<p1>.+)\\ §r§edesconectou§r",
+ "R§eКомпания\\ была\\ передана\\ игроку\\ §r(?<p0>.+)§r§e,\\ потому\\ что\\ §r(?<p1>.+)§r§e\\ покинул\\ ее§r",
+ "R(?<p1>.+)§r§e\\ 님이\\ 떠났기\\ 때문에\\ Party가\\ §r(?<p0>.+)§r§e에게\\ 양도되었습니다§r",
+ "R§eParty\\ zostało\\ przeniesione\\ do\\ §r(?<p0>.+)§r§e,\\ ponieważ\\ §r(?<p1>.+)\\ §r§ewyszedł§r",
+ "R(?<p1>.+)\\ §r§eが退出したため、この\\ Party\\ は\\ §r(?<p0>.+)\\ §r§eに譲渡されました§r",
+ "R§eTh'\\ party\\ be\\ transferred\\ t'\\ §r(?<p0>.+)\\ §r§ebecause\\ §r(?<p1>.+)\\ §r§ebe\\ gone§r",
+ "R§ePartyet\\ ble\\ overført\\ til\\ §r(?<p0>.+)\\ §r§efordi\\ §r(?<p1>.+)\\ §r§eforlot\\ det§r",
+ "R§eA\\ party\\ foi\\ transferida\\ para\\ §r(?<p0>.+)\\ §r§eporque\\ §r(?<p1>.+)\\ §r§esaiu\\ do\\ servidor§r",
+ "R§ePartyt\\ överfördes\\ till\\ §r(?<p0>.+)\\ §r§eeftersom\\ §r(?<p1>.+)\\ §r§elämnade§r",
+ "R§eParti\\ §r(?<p0>.+)oyuncusuna\\ §r§etransfer\\ edildi\\ çünkü\\ §r(?<p1>.+)\\ §r§e\\ ayrıldı\\.§r",
+ "R§ePartyet\\ blev\\ givet\\ til\\ §r(?<p0>.+)\\ §r§efordi\\ §r(?<p1>.+)\\ §r§egik§r",
+ "R§eParty\\ byla\\ předána\\ hráči\\ §r(?<p0>.+)§r§e,\\ protože\\ hráč\\ §r(?<p1>.+)\\ §r§eodešel§r",
+ "R§eParty\\ siirrettiin\\ pelaajalle\\ §r(?<p0>.+)\\ §r§ekoska\\ §r(?<p1>.+)\\ §r§epoistui§r",
+ "R§eΤο\\ party\\ μεταφέρθηκε\\ στον\\ §r(?<p0>.+)\\ §r§eεπειδή\\ ο\\ §r(?<p1>.+)\\ §r§eέφυγε§r",
+ "R§eГрупа\\ була\\ передана\\ гравцю\\ §r(?<p0>.+)\\ §r§e,\\ тому\\ що\\ §r(?<p1>.+)\\ §r§eзалишив\\ її§r",
+ "R§eParty\\-ul\\ a\\ fost\\ transferat\\ către\\ §r(?<p0>.+)\\ §r§edeoarece\\ §r(?<p1>.+)\\ §r§ea\\ ieșit§r",
+ "R§eA\\ party\\ át\\ lett\\ adva\\ §r(?<p0>.+)§r§e\\-nak/nek\\ mert\\ §r(?<p1>.+)\\ §r§ekilépett§r"
+ ],
+ "promote_leader": [
+ "R(?<p0>.+)§r§e\\ has\\ promoted\\ §r(?<p1>.+)\\ §r§eto\\ Party\\ Leader§r",
+ "R(?<p0>.+)§r§e\\ hat\\ §r(?<p1>.+)\\ §r§ezum\\ Leiter\\ der\\ Party\\ befördert§r",
+ "R(?<p0>.+)§r§e\\ a\\ promu\\ §r(?<p1>.+)\\ §r§een\\ tant\\ que\\ Chef\\ de\\ la\\ party§r",
+ "R(?<p0>.+)§r§e\\ heeft\\ §r(?<p1>.+)\\ §r§etot\\ partyleider\\ gepromoveerd§r",
+ "R(?<p0>.+)§r§e\\ ha\\ promovido\\ a\\ §r(?<p1>.+)\\ §r§ea\\ Líder\\ de\\ Party§r",
+ "R(?<p0>.+)§r§e\\ ha\\ promosso\\ §r(?<p1>.+)\\ §r§ea\\ Capo\\ del\\ Party§r",
+ "R(?<p0>.+)§r§e已将§r(?<p1>.+)§r§e提拔为组队队长,§r\\k<p0>§r§e现在为组队管理员§r",
+ "R(?<p0>.+)\\ §r§e已將\\ §r(?<p1>.+)§r§e\\ 提拔為組隊隊長§r",
+ "R(?<p0>.+)§r§e\\ promoveu\\ §r(?<p1>.+)\\ §r§epara\\ líder\\ da\\ party§r",
+ "R(?<p0>.+)§r§e\\ повысил\\ §r(?<p1>.+)\\ §r§eдо\\ лидера\\ компании§r",
+ "R(?<p0>.+)§r§e이\\(가\\)\\ §r(?<p1>.+)§r§e을\\(를\\)\\ Party\\ 리더로\\ 승급시켰습니다§r",
+ "R(?<p0>.+)§r§e\\ awansuje\\ rangą\\ §r(?<p1>.+)\\ §r§e\\ do\\ lidera\\ party§r",
+ "R(?<p0>.+)§r§e\\ が\\ §r(?<p1>.+)§r§e\\ を\\ Party\\ リーダーに昇格させました§r",
+ "R(?<p0>.+)§r§e\\ has\\ promoted\\ §r(?<p1>.+)\\ §r§et'\\ Party\\ Captain§r",
+ "R(?<p0>.+)§r§e\\ har\\ forfremmet\\ §r(?<p1>.+)\\ §r§etil\\ partyleder§r",
+ "R(?<p0>.+)§r§e\\ promoveu\\ §r(?<p1>.+)§r§e\\ a\\ líder\\ da\\ party§r",
+ "R(?<p0>.+)§r§e\\ har\\ befordrat\\ §r(?<p1>.+)\\ §r§etill\\ partyledare§r",
+ "R(?<p0>.+)§r§e,\\ §r(?<p1>.+)§r§e\\ kişisini\\ Parti\\ Liderliğine\\ terfi\\ etti§r",
+ "R(?<p0>.+)§r§e\\ har\\ forfremmet\\ §r(?<p1>.+)\\ §r§etil\\ Party\\ Leder§r",
+ "R§eHráč\\ §r(?<p0>.+)§r§e\\ povýšil\\ hráče\\ §r(?<p1>.+)\\ §r§ena\\ vedoucího\\ party\\.§r",
+ "R(?<p0>.+)§r§e\\ ylensi\\ pelaajan\\ §r(?<p1>.+)\\ §r§ePartyn\\ johtajaksi§r",
+ "R§eΟ\\ §r(?<p0>.+)§r§e\\ έχει\\ προάγει\\ τον\\ §r(?<p1>.+)\\ §r§eσε\\ Αρχηγό\\ Party§r",
+ "R(?<p0>.+)§r§e\\ підвищив\\ §r(?<p1>.+)\\ §r§eдо\\ лідера\\ групи§r",
+ "R(?<p0>.+)§r§e\\ a\\ promovat\\ pe\\ §r(?<p1>.+)\\ §r§eîn\\ Lider\\ de\\ Party§r",
+ "R(?<p0>.+)\\ §r§eelőléptette\\ §r(?<p1>.+)§r§e\\-t\\ Party\\ Vezetővé§r"
+ ],
+ "promote_moderator": [
+ "R(?<p0>.+)§r§e\\ has\\ promoted\\ §r(?<p1>.+)\\ §r§eto\\ Party\\ Moderator§r",
+ "R(?<p0>.+)§r§e\\ hat\\ §r(?<p1>.+)\\ §r§ezum\\ Party\\-Moderator\\ befördert§r",
+ "R(?<p0>.+)§r§e\\ a\\ promu\\ §r(?<p1>.+)\\ §r§een\\ tant\\ que\\ Modérateur\\ de\\ la\\ party§r",
+ "R(?<p0>.+)§r§e\\ heeft\\ §r(?<p1>.+)\\ §r§egepromoveerd\\ tot\\ partymoderator§r",
+ "R(?<p0>.+)§r§e\\ ha\\ promovido\\ a\\ §r(?<p1>.+)\\ §r§ea\\ Moderador\\ de\\ la\\ Party§r",
+ "R(?<p0>.+)§r§e\\ ha\\ promosso\\ §r(?<p1>.+)\\ §r§ea\\ Moderatore\\ del\\ Party§r",
+ "R(?<p0>.+)§r§e已将§r(?<p1>.+)§r§e提拔为组队管理员§r",
+ "R(?<p0>.+)\\ §r§e已將\\ §r(?<p1>.+)§r§e\\ 提拔為組隊管理員§r",
+ "R(?<p0>.+)§r§e\\ promoveu\\ §r(?<p1>.+)\\ §r§epara\\ moderador\\ da\\ party§r",
+ "R(?<p0>.+)§r§e\\ повысил\\ §r(?<p1>.+)\\ §r§eдо\\ модератора\\ компании§r",
+ "R(?<p0>.+)§r§e이\\(가\\)\\ §r(?<p1>.+)§r§e\\(을\\)를\\ Party\\ 관리자로\\ 승급시켰습니다§r",
+ "R(?<p0>.+)§r§e\\ awansuje\\ rangą\\ §r(?<p1>.+)\\ §r§edo\\ moderatora\\ party§r",
+ "R(?<p0>.+)§r§e\\ が\\ §r(?<p1>.+)§r§e\\ を\\ Party\\ モデレーターに昇格させました§r",
+ "R(?<p0>.+)§r§e\\ has\\ promoted\\ §r(?<p1>.+)\\ §r§et'\\ Party\\ Moderator§r",
+ "R(?<p0>.+)§r§e\\ har\\ forfremmet\\ §r(?<p1>.+)\\ §r§etil\\ party\\-moderator§r",
+ "R(?<p0>.+)§r§e\\ promoveu\\ §r(?<p1>.+)\\ §r§ea\\ moderador\\ da\\ party§r",
+ "R(?<p0>.+)§r§e\\ har\\ befordrat\\ §r(?<p1>.+)\\ §r§etill\\ partymoderator§r",
+ "R(?<p0>.+)§r§e,\\ §r(?<p1>.+)§r§e\\ kişisini\\ Parti\\ Moderatörlüğüne\\ terfi\\ etti!\\-§r",
+ "R(?<p0>.+)§r§e\\ har\\ forfremmet\\ §r(?<p1>.+)\\ §r§etil\\ Party\\ Moderator§r",
+ "R§eHráč\\ §r(?<p0>.+)§r§e\\ povýšil\\ hráče\\ §r(?<p1>.+)\\ §r§ena\\ moderátora\\ party§r",
+ "R(?<p0>.+)§r§e\\ ylensi\\ pelaajan\\ §r(?<p1>.+)\\ §r§ePartyn\\ moderaattoriksi§r",
+ "R§eΟ\\ §r(?<p0>.+)§r§e\\ έχει\\ προάγει\\ τον\\ §r(?<p1>.+)\\ §r§eσε\\ Συντονιστή\\ Party§r",
+ "R(?<p0>.+)§r§e\\ підвищив\\ §r(?<p1>.+)\\ §r§eдо\\ модератора\\ групи§r",
+ "R(?<p0>.+)§r§e\\ a\\ promovat\\ pe\\ §r(?<p1>.+)\\ §r§eîn\\ Moderator\\ de\\ Party§r",
+ "R(?<p0>.+)§r§e\\ előléptette\\ §r(?<p1>.+)§r§e\\-t\\ Party\\ Moderátornak§r"
+ ],
+ "member": [
+ "R(?<p1>.+)§r§e\\ has\\ demoted\\ §r(?<p0>.+)\\ §r§eto\\ Party\\ Member§r",
+ "R(?<p1>.+)§r§e\\ hat\\ §r(?<p0>.+)\\ §r§ezum\\ Partymitglied\\ degradiert§r",
+ "R(?<p1>.+)\\ §r§e\\ a\\ rétrogradé\\ §r(?<p0>.+)§r§e\\ en\\ tant\\ que\\ Membre\\ de\\ la\\ party!§r",
+ "R(?<p1>.+)§r§e\\ heeft\\ §r(?<p0>.+)\\ §r§egedegradeerd\\ tot\\ partylid§r",
+ "R(?<p1>.+)§r§e\\ ha\\ rebajado\\ a\\ §r(?<p0>.+)\\ §r§ea\\ Miembro\\ de\\ la\\ Party§r",
+ "R(?<p1>.+)§r§e\\ ha\\ degradato\\ §r(?<p0>.+)\\ §r§ea\\ Membro\\ del\\ Party§r",
+ "R(?<p1>.+)§r§e已将§r(?<p0>.+)§r§e降职为普通成员§r",
+ "R(?<p1>.+)§r§e\\ 已將\\ §r(?<p0>.+)§r§e\\ 降級為組隊隊員§r",
+ "R(?<p1>.+)§r§e\\ rebaixou\\ §r(?<p0>.+)\\ §r§epara\\ membro\\ da\\ party§r",
+ "R(?<p1>.+)§r§e\\ понизил\\ §r(?<p0>.+)\\ §r§eдо\\ участника\\ компании§r",
+ "R(?<p1>.+)§r§e이\\(가\\)\\ §r(?<p0>.+)§r§e을\\(를\\)\\ Party\\ 멤버로\\ 강등시켰습니다§r",
+ "R(?<p1>.+)§r§e\\ został\\(a\\)\\ zdegradowany\\(\\-a\\)\\ §r(?<p0>.+)\\ §r§edo\\ członka\\ party§r",
+ "R(?<p1>.+)§r§e\\ が\\ §r(?<p0>.+)§r§e\\ を\\ Party\\ メンバーに降格させました§r",
+ "R(?<p1>.+)§r§e\\ has\\ demoted\\ §r(?<p0>.+)\\ §r§et'\\ Party\\ Member§r",
+ "R(?<p1>.+)§r§e\\ har\\ nedgradert\\ §r(?<p0>.+)\\ §r§etil\\ party\\-medlem§r",
+ "R(?<p1>.+)§r§e\\ rebaixou\\ §r(?<p0>.+)\\ §r§epara\\ membro\\ da\\ party§r",
+ "R(?<p1>.+)§r§e\\ degraderade\\ §r(?<p0>.+)\\ §r§etill\\ Partymedlem§r",
+ "R(?<p1>.+)§r§e,\\ §r(?<p0>.+)§r§e\\ oyuncusunu\\ Parti\\ Üyesi\\ rütbesine\\ düşürdü§r",
+ "R(?<p1>.+)§r§e\\ har\\ degraderet\\ §r(?<p0>.+)\\ §r§etil\\ party\\ medlem§r",
+ "R§eHráč\\ §r(?<p1>.+)§r§e\\ degradoval\\ hráče\\ §r(?<p0>.+)\\ §r§ena\\ člena\\ party§r",
+ "R(?<p1>.+)§r§e\\ alensi\\ pelaajan\\ §r(?<p0>.+)\\ §r§ePartyn\\ jäseneksi§r",
+ "R§eΟ\\ §r(?<p1>.+)§r§e\\ έχει\\ υποβιβάσει\\ τον\\ §r(?<p0>.+)\\ §r§eσε\\ Μέλος\\ Party§r",
+ "R(?<p1>.+)§r§e\\ понизив\\ §r(?<p0>.+)\\ §r§eдо\\ учасника\\ Party§r",
+ "R(?<p1>.+)§r§e\\ a\\ retrogradat\\ pe\\ §r(?<p0>.+)\\ §r§eîn\\ Membru\\ de\\ Party§r",
+ "R(?<p1>.+)§r§e\\ lefokozta\\ §r(?<p0>.+)\\-t\\ §r§eParty\\ Taggá§r"
+ ],
+ "accept_invite_leader": [
+ "R§eYou\\ have\\ joined\\ §r(?<p1>.+)'s\\ §r§eparty!§r",
+ "R§eDu\\ bist\\ der\\ Party\\ von\\ §r(?<p1>.+)\\ §r§ebeigetreten!§r",
+ "R§eVous\\ avez\\ rejoint\\ la\\ party\\ de\\ §r(?<p1>.+)§r§e!§r",
+ "R§eJe\\ trad\\ toe\\ tot\\ de\\ party\\ van\\ §r(?<p1>.+)§r§e!§r",
+ "R§e¡Te\\ has\\ unido\\ a\\ la\\ party\\ de\\ §r(?<p1>.+)§r§e!§r",
+ "R§eTi\\ sei\\ unito\\ al\\ party\\ di\\ §r(?<p1>.+)§r§e!§r",
+ "R§e你加入了§r(?<p1>.+)§r§e的组队!§r",
+ "R§e你已加入\\ §r(?<p1>.+)\\ §r§e的組隊!§r",
+ "R§eVocê\\ entrou\\ na\\ party\\ de\\ §r(?<p1>.+)§r§e!§r",
+ "R§eВы\\ присоединились\\ к\\ компании\\ игрока\\ §r(?<p1>.+)§r§e!§r",
+ "R(?<p1>.+)§r§e\\ 님의\\ Party에\\ 참여했습니다!§r",
+ "R§eDołączono\\ do\\ party\\ gracza\\ §r(?<p1>.+)§r§e!§r",
+ "R(?<p1>.+)\\ §r§eの\\ Party\\ に参加しました!§r",
+ "R§eYe\\ 'ave\\ boarded\\ §r(?<p1>.+)'s\\ §r§eparty!§r",
+ "R§eDu\\ har\\ blitt\\ med\\ i\\ §r(?<p1>.+)\\ sitt\\ §r§eparty!§r",
+ "R§eEntraste\\ na\\ party\\ de\\ §r(?<p1>.+)§r§e!§r",
+ "R§eDu\\ har\\ gått\\ med\\ i\\ §r(?<p1>.+)s\\ §r§eparty!§r",
+ "R§f\\ §r(?<p1>.+)'§r§eın\\ partysine\\ katıldın!§r",
+ "R§eDu\\ har\\ tilsluttet\\ dig\\ §r(?<p1>.+)'s\\ §r§eparty!§r",
+ "R§ePřipojil\\ ses\\ do\\ party\\ hráče\\ §r(?<p1>.+)§r§e!§r",
+ "R§eLiityit\\ pelaajan\\ §r(?<p1>.+)\\ §r§epartyyn!§r",
+ "R§eΈχεις\\ ενταχθεί\\ στο\\ party\\ του\\ §r(?<p1>.+)§r§e!§r",
+ "R§eYou\\ have\\ joined\\ §r(?<p1>.+)'s\\ §r§eparty!§r",
+ "R§eTe\\-ai\\ alăturat\\ în\\ party\\-ul\\ lui\\ §r(?<p1>.+)\\ §r§e!§r",
+ "R§eCsatlakoztál\\ §r(?<p1>.+)\\ §r§epartyjához!§r"
+ ],
+ "accept_invite_members": [
+ "R§eYou'll\\ be\\ partying\\ with:\\ §r(?<p2>.+)§r",
+ "R§eDu\\ bist\\ in\\ einer\\ Party\\ mit:\\ §r(?<p2>.+)§r",
+ "R§eVous\\ serez\\ en\\ party\\ avec:\\ §r(?<p2>.+)§r",
+ "R§eJe\\ zit\\ in\\ een\\ party\\ met:\\ §r(?<p2>.+)§r",
+ "R§eEstarás\\ jugando\\ con:\\ §r(?<p2>.+)§r",
+ "R§eSarai\\ in\\ un\\ party\\ con:\\ §r(?<p2>.+)§r",
+ "R§e组队成员:§r(?<p2>.+)§r",
+ "R§e組隊隊員:§r(?<p2>.+)§r",
+ "R§eJogando\\ com:\\ §r(?<p2>.+)§r",
+ "R§eВы\\ будете\\ в\\ компании\\ с:\\ §r(?<p2>.+)§r",
+ "R§e같이\\ Party에\\ 있는\\ 사람:\\ §r(?<p2>.+)§r",
+ "R§eJesteś\\ w\\ party\\ z:\\ §r(?<p2>.+)§r",
+ "R§e以下の人とPartyを組みます:§r(?<p2>.+)§r",
+ "R§eYe\\ will\\ be\\ partyin'\\ wit':\\ §r(?<p2>.+)§r",
+ "R§eDu\\ kommer\\ til\\ å\\ være\\ i\\ party\\ med:\\ §r(?<p2>.+)§r",
+ "R§eVais\\ jogar\\ com:\\ §r(?<p2>.+)§r",
+ "R§eDu\\ kommer\\ att\\ party\\ upp\\ med:\\ §r(?<p2>.+)§r",
+ "R§eBunlarla\\ partide\\ olacaksın:§r(?<p2>.+)§r",
+ "R§eDu\\ kommer\\ til\\ at\\ være\\ i\\ party\\ med:\\ §r(?<p2>.+)§r",
+ "R§eBudeš\\ v\\ party\\ s\\ těmito\\ hráči:\\ §r(?<p2>.+)§r",
+ "R§eKanssasi\\ partyssa:\\ §r(?<p2>.+)§r",
+ "R§eΘα\\ είσαι\\ στο\\ party\\ με:\\ §r(?<p2>.+)§r",
+ "R§eВи\\ будете\\ в\\ групі\\ з:\\ §r(?<p2>.+)§r",
+ "R§eVei\\ fi\\ în\\ party\\ cu:\\ §r(?<p2>.+)§r",
+ "R§eVelük\\ leszel\\ egy\\ partyban:\\ §r(?<p2>.+)§r"
+ ]
+} \ No newline at end of file