From d1e16a47819509ed645bb93e1a173e0a97025cef Mon Sep 17 00:00:00 2001 From: Linnea Gräf Date: Wed, 8 Jan 2025 19:25:29 +0100 Subject: build: Move mod to subproject --- .github/workflows/build.yml | 6 +- build-src/src/main/kotlin/helpers.kt | 10 + build.gradle.kts | 186 +------------------ gradle.properties | 5 +- ledger-rules.pro | 4 - log4j2.xml | 5 - mod/build.gradle.kts | 170 +++++++++++++++++ mod/gradle.properties | 3 + mod/ledger-rules.pro | 4 + mod/log4j2.xml | 5 + .../nea/ledger/init/AutoDiscoveryMixinPlugin.java | 193 +++++++++++++++++++ .../moe/nea/ledger/mixin/AccessorGuiEditSign.java | 12 ++ .../moe/nea/ledger/mixin/MouseClickEventPatch.java | 18 ++ .../mixin/OnInitializationCompletePatch.java | 18 ++ .../mixin/devenv/RegisterModResourcesPatch.java | 66 +++++++ .../main/kotlin/moe/nea/ledger/ConfigCommand.kt | 31 ++++ .../main/kotlin/moe/nea/ledger/DebouncedValue.kt | 38 ++++ .../main/kotlin/moe/nea/ledger/DebugDataCommand.kt | 34 ++++ mod/src/main/kotlin/moe/nea/ledger/DevUtil.kt | 7 + .../main/kotlin/moe/nea/ledger/ExpiringValue.kt | 30 +++ mod/src/main/kotlin/moe/nea/ledger/ItemChange.kt | 84 +++++++++ mod/src/main/kotlin/moe/nea/ledger/ItemId.kt | 35 ++++ .../main/kotlin/moe/nea/ledger/ItemIdProvider.kt | 188 +++++++++++++++++++ mod/src/main/kotlin/moe/nea/ledger/ItemUtil.kt | 90 +++++++++ mod/src/main/kotlin/moe/nea/ledger/Ledger.kt | 205 +++++++++++++++++++++ mod/src/main/kotlin/moe/nea/ledger/LedgerEntry.kt | 29 +++ mod/src/main/kotlin/moe/nea/ledger/LedgerLogger.kt | 136 ++++++++++++++ .../main/kotlin/moe/nea/ledger/LogChatCommand.kt | 27 +++ mod/src/main/kotlin/moe/nea/ledger/MCUUIDUtil.kt | 22 +++ mod/src/main/kotlin/moe/nea/ledger/NumberUtil.kt | 117 ++++++++++++ mod/src/main/kotlin/moe/nea/ledger/QueryCommand.kt | 197 ++++++++++++++++++++ .../main/kotlin/moe/nea/ledger/ScoreboardUtil.kt | 29 +++ .../kotlin/moe/nea/ledger/TelemetryProvider.kt | 66 +++++++ .../main/kotlin/moe/nea/ledger/TransactionType.kt | 35 ++++ .../main/kotlin/moe/nea/ledger/TriggerCommand.kt | 34 ++++ .../kotlin/moe/nea/ledger/config/DebugOptions.kt | 13 ++ .../kotlin/moe/nea/ledger/config/LedgerConfig.kt | 35 ++++ .../kotlin/moe/nea/ledger/config/MainOptions.kt | 27 +++ .../nea/ledger/config/SynchronizationOptions.kt | 11 ++ .../main/kotlin/moe/nea/ledger/config/UpdateUi.kt | 17 ++ .../kotlin/moe/nea/ledger/config/UpdateUiMarker.kt | 6 + .../kotlin/moe/nea/ledger/database/DBLogEntry.kt | 24 +++ .../kotlin/moe/nea/ledger/database/DBUpgrade.kt | 68 +++++++ .../kotlin/moe/nea/ledger/database/Database.kt | 57 ++++++ .../kotlin/moe/nea/ledger/database/Upgrades.kt | 20 ++ .../main/kotlin/moe/nea/ledger/database/schema.dot | 23 +++ .../moe/nea/ledger/events/BeforeGuiAction.kt | 11 ++ .../kotlin/moe/nea/ledger/events/ChatReceived.kt | 15 ++ .../moe/nea/ledger/events/ExtraSupplyIdEvent.kt | 12 ++ .../kotlin/moe/nea/ledger/events/GuiClickEvent.kt | 9 + .../nea/ledger/events/InitializationComplete.kt | 6 + .../nea/ledger/events/RegistrationFinishedEvent.kt | 7 + .../moe/nea/ledger/events/SupplyDebugInfo.kt | 10 + .../kotlin/moe/nea/ledger/events/TriggerEvent.kt | 7 + .../kotlin/moe/nea/ledger/events/WorldLoadEvent.kt | 5 + .../moe/nea/ledger/events/WorldSwitchEvent.kt | 6 + .../ledger/modules/AccessorySwapperDetection.kt | 34 ++++ .../moe/nea/ledger/modules/AllowanceDetection.kt | 37 ++++ .../nea/ledger/modules/AuctionHouseDetection.kt | 143 ++++++++++++++ .../kotlin/moe/nea/ledger/modules/BankDetection.kt | 49 +++++ .../moe/nea/ledger/modules/BazaarDetection.kt | 58 ++++++ .../moe/nea/ledger/modules/BazaarOrderDetection.kt | 95 ++++++++++ .../kotlin/moe/nea/ledger/modules/BitsDetection.kt | 62 +++++++ .../moe/nea/ledger/modules/BitsShopDetection.kt | 66 +++++++ .../moe/nea/ledger/modules/ChestDetection.kt | 48 +++++ .../ledger/modules/DragonEyePlacementDetection.kt | 47 +++++ .../nea/ledger/modules/DragonSacrificeDetection.kt | 72 ++++++++ .../nea/ledger/modules/DungeonChestDetection.kt | 95 ++++++++++ .../moe/nea/ledger/modules/ExternalDataProvider.kt | 43 +++++ .../moe/nea/ledger/modules/EyedropsDetection.kt | 35 ++++ .../moe/nea/ledger/modules/ForgeDetection.kt | 48 +++++ .../moe/nea/ledger/modules/GambleDetection.kt | 62 +++++++ .../moe/nea/ledger/modules/GodPotionDetection.kt | 35 ++++ .../nea/ledger/modules/GodPotionMixinDetection.kt | 38 ++++ .../kotlin/moe/nea/ledger/modules/KatDetection.kt | 95 ++++++++++ .../moe/nea/ledger/modules/KuudraChestDetection.kt | 45 +++++ .../nea/ledger/modules/MineshaftCorpseDetection.kt | 81 ++++++++ .../moe/nea/ledger/modules/MinionDetection.kt | 61 ++++++ .../kotlin/moe/nea/ledger/modules/NpcDetection.kt | 111 +++++++++++ .../kotlin/moe/nea/ledger/modules/UpdateChecker.kt | 167 +++++++++++++++++ .../moe/nea/ledger/modules/VisitorDetection.kt | 87 +++++++++ .../moe/nea/ledger/utils/BorderedTextTracker.kt | 41 +++++ .../main/kotlin/moe/nea/ledger/utils/ErrorUtil.kt | 52 ++++++ .../main/kotlin/moe/nea/ledger/utils/GsonUtil.kt | 10 + .../moe/nea/ledger/utils/MinecraftExecutor.kt | 10 + .../kotlin/moe/nea/ledger/utils/NoSideEffects.kt | 4 + .../kotlin/moe/nea/ledger/utils/network/Request.kt | 40 ++++ .../moe/nea/ledger/utils/network/RequestUtil.kt | 63 +++++++ .../moe/nea/ledger/utils/network/Response.kt | 19 ++ .../nea/ledger/utils/telemetry/BooleanContext.kt | 10 + .../moe/nea/ledger/utils/telemetry/CommonKeys.kt | 9 + .../moe/nea/ledger/utils/telemetry/Context.kt | 57 ++++++ .../moe/nea/ledger/utils/telemetry/ContextValue.kt | 70 +++++++ .../nea/ledger/utils/telemetry/EventRecorder.kt | 9 + .../utils/telemetry/ExceptionContextValue.kt | 39 ++++ .../ledger/utils/telemetry/JsonElementContext.kt | 9 + .../ledger/utils/telemetry/LoggingEventRecorder.kt | 25 +++ .../nea/ledger/utils/telemetry/RecordedEvent.kt | 5 + .../moe/nea/ledger/utils/telemetry/Severity.kt | 8 + .../kotlin/moe/nea/ledger/utils/telemetry/Span.kt | 146 +++++++++++++++ .../nea/ledger/utils/telemetry/StringContext.kt | 11 ++ mod/src/main/resources/ledgerkeystore.jks | Bin 0 -> 104393 bytes mod/src/main/resources/mcmod.info | 18 ++ mod/src/main/resources/mixins.moneyledger.json | 7 + .../test/kotlin/moe/nea/ledger/NumberUtilKtTest.kt | 17 ++ settings.gradle.kts | 1 + .../nea/ledger/init/AutoDiscoveryMixinPlugin.java | 193 ------------------- .../moe/nea/ledger/mixin/AccessorGuiEditSign.java | 12 -- .../moe/nea/ledger/mixin/MouseClickEventPatch.java | 18 -- .../mixin/OnInitializationCompletePatch.java | 18 -- .../mixin/devenv/RegisterModResourcesPatch.java | 66 ------- src/main/kotlin/moe/nea/ledger/ConfigCommand.kt | 31 ---- src/main/kotlin/moe/nea/ledger/DebouncedValue.kt | 38 ---- src/main/kotlin/moe/nea/ledger/DebugDataCommand.kt | 34 ---- src/main/kotlin/moe/nea/ledger/DevUtil.kt | 7 - src/main/kotlin/moe/nea/ledger/ExpiringValue.kt | 30 --- src/main/kotlin/moe/nea/ledger/ItemChange.kt | 84 --------- src/main/kotlin/moe/nea/ledger/ItemId.kt | 35 ---- src/main/kotlin/moe/nea/ledger/ItemIdProvider.kt | 188 ------------------- src/main/kotlin/moe/nea/ledger/ItemUtil.kt | 90 --------- src/main/kotlin/moe/nea/ledger/Ledger.kt | 205 --------------------- src/main/kotlin/moe/nea/ledger/LedgerEntry.kt | 29 --- src/main/kotlin/moe/nea/ledger/LedgerLogger.kt | 136 -------------- src/main/kotlin/moe/nea/ledger/LogChatCommand.kt | 27 --- src/main/kotlin/moe/nea/ledger/MCUUIDUtil.kt | 22 --- src/main/kotlin/moe/nea/ledger/NumberUtil.kt | 117 ------------ src/main/kotlin/moe/nea/ledger/QueryCommand.kt | 197 -------------------- src/main/kotlin/moe/nea/ledger/ScoreboardUtil.kt | 29 --- .../kotlin/moe/nea/ledger/TelemetryProvider.kt | 66 ------- src/main/kotlin/moe/nea/ledger/TransactionType.kt | 35 ---- src/main/kotlin/moe/nea/ledger/TriggerCommand.kt | 34 ---- .../kotlin/moe/nea/ledger/config/DebugOptions.kt | 13 -- .../kotlin/moe/nea/ledger/config/LedgerConfig.kt | 35 ---- .../kotlin/moe/nea/ledger/config/MainOptions.kt | 27 --- .../nea/ledger/config/SynchronizationOptions.kt | 11 -- src/main/kotlin/moe/nea/ledger/config/UpdateUi.kt | 17 -- .../kotlin/moe/nea/ledger/config/UpdateUiMarker.kt | 6 - .../kotlin/moe/nea/ledger/database/DBLogEntry.kt | 24 --- .../kotlin/moe/nea/ledger/database/DBUpgrade.kt | 68 ------- .../kotlin/moe/nea/ledger/database/Database.kt | 57 ------ .../kotlin/moe/nea/ledger/database/Upgrades.kt | 20 -- src/main/kotlin/moe/nea/ledger/database/schema.dot | 23 --- .../moe/nea/ledger/events/BeforeGuiAction.kt | 11 -- .../kotlin/moe/nea/ledger/events/ChatReceived.kt | 15 -- .../moe/nea/ledger/events/ExtraSupplyIdEvent.kt | 12 -- .../kotlin/moe/nea/ledger/events/GuiClickEvent.kt | 9 - .../nea/ledger/events/InitializationComplete.kt | 6 - .../nea/ledger/events/RegistrationFinishedEvent.kt | 7 - .../moe/nea/ledger/events/SupplyDebugInfo.kt | 10 - .../kotlin/moe/nea/ledger/events/TriggerEvent.kt | 7 - .../kotlin/moe/nea/ledger/events/WorldLoadEvent.kt | 5 - .../moe/nea/ledger/events/WorldSwitchEvent.kt | 6 - .../ledger/modules/AccessorySwapperDetection.kt | 34 ---- .../moe/nea/ledger/modules/AllowanceDetection.kt | 37 ---- .../nea/ledger/modules/AuctionHouseDetection.kt | 143 -------------- .../kotlin/moe/nea/ledger/modules/BankDetection.kt | 49 ----- .../moe/nea/ledger/modules/BazaarDetection.kt | 58 ------ .../moe/nea/ledger/modules/BazaarOrderDetection.kt | 95 ---------- .../kotlin/moe/nea/ledger/modules/BitsDetection.kt | 62 ------- .../moe/nea/ledger/modules/BitsShopDetection.kt | 66 ------- .../moe/nea/ledger/modules/ChestDetection.kt | 48 ----- .../ledger/modules/DragonEyePlacementDetection.kt | 47 ----- .../nea/ledger/modules/DragonSacrificeDetection.kt | 72 -------- .../nea/ledger/modules/DungeonChestDetection.kt | 95 ---------- .../moe/nea/ledger/modules/ExternalDataProvider.kt | 43 ----- .../moe/nea/ledger/modules/EyedropsDetection.kt | 35 ---- .../moe/nea/ledger/modules/ForgeDetection.kt | 48 ----- .../moe/nea/ledger/modules/GambleDetection.kt | 62 ------- .../moe/nea/ledger/modules/GodPotionDetection.kt | 35 ---- .../nea/ledger/modules/GodPotionMixinDetection.kt | 38 ---- .../kotlin/moe/nea/ledger/modules/KatDetection.kt | 95 ---------- .../moe/nea/ledger/modules/KuudraChestDetection.kt | 45 ----- .../nea/ledger/modules/MineshaftCorpseDetection.kt | 81 -------- .../moe/nea/ledger/modules/MinionDetection.kt | 61 ------ .../kotlin/moe/nea/ledger/modules/NpcDetection.kt | 111 ----------- .../kotlin/moe/nea/ledger/modules/UpdateChecker.kt | 167 ----------------- .../moe/nea/ledger/modules/VisitorDetection.kt | 87 --------- .../moe/nea/ledger/utils/BorderedTextTracker.kt | 41 ----- src/main/kotlin/moe/nea/ledger/utils/ErrorUtil.kt | 52 ------ src/main/kotlin/moe/nea/ledger/utils/GsonUtil.kt | 10 - .../moe/nea/ledger/utils/MinecraftExecutor.kt | 10 - .../kotlin/moe/nea/ledger/utils/NoSideEffects.kt | 4 - .../kotlin/moe/nea/ledger/utils/network/Request.kt | 40 ---- .../moe/nea/ledger/utils/network/RequestUtil.kt | 63 ------- .../moe/nea/ledger/utils/network/Response.kt | 19 -- .../nea/ledger/utils/telemetry/BooleanContext.kt | 10 - .../moe/nea/ledger/utils/telemetry/CommonKeys.kt | 9 - .../moe/nea/ledger/utils/telemetry/Context.kt | 57 ------ .../moe/nea/ledger/utils/telemetry/ContextValue.kt | 70 ------- .../nea/ledger/utils/telemetry/EventRecorder.kt | 9 - .../utils/telemetry/ExceptionContextValue.kt | 39 ---- .../ledger/utils/telemetry/JsonElementContext.kt | 9 - .../ledger/utils/telemetry/LoggingEventRecorder.kt | 25 --- .../nea/ledger/utils/telemetry/RecordedEvent.kt | 5 - .../moe/nea/ledger/utils/telemetry/Severity.kt | 8 - .../kotlin/moe/nea/ledger/utils/telemetry/Span.kt | 146 --------------- .../nea/ledger/utils/telemetry/StringContext.kt | 11 -- src/main/resources/ledgerkeystore.jks | Bin 104393 -> 0 bytes src/main/resources/mcmod.info | 18 -- src/main/resources/mixins.moneyledger.json | 7 - src/test/kotlin/moe/nea/ledger/NumberUtilKtTest.kt | 17 -- 201 files changed, 4728 insertions(+), 4717 deletions(-) create mode 100644 build-src/src/main/kotlin/helpers.kt delete mode 100644 ledger-rules.pro delete mode 100644 log4j2.xml create mode 100644 mod/build.gradle.kts create mode 100644 mod/gradle.properties create mode 100644 mod/ledger-rules.pro create mode 100644 mod/log4j2.xml create mode 100644 mod/src/main/java/moe/nea/ledger/init/AutoDiscoveryMixinPlugin.java create mode 100644 mod/src/main/java/moe/nea/ledger/mixin/AccessorGuiEditSign.java create mode 100644 mod/src/main/java/moe/nea/ledger/mixin/MouseClickEventPatch.java create mode 100644 mod/src/main/java/moe/nea/ledger/mixin/OnInitializationCompletePatch.java create mode 100644 mod/src/main/java/moe/nea/ledger/mixin/devenv/RegisterModResourcesPatch.java create mode 100644 mod/src/main/kotlin/moe/nea/ledger/ConfigCommand.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/DebouncedValue.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/DebugDataCommand.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/DevUtil.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/ExpiringValue.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/ItemChange.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/ItemId.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/ItemIdProvider.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/ItemUtil.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/Ledger.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/LedgerEntry.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/LedgerLogger.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/LogChatCommand.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/MCUUIDUtil.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/NumberUtil.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/QueryCommand.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/ScoreboardUtil.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/TelemetryProvider.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/TransactionType.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/TriggerCommand.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/config/DebugOptions.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/config/LedgerConfig.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/config/MainOptions.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/config/SynchronizationOptions.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/config/UpdateUi.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/config/UpdateUiMarker.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/database/DBLogEntry.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/database/DBUpgrade.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/database/Database.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/database/Upgrades.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/database/schema.dot create mode 100644 mod/src/main/kotlin/moe/nea/ledger/events/BeforeGuiAction.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/events/ChatReceived.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/events/ExtraSupplyIdEvent.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/events/GuiClickEvent.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/events/InitializationComplete.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/events/RegistrationFinishedEvent.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/events/SupplyDebugInfo.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/events/TriggerEvent.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/events/WorldLoadEvent.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/events/WorldSwitchEvent.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/modules/AccessorySwapperDetection.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/modules/AllowanceDetection.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/modules/AuctionHouseDetection.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/modules/BankDetection.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/modules/BazaarDetection.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/modules/BazaarOrderDetection.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/modules/BitsDetection.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/modules/BitsShopDetection.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/modules/ChestDetection.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/modules/DragonEyePlacementDetection.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/modules/DragonSacrificeDetection.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/modules/DungeonChestDetection.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/modules/ExternalDataProvider.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/modules/EyedropsDetection.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/modules/ForgeDetection.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/modules/GambleDetection.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/modules/GodPotionDetection.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/modules/GodPotionMixinDetection.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/modules/KatDetection.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/modules/KuudraChestDetection.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/modules/MineshaftCorpseDetection.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/modules/MinionDetection.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/modules/NpcDetection.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/modules/UpdateChecker.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/modules/VisitorDetection.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/utils/BorderedTextTracker.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/utils/ErrorUtil.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/utils/GsonUtil.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/utils/MinecraftExecutor.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/utils/NoSideEffects.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/utils/network/Request.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/utils/network/RequestUtil.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/utils/network/Response.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/utils/telemetry/BooleanContext.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/utils/telemetry/CommonKeys.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/utils/telemetry/Context.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/utils/telemetry/ContextValue.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/utils/telemetry/EventRecorder.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/utils/telemetry/ExceptionContextValue.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/utils/telemetry/JsonElementContext.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/utils/telemetry/LoggingEventRecorder.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/utils/telemetry/RecordedEvent.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/utils/telemetry/Severity.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/utils/telemetry/Span.kt create mode 100644 mod/src/main/kotlin/moe/nea/ledger/utils/telemetry/StringContext.kt create mode 100644 mod/src/main/resources/ledgerkeystore.jks create mode 100644 mod/src/main/resources/mcmod.info create mode 100644 mod/src/main/resources/mixins.moneyledger.json create mode 100644 mod/src/test/kotlin/moe/nea/ledger/NumberUtilKtTest.kt delete mode 100644 src/main/java/moe/nea/ledger/init/AutoDiscoveryMixinPlugin.java delete mode 100644 src/main/java/moe/nea/ledger/mixin/AccessorGuiEditSign.java delete mode 100644 src/main/java/moe/nea/ledger/mixin/MouseClickEventPatch.java delete mode 100644 src/main/java/moe/nea/ledger/mixin/OnInitializationCompletePatch.java delete mode 100644 src/main/java/moe/nea/ledger/mixin/devenv/RegisterModResourcesPatch.java delete mode 100644 src/main/kotlin/moe/nea/ledger/ConfigCommand.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/DebouncedValue.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/DebugDataCommand.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/DevUtil.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/ExpiringValue.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/ItemChange.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/ItemId.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/ItemIdProvider.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/ItemUtil.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/Ledger.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/LedgerEntry.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/LedgerLogger.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/LogChatCommand.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/MCUUIDUtil.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/NumberUtil.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/QueryCommand.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/ScoreboardUtil.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/TelemetryProvider.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/TransactionType.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/TriggerCommand.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/config/DebugOptions.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/config/LedgerConfig.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/config/MainOptions.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/config/SynchronizationOptions.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/config/UpdateUi.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/config/UpdateUiMarker.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/database/DBLogEntry.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/database/DBUpgrade.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/database/Database.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/database/Upgrades.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/database/schema.dot delete mode 100644 src/main/kotlin/moe/nea/ledger/events/BeforeGuiAction.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/events/ChatReceived.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/events/ExtraSupplyIdEvent.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/events/GuiClickEvent.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/events/InitializationComplete.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/events/RegistrationFinishedEvent.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/events/SupplyDebugInfo.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/events/TriggerEvent.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/events/WorldLoadEvent.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/events/WorldSwitchEvent.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/modules/AccessorySwapperDetection.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/modules/AllowanceDetection.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/modules/AuctionHouseDetection.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/modules/BankDetection.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/modules/BazaarDetection.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/modules/BazaarOrderDetection.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/modules/BitsDetection.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/modules/BitsShopDetection.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/modules/ChestDetection.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/modules/DragonEyePlacementDetection.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/modules/DragonSacrificeDetection.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/modules/DungeonChestDetection.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/modules/ExternalDataProvider.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/modules/EyedropsDetection.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/modules/ForgeDetection.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/modules/GambleDetection.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/modules/GodPotionDetection.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/modules/GodPotionMixinDetection.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/modules/KatDetection.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/modules/KuudraChestDetection.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/modules/MineshaftCorpseDetection.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/modules/MinionDetection.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/modules/NpcDetection.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/modules/UpdateChecker.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/modules/VisitorDetection.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/utils/BorderedTextTracker.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/utils/ErrorUtil.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/utils/GsonUtil.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/utils/MinecraftExecutor.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/utils/NoSideEffects.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/utils/network/Request.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/utils/network/RequestUtil.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/utils/network/Response.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/utils/telemetry/BooleanContext.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/utils/telemetry/CommonKeys.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/utils/telemetry/Context.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/utils/telemetry/ContextValue.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/utils/telemetry/EventRecorder.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/utils/telemetry/ExceptionContextValue.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/utils/telemetry/JsonElementContext.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/utils/telemetry/LoggingEventRecorder.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/utils/telemetry/RecordedEvent.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/utils/telemetry/Severity.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/utils/telemetry/Span.kt delete mode 100644 src/main/kotlin/moe/nea/ledger/utils/telemetry/StringContext.kt delete mode 100644 src/main/resources/ledgerkeystore.jks delete mode 100644 src/main/resources/mcmod.info delete mode 100644 src/main/resources/mixins.moneyledger.json delete mode 100644 src/test/kotlin/moe/nea/ledger/NumberUtilKtTest.kt diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 7765a6c..a9eee2c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -24,18 +24,18 @@ jobs: - name: Show build directory if: runner.debug == '1' run: | - ls -lahR build + ls -lahR mod/build - name: Upload built mod JAR uses: actions/upload-artifact@v4.3.0 with: name: mod-jar - path: build/libs/*.jar + path: mod/build/libs/*.jar - name: Upload partial JARs if: runner.debug == '1' uses: actions/upload-artifact@v4.3.0 with: name: extras - path: build/badjars/*.jar + path: mod/build/badjars/*.jar release: runs-on: ubuntu-latest needs: gradle diff --git a/build-src/src/main/kotlin/helpers.kt b/build-src/src/main/kotlin/helpers.kt new file mode 100644 index 0000000..5afef4f --- /dev/null +++ b/build-src/src/main/kotlin/helpers.kt @@ -0,0 +1,10 @@ +import org.gradle.api.plugins.ExtensionAware +import org.gradle.kotlin.dsl.configure +import org.gradle.kotlin.dsl.findByType + + +inline fun ExtensionAware.configureIf(crossinline block: T.() -> Unit) { + if (extensions.findByType() != null) { + extensions.configure { block() } + } +} diff --git a/build.gradle.kts b/build.gradle.kts index c5ee6d5..b4583f1 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,6 +1,4 @@ import com.github.gmazzo.buildconfig.BuildConfigExtension -import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar -import proguard.gradle.ProGuardTask import java.io.ByteArrayOutputStream buildscript { @@ -13,16 +11,11 @@ buildscript { } plugins { - idea - java - id("gg.essential.loom") version "1.6.+" - id("dev.architectury.architectury-pack200") version "0.1.3" - id("com.github.johnrengelman.shadow") version "8.1.1" - id("com.github.gmazzo.buildconfig") version "5.5.0" - kotlin("jvm") version "2.0.20" + kotlin("jvm") version "2.0.20" apply false + id("com.github.gmazzo.buildconfig") version "5.5.0" apply false id("ledger-globals") - id("ledger-repo") } + allprojects { apply(plugin = "ledger-globals") } @@ -36,179 +29,16 @@ fun cmd(vararg args: String): String { return baos.toByteArray().decodeToString().trim() } - -val baseGroup: String by project -val mcVersion: String by project val gitVersion = cmd("git", "rev-parse", "--short", "HEAD") val fullVersion = project.property("mod_version").toString() val versionName: String = "$fullVersion-$gitVersion" -val mixinGroup = "$baseGroup.mixin" allprojects { version = versionName -} -val modid: String by project - -// Toolchains: -java { - toolchain.languageVersion.set(JavaLanguageVersion.of(8)) -} - -// Minecraft configuration: -loom { - forge { - pack200Provider.set(dev.architectury.pack200.java.Pack200Adapter()) - mixinConfig("mixins.$modid.json") - } - log4jConfigs.from(file("log4j2.xml")) - runConfigs { - "client" { - property("ledger.bonusresourcemod", sourceSets.main.get().output.resourcesDir!!.absolutePath) - property("mixin.debug", "true") - programArgs("--tweakClass", "org.spongepowered.asm.launch.MixinTweaker") - programArgs("--tweakClass", "io.github.notenoughupdates.moulconfig.tweaker.DevelopmentResourceTweaker") + afterEvaluate { + configureIf { + buildConfigField("VERSION", versionName) + buildConfigField("FULL_VERSION", fullVersion) + buildConfigField("GIT_COMMIT", gitVersion) } - remove(getByName("server")) - } - mixin.useLegacyMixinAp.set(false) -} - -// TODO: Add an extra shadow configuration for optimizable jars -//val optShadowImpl: Configuration by configurations.creating { -// -//} - -val shadowImpl: Configuration by configurations.creating { - configurations.implementation.get().extendsFrom(this) -} - -dependencies { - minecraft("com.mojang:minecraft:1.8.9") - mappings("de.oceanlabs.mcp:mcp_stable:22-1.8.9") - forge("net.minecraftforge:forge:1.8.9-11.15.1.2318-1.8.9") - - shadowImpl(kotlin("stdlib-jdk8")) - implementation("org.jspecify:jspecify:1.0.0") - - shadowImpl("org.spongepowered:mixin:0.7.11-SNAPSHOT") { - isTransitive = false - } - - shadowImpl("org.xerial:sqlite-jdbc:3.45.3.0") - shadowImpl("org.notenoughupdates.moulconfig:legacy:3.0.0-beta.9") - shadowImpl("io.azam.ulidj:ulidj:1.0.4") - shadowImpl(project(":dependency-injection")) - shadowImpl(project(":database:core")) - shadowImpl("moe.nea:libautoupdate:1.3.1") { - exclude(module = "gson") } - runtimeOnly("me.djtheredstoner:DevAuth-forge-legacy:1.2.1") - testImplementation("org.junit.jupiter:junit-jupiter:5.9.2") -} - -// Tasks: - -// Delete default shadow configuration -tasks.shadowJar { - doFirst { error("Incorrect shadow JAR built!") } } - -tasks.downloadRepo { - hash.set("dcf1dbc") -} - -val generateItemIds by tasks.register("generateItemIds", GenerateItemIds::class) { - repoHash.set(tasks.downloadRepo.get().hash) - packageName.set("moe.nea.ledger.gen") - outputDirectory.set(layout.buildDirectory.dir("generated/sources/itemIds")) - repoFiles.set(tasks.downloadRepo.get().outputDirectory) -} -sourceSets.main { - java.srcDir(generateItemIds) -} - -tasks.withType { - archiveBaseName.set(modid) - manifest.attributes.run { - this["FMLCorePluginContainsFMLMod"] = "true" - this["ForceLoadAsMod"] = "true" - - // If you don't want mixins, remove these lines - this["TweakClass"] = "org.spongepowered.asm.launch.MixinTweaker" - this["MixinConfigs"] = "mixins.$modid.json" - } -} - -tasks.processResources { - inputs.property("version", project.version) - inputs.property("mcversion", mcVersion) - inputs.property("modid", modid) - inputs.property("basePackage", baseGroup) - - filesMatching(listOf("mcmod.info", "mixins.$modid.json")) { - expand(inputs.properties) - } -} - - -val proguardOutJar = project.layout.buildDirectory.file("badjars/stripped.jar") -val proguard = tasks.register("proguard", ProGuardTask::class) { - dependsOn(tasks.jar) - injars(tasks.jar.map { it.archiveFile }) - outjars(proguardOutJar) - configuration(file("ledger-rules.pro")) - val libJava = javaToolchains.launcherFor(java.toolchain) - .get() - .metadata.installationPath.file("jre/lib/rt.jar") - libraryjars(libJava) - libraryjars(configurations.compileClasspath) -} - -val shadowJar2 = tasks.register("shadowJar2", ShadowJar::class) { - destinationDirectory.set(layout.buildDirectory.dir("badjars")) - archiveClassifier.set("all-dev") - from(proguardOutJar) - dependsOn(proguard) - configurations = listOf(shadowImpl) - relocate("moe.nea.libautoupdate", "moe.nea.ledger.deps.libautoupdate") - relocate("io.github.notenoughupdates.moulconfig", "moe.nea.ledger.deps.moulconfig") - relocate("io.azam.ulidj", "moe.nea.ledger.deps.ulid") - mergeServiceFiles() - exclude( - // Signatures - "META-INF/INDEX.LIST", - "META-INF/*.SF", - "META-INF/*.DSA", - "META-INF/*.RSA", - "module-info.class", - - "META-INF/*.kotlin_module", - "META-INF/versions/**" - ) -} -tasks.remapJar { - archiveClassifier.set("") - inputFile.set(shadowJar2.flatMap { it.archiveFile }) -} - -tasks.jar { - archiveClassifier.set("without-deps") - destinationDirectory.set(layout.buildDirectory.dir("badjars")) -} - -tasks.assemble.get().dependsOn(tasks.remapJar) - -inline fun ExtensionAware.configureIf(crossinline block: T.() -> Unit) { - if (extensions.findByType() != null) { - extensions.configure { block() } - } -} - -allprojects { - configureIf { - packageName("moe.nea.ledger.gen") - buildConfigField("VERSION", versionName) - buildConfigField("FULL_VERSION", fullVersion) - buildConfigField("GIT_COMMIT", gitVersion) - } -} - diff --git a/gradle.properties b/gradle.properties index 38adc2e..6e2027c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,3 @@ -loom.platform=forge -org.gradle.jvmargs=-Xmx2g +org.gradle.jvmargs = -Xmx2g baseGroup = moe.nea.ledger -mcVersion = 1.8.9 -modid = moneyledger mod_version = 2.0.0 diff --git a/ledger-rules.pro b/ledger-rules.pro deleted file mode 100644 index 32cd337..0000000 --- a/ledger-rules.pro +++ /dev/null @@ -1,4 +0,0 @@ --keep class !moe.nea.ledger.gen.** {*;} --dontobfuscate --assumenosideeffects class ** { @moe.nea.ledger.utils.NoSideEffects ; } -#-dontoptimize diff --git a/log4j2.xml b/log4j2.xml deleted file mode 100644 index af9b1b7..0000000 --- a/log4j2.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/mod/build.gradle.kts b/mod/build.gradle.kts new file mode 100644 index 0000000..10f01e1 --- /dev/null +++ b/mod/build.gradle.kts @@ -0,0 +1,170 @@ +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar +import proguard.gradle.ProGuardTask + +plugins { + idea + java + id("gg.essential.loom") version "1.6.+" + id("dev.architectury.architectury-pack200") version "0.1.3" + id("com.github.johnrengelman.shadow") version "8.1.1" + id("com.github.gmazzo.buildconfig") + kotlin("jvm") + id("ledger-repo") +} +val baseGroup: String by project +val mcVersion: String by project +val mixinGroup = "$baseGroup.mixin" +val modid: String by project + +// Toolchains: +java { + toolchain.languageVersion.set(JavaLanguageVersion.of(8)) +} + +// Minecraft configuration: +loom { + forge { + pack200Provider.set(dev.architectury.pack200.java.Pack200Adapter()) + mixinConfig("mixins.$modid.json") + } + log4jConfigs.from(file("log4j2.xml")) + runConfigs { + "client" { + property("ledger.bonusresourcemod", sourceSets.main.get().output.resourcesDir!!.absolutePath) + property("mixin.debug", "true") + programArgs("--tweakClass", "org.spongepowered.asm.launch.MixinTweaker") + programArgs("--tweakClass", "io.github.notenoughupdates.moulconfig.tweaker.DevelopmentResourceTweaker") + } + remove(getByName("server")) + } + mixin.useLegacyMixinAp.set(false) +} + +// TODO: Add an extra shadow configuration for optimizable jars +//val optShadowImpl: Configuration by configurations.creating { +// +//} + +val shadowImpl: Configuration by configurations.creating { + configurations.implementation.get().extendsFrom(this) +} + +dependencies { + minecraft("com.mojang:minecraft:1.8.9") + mappings("de.oceanlabs.mcp:mcp_stable:22-1.8.9") + forge("net.minecraftforge:forge:1.8.9-11.15.1.2318-1.8.9") + + shadowImpl(kotlin("stdlib-jdk8")) + implementation("org.jspecify:jspecify:1.0.0") + + shadowImpl("org.spongepowered:mixin:0.7.11-SNAPSHOT") { + isTransitive = false + } + + shadowImpl("org.xerial:sqlite-jdbc:3.45.3.0") + shadowImpl("org.notenoughupdates.moulconfig:legacy:3.0.0-beta.9") + shadowImpl("io.azam.ulidj:ulidj:1.0.4") + shadowImpl(project(":dependency-injection")) + shadowImpl(project(":database:core")) + shadowImpl("moe.nea:libautoupdate:1.3.1") { + exclude(module = "gson") + } + runtimeOnly("me.djtheredstoner:DevAuth-forge-legacy:1.2.1") + testImplementation("org.junit.jupiter:junit-jupiter:5.9.2") +} + +// Tasks: + +// Delete default shadow configuration +tasks.shadowJar { + doFirst { error("Incorrect shadow JAR built!") } +} + +tasks.downloadRepo { + hash.set("dcf1dbc") +} + +val generateItemIds by tasks.register("generateItemIds", GenerateItemIds::class) { + repoHash.set(tasks.downloadRepo.get().hash) + packageName.set("moe.nea.ledger.gen") + outputDirectory.set(layout.buildDirectory.dir("generated/sources/itemIds")) + repoFiles.set(tasks.downloadRepo.get().outputDirectory) +} +sourceSets.main { + java.srcDir(generateItemIds) +} +tasks.withType { + archiveBaseName.set(modid) +} +tasks.withType { + manifest.attributes.run { + this["FMLCorePluginContainsFMLMod"] = "true" + this["ForceLoadAsMod"] = "true" + this["TweakClass"] = "org.spongepowered.asm.launch.MixinTweaker" + this["MixinConfigs"] = "mixins.$modid.json" + } +} + +tasks.processResources { + inputs.property("version", project.version) + inputs.property("mcversion", mcVersion) + inputs.property("modid", modid) + inputs.property("basePackage", baseGroup) + + filesMatching(listOf("mcmod.info", "mixins.$modid.json")) { + expand(inputs.properties) + } +} + + +val proguardOutJar = project.layout.buildDirectory.file("badjars/stripped.jar") +val proguard = tasks.register("proguard", ProGuardTask::class) { + dependsOn(tasks.jar) + injars(tasks.jar.map { it.archiveFile }) + outjars(proguardOutJar) + configuration(file("ledger-rules.pro")) + val libJava = javaToolchains.launcherFor(java.toolchain) + .get() + .metadata.installationPath.file("jre/lib/rt.jar") + libraryjars(libJava) + libraryjars(configurations.compileClasspath) +} + +val shadowJar2 = tasks.register("shadowJar2", ShadowJar::class) { + destinationDirectory.set(layout.buildDirectory.dir("badjars")) + archiveClassifier.set("all-dev") + from(proguardOutJar) + dependsOn(proguard) + configurations = listOf(shadowImpl) + relocate("moe.nea.libautoupdate", "moe.nea.ledger.deps.libautoupdate") + relocate("io.github.notenoughupdates.moulconfig", "moe.nea.ledger.deps.moulconfig") + relocate("io.azam.ulidj", "moe.nea.ledger.deps.ulid") + mergeServiceFiles() + exclude( + // Signatures + "META-INF/INDEX.LIST", + "META-INF/*.SF", + "META-INF/*.DSA", + "META-INF/*.RSA", + "module-info.class", + + "META-INF/*.kotlin_module", + "META-INF/versions/**" + ) +} +tasks.remapJar { + archiveClassifier.set("") + inputFile.set(shadowJar2.flatMap { it.archiveFile }) +} + +tasks.jar { + archiveClassifier.set("without-deps") + destinationDirectory.set(layout.buildDirectory.dir("badjars")) +} + +tasks.assemble.get().dependsOn(tasks.remapJar) + +buildConfig { + packageName("moe.nea.ledger.gen") +} + diff --git a/mod/gradle.properties b/mod/gradle.properties new file mode 100644 index 0000000..28f0604 --- /dev/null +++ b/mod/gradle.properties @@ -0,0 +1,3 @@ +loom.platform = forge +mcVersion = 1.8.9 +modid = moneyledger diff --git a/mod/ledger-rules.pro b/mod/ledger-rules.pro new file mode 100644 index 0000000..32cd337 --- /dev/null +++ b/mod/ledger-rules.pro @@ -0,0 +1,4 @@ +-keep class !moe.nea.ledger.gen.** {*;} +-dontobfuscate +-assumenosideeffects class ** { @moe.nea.ledger.utils.NoSideEffects ; } +#-dontoptimize diff --git a/mod/log4j2.xml b/mod/log4j2.xml new file mode 100644 index 0000000..af9b1b7 --- /dev/null +++ b/mod/log4j2.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/mod/src/main/java/moe/nea/ledger/init/AutoDiscoveryMixinPlugin.java b/mod/src/main/java/moe/nea/ledger/init/AutoDiscoveryMixinPlugin.java new file mode 100644 index 0000000..56841b5 --- /dev/null +++ b/mod/src/main/java/moe/nea/ledger/init/AutoDiscoveryMixinPlugin.java @@ -0,0 +1,193 @@ +package moe.nea.ledger.init; + +import net.minecraft.launchwrapper.Launch; +import org.spongepowered.asm.lib.tree.ClassNode; +import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; +import org.spongepowered.asm.mixin.extensibility.IMixinInfo; + +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URISyntaxException; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.stream.Stream; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; + +/** + * A mixin plugin to automatically discover all mixins in the current JAR. + *

+ * This mixin plugin automatically scans your entire JAR (or class directory, in case of an in-IDE launch) for classes inside of your + * mixin package and registers those. It does this recursively for sub packages of the mixin package as well. This means you will need + * to only have mixin classes inside of your mixin package, which is good style anyway. + * + * @author Linnea Gräf + */ +public class AutoDiscoveryMixinPlugin implements IMixinConfigPlugin { + private static final List mixinPlugins = new ArrayList<>(); + + public static List getMixinPlugins() { + return mixinPlugins; + } + + private String mixinPackage; + + @Override + public void onLoad(String mixinPackage) { + this.mixinPackage = mixinPackage; + mixinPlugins.add(this); + } + + /** + * Resolves the base class root for a given class URL. This resolves either the JAR root, or the class file root. + * In either case the return value of this + the class name will resolve back to the original class url, or to other + * class urls for other classes. + */ + public URL getBaseUrlForClassUrl(URL classUrl) { + String string = classUrl.toString(); + if (classUrl.getProtocol().equals("jar")) { + try { + return new URL(string.substring(4).split("!")[0]); + } catch (MalformedURLException e) { + throw new RuntimeException(e); + } + } + if (string.endsWith(".class")) { + try { + return new URL(string.replace("\\", "/") + .replace(getClass().getCanonicalName() + .replace(".", "/") + ".class", "")); + } catch (MalformedURLException e) { + throw new RuntimeException(e); + } + } + return classUrl; + } + + /** + * Get the package that contains all the mixins. This value is set by mixin itself using {@link #onLoad}. + */ + public String getMixinPackage() { + return mixinPackage; + } + + /** + * Get the path inside the class root to the mixin package + */ + public String getMixinBaseDir() { + return mixinPackage.replace(".", "/"); + } + + /** + * A list of all discovered mixins. + */ + private List mixins = null; + + /** + * Try to add mixin class ot the mixins based on the filepath inside of the class root. + * Removes the {@code .class} file suffix, as well as the base mixin package. + *

This method cannot be called after mixin initialization.

+ * + * @param className the name or path of a class to be registered as a mixin. + */ + public void tryAddMixinClass(String className) { + String norm = (className.endsWith(".class") ? className.substring(0, className.length() - ".class".length()) : className) + .replace("\\", "/") + .replace("/", "."); + if (norm.startsWith(getMixinPackage() + ".") && !norm.endsWith(".")) { + mixins.add(norm.substring(getMixinPackage().length() + 1)); + } + } + + /** + * Search through the JAR or class directory to find mixins contained in {@link #getMixinPackage()} + */ + @Override + public List getMixins() { + if (mixins != null) return mixins; + System.out.println("Trying to discover mixins"); + mixins = new ArrayList<>(); + URL classUrl = getClass().getProtectionDomain().getCodeSource().getLocation(); + System.out.println("Found classes at " + classUrl); + Path file; + try { + file = Paths.get(getBaseUrlForClassUrl(classUrl).toURI()); + } catch (URISyntaxException e) { + throw new RuntimeException(e); + } + System.out.println("Base directory found at " + file); + if (Files.isDirectory(file)) { + walkDir(file); + } else { + walkJar(file); + } + System.out.println("Found mixins: " + mixins); + + if (!(Boolean) Launch.blackboard.get("fml.deobfuscatedEnvironment")) { + mixins.removeIf(it -> it.contains("devenv")); + } + + return mixins; + } + + /** + * Search through directory for mixin classes based on {@link #getMixinBaseDir}. + * + * @param classRoot The root directory in which classes are stored for the default package. + */ + private void walkDir(Path classRoot) { + System.out.println("Trying to find mixins from directory"); + try (Stream classes = Files.walk(classRoot.resolve(getMixinBaseDir()))) { + classes.map(it -> classRoot.relativize(it).toString()) + .forEach(this::tryAddMixinClass); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + /** + * Read through a JAR file, trying to find all mixins inside. + */ + private void walkJar(Path file) { + System.out.println("Trying to find mixins from jar file"); + try (ZipInputStream zis = new ZipInputStream(Files.newInputStream(file))) { + ZipEntry next; + while ((next = zis.getNextEntry()) != null) { + tryAddMixinClass(next.getName()); + zis.closeEntry(); + } + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + @Override + public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { + + } + + @Override + public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { + + } + + @Override + public String getRefMapperConfig() { + return null; + } + + @Override + public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { + return true; + } + + @Override + public void acceptTargets(Set myTargets, Set otherTargets) { + + } +} diff --git a/mod/src/main/java/moe/nea/ledger/mixin/AccessorGuiEditSign.java b/mod/src/main/java/moe/nea/ledger/mixin/AccessorGuiEditSign.java new file mode 100644 index 0000000..52b8911 --- /dev/null +++ b/mod/src/main/java/moe/nea/ledger/mixin/AccessorGuiEditSign.java @@ -0,0 +1,12 @@ +package moe.nea.ledger.mixin; + +import net.minecraft.client.gui.inventory.GuiEditSign; +import net.minecraft.tileentity.TileEntitySign; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(GuiEditSign.class) +public interface AccessorGuiEditSign { + @Accessor("tileSign") + TileEntitySign getTileEntity_ledger(); +} diff --git a/mod/src/main/java/moe/nea/ledger/mixin/MouseClickEventPatch.java b/mod/src/main/java/moe/nea/ledger/mixin/MouseClickEventPatch.java new file mode 100644 index 0000000..4e6e360 --- /dev/null +++ b/mod/src/main/java/moe/nea/ledger/mixin/MouseClickEventPatch.java @@ -0,0 +1,18 @@ +package moe.nea.ledger.mixin; + +import moe.nea.ledger.events.GuiClickEvent; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.inventory.Slot; +import net.minecraftforge.common.MinecraftForge; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(GuiContainer.class) +public class MouseClickEventPatch { + @Inject(method = "handleMouseClick", at = @At("HEAD")) + private void onHandleMouseClick(Slot slotIn, int slotId, int clickedButton, int clickType, CallbackInfo ci) { + MinecraftForge.EVENT_BUS.post(new GuiClickEvent(slotIn, slotId, clickedButton, clickType)); + } +} diff --git a/mod/src/main/java/moe/nea/ledger/mixin/OnInitializationCompletePatch.java b/mod/src/main/java/moe/nea/ledger/mixin/OnInitializationCompletePatch.java new file mode 100644 index 0000000..fc9afb7 --- /dev/null +++ b/mod/src/main/java/moe/nea/ledger/mixin/OnInitializationCompletePatch.java @@ -0,0 +1,18 @@ +package moe.nea.ledger.mixin; + +import moe.nea.ledger.events.InitializationComplete; +import net.minecraft.client.Minecraft; +import net.minecraftforge.common.MinecraftForge; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(Minecraft.class) +public class OnInitializationCompletePatch { + + @Inject(method = "startGame", at = @At(value = "INVOKE", target = "Lnet/minecraftforge/fml/client/FMLClientHandler;onInitializationComplete()V")) + private void onInitComplete(CallbackInfo ci) { + MinecraftForge.EVENT_BUS.post(new InitializationComplete()); + } +} diff --git a/mod/src/main/java/moe/nea/ledger/mixin/devenv/RegisterModResourcesPatch.java b/mod/src/main/java/moe/nea/ledger/mixin/devenv/RegisterModResourcesPatch.java new file mode 100644 index 0000000..88e8364 --- /dev/null +++ b/mod/src/main/java/moe/nea/ledger/mixin/devenv/RegisterModResourcesPatch.java @@ -0,0 +1,66 @@ +package moe.nea.ledger.mixin.devenv; + +import com.google.common.eventbus.EventBus; +import net.minecraftforge.fml.client.FMLFileResourcePack; +import net.minecraftforge.fml.common.DummyModContainer; +import net.minecraftforge.fml.common.LoadController; +import net.minecraftforge.fml.common.ModContainer; +import net.minecraftforge.fml.common.ModMetadata; +import net.minecraftforge.fml.common.discovery.ASMDataTable; +import net.minecraftforge.fml.common.discovery.ContainerType; +import net.minecraftforge.fml.common.discovery.ModCandidate; +import net.minecraftforge.fml.common.discovery.ModDiscoverer; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import java.io.File; +import java.util.Collections; +import java.util.List; + +@Mixin(value = ModDiscoverer.class, remap = false) +public class RegisterModResourcesPatch { + @Shadow + private List candidates; + + @Inject(method = "identifyMods", at = @At("HEAD"), remap = false) + private void addCandidate(CallbackInfoReturnable> cir) { + String bonusResourceMod = System.getProperty("ledger.bonusresourcemod"); + if (bonusResourceMod == null) return; + File file = new File(bonusResourceMod); + if (!file.isDirectory()) return; + ModMetadata modMetadata = new ModMetadata(); + modMetadata.modId = "ledger-bonus"; + modMetadata.name = "Ledger Bonus Resources"; + modMetadata.autogenerated = true; + ModContainer container = new DummyModContainer(modMetadata) { + @Override + public Object getMod() { + return new Object(); + } + + @Override + public boolean registerBus(EventBus bus, LoadController controller) { + return true; + } + + @Override + public File getSource() { + return file; + } + + @Override + public Class getCustomResourcePackClass() { + return FMLFileResourcePack.class; + } + }; + candidates.add(new ModCandidate(file, file, ContainerType.DIR) { + @Override + public List explore(ASMDataTable table) { + return Collections.singletonList(container); + } + }); + } +} diff --git a/mod/src/main/kotlin/moe/nea/ledger/ConfigCommand.kt b/mod/src/main/kotlin/moe/nea/ledger/ConfigCommand.kt new file mode 100644 index 0000000..5b964c8 --- /dev/null +++ b/mod/src/main/kotlin/moe/nea/ledger/ConfigCommand.kt @@ -0,0 +1,31 @@ +package moe.nea.ledger + +import io.github.notenoughupdates.moulconfig.common.IMinecraft +import net.minecraft.command.CommandBase +import net.minecraft.command.ICommandSender + +class ConfigCommand : CommandBase() { + override fun canCommandSenderUseCommand(sender: ICommandSender?): Boolean { + return true + } + + override fun getCommandName(): String { + return "ledgerconfig" + } + + override fun getCommandUsage(sender: ICommandSender?): String { + return "" + } + + override fun processCommand(sender: ICommandSender?, args: Array) { + val editor = Ledger.managedConfig.getEditor() + editor.search(args.joinToString(" ")) + Ledger.runLater { + IMinecraft.instance.openWrappedScreen(editor) + } + } + + override fun getCommandAliases(): List { + return listOf("moneyledger") + } +} \ No newline at end of file diff --git a/mod/src/main/kotlin/moe/nea/ledger/DebouncedValue.kt b/mod/src/main/kotlin/moe/nea/ledger/DebouncedValue.kt new file mode 100644 index 0000000..66fba8d --- /dev/null +++ b/mod/src/main/kotlin/moe/nea/ledger/DebouncedValue.kt @@ -0,0 +1,38 @@ +package moe.nea.ledger + +import kotlin.time.Duration +import kotlin.time.Duration.Companion.nanoseconds +import kotlin.time.Duration.Companion.seconds + +class DebouncedValue(private val value: T) { + companion object { + fun farFuture(): DebouncedValue { + val value = DebouncedValue(Unit) + value.take() + @Suppress("UNCHECKED_CAST") + return value as DebouncedValue + } + } + + val lastSeenAt = System.nanoTime() + val age get() = (System.nanoTime() - lastSeenAt).nanoseconds + var taken = false + private set + + fun get(debounce: Duration): T? { + return if (!taken && age >= debounce) value + else null + } + + fun replace(): T? { + return consume(0.seconds) + } + + fun consume(debounce: Duration): T? { + return get(debounce)?.also { take() } + } + + fun take() { + taken = true + } +} \ No newline at end of file diff --git a/mod/src/main/kotlin/moe/nea/ledger/DebugDataCommand.kt b/mod/src/main/kotlin/moe/nea/ledger/DebugDataCommand.kt new file mode 100644 index 0000000..bab0a78 --- /dev/null +++ b/mod/src/main/kotlin/moe/nea/ledger/DebugDataCommand.kt @@ -0,0 +1,34 @@ +package moe.nea.ledger + +import moe.nea.ledger.events.SupplyDebugInfo +import moe.nea.ledger.utils.di.Inject +import net.minecraft.command.CommandBase +import net.minecraft.command.ICommandSender +import net.minecraftforge.common.MinecraftForge + +class DebugDataCommand : CommandBase() { + + override fun canCommandSenderUseCommand(sender: ICommandSender?): Boolean { + return true + } + + override fun getCommandName(): String { + return "ledgerdebug" + } + + override fun getCommandUsage(sender: ICommandSender?): String { + return "" + } + + @Inject + lateinit var logger: LedgerLogger + + override fun processCommand(sender: ICommandSender?, args: Array?) { + val debugInfo = SupplyDebugInfo() + MinecraftForge.EVENT_BUS.post(debugInfo) + logger.printOut("Collected debug info:") + debugInfo.data.forEach { + logger.printOut("${it.first}: ${it.second}") + } + } +} \ No newline at end of file diff --git a/mod/src/main/kotlin/moe/nea/ledger/DevUtil.kt b/mod/src/main/kotlin/moe/nea/ledger/DevUtil.kt new file mode 100644 index 0000000..d0dd653 --- /dev/null +++ b/mod/src/main/kotlin/moe/nea/ledger/DevUtil.kt @@ -0,0 +1,7 @@ +package moe.nea.ledger + +import net.minecraft.launchwrapper.Launch + +object DevUtil { + val isDevEnv = Launch.blackboard["fml.deobfuscatedEnvironment"] as Boolean +} \ No newline at end of file diff --git a/mod/src/main/kotlin/moe/nea/ledger/ExpiringValue.kt b/mod/src/main/kotlin/moe/nea/ledger/ExpiringValue.kt new file mode 100644 index 0000000..b50b14e --- /dev/null +++ b/mod/src/main/kotlin/moe/nea/ledger/ExpiringValue.kt @@ -0,0 +1,30 @@ +package moe.nea.ledger + +import kotlin.time.Duration +import kotlin.time.Duration.Companion.nanoseconds + +class ExpiringValue(private val value: T) { + val lastSeenAt: Long = System.nanoTime() + val age get() = (System.nanoTime() - lastSeenAt).nanoseconds + var taken = false + private set + + fun get(expiry: Duration): T? { + return if (!taken && age < expiry) value + else null + } + + companion object { + fun empty(): ExpiringValue { + val value = ExpiringValue(Unit) + value.take() + @Suppress("UNCHECKED_CAST") + return value as ExpiringValue + } + } + + fun consume(expiry: Duration): T? = get(expiry)?.also { take() } + fun take() { + taken = true + } +} \ No newline at end of file diff --git a/mod/src/main/kotlin/moe/nea/ledger/ItemChange.kt b/mod/src/main/kotlin/moe/nea/ledger/ItemChange.kt new file mode 100644 index 0000000..fda709c --- /dev/null +++ b/mod/src/main/kotlin/moe/nea/ledger/ItemChange.kt @@ -0,0 +1,84 @@ +package moe.nea.ledger + +import moe.nea.ledger.database.DBItemEntry +import moe.nea.ledger.database.ResultRow +import net.minecraft.event.HoverEvent +import net.minecraft.util.ChatComponentText +import net.minecraft.util.ChatStyle +import net.minecraft.util.EnumChatFormatting +import net.minecraft.util.IChatComponent + +data class ItemChange( + val itemId: ItemId, + val count: Double, + val direction: ChangeDirection, +) { + fun formatChat(): IChatComponent { + return ChatComponentText(" ") + .appendSibling(direction.chatFormat) + .appendText(" ") + .appendSibling(ChatComponentText("$count").setChatStyle(ChatStyle().setColor(EnumChatFormatting.WHITE))) + .appendSibling(ChatComponentText("x").setChatStyle(ChatStyle().setColor(EnumChatFormatting.DARK_GRAY))) + .appendText(" ") + .appendSibling(ChatComponentText(itemId.string).setChatStyle(ChatStyle().setParentStyle(ChatStyle().setColor( + EnumChatFormatting.WHITE)))) + } + + enum class ChangeDirection { + GAINED, + TRANSFORM, + SYNC, + CATALYST, + LOST; + + val chatFormat by lazy { formatChat0() } + private fun formatChat0(): IChatComponent { + val (text, color) = when (this) { + GAINED -> "+" to EnumChatFormatting.GREEN + TRANSFORM -> "~" to EnumChatFormatting.YELLOW + SYNC -> "=" to EnumChatFormatting.BLUE + CATALYST -> "*" to EnumChatFormatting.DARK_PURPLE + LOST -> "-" to EnumChatFormatting.RED + } + return ChatComponentText(text) + .setChatStyle( + ChatStyle() + .setColor(color) + .setChatHoverEvent(HoverEvent(HoverEvent.Action.SHOW_TEXT, + ChatComponentText(name).setChatStyle(ChatStyle().setColor(color))))) + } + } + + companion object { + fun gainCoins(number: Double): ItemChange { + return gain(ItemId.COINS, number) + } + + fun unpair(direction: ChangeDirection, pair: Pair): ItemChange { + return ItemChange(pair.first, pair.second, direction) + } + + fun unpairGain(pair: Pair) = unpair(ChangeDirection.GAINED, pair) + fun unpairLose(pair: Pair) = unpair(ChangeDirection.LOST, pair) + + fun gain(itemId: ItemId, amount: Number): ItemChange { + return ItemChange(itemId, amount.toDouble(), ChangeDirection.GAINED) + } + + fun lose(itemId: ItemId, amount: Number): ItemChange { + return ItemChange(itemId, amount.toDouble(), ChangeDirection.LOST) + } + + fun loseCoins(number: Double): ItemChange { + return lose(ItemId.COINS, number) + } + + fun from(result: ResultRow): ItemChange { + return ItemChange( + result[DBItemEntry.itemId], + result[DBItemEntry.size], + result[DBItemEntry.mode], + ) + } + } +} \ No newline at end of file diff --git a/mod/src/main/kotlin/moe/nea/ledger/ItemId.kt b/mod/src/main/kotlin/moe/nea/ledger/ItemId.kt new file mode 100644 index 0000000..8211cd3 --- /dev/null +++ b/mod/src/main/kotlin/moe/nea/ledger/ItemId.kt @@ -0,0 +1,35 @@ +package moe.nea.ledger + +import moe.nea.ledger.utils.NoSideEffects + +data class ItemId( + val string: String +) { + @NoSideEffects + fun singleItem(): Pair { + return withStackSize(1) + } + + @NoSideEffects + fun withStackSize(size: Number): Pair { + return Pair(this, size.toDouble()) + } + + + companion object { + + @JvmStatic + @NoSideEffects + fun forName(string: String) = ItemId(string) + fun skill(skill: String) = ItemId("SKYBLOCK_SKILL_$skill") + + val GARDEN = skill("GARDEN") + val FARMING = skill("FARMING") + + + val COINS = ItemId("SKYBLOCK_COIN") + val GEMSTONE_POWDER = ItemId("SKYBLOCK_POWDER_GEMSTONE") + val MITHRIL_POWDER = ItemId("SKYBLOCK_POWDER_MITHRIL") + val NIL = ItemId("SKYBLOCK_NIL") + } +} \ No newline at end of file diff --git a/mod/src/main/kotlin/moe/nea/ledger/ItemIdProvider.kt b/mod/src/main/kotlin/moe/nea/ledger/ItemIdProvider.kt new file mode 100644 index 0000000..0bacf32 --- /dev/null +++ b/mod/src/main/kotlin/moe/nea/ledger/ItemIdProvider.kt @@ -0,0 +1,188 @@ +package moe.nea.ledger + +import moe.nea.ledger.events.BeforeGuiAction +import moe.nea.ledger.events.ExtraSupplyIdEvent +import moe.nea.ledger.events.RegistrationFinishedEvent +import moe.nea.ledger.events.SupplyDebugInfo +import moe.nea.ledger.gen.ItemIds +import moe.nea.ledger.modules.ExternalDataProvider +import net.minecraft.client.Minecraft +import net.minecraft.item.ItemStack +import net.minecraft.nbt.NBTTagCompound +import net.minecraftforge.client.event.GuiScreenEvent +import net.minecraftforge.common.MinecraftForge +import net.minecraftforge.fml.common.eventhandler.EventPriority +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent +import org.lwjgl.input.Mouse + +class ItemIdProvider { + + @SubscribeEvent + fun onMouseInput(event: GuiScreenEvent.MouseInputEvent.Pre) { + if (Mouse.getEventButton() == -1) return + MinecraftForge.EVENT_BUS.post(BeforeGuiAction(event.gui)) + } + + @SubscribeEvent +