aboutsummaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/de/hype/bbsentials/chat/Chat.java66
-rw-r--r--src/main/java/de/hype/bbsentials/client/BBsentials.java8
-rw-r--r--src/main/java/de/hype/bbsentials/client/Commands/CommandsOLD.java359
-rw-r--r--src/main/java/de/hype/bbsentials/client/Config.java33
-rw-r--r--src/main/java/de/hype/bbsentials/client/CustomGson.java28
-rw-r--r--src/main/java/de/hype/bbsentials/client/DebugThread.java13
-rw-r--r--src/main/java/de/hype/bbsentials/client/ToDisplayConfig.java97
-rw-r--r--src/main/java/de/hype/bbsentials/communication/BBsentialConnection.java283
-rw-r--r--src/main/java/de/hype/bbsentials/constants/BBDisplayNameProvider.java23
-rw-r--r--src/main/java/de/hype/bbsentials/constants/BBDisplayNameProviderWithCustom.java6
-rw-r--r--src/main/java/de/hype/bbsentials/constants/annotations/BBSelectableChChestPingRole.java11
-rw-r--r--src/main/java/de/hype/bbsentials/constants/annotations/BBSelectableMiningEventPingRole.java11
-rw-r--r--src/main/java/de/hype/bbsentials/constants/annotations/BBSelectableRole.java12
-rw-r--r--src/main/java/de/hype/bbsentials/constants/enviromentShared/AuthenticationConstants.java7
-rw-r--r--src/main/java/de/hype/bbsentials/constants/enviromentShared/ChChestItem.java46
-rw-r--r--src/main/java/de/hype/bbsentials/constants/enviromentShared/ChChestItems.java87
-rw-r--r--src/main/java/de/hype/bbsentials/constants/enviromentShared/EnumUtils.java209
-rw-r--r--src/main/java/de/hype/bbsentials/constants/enviromentShared/InternalReasonConstants.java14
-rw-r--r--src/main/java/de/hype/bbsentials/constants/enviromentShared/Islands.java39
-rw-r--r--src/main/java/de/hype/bbsentials/constants/enviromentShared/MiningEvents.java40
-rw-r--r--src/main/java/de/hype/bbsentials/packets/AbstractPacket.java67
-rw-r--r--src/main/java/de/hype/bbsentials/packets/EnviromentPacketConfig.java7
-rw-r--r--src/main/java/de/hype/bbsentials/packets/Packet.java26
-rw-r--r--src/main/java/de/hype/bbsentials/packets/PacketManager.java48
-rw-r--r--src/main/java/de/hype/bbsentials/packets/PacketUtils.java122
-rw-r--r--src/main/java/de/hype/bbsentials/packets/packets/BingoChatMessagePacket.java26
-rw-r--r--src/main/java/de/hype/bbsentials/packets/packets/BroadcastMessagePacket.java17
-rw-r--r--src/main/java/de/hype/bbsentials/packets/packets/ChChestPackage.java24
-rw-r--r--src/main/java/de/hype/bbsentials/packets/packets/DisconnectPacket.java20
-rw-r--r--src/main/java/de/hype/bbsentials/packets/packets/DisplayMessagePacket.java14
-rw-r--r--src/main/java/de/hype/bbsentials/packets/packets/DisplayTellrawMessagePacket.java13
-rw-r--r--src/main/java/de/hype/bbsentials/packets/packets/InternalCommandPacket.java18
-rw-r--r--src/main/java/de/hype/bbsentials/packets/packets/InvalidCommandFeedbackPacket.java25
-rw-r--r--src/main/java/de/hype/bbsentials/packets/packets/MiningEventPacket.java26
-rw-r--r--src/main/java/de/hype/bbsentials/packets/packets/RequestConnectPacket.java21
-rw-r--r--src/main/java/de/hype/bbsentials/packets/packets/SplashNotifyPacket.java26
-rw-r--r--src/main/java/de/hype/bbsentials/packets/packets/WelcomeClientPacket.java19
37 files changed, 1582 insertions, 329 deletions
diff --git a/src/main/java/de/hype/bbsentials/chat/Chat.java b/src/main/java/de/hype/bbsentials/chat/Chat.java
index 7a9c53a..00380ff 100644
--- a/src/main/java/de/hype/bbsentials/chat/Chat.java
+++ b/src/main/java/de/hype/bbsentials/chat/Chat.java
@@ -7,6 +7,7 @@ import net.fabricmc.fabric.api.client.message.v1.ClientSendMessageEvents;
import net.minecraft.client.MinecraftClient;
import net.minecraft.text.Text;
import net.minecraft.util.Formatting;
+
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
@@ -57,13 +58,11 @@ public class Chat {
if (java.lang.reflect.Modifier.isTransient(field.getModifiers())) {
continue;
}
-
String variableName = field.getName();
String variablePackageName = clazz.getPackage().getName();
String variableClassName = clazz.getSimpleName();
- String variableInfo = variableName;
- variableInfoList.add(variableInfo);
+ variableInfoList.add(variableName);
}
return variableInfoList.toArray(new String[variableInfoList.size()]);
@@ -167,7 +166,7 @@ public class Chat {
//Handle in client
public Text handleInClient(Text messageOriginal) {
- String message = extractPlainText(messageOriginal.toString()).trim();
+ String message = messageOriginal.getString().trim();
if (getConfig().messageFromAlreadyReported(message) && getPlayerNameFromMessage(message) != " " && getPlayerNameFromMessage(message) != "") {
System.out.println("Message: " + message);
sendPrivateMessageToSelf(Formatting.RED + "B: " + message);
@@ -243,35 +242,6 @@ public class Chat {
}
}
- } //Everything containing party is processed differently (split so fewer checks)
- else if (message.contains("unlocked Wither Essence") && message.startsWith(getConfig().getUsername())) {
- if (BBsentials.getConfig().isLeader()) {
- repartyActive = true;
- sendCommand("/pl");
- }
- else {
- System.out.println("No Reparty because not leader");
- }
- if (getConfig().isLeaveDungeonAutomatically()) {
- config.sender.addSendTask("/warp dhub", 3);
- }
- }
- else if (message.contains("unlocked Crimson Essence") && message.startsWith(getConfig().getUsername())) {
- if (BBsentials.getConfig().isLeader()) {
- repartyActive = true;
- sendCommand("/pl");
- }
- else {
- System.out.println("No Reparty because not leader");
- }
- try {
- Thread.sleep(3000);
- } catch (InterruptedException e) {
- throw new RuntimeException(e);
- }
- if (getConfig().isLeaveKuudraAutomatically()) {
- sendCommand("/warp kuudra");
- }
}
else if (message.contains("bb:test")) {
sendPrivateMessageToSelf(test());
@@ -321,19 +291,7 @@ public class Chat {
}
}
}
- else if (message.equals("You laid an Egg!")) {
- Thread eggThread = new Thread(() -> {
- try {
- Thread.sleep(21000); // Wait for 21 seconds (in milliseconds)
- sendPrivateMessageToSelf("Chicken Head is ready");
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- });
-
- eggThread.start();
- }
- else if (message.contains("[OPEN MENU]") || message.contains("YES")) {
+ else if (message.contains("[OPEN MENU]") || message.contains("[YES]")) {
setChatPromtId(messageOriginal.toString());
}
@@ -535,7 +493,11 @@ public class Chat {
new Thread(new Runnable() {
@Override
public void run() {
- BBsentials.getConfig().setLastChatPromptAnswer("/cb " + finalLastPrompt1);
+ String promptCommand = "/cb " + finalLastPrompt1;
+ BBsentials.getConfig().setLastChatPromptAnswer(promptCommand);
+ if (config.isDevModeEnabled()) {
+ Chat.sendPrivateMessageToSelf("set the last prompt action too + \""+promptCommand+"\"");
+ }
try {
Thread.sleep(10 * 1000);
} catch (InterruptedException e) {
@@ -552,13 +514,17 @@ public class Chat {
new Thread(new Runnable() {
@Override
public void run() {
- BBsentials.getConfig().setLastChatPromptAnswer("/chatprompt " + finalLastPrompt + " YES");
+ String promptCommand = "/chatprompt " + finalLastPrompt + " YES";
+ getConfig().setLastChatPromptAnswer(promptCommand);
+ if (config.isDevModeEnabled()) {
+ Chat.sendPrivateMessageToSelf("set the last prompt action too + \""+promptCommand+"\"");
+ }
try {
Thread.sleep(10 * 1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
- BBsentials.getConfig().setLastChatPromptAnswer(null);
+ getConfig().setLastChatPromptAnswer(null);
return;
}
}).start();
@@ -575,4 +541,4 @@ public class Chat {
Text output = Text.Serializer.fromJson(text);
return output;
}
-} \ No newline at end of file
+}
diff --git a/src/main/java/de/hype/bbsentials/client/BBsentials.java b/src/main/java/de/hype/bbsentials/client/BBsentials.java
index 66807a0..2317a18 100644
--- a/src/main/java/de/hype/bbsentials/client/BBsentials.java
+++ b/src/main/java/de/hype/bbsentials/client/BBsentials.java
@@ -21,6 +21,9 @@ import org.lwjgl.glfw.GLFW;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
import static de.hype.bbsentials.chat.Chat.*;
@@ -29,7 +32,7 @@ public class BBsentials implements ClientModInitializer {
public static Config config;
public static BBsentialConnection bbserver;
public static CommandsOLD coms;
-
+ public static ScheduledExecutorService executionService = Executors.newScheduledThreadPool(1000);
/**
* Runs the mod initializer on the client environment.
*/
@@ -122,7 +125,7 @@ public class BBsentials implements ClientModInitializer {
String variableName = StringArgumentType.getString(context, "variableName");
String variableValue = StringArgumentType.getString(context, "variableValue");
try {
- if (!variableName.contains("dev")||config.bbsentialsRoles.contains("dev")){
+ if (!variableName.toLowerCase().contains("dev")||config.hasBBRoles("dev")){
setVariableValue(getConfig(), variableName, variableValue);}
getConfig().save();
} catch (ClassNotFoundException | NoSuchFieldException |
@@ -166,6 +169,7 @@ public class BBsentials implements ClientModInitializer {
})))
);
}); //bbi}
+ executionService.scheduleAtFixedRate(new DebugThread(),0,20, TimeUnit.SECONDS);
}
public static void refreshCommands() {
diff --git a/src/main/java/de/hype/bbsentials/client/Commands/CommandsOLD.java b/src/main/java/de/hype/bbsentials/client/Commands/CommandsOLD.java
index 10b3037..e1f3141 100644
--- a/src/main/java/de/hype/bbsentials/client/Commands/CommandsOLD.java
+++ b/src/main/java/de/hype/bbsentials/client/Commands/CommandsOLD.java
@@ -1,29 +1,41 @@
package de.hype.bbsentials.client.Commands;
+import com.mojang.brigadier.CommandDispatcher;
import com.mojang.brigadier.arguments.IntegerArgumentType;
import com.mojang.brigadier.arguments.StringArgumentType;
+import de.hype.bbsentials.chat.Chat;
import de.hype.bbsentials.client.BBsentials;
-import de.hype.bbsentials.communication.BBsentialConnection;
+import de.hype.bbsentials.constants.enviromentShared.ChChestItems;
+import de.hype.bbsentials.constants.enviromentShared.Islands;
+import de.hype.bbsentials.constants.enviromentShared.MiningEvents;
+import de.hype.bbsentials.packets.AbstractPacket;
+import de.hype.bbsentials.packets.packets.*;
import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager;
import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback;
+import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource;
+import net.fabricmc.fabric.api.event.Event;
import net.minecraft.command.CommandSource;
+import java.util.ArrayList;
+import java.util.List;
+
import static de.hype.bbsentials.client.BBsentials.*;
public class CommandsOLD {
public CommandsOLD() {
- ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> {
- dispatcher.register(ClientCommandManager.literal("warp").then(ClientCommandManager.argument("destination", StringArgumentType.string()).suggests((context, builder) -> {
- // Provide tab-completion options for menu subfolder
- return CommandSource.suggestMatching(new String[]{"desert", "hub", "dhub", "nether", "isle", "wizard", "portal", "mines", "forge", "ch", "crystals", "nucleus", "end", "drag", "void", "castle", "howl", "park", "jungle", "nest", "arachne", "spider", "deep", "barn", "home", "kuurda", "wasteland", "dragontail", "scarleton", "smold", "garden", "da", "crypt", "museum", "trapper", "dungeon_hub"}, builder);
- }).executes((context) -> {
- // Handle "variableName" and "variableValue" logic here
- String destination = StringArgumentType.getString(context, "destination");
- getConfig().sender.addSendTask("/warp " + destination, 0);
- return 1;
- })));
- }); //warp test
- ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> {
+ Event<ClientCommandRegistrationCallback> event = ClientCommandRegistrationCallback.EVENT;
+// event.register((dispatcher, registryAccess) -> {
+// dispatcher.register(ClientCommandManager.literal("warp").then(ClientCommandManager.argument("destination", StringArgumentType.string()).suggests((context, builder) -> {
+// // Provide tab-completion options for menu subfolder
+// return CommandSource.suggestMatching(new String[]{"desert", "hub", "dhub", "nether", "isle", "wizard", "portal", "mines", "forge", "ch", "crystals", "nucleus", "end", "drag", "void", "castle", "howl", "park", "jungle", "nest", "arachne", "spider", "deep", "barn", "home", "kuurda", "wasteland", "dragontail", "scarleton", "smold", "garden", "da", "crypt", "museum", "trapper", "dungeon_hub"}, builder);
+// }).executes((context) -> {
+// // Handle "variableName" and "variableValue" logic here
+// String destination = StringArgumentType.getString(context, "destination");
+// getConfig().sender.addSendTask("/warp " + destination, 0);
+// return 1;
+// })));
+// }); //warp test
+ event.register((dispatcher, registryAccess) -> {
dispatcher.register(ClientCommandManager.literal("creport")
.then(ClientCommandManager.argument("Player_Name", StringArgumentType.string())
.executes((context) -> {
@@ -33,145 +45,128 @@ public class CommandsOLD {
return 1;
})));
});//creport helper → no double report during same launch
- ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> {
- dispatcher.register(ClientCommandManager.literal("hp").then(ClientCommandManager.literal("accept").then(ClientCommandManager.argument("player", StringArgumentType.string()).executes((context) -> {
- String player = StringArgumentType.getString(context, "player");
- getConfig().sender.addImmediateSendTask("/party accept " + player);
- return 1;
- }))).then(ClientCommandManager.literal("chat").executes((context) -> {
- getConfig().sender.addImmediateSendTask("/party chat");
- return 1;
- })).then(ClientCommandManager.literal("demote").then(ClientCommandManager.argument("player", StringArgumentType.string()).suggests((context, builder) -> {
- // Provide tab-completion options for menu subfolder
- return CommandSource.suggestMatching(getConfig().getPlayersInParty(), builder);
- }).executes((context) -> {
- String player = StringArgumentType.getString(context, "player");
- getConfig().sender.addImmediateSendTask("/party demote " + player);
- return 1;
- }))).then(ClientCommandManager.literal("disband").executes((context) -> {
- getConfig().sender.addImmediateSendTask("/party disband");
- return 1;
- })).then(ClientCommandManager.literal("kick").then(ClientCommandManager.argument("player", StringArgumentType.string()).suggests((context, builder) -> {
- // Provide tab-completion options for menu subfolder
- return CommandSource.suggestMatching(getConfig().getPlayersInParty(), builder);
- }).executes((context) -> {
- String player = StringArgumentType.getString(context, "player");
- getConfig().sender.addImmediateSendTask("/party kick " + player);
- return 1;
- }))).then(ClientCommandManager.literal("kickoffline").executes((context) -> {
- getConfig().sender.addImmediateSendTask("/party kickoffline");
- return 1;
- })).then(ClientCommandManager.literal("leave").executes((context) -> {
- getConfig().sender.addImmediateSendTask("/party leave");
- return 1;
- })).then(ClientCommandManager.literal("list").executes((context) -> {
- getConfig().sender.addImmediateSendTask("/party list");
- return 1;
- })).then(ClientCommandManager.literal("mute").executes((context) -> {
- getConfig().sender.addImmediateSendTask("/party mute");
- return 1;
- })).then(ClientCommandManager.literal("poll").then(ClientCommandManager.argument("question/answer/answer/answer", StringArgumentType.greedyString()).executes((context) -> {
- String questionAndAnswers = StringArgumentType.getString(context, "question answer answer (answer)");
- getConfig().sender.addImmediateSendTask("/party poll " + questionAndAnswers);
- return 1;
- }))).then(ClientCommandManager.literal("private").executes((context) -> {
- getConfig().sender.addImmediateSendTask("/party private");
- return 1;
- })).then(ClientCommandManager.literal("promote").then(ClientCommandManager.argument("player", StringArgumentType.string()).suggests((context, builder) -> {
- // Provide tab-completion options for menu subfolder
- return CommandSource.suggestMatching(getConfig().getPlayersInParty(), builder);
- }).executes((context) -> {
- String player = StringArgumentType.getString(context, "player");
- getConfig().sender.addImmediateSendTask("/party promote " + player);
- return 1;
- }))).then(ClientCommandManager.literal("setting").then(ClientCommandManager.literal("allinvite")).executes((context) -> {
- String setting = StringArgumentType.getString(context, "setting");
- getConfig().sender.addImmediateSendTask("/party setting " + setting);
- return 1;
- })
-
- ).then(ClientCommandManager.literal("transfer").then(ClientCommandManager.argument("player", StringArgumentType.string()).suggests((context, builder) -> {
- // Provide tab-completion options for menu subfolder
- return CommandSource.suggestMatching(getConfig().getPlayersInParty(), builder);
- }).executes((context) -> {
- String player = StringArgumentType.getString(context, "player");
- getConfig().sender.addImmediateSendTask("/party transfer " + player);
- return 1;
- }))).then(ClientCommandManager.literal("warp").executes((context) -> {
- getConfig().sender.addImmediateSendTask("/party warp");
- return 1;
- })).executes(context -> {
- getConfig().sender.addImmediateSendTask("/p");
- return 1;
- }));
- }); //party test
- ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> {
- dispatcher.register(
- ClientCommandManager.literal("goblinraid")
- .executes((context) -> {
- bbserver.sendMessage("?dwevent goblinraid");
- return 1;
- })
- );
+// event.register((dispatcher, registryAccess) -> {
+// dispatcher.register(ClientCommandManager.literal("hp").then(ClientCommandManager.literal("accept").then(ClientCommandManager.argument("player", StringArgumentType.string()).executes((context) -> {
+// String player = StringArgumentType.getString(context, "player");
+// getConfig().sender.addImmediateSendTask("/party accept " + player);
+// return 1;
+// }))).then(ClientCommandManager.literal("chat").executes((context) -> {
+// getConfig().sender.addImmediateSendTask("/party chat");
+// return 1;
+// })).then(ClientCommandManager.literal("demote").then(ClientCommandManager.argument("player", StringArgumentType.string()).suggests((context, builder) -> {
+// // Provide tab-completion options for menu subfolder
+// return CommandSource.suggestMatching(getConfig().getPlayersInParty(), builder);
+// }).executes((context) -> {
+// String player = StringArgumentType.getString(context, "player");
+// getConfig().sender.addImmediateSendTask("/party demote " + player);
+// return 1;
+// }))).then(ClientCommandManager.literal("disband").executes((context) -> {
+// getConfig().sender.addImmediateSendTask("/party disband");
+// return 1;
+// })).then(ClientCommandManager.literal("kick").then(ClientCommandManager.argument("player", StringArgumentType.string()).suggests((context, builder) -> {
+// // Provide tab-completion options for menu subfolder
+// return CommandSource.suggestMatching(getConfig().getPlayersInParty(), builder);
+// }).executes((context) -> {
+// String player = StringArgumentType.getString(context, "player");
+// getConfig().sender.addImmediateSendTask("/party kick " + player);
+// return 1;
+// }))).then(ClientCommandManager.literal("kickoffline").executes((context) -> {
+// getConfig().sender.addImmediateSendTask("/party kickoffline");
+// return 1;
+// })).then(ClientCommandManager.literal("leave").executes((context) -> {
+// getConfig().sender.addImmediateSendTask("/party leave");
+// return 1;
+// })).then(ClientCommandManager.literal("list").executes((context) -> {
+// getConfig().sender.addImmediateSendTask("/party list");
+// return 1;
+// })).then(ClientCommandManager.literal("mute").executes((context) -> {
+// getConfig().sender.addImmediateSendTask("/party mute");
+// return 1;
+// })).then(ClientCommandManager.literal("poll").then(ClientCommandManager.argument("question/answer/answer/answer", StringArgumentType.greedyString()).executes((context) -> {
+// String questionAndAnswers = StringArgumentType.getString(context, "question answer answer (answer)");
+// getConfig().sender.addImmediateSendTask("/party poll " + questionAndAnswers);
+// return 1;
+// }))).then(ClientCommandManager.literal("private").executes((context) -> {
+// getConfig().sender.addImmediateSendTask("/party private");
+// return 1;
+// })).then(ClientCommandManager.literal("promote").then(ClientCommandManager.argument("player", StringArgumentType.string()).suggests((context, builder) -> {
+// // Provide tab-completion options for menu subfolder
+// return CommandSource.suggestMatching(getConfig().getPlayersInParty(), builder);
+// }).executes((context) -> {
+// String player = StringArgumentType.getString(context, "player");
+// getConfig().sender.addImmediateSendTask("/party promote " + player);
+// return 1;
+// }))).then(ClientCommandManager.literal("setting").then(ClientCommandManager.literal("allinvite")).executes((context) -> {
+// String setting = StringArgumentType.getString(context, "setting");
+// getConfig().sender.addImmediateSendTask("/party setting " + setting);
+// return 1;
+// })
+//
+// ).then(ClientCommandManager.literal("transfer").then(ClientCommandManager.argument("player", StringArgumentType.string()).suggests((context, builder) -> {
+// // Provide tab-completion options for menu subfolder
+// return CommandSource.suggestMatching(getConfig().getPlayersInParty(), builder);
+// }).executes((context) -> {
+// String player = StringArgumentType.getString(context, "player");
+// getConfig().sender.addImmediateSendTask("/party transfer " + player);
+// return 1;
+// }))).then(ClientCommandManager.literal("warp").executes((context) -> {
+// getConfig().sender.addImmediateSendTask("/party warp");
+// return 1;
+// })).executes(context -> {
+// getConfig().sender.addImmediateSendTask("/p");
+// return 1;
+// }));
+// }); //party test
+ event.register((dispatcher, registryAccess) -> {
+ miningEvent(dispatcher, "goblinraid", MiningEvents.GOBLIN_RAID);
});/*goblinraid*/
- ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> {
- dispatcher.register(
- ClientCommandManager.literal("2xpowder")
- .executes((context) -> {
- bbserver.sendMessage("?dwevent 2xpowder");
- return 1;
- })
- );
+ event.register((dispatcher, registryAccess) -> {
+ miningEvent(dispatcher, "2xpowder", MiningEvents.DOUBLE_POWDER);
});/*2xpowder*/
- ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> {
- dispatcher.register(
- ClientCommandManager.literal("bettertogether")
- .executes((context) -> {
- bbserver.sendMessage("?dwevent bettertogether");
- return 1;
- })
- );
+ event.register((dispatcher, registryAccess) -> {
+ miningEvent(dispatcher, "bettertogether", MiningEvents.BETTER_TOGETHER);
});/*b2g*/
- ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> {
- dispatcher.register(
- ClientCommandManager.literal("raffle")
- .executes((context) -> {
- bbserver.sendMessage("?dwevent raffle");
- return 1;
- })
- );
+ event.register((dispatcher, registryAccess) -> {
+ miningEvent(dispatcher, "raffle", MiningEvents.RAFFLE);
});/*raffle*/
- ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> {
- dispatcher.register(
- ClientCommandManager.literal("gonewiththewind")
- .executes((context) -> {
- bbserver.sendMessage("?dwevent gonewiththewind");
- return 1;
- })
- );
+ event.register((dispatcher, registryAccess) -> {
+ miningEvent(dispatcher, "gonewiththewind", MiningEvents.GONE_WITH_THE_WIND);
+ });/*gonewiththewind*/
+ event.register((dispatcher, registryAccess) -> {
+ miningEvent(dispatcher, "mithrilgourmand", MiningEvents.MITHRIL_GOURMAND);
});/*gonewiththewind*/
- ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> {
+ event.register((dispatcher, registryAccess) -> {
dispatcher.register(ClientCommandManager.literal("chchest")
.then(ClientCommandManager.argument("Item", StringArgumentType.string())
.suggests((context, builder) -> {
- return CommandSource.suggestMatching(new String[]{"PrehistoricEgg", "Pickonimbus2000", "ElectronTransmitter", "FTX3070", "RobotronReflector", "ControlSwitch", "SyntheticHeart", "SuperliteMotor", "BlueGoblinEgg", "YellowGoblinEgg", "FlawlessAmberGemstone", "FlawlessJadeGemstone", "FlawlessSapphireGemstone", "FlawlessRubyGemstone", "FlawlessAmethystGemstone", "JungleHeart", "FlawlessTopazGemstone", "FlawlessJasperGemstone"}, builder);
+ String[] items = new String[]{"PrehistoricEgg", "Pickonimbus2000", "ElectronTransmitter", "FTX3070", "RobotronReflector", "ControlSwitch", "SyntheticHeart", "SuperliteMotor", "BlueGoblinEgg", "YellowGoblinEgg", "FlawlessAmberGemstone", "FlawlessJadeGemstone", "FlawlessSapphireGemstone", "FlawlessRubyGemstone", "FlawlessAmethystGemstone", "JungleHeart", "FlawlessTopazGemstone", "FlawlessJasperGemstone"};
+ String input = builder.getRemaining().toLowerCase();
+ int lastSemicolonIndex = input.lastIndexOf(";");
+ List<String> suggestions = new ArrayList<>();
+ if (lastSemicolonIndex >= 0) {
+ String inputBeforeSemicolon = input.substring(0, lastSemicolonIndex + 1); // Include the semicolon
+
+ for (String item : items) {
+ suggestions.add(inputBeforeSemicolon + item);
+ }
+ }
+ return CommandSource.suggestMatching(suggestions, builder);
})
.then(ClientCommandManager.argument("X", IntegerArgumentType.integer())
.then(ClientCommandManager.argument("Y", IntegerArgumentType.integer())
.then(ClientCommandManager.argument("Z", IntegerArgumentType.integer())
- .then(ClientCommandManager.argument("ContactWay", StringArgumentType.greedyString())
+ .then(ClientCommandManager.argument("ContactWay", StringArgumentType.string())
.suggests(((context, builder) -> {
return CommandSource.suggestMatching(new String[]{"/msg " + getConfig().getUsername() + " bb:party me", "/p join " + config.getUsername()}, builder);
}))
.executes((context) -> {
- String destination = StringArgumentType.getString(context, "Item");
+ String item = StringArgumentType.getString(context, "Item");
int x = IntegerArgumentType.getInteger(context, "X");
int y = IntegerArgumentType.getInteger(context, "Y");
int z = IntegerArgumentType.getInteger(context, "Z");
String contactWay = StringArgumentType.getString(context, "ContactWay");
- String combinedString = "?chchest " + destination + " " + x + " " + y + " " + z + " " + contactWay;
- bbserver.sendMessage(combinedString);
+ bbserver.sendPacket(new ChChestPackage("", ChChestItems.getItem(item.split(";")), x + "" + y + "" + z, contactWay, ""));
return 1;
}
)
@@ -182,7 +177,7 @@ public class CommandsOLD {
)
);
}); /*chchest*/
- ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> {
+ event.register((dispatcher, registryAccess) -> {
dispatcher.register(
ClientCommandManager.literal("bbserver")
.then(ClientCommandManager.argument("Message", StringArgumentType.greedyString())
@@ -190,7 +185,8 @@ public class CommandsOLD {
String message = StringArgumentType.getString(context, "Message");
if (message.equals("bb:reconnect")) {
BBsentials.connectToBBserver();
- } else {
+ }
+ else {
BBsentials.bbserver.sendMessage(message);
}
return 1;
@@ -198,33 +194,33 @@ public class CommandsOLD {
)
);
});/*BBserver*/
- ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> {
+ event.register((dispatcher, registryAccess) -> {
dispatcher.register(
ClientCommandManager.literal("bc")
.then(ClientCommandManager.argument("Message to Bingo Chat", StringArgumentType.greedyString())
.executes((context) -> {
String message = StringArgumentType.getString(context, "Message to Bingo Chat");
- sendCommand("?bingochat " + message);
+ sendPacket(new BingoChatMessagePacket("", "", message, 0));
return 1;
})
)
);
});/*BincoChatShort*/
- ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> {
+ event.register((dispatcher, registryAccess) -> {
dispatcher.register(
ClientCommandManager.literal("bingochat")
.then(ClientCommandManager.argument("Message to Bingo Chat", StringArgumentType.greedyString())
.executes((context) -> {
String message = StringArgumentType.getString(context, "Message to Bingo Chat");
- sendCommand("?bingochat " + message);
+ sendPacket(new BingoChatMessagePacket("", "", message, 0));
return 1;
})
)
);
});/*BingoChatLong*/
if (getConfig().bbsentialsRoles != null) {
- if (getConfig().bbsentialsRoles.contains("mod")) {
- ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> {
+ if (getConfig().hasBBRoles("mod")) {
+ event.register((dispatcher, registryAccess) -> {
dispatcher.register(
ClientCommandManager.literal("bannounce")
.then(ClientCommandManager.argument("message", StringArgumentType.greedyString())
@@ -236,7 +232,7 @@ public class CommandsOLD {
)
);
});/*bAnnounce*/
- ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> {
+ event.register((dispatcher, registryAccess) -> {
dispatcher.register(
ClientCommandManager.literal("bmute")
.then(ClientCommandManager.argument("message", StringArgumentType.greedyString())
@@ -248,7 +244,7 @@ public class CommandsOLD {
)
);
});/*bmute*/
- ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> {
+ event.register((dispatcher, registryAccess) -> {
dispatcher.register(
ClientCommandManager.literal("bban")
.then(ClientCommandManager.argument("message", StringArgumentType.greedyString())
@@ -261,47 +257,84 @@ public class CommandsOLD {
);
});/*bmute*/
}
- if (getConfig().bbsentialsRoles.contains("splasher")) {
- ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> {
+ if (getConfig().hasBBRoles("splasher")) {
+ event.register((dispatcher, registryAccess) -> {
dispatcher.register(
ClientCommandManager.literal("splashAnnounce")
.then(ClientCommandManager.argument("Hub", IntegerArgumentType.integer(1, 28))
.then(ClientCommandManager.argument("location", StringArgumentType.string())
.suggests((context, builder) -> {
- return CommandSource.suggestMatching(new String[]{"kat","bea","guild-house"}, builder);
+ return CommandSource.suggestMatching(new String[]{"kat", "bea", "guild-house"}, builder);
})
- .then(ClientCommandManager.argument("extramessage", StringArgumentType.greedyString())
+ .then(ClientCommandManager.argument("lasswaste", StringArgumentType.string())
+ .suggests((context, builder) -> {
+ return CommandSource.suggestMatching(new String[]{"true", "false"}, builder);
+ })
+ .then(ClientCommandManager.argument("extramessage", StringArgumentType.greedyString())
+ .executes((context) -> {
+ int hub = IntegerArgumentType.getInteger(context, "Hub");
+ String extramessage = StringArgumentType.getString(context, "extramessage");
+ String location = StringArgumentType.getString(context, "location");
+ boolean lessWaste = Boolean.parseBoolean(StringArgumentType.getString(context, "lasswaste"));
+ sendPacket(new SplashNotifyPacket(hub, config.getUsername(), location, Islands.HUB, extramessage, lessWaste));
+ return 1;
+ })
+ )
.executes((context) -> {
- int hub_Number = IntegerArgumentType.getInteger(context, "Hub");
- String extramessage = StringArgumentType.getString(context, "extramessage");
- String location = StringArgumentType.getString(context, "location");
- sendCommand("?splash " + hub_Number + " " + location+" "+extramessage);
+ int hub = IntegerArgumentType.getInteger(context, "Hub");
+ String location = "bea";
+ boolean lessWaste = Boolean.parseBoolean(StringArgumentType.getString(context, "lasswaste"));
+ sendPacket(new SplashNotifyPacket(hub, config.getUsername(), location, Islands.HUB, "", lessWaste));
return 1;
})
- )
- .executes((context) -> {
- int hub_Number = IntegerArgumentType.getInteger(context, "Hub");
- String message = "";
- String location = "bea";
- sendCommand("?splash " + hub_Number + " "+location+" " + message);
- return 1;
- })
- )
+ ))
.executes((context) -> {
- int hub_Number = IntegerArgumentType.getInteger(context, "Hub");
- String message = "";
+ int hub = IntegerArgumentType.getInteger(context, "Hub");
String location = StringArgumentType.getString(context, "location");
- sendCommand("?splash " + hub_Number + " "+location+" " + message);
+ sendPacket(new SplashNotifyPacket(hub, config.getUsername(), location, Islands.HUB, "", true));
return 1;
})
+
)
);
});/*SplashAnnounce*/
- } else {
+ }
+ else {
}
}
}
- public void sendCommand(String message){
+
+ private static void simpleCommand(CommandDispatcher<FabricClientCommandSource> dispatcher, String commandName, String[] parameters) {
+ dispatcher.register(
+ ClientCommandManager.literal(commandName)
+ .executes((context) -> {
+ BBsentials.bbserver.sendPacket(new InternalCommandPacket(commandName, parameters));
+ return 1;
+ })
+ );
+ }
+
+ private static void miningEvent(CommandDispatcher<FabricClientCommandSource> dispatcher, String commandName, MiningEvents event) {
+ dispatcher.register(
+ ClientCommandManager.literal(commandName)
+ .executes((context) -> {
+ try {
+ BBsentials.bbserver.sendPacket(new MiningEventPacket(event,//TODO get the island
+ config.getUsername(), Islands.HUB));
+ } catch (Exception e) {
+ Chat.sendPrivateMessageToSelf("§c" + e.getMessage());
+ }
+ return 1;
+ })
+ );
+ }
+
+
+ public void sendCommand(String message) {
BBsentials.bbserver.sendCommand(message);
}
+
+ public <E extends AbstractPacket> void sendPacket(E packet) {
+ BBsentials.bbserver.sendPacket(packet);
+ }
} \ No newline at end of file
diff --git a/src/main/java/de/hype/bbsentials/client/Config.java b/src/main/java/de/hype/bbsentials/client/Config.java
index 35ba61f..131b067 100644
--- a/src/main/java/de/hype/bbsentials/client/Config.java
+++ b/src/main/java/de/hype/bbsentials/client/Config.java
@@ -15,6 +15,7 @@ import java.util.ArrayList;
public class Config implements Serializable {
// Helper class for sending chat messages
+ public int version = 1;
public transient final Sender sender = new Sender();
public transient boolean highlightitem = false;
@@ -28,13 +29,14 @@ public class Config implements Serializable {
private transient boolean isLeader;
private transient String alreadyReported = "";
private String bbServerURL = "static.204.177.34.188.clients.your-server.de";
- public String bbsentialsRoles = "";
+ public String[] bbsentialsRoles = {""};
public static ArrayList<String> partyMembers = new ArrayList<>();
// Set via load / default
private String bbsentialsCommandPrefix = ".";
private String apiKey = "";
private boolean leaveDungeonAutomatically;
+ public boolean showBingoChat = true;
private boolean allowBBinviteMe = true;
private boolean leaveKuudraAutomatically;
private boolean devMode = false;
@@ -42,6 +44,8 @@ public class Config implements Serializable {
private boolean acceptReparty;
private String nickname;
private String getNotifForParty;
+ private final int apiVersion = 1;
+ public transient ToDisplayConfig toDisplayConfig = ToDisplayConfig.loadFromFile();
// Set default attribute values
private void setDefaults() {
@@ -146,16 +150,22 @@ public class Config implements Serializable {
} catch (IOException e) {
e.printStackTrace();
settings = new Config(); // Use default values if loading fails
+ settings.save();
+ }catch (IllegalStateException e){
+ System.out.println("Error loading config. Resetting it.");
+ settings = new Config();
+ settings.save();
}
}
else {
settings = new Config(); // Use default values if the file doesn't exist
settings.username = MinecraftClient.getInstance().player.getName().getString();
}
- if (!settings.bbsentialsRoles.contains("dev")) {
+ if (!settings.hasBBRoles("dev")) {
settings.detailedDevMode = false;
settings.devMode = false;
}
+ settings.save();
return settings;
}
@@ -244,7 +254,7 @@ public class Config implements Serializable {
return isBefore || isInRange;
}
- public boolean overrideBingoTime() {
+ public boolean overrideBingoTime() {
return overrideBingoTime;
}
@@ -263,4 +273,21 @@ public class Config implements Serializable {
public void setLastChatPromptAnswer(String lastChatPromptAnswer) {
this.lastChatPromptAnswer = lastChatPromptAnswer;
}
+
+ public int getVersion() {
+ return version;
+ }
+
+ public boolean hasBBRoles(String roleName) {
+ for (String role : bbsentialsRoles) {
+ if (role.equalsIgnoreCase(roleName)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public int getApiVersion() {
+ return apiVersion;
+ }
}
diff --git a/src/main/java/de/hype/bbsentials/client/CustomGson.java b/src/main/java/de/hype/bbsentials/client/CustomGson.java
new file mode 100644
index 0000000..e9a41da
--- /dev/null
+++ b/src/main/java/de/hype/bbsentials/client/CustomGson.java
@@ -0,0 +1,28 @@
+package de.hype.bbsentials.client;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+
+public class CustomGson {
+ public static Gson create() {
+ return new GsonBuilder()
+// .registerTypeHierarchyAdapter(BBDisplayNameProvider.class, new BBDisplayNameProviderSerializer())
+ .create();
+
+ }
+
+// private static class BBDisplayNameProviderSerializer implements JsonSerializer<BBDisplayNameProvider>, JsonDeserializer<BBDisplayNameProvider> {
+// @Override
+// public JsonElement serialize(BBDisplayNameProvider src, Type typeOfSrc, JsonSerializationContext context) {
+// return new JsonPrimitive(src.serialize()); // Serialize using the provided method
+// }
+//
+// @Override
+// public BBDisplayNameProvider deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
+// String serializedValue = json.getAsString();
+//
+// // Deserialize using the provided method (you need to implement this)
+// return BBDisplayNameProvider.deserialize(serializedValue);
+// }
+// }
+}
diff --git a/src/main/java/de/hype/bbsentials/client/DebugThread.java b/src/main/java/de/hype/bbsentials/client/DebugThread.java
new file mode 100644
index 0000000..b10cad4
--- /dev/null
+++ b/src/main/java/de/hype/bbsentials/client/DebugThread.java
@@ -0,0 +1,13 @@
+package de.hype.bbsentials.client;
+
+public class DebugThread implements Runnable {
+ @Override
+ public void run() {
+ loop();
+ //place a breakpoint for only this thread here.
+ }
+
+ public void loop() {
+
+ }
+}
diff --git a/src/main/java/de/hype/bbsentials/client/ToDisplayConfig.java b/src/main/java/de/hype/bbsentials/client/ToDisplayConfig.java
new file mode 100644
index 0000000..2c513d0
--- /dev/null
+++ b/src/main/java/de/hype/bbsentials/client/ToDisplayConfig.java
@@ -0,0 +1,97 @@
+package de.hype.bbsentials.client;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import net.fabricmc.loader.api.FabricLoader;
+
+import java.io.File;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.lang.reflect.Field;
+
+public class ToDisplayConfig {
+ private boolean disableAll = true;
+ private boolean prehistoricEgg = true;
+ private boolean pickonimbus2000 = true;
+ private boolean controlSwitch = true;
+ private boolean electronTransmitter = true;
+ private boolean ftx3070 = true;
+ private boolean robotronReflector = true;
+ private boolean superliteMotor = true;
+ private boolean syntheticHeart = true;
+ private boolean flawlessGemstone = true;
+ private boolean allRoboPartCustomChChestItem = true;
+ private boolean allChChestItem = true;
+ private boolean dwBetterTogether = true;
+ private boolean dwDoublePowder = true;
+ private boolean dwGoneWithTheWind = true;
+ private boolean dwGoblinRaid = true;
+ private boolean dwMithrilGourmand = true;
+ private boolean dwRaffle = true;
+ private boolean dwEvents = true;
+ private boolean chBetterTogether = true;
+ private boolean chDoublePowder = true;
+ private boolean chGoneWithTheWind = true;
+ private boolean chEvents = true;
+ private boolean allBetterTogether = true;
+ private boolean allDoublePowder = true;
+ private boolean allGoneWithTheWind = true;
+ private boolean allEvents = true;
+
+ // Serialize the object to JSON and save to file
+ public void saveToFile() {
+ File configFile = new File(FabricLoader.getInstance().getConfigDirectory(), "BBsentials_display_Config.json");
+ Gson gson = new GsonBuilder().setPrettyPrinting().create();
+
+ try (FileWriter writer = new FileWriter(configFile)) {
+ gson.toJson(this, writer);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ // Deserialize the object from JSON file
+ public static ToDisplayConfig loadFromFile() {
+ File configFile = new File(FabricLoader.getInstance().getConfigDirectory(), "BBsentials_display_Config.json");
+ Gson gson = new Gson();
+
+ try (FileReader reader = new FileReader(configFile)) {
+ return gson.fromJson(reader, ToDisplayConfig.class);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ // If file doesn't exist or there's an error, return a new instance
+ return new ToDisplayConfig();
+ }
+
+ public void setValueAndSave(String propertyName, Object newValue) {
+ String lowerCasePropertyName = propertyName.toLowerCase();
+
+ try {
+ Field field = getClass().getDeclaredField(lowerCasePropertyName);
+ field.setAccessible(true);
+
+ field.set(this, newValue);
+ saveToFile();
+ } catch (NoSuchFieldException | IllegalAccessException e) {
+ e.printStackTrace();
+ }
+ }
+
+ // Method to get a value based on property name
+ public boolean getValue(String propertyName) {
+ if (disableAll) return false;
+ String lowerCasePropertyName = propertyName.toLowerCase();
+ try {
+ Field field = getClass().getDeclaredField(lowerCasePropertyName);
+ field.setAccessible(true);
+ return field.getBoolean(this);
+ } catch (NoSuchFieldException | IllegalAccessException e) {
+ e.printStackTrace();
+ }
+
+ return false;
+ }
+}
diff --git a/src/main/java/de/hype/bbsentials/communication/BBsentialConnection.java b/src/main/java/de/hype/bbsentials/communication/BBsentialConnection.java
index 2c6c7d2..ddf8749 100644
--- a/src/main/java/de/hype/bbsentials/communication/BBsentialConnection.java
+++ b/src/main/java/de/hype/bbsentials/communication/BBsentialConnection.java
@@ -2,11 +2,21 @@ package de.hype.bbsentials.communication;
import de.hype.bbsentials.chat.Chat;
import de.hype.bbsentials.client.BBsentials;
+import de.hype.bbsentials.constants.enviromentShared.AuthenticationConstants;
+import de.hype.bbsentials.constants.enviromentShared.ChChestItem;
+import de.hype.bbsentials.constants.enviromentShared.Islands;
+import de.hype.bbsentials.packets.AbstractPacket;
+import de.hype.bbsentials.packets.PacketManager;
+import de.hype.bbsentials.packets.PacketUtils;
+import de.hype.bbsentials.packets.packets.*;
import net.minecraft.client.MinecraftClient;
import net.minecraft.entity.effect.StatusEffectInstance;
import net.minecraft.entity.effect.StatusEffects;
-import javax.net.ssl.*;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.X509TrustManager;
import java.io.*;
import java.net.Socket;
import java.net.SocketException;
@@ -17,9 +27,8 @@ import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
+import java.util.Arrays;
import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class BBsentialConnection {
@@ -28,8 +37,54 @@ public class BBsentialConnection {
private PrintWriter writer;
private LinkedBlockingQueue<String> messageQueue;
private MessageReceivedCallback messageReceivedCallback;
- private ScheduledExecutorService executorService;
private String itemName = "Hub #0";
+ private PacketManager packetManager;
+
+ public BBsentialConnection() {
+ packetManager = new PacketManager(this);
+ }
+
+ public void onBingoChatMessagePacket(BingoChatMessagePacket packet) {
+ if (BBsentials.config.showBingoChat) {
+ Chat.sendPrivateMessageToSelf("[" + packet.prefix + "] " + packet.username + ": " + packet.message);
+ }
+ }
+
+ public void onChChestPackage(ChChestPackage packet) {
+ if (isCommandSafe(packet.bbcommand)) {
+ String tellrawText = ("{\"text\":\"BB: @username found @item in a chest at (@coords). Click here to get a party invite @extramessage\",\"color\":\"green\",\"clickEvent\":{\"action\":\"run_command\",\"value\":\"@inviteCommand\"},\"hoverEvent\":{\"action\":\"show_text\",\"contents\":[\"On clicking you will get invited to a party. Command executed: @inviteCommand\"]}}");
+ tellrawText = tellrawText.replace("@username", packet.announcerUsername).replace("@item", Arrays.stream(packet.items).map(ChChestItem::getDisplayName).toList().toString()).replace("@coords", packet.locationCoords).replace("@inviteCommand", packet.bbcommand);
+ if (!(packet.extraMessage == null || packet.extraMessage.isEmpty())) {
+ tellrawText = tellrawText.replace("@extramessage", " : " + packet.extraMessage);
+ }
+ Chat.sendPrivateMessageToSelfText(Chat.createClientSideTellraw(tellrawText));
+ }
+ else {
+ Chat.sendPrivateMessageToSelf("§cFiltered out a suspicious packet! Please send a screenshot of this message with ping Hype_the_Time (hackthetime) in Bingo Apothecary, BB, SBZ, offical Hypixel,...");
+ Chat.sendPrivateMessageToSelf(PacketUtils.parsePacketToJson(packet));
+ }
+ }
+
+ public void onMiningEventPacket(MiningEventPacket packet) {
+ if (BBsentials.config.toDisplayConfig.getValue("disableAll")) {
+ //its will returns false cause disabled is checked already before.
+ Chat.sendPrivateMessageToSelf(packet.username + "There is a " + packet.event.getDisplayName() + "in the " + packet.island.getDisplayName() + " now/soon.");
+ }
+ }
+
+ public void onWelcomePacket(WelcomeClientPacket packet) {
+ if (packet.success) {
+ BBsentials.config.bbsentialsRoles = packet.roles;
+ Chat.sendPrivateMessageToSelf("Login Success");
+ if (!packet.motd.isEmpty()) {
+ Chat.sendPrivateMessageToSelf(packet.motd);
+ }
+ }
+ else {
+ Chat.sendPrivateMessageToSelf("Login Failed");
+ }
+
+ }
public interface MessageReceivedCallback {
void onMessageReceived(String message);
@@ -77,30 +132,28 @@ public class BBsentialConnection {
PublicKey serverPublicKey = serverCertificate.getPublicKey();
// Create a TrustManager that trusts only the server's public key
- TrustManager[] trustManagers = new TrustManager[]{
- new X509TrustManager() {
- public X509Certificate[] getAcceptedIssuers() {
- return null; // We don't need to check the client's certificates
- }
+ TrustManager[] trustManagers = new TrustManager[]{new X509TrustManager() {
+ public X509Certificate[] getAcceptedIssuers() {
+ return null; // We don't need to check the client's certificates
+ }
- public void checkClientTrusted(X509Certificate[] certs, String authType) throws CertificateException {
- // Do nothing, client certificate validation not required
- }
+ public void checkClientTrusted(X509Certificate[] certs, String authType) throws CertificateException {
+ // Do nothing, client certificate validation not required
+ }
- public void checkServerTrusted(X509Certificate[] certs, String authType) throws CertificateException {
- // Check if the server certificate matches the expected one
- if (certs.length == 1) {
- PublicKey publicKey = certs[0].getPublicKey();
- if (!publicKey.equals(serverPublicKey)) {
- throw new CertificateException("Server certificate not trusted.");
- }
- }
- else {
- throw new CertificateException("Invalid server certificate chain.");
- }
+ public void checkServerTrusted(X509Certificate[] certs, String authType) throws CertificateException {
+ // Check if the server certificate matches the expected one
+ if (certs.length == 1) {
+ PublicKey publicKey = certs[0].getPublicKey();
+ if (!publicKey.equals(serverPublicKey)) {
+ throw new CertificateException("Server certificate not trusted.");
}
}
- };
+ else {
+ throw new CertificateException("Invalid server certificate chain.");
+ }
+ }
+ }};
// Create an SSL context with the custom TrustManager
SSLContext sslContext = SSLContext.getInstance("TLS");
@@ -108,7 +161,7 @@ public class BBsentialConnection {
// Create an SSL socket factory
SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
- socket = (SSLSocket) sslSocketFactory.createSocket(serverIP, serverPort);
+ socket = sslSocketFactory.createSocket(serverIP, serverPort);
socket.setKeepAlive(true); // Enable Keep-Alive
@@ -116,8 +169,6 @@ public class BBsentialConnection {
writer = new PrintWriter(socket.getOutputStream(), true);
messageQueue = new LinkedBlockingQueue<>();
- executorService = new ScheduledThreadPoolExecutor(2); // Adjust the pool size as needed
-
// Start message receiver thread
Thread messageReceiverThread = new Thread(() -> {
try {
@@ -142,7 +193,7 @@ public class BBsentialConnection {
}
});
messageReceiverThread.start();
-
+ messageReceiverThread.setName("bb receiver thread");
// Start message sender thread
Thread messageSenderThread = new Thread(() -> {
try {
@@ -155,12 +206,11 @@ public class BBsentialConnection {
}
});
messageSenderThread.start();
+ messageSenderThread.setName("bb sender thread");
- } catch (IOException | NoSuchAlgorithmException |
- KeyManagementException e) {
+ } catch (IOException | NoSuchAlgorithmException | KeyManagementException e) {
e.printStackTrace();
- } catch (
- CertificateException e) {
+ } catch (CertificateException e) {
throw new RuntimeException(e);
}
@@ -200,96 +250,96 @@ public class BBsentialConnection {
//The following onMessageReceived may or may not be modified
// or taken out of order in private/ non official versions of the mod!
public void onMessageReceived(String message) {
- if (message.startsWith("H-")) {
- if (message.equals("H-BB-Login: ")) {
- Chat.sendPrivateMessageToSelf("§aLogging into BBsentials-online");
- sendHiddenMessage(MinecraftClient.getInstance().player.getUuid().toString().replace("-", ""));
- writer.println(BBsentials.getConfig().getApiKey());
- sendHiddenMessage("?getperms");
- }
- else if (message.contains("H-potdurations?")) {
- sendHiddenMessage("?potduration " + getPotTime());
- }
- else if (message.startsWith("H-splash")) {
- String[] arguments = message.split(" ", 7);
- int min = (1 * 60 * 60) - Integer.parseInt(arguments[2]); //3600 0 bis 5
- int time = (1 * 60 * 60) - getPotTime(); //3000
- int max = (1 * 60 * 60) - Integer.parseInt(arguments[3]); //3300
- if ((time <= min) && (time >= max)) {
- if (arguments.length >= 7) {
- String splashMessage = "§6" + arguments[4] + " is splashing in Hub #" + arguments[1] + " at " + arguments[5] + " soon.";
- splashMessage = splashMessage + " : " + arguments[6];
- Chat.sendPrivateMessageToSelf(splashMessage);
- splashHighlightItem("Hub #" + arguments[1], 30000);
+ if (!PacketUtils.handleIfPacket(this, message)) {
+ if (message.startsWith("H-")) {
+ if (message.equals("H-BB-Login: ")) {
+ Chat.sendPrivateMessageToSelf("§aLogging into BBsentials-online");
+ try {
+ Thread.sleep(100);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
}
+ sendPacket(new RequestConnectPacket(MinecraftClient.getInstance().player.getUuid().toString().replace("-", ""), BBsentials.getConfig().getApiKey(), BBsentials.getConfig().getApiVersion(), AuthenticationConstants.DATABASE));
}
- }
- else if (message.startsWith("H-roles")) {
- BBsentials.getConfig().bbsentialsRoles = message.replace("H-Roles ", "");
- BBsentials.refreshCommands();
- }
- else if (message.startsWith("H-chchest")) {
- String[] arguments = message.replace("H-chchest", "").trim().split(" ", 6); // Split with limit of 5
- String username = arguments[0];
- String item = arguments[1];
- int x = Integer.parseInt(arguments[2]);
- int y = Integer.parseInt(arguments[3]);
- int z = Integer.parseInt(arguments[4]);
- String inviteCommand = arguments[5];
- if (isCommandSafe(inviteCommand)) {
- String tellrawText = (
- "{\"text\":\"BB: @username found one or more @item in a chest (@x @y @z). Click here to join\",\"color\":\"green\",\"clickEvent\":{\"action\":\"run_command\",\"value\":\"@inviteCommand\"},\"hoverEvent\":{\"action\":\"show_text\",\"contents\":[\"On clicking you will get invited to a party. Command executed: @inviteCommand\"]}}"
- );
- tellrawText = tellrawText.replace("@username", username).replace("@item", item).replace("@x", x + "").replace("@y", y + "").replace("@z", z + "").replace("@inviteCommand", inviteCommand);
- Chat.sendPrivateMessageToSelfText(Chat.createClientSideTellraw(tellrawText));
+ else if (message.contains("H-potdurations?")) {
+ sendHiddenMessage("?potduration " + getPotTime());
}
- }
- else if (message.startsWith("H-event")) {
- String[] arguments = message.replace("H-event", "").trim().split(" ");
- Chat.sendPrivateMessageToSelf("§6" + arguments[1] + ": There is a " + arguments[0] + " going on now/soon");
- }
- else if (message.startsWith("H-reconnect")) {
- Chat.sendPrivateMessageToSelf("§4BBserver-online is going to restart soon. You will be automatically reconnected.\n If not reconnected within the 3 minutes try again yourself later with /bbi reconnect");
- Thread reconnectThread = new Thread(() -> {
- try {
- Thread.sleep((long) ((30 * 1000) + (Math.random() * 30 * 1000)));
- } catch (InterruptedException e) {
- e.printStackTrace();
+// else if (message.startsWith("H-reconnect")) {
+// Chat.sendPrivateMessageToSelf("§4BBserver-online is going to restart soon. You will be automatically reconnected.\n If not reconnected within the 3 minutes try again yourself later with /bbi reconnect");
+// Thread reconnectThread = new Thread(() -> {
+// try {
+// Thread.sleep((long) ((30 * 1000) + (Math.random() * 30 * 1000)));
+// } catch (InterruptedException e) {
+// e.printStackTrace();
+// }
+// BBsentials.connectToBBserver();
+// if (!socket.isConnected()) {
+// try {
+// Thread.sleep((long) ((30 * 1000) + (Math.random() * 30 * 1000)));
+// } catch (InterruptedException e) {
+// e.printStackTrace();
+// }
+// BBsentials.connectToBBserver();
+// }
+// });
+// reconnectThread.start();
+// }
+ else if (message.startsWith("H-hype")) {
+ String[] arguments = message.replace("H-hype", "").trim().split(" ");
+ if (arguments[0].equals("crash")) {
+ throw new RuntimeException(arguments[1]);
}
- BBsentials.connectToBBserver();
- if (!socket.isConnected()) {
- try {
- Thread.sleep((long) ((30 * 1000) + (Math.random() * 30 * 1000)));
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- BBsentials.connectToBBserver();
+ else if (arguments[0].equals("hub")) {
+ BBsentials.config.sender.addHiddenSendTask("/hub", 1);
}
- });
- reconnectThread.start();
- }
- else if (message.startsWith("H-hype")) {
- String[] arguments = message.replace("H-hype", "").trim().split(" ");
- if (arguments[0].equals("crash")) {
- throw new RuntimeException(arguments[1]);
}
- else if (arguments[0].equals("hub")) {
- BBsentials.config.sender.addHiddenSendTask("/hub", 1);
+ if (BBsentials.getConfig().isDetailedDevModeEnabled()) {
+ Chat.sendPrivateMessageToSelf("BBDev-r: " + message);
}
}
- if (BBsentials.getConfig().isDetailedDevModeEnabled()) {
- Chat.sendPrivateMessageToSelf("BBDev-r: " + message);
+ else {
+ Chat.sendPrivateMessageToSelf("§aBB: " + message);
}
}
+ }
+
+ public void onBroadcastMessage(BroadcastMessagePacket packet) {
+ String message = packet.message;
+ }
+
+ public void onSplashNotify(SplashNotifyPacket packet) {
+ int waitTime;
+ if (packet.lessWaste) {
+ waitTime = (getPotTime() * 1000) / 80;
+ }
+ else {
+ waitTime = 0;
+ }
+ String where;
+ if (packet.hubType.equals(Islands.DUNGEON_HUB)) {
+ where = "§5DUNGEON HUB§6";
+ }
else {
- Chat.sendPrivateMessageToSelf("§aBB: " + message);
+ where = "Hub";
}
+ BBsentials.executionService.schedule(() -> {
+ splashHighlightItem("HUB #" + packet.hub, 20);
+ String timeLoss = "";
+ if (packet.lessWaste) {
+ timeLoss = "§c(" + waitTime + ")";
+ }
+ Chat.sendPrivateMessageToSelf("§6" + packet.splasherUsername + " is Splashing in " + where + " #" + packet.hub + " at " + packet.location + ":" + packet.extraMessage + " | " + timeLoss);
+ }, waitTime, TimeUnit.MILLISECONDS);
+ }
+
+ public void dummy(Object o) {
+ //this does absoloutely nothing
}
public void splashHighlightItem(String itemName, long displayTimeInMilliseconds) {
this.itemName = itemName;
BBsentials.config.highlightitem = true;
- executorService.schedule(() -> {
+ BBsentials.executionService.schedule(() -> {
BBsentials.config.highlightitem = false;
try {
socket.setSoTimeout(0);
@@ -319,15 +369,16 @@ public class BBsentialConnection {
}
//TODO search
- public static boolean isCommandSafe(String command){
- if (command.startsWith("/p ") || command.startsWith("/party ") || command.startsWith("/boop ") || command.startsWith("/msg ")||command.startsWith("/hub ")) {
+ public static boolean isCommandSafe(String command) {
+ if (command.startsWith("/p ") || command.startsWith("/party ") || command.startsWith("/boop ") || command.startsWith("/msg ") || command.startsWith("/hub ")) {
return true;
- }else {
+ }
+ else {
BBsentials.bbserver.sendCommand("?emergency server-hacked? chchest command " + command);
- String emergencyMessage = "We detected that there was a command used which is not configured to be safe! "+command+" please check if its safe. IMMEDIATELY report this to the Admins and Developer Hype_the_Time (@hackthetime). If it is not safe immediately remove BBsentials!!!!!!!! ";
+ String emergencyMessage = "We detected that there was a command used which is not configured to be safe! " + command + " please check if its safe. IMMEDIATELY report this to the Admins and Developer Hype_the_Time (@hackthetime). If it is not safe immediately remove BBsentials!!!!!!!! ";
System.out.println(emergencyMessage);
- Chat.sendPrivateMessageToSelf("§4"+emergencyMessage+"\n\n");
- Chat.sendPrivateMessageToSelf("§4"+emergencyMessage+"\n\n");
+ Chat.sendPrivateMessageToSelf("§4" + emergencyMessage + "\n\n");
+ Chat.sendPrivateMessageToSelf("§4" + emergencyMessage + "\n\n");
/*try {
Thread.sleep(5000);
} catch (InterruptedException e) {
@@ -337,4 +388,14 @@ public class BBsentialConnection {
}
return false;
}
+
+ public <E extends AbstractPacket> void sendPacket(E packet) {
+ String packetName = packet.getClass().getSimpleName();
+ if (packet.getClass().equals(RequestConnectPacket.class)) {
+ sendMessage(packetName + "." + PacketUtils.parsePacketToJson(packet));
+ }
+ else {
+ sendHiddenMessage(packetName + "." + PacketUtils.parsePacketToJson(packet));
+ }
+ }
}
diff --git a/src/main/java/de/hype/bbsentials/constants/BBDisplayNameProvider.java b/src/main/java/de/hype/bbsentials/constants/BBDisplayNameProvider.java
new file mode 100644
index 0000000..308e705
--- /dev/null
+++ b/src/main/java/de/hype/bbsentials/constants/BBDisplayNameProvider.java
@@ -0,0 +1,23 @@
+package de.hype.bbsentials.constants;
+
+public interface BBDisplayNameProvider {
+ String getDisplayName();
+
+ default String serialize() {
+ return name() + ":" + getDisplayName();
+ }
+
+ default String name() {
+ return ((Enum<?>) this).name();
+ }
+
+// public static BBDisplayNameProvider deserialize(String serializedValue) {
+// String[] parts = serializedValue.split(":");
+// if (parts.length != 2) {
+// throw new IllegalArgumentException("Invalid serialized value format");
+// }
+// String enumName = parts[0];
+// String displayName = parts[1];
+// return ;
+// }
+}
diff --git a/src/main/java/de/hype/bbsentials/constants/BBDisplayNameProviderWithCustom.java b/src/main/java/de/hype/bbsentials/constants/BBDisplayNameProviderWithCustom.java
new file mode 100644
index 0000000..4088443
--- /dev/null
+++ b/src/main/java/de/hype/bbsentials/constants/BBDisplayNameProviderWithCustom.java
@@ -0,0 +1,6 @@
+package de.hype.bbsentials.constants;
+
+public interface BBDisplayNameProviderWithCustom<T extends Enum<T>> extends BBDisplayNameProvider {
+ T setDisplayName(String displayname);
+
+}
diff --git a/src/main/java/de/hype/bbsentials/constants/annotations/BBSelectableChChestPingRole.java b/src/main/java/de/hype/bbsentials/constants/annotations/BBSelectableChChestPingRole.java
new file mode 100644
index 0000000..35d7470
--- /dev/null
+++ b/src/main/java/de/hype/bbsentials/constants/annotations/BBSelectableChChestPingRole.java
@@ -0,0 +1,11 @@
+package de.hype.bbsentials.constants.annotations;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.FIELD)
+public @interface BBSelectableChChestPingRole {
+}
diff --git a/src/main/java/de/hype/bbsentials/constants/annotations/BBSelectableMiningEventPingRole.java b/src/main/java/de/hype/bbsentials/constants/annotations/BBSelectableMiningEventPingRole.java
new file mode 100644
index 0000000..8e2e503
--- /dev/null
+++ b/src/main/java/de/hype/bbsentials/constants/annotations/BBSelectableMiningEventPingRole.java
@@ -0,0 +1,11 @@
+package de.hype.bbsentials.constants.annotations;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.FIELD)
+public @interface BBSelectableMiningEventPingRole {
+}
diff --git a/src/main/java/de/hype/bbsentials/constants/annotations/BBSelectableRole.java b/src/main/java/de/hype/bbsentials/constants/annotations/BBSelectableRole.java
new file mode 100644
index 0000000..8597cbc
--- /dev/null
+++ b/src/main/java/de/hype/bbsentials/constants/annotations/BBSelectableRole.java
@@ -0,0 +1,12 @@
+package de.hype.bbsentials.constants.annotations;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.FIELD)
+public @interface BBSelectableRole {
+
+}
diff --git a/src/main/java/de/hype/bbsentials/constants/enviromentShared/AuthenticationConstants.java b/src/main/java/de/hype/bbsentials/constants/enviromentShared/AuthenticationConstants.java
new file mode 100644
index 0000000..878f303
--- /dev/null
+++ b/src/main/java/de/hype/bbsentials/constants/enviromentShared/AuthenticationConstants.java
@@ -0,0 +1,7 @@
+package de.hype.bbsentials.constants.enviromentShared;
+
+public class AuthenticationConstants {
+ //Authentication Types
+ public static final String MOJANG = "MOJANG";
+ public static final String DATABASE = "DATABASE";
+}
diff --git a/src/main/java/de/hype/bbsentials/constants/enviromentShared/ChChestItem.java b/src/main/java/de/hype/bbsentials/constants/enviromentShared/ChChestItem.java
new file mode 100644
index 0000000..3e6a346
--- /dev/null
+++ b/src/main/java/de/hype/bbsentials/constants/enviromentShared/ChChestItem.java
@@ -0,0 +1,46 @@
+package de.hype.bbsentials.constants.enviromentShared;
+
+public class ChChestItem {
+ private String displayName;
+ private boolean custom;
+
+ public ChChestItem(String displayName) {
+ this.displayName = displayName;
+ this.custom = false;
+ }
+
+ public ChChestItem(String displayName, boolean custom) {
+ this.displayName = displayName;
+ this.custom = custom;
+ }
+
+ public String getDisplayName() {
+ return displayName;
+ }
+
+ public ChChestItem setDisplayName(String displayName) {
+ this.displayName = displayName;
+ return this;
+ }
+
+ public boolean isCustom() {
+ return custom;
+ }
+
+ @Override
+ public String toString() {
+ return displayName;
+ }
+
+ public boolean isGemstone() {
+ return displayName.startsWith("Flawless") && displayName.endsWith("Gemstone");
+ }
+
+ public boolean isRoboPart() {
+ String[] roboParts = {"Control Switch", "Electron Transmitter", "FTX 3070", "Robotron Reflector", "Superlite Motor", "Synthetic Heart"};
+ for (String roboPart : roboParts) {
+ if (displayName.equals(roboPart)) return true;
+ }
+ return false;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/de/hype/bbsentials/constants/enviromentShared/ChChestItems.java b/src/main/java/de/hype/bbsentials/constants/enviromentShared/ChChestItems.java
new file mode 100644
index 0000000..a416f6e
--- /dev/null
+++ b/src/main/java/de/hype/bbsentials/constants/enviromentShared/ChChestItems.java
@@ -0,0 +1,87 @@
+package de.hype.bbsentials.constants.enviromentShared;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class ChChestItems {
+ private static final List<ChChestItem> items = new ArrayList<>();
+
+ public static final ChChestItem PrehistoricEgg = new ChChestItem("Prehistoric Egg");
+ public static final ChChestItem Pickonimbus2000 = new ChChestItem("Pickonimbus 2000");
+ public static final ChChestItem ControlSwitch = new ChChestItem("Control Switch");
+ public static final ChChestItem ElectronTransmitter = new ChChestItem("Electron Transmitter");
+ public static final ChChestItem FTX3070 = new ChChestItem("FTX 3070");
+ public static final ChChestItem RobotronReflector = new ChChestItem("Robotron Reflector");
+ public static final ChChestItem SuperliteMotor = new ChChestItem("Superlite Motor");
+ public static final ChChestItem SyntheticHeart = new ChChestItem("Synthetic Heart");
+ public static final ChChestItem FlawlessGemstone = new ChChestItem("Flawless Gemstone");
+ public static final ChChestItem JungleHeart = new ChChestItem("Jungle Heart");
+
+ // Automatically populate predefined items using reflection
+ static {
+ Field[] fields = ChChestItems.class.getDeclaredFields();
+ for (Field field : fields) {
+ if (field.getType().equals(ChChestItem.class) && isPublicStaticFinal(field)) {
+ try {
+ items.add((ChChestItem) field.get(null));
+ } catch (IllegalAccessException e) {
+ // Handle exception
+ }
+ }
+ }
+ }
+
+ public static ChChestItem getItem(String displayName) {
+ ChChestItem existingItem = getPredefinedItem(displayName);
+
+ if (existingItem != null) {
+ return existingItem;
+ }
+
+ ChChestItem customItem = new ChChestItem(displayName, true);
+ return customItem;
+ }
+
+ private static ChChestItem getPredefinedItem(String displayName) {
+ for (ChChestItem item : items) {
+ if (item.getDisplayName().equals(displayName)) {
+ return item;
+ }
+ }
+ return null;
+ }
+
+ public static ChChestItem[] getItem(String[] displayNames) {
+ ChChestItem[] result = new ChChestItem[displayNames.length];
+ for (int i = 0; i < displayNames.length; i++) {
+ result[i] = getItem(displayNames[i]);
+ }
+ return result;
+ }
+
+ // Utility method to check if a field is public, static, and final
+ private static boolean isPublicStaticFinal(Field field) {
+ return java.lang.reflect.Modifier.isPublic(field.getModifiers()) &&
+ java.lang.reflect.Modifier.isStatic(field.getModifiers()) &&
+ java.lang.reflect.Modifier.isFinal(field.getModifiers());
+ }
+
+ public static ChChestItem createCustomItem(String displayName) {
+ ChChestItem customItem = new ChChestItem(displayName, true);
+ items.add(customItem);
+ return customItem;
+ }
+
+ public static List<ChChestItem> getAllItems() {
+ return items;
+ }
+
+ public static List<String> getAllItemNames() {
+ return items.stream()
+ .map(ChChestItem::getDisplayName)
+ .collect(Collectors.toList());
+ //very fancy way to convert a list to a list of values from the previous list
+ }
+} \ No newline at end of file
diff --git a/src/main/java/de/hype/bbsentials/constants/enviromentShared/EnumUtils.java b/src/main/java/de/hype/bbsentials/constants/enviromentShared/EnumUtils.java
new file mode 100644
index 0000000..8407774
--- /dev/null
+++ b/src/main/java/de/hype/bbsentials/constants/enviromentShared/EnumUtils.java
@@ -0,0 +1,209 @@
+package de.hype.bbsentials.constants.enviromentShared;
+
+
+import de.hype.bbsentials.constants.BBDisplayNameProvider;
+import de.hype.bbsentials.constants.BBDisplayNameProviderWithCustom;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+public class EnumUtils {
+ public static List<String> getAllDisplayNames(Class<? extends BBDisplayNameProvider> enumClass) {
+ List<String> displayNames = new ArrayList<>();
+
+ for (BBDisplayNameProvider item : enumClass.getEnumConstants()) {
+ displayNames.add(item.getDisplayName());
+ }
+
+ return displayNames;
+ }
+
+ public static <T extends Enum<T> & BBDisplayNameProvider> List<T> getEnumsAsList(Class<T> enumClass) {
+ List<T> enumList = new ArrayList<>();
+
+ for (T item : enumClass.getEnumConstants()) {
+ enumList.add(item);
+ }
+
+ return enumList;
+ }
+
+ public static List<String> getDisplayNames(Collection<? extends BBDisplayNameProvider> itemList) {
+ List<String> displayNames = new ArrayList<>();
+ for (BBDisplayNameProvider item : itemList) {
+ displayNames.add(item.getDisplayName());
+ }
+ return displayNames;
+ }
+
+ public static <T extends BBDisplayNameProvider> List<T> getEnumsAsList(List<T> itemList) {
+ List<T> enumList = new ArrayList<>(itemList);
+ return enumList;
+ }
+
+ public static List<String> getAllEnumNames(Class<? extends Enum<?>> enumClass) {
+ List<String> enumNames = new ArrayList<>();
+ Enum<?>[] enumConstants = enumClass.getEnumConstants();
+
+ for (Enum<?> enumConstant : enumConstants) {
+ enumNames.add(enumConstant.name());
+ }
+
+ return enumNames;
+ }
+
+// public interface BBDisplayNameProvider {
+// String getDisplayName();
+// default public String serialize() {
+// return name() + ":" + displayName;
+// }
+//
+// default public ChChestItems deserialize(String serializedValue) {
+// String[] parts = serializedValue.split(":");
+// if (parts.length != 2) {
+// throw new IllegalArgumentException("Invalid serialized value format");
+// }
+// String enumName = parts[0];
+// String displayName = parts[1];
+//
+// return ChChestItems.valueOf(enumName).setDisplayName(displayName);
+// }
+// }
+
+
+
+ // Methods for BBDisplayNameProviderWithCustom
+
+ public static <T extends Enum<T> & BBDisplayNameProviderWithCustom> T getEnumByNameWithCustom(Class<T> enumClass, String enumName) {
+ boolean found = false;
+ for (T enumValue : enumClass.getEnumConstants()) {
+ if (enumValue.name().equals(enumName)) {
+ return (enumValue);
+ }
+ }
+ return createCustomEnum(enumClass, enumName);
+ }
+
+ public static <T extends Enum<T> & BBDisplayNameProviderWithCustom> T getEnumByValueWithCustom(Class<T> enumClass, String value) {
+ for (T enumValue : enumClass.getEnumConstants()) {
+ if (enumValue.getDisplayName().equals(value)) {
+ return enumValue;
+ }
+ }
+ return (createCustomEnum(enumClass, value));
+
+ }
+
+ public static <T extends Enum<T> & BBDisplayNameProviderWithCustom> T[] getEnumsByNameWithCustom(Class<T> enumClass, String[] names) {
+ List<T> matchingEnums = new ArrayList<>();
+
+ for (String name : names) {
+ boolean found = false;
+ for (T enumValue : enumClass.getEnumConstants()) {
+ if (enumValue.name().equals(name)) {
+ matchingEnums.add(enumValue);
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ matchingEnums.add(createCustomEnum(enumClass, name));
+ }
+ }
+
+ return matchingEnums.toArray((T[]) java.lang.reflect.Array.newInstance(enumClass, 0));
+ }
+
+ public static <T extends Enum<T> & BBDisplayNameProviderWithCustom> T[] getEnumsByValueWithCustom(Class<T> enumClass, String[] values) {
+ List<T> matchingEnums = new ArrayList<>();
+
+ for (String value : values) {
+ boolean found = false;
+ for (T enumValue : enumClass.getEnumConstants()) {
+ if (enumValue.toString().equals(value)) {
+ matchingEnums.add(enumValue);
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ matchingEnums.add(createCustomEnum(enumClass, value));
+ }
+ }
+
+ return matchingEnums.toArray((T[]) java.lang.reflect.Array.newInstance(enumClass, 0));
+ }
+
+ // Methods for BBDisplayNameProvider
+
+ public static <T extends Enum<T> & BBDisplayNameProvider> T getEnumByName(Class<T> enumClass, String enumName) {
+ try {
+ return Enum.valueOf(enumClass, enumName);
+ } catch (IllegalArgumentException e) {
+ return null; // Enum value not found
+ }
+ }
+
+ public static <T extends Enum<T> & BBDisplayNameProvider> T getEnumByValue(Class<T> enumClass, String value) {
+ for (T enumValue : enumClass.getEnumConstants()) {
+ if (enumValue.getDisplayName().equals(value)) {
+ return enumValue;
+ }
+ }
+ return null;
+ }
+
+ public static <T extends Enum<T> & BBDisplayNameProvider> T[] getEnumsByName(Class<T> enumClass, String[] names) {
+ List<T> matchingEnums = new ArrayList<>();
+
+ for (String name : names) {
+ boolean found = false;
+ for (T enumValue : enumClass.getEnumConstants()) {
+ if (enumValue.name().equals(name)) {
+ matchingEnums.add(enumValue);
+ found = true;
+ break;
+ }
+ }
+ }
+
+ return matchingEnums.toArray((T[]) java.lang.reflect.Array.newInstance(enumClass, 0));
+ }
+
+ public static <T extends Enum<T> & BBDisplayNameProvider> T[] getEnumsByValue(Class<T> enumClass, String[] values) {
+ List<T> matchingEnums = new ArrayList<>();
+
+ for (String value : values) {
+ boolean found = false;
+ for (T enumValue : enumClass.getEnumConstants()) {
+ if (enumValue.getDisplayName().equals(value)) {
+ matchingEnums.add(enumValue);
+ found = true;
+ break;
+ }
+ }
+ }
+
+ return matchingEnums.toArray((T[]) java.lang.reflect.Array.newInstance(enumClass, 0));
+ }
+
+ private static <T extends Enum<T> & BBDisplayNameProviderWithCustom> T createCustomEnum(Class<T> enumClass, String value) {
+ T customEnum = null;
+ try {
+ customEnum = Enum.valueOf(enumClass, "Custom");
+ } catch (Exception ignored) {
+ try {
+ customEnum = Enum.valueOf(enumClass, "CUSTOM");
+ } catch (Exception ignored2) {
+ }
+ }
+ if (customEnum == null) {
+ }
+ customEnum.setDisplayName(value);
+ return customEnum;
+
+ }
+}
+
+
diff --git a/src/main/java/de/hype/bbsentials/constants/enviromentShared/InternalReasonConstants.java b/src/main/java/de/hype/bbsentials/constants/enviromentShared/InternalReasonConstants.java
new file mode 100644
index 0000000..79bf13a
--- /dev/null
+++ b/src/main/java/de/hype/bbsentials/constants/enviromentShared/InternalReasonConstants.java
@@ -0,0 +1,14 @@
+package de.hype.bbsentials.constants.enviromentShared;
+
+public enum InternalReasonConstants {
+ INVALID_PARAMETER,
+ MISSING_PARAMETER,
+ INSUFFICIENT_PRIVILEGES,
+ MUTED,
+ BANNED,
+ API_UNSUPPORTED,
+ INVALID_LOGIN,
+ KICKED,
+ ANOTHER_LOGIN,
+ SERVER_RESTART
+}
diff --git a/src/main/java/de/hype/bbsentials/constants/enviromentShared/Islands.java b/src/main/java/de/hype/bbsentials/constants/enviromentShared/Islands.java
new file mode 100644
index 0000000..f03c8ae
--- /dev/null
+++ b/src/main/java/de/hype/bbsentials/constants/enviromentShared/Islands.java
@@ -0,0 +1,39 @@
+package de.hype.bbsentials.constants.enviromentShared;
+
+import de.hype.bbsentials.constants.BBDisplayNameProvider;
+
+public enum Islands implements BBDisplayNameProvider {
+ CRYSTAL_HOLLOWS("crystal_hollows", "Crystal Hollows"),
+ CRIMSON_ISLE("crimson_isle", "Crimson Isle"),
+ DEEP_CAVERNS("mining_2", "Deep Caverns"),
+ DUNGEON("dungeon", "Dungeon"),
+ DUNGEON_HUB("dungeon_hub", "Dungeon Hub"),
+ DWARVEN_MINES("mining_3", "Dwarven Mines"),
+ GOLD_MINE("mining_1", "Gold Mine"),
+ HUB("hub", "Hub"),
+ KUUDRA("kuudra", "Kuudra"),
+ PRIVATE_ISLAND("dynamic", "Private Islands"),
+ SPIDERS_DEN("combat_1", "Spider's Den"),
+ THE_END("combat_3", "The End"),
+ THE_FARMING_ISLANDS("farming_1", "The Farming Islands"),
+ THE_RIFT("rift", "The Rift");
+
+
+ private final String internalName;
+ private final String displayName;
+
+ Islands(String internalName, String displayName) {
+ this.internalName = internalName;
+ this.displayName = displayName;
+ }
+
+ public String getInternalName() {
+ return internalName;
+ }
+
+ public String getDisplayName() {
+ return displayName;
+ }
+
+
+}
diff --git a/src/main/java/de/hype/bbsentials/constants/enviromentShared/MiningEvents.java b/src/main/java/de/hype/bbsentials/constants/enviromentShared/MiningEvents.java
new file mode 100644
index 0000000..1dc72d1
--- /dev/null
+++ b/src/main/java/de/hype/bbsentials/constants/enviromentShared/MiningEvents.java
@@ -0,0 +1,40 @@
+package de.hype.bbsentials.constants.enviromentShared;
+
+
+import de.hype.bbsentials.constants.BBDisplayNameProvider;
+
+// Mining Events
+public enum MiningEvents implements BBDisplayNameProvider {
+ BETTER_TOGETHER("Better Together"),
+ DOUBLE_POWDER("Double Powder"),
+ GONE_WITH_THE_WIND("Gone with the Wind"),
+ GOBLIN_RAID("Goblin Raid"),
+ MITHRIL_GOURMAND("Mithril Gourmand"),
+ RAFFLE("Raffle");
+
+ private final String displayName;
+
+ MiningEvents(String displayName) {
+ this.displayName = displayName;
+ }
+
+ @Override
+ public String getDisplayName() {
+ return displayName;
+ }
+
+ //Some Events cant happen in Crystal Holows
+ public boolean isDWEventOnly() {
+ if (this.equals(MiningEvents.MITHRIL_GOURMAND) || this.equals(MiningEvents.RAFFLE) || this.equals(MiningEvents.GOBLIN_RAID)) {
+ return true;
+ }
+ return false;
+ }
+
+ public static boolean isDWEventOnly(String event) {
+ if (event.equals(MiningEvents.MITHRIL_GOURMAND.getDisplayName()) || event.equals(MiningEvents.RAFFLE.getDisplayName()) || event.equals(MiningEvents.GOBLIN_RAID.getDisplayName())) {
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/src/main/java/de/hype/bbsentials/packets/AbstractPacket.java b/src/main/java/de/hype/bbsentials/packets/AbstractPacket.java
new file mode 100644
index 0000000..116c9b2
--- /dev/null
+++ b/src/main/java/de/hype/bbsentials/packets/AbstractPacket.java
@@ -0,0 +1,67 @@
+package de.hype.bbsentials.packets;
+
+import de.hype.bbsentials.chat.Chat;
+import de.hype.bbsentials.client.BBsentials;
+import de.hype.bbsentials.client.Config;
+import de.hype.bbsentials.communication.BBsentialConnection;
+import de.hype.bbsentials.packets.packets.InvalidCommandFeedbackPacket;
+
+import java.lang.reflect.Field;
+
+public class AbstractPacket {
+ public final int apiVersionMin;
+ public final int apiVersionMax;
+
+ protected AbstractPacket(int apiVersionMin, int apiVersionMax) {
+ this.apiVersionMax = apiVersionMax;
+ this.apiVersionMin = apiVersionMin;
+
+ }
+
+ public boolean isValid(BBsentialConnection connection, String[] allowedNullFields) {
+ if (isApiSupported(BBsentials.config)) {
+ Chat.sendPrivateMessageToSelf("You are using an outdated version of the mod");
+ }
+ return true;
+ }
+
+ public boolean isApiSupported(Config config) {
+ //int version = Core.getConfig().getVersion();
+ int version = config.getApiVersion();
+ if (version >= apiVersionMin && version <= apiVersionMax) {
+ return true;
+ }
+ return false;
+ }
+
+ public String hasNullFields(String[] allowedNullFields) {
+ Field[] fields = this.getClass().getDeclaredFields();
+ if (!this.getClass().getSimpleName().equals(InvalidCommandFeedbackPacket.class.getSimpleName())) {
+ for (Field field : fields) {
+ field.setAccessible(true);
+ try {
+ if (field.get(this) == null) {
+ if (allowedNullFields == null) return field.getName();
+ if (isAllowedNull(allowedNullFields, field.getName())) {
+ return field.getName();
+ }
+ }
+ } catch (IllegalAccessException e) {
+ // Handle the exception if needed
+ e.printStackTrace();
+ }
+ }
+ }
+ return null;
+
+ }
+
+ public boolean isAllowedNull(String[] allowedFields, String fieldName) {
+ for (String allowedField : allowedFields) {
+ if (allowedField.equals(fieldName)) {
+ return true;
+ }
+ }
+ return false;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/de/hype/bbsentials/packets/EnviromentPacketConfig.java b/src/main/java/de/hype/bbsentials/packets/EnviromentPacketConfig.java
new file mode 100644
index 0000000..da05704
--- /dev/null
+++ b/src/main/java/de/hype/bbsentials/packets/EnviromentPacketConfig.java
@@ -0,0 +1,7 @@
+package de.hype.bbsentials.packets;
+
+public class EnviromentPacketConfig {
+ public static final String enviroment = "Client";
+ public static final String notEnviroment = "Server";
+ public static final int apiVersion = 1;
+}
diff --git a/src/main/java/de/hype/bbsentials/packets/Packet.java b/src/main/java/de/hype/bbsentials/packets/Packet.java
new file mode 100644
index 0000000..6a4ecbf
--- /dev/null
+++ b/src/main/java/de/hype/bbsentials/packets/Packet.java
@@ -0,0 +1,26 @@
+package de.hype.bbsentials.packets;
+
+import java.util.function.Consumer;
+
+public class Packet<T extends AbstractPacket> {
+
+ private final Class<T> clazz;
+ private final Consumer<T> consumer;
+
+ public Packet(Class<T> clazz, Consumer<T> consumer) {
+ this.clazz = clazz;
+ this.consumer = consumer;
+ }
+
+ public String getName() {
+ return clazz.getSimpleName();
+ }
+
+ public Class<T> getClazz() {
+ return clazz;
+ }
+
+ public Consumer<T> getConsumer() {
+ return consumer;
+ }
+}
diff --git a/src/main/java/de/hype/bbsentials/packets/PacketManager.java b/src/main/java/de/hype/bbsentials/packets/PacketManager.java
new file mode 100644
index 0000000..a6d94d4
--- /dev/null
+++ b/src/main/java/de/hype/bbsentials/packets/PacketManager.java
@@ -0,0 +1,48 @@
+package de.hype.bbsentials.packets;
+
+import de.hype.bbsentials.communication.BBsentialConnection;
+import de.hype.bbsentials.packets.packets.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class PacketManager {
+ private static List<Packet<? extends AbstractPacket>> packets = new ArrayList<>();
+
+ public List<Packet<? extends AbstractPacket>> getPackets() {
+ return packets;
+ }
+
+ // Define a map to store packet classes and their associated actions
+ BBsentialConnection connection;
+
+ // Method to initialize packet actions
+ public PacketManager(BBsentialConnection connection) {
+ this.connection = connection;
+ initializePacketActions(connection);
+ }
+
+ public static void initializePacketActions(BBsentialConnection connection) {
+ packets.add(new Packet<>(SplashNotifyPacket.class, connection::onSplashNotify));
+ packets.add(new Packet<>(BingoChatMessagePacket.class, connection::onBingoChatMessagePacket));
+ packets.add(new Packet<>(ChChestPackage.class, connection::onChChestPackage));
+// packets.add(new Packet<>(DisconnectPacket.class, connection::dummy));
+// packets.add(new Packet<>(InternalCommandPacket.class, connection::dummy));
+ packets.add(new Packet<>(MiningEventPacket.class, connection::onMiningEventPacket));
+// packets.add(new Packet<>(RequestConnectPacket.class, connection::dummy));
+ packets.add(new Packet<>(WelcomeClientPacket.class, connection::onWelcomePacket));
+ }
+
+ // Method to handle a received packet
+
+
+ // method to get a list of all packets
+ public static List<Class<? extends AbstractPacket>> getAllPacketClasses() {
+ initializePacketActions(null);
+ List<Class<? extends AbstractPacket>> allPackets = new ArrayList<>();
+ for (int i = 0; i < allPackets.size(); i++) {
+ allPackets.add(packets.get(i).getClazz());
+ }
+ return allPackets;
+ }
+}
diff --git a/src/main/java/de/hype/bbsentials/packets/PacketUtils.java b/src/main/java/de/hype/bbsentials/packets/PacketUtils.java
new file mode 100644
index 0000000..2c6d8a5
--- /dev/null
+++ b/src/main/java/de/hype/bbsentials/packets/PacketUtils.java
@@ -0,0 +1,122 @@
+package de.hype.bbsentials.packets;
+
+import com.google.gson.Gson;
+import de.hype.bbsentials.client.CustomGson;
+import de.hype.bbsentials.communication.BBsentialConnection;
+
+import java.util.function.Consumer;
+
+
+public class PacketUtils {
+ public static final Gson gson = CustomGson.create();
+
+ public static String parsePacketToJson(AbstractPacket packet) {
+ return gson.toJson(packet);
+ }
+
+ public static <T extends AbstractPacket> void tryToProcessPacket(Packet<T> packet, String rawJson) {
+ Class<T> clazz = packet.getClazz();
+ Consumer<T> consumer = packet.getConsumer();
+ T abstractPacket = gson.fromJson(rawJson, clazz);
+ consumer.accept(abstractPacket);
+ }
+
+ private static void showError(Throwable t, String errorMessage) {
+ System.out.println(errorMessage + " because of: " + t.getClass().getSimpleName() + ": " + t.getMessage());
+ new Error(errorMessage, t).printStackTrace();
+ }
+
+ public static class APIException extends Error {
+
+ public APIException(String errorMessage, Throwable t) {
+ super(errorMessage, t);
+ }
+
+ public APIException(String errorMessage) {
+ super(errorMessage);
+ }
+ }
+
+ public static <T extends AbstractPacket> T getAsPacket(String message, Class<T> clazz) {
+ if (!message.contains(".")) return null;
+ String packetName = message.split("\\.")[0];
+ String rawJson = message.substring(packetName.length() + 1);
+ if (!packetName.equals(clazz.getSimpleName())) {
+ try {
+ T parsedPacket = gson.fromJson(rawJson, clazz);
+ return parsedPacket;
+ } catch (Throwable t) {
+ showError(t, "Could not process packet '" + packetName + "' from " + EnviromentPacketConfig.notEnviroment);
+ }
+ }
+ String errorMessage = "Could not process packet '" + packetName + "' from " + EnviromentPacketConfig.notEnviroment;
+
+ showError(new APIException("Found unknown packet: " + packetName + "'"), errorMessage);
+ return null;
+ }
+
+// public static <T extends AbstractPacket> T getAsPacket(String message) {
+// if (!message.contains(".")) return null;
+// String packetName = message.split("\\.")[0];
+// String rawJson = message.substring(packetName.length() + 1);
+//
+// for (Class<? extends AbstractPacket> clazz : PacketManager.getAllPacketClasses()) {
+// if (packetName.equals(clazz.getSimpleName())) {
+// try {
+// if (clazz.isAssignableFrom(clazz)) {
+// //TODO the problem
+// T parsedPacket = (T) gson.fromJson(rawJson, clazz);
+// return parsedPacket;
+// }
+// else {
+// return null;
+// }
+// } catch (Throwable t) {
+// showError(t, "Could not process packet '" + packetName + "' from " + EnviromentPacketConfig.notEnviroment);
+// }
+// }
+// }
+// return null;
+// }
+
+ public static boolean isPacket(String message, Class<? extends AbstractPacket> clazz) {
+ if (!message.contains(".")) return false;
+ String packetName = message.split("\\.")[0];
+ if (packetName.equals(clazz.getSimpleName())) {
+ return true;
+ }
+ return false;
+ }
+
+ public static boolean isPacket(String message) {
+ if (!message.contains(".")) return false;
+ String packetName = message.split("\\.")[0];
+ for (Class<? extends AbstractPacket> packetClass : PacketManager.getAllPacketClasses()) {
+ if (!packetName.equals(packetClass.getSimpleName())) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public static <T extends AbstractPacket> boolean handleIfPacket(BBsentialConnection connection, String message) {
+ //Return = is Packet
+ if (!message.contains(".")) return false;
+ String packetName = message.split("\\.")[0];
+ String rawJson = message.substring(packetName.length() + 1);
+ PacketManager manager = new PacketManager(connection);
+ for (Packet<? extends AbstractPacket> packet : manager.getPackets()) {
+ if (!packetName.equals(packet.getClazz().getSimpleName())) continue;
+ try {
+ tryToProcessPacket(packet, rawJson);
+ return true;
+ } catch (Throwable t) {
+ showError(t, "Could not process packet '" + packetName + "' from " + EnviromentPacketConfig.notEnviroment);
+ }
+ }
+ String errorMessage = "Could not process packet '" + packetName + "' from " + EnviromentPacketConfig.notEnviroment;
+
+ showError(new APIException("Found unknown packet: " + packetName + "'"), errorMessage);
+ return false;
+ }
+}
diff --git a/src/main/java/de/hype/bbsentials/packets/packets/BingoChatMessagePacket.java b/src/main/java/de/hype/bbsentials/packets/packets/BingoChatMessagePacket.java
new file mode 100644
index 0000000..56a7152
--- /dev/null
+++ b/src/main/java/de/hype/bbsentials/packets/packets/BingoChatMessagePacket.java
@@ -0,0 +1,26 @@
+package de.hype.bbsentials.packets.packets;
+
+
+import de.hype.bbsentials.packets.AbstractPacket;
+
+public class BingoChatMessagePacket extends AbstractPacket {
+
+ public BingoChatMessagePacket(String prefix, String username, String message, int bingo_cards) {
+ super(1, 1); //Min and Max supported Version
+ this.message = message;
+ this.username = username;
+ this.prefix = prefix;
+ this.bingo_cards = bingo_cards;
+ }
+
+ public final String message;
+ public final String username;
+ public final String prefix;
+ public final int bingo_cards;
+
+ public boolean baseCheck() {
+ boolean cancelPacket = false;
+
+ return !cancelPacket;
+ }
+}
diff --git a/src/main/java/de/hype/bbsentials/packets/packets/BroadcastMessagePacket.java b/src/main/java/de/hype/bbsentials/packets/packets/BroadcastMessagePacket.java
new file mode 100644
index 0000000..2e507c7
--- /dev/null
+++ b/src/main/java/de/hype/bbsentials/packets/packets/BroadcastMessagePacket.java
@@ -0,0 +1,17 @@
+package de.hype.bbsentials.packets.packets;
+
+import de.hype.bbsentials.packets.AbstractPacket;
+
+public class BroadcastMessagePacket extends AbstractPacket {
+
+ public final String message;
+ public final String username;
+ public final String prefix;
+
+ public BroadcastMessagePacket(String prefix, String username, String message) {
+ super(1, 1); //Min and Max supported Version
+ this.message = message;
+ this.username = username;
+ this.prefix = prefix;
+ }
+}
diff --git a/src/main/java/de/hype/bbsentials/packets/packets/ChChestPackage.java b/src/main/java/de/hype/bbsentials/packets/packets/ChChestPackage.java
new file mode 100644
index 0000000..e2252e8
--- /dev/null
+++ b/src/main/java/de/hype/bbsentials/packets/packets/ChChestPackage.java
@@ -0,0 +1,24 @@
+package de.hype.bbsentials.packets.packets;
+
+
+import de.hype.bbsentials.constants.enviromentShared.ChChestItem;
+import de.hype.bbsentials.packets.AbstractPacket;
+
+public class ChChestPackage extends AbstractPacket {
+
+ public ChChestPackage(String announcerUsername, ChChestItem[] items, String locationCoords, String bbcommand, String extraMessage) {
+ super(1, 1); //Min and Max supported Version
+ this.announcerUsername = announcerUsername;
+ this.locationCoords = locationCoords;
+ this.bbcommand = bbcommand;
+ this.extraMessage = extraMessage;
+ this.items = items;
+ }
+
+ public final String announcerUsername;
+ public final String locationCoords;
+ public final String bbcommand;
+ public final String extraMessage;
+ public final ChChestItem[] items;
+
+}
diff --git a/src/main/java/de/hype/bbsentials/packets/packets/DisconnectPacket.java b/src/main/java/de/hype/bbsentials/packets/packets/DisconnectPacket.java
new file mode 100644
index 0000000..4a37693
--- /dev/null
+++ b/src/main/java/de/hype/bbsentials/packets/packets/DisconnectPacket.java
@@ -0,0 +1,20 @@
+package de.hype.bbsentials.packets.packets;
+
+
+import de.hype.bbsentials.packets.AbstractPacket;
+
+public class DisconnectPacket extends AbstractPacket {
+
+ public DisconnectPacket(String internalReason, int[] waitBeforeReconnect, String displayReason, String displayMessage) {
+ super(1, 1); //Min and Max supportet Version
+ this.internalReason = internalReason;
+ this.waitBeforeReconnect = waitBeforeReconnect;
+ this.displayReason = displayReason;
+ this.displayMessage = displayMessage;
+ }
+ public final String internalReason;
+ public final int[] waitBeforeReconnect;
+ public final String displayReason;
+ public final String displayMessage;
+
+}
diff --git a/src/main/java/de/hype/bbsentials/packets/packets/DisplayMessagePacket.java b/src/main/java/de/hype/bbsentials/packets/packets/DisplayMessagePacket.java
new file mode 100644
index 0000000..da99a99
--- /dev/null
+++ b/src/main/java/de/hype/bbsentials/packets/packets/DisplayMessagePacket.java
@@ -0,0 +1,14 @@
+package de.hype.bbsentials.packets.packets;
+
+
+import de.hype.bbsentials.packets.AbstractPacket;
+
+public class DisplayMessagePacket extends AbstractPacket {
+
+ public final String message;
+
+ public DisplayMessagePacket(String message) {
+ super(1, 1); //Min and Max supported Version
+ this.message = message;
+ }
+}
diff --git a/src/main/java/de/hype/bbsentials/packets/packets/DisplayTellrawMessagePacket.java b/src/main/java/de/hype/bbsentials/packets/packets/DisplayTellrawMessagePacket.java
new file mode 100644
index 0000000..9329878
--- /dev/null
+++ b/src/main/java/de/hype/bbsentials/packets/packets/DisplayTellrawMessagePacket.java
@@ -0,0 +1,13 @@
+package de.hype.bbsentials.packets.packets;
+
+
+import de.hype.bbsentials.packets.AbstractPacket;
+
+public class DisplayTellrawMessagePacket extends AbstractPacket {
+ public final String rawJson;
+
+ public DisplayTellrawMessagePacket(String rawJson) {
+ super(1, 1); //Min and Max supported Version
+ this.rawJson = rawJson;
+ }
+}
diff --git a/src/main/java/de/hype/bbsentials/packets/packets/InternalCommandPacket.java b/src/main/java/de/hype/bbsentials/packets/packets/InternalCommandPacket.java
new file mode 100644
index 0000000..cf8c8f7
--- /dev/null
+++ b/src/main/java/de/hype/bbsentials/packets/packets/InternalCommandPacket.java
@@ -0,0 +1,18 @@
+package de.hype.bbsentials.packets.packets;
+
+
+import de.hype.bbsentials.packets.AbstractPacket;
+
+//Only used for small things which don't really need an own Packet.
+public class InternalCommandPacket extends AbstractPacket {
+
+ public InternalCommandPacket(String command, String[] parameters) {
+ super(1, 1); //Min and Max supported Version
+ this.command = command;
+ this.parameters = parameters;
+ }
+
+ public final String command;
+ public final String[] parameters;
+
+}
diff --git a/src/main/java/de/hype/bbsentials/packets/packets/InvalidCommandFeedbackPacket.java b/src/main/java/de/hype/bbsentials/packets/packets/InvalidCommandFeedbackPacket.java
new file mode 100644
index 0000000..b57be4a
--- /dev/null
+++ b/src/main/java/de/hype/bbsentials/packets/packets/InvalidCommandFeedbackPacket.java
@@ -0,0 +1,25 @@
+package de.hype.bbsentials.packets.packets;
+
+
+import de.hype.bbsentials.packets.AbstractPacket;
+
+public class InvalidCommandFeedbackPacket extends AbstractPacket {
+
+ public InvalidCommandFeedbackPacket(String internalReason, String command, String displayMessage, String argument, String permissionNeeded, String[] userPermissions) {
+ super(1, 1); //Min and Max supportet Version
+ this.internalReason = internalReason;
+ this.argument = argument;
+ this.permissionNeeded = permissionNeeded;
+ this.userPermissions = userPermissions;
+ this.command = command;
+ this.displayMessage = displayMessage;
+ }
+
+ public final String internalReason;
+ public final String argument;
+ public final String permissionNeeded;
+ public final String[] userPermissions;
+ public final String command;
+ public final String displayMessage;
+
+}
diff --git a/src/main/java/de/hype/bbsentials/packets/packets/MiningEventPacket.java b/src/main/java/de/hype/bbsentials/packets/packets/MiningEventPacket.java
new file mode 100644
index 0000000..5dd383f
--- /dev/null
+++ b/src/main/java/de/hype/bbsentials/packets/packets/MiningEventPacket.java
@@ -0,0 +1,26 @@
+package de.hype.bbsentials.packets.packets;
+
+
+import de.hype.bbsentials.constants.enviromentShared.Islands;
+import de.hype.bbsentials.constants.enviromentShared.MiningEvents;
+import de.hype.bbsentials.packets.AbstractPacket;
+
+public class MiningEventPacket extends AbstractPacket {
+
+
+ public final MiningEvents event;
+ public final String username;
+ public final Islands island;
+
+ public MiningEventPacket(MiningEvents event, String username, Islands island) throws Exception {
+ super(1, 1); //Min and Max supported Version
+ this.event = event;
+ this.username = username;
+ if (island.equals(Islands.CRYSTAL_HOLLOWS)) {
+ if (event.equals(MiningEvents.MITHRIL_GOURMAND) || event.equals(MiningEvents.RAFFLE) || event.equals(MiningEvents.GOBLIN_RAID)) {
+ throw new Exception("The specified event can not happen on this Server");
+ }
+ }
+ this.island = island;
+ }
+}
diff --git a/src/main/java/de/hype/bbsentials/packets/packets/RequestConnectPacket.java b/src/main/java/de/hype/bbsentials/packets/packets/RequestConnectPacket.java
new file mode 100644
index 0000000..62bac83
--- /dev/null
+++ b/src/main/java/de/hype/bbsentials/packets/packets/RequestConnectPacket.java
@@ -0,0 +1,21 @@
+package de.hype.bbsentials.packets.packets;
+
+
+import de.hype.bbsentials.packets.AbstractPacket;
+
+public class RequestConnectPacket extends AbstractPacket {
+
+
+ public RequestConnectPacket(String mcuuid, String key, int clientApiVersion, String authType ) {
+ super(1, 1); //Min and Max supported Version
+ this.mcuuid = mcuuid;
+ this.key = key;
+ this.authType = authType;
+ this.clientApiVersion = clientApiVersion;
+ }
+
+ public final String mcuuid;
+ public final String key;
+ public final String authType;
+ public final int clientApiVersion;
+}
diff --git a/src/main/java/de/hype/bbsentials/packets/packets/SplashNotifyPacket.java b/src/main/java/de/hype/bbsentials/packets/packets/SplashNotifyPacket.java
new file mode 100644
index 0000000..bfdc275
--- /dev/null
+++ b/src/main/java/de/hype/bbsentials/packets/packets/SplashNotifyPacket.java
@@ -0,0 +1,26 @@
+package de.hype.bbsentials.packets.packets;
+
+
+import de.hype.bbsentials.constants.enviromentShared.Islands;
+import de.hype.bbsentials.packets.AbstractPacket;
+
+public class SplashNotifyPacket extends AbstractPacket {
+
+
+ public SplashNotifyPacket(int hub, String splasherUsername, String location, Islands hubType, String extraMessage, boolean lessWaste) {
+ super(1, 1); //Min and Max supported Version
+ this.hub = hub;
+ this.lessWaste = lessWaste;
+ this.splasherUsername = splasherUsername;
+ this.location = location;
+ this.hubType = hubType;
+ this.extraMessage = extraMessage;
+ }
+
+ public final int hub;
+ public final boolean lessWaste;
+ public final String splasherUsername;
+ public final String location;
+ public final Islands hubType;
+ public final String extraMessage;
+}
diff --git a/src/main/java/de/hype/bbsentials/packets/packets/WelcomeClientPacket.java b/src/main/java/de/hype/bbsentials/packets/packets/WelcomeClientPacket.java
new file mode 100644
index 0000000..4b2f7c3
--- /dev/null
+++ b/src/main/java/de/hype/bbsentials/packets/packets/WelcomeClientPacket.java
@@ -0,0 +1,19 @@
+package de.hype.bbsentials.packets.packets;
+
+
+import de.hype.bbsentials.packets.AbstractPacket;
+
+public class WelcomeClientPacket extends AbstractPacket {
+
+ public WelcomeClientPacket(String[] roles, String motd, boolean success) {
+ super(1, 1); //Min and Max supportet Version
+ this.roles = roles;
+ this.motd = motd;
+ this.success = success;
+ }
+
+ public final String[] roles;
+ public final String motd;
+ public final boolean success;
+
+} \ No newline at end of file