From bda9fe5612f820394750c321088effa8c4f30daf Mon Sep 17 00:00:00 2001 From: tmbRandy Date: Sun, 28 Jul 2024 19:14:21 +0200 Subject: [PATCH] Added auto crafter V3, half automatic sword (HABK) and full automatic sword (VABK). --- README.md | 5 +- build.gradle.kts | 2 +- .../tmb/randy/tmbgriefergames/core/Addon.java | 7 +- .../randy/tmbgriefergames/core/IBridge.java | 1 + ...ftCommand.java => AutocraftV2Command.java} | 6 +- .../core/commands/AutocraftV3Command.java | 20 + .../core/config/AutoCrafterSubConfig.java | 28 +- .../core/config/ChatSubConfig.java | 1 - .../core/config/Configuration.java | 11 +- .../core/config/SwordsSubConfig.java | 35 + .../core/widgets/NearbyWidget.java | 3 +- .../assets/tmbgriefergames/i18n/de_de.json | 232 ++++--- .../assets/tmbgriefergames/i18n/en_us.json | 83 ++- .../tmbgriefergames/textures/settings.png | Bin 54608 -> 57316 bytes .../themes/fancy/textures/settings.png | Bin 54608 -> 57316 bytes .../themes/vanilla/textures/settings.png | Bin 54608 -> 57316 bytes .../v1_12_2/util/AccountUnity.java | 3 +- .../AutoCrafterV1.java} | 7 +- .../AutoCrafterV2.java} | 8 +- .../util/AutoCrafter/AutoCrafterV3.java | 639 +++++++++++++++++ .../util/AutoCrafter/StuckProtection.java | 32 + .../v1_12_2/util/AutoHopper.java | 1 - .../tmbgriefergames/v1_12_2/util/HABK.java | 60 ++ .../v1_12_2/util/ItemClearTimerListener.java | 1 - .../v1_12_2/util/ItemSaver.java | 46 +- .../v1_12_2/util/ItemShifter.java | 7 +- .../v1_12_2/util/NatureBordersRenderer.java | 2 - .../v1_12_2/util/PlotSwitch.java | 6 - .../tmbgriefergames/v1_12_2/util/VABK.java | 80 +++ .../v1_12_2/util/VersionisedBridge.java | 35 +- .../v1_12_2/util/chat/ChatCleaner.java | 1 - .../v1_12_2/util/chat/CooldownNotifier.java | 1 - .../v1_12_2/util/chat/EmptyLinesRemover.java | 1 - .../v1_12_2/util/chat/MsgTabs.java | 4 +- .../v1_12_2/util/chat/NewsBlocker.java | 1 - .../v1_12_2/util/chat/PaymentValidator.java | 1 - .../v1_12_2/util/chat/StreamerMute.java | 1 - .../v1_12_2/util/chat/TypeCorrection.java | 1 - .../v1_8_9/util/AccountUnity.java | 3 +- .../AutoCrafterV1.java} | 7 +- .../AutoCrafterV2.java} | 7 +- .../util/AutoCrafter/AutoCrafterV3.java | 642 ++++++++++++++++++ .../util/AutoCrafter/StuckProtection.java | 33 + .../tmbgriefergames/v1_8_9/util/HABK.java | 59 ++ .../v1_8_9/util/ItemSaver.java | 43 +- .../v1_8_9/util/ItemShifter.java | 6 +- .../v1_8_9/util/PlotSwitch.java | 1 - .../tmbgriefergames/v1_8_9/util/VABK.java | 75 ++ .../v1_8_9/util/VersionisedBridge.java | 35 +- .../v1_8_9/util/chat/MsgTabs.java | 3 +- 50 files changed, 2066 insertions(+), 220 deletions(-) rename core/src/main/java/tmb/randy/tmbgriefergames/core/commands/{AutocraftCommand.java => AutocraftV2Command.java} (72%) create mode 100644 core/src/main/java/tmb/randy/tmbgriefergames/core/commands/AutocraftV3Command.java create mode 100644 core/src/main/java/tmb/randy/tmbgriefergames/core/config/SwordsSubConfig.java rename game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/{AutoCrafter.java => AutoCrafter/AutoCrafterV1.java} (98%) rename game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/{AutoCrafterNew.java => AutoCrafter/AutoCrafterV2.java} (98%) create mode 100644 game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/AutoCrafter/AutoCrafterV3.java create mode 100644 game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/AutoCrafter/StuckProtection.java create mode 100644 game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/HABK.java create mode 100644 game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/VABK.java rename game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/{AutoCrafter.java => AutoCrafter/AutoCrafterV1.java} (98%) rename game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/{AutoCrafterNew.java => AutoCrafter/AutoCrafterV2.java} (98%) create mode 100644 game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/AutoCrafter/AutoCrafterV3.java create mode 100644 game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/AutoCrafter/StuckProtection.java create mode 100644 game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/HABK.java create mode 100644 game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/VABK.java diff --git a/README.md b/README.md index b5ed437..c15640d 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,10 @@ Komprimiert die kleinen Stufen häufiger: I, I, II, I, I, II, I , I, II, III, I, Ö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. +Arbeitet wesentlich schneller, als V1. 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. + +### Autocrafter V3 +Der effektivste Autocrafter. Stelle in deinere Nähe für jedes Item, welches das Rezept benötigt eine Truhe oder endloeses Lager auf. Lege das Item, welches gecraftet werden soll in den ersten Slot deiner Hotbar. Gib nun den Befehl /craftV3 ein. Das /rezepte Menü wird kurz geöffnet und wieder geschlossen. Nun wurden alle benötigten Materialien erfasst. Öffne nun nacheinander alle Truhen, in denen sich die Zutaten für das Rezept befinden. Die Truhen werden automatisch wieder geschlossen, sobald diese erfasst wurden. Sobald für jedes benötigte Material eine Truhe erkannt wurde, wird automatisch gecraftet. Das Addon öffnet automatisch die Kisten und entnimmt sich die Materialien in dem Verhältnis, wie es das Rezept vorgibt. Anschließend wird alles über das /rezepte Menü gecraftet. Die fertigen Items können entweder gedroppt oder komprimiert werden. Funktioniert perfekt mit endlosen Lagern. Für Items, die nicht in endlosen Lagern untergebracht werden können, kannst du eine normale Truhe nehmen und diese durch mehrere Trichter befüllen lassen. ### 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 und optisch anpassen. diff --git a/build.gradle.kts b/build.gradle.kts index 2d1943e..b573cf8 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -5,7 +5,7 @@ plugins { } group = "tmb.randy" -version = "1.4" +version = "1.5" java.toolchain.languageVersion.set(JavaLanguageVersion.of(17)) diff --git a/core/src/main/java/tmb/randy/tmbgriefergames/core/Addon.java b/core/src/main/java/tmb/randy/tmbgriefergames/core/Addon.java index bd663c0..6492fb7 100644 --- a/core/src/main/java/tmb/randy/tmbgriefergames/core/Addon.java +++ b/core/src/main/java/tmb/randy/tmbgriefergames/core/Addon.java @@ -3,9 +3,9 @@ import net.labymod.api.Laby; import net.labymod.api.addon.LabyAddon; import net.labymod.api.client.gui.screen.activity.types.IngameOverlayActivity; -import net.labymod.api.client.gui.screen.key.Key; import net.labymod.api.models.addon.annotation.AddonMain; -import tmb.randy.tmbgriefergames.core.commands.AutocraftCommand; +import tmb.randy.tmbgriefergames.core.commands.AutocraftV2Command; +import tmb.randy.tmbgriefergames.core.commands.AutocraftV3Command; import tmb.randy.tmbgriefergames.core.commands.DKsCommand; import tmb.randy.tmbgriefergames.core.commands.EjectCommand; import tmb.randy.tmbgriefergames.core.commands.PayAllCommand; @@ -36,7 +36,8 @@ protected void enable() { this.registerCommand(new DKsCommand()); this.registerCommand(new PayAllCommand()); this.registerCommand(new PlayerTracerCommand()); - this.registerCommand(new AutocraftCommand()); + this.registerCommand(new AutocraftV2Command()); + this.registerCommand(new AutocraftV3Command()); this.registerCommand(new EjectCommand()); gameInfoWidget = new GameInfoWidget(); diff --git a/core/src/main/java/tmb/randy/tmbgriefergames/core/IBridge.java b/core/src/main/java/tmb/randy/tmbgriefergames/core/IBridge.java index b8650be..786d1eb 100644 --- a/core/src/main/java/tmb/randy/tmbgriefergames/core/IBridge.java +++ b/core/src/main/java/tmb/randy/tmbgriefergames/core/IBridge.java @@ -13,4 +13,5 @@ public interface IBridge { boolean isCompActive(); void changeSlot(int slot); void startAuswurf(); + void startAutocrafterV3(); } diff --git a/core/src/main/java/tmb/randy/tmbgriefergames/core/commands/AutocraftCommand.java b/core/src/main/java/tmb/randy/tmbgriefergames/core/commands/AutocraftV2Command.java similarity index 72% rename from core/src/main/java/tmb/randy/tmbgriefergames/core/commands/AutocraftCommand.java rename to core/src/main/java/tmb/randy/tmbgriefergames/core/commands/AutocraftV2Command.java index 7d69715..6460d40 100644 --- a/core/src/main/java/tmb/randy/tmbgriefergames/core/commands/AutocraftCommand.java +++ b/core/src/main/java/tmb/randy/tmbgriefergames/core/commands/AutocraftV2Command.java @@ -3,14 +3,16 @@ import net.labymod.api.client.chat.command.Command; import tmb.randy.tmbgriefergames.core.Addon; -public class AutocraftCommand extends Command { +public class AutocraftV2Command extends Command { - public AutocraftCommand() { + public AutocraftV2Command() { super("autocraft"); } @Override public boolean execute(String prefix, String[] arguments) { + if(!Addon.isGG()) + return false; Addon.getSharedInstance().getBridge().startNewAutocrafter(); diff --git a/core/src/main/java/tmb/randy/tmbgriefergames/core/commands/AutocraftV3Command.java b/core/src/main/java/tmb/randy/tmbgriefergames/core/commands/AutocraftV3Command.java new file mode 100644 index 0000000..6bfa406 --- /dev/null +++ b/core/src/main/java/tmb/randy/tmbgriefergames/core/commands/AutocraftV3Command.java @@ -0,0 +1,20 @@ +package tmb.randy.tmbgriefergames.core.commands; + +import net.labymod.api.client.chat.command.Command; +import tmb.randy.tmbgriefergames.core.Addon; + +public class AutocraftV3Command extends Command { + + public AutocraftV3Command() { + super("craftV3"); + } + + @Override + public boolean execute(String prefix, String[] arguments) { + if(!Addon.isGG()) + return false; + + Addon.getSharedInstance().getBridge().startAutocrafterV3(); + return true; + } +} \ 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 c6d8739..33a422a 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 @@ -2,14 +2,19 @@ import net.labymod.api.client.gui.screen.key.Key; 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.dropdown.DropdownWidget.DropdownSetting; import net.labymod.api.configuration.loader.Config; import net.labymod.api.configuration.loader.property.ConfigProperty; +import net.labymod.api.configuration.settings.annotation.SettingSection; import tmb.randy.tmbgriefergames.core.enums.AutoCrafterNewFinalAction; import tmb.randy.tmbgriefergames.core.enums.QueueType; public class AutoCrafterSubConfig extends Config { + + @SettingSection("v1") + @DropdownSetting private final ConfigProperty autoCraftSpeed = new ConfigProperty<>(QueueType.FAST); @@ -22,8 +27,20 @@ public class AutoCrafterSubConfig extends Config { @SwitchSetting private final ConfigProperty onlyFullStacks = new ConfigProperty<>(false); + @SettingSection("v2") + @DropdownSetting - private final ConfigProperty finalAction = new ConfigProperty<>(AutoCrafterNewFinalAction.COMP); + private final ConfigProperty finalActionV2 = new ConfigProperty<>(AutoCrafterNewFinalAction.COMP); + + @SettingSection("v3") + + @DropdownSetting + private final ConfigProperty finalActionV3 = new ConfigProperty<>(AutoCrafterNewFinalAction.COMP); + + @SliderSetting(min = 0, max = 80) + private final ConfigProperty delay = new ConfigProperty(0); + + @SettingSection("autocomp") @MultiKeyBindSetting private final ConfigProperty autoCompHotkey = new ConfigProperty<>(new Key[]{Key.ARROW_LEFT, Key.ARROW_UP, Key.ARROW_RIGHT}); @@ -35,16 +52,13 @@ public class AutoCrafterSubConfig extends Config { public ConfigProperty getAutoDrop() { return this.autoDrop; } - public ConfigProperty getEndlessMode() { return this.endlessMode; } - public ConfigProperty getOnlyFullStacks() { return this.onlyFullStacks; } - - public ConfigProperty getFinalAction() { return finalAction; } - + public ConfigProperty getFinalActionV2() { return finalActionV2; } public ConfigProperty getAutoCompHotkey() {return autoCompHotkey;} - public ConfigProperty getAutoDecompHotkey() {return autoDecompHotkey;} + public ConfigProperty getFinalActionV3() {return finalActionV3;} + public ConfigProperty getDelay() {return delay;} } \ 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 a8282e1..974f2e9 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,7 +1,6 @@ package tmb.randy.tmbgriefergames.core.config; import net.labymod.api.client.gui.screen.widget.widgets.input.SwitchWidget.SwitchSetting; -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; diff --git a/core/src/main/java/tmb/randy/tmbgriefergames/core/config/Configuration.java b/core/src/main/java/tmb/randy/tmbgriefergames/core/config/Configuration.java index eda5f04..f6ee09c 100644 --- a/core/src/main/java/tmb/randy/tmbgriefergames/core/config/Configuration.java +++ b/core/src/main/java/tmb/randy/tmbgriefergames/core/config/Configuration.java @@ -20,6 +20,7 @@ public Configuration() { this.hopperSubConfig = new HopperSubConfig(); this.natureSubConfig = new NatureSubConfig(); this.autoCrafterConfig = new AutoCrafterSubConfig(); + this.swordsSubConfig = new SwordsSubConfig(); } @SwitchSetting @@ -42,13 +43,16 @@ public Configuration() { @SpriteSlot(size = 21, x = 3, y = 1) private final TooltipSubConfig tooltipConfig; + @SpriteSlot(size = 21, x = 2, y = 2) + private final HopperSubConfig hopperSubConfig; + + @SpriteSlot(size = 21, x = 1, y = 3) + private final SwordsSubConfig swordsSubConfig; + @SwitchSetting @SpriteSlot(size = 21, x = 4, y = 2) private final ConfigProperty skipHub = new ConfigProperty<>(true); - @SpriteSlot(size = 21, x = 2, y = 2) - private final HopperSubConfig hopperSubConfig; - @SettingSection("plotSwitch") @MultiKeyBindSetting @@ -73,4 +77,5 @@ public ConfigProperty getItemProtection() { public HopperSubConfig getHopperSubConfig() {return hopperSubConfig;} public NatureSubConfig getNatureSubConfig() {return natureSubConfig;} public AutoCrafterSubConfig getAutoCrafterConfig() {return autoCrafterConfig;} + public SwordsSubConfig getSwordsSubConfig() {return swordsSubConfig;} } diff --git a/core/src/main/java/tmb/randy/tmbgriefergames/core/config/SwordsSubConfig.java b/core/src/main/java/tmb/randy/tmbgriefergames/core/config/SwordsSubConfig.java new file mode 100644 index 0000000..0f78e8e --- /dev/null +++ b/core/src/main/java/tmb/randy/tmbgriefergames/core/config/SwordsSubConfig.java @@ -0,0 +1,35 @@ +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.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.configuration.loader.Config; +import net.labymod.api.configuration.loader.property.ConfigProperty; +import net.labymod.api.configuration.settings.annotation.SettingSection; + +public class SwordsSubConfig extends Config { + + @SettingSection("habk") + + @SwitchSetting + private final ConfigProperty HABKenabled = new ConfigProperty<>(false); + @SliderSetting(min = 100, max = 5000, steps = 100) + private final ConfigProperty HABKcooldown = new ConfigProperty<>(1000); + + @SettingSection("vabk") + + @SliderSetting(min = 3, max = 40, steps = 1) + private final ConfigProperty VABKloadTime = new ConfigProperty<>(16); + @SliderSetting(min = 3, max = 40, steps = 1) + private final ConfigProperty VABKswitchCooldown = new ConfigProperty<>(18); + @MultiKeyBindSetting + private final ConfigProperty VABKhotkey = new ConfigProperty<>(new Key[]{Key.L_SHIFT, Key.V}); + + public ConfigProperty getHABKenabled() { return this.HABKenabled; } + public ConfigProperty getHABKcooldown() { return this.HABKcooldown; } + + public ConfigProperty getVABKloadTime() { return VABKloadTime; } + public ConfigProperty getVABKswitchCooldown() { return VABKswitchCooldown; } + public ConfigProperty getVABKhotkey() { return VABKhotkey; } +} diff --git a/core/src/main/java/tmb/randy/tmbgriefergames/core/widgets/NearbyWidget.java b/core/src/main/java/tmb/randy/tmbgriefergames/core/widgets/NearbyWidget.java index 245cad9..a94e2ce 100644 --- a/core/src/main/java/tmb/randy/tmbgriefergames/core/widgets/NearbyWidget.java +++ b/core/src/main/java/tmb/randy/tmbgriefergames/core/widgets/NearbyWidget.java @@ -30,7 +30,8 @@ public class NearbyWidget extends TextHudWidget { "Datenschutz", "Jobs", "Block des Tages", - "GS-Bewertungen" + "GS-Bewertungen", + "Auktionshaus" ); private String name; 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 f99027b..e7d3155 100644 --- a/core/src/main/resources/assets/tmbgriefergames/i18n/de_de.json +++ b/core/src/main/resources/assets/tmbgriefergames/i18n/de_de.json @@ -43,7 +43,7 @@ "hopperSubConfig": { "name": "Trichter", "description": "Einstellungen für die automatische Einstellung von Trichtern.", - "filterItem":{ + "filterItem": { "name": "Filteritem festlegen", "description": "Legt das erste Item in deiner Hotbar als Filteritem fest." }, @@ -63,6 +63,37 @@ "name": "Automatisch sneaken bei Rechtsklick" } }, + "swordsSubConfig": { + "name": "Automatische Klinge", + "description": "Lege deine Bonze oder BIRTH Klinge in den ersten, deine Pfeile in den zweiten und einen Bogen in den dritten Hotbar Slot. Nachdem du einen Schuss mit dem Bogen abgegeben hast, wird sofort die Klinge in die Hand genommen und nach einem eingestellten Cooldown wieder der Bogen ausgewählt.", + "HABKenabled": { + "name": "Aktiviert" + }, + "HABKcooldown": { + "name": "Wechsel-Cooldown", + "description": "Der Cooldown bis wieder auf den Bogen gewechselt wird in Millisekunden" + }, + "VABKloadTime": { + "name": "Spannzeit", + "description": "Höhere Werte lassen den Pfeil weiter fliegen. Niedrige Werte erhöhen die Schussrate deutlich." + }, + "VABKswitchCooldown": { + "name": "Wechsel-Cooldown", + "description": "Die Zeit, bis der nächste Schuss geladen wird" + }, + "VABKhotkey": { + "name": "Hotkey", + "description": "Mit dieser Tastenkombination kannst du die vollautomatische Bonzeklinge ein- und ausschalten." + }, + "header": { + "habk": { + "name": "Halbautomatische Klinge (HABK)" + }, + "vabk": { + "name": "Vollautomatische Klinge (VABK)" + } + } + }, "chatConfig": { "name": "Chat", "typeCorrection": { @@ -124,116 +155,151 @@ "name": "Vorheriges Plot", "description": "Springe zum vorherigen GS des Spielers (/p h -1)" }, - "skipHub":{ + "skipHub": { "name": "Lobby überspringen" }, "autoCrafterConfig": { "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" + "name": "Geschwindigkeit" }, "autoDrop": { - "name": "[V1] Automatisch droppen" + "name": "Automatisch droppen" }, "endlessMode": { - "name": "[V1] Endlosmodus", + "name": "Endlosmodus", "description": "Kann mit ENTER Ein- oder Ausgeschaltet werden. Ist diese Option deaktiviert, muss ENTER manuell gedrückt werden, um eine Portion zu craften." }, "onlyFullStacks": { - "name": "[V1] Nur ganze Stacks nehmen" + "name": "Nur ganze Stacks nehmen" }, - "finalAction": { - "name": "[V2] Schlussaktion", + "finalActionV2": { + "name": "Schlussaktion", "description": "Legt fest, ob bei Nutzung des Autocrafters V2 (/autocraft) die gecrafteten Items aus dem Inventar geworfen oder komprimiert werden sollen." }, + "finalActionV3": { + "name": "Schlussaktion", + "description": "Legt fest, ob bei Nutzung des Autocrafters V3 (/craftV3) die gecrafteten Items aus dem Inventar geworfen oder komprimiert werden sollen." + }, "autoCompHotkey": { "name": "Hotkey für Autokomprimierer" }, "autoDecompHotkey": { "name": "Hotkey für Autodekomprimierer" + }, + "delay": { + "name": "Verzögerung", + "description": "Wenn es zu Problemen kommt, erhöhe die Verzögerung um den Crafter zu verlangsamen." + }, + "header": { + "v1": { + "name": "V1 (/craft)" + }, + "v2": { + "name": "V2 (/autocraft)" + }, + "v3": { + "name": "V3 (/craftV3)" + }, + "autocomp": { + "name": "Autokomprimierer" + } } } }, - "chat": { - "realMoney": "VERIFIZIERT", - "fakeMoney": "FAKE MONEY", - "cooldownWand": "Der Cooldown für /wand ist abgelaufen.", - "cooldownRand": "Der Cooldown für /rand ist abgelaufen.", - "cooldownBoden": "Der Cooldown für /boden ist abgelaufen.", - "cooldownSign": "Der Cooldown für /sign ist abgelaufen.", - "cooldownAnticopy": "Der Cooldown für /anticopy ist abgelaufen.", - "cooldownAushöhlen": "Der Cooldown für /aushöhlen ist abgelaufen." - }, - "itemSaver": { - "item_saver_message_sword": "Dieses Schwert ist zu wertvoll, um es zu benutzen!", - "item_saver_message_sos": "Diesen Kürbis zu setzen wäre ein gruselig teurer Spaß!", - "item_saver_message_birth_bow": "Manche Bögen sind zum Schießen da. Dieser hier eher nicht!" - }, - "tooltip": { - "compressedTooltip": "§6%s §eDKs §6%s §e Stacks §6%s §eItems", - "adventurerTooltip": "§6 %s%% §f| §eRest: §6 %s §eDKs §6 %s §eStacks §6 %s §eItems" - }, - "payAll": { - "amountTooLow": "Der abgerundete Betrag pro Spieler liegt bei 0$!", - "response": "%s Spieler * %s$ = %s$." - }, - "playerTracer": { - "startedHopping": "CB Hopping gestartet", - "lookingForPlayer": "Fahndung nach Spieler %s läuft...", - "tooManyArguments": "Zu viele Argumente!", - "foundPlayer": "Spieler gefunden!", - "tracingEnded": "Fahndung beendet." - }, - "flyTimer": { - "flyPotion": "Flugtrank", - "flyPotionUsed": "Flugtrank benutzt.", - "flyPotionExpired": "Flugtrank abgelaufen." - }, - "itemRemover": { - "itemRemover": "Item remover" - }, - "nearby": { - "nearby": "In der Nähe" - }, - "gameInfo": { - "cb": "CB", - "money": "Geld", - "playtime": "Spielzeit", - "players": "Spieler" - }, - "natureBorders": { - "plotBordersVisible": "Plotgrenzen §a§lSICHTBAR", - "plotBordersInvisible": "Plotgrenzen §c§lUNSICHTBAR" - }, - "hudWidget": { - "flytimer": { - "name": "Flugtrank Timer" + "chat": { + "realMoney": "VERIFIZIERT", + "fakeMoney": "FAKE MONEY", + "cooldownWand": "Der Cooldown für /wand ist abgelaufen.", + "cooldownRand": "Der Cooldown für /rand ist abgelaufen.", + "cooldownBoden": "Der Cooldown für /boden ist abgelaufen.", + "cooldownSign": "Der Cooldown für /sign ist abgelaufen.", + "cooldownAnticopy": "Der Cooldown für /anticopy ist abgelaufen.", + "cooldownAushöhlen": "Der Cooldown für /aushöhlen ist abgelaufen." + }, + "itemSaver": { + "item_saver_message_sword": "Dieses Schwert ist zu wertvoll, um es zu benutzen!", + "item_saver_message_sos": "Diesen Kürbis zu setzen wäre ein gruselig teurer Spaß!", + "item_saver_message_birth_bow": "Manche Bögen sind zum Schießen da. Dieser hier eher nicht!" + }, + "tooltip": { + "compressedTooltip": "§6%s §eDKs §6%s §e Stacks §6%s §eItems", + "adventurerTooltip": "§6 %s%% §f| §eRest: §6 %s §eDKs §6 %s §eStacks §6 %s §eItems" }, - "itemclear": { - "name": "Item remover" + "payAll": { + "amountTooLow": "Der abgerundete Betrag pro Spieler liegt bei 0$!", + "response": "%s Spieler * %s$ = %s$." }, - "gameinfo": { - "name": "Spielinfo" + "playerTracer": { + "startedHopping": "CB Hopping gestartet", + "lookingForPlayer": "Fahndung nach Spieler %s läuft...", + "tooManyArguments": "Zu viele Argumente!", + "foundPlayer": "Spieler gefunden!", + "tracingEnded": "Fahndung beendet." + }, + "flyTimer": { + "flyPotion": "Flugtrank", + "flyPotionUsed": "Flugtrank benutzt.", + "flyPotionExpired": "Flugtrank abgelaufen." + }, + "itemRemover": { + "itemRemover": "Item remover" }, "nearby": { - "name": "In der Nähe" + "nearby": "In der Nähe" + }, + "gameInfo": { + "cb": "CB", + "money": "Geld", + "playtime": "Spielzeit", + "players": "Spieler" + }, + "natureBorders": { + "plotBordersVisible": "Plotgrenzen §a§lSICHTBAR", + "plotBordersInvisible": "Plotgrenzen §c§lUNSICHTBAR" + }, + "hudWidget": { + "flytimer": { + "name": "Flugtrank Timer" + }, + "itemclear": { + "name": "Item remover" + }, + "gameinfo": { + "name": "Spielinfo" + }, + "nearby": { + "name": "In der Nähe" + } + }, + "autoComp": { + "list": "Liste #" + }, + "autoDecomp": { + "started": "Dekomprimiere..." + }, + "autoCrafter": { + "recipeSaved": "Rezept gespeichert", + "active": "Endlosmodus §a§lAKTIV", + "inactive": "Endlosmodus §c§lDEAKTIVIERT", + "recipeSavedV3": "Rezept gespeichert. Öffne jetzt nacheinander alle Kisten für das Quellamterial!", + "noItemFound": "Lege erst das zu craftende Item in deinen ersten Slot!", + "startedCrafting": "Alle benötigten Materialien wurden erfasst. Crafte...", + "setChestForMaterial": "Quellkiste für %s festgelegt.", + "mixedChest": "Die Kiste enthält verschiedene Items und kann daher nicht als Quellkiste verwendet werden.", + "V3started": "Autocrafter V3 gestartet...", + "V3stopped": "Autocrafter V3 beendet.", + "noSourceFound": "Keine Quellkiste gefunden." + }, + "eject": { + "enabled": "Auswurf §a§lAKTIVIERT. §fÖffne ein unendliches Lager!", + "disabled": "Auswurf §c§lDEAKTIVIERT" + }, + "autoSword": { + "enabled": "VABK §aAKTIVIERT. §fÖffne den Chat, um automatisch zu schießen.", + "disabled": "VABK §4DEAKTIVIERT" } - }, - "autoComp": { - "list": "Liste #" - }, - "autoDecomp": { - "started": "Dekomprimiere..." - }, - "autoCrafter": { - "recipeSaved": "Rezept gespeichert", - "active": "Endlosmodus §a§lAKTIV", - "inactive": "Endlosmodus §c§lDEAKTIVIERT" - }, - "eject": { - "enabled": "Auswurf §a§lAKTIVIERT. §fÖffne ein unendliches Lager!", - "disabled": "Auswurf §c§lDEAKTIVIERT" } - } + } \ No newline at end of file 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 e5676e5..7dc4dd0 100644 --- a/core/src/main/resources/assets/tmbgriefergames/i18n/en_us.json +++ b/core/src/main/resources/assets/tmbgriefergames/i18n/en_us.json @@ -63,6 +63,37 @@ "name": "Auto sneak when right clicking." } }, + "swordsSubConfig": { + "name": "automatic sword", + "description": "Put your Bonze or BIRTH sword into your first slot, your arrows into your second slot and a bow into the third slot of your hotbar. After you fired an arrow, the sword will be selected and after a set cooldown the bow will be selected again.", + "HABKenabled": { + "name": "active" + }, + "HABKcooldown": { + "name": "switch cooldown", + "description": "The time in ms until the bow will be selected." + }, + "VABKloadTime": { + "name": "loading time", + "description": "the higher the value, the higher the arrow will fly. Lower values increase the shot rate by far," + }, + "VABKswitchCooldown": { + "name": "switch cooldown", + "description": "The time until the next arrow will be loaded." + }, + "VABKhotkey": { + "name": "hotkey", + "description": "With this hotkey you can toggle the full automatic sword." + }, + "header": { + "habk": { + "name": "half automatic Bonze sword (HABK)" + }, + "vabk": { + "name": "full automatic Bonze sword (VABK)" + } + } + }, "skipHub":{ "name": "Skip the hub" }, @@ -131,27 +162,49 @@ "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" + "name": "Speed" }, "autoDrop": { - "name": "[V1] Auto-drop" + "name": "Auto-drop" }, "endlessMode": { - "name": "[V1] Endless mode", + "name": "Endless mode", "description": "Can be toggled on or off with ENTER. If this option is disabled, ENTER must be manually pressed to craft a batch." }, "onlyFullStacks": { - "name": "[V1] Take only full stacks" + "name": "Take only full stacks" }, - "finalAction": { - "name": "[V2] Final action", + "finalActionV2": { + "name": "Final action", "description": "Specifies whether, when using Autocrafter V2 (/autocraft), the crafted items should be dropped or compressed in the inventory." }, + "finalActionV3": { + "name": "Final action", + "description": "Specifies whether, when using Autocrafter V3 (/craftV3), the crafted items should be dropped or compressed in the inventory." + }, "autoCompHotkey": { "name": "Hotkey for auto-compressor" }, "autoDecompHotkey": { "name": "Hotkey for auto-decompressor" + }, + "delay": { + "name": "delay", + "description": "If it is buggy increase the delay to make it slower." + }, + "header": { + "v1": { + "name": "V1 (/craft)" + }, + "v2": { + "name": "V2 (/autocraft)" + }, + "v3": { + "name": "V3 (/craftV3)" + }, + "autocomp": { + "name": "auto compressor" + } } } }, @@ -229,11 +282,23 @@ "autoCrafter": { "recipeSaved": "Recipe saved", "active": "Endless mode §a§ACTIVE", - "inactive": "Endless mode §c§INACTIVE" + "inactive": "Endless mode §c§INACTIVE", + "recipeSavedV3": "Recipe saved! Now open all chests for the source material.", + "noItemFound": "Put the item you want to craft into the first slot.", + "startedCrafting": "Found all needed materials. Crafting...", + "setChestForMaterial": "Source chest for %s has been set.", + "mixedChest": "This chest contains several items and can't be used as source chest.", + "V3started": "Auto crafter V3 started...", + "V3stopped": "Autocrafter V3 stopped.", + "noSourceFound": "No source chest found." }, "eject": { - "enabled": "Eject §a§lACTIVE. §fOpen an endless chest!", - "disabled": "Eject §c§lINACTIVE" + "enabled": "Eject §a§lENABLED. §fOpen an endless chest!", + "disabled": "Eject §c§lDISABLED" + }, + "autoSword": { + "enabled": "VABK §a§lENABLED", + "disabled": "VABK §4§lDISABLED" } } } \ No newline at end of file diff --git a/core/src/main/resources/assets/tmbgriefergames/textures/settings.png b/core/src/main/resources/assets/tmbgriefergames/textures/settings.png index 86082fc108b755885a63497bb450e124f6cfc3f5..1da5cde19165ca99c7dafc2e2e8a1283c8452113 100644 GIT binary patch delta 10450 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� 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 delta 7743 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 TpM7+bpa2yGO;oA;^N{}m^A`~Q 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 86082fc108b755885a63497bb450e124f6cfc3f5..1da5cde19165ca99c7dafc2e2e8a1283c8452113 100644 GIT binary patch delta 10450 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� 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 delta 7743 zcmc(Dbx@RH)bG1X=PpV~u8Sxj(j^Tp9nv5vp_G(#zDvnUiik)fNG;t+cS=hmi=dJc z(tY{9x%ZE6?##V2-`tsdX5N3!JnwnV?|IJiJMpU(ZxoAH-VLP?dc@DCC%`YxCnC-- zkT4Eq`>&cRD4q_KONd7RNs9PSaraR0@(}m7d*LjF6yOsOdc^l%Ed&ub<2MFPWhd+s zu!18GQQFkKGA}U~cGP5KQ7SW^#M0`t zAto%s7QdyKa9@mO=ueyfy6WC~oH5b78p4*QGp^VS8^5Cq(;!$-i+|y59q*U2 z-qtUx$6x*S^z@m-TrZxdSJVDnjYH=7v@tlP_awOC{!cfB35}ojKW8a)t9%XXbyXCn z!$!iT8celL7N@Lfc;?ayc9Vwu#HjI=8p|d2qO4nuR5t7_eIGZk>uH{Tjk|nrAY4_C zs8DKR42A3By9##Rle-}2zhA}5+etnU$#B~8`ikjUzrM{>Urv=~$i4e4+U`1LiS%@! zSzO4_Y1tB@77(7`^ zxIWb;R-Mzv4X672cdW*5s`}9~x_Y85`emWUppZwEm7rS;c}$3yIOdxj+IdX?5045% zMXaKZF!MFgQEA@UYzp$f5))O>Dbw3X|9)I$P?GrlvFFHR{o{(4RaR1fV(FmNJJ!$X0loN|cO&f%gR8twm&eyDxt+RGqLO;G`K-C6 z(!}Tw{GqpLP&8jNAk>X3)NOB7gW(mlg?MJfJ@xkNG2~O%_{(#ZHCFGA@D5nSLY6D; z$o6`dj@)hZ`l|ypLITdx+<8tUz}|R?>^}395jwhiw|I04yOtOL;-&jc_g+CQ`O%oR zV?64A-D0=%dfam$vM8!IRN1O@@q)k8r62g6PX)M5dMEIjjKx94xdl`2L3DYwWXu_N zx8L}r*wwSTn$YAKEB?*81^HrtcozPb@D=z%{W%mgAkcE)U@M?}H=m^N2Yk-pyeQ?R z`NO%xcb$&6MJ(4HlOBdh_FSTSLlm6A5b!T^YiWy|Dyu;}lwG5SgC_7K2-0W)Qa0ii zh=twgjAmKYr7?U^aepE$vqX83bb0C?*kfdfjQ~j*(@#5FkeyYpY2b3{v-!Q-gp;%6 zDRh}p>H`SeSG*w#TQ(dcnDxuo$J;3hvEC!NDakAQ)PkSI!;6{w*(f^ijEOXNZ)ot2 z#U%PpZE4AV9dO0eR(|g|_HC%F0RO*KO`86`0bz6Wsx)Z7S$_XQuOE}u&R^h7eyg`R ziePWTKh#>w#fGng6fLeax|O2c>JS}$LZtFGtDE1>gWU9O=r_}2@MwNs)Hh@C3pUfB zJ5&x%OBybq%I?CKTfIX-d;!<~66y$*y-H6te^ti`wsIa554Vr zqb_^!{s?rdlcUZi0iym$acf_RI4mN#z~u9TJ6<$~OG0F6;poElFN#7PsIZnqyfq0B z2+DyG7h|?G?&&yzx53G=$0~A2M=tvZ!=_Ng@1AwW4M%sQ>MW`ujT+aO>^gsdNW#zc zi{nz*_mx=drPICQG*OEnXrS3n-m4LV+=uIfD|H6coY7R(B2&+2#}$nBGSuP+x;S5- zoh_64X?t`Gcpt2)t^IwJrN`YV7Shwe^pVFw{)rQ%c5c=;(C1q}ptUEC=CuyH!x9Ur zWLz$6OsVDV-?NPb`WWPjRuH!M+xEN3jxIR!#joz?J?Rp4mtR-c zxg7uM%E7a>IM_0IyA{llWJR>Om2s7;o%@&V{Lt1)G;1Op%94rS?Pis1-?Ip- zsfIsu)Xnz!Y}h(mz+u=~r7Nn%rrO&8e})AiE*^`}@|DV$TdFoN#!EO^@%swkt^SdC zRV8_qpplyA`F%lypxP(uBCFeO!|1D6uIw%im$WAzZba#{eu@ z0-dxKOk_|_L#4lJ)m(IMsJ3IcrFT!&OnUvBA%N5@Fz|}1%S_9&Cu^ABt)`@cbJ;OP z|K3wtUlkNsI8LK&_M?Z<=>`DSf zBC|L34!5oNWt`ZS#*+ec<-t=<{G8f+jl}4{s@P@w%oPeKU*eQ(RGWQUS7R9d-SK~6 z-WAtV{oWb(AZhIgzQ0PT+If{|F=Fn>mN-aR7=m<(;I1F3!a-7GxkE*HA))Q$i}GR- zylEgJ?qH>FEQp%y1u=SV!=bvmy6dni6!0yJR>m>oAB6yxc9v|cp!SZ}N%)i9PIz~A z#P+siLj##BYBWW|(vm0qYy<0aDf`9sVW^ckJktKR8 zK|FvKQt!5QR57l|WUU`$sCSKwb`?bLE$|)TaVSMbmqq>}R~JqtHbfT_>md6~6c%F{ zDhDuS_L_D#ub2?ref@iLE`owaAJlEL+RlSQs^~i7nBYoT$epLNyF&~ zIU=M(I5aPe61=oiy(+Ap3HqHcW6g;q&b6DfZj%ikA&|-s-amK=o%Es6Ha+eLee(hp zgw7JU`YlE{NGp=P>Ke4W&m2Z78o4hW9v{y7CXwI;?d2sq(>f3E4k8;D?dj$&4FGKo zwZnmR#r9u8vNi#Lm7yW9xSFch=pp#4{!AOVc4UfJz+b{~zI)7I{3|+omDArKmwh-l zb6RZV41W13r-oXw%5i%5DDk0T(41#NQsG=&;anYQ_(hz*pWjO%HuJ(dXBUm^V;P11 zf49X|<5KV8Ylb2Z_|BTHtmOdGdU!!&0a;u~o6-gUwZTAvOrS z$j`ikgo-)=1RdkaRQLgoI|Z+QfI@Bg`*^=W6Aqts8?NA~H^$$83Am~U;8B(+NCVGl zREX@H3lyI?(S}>y!OP7#8OmENcNvlJ!LbIB#_|`auqII&ZHd5@7=C55n_qXoS=$yT;B#wFINiW& zXOS6t@_Rg2&4PpaUu}NAZO=6^v!eu9eH6TK&HuTIM^&*d_DFyNO?ucNl_-q&Ao*dYKw+!8`R0RCwMN{)JpPzUGp)I7aMr>h{XrzeRXXL)Ng<+@%*IPui%YhtqmT9uH z|CUouqI&ryp27jlhvWRN-r?hiXRORhUY>`En&Q%4bNB#YG(F|J_EGpzCc&-@q`2c< zT!+fIqAX3x%H!b|c2&GqLxuo&L541(%EwpMIJ&U?M3hCh7jwPC`(!>W%JN%n;Q5ip z&Nwb%#?4XMZ^WYi#~gwV6&vKy^;;GCX{!F=noU&0D>`^`Jv-mx+uir@`iIm%TLws% zwavvX(`8U+yjOM#6WhVn48FjzveoS_iX9bxaK2 zbvSz(fU6ccOm`p(47Y>t;zsT4+3?HZ7tfoBzLGl;0LLvD;W(%mne5@H^^hg$bD%9_ zaMa7S_URw>cSp3;)!(mQlyC)F#F&RsNlV;k=ks*y8BLJNRZ@b~lji@V4necICfTJa zJNu}ysngrK>l+>ZZm@C)=wDK@eB@Di=Ob!a7^fv$a$`!r)#^a(D-{z*C{CuX|1oRF18hBzP7S*__#8M z=Jhb8Y*ZE$Vng&5W?@?YRycEGseBUeD8zHA24OnQ0uu!q#^THjuNpT$T_1P2h-*HE z&DqldQ#GD%>WV@8(+2=Z@%$0mGCV^`mC-WVS+{#I->+$a;)Cdzuk-#KrPR*+%-gU4 zDv||Q=udkjAT|V@FI!=#j-kX`=29Qx#D^FzaciNB?MXNga2)@i$uO0LkE;2LzI(yV z2@OAt9Yq<5n(5z@@91^QwFM*Pe+@a~!=D3$CV3l&LEzk!Idqo^y?XWUkJ>gT1q#O* zKF03LXj4f-r){&cIYlgI^OHW@@L$DcZYCnxbyO=!fr|)f4A{&L^W9E&X0 zYkElMul3D4=NEy`W;)v%ua9!RX|a(`1XfSLe7&@`a+jZqHDwCQ6UL#f=Y%cg9GP#I&%- zGd*&;SgdBsyVR2A{@BT!9Nj1vY>@`meets2k@cPYSt^;Px>%&VGAmE2u%t9od(J@^ zDJ{^C|B<&85A~Bs`{FyRG1JzT!e^t97;dKa35g@G>$ljTveuoDjdM!#`qZU!A_j4fk5$EIu8EYk9m}oB32Xm^2fc)&Bz|Rc<9V zzDsXf%Z}Vz*xsAMMFKObaC+PW0l2WsZVh!7o^8W4Zy1ux+KY;Gb4XYG#?%3H?v~(C_{A~Z`H4*<+0KP zT<3C(cavCeH29O=k-;oA5Q6Z~5W4598QWt1w&U#`e;mXV;fhp#XR0$`0a14)E~*^}rACKz3Pyw1|5BU3Wmne0u7ui^xdK@T*l^ zQV~T_(o}}4 zxer`qV2TZvwvGEK|+Os2E(0bZem}%q7 zQ?3GE`gbrtxnE5+jYNS2FnvzCooBOXy^goV8+lii$6x70yvYZ{B$uL-McD?8GzV#mYL~0wqWE6kq_gbAGv%M%PX{k zC&tw#!8Jp=L@{I6DAwO;&{?Xi;erEO?1sIL%^P3(8tY#bY|V~1yX-s@)FR)|A;~}X zHuzqbn=pJ_(k;kn?wnaMxlInBbhnzW9moaVZh!?$Q;zv*j{4WK`n>u@MbvXx+1Fj; zF;I(WCa=x(bj@^Mm118=?6wD6K2hNMg^9QKNXea7u&oc>D!e4ha|K@>-7CrVBy6CM z%+=!7p6rfY5rP&NW@!c&%T8$3YujmPVN4mZ+6wp3uy|P%v@41p##s#;rL38G7!ruA z1nFey(AnW1Cub@*56_jRN|Q}mQxi@`&uM>ou`>CTttw=Cb_Ial*&Cwfvq54q6RYhv zhaNNB%H|Y6!mRH(em^~Op`4TZbXG6>Pg)N-Xq&kDC#f$9x#Gi4>Anw+lF=c>a)C zf|N>MpP<;d$N=@d-YV|uw}N|~Nd)HqBz7AyDWuC+y(}7#69jq_y+@;)nL~-^18vKj zcWy`~u*6`v6v=^OnWF--C0)$sHc0u<-#cZGiYT}YdeZMC`a{w&nffi}&-*der#8Ss zSUuCidcZ!>^1emniJw4K01pb~{zhWpShwK&tXYi>36Hof&3M0V9Nvgi5CyZDnQ{Y9 zilf6jjr<25?;FL%v#@=66GjW8eA}5(#oc39K?gKZfGffBCc~#u6*yJ8CD_9u9U%mK z|BZd%u}_31Gt8jqbz6$K8`%Q$C)E$l3$Z5GdE0KxWY2dgOf{A@25tLbS6b5DF>u>| zY=4Q!y;ciGHP$3p0%@ZUb^pj6>|ac?`D>aMYw2&0HF-SyAFA z9;^HL9$S?=nd4U|)P8sLO*vdJ^m}w}6ulV05=6gj2VQfw_Mkv87K3?{8qb43n184V zXqW$TzrG+EgUOqUt^t6o&v}H?0c(|aBr>qeb>~M`gQaGIUh2r~iSB4Z0J0=Ltj=<) zR4^w=8Raqese%WAM5dU~0~pL7PC@{g?HdU}W9%}l00c56|9?}bR06vP;Kb9F)78vO zY!VwX+g{|wpbe|v+THKd(<_k=OFv5#Rq`1vok(EJ^)a@pI~QiFX!UI`|nhemfHxJmf9;Pg0V1F z7`Te3E9&Y_EM3Ex#6UhP;fl}aH@DKSF^Je52|5xq4cP0hKUt32J1hg4f!(g#PnVXX zcv;BFd(XewN(eo`{>}@Da&7@HL@m4Fyt1e_ zmlqx3WDuaN<&0}F=-g?+cQw89sPXb>{(&FK%|*_I;mLxaOv^zoujS?0Vf}W)rsBdX zwy0G82B|@rc}xUr5PjxJ*8|tziH6G;`y;)-lPqEl&3y^Hae<;YU0}?{#)fv>;kX*_ z&s5ySeeh@p7pKSN*-_iL-Qbv=B#RO%)8GL9W83nn_PtnwUNVxvS zk+J!C|BhNE7GL~i^_LxG8Yq-?sup19;-Z9%ZwnzH(`<0zO6-_4w1}CTo3osEaB$Gl z)eYU)a6sM6LjR+u`dnK}TT)VDRQ?=N3bvd%Y|Yof-lCSnE<+HX`q<%AL;e%yJdW$* zxjt*3BYGBW*PinN#pcZntfzfSt|L;%OK%vR+bBdA&`~@M#6*-#pGtMvktv3noWQFe z4KyaTui8DQ%_43BL4`G7|Ig4&tetrTLK7x$&<^)79CgQMKLJ7ueODW7*G}xMFde&ye!h(%1LwI4*72z*?RM9u`@o zANbyQs?@n^4z0hgP)db(K-My z>foJ?jSzmq!^1;*dV1NfrXb6nFasl_rFxV4&v+%4_JpU>kC%fsr^}S?C){z1h5%k$ zKcWo1U&$QdKHf0sXVAYHUFHpcOp4!(w4a3-#(t{-gT7au4`U#K%xo5i-otFVyB1Z2ZT6mDi z4i1|3Snq4=xIEVsBJ>UV+0?%YHx%>#Qo#S0#{L_&{(tYU``_^SfBlludnGex6?KRj TpM7+bpa2yGO;oA;^N{}m^A`~Q 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 86082fc108b755885a63497bb450e124f6cfc3f5..1da5cde19165ca99c7dafc2e2e8a1283c8452113 100644 GIT binary patch delta 10450 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� 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 delta 7743 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 TpM7+bpa2yGO;oA;^N{}m^A`~Q 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 7709fb3..e3fb53b 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 @@ -1,10 +1,9 @@ package tmb.randy.tmbgriefergames.v1_12_2.util; import net.labymod.accountmanager.storage.account.Account; -import net.labymod.api.Laby; import net.labymod.api.event.client.chat.ChatReceiveEvent; +// Unfortunately there is no LabyAPI for this so we must use the Core package :/ import net.labymod.core.main.LabyMod; -import tmb.randy.tmbgriefergames.core.Addon; public class AccountUnity { diff --git a/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/AutoCrafter.java b/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/AutoCrafter/AutoCrafterV1.java similarity index 98% rename from game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/AutoCrafter.java rename to game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/AutoCrafter/AutoCrafterV1.java index b883c13..16985b3 100644 --- a/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/AutoCrafter.java +++ b/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/AutoCrafter/AutoCrafterV1.java @@ -1,4 +1,4 @@ -package tmb.randy.tmbgriefergames.v1_12_2.util; +package tmb.randy.tmbgriefergames.v1_12_2.util.AutoCrafter; import net.labymod.api.client.gui.screen.key.Key; import net.labymod.api.event.client.input.KeyEvent; @@ -15,12 +15,13 @@ import org.apache.commons.lang3.ArrayUtils; import tmb.randy.tmbgriefergames.core.Addon; import tmb.randy.tmbgriefergames.core.enums.QueueType; +import tmb.randy.tmbgriefergames.v1_12_2.util.Simulator; import tmb.randy.tmbgriefergames.v1_12_2.util.click.Click; import tmb.randy.tmbgriefergames.v1_12_2.util.click.ClickManager; import java.util.HashMap; import java.util.LinkedList; -public class AutoCrafter +public class AutoCrafterV1 { private ContainerWorkbench inv; private int[] stored; @@ -33,7 +34,7 @@ public class AutoCrafter private Simulator simulator; private boolean endlessModeToggle = false; - public AutoCrafter() + public AutoCrafterV1() { this.stored = new int[9]; this.meta = new int[9]; 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/AutoCrafter/AutoCrafterV2.java similarity index 98% rename from game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/AutoCrafterNew.java rename to game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/AutoCrafter/AutoCrafterV2.java index ec1239f..34557b4 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/AutoCrafter/AutoCrafterV2.java @@ -1,4 +1,4 @@ -package tmb.randy.tmbgriefergames.v1_12_2.util; +package tmb.randy.tmbgriefergames.v1_12_2.util.AutoCrafter; import net.labymod.api.client.gui.screen.key.Key; import net.labymod.api.event.Phase; @@ -16,12 +16,12 @@ 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.VersionisedBridge; import tmb.randy.tmbgriefergames.v1_12_2.util.click.Click; import tmb.randy.tmbgriefergames.v1_12_2.util.click.ClickManager; import java.util.LinkedList; -import static tmb.randy.tmbgriefergames.core.enums.AutoCrafterNewFinalAction.*; -public class AutoCrafterNew { +public class AutoCrafterV2 { private enum STATE { OPEN_RECEIPTS, OPEN_CRAFT_PAGE, CRAFT, @@ -89,7 +89,7 @@ public void onTickEvent(GameTickEvent event) { } if(getSlotCountOfItemInInventory() >= 27) { - switch (Addon.getSharedInstance().configuration().getAutoCrafterConfig().getFinalAction().get()) { + switch (Addon.getSharedInstance().configuration().getAutoCrafterConfig().getFinalActionV2().get()) { case COMP -> { currentState = STATE.GO_BACK; } diff --git a/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/AutoCrafter/AutoCrafterV3.java b/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/AutoCrafter/AutoCrafterV3.java new file mode 100644 index 0000000..360b9d2 --- /dev/null +++ b/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/AutoCrafter/AutoCrafterV3.java @@ -0,0 +1,639 @@ +package tmb.randy.tmbgriefergames.v1_12_2.util.AutoCrafter; + +import net.labymod.api.client.gui.screen.key.Key; +import net.labymod.api.event.client.chat.ChatReceiveEvent; +import net.labymod.api.event.client.input.KeyEvent; +import net.labymod.api.event.client.input.KeyEvent.State; +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.GuiInventory; +import net.minecraft.inventory.ClickType; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.ContainerChest; +import net.minecraft.inventory.ContainerPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumHand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.RayTraceResult; +import net.minecraft.util.math.RayTraceResult.Type; +import net.minecraft.util.math.Vec3d; +import tmb.randy.tmbgriefergames.core.Addon; +import tmb.randy.tmbgriefergames.core.enums.AutoCrafterNewFinalAction; +import tmb.randy.tmbgriefergames.core.enums.QueueType; +import tmb.randy.tmbgriefergames.v1_12_2.util.VersionisedBridge; +import tmb.randy.tmbgriefergames.v1_12_2.util.click.Click; +import tmb.randy.tmbgriefergames.v1_12_2.util.click.ClickManager; +import java.util.HashMap; +import java.util.Map; + +import static tmb.randy.tmbgriefergames.v1_12_2.util.AutoCrafter.AutoCrafterV3.COMP_STATE.*; + +public class AutoCrafterV3 { + private int tickCounter = 0; + + enum COMP_STATE { + IDLE, OPEN_COMP, COMP1, COMP2, COMP3, COMP4, COMP5, COMP6, FINISHED + } + + private static final int[] RECIPE_SLOTS = {10, 11, 12, 19, 20, 21, 28, 29, 30}; + + private boolean active; + private ItemStack craftItem; + private Map recipe = new HashMap<>(); + private Map sourceChests = new HashMap<>(); + private int maxRecipeCount = 0; + private COMP_STATE compState = IDLE; + + public void onKey(KeyEvent event) { + if(active && event.state() == State.PRESS && event.key() == Key.ESCAPE) { + stop(); + } + } + + public void chatMessageReceived(ChatReceiveEvent event) { + if(active && event.chatMessage().getPlainText().endsWith("Du kannst diese Kiste nicht öffnen, solange sie von einem anderen Spieler benutzt wird.")) + event.setCancelled(true); + } + + public void onTick(GameTickEvent event) { + if(active) { + + if(Addon.getSharedInstance().configuration().getAutoCrafterConfig().getDelay().get() > 0) { + if(tickCounter < Addon.getSharedInstance().configuration().getAutoCrafterConfig().getDelay().get()) { + tickCounter++; + return; + } + tickCounter = 0; + } + + StuckProtection.tick(Minecraft.getMinecraft().player.openContainer); + + if(craftItem == null) { + if(!Minecraft.getMinecraft().player.inventory.mainInventory.getFirst().isEmpty()) { + if(Minecraft.getMinecraft().player.openContainer instanceof ContainerChest chest) { + if(ClickManager.getSharedInstance().isClickQueueEmpty(QueueType.MEDIUM)) { + IInventory chestInventory = chest.getLowerChestInventory(); + if(chestInventory.getName().equals("§6Custom-Kategorien")) { + ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, new Click(chest.windowId, 12, 0, ClickType.QUICK_MOVE)); + } else if(chestInventory.getName().equals("§6Minecraft-Rezepte")) { + ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, new Click(chest.windowId, 81, 0, ClickType.QUICK_MOVE)); + } else if(chestInventory.getName().equals("§6Vanilla Bauanleitung") && areItemStacksEqual(chestInventory.getStackInSlot(25), Minecraft.getMinecraft().player.inventory.mainInventory.getFirst())) { + craftItem = chestInventory.getStackInSlot(25); + + for (int recipeSlot : RECIPE_SLOTS) { + ItemStack stack = chestInventory.getStackInSlot(recipeSlot); + if(!isStainedGlassPane(stack) && stack != null && !stack.isEmpty()) { + String key = getItemKey(stack); + recipe.put(key, recipe.getOrDefault(key, 0) + 1); + } + } + + closeChest(); + + Addon.getSharedInstance().displayNotification(I18n.getTranslation("tmbgriefergames.autoCrafter.recipeSavedV3")); + } + } + } else { + VersionisedBridge.sendCommand("/rezepte"); + } + } else { + Addon.getSharedInstance().displayNotification(I18n.getTranslation("tmbgriefergames.autoCrafter.noItemFound")); + stop(); + } + } else { + if(allSourceChestsScanned()) { + craft(); + } else { + if(Minecraft.getMinecraft().player.openContainer instanceof ContainerChest chest) { + IInventory chestInventory = chest.getLowerChestInventory(); + ItemStack chestItemStack = allItemsAreEqual(chestInventory); + if(chestItemStack != null) { + String itemKey = getItemKey(chestItemStack); + RayTraceResult trace = Minecraft.getMinecraft().player.rayTrace(5, 1.0F); + if(trace != null && trace.typeOfHit == Type.BLOCK) { + sourceChests.put(itemKey, trace.getBlockPos()); + closeChest(); + + if(allSourceChestsScanned()) { + Addon.getSharedInstance().displayNotification(I18n.getTranslation("tmbgriefergames.autoCrafter.startedCrafting")); + maxRecipeCount = maxRecipeCraftCount(); + } else { + Addon.getSharedInstance().displayNotification(I18n.getTranslation("tmbgriefergames.autoCrafter.setChestForMaterial", chestItemStack.getDisplayName())); + } + } + } else { + Addon.getSharedInstance().displayNotification(I18n.getTranslation("tmbgriefergames.autoCrafter.mixedChest")); + closeChest(); + } + } + } + } + } + } + + public void start() { + active = true; + Addon.getSharedInstance().displayNotification(I18n.getTranslation("tmbgriefergames.autoCrafter.V3started")); + } + public void stop() { + active = false; + craftItem = null; + recipe = new HashMap<>(); + sourceChests = new HashMap<>(); + maxRecipeCount = 0; + compState = IDLE; + Addon.getSharedInstance().displayNotification(I18n.getTranslation("tmbgriefergames.autoCrafter.V3stopped")); + } + public void toggle() { + if(active) + stop(); + else + start(); + } + + private void craft() { + int numberOfFinishedStacks = getNumperOfRecipeStacksInInventory(); + if(numberOfFinishedStacks <= 1 || (Addon.getSharedInstance().configuration().getAutoCrafterConfig().getFinalActionV3().get() == AutoCrafterNewFinalAction.COMP && compState == FINISHED)) { + + if(Minecraft.getMinecraft().currentScreen instanceof GuiInventory) { + closeChest(); + } + + //Craft more + String nextItem = getNextItemToTake(); + + if(!isContainerOpen()) { + if(nextItem == null) { + VersionisedBridge.sendCommand("/rezepte"); + } else { + BlockPos lookingAtBlock = getBlockLookingAt(); + BlockPos neededBlock = sourceChests.get(nextItem); + + if(neededBlock != null) { + if(lookingAtBlock != null) { + if(lookingAtBlock.equals(neededBlock)) { + if(!Minecraft.getMinecraft().player.isSneaking()) { + RayTraceResult trace = Minecraft.getMinecraft().player.rayTrace(5, 1.0F); + Minecraft.getMinecraft().playerController.processRightClickBlock(Minecraft.getMinecraft().player, Minecraft.getMinecraft().world, lookingAtBlock, trace.sideHit, trace.hitVec, EnumHand.MAIN_HAND); + } + } else { + lookAtBlockPos(neededBlock); + } + } + } else { + Addon.getSharedInstance().displayNotification(I18n.getTranslation("tmbgriefergames.autoCrafter.noSourceFound")); + } + } + + } else if(Minecraft.getMinecraft().player.openContainer instanceof ContainerChest chest) { + IInventory chestInventory = chest.getLowerChestInventory(); + + switch (chestInventory.getName()) { + case "§6Custom-Kategorien": { + if(nextItem != null) { + closeChest(); + } else { + if(ClickManager.getSharedInstance().isClickQueueEmpty(QueueType.MEDIUM)) { + ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, new Click(chest.windowId, 12, 0, ClickType.QUICK_MOVE)); + } + } + break; + } + case "§6Minecraft-Rezepte": { + if(nextItem != null) { + closeChest(); + } else { + if(ClickManager.getSharedInstance().isClickQueueEmpty(QueueType.MEDIUM)) { + int slot = getFirstSlotForCraftItem(); + int translatedSlot = translateInventorySlotToContainerCHestSlot(slot); + if(slot > -1) { + int clickSlot = translatedSlot + chest.getLowerChestInventory().getSizeInventory(); + ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, new Click(chest.windowId, clickSlot, 0, ClickType.QUICK_MOVE)); + } + } + } + break; + } + case "§6Vanilla Bauanleitung": { + if(nextItem != null) + closeChest(); + else { + ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, new Click(chest.windowId, 52, 0, ClickType.QUICK_MOVE)); + compState = IDLE; + } + break; + } + default: { + if(ClickManager.getSharedInstance().isClickQueueEmpty(QueueType.MEDIUM)) { + ItemStack itemStack = allItemsAreEqual(chestInventory); + if(itemStack != null) { + String itemKeyForChest = getItemKey(itemStack); + int stacksInInventory = getCountOfItemKeyStacksInInventory(itemKeyForChest); + int neededStacks = (recipe.get(itemKeyForChest) * maxRecipeCount) - stacksInInventory; + + int size = chestInventory.getSizeInventory(); + + int stacksTaken = 0; + for (int i = 0; i < size; i++) { + ItemStack currentStack = chestInventory.getStackInSlot(i); + + if (getItemKey(currentStack).equals(itemKeyForChest) && currentStack.getCount() == currentStack.getMaxStackSize()) { + ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, new Click(chest.windowId, i, 0, ClickType.QUICK_MOVE)); + stacksTaken++; + } + + if(stacksTaken >= neededStacks) + break; + } + + if(ClickManager.getSharedInstance().isClickQueueEmpty(QueueType.MEDIUM)) { + closeChest(); + } + } else { + closeChest(); + } + } + break; + } + } + } + } else { + if(Addon.getSharedInstance().configuration().getAutoCrafterConfig().getFinalActionV3().get() == AutoCrafterNewFinalAction.DROP) { + //Drop crafted items + if(Minecraft.getMinecraft().player.openContainer instanceof ContainerChest) { + closeChest(); + } else if(Minecraft.getMinecraft().player.openContainer instanceof ContainerPlayer inv && Minecraft.getMinecraft().currentScreen instanceof GuiInventory) { + boolean skippedFirst = false; + if(ClickManager.getSharedInstance().isClickQueueEmpty(QueueType.MEDIUM)) { + int size = inv.inventorySlots.size(); + for(int i = 9; i < size; i++) { + if(inv.getSlot(i).getHasStack()) { + ItemStack stack = inv.getSlot(i).getStack(); + String key = getItemKey(stack); + String craftItemKey = getItemKey(craftItem); + if(key.equals(craftItemKey)) { + if(skippedFirst) + ClickManager.getSharedInstance().dropClick(i); + else + skippedFirst = true; + } + } + } + } + } else { + Minecraft.getMinecraft().displayGuiScreen(new GuiInventory(Minecraft.getMinecraft().player)); + } + } else if(Addon.getSharedInstance().configuration().getAutoCrafterConfig().getFinalActionV3().get() == AutoCrafterNewFinalAction.COMP) { + if(compState == IDLE) { + closeChest(); + compState = OPEN_COMP; + } + + comp(); + } + } + } + + private int maxRecipeCraftCount() { + int slots = 0; + + for (Map.Entry entry : recipe.entrySet()) { + slots += entry.getValue(); + } + + return Addon.getSharedInstance().configuration().getAutoCrafterConfig().getFinalActionV3().get() == AutoCrafterNewFinalAction.COMP ? (27 / slots) : (32 / slots); + } + + private ItemStack allItemsAreEqual(IInventory inventory) { + int size = inventory.getSizeInventory(); + ItemStack firstStack = null; + + for (int i = 0; i < size; i++) { + ItemStack currentStack = inventory.getStackInSlot(i); + + if (currentStack != ItemStack.EMPTY) { + if (firstStack == null) { + firstStack = currentStack; + } else { + if (!areItemStacksEqual(firstStack, currentStack)) { + return null; + } + } + } + } + return firstStack; + } + + private static boolean areItemStacksEqual(ItemStack stack1, ItemStack stack2) { + return stack1.getItem() == stack2.getItem() && stack1.getMetadata() == stack2.getMetadata(); + } + + private static String getItemKey(ItemStack stack) { + return Item.REGISTRY.getNameForObject(stack.getItem()).toString() + ":" + stack.getMetadata(); + } + + public static boolean isStainedGlassPane(ItemStack stack) { + if (stack == null || stack.isEmpty()) + return false; + + Item stainedGlassPaneItem = Item.getItemFromBlock(net.minecraft.init.Blocks.STAINED_GLASS_PANE); + return stack.getItem() == stainedGlassPaneItem; + } + + private boolean allSourceChestsScanned() { + for (Map.Entry entry : recipe.entrySet()) { + String item = entry.getKey(); + + if(!sourceChests.containsKey(item)) + return false; + } + + return true; + } + + private void closeChest() { + Minecraft.getMinecraft().displayGuiScreen(null); + Minecraft.getMinecraft().player.closeScreen(); + } + + private int getCountOfItemKeyStacksInInventory(String itemKey) { + int count = 0; + + for (ItemStack itemStack : Minecraft.getMinecraft().player.inventory.mainInventory) { + if(getItemKey(itemStack).equals(itemKey)) { + count++; + } + } + + return count; + } + + public static boolean isContainerOpen() { + Minecraft mc = Minecraft.getMinecraft(); + Container openContainer = mc.player.openContainer; + return openContainer != mc.player.inventoryContainer; + } + + private String getNextItemToTake() { + for (Map.Entry entry : recipe.entrySet()) { + String item = entry.getKey(); + Integer count = entry.getValue(); + + int neededCount = (count * maxRecipeCount) - getCountOfItemKeyStacksInInventory(item); + + if(neededCount >= 1) { + return item; + } + } + + return null; + } + + private int getFirstSlotForCraftItem() { + for (int i = 0; i < Minecraft.getMinecraft().player.inventory.mainInventory.size(); i++) { + ItemStack itemStack = Minecraft.getMinecraft().player.inventory.mainInventory.get(i); + if(getItemKey(itemStack).equals(getItemKey(craftItem))) { + return i; + } + } + return -1; + } + + private void lookAtBlockPos(BlockPos pos) { + Vec3d playerPos = Minecraft.getMinecraft().player.getPositionEyes(1.0F); + Vec3d targetPos = new Vec3d(pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5); + + double diffX = targetPos.x - playerPos.x; + double diffY = targetPos.y - playerPos.y; + double diffZ = targetPos.z - playerPos.z; + double diffXZ = Math.sqrt(diffX * diffX + diffZ * diffZ); + + float yaw = (float) (Math.atan2(diffZ, diffX) * (180 / Math.PI)) - 90.0F; + float pitch = (float) (-(Math.atan2(diffY, diffXZ) * (180 / Math.PI))); + + Minecraft.getMinecraft().player.rotationYaw = yaw; + Minecraft.getMinecraft().player.rotationPitch = pitch; + } + + private BlockPos getBlockLookingAt() { + RayTraceResult trace = Minecraft.getMinecraft().player.rayTrace(5, 1.0F); + if(trace != null && trace.typeOfHit == Type.BLOCK) { + return trace.getBlockPos(); + } + + return null; + } + + private int translateInventorySlotToContainerCHestSlot(int slot) { + if(slot >= 0 && slot <= 8) + return slot + 27; + else + return slot - 9; + } + + private int getNumperOfRecipeStacksInInventory() { + int count = 0; + for (ItemStack itemStack : Minecraft.getMinecraft().player.inventory.mainInventory) { + String itemKey = getItemKey(itemStack); + String recipeKey = getItemKey(craftItem); + if(itemKey.equals(recipeKey)) { + count++; + } + + } + + return count; + } + + + + private void comp() { + switch (compState) { + case OPEN_COMP -> { + if(Minecraft.getMinecraft().player.openContainer instanceof ContainerChest chest) { + IInventory inv = chest.getLowerChestInventory(); + if(inv.getName().equalsIgnoreCase("§6Custom-Kategorien")) { + ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, new Click(Minecraft.getMinecraft().player.openContainer.windowId, 11, 0, ClickType.QUICK_MOVE)); + } else if(inv.getName().equalsIgnoreCase("§6Item-Komprimierung-Bauanleitung")) { + int clickSlot = getBestCompSlot(); + ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, new Click(Minecraft.getMinecraft().player.openContainer.windowId, clickSlot, 0, ClickType.QUICK_MOVE)); + } else if(inv.getName().equalsIgnoreCase("§6Item-Komprimierung")) { + compState = COMP1; + } else if(inv.getName().equalsIgnoreCase("§6Vanilla Bauanleitung")) { + closeChest(); + } + } else { + VersionisedBridge.sendCommand("/rezepte"); + } + } + case COMP1, COMP2, COMP3, COMP4, COMP5, COMP6, FINISHED -> { + if(ClickManager.getSharedInstance().isClickQueueEmpty(QueueType.MEDIUM)) { + if(Minecraft.getMinecraft().player.openContainer instanceof ContainerChest && Minecraft.getMinecraft().player.openContainer.getSlot(49).getStack() != null) { + String headName = Minecraft.getMinecraft().player.openContainer.getSlot(49).getStack().getDisplayName(); + if(headName.contains("§6Komprimierungsstufe")) { + int step = Integer.parseInt(headName.replace("§6Komprimierungsstufe ", "")); + + switch (compState) { + case COMP1 -> { + if(step > 1) + decreaseStep(); + else { + compState = COMP2; + compClick(); + } + } + case COMP2 -> { + if(step == 2) { + compState = COMP3; + compClick(); + } + else if (step < 2) + increaseStep(); + else if(step > 2) + decreaseStep(); + } + case COMP3 -> { + if(step == 3) { + compState = COMP4; + compClick(); + } + else if (step < 3) + increaseStep(); + else if(step > 3) + decreaseStep(); + } + case COMP4 -> { + if(step == 4) { + compState = COMP5; + compClick(); + } + else if (step < 4) + increaseStep(); + else if(step > 4) + decreaseStep(); + } + case COMP5 -> { + if(step == 5) { + compState = COMP6; + compClick(); + } + else if (step < 5) + increaseStep(); + else if(step > 5) + decreaseStep(); + } + case COMP6 -> { + if(step == 6) { + compClick(); + compState = FINISHED; + } + else if (step < 6) + increaseStep(); + else if(step > 6) + decreaseStep(); + } + case FINISHED -> { + closeChest(); + } + } + } + } + } + } + } + } + + private void compClick() { + ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, new Click(Minecraft.getMinecraft().player.openContainer.windowId, 52, 0, ClickType.QUICK_MOVE)); + } + + private void increaseStep() { + ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, new Click(Minecraft.getMinecraft().player.openContainer.windowId, 50, 0, ClickType.QUICK_MOVE)); + } + + private void decreaseStep() { + ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, new Click(Minecraft.getMinecraft().player.openContainer.windowId, 48, 0, ClickType.QUICK_MOVE)); + } + + private int getBestCompSlot() { + //Searches for the best slot in the players inventory to click on. Clicking a lower compression state saves some time. + int bestSlot = 81; + String bestSlotLevel = ""; + + for (int i = 54; i < 90; i++) { + Slot slot = Minecraft.getMinecraft().player.openContainer.inventorySlots.get(i); + if(slot.getHasStack()) { + ItemStack stack = slot.getStack(); + if(getItemKey(stack).equals(getItemKey(craftItem))) { + if(stack.hasTagCompound() && stack.getTagCompound() != null) { + if(stack.getTagCompound().hasKey("compressionLevel")) { + String level = stack.getTagCompound().getString("compressionLevel"); + + switch (level) { + case "ONE": { + if(!bestSlotLevel.equals("ONE")) { + bestSlot = i; + bestSlotLevel = "ONE"; + } + break; + } + case "TWO": { + if(bestSlotLevel.isEmpty() || bestSlotLevel.equals("THREE") || bestSlotLevel.equals("FOUR") || bestSlotLevel.equals("FIVE") || bestSlotLevel.equals("SIX") || bestSlotLevel.equals("SEVEN")) { + bestSlot = i; + bestSlotLevel = "TWO"; + } + break; + } + case "THREE": { + if(bestSlotLevel.isEmpty() || bestSlotLevel.equals("FOUR") || bestSlotLevel.equals("FIVE") || bestSlotLevel.equals("SIX") || bestSlotLevel.equals("SEVEN")) { + bestSlot = i; + bestSlotLevel = "THREE"; + } + break; + } + case "FOUR": { + if(bestSlotLevel.isEmpty() || bestSlotLevel.equals("FIVE") || bestSlotLevel.equals("SIX") || bestSlotLevel.equals("SEVEN")) { + bestSlot = i; + bestSlotLevel = "FOUR"; + } + break; + } + case "FIVE": { + if(bestSlotLevel.isEmpty() || bestSlotLevel.equals("SIX") || bestSlotLevel.equals("SEVEN")) { + bestSlot = i; + bestSlotLevel = "FIVE"; + } + break; + } + case "SIX": { + if(bestSlotLevel.isEmpty() || bestSlotLevel.equals("SEVEN")) { + bestSlot = i; + bestSlotLevel = "SIX"; + } + break; + } + case "SEVEN": { + if(bestSlotLevel.isEmpty()) { + bestSlot = i; + bestSlotLevel = "SEVEN"; + } + break; + } + } + continue; + } + } + + // Found uncompressed item. + return i; + } + } + } + + return bestSlot; + } +} \ No newline at end of file diff --git a/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/AutoCrafter/StuckProtection.java b/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/AutoCrafter/StuckProtection.java new file mode 100644 index 0000000..3bff485 --- /dev/null +++ b/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/AutoCrafter/StuckProtection.java @@ -0,0 +1,32 @@ +package tmb.randy.tmbgriefergames.v1_12_2.util.AutoCrafter; + +import net.minecraft.client.Minecraft; +import net.minecraft.inventory.Container; + +public class StuckProtection { + // To prevent the auto crafter from being stuck in a container, let's close the container if the same container is open for too many ticks + private static final int TICK_LIMIT = 200; + private static int counter = 0; + + private static Container lastContainer; + + public static void tick(Container container) { + if(container != lastContainer) { + lastContainer = container; + counter = 0; + return; + } + + counter++; + + if(counter > TICK_LIMIT) { + Minecraft.getMinecraft().displayGuiScreen(null); + Minecraft.getMinecraft().player.closeScreen(); + counter = 0; + } + } + + public static void reset() { + counter = 0; + } +} 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 65a1e4d..c4d62d2 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 @@ -13,7 +13,6 @@ 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; diff --git a/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/HABK.java b/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/HABK.java new file mode 100644 index 0000000..b5ac3aa --- /dev/null +++ b/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/HABK.java @@ -0,0 +1,60 @@ +package tmb.randy.tmbgriefergames.v1_12_2.util; + +import net.labymod.api.event.client.input.MouseButtonEvent; +import net.labymod.api.event.client.input.MouseButtonEvent.Action; +import net.labymod.api.util.I18n; +import net.minecraft.client.Minecraft; +import net.minecraft.item.ItemBow; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemSword; +import tmb.randy.tmbgriefergames.core.Addon; + +import static tmb.randy.tmbgriefergames.v1_12_2.util.ItemSaver.NBTTagStringBirthBow; +import static tmb.randy.tmbgriefergames.v1_12_2.util.ItemSaver.findHotbarSlotforItem; + +public class HABK { + + public void onMouseButtonEvent(MouseButtonEvent event) { + if(Addon.getSharedInstance().configuration().getSwordsSubConfig().getHABKenabled().get() && event.button().isRight() && event.action() == Action.RELEASE) { + int selectedSlot = Minecraft.getMinecraft().player.inventory.currentItem; + + ItemStack heldItemStack = Minecraft.getMinecraft().player.inventory.getStackInSlot(selectedSlot); + ItemStack firstItemStack = Minecraft.getMinecraft().player.inventory.getStackInSlot(0); + + String enchantments = null; + + if(heldItemStack != null && heldItemStack.getTagCompound() != null) { + if(heldItemStack.getTagCompound().hasKey("ench")) { + enchantments = heldItemStack.getTagCompound().getTag("ench").toString(); + } + } + + if(enchantments != null && enchantments.equals(NBTTagStringBirthBow)) { + Addon.getSharedInstance().getBridge().changeSlot(findHotbarSlotforItem()); + Addon.getSharedInstance().displayNotification("§4§l" + I18n.translate("tmbgriefergames.itemSaver.item_saver_message_birth_bow")); + event.setCancelled(true); + } else if (heldItemStack != null && heldItemStack.getItem() instanceof ItemBow && firstItemStack.getItem() instanceof ItemSword) { + + new java.util.Timer().schedule( + new java.util.TimerTask() { + @Override + public void run() { + Minecraft.getMinecraft().player.inventory.currentItem = 0; + new java.util.Timer().schedule( + new java.util.TimerTask() { + @Override + public void run() { + Minecraft.getMinecraft().player.inventory.currentItem = selectedSlot; + } + }, + Addon.getSharedInstance().configuration().getSwordsSubConfig().getHABKcooldown().get() + ); + } + }, + 5 + ); + } + } + } +} + diff --git a/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/ItemClearTimerListener.java b/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/ItemClearTimerListener.java index 7fd367c..f897027 100644 --- a/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/ItemClearTimerListener.java +++ b/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/ItemClearTimerListener.java @@ -2,7 +2,6 @@ import net.labymod.api.event.client.network.server.NetworkPayloadEvent; import net.labymod.api.event.client.network.server.NetworkPayloadEvent.Side; -import tmb.randy.tmbgriefergames.core.Addon; import java.nio.charset.StandardCharsets; import java.util.concurrent.TimeUnit; diff --git a/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/ItemSaver.java b/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/ItemSaver.java index 056c19e..74cbb11 100644 --- a/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/ItemSaver.java +++ b/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/ItemSaver.java @@ -3,12 +3,9 @@ import net.labymod.api.Laby; import net.labymod.api.client.world.item.ItemStack; import net.labymod.api.component.data.DataComponentKey; -import net.labymod.api.event.Priority; -import net.labymod.api.event.Subscribe; import net.labymod.api.event.client.input.MouseButtonEvent; import net.labymod.api.event.client.input.MouseButtonEvent.Action; import net.labymod.api.util.I18n; -import net.minecraft.client.Minecraft; import tmb.randy.tmbgriefergames.core.Addon; public class ItemSaver { @@ -20,27 +17,28 @@ public class ItemSaver { public void mouseButtonEvent(MouseButtonEvent event) { - - if(Laby.labyAPI().minecraft().getClientPlayer() != null) { - if(Laby.labyAPI().minecraft().getClientPlayer().getMainHandItemStack() != null) { - ItemStack stack = Laby.labyAPI().minecraft().getClientPlayer().getMainHandItemStack(); - if(stack.hasDataComponentContainer()) { - if(stack.getDataComponentContainer().has(DataComponentKey.simple("ench"))) { - String enchantments = stack.getDataComponentContainer().get(DataComponentKey.simple("ench")).toString(); - - if(event.action() == Action.CLICK) { - if((enchantments.equals(NBTTagStringBonze) || enchantments.equals(NBTTagStringBirthSword)) && event.button().isLeft()) { - Addon.getSharedInstance().displayNotification("§4§l" + I18n.translate("tmbgriefergames.itemSaver.item_saver_message_sword")); - Addon.getSharedInstance().getBridge().changeSlot(findHotbarSlotforItem()); - event.setCancelled(true); - } else if(enchantments.equals(NBTTagStringSoS) && event.button().isRight()) { - Addon.getSharedInstance().displayNotification("§4§l" + I18n.translate("tmbgriefergames.itemSaver.item_saver_message_sos")); - Addon.getSharedInstance().getBridge().changeSlot(findHotbarSlotforBlock()); - event.setCancelled(true); - } else if(enchantments.equals(NBTTagStringBirthBow) && event.button().isRight()) { - Addon.getSharedInstance().displayNotification("§4§l" + I18n.translate("tmbgriefergames.itemSaver.item_saver_message_birth_bow")); - Addon.getSharedInstance().getBridge().changeSlot(findHotbarSlotforItem()); - event.setCancelled(true); + if(Addon.getSharedInstance().configuration().getItemProtection().get()) { + if(Laby.labyAPI().minecraft().getClientPlayer() != null) { + if(Laby.labyAPI().minecraft().getClientPlayer().getMainHandItemStack() != null) { + ItemStack stack = Laby.labyAPI().minecraft().getClientPlayer().getMainHandItemStack(); + if(stack.hasDataComponentContainer()) { + if(stack.getDataComponentContainer().has(DataComponentKey.simple("ench"))) { + String enchantments = stack.getDataComponentContainer().get(DataComponentKey.simple("ench")).toString(); + + if(event.action() == Action.CLICK) { + if((enchantments.equals(NBTTagStringBonze) || enchantments.equals(NBTTagStringBirthSword)) && event.button().isLeft()) { + Addon.getSharedInstance().displayNotification("§4§l" + I18n.translate("tmbgriefergames.itemSaver.item_saver_message_sword")); + Addon.getSharedInstance().getBridge().changeSlot(findHotbarSlotforItem()); + event.setCancelled(true); + } else if(enchantments.equals(NBTTagStringSoS) && event.button().isRight()) { + Addon.getSharedInstance().displayNotification("§4§l" + I18n.translate("tmbgriefergames.itemSaver.item_saver_message_sos")); + Addon.getSharedInstance().getBridge().changeSlot(findHotbarSlotforBlock()); + event.setCancelled(true); + } else if(enchantments.equals(NBTTagStringBirthBow) && event.button().isRight()) { + Addon.getSharedInstance().displayNotification("§4§l" + I18n.translate("tmbgriefergames.itemSaver.item_saver_message_birth_bow")); + Addon.getSharedInstance().getBridge().changeSlot(findHotbarSlotforItem()); + event.setCancelled(true); + } } } } diff --git a/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/ItemShifter.java b/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/ItemShifter.java index f0b771a..5c4c7db 100644 --- a/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/ItemShifter.java +++ b/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/ItemShifter.java @@ -2,7 +2,6 @@ import net.labymod.api.client.gui.screen.key.Key; import net.labymod.api.event.client.input.KeyEvent; -import net.labymod.api.event.client.input.KeyEvent.State; import net.labymod.api.event.client.lifecycle.GameTickEvent; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.inventory.GuiChest; @@ -113,7 +112,7 @@ public void startShifting() { } public void tick(GameTickEvent event) { - if((Key.ARROW_LEFT.isPressed() && Key.ARROW_UP.isPressed() && Key.ARROW_RIGHT.isPressed()) || !(Minecraft.getMinecraft().player.openContainer instanceof ContainerChest)) + if((Keyboard.isKeyDown(Key.ARROW_LEFT.getId()) && Keyboard.isKeyDown(Key.ARROW_UP.getId()) && Keyboard.isKeyDown(Key.ARROW_RIGHT.getId())) || !(Minecraft.getMinecraft().player.openContainer instanceof ContainerChest)) return; if (Minecraft.getMinecraft().player != null && Minecraft.getMinecraft().player.openContainer != null && Minecraft.getMinecraft().currentScreen instanceof GuiChest) { @@ -124,7 +123,7 @@ public void tick(GameTickEvent event) { stopShifting(); } - if ((Key.ARROW_UP.isPressed()) && ClickManager.getSharedInstance().isClickQueueEmpty(QueueType.SLOW)) { + if (Keyboard.isKeyDown(Key.ARROW_UP.getId()) && ClickManager.getSharedInstance().isClickQueueEmpty(QueueType.SLOW)) { if (inv.getName().equalsIgnoreCase("§6Trichter-Einstellungen") && ClickManager.getSharedInstance().isClickQueueEmpty(QueueType.SLOW)) { shiftClick(49); for (int i = 0; i < 15; i++) { @@ -134,7 +133,7 @@ public void tick(GameTickEvent event) { setTopToBottom(false); startShifting(); } - } else if (Key.ARROW_DOWN.isPressed() && ClickManager.getSharedInstance().isClickQueueEmpty(QueueType.SLOW) && !Addon.getSharedInstance().getBridge().isCompActive()) { + } else if (Keyboard.isKeyDown(Key.ARROW_DOWN.getId()) && ClickManager.getSharedInstance().isClickQueueEmpty(QueueType.SLOW) && !Addon.getSharedInstance().getBridge().isCompActive()) { setTopToBottom(true); startShifting(); } 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 9dfd6e3..9b24de1 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 @@ -1,8 +1,6 @@ package tmb.randy.tmbgriefergames.v1_12_2.util; -import net.labymod.api.client.gui.screen.key.Key; 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; diff --git a/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/PlotSwitch.java b/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/PlotSwitch.java index 2a50ab1..4531745 100644 --- a/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/PlotSwitch.java +++ b/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/PlotSwitch.java @@ -1,18 +1,12 @@ package tmb.randy.tmbgriefergames.v1_12_2.util; -import net.labymod.accountmanager.AccountManager; import net.labymod.api.Laby; -import net.labymod.api.LabyAPI; -import net.labymod.api.client.gui.screen.key.Key; import net.labymod.api.event.Phase; -import net.labymod.api.event.Subscribe; import net.labymod.api.event.client.chat.ChatMessageSendEvent; import net.labymod.api.event.client.chat.ChatReceiveEvent; import net.labymod.api.event.client.input.KeyEvent; import net.labymod.api.event.client.input.KeyEvent.State; import net.labymod.api.event.client.lifecycle.GameTickEvent; -import net.labymod.core.main.LabyMod; -import net.labymod.core.main.account.AccountManagerController; import tmb.randy.tmbgriefergames.core.Addon; public class PlotSwitch { diff --git a/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/VABK.java b/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/VABK.java new file mode 100644 index 0000000..124c5af --- /dev/null +++ b/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/VABK.java @@ -0,0 +1,80 @@ +package tmb.randy.tmbgriefergames.v1_12_2.util; + +import net.labymod.api.event.Phase; +import net.labymod.api.event.client.input.KeyEvent; +import net.labymod.api.event.client.input.KeyEvent.State; +import net.labymod.api.event.client.lifecycle.GameTickEvent; +import net.labymod.api.util.I18n; +import net.minecraft.client.Minecraft; +import net.minecraft.item.ItemBow; +import net.minecraft.item.ItemStack; +import net.minecraft.network.play.client.CPacketPlayerDigging; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.EnumHand; +import net.minecraft.util.math.BlockPos; +import tmb.randy.tmbgriefergames.core.Addon; + +public class VABK { + private int cooldown = 0; + private boolean active; + + public void onTickEvent(GameTickEvent event) { + if(Minecraft.getMinecraft().player == null || Minecraft.getMinecraft().world == null) + return; + + if (event.phase() == Phase.PRE && active) { + cooldown++; + + if (cooldown >= (Addon.getSharedInstance().configuration().getSwordsSubConfig().getVABKswitchCooldown().get() + Addon.getSharedInstance().configuration().getSwordsSubConfig().getVABKloadTime().get())) { + cooldown = 0; + shoot(); + } else if (cooldown == Addon.getSharedInstance().configuration().getSwordsSubConfig().getVABKswitchCooldown().get() - 2) { + Minecraft.getMinecraft().player.inventory.currentItem = 2; + } else if (cooldown == Addon.getSharedInstance().configuration().getSwordsSubConfig().getVABKswitchCooldown().get()) { + startUsingBow(); + } + } + } + + public void onKeyEvent(KeyEvent event) { + if(event.state() == State.PRESS && VersionisedBridge.allKeysPressed(Addon.getSharedInstance().configuration().getSwordsSubConfig().getVABKhotkey().get()) && !VersionisedBridge.isChatGuiOpen()) { + toggleActive(); + } + } + + public void toggleActive() { + active = !active; + Addon.getSharedInstance().displayNotification(I18n.getTranslation(active ? "tmbgriefergames.autoSword.enabled" : "tmbgriefergames.autoSword.disabled")); + } + + public void stop() { + if(active) { + toggleActive(); + } + } + + private void startUsingBow() { + if(Minecraft.getMinecraft().player == null || Minecraft.getMinecraft().world == null) + return; + + ItemStack heldItem = Minecraft.getMinecraft().player.getHeldItemMainhand(); + + if (heldItem != null && heldItem.getItem() instanceof ItemBow) + Minecraft.getMinecraft().playerController.processRightClick(Minecraft.getMinecraft().player, Minecraft.getMinecraft().world, EnumHand.MAIN_HAND); + } + + private void shoot() { + if (Minecraft.getMinecraft().player == null) + return; + + if (Minecraft.getMinecraft().player.isHandActive() && Minecraft.getMinecraft().player.getActiveItemStack().getItem() instanceof ItemBow) { + int useDuration = Minecraft.getMinecraft().player.getItemInUseCount(); + + if (useDuration >= 20) { + Minecraft.getMinecraft().player.connection.sendPacket(new CPacketPlayerDigging(CPacketPlayerDigging.Action.RELEASE_USE_ITEM, BlockPos.ORIGIN, EnumFacing.DOWN)); + Minecraft.getMinecraft().player.inventory.currentItem = 0; + } + } + } +} + 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 84a06c7..7ded56c 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 @@ -26,6 +26,9 @@ import org.lwjgl.input.Keyboard; import tmb.randy.tmbgriefergames.core.Addon; import tmb.randy.tmbgriefergames.core.IBridge; +import tmb.randy.tmbgriefergames.v1_12_2.util.AutoCrafter.AutoCrafterV1; +import tmb.randy.tmbgriefergames.v1_12_2.util.AutoCrafter.AutoCrafterV2; +import tmb.randy.tmbgriefergames.v1_12_2.util.AutoCrafter.AutoCrafterV3; 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; @@ -60,13 +63,16 @@ public class VersionisedBridge implements IBridge { private final NatureBordersRenderer natureBordersRenderer = new NatureBordersRenderer(); private final AccountUnity accountUnity = new AccountUnity(); private final AutoComp autoComp = new AutoComp(); - private final AutoCrafter autoCrafter = new AutoCrafter(); - private final AutoCrafterNew autoCrafterNew = new AutoCrafterNew(); + private final AutoCrafterV1 autoCrafterV1 = new AutoCrafterV1(); + private final AutoCrafterV2 autoCrafterV2 = new AutoCrafterV2(); + private final AutoCrafterV3 autoCrafterV3 = new AutoCrafterV3(); private final AutoDecomp autoDecomp = new AutoDecomp(); private final Auswurf auswurf = new Auswurf(); + private final HABK habk = new HABK(); + private final VABK vabk = new VABK(); private GuiScreen lastGui; - private static final int commandCountdownLimit = 20; + private static final int commandCountdownLimit = 80; private static int commandCountdown = 0; @Subscribe @@ -90,6 +96,7 @@ public void messageReceived(ChatReceiveEvent event) { autoHopper.messageReceived(event); accountUnity.messageReceived(event); msgTabs.chatMessageReceived(event); + autoCrafterV3.chatMessageReceived(event); } @Subscribe @@ -111,6 +118,7 @@ public void mouseInput(MouseButtonEvent event) { itemSaver.mouseButtonEvent(event); autoHopper.mouseInput(event); flyTimer.onMouseButtonEvent(event); + habk.onMouseButtonEvent(event); } @Subscribe @@ -145,13 +153,15 @@ public void tick(GameTickEvent event) { ClickManager.getSharedInstance().tick(event); autoComp.onTickEvent(event); - autoCrafter.onTickEvent(event); + autoCrafterV1.onTickEvent(event); autoHopper.tick(event); itemShifter.tick(event); plotSwitch.tick(event); - autoCrafterNew.onTickEvent(event); + autoCrafterV2.onTickEvent(event); autoDecomp.onTickEvent(event); auswurf.onTickEvent(event); + autoCrafterV3.onTick(event); + vabk.onTickEvent(event); commandCountdown(); } @@ -166,10 +176,12 @@ public void keyDown(KeyEvent event) { itemShifter.onKey(event); natureBordersRenderer.onKey(event); autoComp.onKeyEvent(event); - autoCrafter.onKeyEvent(event); - autoCrafterNew.onKeyEvent(event); + autoCrafterV1.onKeyEvent(event); + autoCrafterV2.onKeyEvent(event); autoDecomp.onKeyEvent(event); auswurf.onKeyEvent(event); + autoCrafterV3.onKey(event); + vabk.onKeyEvent(event); } @Subscribe @@ -217,7 +229,7 @@ public void networkPayloadEvent(NetworkPayloadEvent event) { public void cbChanged() { playerTracer.cbChanged(); autoComp.stopComp(); - autoCrafterNew.stopCrafter(); + autoCrafterV2.stopCrafter(); } @Override @@ -237,7 +249,7 @@ public String getItemRemoverValue() { @Override public void startNewAutocrafter() { - autoCrafterNew.startCrafter(); + autoCrafterV2.startCrafter(); } @Override @@ -248,6 +260,11 @@ public boolean isCompActive() { @Override public void changeSlot(int slot) {Minecraft.getMinecraft().player.inventory.currentItem = slot;} + @Override + public void startAutocrafterV3() { + autoCrafterV3.toggle(); + } + private static void commandCountdown() { if (commandCountdown > 0) { commandCountdown--; 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 a5ec46f..8c47478 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 @@ -2,7 +2,6 @@ import java.util.Arrays; import java.util.List; -import net.labymod.api.event.Subscribe; import net.labymod.api.event.client.chat.ChatReceiveEvent; import tmb.randy.tmbgriefergames.core.Addon; import tmb.randy.tmbgriefergames.core.config.Configuration; diff --git a/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/chat/CooldownNotifier.java b/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/chat/CooldownNotifier.java index c586020..84a90fb 100644 --- a/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/chat/CooldownNotifier.java +++ b/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/chat/CooldownNotifier.java @@ -1,6 +1,5 @@ package tmb.randy.tmbgriefergames.v1_12_2.util.chat; -import net.labymod.api.event.Subscribe; import net.labymod.api.event.client.chat.ChatMessageSendEvent; import net.labymod.api.util.I18n; import tmb.randy.tmbgriefergames.core.Addon; diff --git a/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/chat/EmptyLinesRemover.java b/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/chat/EmptyLinesRemover.java index 3a3429f..102a8ee 100644 --- a/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/chat/EmptyLinesRemover.java +++ b/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/chat/EmptyLinesRemover.java @@ -1,6 +1,5 @@ package tmb.randy.tmbgriefergames.v1_12_2.util.chat; -import net.labymod.api.event.Subscribe; import net.labymod.api.event.client.chat.ChatReceiveEvent; import tmb.randy.tmbgriefergames.core.Addon; 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 index 12e97b3..b86b204 100644 --- 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 @@ -8,7 +8,6 @@ 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; @@ -124,7 +123,8 @@ private ChatTab getTabForName(String message) { private ChatWindow getChatWindow() { if(Addon.getSharedInstance().configuration().getChatConfig().getMsgTabMode().get()) { - for (ChatWindow window : LabyMod.references().advancedChatController().getWindows()) { + for (ChatWindow window : Laby.references().advancedChatController().getWindows()) { + if (window.isMainWindow()) { return window; } diff --git a/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/chat/NewsBlocker.java b/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/chat/NewsBlocker.java index 5a0c6b9..b2ff319 100644 --- a/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/chat/NewsBlocker.java +++ b/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/chat/NewsBlocker.java @@ -1,6 +1,5 @@ package tmb.randy.tmbgriefergames.v1_12_2.util.chat; -import net.labymod.api.event.Subscribe; import net.labymod.api.event.client.chat.ChatReceiveEvent; import tmb.randy.tmbgriefergames.core.Addon; diff --git a/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/chat/PaymentValidator.java b/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/chat/PaymentValidator.java index 966336d..476dd54 100644 --- a/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/chat/PaymentValidator.java +++ b/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/chat/PaymentValidator.java @@ -1,7 +1,6 @@ package tmb.randy.tmbgriefergames.v1_12_2.util.chat; import net.labymod.api.client.component.Component; -import net.labymod.api.event.Subscribe; import net.labymod.api.event.client.chat.ChatReceiveEvent; import net.labymod.api.util.I18n; import tmb.randy.tmbgriefergames.core.Addon; diff --git a/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/chat/StreamerMute.java b/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/chat/StreamerMute.java index 5da242b..18d645f 100644 --- a/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/chat/StreamerMute.java +++ b/game-runner/src/v1_12_2/java/tmb/randy/tmbgriefergames/v1_12_2/util/chat/StreamerMute.java @@ -1,6 +1,5 @@ package tmb.randy.tmbgriefergames.v1_12_2.util.chat; -import net.labymod.api.event.Subscribe; import net.labymod.api.event.client.chat.ChatReceiveEvent; import tmb.randy.tmbgriefergames.core.Addon; 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 8738f4e..1a55745 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 @@ -2,7 +2,6 @@ import java.util.HashMap; import java.util.Map; -import net.labymod.api.event.Subscribe; import net.labymod.api.event.client.chat.ChatMessageSendEvent; import tmb.randy.tmbgriefergames.core.Addon; 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 34a2f6d..35ec275 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 @@ -1,10 +1,9 @@ package tmb.randy.tmbgriefergames.v1_8_9.util; import net.labymod.accountmanager.storage.account.Account; -import net.labymod.api.Laby; import net.labymod.api.event.client.chat.ChatReceiveEvent; +// Unfortunately there is no LabyAPI for this so we must use the Core package :/ import net.labymod.core.main.LabyMod; -import tmb.randy.tmbgriefergames.core.Addon; public class AccountUnity { diff --git a/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/AutoCrafter.java b/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/AutoCrafter/AutoCrafterV1.java similarity index 98% rename from game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/AutoCrafter.java rename to game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/AutoCrafter/AutoCrafterV1.java index a75b5bc..6acd948 100644 --- a/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/AutoCrafter.java +++ b/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/AutoCrafter/AutoCrafterV1.java @@ -1,4 +1,4 @@ -package tmb.randy.tmbgriefergames.v1_8_9.util; +package tmb.randy.tmbgriefergames.v1_8_9.util.AutoCrafter; import net.labymod.api.client.gui.screen.key.Key; import net.labymod.api.event.client.input.KeyEvent; @@ -14,12 +14,13 @@ import org.apache.commons.lang3.ArrayUtils; import tmb.randy.tmbgriefergames.core.Addon; import tmb.randy.tmbgriefergames.core.enums.QueueType; +import tmb.randy.tmbgriefergames.v1_8_9.util.Simulator; import tmb.randy.tmbgriefergames.v1_8_9.util.click.Click; import tmb.randy.tmbgriefergames.v1_8_9.util.click.ClickManager; import java.util.HashMap; import java.util.LinkedList; -public class AutoCrafter +public class AutoCrafterV1 { private ContainerWorkbench inv; private int[] stored; @@ -32,7 +33,7 @@ public class AutoCrafter private Simulator simulator; private boolean endlessModeToggle = false; - public AutoCrafter() + public AutoCrafterV1() { this.stored = new int[9]; this.meta = new int[9]; 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/AutoCrafter/AutoCrafterV2.java similarity index 98% rename from game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/AutoCrafterNew.java rename to game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/AutoCrafter/AutoCrafterV2.java index e095544..5fa4306 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/AutoCrafter/AutoCrafterV2.java @@ -1,4 +1,4 @@ -package tmb.randy.tmbgriefergames.v1_8_9.util; +package tmb.randy.tmbgriefergames.v1_8_9.util.AutoCrafter; import net.labymod.api.client.gui.screen.key.Key; import net.labymod.api.event.Phase; @@ -15,11 +15,12 @@ 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.VersionisedBridge; import tmb.randy.tmbgriefergames.v1_8_9.util.click.Click; import tmb.randy.tmbgriefergames.v1_8_9.util.click.ClickManager; import java.util.LinkedList; -public class AutoCrafterNew { +public class AutoCrafterV2 { private enum STATE { OPEN_RECEIPTS, OPEN_CRAFT_PAGE, CRAFT, @@ -87,7 +88,7 @@ public void onTickEvent(GameTickEvent event) { } if(getSlotCountOfItemInInventory() >= 27) { - switch (Addon.getSharedInstance().configuration().getAutoCrafterConfig().getFinalAction().get()) { + switch (Addon.getSharedInstance().configuration().getAutoCrafterConfig().getFinalActionV2().get()) { case COMP -> { currentState = STATE.GO_BACK; } diff --git a/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/AutoCrafter/AutoCrafterV3.java b/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/AutoCrafter/AutoCrafterV3.java new file mode 100644 index 0000000..c01548d --- /dev/null +++ b/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/AutoCrafter/AutoCrafterV3.java @@ -0,0 +1,642 @@ +package tmb.randy.tmbgriefergames.v1_8_9.util.AutoCrafter; + +import net.labymod.api.client.gui.screen.key.Key; +import net.labymod.api.event.client.chat.ChatReceiveEvent; +import net.labymod.api.event.client.input.KeyEvent; +import net.labymod.api.event.client.input.KeyEvent.State; +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.GuiInventory; +import net.minecraft.init.Blocks; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.ContainerChest; +import net.minecraft.inventory.ContainerPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.BlockPos; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.MovingObjectPosition.MovingObjectType; +import net.minecraft.util.Vec3; +import tmb.randy.tmbgriefergames.core.Addon; +import tmb.randy.tmbgriefergames.core.enums.AutoCrafterNewFinalAction; +import tmb.randy.tmbgriefergames.core.enums.QueueType; +import tmb.randy.tmbgriefergames.v1_8_9.util.VersionisedBridge; +import tmb.randy.tmbgriefergames.v1_8_9.util.click.Click; +import tmb.randy.tmbgriefergames.v1_8_9.util.click.ClickManager; +import java.util.HashMap; +import java.util.Map; + +import static tmb.randy.tmbgriefergames.v1_8_9.util.AutoCrafter.AutoCrafterV3.COMP_STATE.*; + +public class AutoCrafterV3 { + private int tickCounter = 0; + + enum COMP_STATE { + IDLE, OPEN_COMP, COMP1, COMP2, COMP3, COMP4, COMP5, COMP6, FINISHED + } + + private static final int[] RECIPE_SLOTS = {10, 11, 12, 19, 20, 21, 28, 29, 30}; + + private boolean active; + private ItemStack craftItem; + private Map recipe = new HashMap<>(); + private Map sourceChests = new HashMap<>(); + private int maxRecipeCount = 0; + private COMP_STATE compState = IDLE; + + public void onKey(KeyEvent event) { + if(active && event.state() == State.PRESS && event.key() == Key.ESCAPE) { + stop(); + } + } + + public void chatMessageReceived(ChatReceiveEvent event) { + if(active && event.chatMessage().getPlainText().endsWith("Du kannst diese Kiste nicht öffnen, solange sie von einem anderen Spieler benutzt wird.")) + event.setCancelled(true); + } + + public void onTick(GameTickEvent event) { + if(active) { + + if(Addon.getSharedInstance().configuration().getAutoCrafterConfig().getDelay().get() > 0) { + if(tickCounter < Addon.getSharedInstance().configuration().getAutoCrafterConfig().getDelay().get()) { + tickCounter++; + return; + } + tickCounter = 0; + } + + StuckProtection.tick(Minecraft.getMinecraft().thePlayer.openContainer); + + if(craftItem == null) { + if(Minecraft.getMinecraft().thePlayer.inventory.mainInventory[0] != null) { + if(Minecraft.getMinecraft().thePlayer.openContainer instanceof ContainerChest chest) { + if(ClickManager.getSharedInstance().isClickQueueEmpty(QueueType.MEDIUM)) { + IInventory chestInventory = chest.getLowerChestInventory(); + if(chestInventory.getName().equals("§6Custom-Kategorien")) { + ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, new Click(chest.windowId, 12, 0, 1)); + } else if(chestInventory.getName().equals("§6Minecraft-Rezepte")) { + ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, new Click(chest.windowId, 81, 0, 1)); + } else if(chestInventory.getName().equals("§6Vanilla Bauanleitung") && areItemStacksEqual(chestInventory.getStackInSlot(25), Minecraft.getMinecraft().thePlayer.inventory.mainInventory[0])) { + craftItem = chestInventory.getStackInSlot(25); + + for (int recipeSlot : RECIPE_SLOTS) { + ItemStack stack = chestInventory.getStackInSlot(recipeSlot); + if(!isStainedGlassPane(stack) && stack != null) { + String key = getItemKey(stack); + recipe.put(key, recipe.getOrDefault(key, 0) + 1); + } + } + + closeChest(); + + Addon.getSharedInstance().displayNotification(I18n.getTranslation("tmbgriefergames.autoCrafter.recipeSavedV3")); + } + } + } else { + VersionisedBridge.sendCommand("/rezepte"); + } + } else { + Addon.getSharedInstance().displayNotification(I18n.getTranslation("tmbgriefergames.autoCrafter.noItemFound")); + stop(); + } + } else { + if(allSourceChestsScanned()) { + craft(); + } else { + if(Minecraft.getMinecraft().thePlayer.openContainer instanceof ContainerChest chest) { + IInventory chestInventory = chest.getLowerChestInventory(); + ItemStack chestItemStack = allItemsAreEqual(chestInventory); + if(chestItemStack != null) { + String itemKey = getItemKey(chestItemStack); + MovingObjectPosition trace = Minecraft.getMinecraft().thePlayer.rayTrace(5, 1.0F); + if(trace != null && trace.typeOfHit == MovingObjectType.BLOCK) { + sourceChests.put(itemKey, trace.getBlockPos()); + closeChest(); + + if(allSourceChestsScanned()) { + Addon.getSharedInstance().displayNotification(I18n.getTranslation("tmbgriefergames.autoCrafter.startedCrafting")); + maxRecipeCount = maxRecipeCraftCount(); + } else { + Addon.getSharedInstance().displayNotification(I18n.getTranslation("tmbgriefergames.autoCrafter.setChestForMaterial", chestItemStack.getDisplayName())); + } + } + } else { + Addon.getSharedInstance().displayNotification(I18n.getTranslation("tmbgriefergames.autoCrafter.mixedChest")); + closeChest(); + } + } + } + } + } + } + + public void start() { + active = true; + Addon.getSharedInstance().displayNotification(I18n.getTranslation("tmbgriefergames.autoCrafter.V3started")); + } + public void stop() { + active = false; + craftItem = null; + recipe = new HashMap<>(); + sourceChests = new HashMap<>(); + maxRecipeCount = 0; + compState = IDLE; + Addon.getSharedInstance().displayNotification(I18n.getTranslation("tmbgriefergames.autoCrafter.V3stopped")); + } + public void toggle() { + if(active) + stop(); + else + start(); + } + + private void craft() { + int numberOfFinishedStacks = getNumperOfRecipeStacksInInventory(); + if(numberOfFinishedStacks <= 1 || (Addon.getSharedInstance().configuration().getAutoCrafterConfig().getFinalActionV3().get() == AutoCrafterNewFinalAction.COMP && compState == FINISHED)) { + + if(Minecraft.getMinecraft().currentScreen instanceof GuiInventory) { + closeChest(); + } + + //Craft more + String nextItem = getNextItemToTake(); + + if(!isContainerOpen()) { + if(nextItem == null) { + VersionisedBridge.sendCommand("/rezepte"); + } else { + BlockPos lookingAtBlock = getBlockLookingAt(); + BlockPos neededBlock = sourceChests.get(nextItem); + + if(neededBlock != null) { + if(lookingAtBlock != null) { + if(lookingAtBlock.equals(neededBlock)) { + if(!Minecraft.getMinecraft().thePlayer.isSneaking()) { + MovingObjectPosition trace = Minecraft.getMinecraft().thePlayer.rayTrace(5, 1.0F); + Minecraft.getMinecraft().playerController.onPlayerRightClick(Minecraft.getMinecraft().thePlayer, Minecraft.getMinecraft().theWorld, Minecraft.getMinecraft().thePlayer.getHeldItem(), lookingAtBlock, trace.sideHit, trace.hitVec); + } + } else { + lookAtBlockPos(neededBlock); + } + } + } else { + Addon.getSharedInstance().displayNotification(I18n.getTranslation("tmbgriefergames.autoCrafter.noSourceFound")); + } + } + + } else if(Minecraft.getMinecraft().thePlayer.openContainer instanceof ContainerChest chest) { + IInventory chestInventory = chest.getLowerChestInventory(); + + switch (chestInventory.getName()) { + case "§6Custom-Kategorien": { + if(nextItem != null) { + closeChest(); + } else { + if(ClickManager.getSharedInstance().isClickQueueEmpty(QueueType.MEDIUM)) { + ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, new Click(chest.windowId, 12, 0, 1)); + } + } + break; + } + case "§6Minecraft-Rezepte": { + if(nextItem != null) { + closeChest(); + } else { + if(ClickManager.getSharedInstance().isClickQueueEmpty(QueueType.MEDIUM)) { + int slot = getFirstSlotForCraftItem(); + int translatedSlot = translateInventorySlotToContainerCHestSlot(slot); + if(slot > -1) { + int clickSlot = translatedSlot + chest.getLowerChestInventory().getSizeInventory(); + ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, new Click(chest.windowId, clickSlot, 0, 1)); + } + } + } + break; + } + case "§6Vanilla Bauanleitung": { + if(nextItem != null) + closeChest(); + else { + ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, new Click(chest.windowId, 52, 0, 1)); + compState = IDLE; + } + break; + } + default: { + if(ClickManager.getSharedInstance().isClickQueueEmpty(QueueType.MEDIUM)) { + ItemStack itemStack = allItemsAreEqual(chestInventory); + if(itemStack != null) { + String itemKeyForChest = getItemKey(itemStack); + int stacksInInventory = getCountOfItemKeyStacksInInventory(itemKeyForChest); + int neededStacks = (recipe.get(itemKeyForChest) * maxRecipeCount) - stacksInInventory; + + int size = chestInventory.getSizeInventory(); + + int stacksTaken = 0; + for (int i = 0; i < size; i++) { + ItemStack currentStack = chestInventory.getStackInSlot(i); + + if (getItemKey(currentStack) != null && getItemKey(currentStack).equals(itemKeyForChest) && currentStack.stackSize == currentStack.getMaxStackSize()) { + ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, new Click(chest.windowId, i, 0, 1)); + stacksTaken++; + } + + if(stacksTaken >= neededStacks) + break; + } + + if(ClickManager.getSharedInstance().isClickQueueEmpty(QueueType.MEDIUM)) { + closeChest(); + } + } else { + closeChest(); + } + } + break; + } + } + } + } else { + if(Addon.getSharedInstance().configuration().getAutoCrafterConfig().getFinalActionV3().get() == AutoCrafterNewFinalAction.DROP) { + //Drop crafted items + if(Minecraft.getMinecraft().thePlayer.openContainer instanceof ContainerChest) { + closeChest(); + } else if(Minecraft.getMinecraft().thePlayer.openContainer instanceof ContainerPlayer inv && Minecraft.getMinecraft().currentScreen instanceof GuiInventory) { + boolean skippedFirst = false; + if(ClickManager.getSharedInstance().isClickQueueEmpty(QueueType.MEDIUM)) { + int size = inv.inventorySlots.size(); + for(int i = 9; i < size; i++) { + if(inv.getSlot(i).getHasStack()) { + ItemStack stack = inv.getSlot(i).getStack(); + String key = getItemKey(stack); + String craftItemKey = getItemKey(craftItem); + if(key.equals(craftItemKey)) { + if(skippedFirst) + ClickManager.getSharedInstance().dropClick(i); + else + skippedFirst = true; + } + } + } + } + } else { + Minecraft.getMinecraft().displayGuiScreen(new GuiInventory(Minecraft.getMinecraft().thePlayer)); + } + } else if(Addon.getSharedInstance().configuration().getAutoCrafterConfig().getFinalActionV3().get() == AutoCrafterNewFinalAction.COMP) { + if(compState == IDLE) { + closeChest(); + compState = OPEN_COMP; + } + + comp(); + } + } + } + + private int maxRecipeCraftCount() { + int slots = 0; + + for (Map.Entry entry : recipe.entrySet()) { + slots += entry.getValue(); + } + + return Addon.getSharedInstance().configuration().getAutoCrafterConfig().getFinalActionV3().get() == AutoCrafterNewFinalAction.COMP ? (27 / slots) : (32 / slots); + } + + private ItemStack allItemsAreEqual(IInventory inventory) { + int size = inventory.getSizeInventory(); + ItemStack firstStack = null; + + for (int i = 0; i < size; i++) { + ItemStack currentStack = inventory.getStackInSlot(i); + + if (currentStack != null && currentStack.stackSize > 0) { + if (firstStack == null) { + firstStack = currentStack; + } else { + if (!areItemStacksEqual(firstStack, currentStack)) { + return null; + } + } + } + } + return firstStack; + } + + private static boolean areItemStacksEqual(ItemStack stack1, ItemStack stack2) { + return stack1.getItem() == stack2.getItem() && stack1.getMetadata() == stack2.getMetadata(); + } + + private static String getItemKey(ItemStack stack) { + if (stack == null || stack.stackSize == 0) + return null; + + return Item.itemRegistry.getNameForObject(stack.getItem()).toString() + ":" + stack.getMetadata(); + } + + public static boolean isStainedGlassPane(ItemStack stack) { + if (stack == null || stack.stackSize == 0) + return false; + + Item stainedGlassPaneItem = Item.getItemFromBlock(Blocks.stained_glass_pane); + return stack.getItem() == stainedGlassPaneItem; + } + + private boolean allSourceChestsScanned() { + for (Map.Entry entry : recipe.entrySet()) { + String item = entry.getKey(); + + if(!sourceChests.containsKey(item)) + return false; + } + + return true; + } + + private void closeChest() { + Minecraft.getMinecraft().displayGuiScreen(null); + Minecraft.getMinecraft().thePlayer.closeScreen(); + } + + private int getCountOfItemKeyStacksInInventory(String itemKey) { + int count = 0; + + for (ItemStack itemStack : Minecraft.getMinecraft().thePlayer.inventory.mainInventory) { + String key = getItemKey(itemStack); + if(key != null && key.equals(itemKey)) { + count++; + } + } + + return count; + } + + public static boolean isContainerOpen() { + Minecraft mc = Minecraft.getMinecraft(); + Container openContainer = mc.thePlayer.openContainer; + return openContainer != mc.thePlayer.inventoryContainer; + } + + private String getNextItemToTake() { + for (Map.Entry entry : recipe.entrySet()) { + String item = entry.getKey(); + Integer count = entry.getValue(); + + int neededCount = (count * maxRecipeCount) - getCountOfItemKeyStacksInInventory(item); + + if(neededCount >= 1) { + return item; + } + } + + return null; + } + + private int getFirstSlotForCraftItem() { + for (int i = 0; i < Minecraft.getMinecraft().thePlayer.inventory.mainInventory.length; i++) { + ItemStack itemStack = Minecraft.getMinecraft().thePlayer.inventory.mainInventory[i]; + if(getItemKey(itemStack).equals(getItemKey(craftItem))) { + return i; + } + } + return -1; + } + + private void lookAtBlockPos(BlockPos pos) { + Vec3 playerPos = Minecraft.getMinecraft().thePlayer.getPositionEyes(1.0F); + Vec3 targetPos = new Vec3(pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5); + + double diffX = targetPos.xCoord - playerPos.xCoord; + double diffY = targetPos.yCoord - playerPos.yCoord; + double diffZ = targetPos.zCoord - playerPos.zCoord; + double diffXZ = Math.sqrt(diffX * diffX + diffZ * diffZ); + + float yaw = (float) (Math.atan2(diffZ, diffX) * (180 / Math.PI)) - 90.0F; + float pitch = (float) (-(Math.atan2(diffY, diffXZ) * (180 / Math.PI))); + + Minecraft.getMinecraft().thePlayer.rotationYaw = yaw; + Minecraft.getMinecraft().thePlayer.rotationPitch = pitch; + } + + private BlockPos getBlockLookingAt() { + MovingObjectPosition trace = Minecraft.getMinecraft().thePlayer.rayTrace(5, 1.0F); + if(trace != null && trace.typeOfHit == MovingObjectType.BLOCK) { + return trace.getBlockPos(); + } + + return null; + } + + private int translateInventorySlotToContainerCHestSlot(int slot) { + if(slot >= 0 && slot <= 8) + return slot + 27; + else + return slot - 9; + } + + private int getNumperOfRecipeStacksInInventory() { + int count = 0; + for (ItemStack itemStack : Minecraft.getMinecraft().thePlayer.inventory.mainInventory) { + String itemKey = getItemKey(itemStack); + String recipeKey = getItemKey(craftItem); + if(itemKey != null && itemKey.equals(recipeKey)) { + count++; + } + + } + + return count; + } + + + + private void comp() { + switch (compState) { + case OPEN_COMP -> { + if(Minecraft.getMinecraft().thePlayer.openContainer instanceof ContainerChest chest) { + IInventory inv = chest.getLowerChestInventory(); + if(inv.getName().equalsIgnoreCase("§6Custom-Kategorien")) { + ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, new Click(Minecraft.getMinecraft().thePlayer.openContainer.windowId, 11, 0, 1)); + } else if(inv.getName().equalsIgnoreCase("§6Item-Komprimierung-Bauanleitung")) { + int clickSlot = getBestCompSlot(); + ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, new Click(Minecraft.getMinecraft().thePlayer.openContainer.windowId, clickSlot, 0, 1)); + } else if(inv.getName().equalsIgnoreCase("§6Item-Komprimierung")) { + compState = COMP1; + } else if(inv.getName().equalsIgnoreCase("§6Vanilla Bauanleitung")) { + closeChest(); + } + } else { + VersionisedBridge.sendCommand("/rezepte"); + } + } + case COMP1, COMP2, COMP3, COMP4, COMP5, COMP6, FINISHED -> { + if(ClickManager.getSharedInstance().isClickQueueEmpty(QueueType.MEDIUM)) { + if(Minecraft.getMinecraft().thePlayer.openContainer instanceof ContainerChest && Minecraft.getMinecraft().thePlayer.openContainer.getSlot(49).getStack() != null) { + String headName = Minecraft.getMinecraft().thePlayer.openContainer.getSlot(49).getStack().getDisplayName(); + if(headName.contains("§6Komprimierungsstufe")) { + int step = Integer.parseInt(headName.replace("§6Komprimierungsstufe ", "")); + + switch (compState) { + case COMP1 -> { + if(step > 1) + decreaseStep(); + else { + compState = COMP2; + compClick(); + } + } + case COMP2 -> { + if(step == 2) { + compState = COMP3; + compClick(); + } + else if (step < 2) + increaseStep(); + else if(step > 2) + decreaseStep(); + } + case COMP3 -> { + if(step == 3) { + compState = COMP4; + compClick(); + } + else if (step < 3) + increaseStep(); + else if(step > 3) + decreaseStep(); + } + case COMP4 -> { + if(step == 4) { + compState = COMP5; + compClick(); + } + else if (step < 4) + increaseStep(); + else if(step > 4) + decreaseStep(); + } + case COMP5 -> { + if(step == 5) { + compState = COMP6; + compClick(); + } + else if (step < 5) + increaseStep(); + else if(step > 5) + decreaseStep(); + } + case COMP6 -> { + if(step == 6) { + compClick(); + compState = FINISHED; + } + else if (step < 6) + increaseStep(); + else if(step > 6) + decreaseStep(); + } + case FINISHED -> { + closeChest(); + } + } + } + } + } + } + } + } + + private void compClick() { + ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, new Click(Minecraft.getMinecraft().thePlayer.openContainer.windowId, 52, 0, 1)); + } + + private void increaseStep() { + ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, new Click(Minecraft.getMinecraft().thePlayer.openContainer.windowId, 50, 0, 1)); + } + + private void decreaseStep() { + ClickManager.getSharedInstance().addClick(QueueType.MEDIUM, new Click(Minecraft.getMinecraft().thePlayer.openContainer.windowId, 48, 0, 1)); + } + + private int getBestCompSlot() { + //Searches for the best slot in the players inventory to click on. Clicking a lower compression state saves some time. + int bestSlot = 81; + String bestSlotLevel = ""; + + for (int i = 54; i < 90; i++) { + Slot slot = Minecraft.getMinecraft().thePlayer.openContainer.inventorySlots.get(i); + if(slot.getHasStack()) { + ItemStack stack = slot.getStack(); + if(getItemKey(stack).equals(getItemKey(craftItem))) { + if(stack.hasTagCompound() && stack.getTagCompound() != null) { + if(stack.getTagCompound().hasKey("compressionLevel")) { + String level = stack.getTagCompound().getString("compressionLevel"); + + switch (level) { + case "ONE": { + if(!bestSlotLevel.equals("ONE")) { + bestSlot = i; + bestSlotLevel = "ONE"; + } + break; + } + case "TWO": { + if(bestSlotLevel.isEmpty() || bestSlotLevel.equals("THREE") || bestSlotLevel.equals("FOUR") || bestSlotLevel.equals("FIVE") || bestSlotLevel.equals("SIX") || bestSlotLevel.equals("SEVEN")) { + bestSlot = i; + bestSlotLevel = "TWO"; + } + break; + } + case "THREE": { + if(bestSlotLevel.isEmpty() || bestSlotLevel.equals("FOUR") || bestSlotLevel.equals("FIVE") || bestSlotLevel.equals("SIX") || bestSlotLevel.equals("SEVEN")) { + bestSlot = i; + bestSlotLevel = "THREE"; + } + break; + } + case "FOUR": { + if(bestSlotLevel.isEmpty() || bestSlotLevel.equals("FIVE") || bestSlotLevel.equals("SIX") || bestSlotLevel.equals("SEVEN")) { + bestSlot = i; + bestSlotLevel = "FOUR"; + } + break; + } + case "FIVE": { + if(bestSlotLevel.isEmpty() || bestSlotLevel.equals("SIX") || bestSlotLevel.equals("SEVEN")) { + bestSlot = i; + bestSlotLevel = "FIVE"; + } + break; + } + case "SIX": { + if(bestSlotLevel.isEmpty() || bestSlotLevel.equals("SEVEN")) { + bestSlot = i; + bestSlotLevel = "SIX"; + } + break; + } + case "SEVEN": { + if(bestSlotLevel.isEmpty()) { + bestSlot = i; + bestSlotLevel = "SEVEN"; + } + break; + } + } + continue; + } + } + + // Found uncompressed item. + return i; + } + } + } + + return bestSlot; + } +} diff --git a/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/AutoCrafter/StuckProtection.java b/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/AutoCrafter/StuckProtection.java new file mode 100644 index 0000000..7a3d4f8 --- /dev/null +++ b/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/AutoCrafter/StuckProtection.java @@ -0,0 +1,33 @@ +package tmb.randy.tmbgriefergames.v1_8_9.util.AutoCrafter; + +import net.minecraft.client.Minecraft; +import net.minecraft.inventory.Container; + +public class StuckProtection { + // To prevent the auto crafter from being stuck in a container, let's close the container if the same container is open for too many ticks + private static final int TICK_LIMIT = 200; + private static int counter = 0; + + private static Container lastContainer; + + public static void tick(Container container) { + if(container != lastContainer) { + lastContainer = container; + counter = 0; + return; + } + + counter++; + + if(counter > TICK_LIMIT) { + Minecraft.getMinecraft().displayGuiScreen(null); + Minecraft.getMinecraft().thePlayer.closeScreen(); + counter = 0; + } + } + + public static void reset() { + counter = 0; + } +} + diff --git a/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/HABK.java b/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/HABK.java new file mode 100644 index 0000000..57016bf --- /dev/null +++ b/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/HABK.java @@ -0,0 +1,59 @@ +package tmb.randy.tmbgriefergames.v1_8_9.util; + +import net.labymod.api.event.client.input.MouseButtonEvent; +import net.labymod.api.event.client.input.MouseButtonEvent.Action; +import net.labymod.api.util.I18n; +import net.minecraft.client.Minecraft; +import net.minecraft.item.ItemBow; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemSword; +import tmb.randy.tmbgriefergames.core.Addon; + +import static tmb.randy.tmbgriefergames.v1_8_9.util.ItemSaver.NBTTagStringBirthBow; +import static tmb.randy.tmbgriefergames.v1_8_9.util.ItemSaver.findHotbarSlotforItem; + +public class HABK { + + public void onMouseButtonEvent(MouseButtonEvent event) { + if(Addon.getSharedInstance().configuration().getSwordsSubConfig().getHABKenabled().get() && event.button().isRight() && event.action() == Action.RELEASE) { + int selectedSlot = Minecraft.getMinecraft().thePlayer.inventory.currentItem; + + ItemStack heldItemStack = Minecraft.getMinecraft().thePlayer.inventory.getStackInSlot(selectedSlot); + ItemStack firstItemStack = Minecraft.getMinecraft().thePlayer.inventory.getStackInSlot(0); + + String enchantments = null; + + if(heldItemStack != null && heldItemStack.getTagCompound() != null) { + if(heldItemStack.getTagCompound().hasKey("ench")) { + enchantments = heldItemStack.getTagCompound().getTag("ench").toString(); + } + } + + if(enchantments != null && enchantments.equals(NBTTagStringBirthBow)) { + Addon.getSharedInstance().getBridge().changeSlot(findHotbarSlotforItem()); + Addon.getSharedInstance().displayNotification("§4§l" + I18n.translate("tmbgriefergames.itemSaver.item_saver_message_birth_bow")); + event.setCancelled(true); + } else if (heldItemStack != null && heldItemStack.getItem() instanceof ItemBow && firstItemStack.getItem() instanceof ItemSword) { + + new java.util.Timer().schedule( + new java.util.TimerTask() { + @Override + public void run() { + Minecraft.getMinecraft().thePlayer.inventory.currentItem = 0; + new java.util.Timer().schedule( + new java.util.TimerTask() { + @Override + public void run() { + Minecraft.getMinecraft().thePlayer.inventory.currentItem = selectedSlot; + } + }, + Addon.getSharedInstance().configuration().getSwordsSubConfig().getHABKcooldown().get() + ); + } + }, + 5 + ); + } + } + } +} \ No newline at end of file diff --git a/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/ItemSaver.java b/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/ItemSaver.java index 9009f6f..a52fdab 100644 --- a/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/ItemSaver.java +++ b/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/ItemSaver.java @@ -18,27 +18,28 @@ public class ItemSaver { public void mouseButtonEvent(MouseButtonEvent event) { - - if(Laby.labyAPI().minecraft().getClientPlayer() != null) { - if(Laby.labyAPI().minecraft().getClientPlayer().getMainHandItemStack() != null) { - ItemStack stack = Laby.labyAPI().minecraft().getClientPlayer().getMainHandItemStack(); - if(stack.hasDataComponentContainer()) { - if(stack.getDataComponentContainer().has(DataComponentKey.simple("ench"))) { - String enchantments = stack.getDataComponentContainer().get(DataComponentKey.simple("ench")).toString(); - - if(event.action() == Action.CLICK) { - if((enchantments.equals(NBTTagStringBonze) || enchantments.equals(NBTTagStringBirthSword)) && event.button().isLeft()) { - Addon.getSharedInstance().displayNotification("§4§l" + I18n.translate("tmbgriefergames.itemSaver.item_saver_message_sword")); - Addon.getSharedInstance().getBridge().changeSlot(findHotbarSlotforItem()); - event.setCancelled(true); - } else if(enchantments.equals(NBTTagStringSoS) && event.button().isRight()) { - Addon.getSharedInstance().displayNotification("§4§l" + I18n.translate("tmbgriefergames.itemSaver.item_saver_message_sos")); - Addon.getSharedInstance().getBridge().changeSlot(findHotbarSlotforBlock()); - event.setCancelled(true); - } else if(enchantments.equals(NBTTagStringBirthBow) && event.button().isRight()) { - Addon.getSharedInstance().displayNotification("§4§l" + I18n.translate("tmbgriefergames.itemSaver.item_saver_message_birth_bow")); - Addon.getSharedInstance().getBridge().changeSlot(findHotbarSlotforItem()); - event.setCancelled(true); + if(Addon.getSharedInstance().configuration().getItemProtection().get()) { + if(Laby.labyAPI().minecraft().getClientPlayer() != null) { + if(Laby.labyAPI().minecraft().getClientPlayer().getMainHandItemStack() != null) { + ItemStack stack = Laby.labyAPI().minecraft().getClientPlayer().getMainHandItemStack(); + if(stack.hasDataComponentContainer()) { + if(stack.getDataComponentContainer().has(DataComponentKey.simple("ench"))) { + String enchantments = stack.getDataComponentContainer().get(DataComponentKey.simple("ench")).toString(); + + if(event.action() == Action.CLICK) { + if((enchantments.equals(NBTTagStringBonze) || enchantments.equals(NBTTagStringBirthSword)) && event.button().isLeft()) { + Addon.getSharedInstance().displayNotification("§4§l" + I18n.translate("tmbgriefergames.itemSaver.item_saver_message_sword")); + Addon.getSharedInstance().getBridge().changeSlot(findHotbarSlotforItem()); + event.setCancelled(true); + } else if(enchantments.equals(NBTTagStringSoS) && event.button().isRight()) { + Addon.getSharedInstance().displayNotification("§4§l" + I18n.translate("tmbgriefergames.itemSaver.item_saver_message_sos")); + Addon.getSharedInstance().getBridge().changeSlot(findHotbarSlotforBlock()); + event.setCancelled(true); + } else if(enchantments.equals(NBTTagStringBirthBow) && event.button().isRight()) { + Addon.getSharedInstance().displayNotification("§4§l" + I18n.translate("tmbgriefergames.itemSaver.item_saver_message_birth_bow")); + Addon.getSharedInstance().getBridge().changeSlot(findHotbarSlotforItem()); + event.setCancelled(true); + } } } } diff --git a/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/ItemShifter.java b/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/ItemShifter.java index 10fdb70..c78f8a7 100644 --- a/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/ItemShifter.java +++ b/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/ItemShifter.java @@ -118,7 +118,7 @@ public void startShifting() { } public void tick(GameTickEvent event) { - if((Key.ARROW_LEFT.isPressed() && Key.ARROW_UP.isPressed() && Key.ARROW_RIGHT.isPressed()) || !(Minecraft.getMinecraft().thePlayer.openContainer instanceof ContainerChest)) + if((Keyboard.isKeyDown(Key.ARROW_LEFT.getId()) && Keyboard.isKeyDown(Key.ARROW_UP.getId()) && Keyboard.isKeyDown(Key.ARROW_RIGHT.getId())) || !(Minecraft.getMinecraft().thePlayer.openContainer instanceof ContainerChest)) return; if (Minecraft.getMinecraft().thePlayer != null && Minecraft.getMinecraft().thePlayer.openContainer != null && Minecraft.getMinecraft().currentScreen instanceof GuiChest) { @@ -129,7 +129,7 @@ public void tick(GameTickEvent event) { stopShifting(); } - if ((Key.ARROW_UP.isPressed()) && ClickManager.getSharedInstance().isClickQueueEmpty(QueueType.SLOW)) { + if (Keyboard.isKeyDown(Key.ARROW_UP.getId()) && ClickManager.getSharedInstance().isClickQueueEmpty(QueueType.SLOW)) { if (inv.getName().equalsIgnoreCase("§6Trichter-Einstellungen") && ClickManager.getSharedInstance().isClickQueueEmpty(QueueType.SLOW)) { shiftClick(49); for (int i = 0; i < 15; i++) { @@ -139,7 +139,7 @@ public void tick(GameTickEvent event) { setTopToBottom(false); startShifting(); } - } else if (Key.ARROW_DOWN.isPressed() && ClickManager.getSharedInstance().isClickQueueEmpty(QueueType.SLOW)) { + } else if (Keyboard.isKeyDown(Key.ARROW_DOWN.getId()) && ClickManager.getSharedInstance().isClickQueueEmpty(QueueType.SLOW)) { setTopToBottom(true); startShifting(); } diff --git a/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/PlotSwitch.java b/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/PlotSwitch.java index d792ba2..629ac83 100644 --- a/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/PlotSwitch.java +++ b/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/PlotSwitch.java @@ -1,7 +1,6 @@ package tmb.randy.tmbgriefergames.v1_8_9.util; import net.labymod.api.Laby; -import net.labymod.api.client.gui.screen.key.Key; import net.labymod.api.event.Phase; import net.labymod.api.event.client.chat.ChatMessageSendEvent; import net.labymod.api.event.client.chat.ChatReceiveEvent; diff --git a/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/VABK.java b/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/VABK.java new file mode 100644 index 0000000..69c2ecc --- /dev/null +++ b/game-runner/src/v1_8_9/java/tmb/randy/tmbgriefergames/v1_8_9/util/VABK.java @@ -0,0 +1,75 @@ +package tmb.randy.tmbgriefergames.v1_8_9.util; + +import net.labymod.api.event.Phase; +import net.labymod.api.event.client.input.KeyEvent; +import net.labymod.api.event.client.input.KeyEvent.State; +import net.labymod.api.event.client.lifecycle.GameTickEvent; +import net.labymod.api.util.I18n; +import net.minecraft.client.Minecraft; +import net.minecraft.item.ItemBow; +import net.minecraft.item.ItemStack; +import tmb.randy.tmbgriefergames.core.Addon; + +public class VABK { + private int cooldown = 0; + private boolean active; + + public void onTickEvent(GameTickEvent event) { + if(Minecraft.getMinecraft().thePlayer == null || Minecraft.getMinecraft().theWorld == null) + return; + + if (event.phase() == Phase.PRE && active) { + cooldown++; + + if (cooldown >= (Addon.getSharedInstance().configuration().getSwordsSubConfig().getVABKswitchCooldown().get() + Addon.getSharedInstance().configuration().getSwordsSubConfig().getVABKloadTime().get())) { + cooldown = 0; + shoot(); + } else if (cooldown == Addon.getSharedInstance().configuration().getSwordsSubConfig().getVABKswitchCooldown().get() - 2) { + Minecraft.getMinecraft().thePlayer.inventory.currentItem = 2; + } else if (cooldown == Addon.getSharedInstance().configuration().getSwordsSubConfig().getVABKswitchCooldown().get()) { + startUsingBow(); + } + } + } + + public void onKeyEvent(KeyEvent event) { + if(event.state() == State.PRESS && VersionisedBridge.allKeysPressed(Addon.getSharedInstance().configuration().getSwordsSubConfig().getVABKhotkey().get()) && !VersionisedBridge.isChatGuiOpen()) { + toggleActive(); + } + } + + public void toggleActive() { + active = !active; + Addon.getSharedInstance().displayNotification( + I18n.getTranslation(active ? "tmbgriefergames.autoSword.enabled" : "tmbgriefergames.autoSword.disabled")); + } + + public void stop() { + if(active) { + toggleActive(); + } + } + + private void startUsingBow() { + if(Minecraft.getMinecraft().thePlayer == null || Minecraft.getMinecraft().theWorld == null) + return; + + ItemStack heldItem = Minecraft.getMinecraft().thePlayer.getHeldItem(); + + if (heldItem != null && heldItem.getItem() instanceof ItemBow) + Minecraft.getMinecraft().playerController.sendUseItem(Minecraft.getMinecraft().thePlayer, Minecraft.getMinecraft().theWorld, heldItem); + } + + private void shoot() { + if(Minecraft.getMinecraft().thePlayer == null || Minecraft.getMinecraft().theWorld == null) + return; + + ItemStack heldItem = Minecraft.getMinecraft().thePlayer.getHeldItem(); + + if (heldItem != null && heldItem.getItem() instanceof ItemBow) + Minecraft.getMinecraft().playerController.onStoppedUsingItem(Minecraft.getMinecraft().thePlayer); + + Minecraft.getMinecraft().thePlayer.inventory.currentItem = 0; + } +} + 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 3e3aeaa..2fde906 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 @@ -26,6 +26,9 @@ import org.lwjgl.input.Keyboard; import tmb.randy.tmbgriefergames.core.Addon; import tmb.randy.tmbgriefergames.core.IBridge; +import tmb.randy.tmbgriefergames.v1_8_9.util.AutoCrafter.AutoCrafterV1; +import tmb.randy.tmbgriefergames.v1_8_9.util.AutoCrafter.AutoCrafterV2; +import tmb.randy.tmbgriefergames.v1_8_9.util.AutoCrafter.AutoCrafterV3; 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; @@ -59,15 +62,18 @@ public class VersionisedBridge implements IBridge { private final ItemShifter itemShifter = new ItemShifter(); private final NatureBordersRenderer natureBordersRenderer = new NatureBordersRenderer(); private final AccountUnity accountUnity = new AccountUnity(); - private final AutoCrafterNew autoCrafterNew = new AutoCrafterNew(); - private final AutoCrafter autoCrafter = new AutoCrafter(); + private final AutoCrafterV1 autoCrafterV1 = new AutoCrafterV1(); + private final AutoCrafterV2 autoCrafterV2 = new AutoCrafterV2(); + private final AutoCrafterV3 autoCrafterV3 = new AutoCrafterV3(); private final AutoDecomp autoDecomp = new AutoDecomp(); private final AutoComp autoComp = new AutoComp(); private final Auswurf auswurf = new Auswurf(); + private final HABK habk = new HABK(); + private final VABK vabk = new VABK(); private GuiScreen lastGui; - private static final int commandCountdownLimit = 20; + private static final int commandCountdownLimit = 80; private static int commandCountdown = 0; @Subscribe @@ -91,6 +97,7 @@ public void messageReceived(ChatReceiveEvent event) { autoHopper.messageReceived(event); accountUnity.messageReceived(event); msgTabs.chatMessageReceived(event); + autoCrafterV3.chatMessageReceived(event); } @Subscribe @@ -112,6 +119,7 @@ public void mouseInput(MouseButtonEvent event) { itemSaver.mouseButtonEvent(event); autoHopper.mouseInput(event); flyTimer.onMouseButtonEvent(event); + habk.onMouseButtonEvent(event); } @Subscribe @@ -146,13 +154,15 @@ public void tick(GameTickEvent event) { ClickManager.getSharedInstance().tick(event); autoComp.onTickEvent(event); - autoCrafter.onTickEvent(event); + autoCrafterV1.onTickEvent(event); autoHopper.tick(event); itemShifter.tick(event); plotSwitch.tick(event); - autoCrafterNew.onTickEvent(event); + autoCrafterV2.onTickEvent(event); autoDecomp.onTickEvent(event); auswurf.onTickEvent(event); + autoCrafterV3.onTick(event); + vabk.onTickEvent(event); commandCountdown(); } @@ -167,10 +177,12 @@ public void keyDown(KeyEvent event) { itemShifter.onKey(event); natureBordersRenderer.onKey(event); autoComp.onKeyEvent(event); - autoCrafter.onKeyEvent(event); - autoCrafterNew.onKeyEvent(event); + autoCrafterV1.onKeyEvent(event); + autoCrafterV2.onKeyEvent(event); autoDecomp.onKeyEvent(event); auswurf.onKeyEvent(event); + autoCrafterV3.onKey(event); + vabk.onKeyEvent(event); } @Subscribe @@ -218,7 +230,7 @@ public void networkPayloadEvent(NetworkPayloadEvent event) { public void cbChanged() { playerTracer.cbChanged(); autoComp.stopComp(); - autoCrafterNew.stopCrafter(); + autoCrafterV2.stopCrafter(); } @Override @@ -238,7 +250,7 @@ public String getItemRemoverValue() { @Override public void startNewAutocrafter() { - autoCrafterNew.startCrafter(); + autoCrafterV2.startCrafter(); } @Override @@ -249,6 +261,11 @@ public boolean isCompActive() { @Override public void changeSlot(int slot) {Minecraft.getMinecraft().thePlayer.inventory.currentItem = slot;} + @Override + public void startAutocrafterV3() { + autoCrafterV3.toggle(); + } + private static void commandCountdown() { if (commandCountdown > 0) { commandCountdown--; 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 index bc8cf5d..b1f90d3 100644 --- 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 @@ -8,7 +8,6 @@ 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; @@ -124,7 +123,7 @@ private ChatTab getTabForName(String message) { private ChatWindow getChatWindow() { if(Addon.getSharedInstance().configuration().getChatConfig().getMsgTabMode().get()) { - for (ChatWindow window : LabyMod.references().advancedChatController().getWindows()) { + for (ChatWindow window : Laby.references().advancedChatController().getWindows()) { if (window.isMainWindow()) { return window; }