From 7da03523c85e1e355d7fc5fa0f8870fdf713e4a8 Mon Sep 17 00:00:00 2001 From: tmbRandy Date: Sun, 14 Apr 2024 15:59:10 +0200 Subject: [PATCH] Added auto decompressor. Added /msg tabs. Fixed some Bugs with auto hopper and auto crafter. Updated type correction for the new word blacklist of GriferGames. --- .github/workflows/build.yml | 4 +- README.md | 10 +- api/build.gradle.kts | 12 +- build.gradle.kts | 4 +- core/build.gradle.kts | 4 +- .../core/config/AutoCrafterSubConfig.java | 5 + .../core/config/ChatSubConfig.java | 8 +- .../core/config/NatureSubConfig.java | 9 +- .../assets/tmbgriefergames/i18n/de_de.json | 17 +- .../assets/tmbgriefergames/i18n/en_us.json | 17 +- .../tmbgriefergames/textures/settings.png | Bin 53115 -> 54608 bytes .../themes/fancy/textures/settings.png | Bin 53115 -> 54608 bytes .../themes/vanilla/textures/settings.png | Bin 53115 -> 54608 bytes .../v1_12_2/util/AccountUnity.java | 2 +- .../v1_12_2/util/AutoCrafterNew.java | 12 +- .../v1_12_2/util/AutoDecomp.java | 253 ++++++++++++++++++ .../v1_12_2/util/AutoHopper.java | 11 +- .../v1_12_2/util/CBTracker.java | 3 +- .../v1_12_2/util/NatureBordersRenderer.java | 18 +- .../v1_12_2/util/VersionisedBridge.java | 37 ++- .../v1_12_2/util/chat/ChatCleaner.java | 5 +- .../v1_12_2/util/chat/MsgTabs.java | 163 +++++++++++ .../v1_12_2/util/chat/TypeCorrection.java | 7 +- .../v1_12_2/util/click/ClickManager.java | 15 ++ .../v1_8_9/util/AccountUnity.java | 3 +- .../v1_8_9/util/AutoCrafterNew.java | 12 +- .../v1_8_9/util/AutoDecomp.java | 252 +++++++++++++++++ .../v1_8_9/util/AutoHopper.java | 24 +- .../v1_8_9/util/CBTracker.java | 2 +- .../v1_8_9/util/NatureBordersRenderer.java | 18 +- .../v1_8_9/util/VersionisedBridge.java | 45 ++++ .../v1_8_9/util/chat/ChatCleaner.java | 5 +- .../v1_8_9/util/chat/MsgTabs.java | 163 +++++++++++ .../v1_8_9/util/chat/TypeCorrection.java | 10 +- .../v1_8_9/util/click/ClickManager.java | 15 ++ gradle/wrapper/gradle-wrapper.properties | 3 +- settings.gradle.kts | 2 +- 37 files changed, 1095 insertions(+), 75 deletions(-) create mode 100644 game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/AutoDecomp.java create mode 100644 game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/chat/MsgTabs.java create mode 100644 game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/AutoDecomp.java create mode 100644 game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/chat/MsgTabs.java diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index dbee1e6..9929ab1 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -12,11 +12,11 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - name: Set up JDK 17 + - name: Set up JDK 21 uses: actions/setup-java@v3 with: distribution: 'corretto' - java-version: '17' + java-version: '21' - name: Grant execute permission for gradlew run: chmod +x gradlew - name: Build with Gradle diff --git a/README.md b/README.md index f904e19..75b9633 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,9 @@ ### Autokomprimierer Drücke bei geschlossenem Inventar die Pfeiltastet LINKS, RECHTS und OBEN gleichzeitig, um den Autokomprimierer zu starten. Es öffnet sich das Komprimieren-Menü mit dem Item, welches in deinem ersten Hotbar Slot liegt. Es gibt 2 verschiedene Listen, zwischen denen du während des Komprimierens mit den Pfeiltastet HOCH und RUNTER: +### Autodekomprimierer +Drücke bei geschlossenem Inventar die Pfeiltastet LINKS, RECHTS und UNTEN gleichzeitig, um den Autodekomprimierer zu starten. Es öffnet sich das Craftingmenü. Das Item, welches in deinem ersten Hotbar Slot liegt wird nun automatisch schrittweise dekomprimiert und auf den Boden geworfen. + #### Liste #1 (Standard) Komprimiert die Stufen I, II, III, IV, V und fängt dann wieder von vorne an. @@ -12,13 +15,13 @@ Komprimiert die Stufen I, II, III, IV, V und fängt dann wieder von vorne an. Komprimiert die kleinen Stufen häufiger: I, I, II, I, I, II, I , I, II, III, I, I, II, I, I, II, I , I, II, III, IV, I, I, II, I, I, II, I , I, II, III, I, I, II, I, I, II, I , I, II, III, IV, V, I, I, II, I, I, II, I , I, II, III, I, I, II, I, I, II, I , I, II, III, IV, I, I, II, I, I, II, I , I, II, III, I, I, II, I, I, II, I , I, II, III, IV, V, VI und fängt dann wieder von vorne an. Geeignet für extrem große Mengen an Item-drops. ### Autocrafter V1 -Öffne dein Craftingmenü mit /craft und lege das Rezept, welches du craften willst in die Werkbank. Drücke nun SHIFT + Enter um das Rezept zu speichern. Drücke Anschließend ENTER um eine Portion nach der anderen zu craften. Optional kannst du auch den Endlosmudus aktivieren, um alles automatisch zu craften oder du lässt die Items automatisch wegwerfen. Berücksichtigt auch komprimierte Items. +Öffne dein Craftingmenü mit /craft und lege das Rezept, welches du craften willst in die Werkbank. Drücke nun SHIFT + Enter um das Rezept zu speichern. Drücke anschließend ENTER um eine Portion nach der anderen zu craften. Optional kannst du auch den Endlosmudus aktivieren, um alles automatisch zu craften oder du lässt die Items automatisch wegwerfen. Berücksichtigt auch komprimierte Items. ### Autocrafter V2 Arbeitet wesentlich schneller. Lege das Item, welches gecraftet werden soll in den ersten Slot deiner Hotbar. Gib nun den Befehl /autocraft ein. Es öffnet sich das /rezepte Menü auf der Rezeptseite. Es wird nun solange der "Alles-komprimieren-Button" geklickt, bis du 9 Slots des zu craftenden Items im Inventar hast. Anschließend wechselt der Autocrafter automatisch in das Komprimieren-Menü, komprimiert die Stufen I - V einmal durch und craftet anschließend weiter. Alternativ können die gecrafteten Items auch aus dem Inventar geworfen werden. Dieser Autocrafter ist auf daraus ausgelegt, dass du dir die Items durch eine Werferanlage zudroppen lässt. Bitte übertreibe es nicht und baue mit Rücksicht auf die Serverleistung keine zu großen Werferanlagen. ### Optisch dargestellte Plotgrenzen auf CB Nature und Extreme -Die Plotgrenzen auf den beiden Natur-CBs können mit Linien grafisch dargestellt werden. Die Darstellung lässt sich bei Bedarf über einen Hotkey ein- und ausschalten. +Die Plotgrenzen auf den beiden Natur-CBs können mit Linien grafisch dargestellt werden. Die Darstellung lässt sich bei Bedarf über einen Hotkey ein- und ausschalten und optisch anpassen. ### Automatische Trichtereinstellung Wenn du eine Vielzahl an Trichtern einstellen musst, kannst du die gewünschten Einstellungen festlegen. Sobald du dann ein Trichtermenü öffnest, werden je nach Einstellung Filteritem, Einsaugradius, Stackgröße und Schlussaktion, wie die Verbindung mit einem anderen Trichter automatisch vorgenommen. Du kannst außerdem festlegen, dass du bei Rechtsklick auf einen Trichter automatisch sneakst. @@ -67,6 +70,9 @@ Dieses Widget zeigt dir eine Liste von Spielern in deiner unmittelbaren Umgebung Validierung von Zahlungen Bei eingehenden Zahlungen wird überprüft, ob es eine echte Zahlung, oder Fake Money ist. Hinter der Zahlung siehst du eine entsprechende Nachricht. +### /msg in Tabs +Bei der Chatkommunikation mit Spielern wird automatisch für jeden Spieler ein eigener Chat Tab angelegt. Dies verbessert nicht nur den Überblick, sondern erleichtert auch das Versenden von Nachrichten, da das Voranstellen von /r oder /msg nicht mehr nötig ist. Solange ein Tab mit einem Spielernamen geöffnet ist, werden Nachrichten immer an die entsprechende Person gesendet. Dies verhindert auch, dass Nachrichten an die falsche Person gesendet werden, wenn man mit /r antwortet und man vor dem Absenden eine Nachricht einer anderen Person erhält. Befehle beginnend mit "/" können funktionieren auch wenn ein /msg Tab geöffnet ist. Diese werden nicht als msg versendet. + ### Autokorrektur Die Autokorrektur verhindert die gängigsten Rechtschreibfehler. Gibst du z.B. "7msg AbgegrieftHD Hallo" ein, wird das 7msg durch ein /msg ersetzt, sodass die Nachricht ankommt und nicht im Chat erscheint. diff --git a/api/build.gradle.kts b/api/build.gradle.kts index 81756f7..8fdb04e 100644 --- a/api/build.gradle.kts +++ b/api/build.gradle.kts @@ -6,14 +6,6 @@ plugins { dependencies { labyApi("api") - - // If you want to use external libraries, you can do that here. - // The dependencies that are specified here are loaded into your project but will also - // automatically be downloaded by labymod, but only if the repository is public. - // If it is private, you have to add and compile the dependency manually. - // You have to specify the repository, there are getters for maven central and sonatype, every - // other repository has to be specified with their url. Example: - // maven(mavenCentral(), "org.apache.httpcomponents:httpclient:4.5.13") } labyModProcessor { @@ -21,6 +13,6 @@ labyModProcessor { } java { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 } \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index c87388a..b5ec22b 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -5,7 +5,7 @@ plugins { } group = "tmb.randy" -version = "1.2.1" +version = "1.3" java.toolchain.languageVersion.set(JavaLanguageVersion.of(17)) @@ -71,7 +71,7 @@ fun configureRun(provider: net.labymod.gradle.core.minecraft.provider.VersionPro provider.javaVersion = when (gameVersion) { else -> { - JavaVersion.VERSION_17 + JavaVersion.VERSION_21 } } diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 878db93..c25c93d 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -29,6 +29,6 @@ labyModProcessor { } java { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 } \ No newline at end of file diff --git a/core/src/main/java/tmb/randy/tmbgriefergames/core/config/AutoCrafterSubConfig.java b/core/src/main/java/tmb/randy/tmbgriefergames/core/config/AutoCrafterSubConfig.java index 196b602..c6d8739 100644 --- a/core/src/main/java/tmb/randy/tmbgriefergames/core/config/AutoCrafterSubConfig.java +++ b/core/src/main/java/tmb/randy/tmbgriefergames/core/config/AutoCrafterSubConfig.java @@ -28,6 +28,9 @@ public class AutoCrafterSubConfig extends Config { @MultiKeyBindSetting private final ConfigProperty autoCompHotkey = new ConfigProperty<>(new Key[]{Key.ARROW_LEFT, Key.ARROW_UP, Key.ARROW_RIGHT}); + @MultiKeyBindSetting + private final ConfigProperty autoDecompHotkey = new ConfigProperty<>(new Key[]{Key.ARROW_LEFT, Key.ARROW_DOWN, Key.ARROW_RIGHT}); + public ConfigProperty getAutoCraftSpeed() { return this.autoCraftSpeed; } public ConfigProperty getAutoDrop() { return this.autoDrop; @@ -42,4 +45,6 @@ public ConfigProperty getEndlessMode() { public ConfigProperty getFinalAction() { return finalAction; } public ConfigProperty getAutoCompHotkey() {return autoCompHotkey;} + + public ConfigProperty getAutoDecompHotkey() {return autoDecompHotkey;} } \ No newline at end of file diff --git a/core/src/main/java/tmb/randy/tmbgriefergames/core/config/ChatSubConfig.java b/core/src/main/java/tmb/randy/tmbgriefergames/core/config/ChatSubConfig.java index b2e89e3..a8282e1 100644 --- a/core/src/main/java/tmb/randy/tmbgriefergames/core/config/ChatSubConfig.java +++ b/core/src/main/java/tmb/randy/tmbgriefergames/core/config/ChatSubConfig.java @@ -1,8 +1,7 @@ package tmb.randy.tmbgriefergames.core.config; -import net.labymod.api.client.gui.screen.widget.widgets.input.SliderWidget.SliderSetting; import net.labymod.api.client.gui.screen.widget.widgets.input.SwitchWidget.SwitchSetting; -import net.labymod.api.client.gui.screen.widget.widgets.input.TextFieldWidget.TextFieldSetting; +import net.labymod.api.client.gui.screen.widget.widgets.input.dropdown.DropdownWidget.DropdownSetting; import net.labymod.api.configuration.loader.Config; import net.labymod.api.configuration.loader.annotation.SpriteSlot; import net.labymod.api.configuration.loader.property.ConfigProperty; @@ -41,6 +40,10 @@ public class ChatSubConfig extends Config { @SpriteSlot(size = 21, x = 1, y = 2) private final ConfigProperty muteStreamer = new ConfigProperty<>(false); + @SpriteSlot(size = 21, y = 3) + @SwitchSetting + private final ConfigProperty msgTabMode = new ConfigProperty<>(true); + public ConfigProperty getTypeCorrection() { @@ -57,4 +60,5 @@ public ConfigProperty getHideNews() { public ConfigProperty getCleanChat() {return this.cleanChat;} public ConfigProperty getHideEmptyLines() {return this.hideEmptyLines;} public ConfigProperty getMuteStreamer() {return this.muteStreamer;} + public ConfigProperty getMsgTabMode() {return msgTabMode;} } \ No newline at end of file diff --git a/core/src/main/java/tmb/randy/tmbgriefergames/core/config/NatureSubConfig.java b/core/src/main/java/tmb/randy/tmbgriefergames/core/config/NatureSubConfig.java index 7202bde..e3c0b9b 100644 --- a/core/src/main/java/tmb/randy/tmbgriefergames/core/config/NatureSubConfig.java +++ b/core/src/main/java/tmb/randy/tmbgriefergames/core/config/NatureSubConfig.java @@ -1,10 +1,10 @@ package tmb.randy.tmbgriefergames.core.config; import net.labymod.api.client.gui.screen.key.Key; -import net.labymod.api.client.gui.screen.widget.widgets.input.KeybindWidget.KeyBindSetting; import net.labymod.api.client.gui.screen.widget.widgets.input.MultiKeybindWidget.MultiKeyBindSetting; import net.labymod.api.client.gui.screen.widget.widgets.input.SliderWidget.SliderSetting; import net.labymod.api.client.gui.screen.widget.widgets.input.SwitchWidget.SwitchSetting; +import net.labymod.api.client.gui.screen.widget.widgets.input.color.ColorPickerWidget.ColorPickerSetting; import net.labymod.api.configuration.loader.Config; import net.labymod.api.configuration.loader.annotation.ParentSwitch; import net.labymod.api.configuration.loader.property.ConfigProperty; @@ -24,6 +24,10 @@ public class NatureSubConfig extends Config { @SwitchSetting private final ConfigProperty borderMaxHeight = new ConfigProperty<>(false); + @SwitchSetting + private final ConfigProperty rainbow = new ConfigProperty<>(true); + @ColorPickerSetting + private final ConfigProperty borderColor = new ConfigProperty<>(1); public ConfigProperty getShowBorders() { return this.showBorders; } @@ -37,5 +41,6 @@ public ConfigProperty getBorderheight() { public ConfigProperty getBorderMaxHeight() { return this.borderMaxHeight; } - + public ConfigProperty getRainbow() {return rainbow;} + public ConfigProperty getBorderColor() {return borderColor;} } \ No newline at end of file diff --git a/core/src/main/resources/assets/tmbgriefergames/i18n/de_de.json b/core/src/main/resources/assets/tmbgriefergames/i18n/de_de.json index e5af441..a899c7e 100644 --- a/core/src/main/resources/assets/tmbgriefergames/i18n/de_de.json +++ b/core/src/main/resources/assets/tmbgriefergames/i18n/de_de.json @@ -32,6 +32,12 @@ }, "hotkey": { "name": "Hotkey" + }, + "rainbow": { + "name": "Farbwechsel" + }, + "borderColor": { + "name": "Farbe" } }, "hopperSubConfig": { @@ -90,6 +96,9 @@ "muteStreamer": { "name": "Streamer Nachrichten entfernen", "description": "Entfernt die Chat Benachrichtigungen, wenn Streamer live gehen." + }, + "msgTabMode": { + "name": "/msg in Tabs" } }, "itemProtection": { @@ -119,7 +128,7 @@ "name": "Lobby überspringen" }, "autoCrafterConfig": { - "name": "Autocrafter & Autokomprimierer", + "name": "Autocrafter & Auto(de)komprimierer", "description": "Es gibt 2 verschiedene Autocrafter:\\n\\nV1 nutzt das Vanilla Crafting Menü (Werkbank). Lege dein Rezept in die Werkbank und speichere mit SHIFT + ENTER. Drücke anschließend ENTER, um das Rezept zu craften.\\n\\nV2 nutzt das /rezepte Menü. Lege das Item, welches du craften willst in deinen ersten Hotbar Slot. Gib anschließend /autocraft in den Chat ein. Das /rezepte Menü öffnet sich automatisch und craftet deine Items.", "autoCraftSpeed": { "name": "[V1] Geschwindigkeit" @@ -140,6 +149,9 @@ }, "autoCompHotkey": { "name": "Hotkey für Autokomprimierer" + }, + "autoDecompHotkey": { + "name": "Hotkey für Autodekomprimierer" } } }, @@ -211,6 +223,9 @@ "autoComp": { "list": "Liste #" }, + "autoDecomp": { + "started": "Dekomprimiere..." + }, "autoCrafter": { "recipeSaved": "Rezept gespeichert", "active": "Endlosmodus §a§lAKTIV", diff --git a/core/src/main/resources/assets/tmbgriefergames/i18n/en_us.json b/core/src/main/resources/assets/tmbgriefergames/i18n/en_us.json index 2f0246f..f5e651f 100644 --- a/core/src/main/resources/assets/tmbgriefergames/i18n/en_us.json +++ b/core/src/main/resources/assets/tmbgriefergames/i18n/en_us.json @@ -32,6 +32,12 @@ }, "hotkey": { "name": "hotkey" + }, + "rainbow": { + "name": "change colors" + }, + "borderColor": { + "name": "color" } }, "hopperSubConfig": { @@ -93,6 +99,9 @@ "muteStreamer": { "name": "remove streamer messages", "description": "removes the messages that appear, when a streamer goes live." + }, + "msgTabMode": { + "name": "/msg in tabs" } }, "itemProtection": { @@ -119,7 +128,7 @@ "description": "Go to the previous plot (/p h -1)" }, "autoCrafterConfig": { - "name": "Auto-crafter & auto-compressor", + "name": "Auto-crafter & auto-(de)compressor", "description": "There are 2 different Autocrafters:\n\nV1 uses the Vanilla Crafting menu (Workbench). Place your recipe in the Workbench and save with SHIFT + ENTER. Then press ENTER to craft the recipe.\n\nV2 uses the /recipes menu. Place the item you want to craft in your first hotbar slot. Then type /autocraft in the chat. The /recipes menu will open automatically and craft your items.", "autoCraftSpeed": { "name": "[V1] Speed" @@ -140,6 +149,9 @@ }, "autoCompHotkey": { "name": "Hotkey for auto-compressor" + }, + "autoDecompHotkey": { + "name": "Hotkey for auto-decompressor" } } }, @@ -211,6 +223,9 @@ "autoComp": { "list": "list #" }, + "autoDecomp": { + "started": "decompressing..." + }, "autoCrafter": { "recipeSaved": "Recipe saved", "active": "Endless mode §a§ACTIVE", diff --git a/core/src/main/resources/assets/tmbgriefergames/textures/settings.png b/core/src/main/resources/assets/tmbgriefergames/textures/settings.png index 1828d454fb09bec3d6b146f4839bb127fea94dce..86082fc108b755885a63497bb450e124f6cfc3f5 100644 GIT binary patch delta 7763 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 delta 6258 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 VQY3e8ZQZ{x4D?JMR_Hv9`X4wb$%g;{ diff --git a/core/src/main/resources/assets/tmbgriefergames/themes/fancy/textures/settings.png b/core/src/main/resources/assets/tmbgriefergames/themes/fancy/textures/settings.png index 1828d454fb09bec3d6b146f4839bb127fea94dce..86082fc108b755885a63497bb450e124f6cfc3f5 100644 GIT binary patch delta 7763 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 delta 6258 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 VQY3e8ZQZ{x4D?JMR_Hv9`X4wb$%g;{ diff --git a/core/src/main/resources/assets/tmbgriefergames/themes/vanilla/textures/settings.png b/core/src/main/resources/assets/tmbgriefergames/themes/vanilla/textures/settings.png index 1828d454fb09bec3d6b146f4839bb127fea94dce..86082fc108b755885a63497bb450e124f6cfc3f5 100644 GIT binary patch delta 7763 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 delta 6258 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 VQY3e8ZQZ{x4D?JMR_Hv9`X4wb$%g;{ diff --git a/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/AccountUnity.java b/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/AccountUnity.java index ab45dc3..7709fb3 100644 --- a/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/AccountUnity.java +++ b/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/AccountUnity.java @@ -13,7 +13,7 @@ public void messageReceived(ChatReceiveEvent event) { for (Account account : LabyMod.getInstance().getAccountManager().getAccounts()) { String name = account.getUsername(); if(event.chatMessage().getPlainText().endsWith(name + " möchte sich zu dir teleportieren.") || event.chatMessage().getPlainText().endsWith(name + " möchte, dass du dich zu der Person teleportierst.")) { - Laby.labyAPI().minecraft().chatExecutor().chat("/tpaccept"); + VersionisedBridge.sendCommand("/tpaccept"); } } } diff --git a/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/AutoCrafterNew.java b/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/AutoCrafterNew.java index 80180fe..ec1239f 100644 --- a/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/AutoCrafterNew.java +++ b/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/AutoCrafterNew.java @@ -32,6 +32,7 @@ private enum STATE { private int cooldown; private final LinkedList toSend = new LinkedList<>(); private Item itemToCraft; + private int subIDtoCraft = 0; private STATE currentState = STATE.OPEN_RECEIPTS; private boolean active; @@ -54,7 +55,7 @@ public void onTickEvent(GameTickEvent event) { currentState = STATE.OPEN_CRAFT_PAGE; } } else { - Minecraft.getMinecraft().player.sendChatMessage("/rezepte"); + VersionisedBridge.sendCommand("/rezepte"); } } case OPEN_CRAFT_PAGE -> { @@ -84,6 +85,7 @@ public void onTickEvent(GameTickEvent event) { case CRAFT -> { if(itemToCraft == null) { itemToCraft = Minecraft.getMinecraft().player.openContainer.getSlot(25).getStack().getItem(); + subIDtoCraft = Minecraft.getMinecraft().player.openContainer.getSlot(25).getStack().getMetadata(); } if(getSlotCountOfItemInInventory() >= 27) { @@ -121,7 +123,7 @@ public void onTickEvent(GameTickEvent event) { Minecraft.getMinecraft().player.closeScreen(); currentState = STATE.OPEN_RECEIPTS; } else { - ClickManager.getSharedInstance().dropItemsFromInventory(itemToCraft, true); + ClickManager.getSharedInstance().dropItemsFromInventory(itemToCraft, subIDtoCraft, true); } } } @@ -258,6 +260,7 @@ public void startCrafter() { active = true; if(!Minecraft.getMinecraft().player.inventory.getStackInSlot(0).isEmpty()) { itemToCraft = Minecraft.getMinecraft().player.inventory.getStackInSlot(0).getItem(); + subIDtoCraft = Minecraft.getMinecraft().player.inventory.getStackInSlot(0).getMetadata(); } currentState = STATE.OPEN_RECEIPTS; } @@ -266,6 +269,7 @@ public void startCrafter() { public void stopCrafter() { active = false; itemToCraft = null; + subIDtoCraft = 0; currentState = STATE.OPEN_RECEIPTS; } @@ -278,7 +282,7 @@ private void click(int slot) { private int getSlotCountOfItemInInventory() { int count = 0; for (ItemStack itemStack : Minecraft.getMinecraft().player.inventory.mainInventory) { - if(itemStack.getItem().equals(itemToCraft)) { + if(itemStack.getItem().equals(itemToCraft) && itemStack.getMetadata() == subIDtoCraft) { count++; } } @@ -290,7 +294,7 @@ private int getSlotForItemToCraft() { for (int i = 54; i < slotCount; i++) { ItemStack stack = Minecraft.getMinecraft().player.openContainer.getSlot(i).getStack(); if(!stack.isEmpty()) { - if(stack.getItem().equals(itemToCraft)) { + if(stack.getItem().equals(itemToCraft) && stack.getMetadata() == subIDtoCraft) { return i; } } diff --git a/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/AutoDecomp.java b/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/AutoDecomp.java new file mode 100644 index 0000000..9fb3839 --- /dev/null +++ b/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/AutoDecomp.java @@ -0,0 +1,253 @@ +package tmb.randy.tmbgriefergames.v1_12_2.util; + +import net.labymod.api.client.gui.screen.key.Key; +import net.labymod.api.event.Phase; +import net.labymod.api.event.client.input.KeyEvent; +import net.labymod.api.event.client.lifecycle.GameTickEvent; +import net.labymod.api.util.I18n; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.inventory.GuiCrafting; +import net.minecraft.inventory.ClickType; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.ContainerWorkbench; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import tmb.randy.tmbgriefergames.core.Addon; +import tmb.randy.tmbgriefergames.core.enums.QueueType; +import tmb.randy.tmbgriefergames.v1_12_2.util.click.Click; +import tmb.randy.tmbgriefergames.v1_12_2.util.click.ClickManager; + +public class AutoDecomp { + + private boolean autoDecompActive = false; + private Item compItem; + private int compSubID; + private int counter; + + public void onKeyEvent(KeyEvent event) { + if(Key.ESCAPE.isPressed() && autoDecompActive) { + stopDecomp(); + } else if (Addon.areKeysPressed(Addon.getSharedInstance().configuration().getAutoCrafterConfig().getAutoDecompHotkey().get())) { + startDecomp(); + Addon.getSharedInstance().displayNotification(I18n.getTranslation("tmbgriefergames.autoDecomp.started")); + } + } + + public void onTickEvent(GameTickEvent event) { + if (event.phase() == Phase.PRE && autoDecompActive + && Minecraft.getMinecraft().player != null && Minecraft.getMinecraft().world != null) { + counter++; + + if( counter >= 5) { + decomp(); + counter = 0; + } + } + } + + private void decomp() { + if (Minecraft.getMinecraft().player.openContainer != null + && Minecraft.getMinecraft().currentScreen instanceof GuiCrafting) { + Container container = Minecraft.getMinecraft().player.openContainer; + + if (ClickManager.getSharedInstance().isClickQueueEmpty(QueueType.MEDIUM)) { + if (compItem == null) { + if (!Minecraft.getMinecraft().player.inventory.mainInventory.get(0).isEmpty()) { + compItem = Minecraft.getMinecraft().player.inventory.mainInventory.get(0).getItem(); + compSubID = Minecraft.getMinecraft().player.inventory.mainInventory.get(0).getMetadata(); + } + } else { + //Do Decomp + + if (container.getSlot(0).getHasStack()) { + ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, + new Click(container.windowId, 0, 0, ClickType.QUICK_MOVE)); + } else if (doesCraftingFieldContainItems()) { + for (int i = 1; i < 10; i++) { + if (container.getSlot(i).getHasStack()) { + ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, + new Click(container.windowId, i, 0, ClickType.QUICK_MOVE)); + } + } + } else { + int[] compSteps = getCompCountForItem(); + if (compSteps[0] > 0) { + dropUncompressedItems(); + } else if (compSteps[1] > 0) { + int slot = getBestSlotForCompStep(1); + if (slot >= 10) { + ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, new Click(container.windowId, slot, 0, ClickType.PICKUP)); + ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, new Click(container.windowId, 5, 0, ClickType.PICKUP)); + } + } else if (compSteps[2] > 0) { + int slot = getBestSlotForCompStep(2); + if (slot >= 10) { + ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, new Click(container.windowId, slot, 0, ClickType.PICKUP)); + ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, new Click(container.windowId, 5, 0, ClickType.PICKUP)); + } + } else if (compSteps[3] > 0) { + int slot = getBestSlotForCompStep(3); + if (slot >= 10) { + ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, new Click(container.windowId, slot, 0, ClickType.PICKUP)); + ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, new Click(container.windowId, 5, 0, ClickType.PICKUP)); + } + } else if (compSteps[4] > 0) { + int slot = getBestSlotForCompStep(4); + if (slot >= 10) { + ClickManager.getSharedInstance().addClick( + QueueType.MEDIUM, new Click(container.windowId, slot, 0, ClickType.PICKUP)); + ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, new Click(container.windowId, 5, 0, ClickType.PICKUP)); + } + } else if (compSteps[5] > 0) { + int slot = getBestSlotForCompStep(5); + if (slot >= 10) { + ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, new Click(container.windowId, slot, 0, ClickType.PICKUP)); + ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, new Click(container.windowId, 5, 0, ClickType.PICKUP)); + } + } else if (compSteps[6] > 0) { + int slot = getBestSlotForCompStep(6); + if (slot >= 10) { + ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, new Click(container.windowId, slot, 0, ClickType.PICKUP)); + ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, new Click(container.windowId, 5, 0, ClickType.PICKUP)); + } + } else if (compSteps[7] > 0) { + int slot = getBestSlotForCompStep(7); + if (slot >= 10) { + ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, new Click(container.windowId, slot, 0, ClickType.PICKUP)); + ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, new Click(container.windowId, 5, 0, ClickType.PICKUP)); + } + } + } + } + } + } else { + if (VersionisedBridge.canSendCommand()) { + VersionisedBridge.sendCommand("/craft"); + } + } + } + + public void startDecomp() { + autoDecompActive = true; + } + + public void stopDecomp() { + autoDecompActive = false; + compItem = null; + compSubID = 0; + } + + private int[] getCompCountForItem() { + int[] output = new int[8]; + + for (ItemStack itemStack : Minecraft.getMinecraft().player.inventory.mainInventory) { + if (!itemStack.isEmpty()) { + if (itemStack.getItem().equals(compItem) && itemStack.getMetadata() == compSubID) { + if (itemStack.hasDisplayName()) { + if (itemStack.getDisplayName().endsWith(" VII")) { + output[7]++; + } else if (itemStack.getDisplayName().endsWith(" VI")) { + output[6]++; + } else if (itemStack.getDisplayName().endsWith(" V")) { + output[5]++; + } else if (itemStack.getDisplayName().endsWith(" IV")) { + output[4]++; + } else if (itemStack.getDisplayName().endsWith(" III")) { + output[3]++; + } else if (itemStack.getDisplayName().endsWith(" II")) { + output[2]++; + } else if (itemStack.getDisplayName().endsWith(" I")) { + output[1]++; + } else { + output[0]++; + } + } else { + output[0]++; + } + } + } + } + return output; + } + + private boolean doesCraftingFieldContainItems() { + if (Minecraft.getMinecraft().player.openContainer instanceof ContainerWorkbench) { + for (int i = 1; i < 10; i++) { + if (Minecraft.getMinecraft().player.openContainer.getSlot(i).getHasStack()) { + return true; + } + } + } + return false; + } + + private void dropUncompressedItems() { + if (Minecraft.getMinecraft().player.openContainer instanceof ContainerWorkbench) { + for (int i = 10; i < 46; i++) { + if (Minecraft.getMinecraft().player.openContainer.getSlot(i).getHasStack()) { + if (Minecraft.getMinecraft().player.openContainer.getSlot(i).getStack().getItem().equals(compItem) && Minecraft.getMinecraft().player.openContainer.getSlot(i).getStack().getMetadata() == compSubID) { + if (!Minecraft.getMinecraft().player.openContainer.getSlot(i).getStack().hasDisplayName()) { + ClickManager.getSharedInstance().dropClick(i); + } + } + } + } + } + } + + private int getBestSlotForCompStep(int step) { + String romanian = getRomanianNumberForInt(step); + int lowestSlot = 0; + ItemStack lowestItemStack = null; + + if (Minecraft.getMinecraft().player.openContainer instanceof ContainerWorkbench) { + for (int i = 10; i < Minecraft.getMinecraft().player.openContainer.inventorySlots.size(); i++) { + if (Minecraft.getMinecraft().player.openContainer.inventorySlots.get(i) + .getHasStack()) { + if (Minecraft.getMinecraft().player.openContainer.inventorySlots.get(i).getStack().getItem().equals(compItem) && Minecraft.getMinecraft().player.openContainer.inventorySlots.get(i).getStack().getMetadata() == compSubID) { + if (Minecraft.getMinecraft().player.openContainer.inventorySlots.get(i) + .getStack().hasDisplayName()) { + if (Minecraft.getMinecraft().player.openContainer.inventorySlots.get(i) + .getStack().getDisplayName().endsWith(" " + romanian)) { + if (lowestItemStack == null) { + lowestItemStack = Minecraft.getMinecraft().player.openContainer.inventorySlots.get( + i).getStack(); + lowestSlot = i; + } else if (lowestItemStack.getCount() + > Minecraft.getMinecraft().player.openContainer.inventorySlots.get( + i).getStack().getCount()) { + lowestItemStack = Minecraft.getMinecraft().player.openContainer.inventorySlots.get( + i).getStack(); + lowestSlot = i; + } + } + } + } + } + } + } + + return lowestSlot; + } + + private String getRomanianNumberForInt(int number) { + switch (number) { + case 1: + return "I"; + case 2: + return "II"; + case 3: + return "III"; + case 4: + return "IV"; + case 5: + return "V"; + case 6: + return "VI"; + case 7: + return "VII"; + default: + return ""; + } + } +} \ No newline at end of file diff --git a/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/AutoHopper.java b/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/AutoHopper.java index 42102f1..65a1e4d 100644 --- a/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/AutoHopper.java +++ b/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/AutoHopper.java @@ -8,11 +8,13 @@ import net.minecraft.block.BlockHopper; import net.minecraft.client.Minecraft; import net.minecraft.client.settings.KeyBinding; +import net.minecraft.init.Blocks; import net.minecraft.inventory.ClickType; import net.minecraft.inventory.Container; import net.minecraft.inventory.ContainerChest; import net.minecraft.inventory.IInventory; import net.minecraft.item.Item; +import net.minecraft.item.ItemSkull; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.RayTraceResult; import org.lwjgl.input.Keyboard; @@ -74,17 +76,20 @@ public void tick(GameTickEvent event) { toggeledSneak = false; } + boolean clicked = false; if (ClickManager.getSharedInstance().isClickQueueEmpty(QueueType.MEDIUM)) { - if (Addon.getSharedInstance().configuration().getHopperSubConfig().getFilterItem().get() && ( - Item.getIdFromItem(chest.getSlot(28).getStack().getItem()) != Item.getIdFromItem(chest.getSlot(72).getStack().getItem())) && !(Item.getIdFromItem(chest.getSlot(28).getStack().getItem()) == 166 && !chest.getSlot(72).getHasStack())) { + if (Addon.getSharedInstance().configuration().getHopperSubConfig().getFilterItem().get() && + (((!chest.getSlot(28).getStack().getItem().equals(chest.getSlot(72).getStack().getItem())) && + !(Block.getBlockFromItem(chest.getSlot(28).getStack().getItem()) == Blocks.BARRIER && !chest.getSlot(72).getHasStack())) || + (chest.getSlot(28).getStack().getMetadata() != chest.getSlot(72).getStack().getMetadata()))) { ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, new Click(chest.windowId, 72, 0, ClickType.QUICK_MOVE)); clicked = true; } if (Addon.getSharedInstance().configuration().getHopperSubConfig().getRadius().get() > -1 && !receivedPlotBorderMessage && !clicked) { if (Addon.getSharedInstance().configuration().getHopperSubConfig().getRadius().get() == 0) { - if (Item.getIdFromItem(chest.getSlot(30).getStack().getItem()) == 397) { + if (chest.getSlot(30).getStack().getItem() instanceof ItemSkull) { ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, new Click(chest.windowId, 30, 0, ClickType.QUICK_MOVE)); clicked = true; } diff --git a/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/CBTracker.java b/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/CBTracker.java index f16416d..ce37622 100644 --- a/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/CBTracker.java +++ b/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/CBTracker.java @@ -56,12 +56,13 @@ public void run() { if(team.getTeamName().equals("server_value")) { String CBString = ((TextComponent)team.getPrefix()).getText(); if(!CBString.equals(currentCB) && CBs.contains(CBString)) { + ItemClearTimerListener.resetItemRemover(); currentCB = CBString; Addon.getSharedInstance().getBridge().cbChanged(); if(currentCB.equals("Lobby") && Addon.getSharedInstance().configuration().getSkipHub().get()) { - Laby.labyAPI().minecraft().chatExecutor().chat("/portal"); + VersionisedBridge.sendCommand("/portal"); } } } diff --git a/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/NatureBordersRenderer.java b/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/NatureBordersRenderer.java index fc6ca2d..bcf1fb6 100644 --- a/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/NatureBordersRenderer.java +++ b/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/NatureBordersRenderer.java @@ -4,6 +4,7 @@ import net.labymod.api.event.client.input.KeyEvent; import net.labymod.api.event.client.input.KeyEvent.State; import net.labymod.api.event.client.render.world.RenderWorldEvent; +import net.labymod.api.util.Color; import net.labymod.api.util.I18n; import net.minecraft.block.material.Material; import net.minecraft.client.Minecraft; @@ -160,12 +161,17 @@ public void onRender(RenderWorldEvent event) GL11.glPushMatrix(); Tessellator tesselator = Tessellator.getInstance(); BufferBuilder render = tesselator.getBuffer(); - Vector3f hsv = this.RGB2HSV(this.lineRed, this.lineGreen, this.lineBlue); - Vector3f rgb = this.HSV2RGB((hsv.x + 0.01F) % 1.0F, hsv.y, hsv.z); - this.lineRed = rgb.x; - this.lineGreen = rgb.y; - this.lineBlue = rgb.z; - GL11.glColor4f(rgb.x, rgb.y, rgb.z, 0.35F); + if(Addon.getSharedInstance().configuration().getNatureSubConfig().getRainbow().get()) { + Vector3f hsv = this.RGB2HSV(this.lineRed, this.lineGreen, this.lineBlue); + Vector3f rgb = this.HSV2RGB((hsv.x + 0.01F) % 1.0F, hsv.y, hsv.z); + this.lineRed = rgb.x; + this.lineGreen = rgb.y; + this.lineBlue = rgb.z; + GL11.glColor4f(rgb.x, rgb.y, rgb.z, 0.35F); + } else { + Color color = Color.of(Addon.getSharedInstance().configuration().getNatureSubConfig().getBorderColor().get()); + GL11.glColor4f(((float) color.getRed())/255, ((float) color.getGreen())/255, ((float) color.getBlue())/255, 0.35F); + } render.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION); int rad = 16 * Addon.getSharedInstance().configuration().getNatureSubConfig().getBorderRadius().get(); int hrf = rad / 2; diff --git a/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/VersionisedBridge.java b/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/VersionisedBridge.java index 705a99b..937fe71 100644 --- a/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/VersionisedBridge.java +++ b/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/VersionisedBridge.java @@ -17,6 +17,7 @@ import net.labymod.api.event.client.world.ItemStackTooltipEvent; import net.labymod.api.event.client.world.WorldLoadEvent; import net.labymod.api.models.Implements; +import net.labymod.core.client.gui.screen.activity.activities.ingame.chat.ChatOverlay; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.gui.inventory.GuiChest; @@ -27,6 +28,7 @@ import tmb.randy.tmbgriefergames.v1_12_2.util.chat.ChatCleaner; import tmb.randy.tmbgriefergames.v1_12_2.util.chat.CooldownNotifier; import tmb.randy.tmbgriefergames.v1_12_2.util.chat.EmptyLinesRemover; +import tmb.randy.tmbgriefergames.v1_12_2.util.chat.MsgTabs; import tmb.randy.tmbgriefergames.v1_12_2.util.chat.NewsBlocker; import tmb.randy.tmbgriefergames.v1_12_2.util.chat.PaymentValidator; import tmb.randy.tmbgriefergames.v1_12_2.util.chat.StreamerMute; @@ -41,6 +43,7 @@ public class VersionisedBridge implements IBridge { private final CooldownNotifier cooldownNotifier = new CooldownNotifier(); private final EmptyLinesRemover emptyLinesRemover = new EmptyLinesRemover(); private final NewsBlocker newsBlocker = new NewsBlocker(); + private final MsgTabs msgTabs = new MsgTabs(); private final PaymentValidator paymentValidator = new PaymentValidator(); private final StreamerMute streamerMute = new StreamerMute(); private final TypeCorrection typeCorrection = new TypeCorrection(); @@ -58,9 +61,12 @@ public class VersionisedBridge implements IBridge { private final AutoComp autoComp = new AutoComp(); private final AutoCrafter autoCrafter = new AutoCrafter(); private final AutoCrafterNew autoCrafterNew = new AutoCrafterNew(); - + private final AutoDecomp autoDecomp = new AutoDecomp(); private GuiScreen lastGui; + private static final int commandCountdownLimit = 20; + private static int commandCountdown = 0; + @Subscribe public void worldLoadEvent(WorldLoadEvent event) { // No checking for isGG as the function to auto skip the lobby/hub wouldn't work as the server adress is set too late. @@ -81,6 +87,7 @@ public void messageReceived(ChatReceiveEvent event) { playerTracer.messageReceived(event); autoHopper.messageReceived(event); accountUnity.messageReceived(event); + msgTabs.chatMessageReceived(event); } @Subscribe @@ -88,6 +95,7 @@ public void messageSend(ChatMessageSendEvent event) { if(!Addon.isGG()) return; + msgTabs.messageSend(event); cooldownNotifier.messageReceived(event); typeCorrection.messageSend(event); plotSwitch.messageSend(event); @@ -140,6 +148,9 @@ public void tick(GameTickEvent event) { itemShifter.tick(event); plotSwitch.tick(event); autoCrafterNew.onTickEvent(event); + autoDecomp.onTickEvent(event); + + commandCountdown(); } @Subscribe @@ -154,6 +165,7 @@ public void keyDown(KeyEvent event) { autoComp.onKeyEvent(event); autoCrafter.onKeyEvent(event); autoCrafterNew.onKeyEvent(event); + autoDecomp.onKeyEvent(event); } @Subscribe @@ -238,4 +250,27 @@ public void startNewAutocrafter() { public boolean isCompActive() { return autoComp.isCompActive(); } + + private static void commandCountdown() { + if (commandCountdown > 0) { + commandCountdown--; + } + } + + public static boolean canSendCommand() { return commandCountdown <= 0; } + public static boolean sendCommand(String command) { + if(canSendCommand()) { + Minecraft.getMinecraft().player.sendChatMessage(command); + commandCountdown = commandCountdownLimit; + return true; + } + return false; + } + + public static boolean isGUIOpen() { + GuiScreen currentScreen = Minecraft.getMinecraft().currentScreen; + + // Check if a GUI is open and if it is a chest GUI + return currentScreen instanceof GuiChest || currentScreen instanceof GuiInventory || currentScreen instanceof GuiCrafting; + } } diff --git a/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/chat/ChatCleaner.java b/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/chat/ChatCleaner.java index 131cdc0..a5ec46f 100644 --- a/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/chat/ChatCleaner.java +++ b/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/chat/ChatCleaner.java @@ -22,7 +22,10 @@ public class ChatCleaner { "[GrieferGames] Du wurdest zum Grundstück teleportiert.", "[GrieferGames] Deine Tageszeit wurde vom Grundstück aktualisiert.", "[GrieferGames] Deine Tageszeit wurde wiederhergestellt.", - "[GrieferGames] Bitte warte 15 Sekunden zwischen jedem Join-Versuch." + "[GrieferGames] Bitte warte 15 Sekunden zwischen jedem Join-Versuch.", + "------------ [ Server-Status ] ------------", + "Ergriffene Maßnahmen:", + "Versuche in den Portalraum zu verbinden." ); public void messageReceived(ChatReceiveEvent event) { diff --git a/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/chat/MsgTabs.java b/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/chat/MsgTabs.java new file mode 100644 index 0000000..bce0a5c --- /dev/null +++ b/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/chat/MsgTabs.java @@ -0,0 +1,163 @@ +package tmb.randy.tmbgriefergames.v1_12_2.util.chat; + +import net.labymod.api.client.chat.filter.ChatFilter; +import net.labymod.api.configuration.labymod.chat.ChatTab; +import net.labymod.api.configuration.labymod.chat.ChatWindow; +import net.labymod.api.configuration.labymod.chat.config.RootChatTabConfig; +import net.labymod.api.configuration.labymod.chat.config.RootChatTabConfig.Type; +import net.labymod.api.event.client.chat.ChatMessageSendEvent; +import net.labymod.api.event.client.chat.ChatReceiveEvent; +import net.labymod.core.main.LabyMod; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiChat; +import tmb.randy.tmbgriefergames.core.Addon; +import tmb.randy.tmbgriefergames.v1_12_2.util.VersionisedBridge; + +public class MsgTabs { + + private static String currentChatPartner = null; + + public void chatMessageReceived(ChatReceiveEvent event) { + if(!Addon.getSharedInstance().configuration().getChatConfig().getMsgTabMode().get()) + return; + + currentChatPartner = getChatPartnerName(event.chatMessage().getPlainText()); + if(currentChatPartner != null) { + getTabForName(event.chatMessage().getPlainText()); + + if(!VersionisedBridge.isChatGuiOpen() && event.chatMessage().getPlainText().contains("[mir -> ")) { + Minecraft.getMinecraft().displayGuiScreen(new GuiChat()); + } + } + } + + public void messageSend(ChatMessageSendEvent event) { + if(!Addon.getSharedInstance().configuration().getChatConfig().getMsgTabMode().get() || event.getMessage().startsWith("/msg") || event.getMessage().startsWith("7msg") || event.getMessage().startsWith("(msg")) + return; + + ChatWindow mainWindow = getChatWindow(); + if(mainWindow != null) { + if(mainWindow.getActiveTab().getName().startsWith("➥ ")) { + String currentReciever = mainWindow.getActiveTab().getName().replace("➥ ", ""); + if(currentReciever.length() >= 3) { + String[] messageSplit = event.getMessage().split(" "); + if(messageSplit[0].startsWith("/") && !messageSplit[0].equalsIgnoreCase("/msg") && !messageSplit[0].equalsIgnoreCase("7msg") && !messageSplit[0].equalsIgnoreCase("(msg") + && !messageSplit[0].equalsIgnoreCase("/r") && !messageSplit[0].equalsIgnoreCase("7r") && !messageSplit[0].equalsIgnoreCase("(r")) { + return; + } + if(messageSplit[0].equalsIgnoreCase("/r") || messageSplit[0].equalsIgnoreCase("7r") || messageSplit[0].equalsIgnoreCase("(r")) { + int firstSpaceIndex = event.getMessage().indexOf(" "); + if (firstSpaceIndex != -1) { + if(currentReciever.equals(currentChatPartner)) { + event.changeMessage("/r " + event.getMessage().substring(firstSpaceIndex + 1)); + } else { + event.changeMessage(mainWindow.getActiveTab().getName().replace("➥", "/msg") + " " + event.getMessage().substring(firstSpaceIndex + 1)); + } + } + } else if(!(messageSplit[0].equalsIgnoreCase("/msg") || messageSplit[0].equalsIgnoreCase("7msg") || messageSplit[0].equalsIgnoreCase("(msg"))) { + if(currentReciever.equals(currentChatPartner)) { + event.changeMessage("/r " + event.getMessage()); + } else { + event.changeMessage(mainWindow.getActiveTab().getName().replace("➥", "/msg") + " " + event.getMessage()); + } + } + } + } + } + } + + public ChatTab createTabForPlayer(String message) { + ChatWindow mainWindow = getChatWindow(); + if(mainWindow != null) { + + String name = getChatPartnerName(message); + String rank = getChatPartnerRank(message); + + String incomingFilter = "[" + rank + " ┃ " + name + " -> mir]"; + String outgoingFilter = "[mir -> " + rank + " ┃ " + name + "]"; + + RootChatTabConfig tabConfig = new RootChatTabConfig(Type.CUSTOM, "➥ " + name); + ChatTab tab = mainWindow.initializeTab(tabConfig); + + ChatFilter filterOutgoingMsg = new ChatFilter(); + filterOutgoingMsg.name().set("outgoing /msg"); + filterOutgoingMsg.getIncludedTags().add(outgoingFilter); + filterOutgoingMsg.shouldPlaySound().set(false); + filterOutgoingMsg.caseSensitive().set(true); + + ChatFilter filterIncomingMsg = new ChatFilter(); + filterIncomingMsg.name().set("incoming /msg"); + filterIncomingMsg.getIncludedTags().add(incomingFilter); + filterIncomingMsg.shouldPlaySound().set(true); + filterIncomingMsg.caseSensitive().set(true); + + tab.config().filters().get().add(filterOutgoingMsg); + tab.config().filters().get().add(filterIncomingMsg); + + return tab; + } + return null; + } + + private ChatTab getTabForName(String message) { + String chatPartner = getChatPartnerName(message); + ChatTab output = null; + + ChatWindow mainWindow = getChatWindow(); + if(mainWindow != null) { + for (ChatTab tab : mainWindow.getTabs()) { + if(tab.getName().equals("➥ " + chatPartner)) { + output = tab; + break; + } + } + + if(output == null) { + output = createTabForPlayer(message); + } + } + + return output; + } + + private ChatWindow getChatWindow() { + if(Addon.getSharedInstance().configuration().getChatConfig().getMsgTabMode().get()) { + for (ChatWindow window : LabyMod.references().advancedChatController().getWindows()) { + if (window.isMainWindow()) { + return window; + } + } + } + return null; + } + + private String getChatPartnerName(String message) { + String[] split = message.split(" "); + if(split.length >= 5) { + if(split[0].equals("[mir") && split[1].equals("->")) { + return split[4].replace("]", ""); + } else if(split[3].equals("->") && split[4].equals("mir]")) { + return split[2]; + } + } + + return null; + } + + private String getChatPartnerRank(String message) { + String[] split = message.split(" "); + if(split.length >= 5) { + if(split[0].equals("[mir") && split[1].equals("->")) { + return split[2]; + } else if(split[3].equals("->") && split[4].equals("mir]")) { + return split[0].replace("[", ""); + } + } + + return null; + } + + public static void resetCurrentChatPartner() { + currentChatPartner = null; + } +} diff --git a/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/chat/TypeCorrection.java b/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/chat/TypeCorrection.java index d124e7d..8738f4e 100644 --- a/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/chat/TypeCorrection.java +++ b/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/chat/TypeCorrection.java @@ -50,11 +50,10 @@ public class TypeCorrection { put("(p h ", "/p h "); put("t/p h ", "/p h "); - put("version", "v3rsion"); - put("Version", "V3rsion"); - put("ordner", "0rdner"); - put("Ordner", "0rdner"); + put("7tpahere", "/tpahere"); + put("(tpahere", "/tpahere"); + put("t/tpahere", "/tpahere"); put("/p t ", "/p trust "); diff --git a/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/click/ClickManager.java b/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/click/ClickManager.java index bb3b12f..f23f3e5 100644 --- a/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/click/ClickManager.java +++ b/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/click/ClickManager.java @@ -66,6 +66,21 @@ public void dropItemsFromInventory(Item item, boolean skipFirst) { } } + public void dropItemsFromInventory(Item item, int metadata, boolean skipFirst) { + Container container = Minecraft.getMinecraft().player.openContainer; + int size = container.inventorySlots.size(); + for(int i = 9; i < size; i++) { + if(container.getSlot(i).getHasStack()) { + if(container.getSlot(i).getStack().getItem().equals(item) && container.getSlot(i).getStack().getMetadata() == metadata) { + if(skipFirst && i == 36) { + continue; + } + dropClick(i); + } + } + } + } + public void queueClicks(QueueType queueType, LinkedList queue) { queues.get(queueType).queueClicks(queue); diff --git a/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/AccountUnity.java b/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/AccountUnity.java index 542d19e..34a2f6d 100644 --- a/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/AccountUnity.java +++ b/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/AccountUnity.java @@ -9,11 +9,10 @@ public class AccountUnity { public void messageReceived(ChatReceiveEvent event) { - for (Account account : LabyMod.getInstance().getAccountManager().getAccounts()) { String name = account.getUsername(); if(event.chatMessage().getPlainText().endsWith(name + " möchte sich zu dir teleportieren.") || event.chatMessage().getPlainText().endsWith(name + " möchte, dass du dich zu der Person teleportierst.")) { - Laby.labyAPI().minecraft().chatExecutor().chat("/tpaccept"); + VersionisedBridge.sendCommand("/tpaccept"); } } } diff --git a/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/AutoCrafterNew.java b/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/AutoCrafterNew.java index 34d918a..e095544 100644 --- a/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/AutoCrafterNew.java +++ b/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/AutoCrafterNew.java @@ -30,6 +30,7 @@ private enum STATE { private int cooldown; private final LinkedList toSend = new LinkedList<>(); private Item itemToCraft; + private int subIDtoCraft = 0; private STATE currentState = STATE.OPEN_RECEIPTS; private boolean active; @@ -52,7 +53,7 @@ public void onTickEvent(GameTickEvent event) { currentState = STATE.OPEN_CRAFT_PAGE; } } else { - Minecraft.getMinecraft().thePlayer.sendChatMessage("/rezepte"); + VersionisedBridge.sendCommand("/rezepte"); } } case OPEN_CRAFT_PAGE -> { @@ -82,6 +83,7 @@ public void onTickEvent(GameTickEvent event) { case CRAFT -> { if(itemToCraft == null) { itemToCraft = Minecraft.getMinecraft().thePlayer.openContainer.getSlot(25).getStack().getItem(); + subIDtoCraft = Minecraft.getMinecraft().thePlayer.openContainer.getSlot(25).getStack().getMetadata(); } if(getSlotCountOfItemInInventory() >= 27) { @@ -119,7 +121,7 @@ public void onTickEvent(GameTickEvent event) { Minecraft.getMinecraft().thePlayer.closeScreen(); currentState = STATE.OPEN_RECEIPTS; } else { - ClickManager.getSharedInstance().dropItemsFromInventory(itemToCraft, true); + ClickManager.getSharedInstance().dropItemsFromInventory(itemToCraft, subIDtoCraft, true); } } } @@ -259,6 +261,7 @@ public void startCrafter() { active = true; if(Minecraft.getMinecraft().thePlayer.inventory.getStackInSlot(0) != null) { itemToCraft = Minecraft.getMinecraft().thePlayer.inventory.getStackInSlot(0).getItem(); + subIDtoCraft = Minecraft.getMinecraft().thePlayer.inventory.getStackInSlot(0).getMetadata(); } currentState = STATE.OPEN_RECEIPTS; } @@ -267,6 +270,7 @@ public void startCrafter() { public void stopCrafter() { active = false; itemToCraft = null; + subIDtoCraft = 0; currentState = STATE.OPEN_RECEIPTS; } @@ -282,7 +286,7 @@ private int getSlotCountOfItemInInventory() { if(itemStack == null) continue; - if(itemStack.getItem().equals(itemToCraft)) { + if(itemStack.getItem().equals(itemToCraft) && itemStack.getMetadata() == subIDtoCraft) { count++; } } @@ -294,7 +298,7 @@ private int getSlotForItemToCraft() { for (int i = 54; i < slotCount; i++) { ItemStack stack = Minecraft.getMinecraft().thePlayer.openContainer.getSlot(i).getStack(); if(stack != null) { - if(stack.getItem().equals(itemToCraft)) { + if(stack.getItem().equals(itemToCraft) && stack.getMetadata() == subIDtoCraft) { return i; } } diff --git a/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/AutoDecomp.java b/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/AutoDecomp.java new file mode 100644 index 0000000..e081a15 --- /dev/null +++ b/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/AutoDecomp.java @@ -0,0 +1,252 @@ +package tmb.randy.tmbgriefergames.v1_8_9.util; + +import net.labymod.api.client.gui.screen.key.Key; +import net.labymod.api.event.Phase; +import net.labymod.api.event.client.input.KeyEvent; +import net.labymod.api.event.client.lifecycle.GameTickEvent; +import net.labymod.api.util.I18n; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.inventory.GuiCrafting; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.ContainerWorkbench; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import tmb.randy.tmbgriefergames.core.Addon; +import tmb.randy.tmbgriefergames.core.enums.QueueType; +import tmb.randy.tmbgriefergames.v1_8_9.util.click.Click; +import tmb.randy.tmbgriefergames.v1_8_9.util.click.ClickManager; + +public class AutoDecomp { + + private boolean autoDecompActive = false; + private Item compItem; + private int compSubID; + private int counter; + + public void onKeyEvent(KeyEvent event) { + if(Key.ESCAPE.isPressed() && autoDecompActive) { + stopDecomp(); + } else if (Addon.areKeysPressed(Addon.getSharedInstance().configuration().getAutoCrafterConfig().getAutoDecompHotkey().get())) { + startDecomp(); + Addon.getSharedInstance().displayNotification(I18n.getTranslation("tmbgriefergames.autoDecomp.started")); + } + } + + public void onTickEvent(GameTickEvent event) { + if (event.phase() == Phase.PRE && autoDecompActive + && Minecraft.getMinecraft().thePlayer != null && Minecraft.getMinecraft().theWorld != null) { + counter++; + + if( counter >= 5) { + decomp(); + counter = 0; + } + } + } + + private void decomp() { + if (Minecraft.getMinecraft().thePlayer.openContainer != null + && Minecraft.getMinecraft().currentScreen instanceof GuiCrafting) { + Container container = Minecraft.getMinecraft().thePlayer.openContainer; + + if (ClickManager.getSharedInstance().isClickQueueEmpty(QueueType.MEDIUM)) { + if (compItem == null) { + if (Minecraft.getMinecraft().thePlayer.inventory.mainInventory[0] != null && Minecraft.getMinecraft().thePlayer.inventory.mainInventory[0].stackSize > 0) { + compItem = Minecraft.getMinecraft().thePlayer.inventory.mainInventory[0].getItem(); + compSubID = Minecraft.getMinecraft().thePlayer.inventory.mainInventory[0].getMetadata(); + } + } else { + //Do Decomp + + if (container.getSlot(0).getHasStack()) { + ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, + new Click(container.windowId, 0, 0, 1)); + } else if (doesCraftingFieldContainItems()) { + for (int i = 1; i < 10; i++) { + if (container.getSlot(i).getHasStack()) { + ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, + new Click(container.windowId, i, 0, 1)); + } + } + } else { + int[] compSteps = getCompCountForItem(); + if (compSteps[0] > 0) { + dropUncompressedItems(); + } else if (compSteps[1] > 0) { + int slot = getBestSlotForCompStep(1); + if (slot >= 10) { + ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, new Click(container.windowId, slot, 0, 0)); + ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, new Click(container.windowId, 5, 0, 0)); + } + } else if (compSteps[2] > 0) { + int slot = getBestSlotForCompStep(2); + if (slot >= 10) { + ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, new Click(container.windowId, slot, 0, 0)); + ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, new Click(container.windowId, 5, 0, 0)); + } + } else if (compSteps[3] > 0) { + int slot = getBestSlotForCompStep(3); + if (slot >= 10) { + ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, new Click(container.windowId, slot, 0, 0)); + ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, new Click(container.windowId, 5, 0, 0)); + } + } else if (compSteps[4] > 0) { + int slot = getBestSlotForCompStep(4); + if (slot >= 10) { + ClickManager.getSharedInstance().addClick( + QueueType.MEDIUM, new Click(container.windowId, slot, 0, 0)); + ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, new Click(container.windowId, 5, 0, 0)); + } + } else if (compSteps[5] > 0) { + int slot = getBestSlotForCompStep(5); + if (slot >= 10) { + ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, new Click(container.windowId, slot, 0, 0)); + ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, new Click(container.windowId, 5, 0, 0)); + } + } else if (compSteps[6] > 0) { + int slot = getBestSlotForCompStep(6); + if (slot >= 10) { + ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, new Click(container.windowId, slot, 0, 0)); + ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, new Click(container.windowId, 5, 0, 0)); + } + } else if (compSteps[7] > 0) { + int slot = getBestSlotForCompStep(7); + if (slot >= 10) { + ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, new Click(container.windowId, slot, 0, 0)); + ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, new Click(container.windowId, 5, 0, 0)); + } + } + } + } + } + } else { + if (VersionisedBridge.canSendCommand()) { + VersionisedBridge.sendCommand("/craft"); + } + } + } + + public void startDecomp() { + autoDecompActive = true; + } + + public void stopDecomp() { + autoDecompActive = false; + compItem = null; + compSubID = 0; + } + + private int[] getCompCountForItem() { + int[] output = new int[8]; + + for (ItemStack itemStack : Minecraft.getMinecraft().thePlayer.inventory.mainInventory) { + if (itemStack != null && itemStack.stackSize > 0) { + if (itemStack.getItem().equals(compItem) && itemStack.getMetadata() == compSubID) { + if (itemStack.hasDisplayName()) { + if (itemStack.getDisplayName().endsWith(" VII")) { + output[7]++; + } else if (itemStack.getDisplayName().endsWith(" VI")) { + output[6]++; + } else if (itemStack.getDisplayName().endsWith(" V")) { + output[5]++; + } else if (itemStack.getDisplayName().endsWith(" IV")) { + output[4]++; + } else if (itemStack.getDisplayName().endsWith(" III")) { + output[3]++; + } else if (itemStack.getDisplayName().endsWith(" II")) { + output[2]++; + } else if (itemStack.getDisplayName().endsWith(" I")) { + output[1]++; + } else { + output[0]++; + } + } else { + output[0]++; + } + } + } + } + return output; + } + + private boolean doesCraftingFieldContainItems() { + if (Minecraft.getMinecraft().thePlayer.openContainer instanceof ContainerWorkbench) { + for (int i = 1; i < 10; i++) { + if (Minecraft.getMinecraft().thePlayer.openContainer.getSlot(i).getHasStack()) { + return true; + } + } + } + return false; + } + + private void dropUncompressedItems() { + if (Minecraft.getMinecraft().thePlayer.openContainer instanceof ContainerWorkbench) { + for (int i = 10; i < 46; i++) { + if (Minecraft.getMinecraft().thePlayer.openContainer.getSlot(i).getHasStack()) { + if (Minecraft.getMinecraft().thePlayer.openContainer.getSlot(i).getStack().getItem().equals(compItem) && Minecraft.getMinecraft().thePlayer.openContainer.getSlot(i).getStack().getMetadata() == compSubID) { + if (!Minecraft.getMinecraft().thePlayer.openContainer.getSlot(i).getStack() + .hasDisplayName()) { + ClickManager.getSharedInstance().dropClick(i); + } + } + } + } + } + } + + private int getBestSlotForCompStep(int step) { + String romanian = getRomanianNumberForInt(step); + int lowestSlot = 0; + ItemStack lowestItemStack = null; + + if (Minecraft.getMinecraft().thePlayer.openContainer instanceof ContainerWorkbench) { + for (int i = 10; i < Minecraft.getMinecraft().thePlayer.openContainer.inventorySlots.size(); i++) { + if (Minecraft.getMinecraft().thePlayer.openContainer.inventorySlots.get(i).getHasStack()) { + if (Minecraft.getMinecraft().thePlayer.openContainer.inventorySlots.get(i).getStack().getItem().equals(compItem) && Minecraft.getMinecraft().thePlayer.openContainer.inventorySlots.get(i).getStack().getMetadata() == compSubID) { + if (Minecraft.getMinecraft().thePlayer.openContainer.inventorySlots.get(i) + .getStack().hasDisplayName()) { + if (Minecraft.getMinecraft().thePlayer.openContainer.inventorySlots.get(i) + .getStack().getDisplayName().endsWith(" " + romanian)) { + if (lowestItemStack == null) { + lowestItemStack = Minecraft.getMinecraft().thePlayer.openContainer.inventorySlots.get( + i).getStack(); + lowestSlot = i; + } else if (lowestItemStack.stackSize + > Minecraft.getMinecraft().thePlayer.openContainer.inventorySlots.get( + i).getStack().stackSize) { + lowestItemStack = Minecraft.getMinecraft().thePlayer.openContainer.inventorySlots.get( + i).getStack(); + lowestSlot = i; + } + } + } + } + } + } + } + + return lowestSlot; + } + + private String getRomanianNumberForInt(int number) { + switch (number) { + case 1: + return "I"; + case 2: + return "II"; + case 3: + return "III"; + case 4: + return "IV"; + case 5: + return "V"; + case 6: + return "VI"; + case 7: + return "VII"; + default: + return ""; + } + } +} \ No newline at end of file diff --git a/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/AutoHopper.java b/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/AutoHopper.java index 0fc65e0..bb2ebd8 100644 --- a/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/AutoHopper.java +++ b/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/AutoHopper.java @@ -79,17 +79,23 @@ public void tick(GameTickEvent event) { } boolean clicked = false; - if (ClickManager.getSharedInstance().isClickQueueEmpty(QueueType.MEDIUM)) { - if (Addon.getSharedInstance().configuration().getHopperSubConfig().getFilterItem().get() && ( - chest.getSlot(28).getStack() != null && Item.getIdFromItem(chest.getSlot(28).getStack().getItem()) != - Item.getIdFromItem(getItemForSlot72(chest))) && - !(Item.getIdFromItem(chest.getSlot(28).getStack().getItem()) == 166 && - !chest.getSlot(72).getHasStack())) { - ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, new Click(chest.windowId, 72, 0, 1)); - clicked = true; + if (ClickManager.getSharedInstance().isClickQueueEmpty(QueueType.MEDIUM) && chest.getSlot(28).getHasStack()) { + if (Addon.getSharedInstance().configuration().getHopperSubConfig().getFilterItem().get()) { + + if(chest.getSlot(72).getHasStack()) { + if(((!chest.getSlot(28).getStack().getItem().equals(chest.getSlot(72).getStack().getItem())) && + !(Block.getBlockFromItem(chest.getSlot(28).getStack().getItem()) == Blocks.barrier && !chest.getSlot(72).getHasStack())) || + (chest.getSlot(28).getStack().getMetadata() != chest.getSlot(72).getStack().getMetadata())) { + ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, new Click(chest.windowId, 72, 0, 1)); + clicked = true; + } + } else if(!(Block.getBlockFromItem(chest.getSlot(28).getStack().getItem()) == Blocks.barrier)) { + ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, new Click(chest.windowId, 72, 0, 1)); + clicked = true; + } } - if (Addon.getSharedInstance().configuration().getHopperSubConfig().getRadius().get() > -1 && !receivedPlotBorderMessage && !clicked) { + if (Addon.getSharedInstance().configuration().getHopperSubConfig().getRadius().get() > -1 && !receivedPlotBorderMessage && !clicked) { if (Addon.getSharedInstance().configuration().getHopperSubConfig().getRadius().get() == 0) { if (chest.getSlot(30).getStack() != null && Item.getIdFromItem(chest.getSlot(30).getStack().getItem()) == 397) { ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, new Click(chest.windowId, 30, 0, 1)); diff --git a/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/CBTracker.java b/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/CBTracker.java index e79fad7..2a7f506 100644 --- a/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/CBTracker.java +++ b/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/CBTracker.java @@ -61,7 +61,7 @@ public void run() { Addon.getSharedInstance().getBridge().cbChanged(); if(currentCB.equals("Lobby") && Addon.getSharedInstance().configuration().getSkipHub().get()) { - Laby.labyAPI().minecraft().chatExecutor().chat("/portal"); + VersionisedBridge.sendCommand("/portal"); } } } diff --git a/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/NatureBordersRenderer.java b/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/NatureBordersRenderer.java index bdb8e14..2f046d5 100644 --- a/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/NatureBordersRenderer.java +++ b/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/NatureBordersRenderer.java @@ -2,6 +2,7 @@ import net.labymod.api.event.client.input.KeyEvent; import net.labymod.api.event.client.render.world.RenderWorldEvent; +import net.labymod.api.util.Color; import net.labymod.api.util.I18n; import net.minecraft.block.material.Material; import net.minecraft.client.Minecraft; @@ -154,12 +155,17 @@ public void onRender(RenderWorldEvent event) { GL11.glPushMatrix(); Tessellator tesselator = Tessellator.getInstance(); WorldRenderer render = tesselator.getWorldRenderer(); - Vector3f hsv = this.RGB2HSV(this.lineRed, this.lineGreen, this.lineBlue); - Vector3f rgb = this.HSV2RGB((hsv.x + 0.01F) % 1.0F, hsv.y, hsv.z); - this.lineRed = rgb.x; - this.lineGreen = rgb.y; - this.lineBlue = rgb.z; - GL11.glColor4f(rgb.x, rgb.y, rgb.z, 0.35F); + if(Addon.getSharedInstance().configuration().getNatureSubConfig().getRainbow().get()) { + Vector3f hsv = this.RGB2HSV(this.lineRed, this.lineGreen, this.lineBlue); + Vector3f rgb = this.HSV2RGB((hsv.x + 0.01F) % 1.0F, hsv.y, hsv.z); + this.lineRed = rgb.x; + this.lineGreen = rgb.y; + this.lineBlue = rgb.z; + GL11.glColor4f(rgb.x, rgb.y, rgb.z, 0.35F); + } else { + Color color = Color.of(Addon.getSharedInstance().configuration().getNatureSubConfig().getBorderColor().get()); + GL11.glColor4f(((float) color.getRed())/255, ((float) color.getGreen())/255, ((float) color.getBlue())/255, 0.35F); + } render.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION); int rad = 16 * Addon.getSharedInstance().configuration().getNatureSubConfig().getBorderRadius().get(); int hrf = rad / 2; diff --git a/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/VersionisedBridge.java b/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/VersionisedBridge.java index 62ba606..b5b5dc1 100644 --- a/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/VersionisedBridge.java +++ b/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/VersionisedBridge.java @@ -1,6 +1,7 @@ package tmb.randy.tmbgriefergames.v1_8_9.util; import net.labymod.api.Laby; +import net.labymod.api.client.gui.screen.activity.types.IngameOverlayActivity; import net.labymod.api.event.Phase; import net.labymod.api.event.Priority; import net.labymod.api.event.Subscribe; @@ -26,6 +27,7 @@ import tmb.randy.tmbgriefergames.v1_8_9.util.chat.ChatCleaner; import tmb.randy.tmbgriefergames.v1_8_9.util.chat.CooldownNotifier; import tmb.randy.tmbgriefergames.v1_8_9.util.chat.EmptyLinesRemover; +import tmb.randy.tmbgriefergames.v1_8_9.util.chat.MsgTabs; import tmb.randy.tmbgriefergames.v1_8_9.util.chat.NewsBlocker; import tmb.randy.tmbgriefergames.v1_8_9.util.chat.PaymentValidator; import tmb.randy.tmbgriefergames.v1_8_9.util.chat.StreamerMute; @@ -40,6 +42,7 @@ public class VersionisedBridge implements IBridge { private final CooldownNotifier cooldownNotifier = new CooldownNotifier(); private final EmptyLinesRemover emptyLinesRemover = new EmptyLinesRemover(); private final NewsBlocker newsBlocker = new NewsBlocker(); + private final MsgTabs msgTabs = new MsgTabs(); private final PaymentValidator paymentValidator = new PaymentValidator(); private final StreamerMute streamerMute = new StreamerMute(); private final TypeCorrection typeCorrection = new TypeCorrection(); @@ -56,10 +59,14 @@ public class VersionisedBridge implements IBridge { private final AccountUnity accountUnity = new AccountUnity(); private final AutoCrafterNew autoCrafterNew = new AutoCrafterNew(); private final AutoCrafter autoCrafter = new AutoCrafter(); + private final AutoDecomp autoDecomp = new AutoDecomp(); private final AutoComp autoComp = new AutoComp(); private GuiScreen lastGui; + private static final int commandCountdownLimit = 20; + private static int commandCountdown = 0; + @Subscribe public void worldLoadEvent(WorldLoadEvent event) { // No checking for isGG as the function to auto skip the lobby/hub wouldn't work as the server adress is set too late. @@ -80,6 +87,7 @@ public void messageReceived(ChatReceiveEvent event) { playerTracer.messageReceived(event); autoHopper.messageReceived(event); accountUnity.messageReceived(event); + msgTabs.chatMessageReceived(event); } @Subscribe @@ -87,6 +95,7 @@ public void messageSend(ChatMessageSendEvent event) { if(!Addon.isGG()) return; + msgTabs.messageSend(event); cooldownNotifier.messageReceived(event); typeCorrection.messageSend(event); plotSwitch.messageSend(event); @@ -139,6 +148,9 @@ public void tick(GameTickEvent event) { itemShifter.tick(event); plotSwitch.tick(event); autoCrafterNew.onTickEvent(event); + autoDecomp.onTickEvent(event); + + commandCountdown(); } @Subscribe @@ -153,6 +165,7 @@ public void keyDown(KeyEvent event) { autoComp.onKeyEvent(event); autoCrafter.onKeyEvent(event); autoCrafterNew.onKeyEvent(event); + autoDecomp.onKeyEvent(event); } @Subscribe @@ -228,4 +241,36 @@ public boolean isCompActive() { return autoComp.isCompActive(); } + private static void commandCountdown() { + if (commandCountdown > 0) { + commandCountdown--; + } + } + + public static boolean canSendCommand() { return commandCountdown <= 0; } + public static boolean sendCommand(String command) { + if(canSendCommand()) { + Minecraft.getMinecraft().thePlayer.sendChatMessage(command); + commandCountdown = commandCountdownLimit; + return true; + } + return false; + } + + public static boolean isGUIOpen() { + GuiScreen currentScreen = Minecraft.getMinecraft().currentScreen; + + // Check if a GUI is open and if it is a chest GUI + return currentScreen instanceof GuiChest || currentScreen instanceof GuiInventory || currentScreen instanceof GuiCrafting; + } + + public static boolean isChatGuiOpen() { + for (IngameOverlayActivity activity : Laby.labyAPI().ingameOverlay().getActivities()) { + if(activity.isAcceptingInput()) { + return true; + } + } + + return false; + } } diff --git a/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/chat/ChatCleaner.java b/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/chat/ChatCleaner.java index fee6d4a..ee7d756 100644 --- a/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/chat/ChatCleaner.java +++ b/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/chat/ChatCleaner.java @@ -21,7 +21,10 @@ public class ChatCleaner { "[GrieferGames] Du wurdest zum Grundstück teleportiert.", "[GrieferGames] Deine Tageszeit wurde vom Grundstück aktualisiert.", "[GrieferGames] Deine Tageszeit wurde wiederhergestellt.", - "[GrieferGames] Bitte warte 15 Sekunden zwischen jedem Join-Versuch." + "[GrieferGames] Bitte warte 15 Sekunden zwischen jedem Join-Versuch.", + "------------ [ Server-Status ] ------------", + "Ergriffene Maßnahmen:", + "Versuche in den Portalraum zu verbinden." ); public void messageReceived(ChatReceiveEvent event) { diff --git a/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/chat/MsgTabs.java b/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/chat/MsgTabs.java new file mode 100644 index 0000000..9553408 --- /dev/null +++ b/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/chat/MsgTabs.java @@ -0,0 +1,163 @@ +package tmb.randy.tmbgriefergames.v1_8_9.util.chat; + +import net.labymod.api.client.chat.filter.ChatFilter; +import net.labymod.api.configuration.labymod.chat.ChatTab; +import net.labymod.api.configuration.labymod.chat.ChatWindow; +import net.labymod.api.configuration.labymod.chat.config.RootChatTabConfig; +import net.labymod.api.configuration.labymod.chat.config.RootChatTabConfig.Type; +import net.labymod.api.event.client.chat.ChatMessageSendEvent; +import net.labymod.api.event.client.chat.ChatReceiveEvent; +import net.labymod.core.main.LabyMod; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiChat; +import tmb.randy.tmbgriefergames.core.Addon; +import tmb.randy.tmbgriefergames.v1_8_9.util.VersionisedBridge; + +public class MsgTabs { + + private static String currentChatPartner = null; + + public void chatMessageReceived(ChatReceiveEvent event) { + if(!Addon.getSharedInstance().configuration().getChatConfig().getMsgTabMode().get()) + return; + + currentChatPartner = getChatPartnerName(event.chatMessage().getPlainText()); + if(currentChatPartner != null) { + getTabForName(event.chatMessage().getPlainText()); + + if(!VersionisedBridge.isChatGuiOpen() && event.chatMessage().getPlainText().contains("[mir -> ")) { + Minecraft.getMinecraft().displayGuiScreen(new GuiChat()); + } + } + } + + public void messageSend(ChatMessageSendEvent event) { + if(!Addon.getSharedInstance().configuration().getChatConfig().getMsgTabMode().get() || event.getMessage().startsWith("/msg") || event.getMessage().startsWith("7msg") || event.getMessage().startsWith("(msg")) + return; + + ChatWindow mainWindow = getChatWindow(); + if(mainWindow != null) { + if(mainWindow.getActiveTab().getName().startsWith("➥ ")) { + String currentReciever = mainWindow.getActiveTab().getName().replace("➥ ", ""); + if(currentReciever.length() >= 3) { + String[] messageSplit = event.getMessage().split(" "); + if(messageSplit[0].startsWith("/") && !messageSplit[0].equalsIgnoreCase("/msg") && !messageSplit[0].equalsIgnoreCase("7msg") && !messageSplit[0].equalsIgnoreCase("(msg") + && !messageSplit[0].equalsIgnoreCase("/r") && !messageSplit[0].equalsIgnoreCase("7r") && !messageSplit[0].equalsIgnoreCase("(r")) { + return; + } + if(messageSplit[0].equalsIgnoreCase("/r") || messageSplit[0].equalsIgnoreCase("7r") || messageSplit[0].equalsIgnoreCase("(r")) { + int firstSpaceIndex = event.getMessage().indexOf(" "); + if (firstSpaceIndex != -1) { + if(currentReciever.equals(currentChatPartner)) { + event.changeMessage("/r " + event.getMessage().substring(firstSpaceIndex + 1)); + } else { + event.changeMessage(mainWindow.getActiveTab().getName().replace("➥", "/msg") + " " + event.getMessage().substring(firstSpaceIndex + 1)); + } + } + } else if(!(messageSplit[0].equalsIgnoreCase("/msg") || messageSplit[0].equalsIgnoreCase("7msg") || messageSplit[0].equalsIgnoreCase("(msg"))) { + if(currentReciever.equals(currentChatPartner)) { + event.changeMessage("/r " + event.getMessage()); + } else { + event.changeMessage(mainWindow.getActiveTab().getName().replace("➥", "/msg") + " " + event.getMessage()); + } + } + } + } + } + } + + public ChatTab createTabForPlayer(String message) { + ChatWindow mainWindow = getChatWindow(); + if(mainWindow != null) { + + String name = getChatPartnerName(message); + String rank = getChatPartnerRank(message); + + String incomingFilter = "[" + rank + " ┃ " + name + " -> mir]"; + String outgoingFilter = "[mir -> " + rank + " ┃ " + name + "]"; + + RootChatTabConfig tabConfig = new RootChatTabConfig(Type.CUSTOM, "➥ " + name); + ChatTab tab = mainWindow.initializeTab(tabConfig); + + ChatFilter filterOutgoingMsg = new ChatFilter(); + filterOutgoingMsg.name().set("outgoing /msg"); + filterOutgoingMsg.getIncludedTags().add(outgoingFilter); + filterOutgoingMsg.shouldPlaySound().set(false); + filterOutgoingMsg.caseSensitive().set(true); + + ChatFilter filterIncomingMsg = new ChatFilter(); + filterIncomingMsg.name().set("incoming /msg"); + filterIncomingMsg.getIncludedTags().add(incomingFilter); + filterIncomingMsg.shouldPlaySound().set(true); + filterIncomingMsg.caseSensitive().set(true); + + tab.config().filters().get().add(filterOutgoingMsg); + tab.config().filters().get().add(filterIncomingMsg); + + return tab; + } + return null; + } + + private ChatTab getTabForName(String message) { + String chatPartner = getChatPartnerName(message); + ChatTab output = null; + + ChatWindow mainWindow = getChatWindow(); + if(mainWindow != null) { + for (ChatTab tab : mainWindow.getTabs()) { + if(tab.getName().equals("➥ " + chatPartner)) { + output = tab; + break; + } + } + + if(output == null) { + output = createTabForPlayer(message); + } + } + + return output; + } + + private ChatWindow getChatWindow() { + if(Addon.getSharedInstance().configuration().getChatConfig().getMsgTabMode().get()) { + for (ChatWindow window : LabyMod.references().advancedChatController().getWindows()) { + if (window.isMainWindow()) { + return window; + } + } + } + return null; + } + + private String getChatPartnerName(String message) { + String[] split = message.split(" "); + if(split.length >= 5) { + if(split[0].equals("[mir") && split[1].equals("->")) { + return split[4].replace("]", ""); + } else if(split[3].equals("->") && split[4].equals("mir]")) { + return split[2]; + } + } + + return null; + } + + private String getChatPartnerRank(String message) { + String[] split = message.split(" "); + if(split.length >= 5) { + if(split[0].equals("[mir") && split[1].equals("->")) { + return split[2]; + } else if(split[3].equals("->") && split[4].equals("mir]")) { + return split[0].replace("[", ""); + } + } + + return null; + } + + public static void resetCurrentChatPartner() { + currentChatPartner = null; + } +} diff --git a/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/chat/TypeCorrection.java b/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/chat/TypeCorrection.java index 880c0e6..693c5e7 100644 --- a/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/chat/TypeCorrection.java +++ b/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/chat/TypeCorrection.java @@ -49,11 +49,13 @@ public class TypeCorrection { put("(p h ", "/p h "); put("t/p h ", "/p h "); - put("version", "v3rsion"); - put("Version", "V3rsion"); + put("7tpaccept", "/tpaccept"); + put("(tpaccept", "/tpaccept"); + put("t/tpaccept", "/tpaccept"); - put("ordner", "0rdner"); - put("Ordner", "0rdner"); + put("7tpahere", "/tpahere"); + put("(tpahere", "/tpahere"); + put("t/tpahere", "/tpahere"); put("/p t ", "/p trust "); diff --git a/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/click/ClickManager.java b/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/click/ClickManager.java index b9da342..824bbb3 100644 --- a/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/click/ClickManager.java +++ b/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/click/ClickManager.java @@ -64,6 +64,21 @@ public void dropItemsFromInventory(Item item, boolean skipFirst) { } } + public void dropItemsFromInventory(Item item, int metadata, boolean skipFirst) { + Container container = Minecraft.getMinecraft().thePlayer.openContainer; + int size = container.inventorySlots.size(); + for(int i = 9; i < size; i++) { + if(container.getSlot(i).getHasStack()) { + if(container.getSlot(i).getStack().getItem().equals(item) && container.getSlot(i).getStack().getMetadata() == metadata) { + if(skipFirst && i == 36) { + continue; + } + dropClick(i); + } + } + } + } + public void queueClicks(QueueType queueType, LinkedList queue) { queues.get(queueType).queueClicks(queue); diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 37aef8d..48c0a02 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip -networkTimeout=10000 +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/settings.gradle.kts b/settings.gradle.kts index 3c2f335..7483ebb 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,7 +1,7 @@ rootProject.name = "griefergames-addon-by-tmb" pluginManagement { - val labyGradlePluginVersion = "0.3.44" + val labyGradlePluginVersion = "0.3.48" plugins { id("net.labymod.gradle") version (labyGradlePluginVersion) }