diff options
author | HacktheTime <l4bg0jb7@duck.com> | 2023-09-03 11:09:38 +0200 |
---|---|---|
committer | HacktheTime <l4bg0jb7@duck.com> | 2023-09-03 11:09:38 +0200 |
commit | cdd951d912e172ea42fc9707a786db6e69ba2901 (patch) | |
tree | 006302c766d9e09e141a9ee03e73c0626750191b /src/main/java/de | |
parent | 7d9f695e2603c2349ce0693bb0e1e6dbbd274fbc (diff) | |
download | BBsentials-cdd951d912e172ea42fc9707a786db6e69ba2901.tar.gz BBsentials-cdd951d912e172ea42fc9707a786db6e69ba2901.tar.bz2 BBsentials-cdd951d912e172ea42fc9707a786db6e69ba2901.zip |
added packet communication to work now at least as base. not all features changed and therefore supported yet. first version working at least partially with the new server.
fixed trapper yes via chat prompt action not working. changed the get getter of the string from messageOriginal in Chat.java to now use just messageOriginal.getString(). previosly removed everything in [] brackets.
Diffstat (limited to 'src/main/java/de')
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 |