From 8a50ff0c5e8b9d29409f26e06b2290c4c8cebd85 Mon Sep 17 00:00:00 2001 From: SamB440 Date: Fri, 30 Aug 2024 20:40:49 +0100 Subject: [PATCH] 1.21.1 update --- build.gradle | 26 ++-- gradle.properties | 14 +- gradle/wrapper/gradle-wrapper.jar | Bin 43462 -> 43504 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 7 +- gradlew.bat | 2 + .../client/TaleOfKingdomsClient.java | 10 +- .../client/TaleOfKingdomsClientAPI.java | 36 ----- .../render/ReficuleMageEntityRenderer.java | 2 +- .../client/entity/render/RenderSetup.java | 2 +- .../client/gui/entity/BankerScreen.java | 11 +- .../client/gui/entity/GuildMasterScreen.java | 25 ++-- .../client/gui/entity/InnkeeperScreen.java | 14 +- .../citybuilder/CityBuilderBeginGui.java | 4 +- .../citybuilder/CityBuilderPriceListGui.java | 2 +- .../citybuilder/CityBuilderTierGui.java | 22 +-- .../confirm/ConfirmBuildKingdomGui.java | 9 +- .../confirm/ConfirmUpgradeKingdomGui.java | 9 +- .../gui/entity/kingdom/ForemanScreen.java | 10 +- .../gui/entity/shop/DefaultShopScreen.java | 2 +- .../entity/shop/widget/ShopButtonWidget.java | 2 +- .../shop/widget/ShopScreenInterface.java | 6 +- .../gui/generic/ScreenStartConquest.java | 3 +- .../gui/generic/owo/update/UpdateScreen.java | 2 +- .../client/gui/shop/ScreenSellItem.java | 8 +- .../client/packet/ClientPacketHandler.java | 31 ---- .../both/BothSignContractPacketHandler.java | 26 +--- .../packet/both/InOutClientPacketHandler.java | 36 +++++ .../incoming/InClientPacketHandler.java | 35 +++++ .../IncomingInstanceSyncPacketHandler.java | 19 +-- .../IncomingOpenScreenPacketHandler.java | 24 +--- .../outgoing/OutClientPacketHandler.java | 29 ++++ .../OutgoingBankerInteractPacketHandler.java | 25 +--- .../outgoing/OutgoingBuildKingdomPacket.java | 23 +-- .../OutgoingBuyItemPacketHandler.java | 25 +--- ...utgoingCityBuilderActionPacketHandler.java | 31 +--- .../OutgoingFixGuildPacketHandler.java | 23 +-- ...OutgoingForemanBuyWorkerPacketHandler.java | 23 +-- .../OutgoingForemanCollectPacketHandler.java | 23 +-- .../outgoing/OutgoingHunterPacketHandler.java | 23 +-- .../OutgoingInnkeeperPacketHandler.java | 23 +-- .../OutgoingToggleSellGuiPacketHandler.java | 25 +--- .../client/utils/ShopBuyUtil.java | 5 +- .../taleofkingdoms/TaleOfKingdoms.java | 15 +- .../taleofkingdoms/TaleOfKingdomsAPI.java | 29 +++- .../common/block/SellBlock.java | 9 +- .../common/block/entity/SellBlockEntity.java | 13 +- .../common/datafixer/Schemas.java | 4 +- .../common/entity/EntityTypes.java | 135 +++++++++--------- .../common/entity/TOKEntity.java | 2 +- .../entity/ai/goal/CrossbowAttackGoal.java | 33 +++-- .../ai/goal/spell/FireballSpellGoal.java | 2 +- .../common/entity/generic/BanditEntity.java | 22 ++- .../common/entity/generic/HunterEntity.java | 9 +- .../entity/generic/SpellcastingEntity.java | 62 +++++--- .../common/entity/guild/BankerEntity.java | 4 +- .../common/entity/guild/BlacksmithEntity.java | 4 +- .../entity/guild/CityBuilderEntity.java | 22 +-- .../common/entity/guild/FoodShopEntity.java | 4 +- .../entity/guild/GuildArcherEntity.java | 22 ++- .../guild/GuildMasterDefenderEntity.java | 4 +- .../entity/guild/GuildMasterEntity.java | 4 +- .../common/entity/guild/InnkeeperEntity.java | 4 +- .../entity/kingdom/BlockShopEntity.java | 4 +- .../common/entity/kingdom/ForemanEntity.java | 16 +-- .../entity/kingdom/HumanFarmerEntity.java | 11 +- .../common/entity/kingdom/ItemShopEntity.java | 5 +- .../entity/kingdom/StockMarketEntity.java | 4 +- .../kingdom/warden/ArcherHireableEntity.java | 20 +-- .../entity/kingdom/warden/WardenEntity.java | 4 +- .../entity/kingdom/warden/WardenHireable.java | 6 +- .../reficule/ReficuleGuardianEntity.java | 17 ++- .../entity/reficule/ReficuleMageEntity.java | 19 ++- .../reficule/ReficuleSoldierEntity.java | 8 +- .../common/generator/BanditCampGenerator.java | 2 +- .../common/generator/GatewayGenerator.java | 4 +- .../generator/ReficuleVillageGenerator.java | 12 +- .../common/generator/biome/TOKBiomeTags.java | 2 +- .../processor/GatewayStructureProcessor.java | 6 +- .../processor/GuildStructureProcessor.java | 10 +- .../PlayerKingdomStructureProcessor.java | 4 +- .../structure/BanditCampStructure.java | 4 +- .../generator/structure/GatewayStructure.java | 4 +- .../structure/ReficuleVillageStructure.java | 4 +- .../generator/structure/TOKStructureKeys.java | 2 +- .../structure/TOKStructureSetKeys.java | 2 +- .../generator/structure/TOKStructures.java | 9 +- .../common/item/ItemRegistry.java | 6 +- .../common/item/common/ItemPouch.java | 113 +++++++-------- .../common/kingdom/KingdomTier.java | 8 +- .../common/kingdom/builds/BuildCosts.java | 8 +- .../common/kingdom/poi/KingdomPOI.java | 10 +- .../common/loot/TOKLootTables.java | 25 ++-- .../common/packet/PacketHandler.java | 33 ++--- .../taleofkingdoms/common/packet/Packets.java | 47 +++--- .../packet/both/SignContractPacket.java | 19 +++ .../packet/c2s/BankerInteractPacket.java | 21 +++ .../common/packet/c2s/BuildKingdomPacket.java | 19 +++ .../common/packet/c2s/BuyItemPacket.java | 22 +++ .../packet/c2s/CityBuilderActionPacket.java | 25 ++++ .../common/packet/c2s/FixGuildPacket.java | 16 +++ .../packet/c2s/ForemanBuyWorkerPacket.java | 19 +++ .../packet/c2s/ForemanCollectPacket.java | 19 +++ .../common/packet/c2s/HireHunterPacket.java | 19 +++ .../packet/c2s/InnkeeperActionPacket.java | 19 +++ .../packet/c2s/ToggleSellGuiPacket.java | 21 +++ .../packet/c2s/UpgradeKingdomPacket.java | 19 +++ .../common/packet/s2c/InstanceSyncPacket.java | 25 ++++ .../common/packet/s2c/OpenScreenPacket.java | 35 +++++ .../common/schematic/Schematic.java | 14 +- .../common/schematic/SchematicHandler.java | 36 ++--- .../common/serialization/EnumCodec.java | 32 ++--- .../common/shop/ShopParser.java | 2 +- .../common/utils/EntityUtils.java | 4 +- .../common/utils/InventoryUtils.java | 2 +- .../common/world/ConquestInstance.java | 6 +- .../TaleOfKingdomsModDataGeneratorEntry.java | 5 +- .../TOKChestLootTableGenerator.java | 16 ++- .../loottables/TOKLootTableProviders.java | 14 -- .../taleofkingdoms/managers/SoundManager.java | 6 +- .../mixin/StructureTypeAccessor.java | 4 +- .../server/TaleOfKingdomsServer.java | 12 +- .../server/TaleOfKingdomsServerAPI.java | 19 --- .../commands/TaleOfKingdomsCommand.java | 2 +- .../debug/TaleOfKingdomsDebugCommand.java | 2 +- .../debug/TaleOfKingdomsInvokeCommand.java | 2 +- .../server/packet/ServerPacketHandler.java | 30 ---- .../both/BothSignContractPacketHandler.java | 42 ++++++ .../packet/both/InOutServerPacketHandler.java | 33 +++++ .../incoming/InServerPacketHandler.java | 32 +++++ .../IncomingBankerInteractPacketHandler.java | 22 +-- .../incoming/IncomingBuildKingdomPacket.java | 19 +-- .../IncomingBuyItemPacketHandler.java | 23 +-- ...ncomingCityBuilderActionPacketHandler.java | 41 ++---- .../IncomingFixGuildPacketHandler.java | 17 +-- ...IncomingForemanBuyWorkerPacketHandler.java | 19 +-- .../IncomingForemanCollectPacketHandler.java | 19 +-- .../incoming/IncomingHunterPacketHandler.java | 19 +-- .../IncomingInnkeeperPacketHandler.java | 21 +-- .../IncomingSignContractPacketHandler.java | 56 -------- .../IncomingToggleSellGuiPacketHandler.java | 21 +-- .../IncomingUpgradeKingdomPacketHandler.java | 25 ++++ .../outgoing/OutServerPacketHandler.java | 36 +++++ .../OutgoingInstanceSyncPacketHandler.java | 37 +---- .../OutgoingOpenScreenPacketHandler.java | 43 +----- .../server/world/ServerConquestInstance.java | 14 +- .../bandit_camp/small_bandit_camp.nbt | Bin .../gateway/bars.nbt | Bin .../gateway/gateway.nbt | Bin .../guild/guild-1.16.nbt | Bin .../guild/guild-1.18.nbt | Bin .../guild/guild-1.20.2.nbt | Bin .../guild/guild-old.nbt | Bin .../guild/guildnew.nbt | Bin .../bake_house/tier_two_bake_house.nbt | Bin .../barracks/tier_two_barracks.nbt | Bin .../blacksmith/tier_one_house_blacksmith.nbt | Bin .../tier_one_house_blacksmith_old.nbt | Bin .../block_shop/tier_two_block_shop.nbt | Bin .../builder_house/tier_two_builder_house.nbt | Bin .../large_house/tier_one_large_house.nbt | Bin .../large_house/tier_one_large_house_new.nbt | Bin .../large_house/tier_two_large_house.nbt | Bin .../small_house/tier_one_small_house.nbt | Bin .../tier_one_small_house_one_new.nbt | Bin .../tier_one_small_house_two_new.nbt | Bin .../tier_two_small_house_variant_one.nbt | Bin .../tier_two_small_house_variant_two.nbt | Bin .../stock_market/tier_one_stock_market.nbt | Bin .../player_kingdom/tier_1_pre.nbt | Bin .../player_kingdom/tier_one.nbt | Bin .../player_kingdom/tier_one_old.nbt | Bin .../player_kingdom/tier_two.nbt | Bin .../player_kingdom/tier_two_complete.nbt | Bin .../player_kingdom/tier_two_old.nbt | Bin .../reficule_village_four.nbt | Bin .../reficule_village_middle.nbt | Bin .../reficule_village_middle_two.nbt | Bin .../reficule_village/reficule_village_one.nbt | Bin .../reficule_village_three.nbt | Bin .../reficule_village_tower.nbt | Bin src/main/resources/fabric.mod.json | 6 +- src/main/resources/taleofkingdoms.mixins.json | 2 +- 183 files changed, 1312 insertions(+), 1252 deletions(-) delete mode 100644 src/client/java/com/convallyria/taleofkingdoms/client/packet/ClientPacketHandler.java create mode 100644 src/client/java/com/convallyria/taleofkingdoms/client/packet/both/InOutClientPacketHandler.java create mode 100644 src/client/java/com/convallyria/taleofkingdoms/client/packet/incoming/InClientPacketHandler.java create mode 100644 src/client/java/com/convallyria/taleofkingdoms/client/packet/outgoing/OutClientPacketHandler.java create mode 100644 src/main/java/com/convallyria/taleofkingdoms/common/packet/both/SignContractPacket.java create mode 100644 src/main/java/com/convallyria/taleofkingdoms/common/packet/c2s/BankerInteractPacket.java create mode 100644 src/main/java/com/convallyria/taleofkingdoms/common/packet/c2s/BuildKingdomPacket.java create mode 100644 src/main/java/com/convallyria/taleofkingdoms/common/packet/c2s/BuyItemPacket.java create mode 100644 src/main/java/com/convallyria/taleofkingdoms/common/packet/c2s/CityBuilderActionPacket.java create mode 100644 src/main/java/com/convallyria/taleofkingdoms/common/packet/c2s/FixGuildPacket.java create mode 100644 src/main/java/com/convallyria/taleofkingdoms/common/packet/c2s/ForemanBuyWorkerPacket.java create mode 100644 src/main/java/com/convallyria/taleofkingdoms/common/packet/c2s/ForemanCollectPacket.java create mode 100644 src/main/java/com/convallyria/taleofkingdoms/common/packet/c2s/HireHunterPacket.java create mode 100644 src/main/java/com/convallyria/taleofkingdoms/common/packet/c2s/InnkeeperActionPacket.java create mode 100644 src/main/java/com/convallyria/taleofkingdoms/common/packet/c2s/ToggleSellGuiPacket.java create mode 100644 src/main/java/com/convallyria/taleofkingdoms/common/packet/c2s/UpgradeKingdomPacket.java create mode 100644 src/main/java/com/convallyria/taleofkingdoms/common/packet/s2c/InstanceSyncPacket.java create mode 100644 src/main/java/com/convallyria/taleofkingdoms/common/packet/s2c/OpenScreenPacket.java delete mode 100644 src/main/java/com/convallyria/taleofkingdoms/datagen/loottables/TOKLootTableProviders.java delete mode 100644 src/main/java/com/convallyria/taleofkingdoms/server/packet/ServerPacketHandler.java create mode 100644 src/main/java/com/convallyria/taleofkingdoms/server/packet/both/BothSignContractPacketHandler.java create mode 100644 src/main/java/com/convallyria/taleofkingdoms/server/packet/both/InOutServerPacketHandler.java create mode 100644 src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/InServerPacketHandler.java delete mode 100644 src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/IncomingSignContractPacketHandler.java create mode 100644 src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/IncomingUpgradeKingdomPacketHandler.java create mode 100644 src/main/java/com/convallyria/taleofkingdoms/server/packet/outgoing/OutServerPacketHandler.java rename src/main/resources/data/taleofkingdoms/{structures => structure}/bandit_camp/small_bandit_camp.nbt (100%) rename src/main/resources/data/taleofkingdoms/{structures => structure}/gateway/bars.nbt (100%) rename src/main/resources/data/taleofkingdoms/{structures => structure}/gateway/gateway.nbt (100%) rename src/main/resources/data/taleofkingdoms/{structures => structure}/guild/guild-1.16.nbt (100%) rename src/main/resources/data/taleofkingdoms/{structures => structure}/guild/guild-1.18.nbt (100%) rename src/main/resources/data/taleofkingdoms/{structures => structure}/guild/guild-1.20.2.nbt (100%) rename src/main/resources/data/taleofkingdoms/{structures => structure}/guild/guild-old.nbt (100%) rename src/main/resources/data/taleofkingdoms/{structures => structure}/guild/guildnew.nbt (100%) rename src/main/resources/data/taleofkingdoms/{structures => structure}/player_kingdom/bake_house/tier_two_bake_house.nbt (100%) rename src/main/resources/data/taleofkingdoms/{structures => structure}/player_kingdom/barracks/tier_two_barracks.nbt (100%) rename src/main/resources/data/taleofkingdoms/{structures => structure}/player_kingdom/blacksmith/tier_one_house_blacksmith.nbt (100%) rename src/main/resources/data/taleofkingdoms/{structures => structure}/player_kingdom/blacksmith/tier_one_house_blacksmith_old.nbt (100%) rename src/main/resources/data/taleofkingdoms/{structures => structure}/player_kingdom/block_shop/tier_two_block_shop.nbt (100%) rename src/main/resources/data/taleofkingdoms/{structures => structure}/player_kingdom/builder_house/tier_two_builder_house.nbt (100%) rename src/main/resources/data/taleofkingdoms/{structures => structure}/player_kingdom/large_house/tier_one_large_house.nbt (100%) rename src/main/resources/data/taleofkingdoms/{structures => structure}/player_kingdom/large_house/tier_one_large_house_new.nbt (100%) rename src/main/resources/data/taleofkingdoms/{structures => structure}/player_kingdom/large_house/tier_two_large_house.nbt (100%) rename src/main/resources/data/taleofkingdoms/{structures => structure}/player_kingdom/small_house/tier_one_small_house.nbt (100%) rename src/main/resources/data/taleofkingdoms/{structures => structure}/player_kingdom/small_house/tier_one_small_house_one_new.nbt (100%) rename src/main/resources/data/taleofkingdoms/{structures => structure}/player_kingdom/small_house/tier_one_small_house_two_new.nbt (100%) rename src/main/resources/data/taleofkingdoms/{structures => structure}/player_kingdom/small_house/tier_two_small_house_variant_one.nbt (100%) rename src/main/resources/data/taleofkingdoms/{structures => structure}/player_kingdom/small_house/tier_two_small_house_variant_two.nbt (100%) rename src/main/resources/data/taleofkingdoms/{structures => structure}/player_kingdom/stock_market/tier_one_stock_market.nbt (100%) rename src/main/resources/data/taleofkingdoms/{structures => structure}/player_kingdom/tier_1_pre.nbt (100%) rename src/main/resources/data/taleofkingdoms/{structures => structure}/player_kingdom/tier_one.nbt (100%) rename src/main/resources/data/taleofkingdoms/{structures => structure}/player_kingdom/tier_one_old.nbt (100%) rename src/main/resources/data/taleofkingdoms/{structures => structure}/player_kingdom/tier_two.nbt (100%) rename src/main/resources/data/taleofkingdoms/{structures => structure}/player_kingdom/tier_two_complete.nbt (100%) rename src/main/resources/data/taleofkingdoms/{structures => structure}/player_kingdom/tier_two_old.nbt (100%) rename src/main/resources/data/taleofkingdoms/{structures => structure}/reficule_village/reficule_village_four.nbt (100%) rename src/main/resources/data/taleofkingdoms/{structures => structure}/reficule_village/reficule_village_middle.nbt (100%) rename src/main/resources/data/taleofkingdoms/{structures => structure}/reficule_village/reficule_village_middle_two.nbt (100%) rename src/main/resources/data/taleofkingdoms/{structures => structure}/reficule_village/reficule_village_one.nbt (100%) rename src/main/resources/data/taleofkingdoms/{structures => structure}/reficule_village/reficule_village_three.nbt (100%) rename src/main/resources/data/taleofkingdoms/{structures => structure}/reficule_village/reficule_village_tower.nbt (100%) diff --git a/build.gradle b/build.gradle index 08bbed91..71527ee4 100644 --- a/build.gradle +++ b/build.gradle @@ -1,12 +1,9 @@ plugins { id 'groovy' - id 'fabric-loom' version '1.6-SNAPSHOT' + id 'fabric-loom' version '1.7-SNAPSHOT' id 'maven-publish' } -java.sourceCompatibility = JavaVersion.VERSION_17 -java.targetCompatibility = JavaVersion.VERSION_17 - archivesBaseName = project.archives_base_name version = project.mod_version group = project.maven_group @@ -121,7 +118,7 @@ tasks { duplicatesStrategy = DuplicatesStrategy.WARN from file('src/main/generated') from("LICENSE") { - rename { "${it}_${project.archivesBaseName}"} + rename { "${it}_${project.base.archivesName.get()}"} } dependsOn 'runDatagen' } @@ -146,8 +143,7 @@ tasks.withType(JavaCompile).configureEach { options.compilerArgs << '-Xlint:all' options.deprecation = true - // Minecraft 1.18 (1.18-pre2) upwards uses Java 17. - it.options.release = 17 + it.options.release = 21 } java { @@ -155,19 +151,25 @@ java { // if it is present. // If you remove this line, sources will not be generated. withSourcesJar() + + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 } // configure the maven publication publishing { publications { - mavenJava(MavenPublication) { + create("mavenJava", MavenPublication) { + artifactId = project.archives_base_name from components.java } } - // select the repositories you want to publish to + // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing. repositories { - // uncomment to publish to the local maven - // mavenLocal() + // Add repositories to publish to here. + // Notice: This block does NOT have the same function as the block in the top level. + // The repositories here will be used for publishing your artifact, not for + // retrieving dependencies. } -} \ No newline at end of file +} diff --git a/gradle.properties b/gradle.properties index 0bc793d1..0f88adfb 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,12 +7,12 @@ org.gradle.jvmargs=-Xmx2G # Fabric Properties # check these on https://fabricmc.net/develop/ -minecraft_version=1.20.4 -yarn_mappings=1.20.4+build.3 -loader_version=0.15.11 +minecraft_version=1.21.1 +yarn_mappings=1.21.1+build.3 +loader_version=0.16.3 # Fabric API -fabric_version=0.97.1+1.20.4 +fabric_version=0.103.0+1.21.1 # Mod Properties mod_version = 1.0.6 @@ -22,7 +22,7 @@ modid = taleofkingdoms # Dependencies # currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api -modmenu_version = 9.0.0 -cloth_version = 13.0.121 +modmenu_version = 11.0.2 +cloth_version = 15.0.130 toml4j_version = 0.7.2 -owo_version = 0.12.5+1.20.3 +owo_version = 0.12.11+1.21 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index d64cd4917707c1f8861d8cb53dd15194d4248596..2c3521197d7c4586c843d1d3e9090525f1898cde 100644 GIT binary patch delta 34463 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 SXRcJ{65?fGI57uQ5&!`B?F@7P delta 34554 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index a80b22ce..09523c0e 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index 1aa94a42..f5feea6d 100755 --- a/gradlew +++ b/gradlew @@ -15,6 +15,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +# SPDX-License-Identifier: Apache-2.0 +# ############################################################################## # @@ -55,7 +57,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -84,7 +86,8 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s +' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum diff --git a/gradlew.bat b/gradlew.bat index 25da30db..9d21a218 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -13,6 +13,8 @@ @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem @if "%DEBUG%"=="" @echo off @rem ########################################################################## diff --git a/src/client/java/com/convallyria/taleofkingdoms/client/TaleOfKingdomsClient.java b/src/client/java/com/convallyria/taleofkingdoms/client/TaleOfKingdomsClient.java index 508b9641..84701359 100644 --- a/src/client/java/com/convallyria/taleofkingdoms/client/TaleOfKingdomsClient.java +++ b/src/client/java/com/convallyria/taleofkingdoms/client/TaleOfKingdomsClient.java @@ -6,7 +6,7 @@ import com.convallyria.taleofkingdoms.client.gui.generic.ScreenStartConquest; import com.convallyria.taleofkingdoms.client.gui.shop.ScreenSellItem; import com.convallyria.taleofkingdoms.client.listener.ClientGameInstanceListener; -import com.convallyria.taleofkingdoms.client.packet.ClientPacketHandler; +import com.convallyria.taleofkingdoms.client.listener.StartWorldListener; import com.convallyria.taleofkingdoms.client.packet.both.BothSignContractPacketHandler; import com.convallyria.taleofkingdoms.client.packet.incoming.IncomingInstanceSyncPacketHandler; import com.convallyria.taleofkingdoms.client.packet.incoming.IncomingOpenScreenPacketHandler; @@ -20,7 +20,7 @@ import com.convallyria.taleofkingdoms.client.packet.outgoing.OutgoingHunterPacketHandler; import com.convallyria.taleofkingdoms.client.packet.outgoing.OutgoingInnkeeperPacketHandler; import com.convallyria.taleofkingdoms.client.packet.outgoing.OutgoingToggleSellGuiPacketHandler; -import com.convallyria.taleofkingdoms.client.listener.StartWorldListener; +import com.convallyria.taleofkingdoms.common.packet.PacketHandler; import com.convallyria.taleofkingdoms.common.world.ConquestInstance; import com.convallyria.taleofkingdoms.server.packet.outgoing.OutgoingOpenScreenPacketHandler; import net.fabricmc.api.ClientModInitializer; @@ -96,11 +96,11 @@ private void registerPacketHandlers() { registerHandler(new IncomingInstanceSyncPacketHandler()); registerHandler(new IncomingOpenScreenPacketHandler()); - api.registerIntegratedHandler(new OutgoingOpenScreenPacketHandler()); + api.registerPacketHandler(EnvType.SERVER, new OutgoingOpenScreenPacketHandler()); } - protected void registerHandler(ClientPacketHandler clientPacketHandler) { - api.registerClientHandler(clientPacketHandler); + protected void registerHandler(PacketHandler clientPacketHandler) { + api.registerPacketHandler(EnvType.CLIENT, clientPacketHandler); } private void registerEvents() { diff --git a/src/client/java/com/convallyria/taleofkingdoms/client/TaleOfKingdomsClientAPI.java b/src/client/java/com/convallyria/taleofkingdoms/client/TaleOfKingdomsClientAPI.java index 8d86d3f3..78ccfac1 100644 --- a/src/client/java/com/convallyria/taleofkingdoms/client/TaleOfKingdomsClientAPI.java +++ b/src/client/java/com/convallyria/taleofkingdoms/client/TaleOfKingdomsClientAPI.java @@ -2,25 +2,16 @@ import com.convallyria.taleofkingdoms.TaleOfKingdoms; import com.convallyria.taleofkingdoms.TaleOfKingdomsAPI; -import com.convallyria.taleofkingdoms.client.packet.ClientPacketHandler; -import com.convallyria.taleofkingdoms.common.packet.PacketHandler; -import com.convallyria.taleofkingdoms.server.packet.ServerPacketHandler; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.MinecraftClient; import net.minecraft.server.MinecraftServer; -import net.minecraft.util.Identifier; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; import java.util.function.Consumer; @Environment(EnvType.CLIENT) public class TaleOfKingdomsClientAPI extends TaleOfKingdomsAPI { - private final Map clientPacketHandlers = new ConcurrentHashMap<>(); - private final Map integratedPacketHandlers = new ConcurrentHashMap<>(); - public TaleOfKingdomsClientAPI(TaleOfKingdoms mod) { super(mod); } @@ -35,16 +26,6 @@ public void executeOnMain(Runnable runnable) { MinecraftClient.getInstance().execute(runnable); } - @Override - public PacketHandler getPacketHandler(Identifier packet) { - // Integrated takes precedence over client - final ServerPacketHandler possible = getIntegratedPacketHandler(packet); - if (possible == null) { - return getClientPacketHandler(packet); - } - return possible; - } - public void executeOnServer(Runnable runnable) { MinecraftServer server = MinecraftClient.getInstance().getServer(); if (server != null) { @@ -53,21 +34,4 @@ public void executeOnServer(Runnable runnable) { TaleOfKingdoms.LOGGER.warn("Cannot execute task because MinecraftServer is null"); } } - - public ClientPacketHandler getClientPacketHandler(Identifier identifier) { - return clientPacketHandlers.get(identifier); - } - - public ServerPacketHandler getIntegratedPacketHandler(Identifier identifier) { - return integratedPacketHandlers.get(identifier); - } - - public void registerClientHandler(ClientPacketHandler clientPacketHandler) { - clientPacketHandlers.put(clientPacketHandler.getPacket(), clientPacketHandler); - } - - // Ugh... Why are integrated servers so complex? Why can't we just unify dedicated servers to integrated ones so that everything runs as expected? - public void registerIntegratedHandler(ServerPacketHandler serverPacketHandler) { - integratedPacketHandlers.put(serverPacketHandler.getPacket(), serverPacketHandler); - } } diff --git a/src/client/java/com/convallyria/taleofkingdoms/client/entity/render/ReficuleMageEntityRenderer.java b/src/client/java/com/convallyria/taleofkingdoms/client/entity/render/ReficuleMageEntityRenderer.java index 1cfdc264..d0e3a5da 100644 --- a/src/client/java/com/convallyria/taleofkingdoms/client/entity/render/ReficuleMageEntityRenderer.java +++ b/src/client/java/com/convallyria/taleofkingdoms/client/entity/render/ReficuleMageEntityRenderer.java @@ -18,7 +18,7 @@ @Environment(EnvType.CLIENT) public class ReficuleMageEntityRenderer extends MobEntityRenderer> { - private static final Identifier TEXTURE = new Identifier(TaleOfKingdoms.MODID, "textures/entity/updated_textures/reficulemage.png"); + private static final Identifier TEXTURE = Identifier.of(TaleOfKingdoms.MODID, "textures/entity/updated_textures/reficulemage.png"); public ReficuleMageEntityRenderer(EntityRendererFactory.Context context, PlayerEntityModel modelBipedIn) { super(context, modelBipedIn, 0.5f); diff --git a/src/client/java/com/convallyria/taleofkingdoms/client/entity/render/RenderSetup.java b/src/client/java/com/convallyria/taleofkingdoms/client/entity/render/RenderSetup.java index f0c55225..0501ed95 100644 --- a/src/client/java/com/convallyria/taleofkingdoms/client/entity/render/RenderSetup.java +++ b/src/client/java/com/convallyria/taleofkingdoms/client/entity/render/RenderSetup.java @@ -75,6 +75,6 @@ private void registerDefault(EntityType } public static Identifier identifier(String path) { - return new Identifier(TaleOfKingdoms.MODID, path); + return Identifier.of(TaleOfKingdoms.MODID, path); } } diff --git a/src/client/java/com/convallyria/taleofkingdoms/client/gui/entity/BankerScreen.java b/src/client/java/com/convallyria/taleofkingdoms/client/gui/entity/BankerScreen.java index 2892ae04..74aeae0a 100644 --- a/src/client/java/com/convallyria/taleofkingdoms/client/gui/entity/BankerScreen.java +++ b/src/client/java/com/convallyria/taleofkingdoms/client/gui/entity/BankerScreen.java @@ -2,6 +2,7 @@ import com.convallyria.taleofkingdoms.TaleOfKingdoms; import com.convallyria.taleofkingdoms.client.TaleOfKingdomsClient; +import com.convallyria.taleofkingdoms.common.packet.c2s.BankerInteractPacket; import com.convallyria.taleofkingdoms.common.translation.Translations; import com.convallyria.taleofkingdoms.common.entity.guild.BankerEntity; import com.convallyria.taleofkingdoms.common.entity.guild.banker.BankerMethod; @@ -29,7 +30,7 @@ public class BankerScreen extends BaseUIModelScreen { private LabelComponent totalMoney, totalMoneyBank; public BankerScreen(PlayerEntity player, BankerEntity entity, ConquestInstance instance) { - super(FlowLayout.class, BaseUIModelScreen.DataSource.asset(new Identifier(TaleOfKingdoms.MODID, "banker_ui_model"))); + super(FlowLayout.class, BaseUIModelScreen.DataSource.asset(Identifier.of(TaleOfKingdoms.MODID, "banker_ui_model"))); this.player = player; this.entity = entity; this.instance = instance; @@ -58,8 +59,8 @@ protected void build(FlowLayout rootComponent) { if (guildPlayer.getCoins() >= coins) { this.close(); if (MinecraftClient.getInstance().getServer() == null) { - TaleOfKingdomsClient.getAPI().getClientPacketHandler(Packets.BANKER_INTERACT) - .handleOutgoingPacket(player, BankerMethod.DEPOSIT, coins); + TaleOfKingdomsClient.getAPI().getClientPacket(Packets.BANKER_INTERACT) + .sendPacket(player, new BankerInteractPacket(BankerMethod.DEPOSIT, coins)); return; } guildPlayer.setCoins(guildPlayer.getCoins() - coins); @@ -82,8 +83,8 @@ protected void build(FlowLayout rootComponent) { if (guildPlayer.getBankerCoins() >= coins) { this.close(); if (MinecraftClient.getInstance().getServer() == null) { - TaleOfKingdomsClient.getAPI().getClientPacketHandler(Packets.BANKER_INTERACT) - .handleOutgoingPacket(player, BankerMethod.WITHDRAW, coins); + TaleOfKingdomsClient.getAPI().getClientPacket(Packets.BANKER_INTERACT) + .sendPacket(player, new BankerInteractPacket(BankerMethod.WITHDRAW, coins)); return; } guildPlayer.setBankerCoins(guildPlayer.getBankerCoins() - coins); diff --git a/src/client/java/com/convallyria/taleofkingdoms/client/gui/entity/GuildMasterScreen.java b/src/client/java/com/convallyria/taleofkingdoms/client/gui/entity/GuildMasterScreen.java index 4c31e885..703f1c8b 100644 --- a/src/client/java/com/convallyria/taleofkingdoms/client/gui/entity/GuildMasterScreen.java +++ b/src/client/java/com/convallyria/taleofkingdoms/client/gui/entity/GuildMasterScreen.java @@ -7,6 +7,9 @@ import com.convallyria.taleofkingdoms.client.gui.ScreenTOK; import com.convallyria.taleofkingdoms.client.gui.generic.bar.BarColour; import com.convallyria.taleofkingdoms.client.gui.generic.bar.ScreenBar; +import com.convallyria.taleofkingdoms.common.packet.both.SignContractPacket; +import com.convallyria.taleofkingdoms.common.packet.c2s.FixGuildPacket; +import com.convallyria.taleofkingdoms.common.packet.c2s.HireHunterPacket; import com.convallyria.taleofkingdoms.common.translation.Translations; import com.convallyria.taleofkingdoms.common.entity.EntityTypes; import com.convallyria.taleofkingdoms.common.entity.generic.HunterEntity; @@ -78,8 +81,8 @@ public void init() { if (!guildPlayer.getHunters().isEmpty()) { Translations.HUNTER_THANK.send(player); if (MinecraftClient.getInstance().getServer() == null) { - TaleOfKingdomsClient.getAPI().getClientPacketHandler(Packets.HIRE_HUNTER) - .handleOutgoingPacket(player, true); + TaleOfKingdomsClient.getAPI().getClientPacket(Packets.HIRE_HUNTER) + .sendPacket(player, new HireHunterPacket(true)); this.close(); return; } @@ -117,8 +120,8 @@ public void init() { if (instance.isUnderAttack() || guildPlayer.getCoins() < 3000) return; if (stack == null) return; if (MinecraftClient.getInstance().getServer() == null) { - ((TaleOfKingdomsClientAPI) api).getClientPacketHandler(Packets.FIX_GUILD) - .handleOutgoingPacket(player); + ((TaleOfKingdomsClientAPI) api).getClientPacket(Packets.FIX_GUILD) + .sendPacket(player, new FixGuildPacket()); return; } @@ -182,8 +185,8 @@ private void makeContractSignButton() { guildPlayer.setSignedContract(true); Translations.GUILDMASTER_CONTRACT_SIGN.send(player); } else { - TaleOfKingdomsClient.getAPI().getClientPacketHandler(Packets.SIGN_CONTRACT) - .handleOutgoingPacket(player, true); + TaleOfKingdomsClient.getAPI().getClientPacket(Packets.SIGN_CONTRACT) + .sendPacket(player, new SignContractPacket(true)); } widget.visible = false; widget.active = false; @@ -203,8 +206,8 @@ private void makeCancelContractButton() { guildPlayer.setSignedContract(false); Translations.GUILDMASTER_CONTRACT_CANCEL_AWAIT.send(player); } else { - TaleOfKingdomsClient.getAPI().getClientPacketHandler(Packets.SIGN_CONTRACT) - .handleOutgoingPacket(player, false); + TaleOfKingdomsClient.getAPI().getClientPacket(Packets.SIGN_CONTRACT) + .sendPacket(player, new SignContractPacket(false)); } widget.visible = false; widget.active = false; @@ -213,7 +216,7 @@ private void makeCancelContractButton() { } private void makeHireHuntersButton() { - MutableText hunterText = Text.translatable("menu.taleofkingdoms.guild_master.hire_hunter", guildPlayer.getCoins() >= 1500 ? Formatting.GREEN : Formatting.RED); + MutableText hunterText = Text.translatable("menu.taleofkingdoms.guild_master.hire_hunter").formatted(guildPlayer.getCoins() >= 1500 ? Formatting.GREEN : Formatting.RED); if (this.hireHuntersButton != null) { this.hireHuntersButton.setMessage(hunterText); return; @@ -224,8 +227,8 @@ private void makeHireHuntersButton() { final TaleOfKingdomsAPI api = TaleOfKingdoms.getAPI(); Translations.SERVE.send(player); if (MinecraftClient.getInstance().getServer() == null) { - ((TaleOfKingdomsClientAPI) api).getClientPacketHandler(Packets.HIRE_HUNTER) - .handleOutgoingPacket(player, false); + api.getClientPacket(Packets.HIRE_HUNTER) + .sendPacket(player, new HireHunterPacket(false)); return; } diff --git a/src/client/java/com/convallyria/taleofkingdoms/client/gui/entity/InnkeeperScreen.java b/src/client/java/com/convallyria/taleofkingdoms/client/gui/entity/InnkeeperScreen.java index 8a56ecff..ce2c1d04 100644 --- a/src/client/java/com/convallyria/taleofkingdoms/client/gui/entity/InnkeeperScreen.java +++ b/src/client/java/com/convallyria/taleofkingdoms/client/gui/entity/InnkeeperScreen.java @@ -2,11 +2,11 @@ import com.convallyria.taleofkingdoms.TaleOfKingdoms; import com.convallyria.taleofkingdoms.TaleOfKingdomsAPI; -import com.convallyria.taleofkingdoms.client.TaleOfKingdomsClientAPI; import com.convallyria.taleofkingdoms.client.gui.ScreenTOK; -import com.convallyria.taleofkingdoms.common.translation.Translations; import com.convallyria.taleofkingdoms.common.entity.guild.InnkeeperEntity; import com.convallyria.taleofkingdoms.common.packet.Packets; +import com.convallyria.taleofkingdoms.common.packet.c2s.InnkeeperActionPacket; +import com.convallyria.taleofkingdoms.common.translation.Translations; import com.convallyria.taleofkingdoms.common.utils.BlockUtils; import com.convallyria.taleofkingdoms.common.world.ConquestInstance; import com.convallyria.taleofkingdoms.common.world.guild.GuildPlayer; @@ -53,8 +53,8 @@ public void init() { MinecraftServer server = MinecraftClient.getInstance().getServer(); if (server == null) { - ((TaleOfKingdomsClientAPI) api).getClientPacketHandler(Packets.INNKEEPER_HIRE_ROOM) - .handleOutgoingPacket(player, true); + api.getClientPacket(Packets.INNKEEPER_HIRE_ROOM) + .sendPacket(player, new InnkeeperActionPacket(true)); return; } @@ -62,7 +62,7 @@ public void init() { server.getOverworld().setTimeOfDay(1000); ServerPlayerEntity serverPlayerEntity = MinecraftClient.getInstance().getServer().getPlayerManager().getPlayer(player.getUuid()); if (serverPlayerEntity == null) return; - serverPlayerEntity.teleport(rest.getX() + 0.5, rest.getY(), rest.getZ() + 0.5); + serverPlayerEntity.requestTeleport(rest.getX() + 0.5, rest.getY(), rest.getZ() + 0.5); serverPlayerEntity.refreshPositionAfterTeleport(rest.getX() + 0.5, rest.getY(), rest.getZ() + 0.5); serverPlayerEntity.addStatusEffect(new StatusEffectInstance(StatusEffects.BLINDNESS, 100, 1)); serverPlayerEntity.addStatusEffect(new StatusEffectInstance(StatusEffects.NAUSEA, 200, 0)); @@ -86,8 +86,8 @@ public void init() { } if (server == null) { - ((TaleOfKingdomsClientAPI) api).getClientPacketHandler(Packets.INNKEEPER_HIRE_ROOM) - .handleOutgoingPacket(player, false); + api.getClientPacket(Packets.INNKEEPER_HIRE_ROOM) + .sendPacket(player, new InnkeeperActionPacket(false)); return; } diff --git a/src/client/java/com/convallyria/taleofkingdoms/client/gui/entity/citybuilder/CityBuilderBeginGui.java b/src/client/java/com/convallyria/taleofkingdoms/client/gui/entity/citybuilder/CityBuilderBeginGui.java index 94c83609..83387bc2 100644 --- a/src/client/java/com/convallyria/taleofkingdoms/client/gui/entity/citybuilder/CityBuilderBeginGui.java +++ b/src/client/java/com/convallyria/taleofkingdoms/client/gui/entity/citybuilder/CityBuilderBeginGui.java @@ -17,14 +17,14 @@ public class CityBuilderBeginGui extends BaseCityBuilderScreen { - private static final Identifier BACKGROUND = new Identifier(TaleOfKingdoms.MODID, "textures/gui/menu.png"); + private static final Identifier BACKGROUND = Identifier.of(TaleOfKingdoms.MODID, "textures/gui/menu.png"); private final PlayerEntity player; private final CityBuilderEntity entity; private final ConquestInstance instance; public CityBuilderBeginGui(PlayerEntity player, CityBuilderEntity entity, ConquestInstance instance) { - super(DataSource.asset(new Identifier(TaleOfKingdoms.MODID, "citybuilder_begin_model"))); + super(DataSource.asset(Identifier.of(TaleOfKingdoms.MODID, "citybuilder_begin_model"))); Translations.CITYBUILDER_GUI_OPEN.send(player); this.player = player; this.entity = entity; diff --git a/src/client/java/com/convallyria/taleofkingdoms/client/gui/entity/citybuilder/CityBuilderPriceListGui.java b/src/client/java/com/convallyria/taleofkingdoms/client/gui/entity/citybuilder/CityBuilderPriceListGui.java index 6741cae9..1ab9febb 100644 --- a/src/client/java/com/convallyria/taleofkingdoms/client/gui/entity/citybuilder/CityBuilderPriceListGui.java +++ b/src/client/java/com/convallyria/taleofkingdoms/client/gui/entity/citybuilder/CityBuilderPriceListGui.java @@ -25,7 +25,7 @@ public class CityBuilderPriceListGui extends BaseCityBuilderScreen { private final PlayerKingdom kingdom; public CityBuilderPriceListGui(PlayerEntity player, CityBuilderEntity entity, ConquestInstance instance, PlayerKingdom kingdom) { - super(DataSource.asset(new Identifier(TaleOfKingdoms.MODID, "citybuilder_price_list_model"))); + super(DataSource.asset(Identifier.of(TaleOfKingdoms.MODID, "citybuilder_price_list_model"))); this.player = player; this.entity = entity; this.instance = instance; diff --git a/src/client/java/com/convallyria/taleofkingdoms/client/gui/entity/citybuilder/CityBuilderTierGui.java b/src/client/java/com/convallyria/taleofkingdoms/client/gui/entity/citybuilder/CityBuilderTierGui.java index b2690652..88dcab1d 100644 --- a/src/client/java/com/convallyria/taleofkingdoms/client/gui/entity/citybuilder/CityBuilderTierGui.java +++ b/src/client/java/com/convallyria/taleofkingdoms/client/gui/entity/citybuilder/CityBuilderTierGui.java @@ -10,6 +10,7 @@ import com.convallyria.taleofkingdoms.common.kingdom.builds.BuildCosts; import com.convallyria.taleofkingdoms.common.packet.Packets; import com.convallyria.taleofkingdoms.common.packet.action.CityBuilderAction; +import com.convallyria.taleofkingdoms.common.packet.c2s.CityBuilderActionPacket; import com.convallyria.taleofkingdoms.common.translation.Translations; import com.convallyria.taleofkingdoms.common.world.ConquestInstance; import com.convallyria.taleofkingdoms.common.world.guild.GuildPlayer; @@ -32,11 +33,12 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.concurrent.atomic.AtomicInteger; public class CityBuilderTierGui extends BaseCityBuilderScreen { - private static final Identifier BACKGROUND = new Identifier(TaleOfKingdoms.MODID, "textures/gui/menu.png"); + private static final Identifier BACKGROUND = Identifier.of(TaleOfKingdoms.MODID, "textures/gui/menu.png"); private final PlayerEntity player; private final CityBuilderEntity entity; @@ -49,7 +51,7 @@ public class CityBuilderTierGui extends BaseCityBuilderScreen { private final Map buildButtons = new HashMap<>(BuildCosts.values().length); public CityBuilderTierGui(PlayerEntity player, CityBuilderEntity entity, ConquestInstance instance) { - super(DataSource.asset(new Identifier(TaleOfKingdoms.MODID, "citybuilder_tier_model"))); + super(DataSource.asset(Identifier.of(TaleOfKingdoms.MODID, "citybuilder_tier_model"))); this.player = player; this.entity = entity; this.instance = instance; @@ -98,8 +100,8 @@ protected void build(FlowLayout rootComponent) { inner.child( Components.button(Text.translatable("menu.taleofkingdoms.citybuilder.give_wood"), c -> { if (MinecraftClient.getInstance().getServer() == null) { - TaleOfKingdomsClient.getAPI().getClientPacketHandler(Packets.CITYBUILDER_ACTION) - .handleOutgoingPacket(player, entity.getId(), CityBuilderAction.GIVE_64_WOOD); + TaleOfKingdomsClient.getAPI().getClientPacket(Packets.CITYBUILDER_ACTION) + .sendPacket(player, new CityBuilderActionPacket(entity.getId(), CityBuilderAction.GIVE_64_WOOD, Optional.empty())); return; } @@ -110,8 +112,8 @@ protected void build(FlowLayout rootComponent) { inner.child( Components.button(Text.translatable("menu.taleofkingdoms.citybuilder.give_cobblestone"), c -> { if (MinecraftClient.getInstance().getServer() == null) { - TaleOfKingdomsClient.getAPI().getClientPacketHandler(Packets.CITYBUILDER_ACTION) - .handleOutgoingPacket(player, entity.getId(), CityBuilderAction.GIVE_64_STONE); + TaleOfKingdomsClient.getAPI().getClientPacket(Packets.CITYBUILDER_ACTION) + .sendPacket(player, new CityBuilderActionPacket(entity.getId(), CityBuilderAction.GIVE_64_STONE, Optional.empty())); return; } @@ -142,8 +144,8 @@ protected void build(FlowLayout rootComponent) { inner.child( this.fixWholeKingdomButton = (ButtonComponent) Components.button(Text.translatable("menu.taleofkingdoms.citybuilder.fix_kingdom"), c -> { if (MinecraftClient.getInstance().getServer() == null) { - TaleOfKingdomsClient.getAPI().getClientPacketHandler(Packets.CITYBUILDER_ACTION) - .handleOutgoingPacket(player, entity.getId(), CityBuilderAction.FIX_KINGDOM); + TaleOfKingdomsClient.getAPI().getClientPacket(Packets.CITYBUILDER_ACTION) + .sendPacket(player, new CityBuilderActionPacket(entity.getId(), CityBuilderAction.FIX_KINGDOM, Optional.empty())); return; } @@ -198,8 +200,8 @@ protected void build(FlowLayout rootComponent) { final Component button = Components.button(text.append(build.getDisplayName()), c -> { if (MinecraftClient.getInstance().getServer() == null) { - TaleOfKingdomsClient.getAPI().getClientPacketHandler(Packets.CITYBUILDER_ACTION) - .handleOutgoingPacket(player, entity.getId(), CityBuilderAction.BUILD, build); + TaleOfKingdomsClient.getAPI().getClientPacket(Packets.CITYBUILDER_ACTION) + .sendPacket(player, new CityBuilderActionPacket(entity.getId(), CityBuilderAction.BUILD, Optional.of(build))); return; } diff --git a/src/client/java/com/convallyria/taleofkingdoms/client/gui/entity/citybuilder/confirm/ConfirmBuildKingdomGui.java b/src/client/java/com/convallyria/taleofkingdoms/client/gui/entity/citybuilder/confirm/ConfirmBuildKingdomGui.java index cc5382f3..e3e024e5 100644 --- a/src/client/java/com/convallyria/taleofkingdoms/client/gui/entity/citybuilder/confirm/ConfirmBuildKingdomGui.java +++ b/src/client/java/com/convallyria/taleofkingdoms/client/gui/entity/citybuilder/confirm/ConfirmBuildKingdomGui.java @@ -7,6 +7,7 @@ import com.convallyria.taleofkingdoms.common.kingdom.PlayerKingdom; import com.convallyria.taleofkingdoms.common.kingdom.poi.KingdomPOI; import com.convallyria.taleofkingdoms.common.packet.Packets; +import com.convallyria.taleofkingdoms.common.packet.c2s.BuildKingdomPacket; import com.convallyria.taleofkingdoms.common.schematic.Schematic; import com.convallyria.taleofkingdoms.common.world.ConquestInstance; import com.convallyria.taleofkingdoms.common.world.guild.GuildPlayer; @@ -36,7 +37,7 @@ public class ConfirmBuildKingdomGui extends BaseCityBuilderScreen { private final ConquestInstance instance; public ConfirmBuildKingdomGui(PlayerEntity player, CityBuilderEntity entity, ConquestInstance instance) { - super(DataSource.asset(new Identifier(TaleOfKingdoms.MODID, "citybuilder_confirm_build_kingdom_model"))); + super(DataSource.asset(Identifier.of(TaleOfKingdoms.MODID, "citybuilder_confirm_build_kingdom_model"))); this.player = player; this.entity = entity; this.instance = instance; @@ -71,8 +72,8 @@ protected void build(FlowLayout rootComponent) { // Close current screen, calculate paste position, and add their kingdom MinecraftClient.getInstance().currentScreen.close(); if (MinecraftClient.getInstance().getServer() == null) { - TaleOfKingdomsClient.getAPI().getClientPacketHandler(Packets.BUILD_KINGDOM) - .handleOutgoingPacket(player, entity.getId()); + TaleOfKingdomsClient.getAPI().getClientPacket(Packets.BUILD_KINGDOM) + .sendPacket(player, new BuildKingdomPacket(entity.getId())); return; } @@ -100,7 +101,7 @@ protected void build(FlowLayout rootComponent) { cityBuilderServer.setTarget(playerKingdom.getPOIPos(KingdomPOI.CITY_BUILDER_WELL_POI)); }); }); - player.playSound(TaleOfKingdoms.getAPI().getManager(SoundManager.class).getSound(SoundManager.TOKSound.TOKTHEME), SoundCategory.MUSIC, 0.1f, 1f); + player.playSoundToPlayer(TaleOfKingdoms.getAPI().getManager(SoundManager.class).getSound(SoundManager.TOKSound.TOKTHEME), SoundCategory.MUSIC, 0.1f, 1f); }) .positioning(Positioning.relative(50, 67)) ); diff --git a/src/client/java/com/convallyria/taleofkingdoms/client/gui/entity/citybuilder/confirm/ConfirmUpgradeKingdomGui.java b/src/client/java/com/convallyria/taleofkingdoms/client/gui/entity/citybuilder/confirm/ConfirmUpgradeKingdomGui.java index c5c765c7..e6c8f847 100644 --- a/src/client/java/com/convallyria/taleofkingdoms/client/gui/entity/citybuilder/confirm/ConfirmUpgradeKingdomGui.java +++ b/src/client/java/com/convallyria/taleofkingdoms/client/gui/entity/citybuilder/confirm/ConfirmUpgradeKingdomGui.java @@ -7,6 +7,7 @@ import com.convallyria.taleofkingdoms.common.kingdom.KingdomTier; import com.convallyria.taleofkingdoms.common.kingdom.PlayerKingdom; import com.convallyria.taleofkingdoms.common.packet.Packets; +import com.convallyria.taleofkingdoms.common.packet.c2s.UpgradeKingdomPacket; import com.convallyria.taleofkingdoms.common.world.ConquestInstance; import com.convallyria.taleofkingdoms.managers.SoundManager; import io.wispforest.owo.ui.component.ButtonComponent; @@ -34,7 +35,7 @@ public class ConfirmUpgradeKingdomGui extends BaseCityBuilderScreen { private final ConquestInstance instance; public ConfirmUpgradeKingdomGui(PlayerEntity player, CityBuilderEntity entity, ConquestInstance instance) { - super(DataSource.asset(new Identifier(TaleOfKingdoms.MODID, "citybuilder_confirm_upgrade_kingdom_model"))); + super(DataSource.asset(Identifier.of(TaleOfKingdoms.MODID, "citybuilder_confirm_upgrade_kingdom_model"))); this.player = player; this.entity = entity; this.instance = instance; @@ -69,8 +70,8 @@ protected void build(FlowLayout rootComponent) { // Close current screen, calculate paste position, and upgrade their kingdom MinecraftClient.getInstance().currentScreen.close(); if (MinecraftClient.getInstance().getServer() == null) { - TaleOfKingdomsClient.getAPI().getClientPacketHandler(Packets.UPGRADE_KINGDOM) - .handleOutgoingPacket(player, entity.getId()); + TaleOfKingdomsClient.getAPI().getClientPacket(Packets.UPGRADE_KINGDOM) + .sendPacket(player, new UpgradeKingdomPacket(entity.getId())); return; } @@ -95,7 +96,7 @@ protected void build(FlowLayout rootComponent) { kingdom.setStart(start); kingdom.setEnd(end); }); - player.playSound(TaleOfKingdoms.getAPI().getManager(SoundManager.class).getSound(SoundManager.TOKSound.TOKTHEME), SoundCategory.MUSIC, 0.1f, 1f); + player.playSoundToPlayer(TaleOfKingdoms.getAPI().getManager(SoundManager.class).getSound(SoundManager.TOKSound.TOKTHEME), SoundCategory.MUSIC, 0.1f, 1f); }) .positioning(Positioning.relative(50, 67)) ); diff --git a/src/client/java/com/convallyria/taleofkingdoms/client/gui/entity/kingdom/ForemanScreen.java b/src/client/java/com/convallyria/taleofkingdoms/client/gui/entity/kingdom/ForemanScreen.java index 44240414..ab873d0b 100644 --- a/src/client/java/com/convallyria/taleofkingdoms/client/gui/entity/kingdom/ForemanScreen.java +++ b/src/client/java/com/convallyria/taleofkingdoms/client/gui/entity/kingdom/ForemanScreen.java @@ -5,6 +5,8 @@ import com.convallyria.taleofkingdoms.common.entity.kingdom.ForemanEntity; import com.convallyria.taleofkingdoms.common.entity.kingdom.workers.QuarryForemanEntity; import com.convallyria.taleofkingdoms.common.packet.Packets; +import com.convallyria.taleofkingdoms.common.packet.c2s.ForemanBuyWorkerPacket; +import com.convallyria.taleofkingdoms.common.packet.c2s.ForemanCollectPacket; import com.convallyria.taleofkingdoms.common.translation.Translations; import com.convallyria.taleofkingdoms.common.world.ConquestInstance; import io.wispforest.owo.ui.base.BaseOwoScreen; @@ -76,8 +78,8 @@ protected void build(FlowLayout rootComponent) { rootComponent.child( Components.button(Text.translatable("menu.taleofkingdoms.foreman.collect"), c -> { if (MinecraftClient.getInstance().getServer() == null) { - TaleOfKingdomsClient.getAPI().getClientPacketHandler(Packets.FOREMAN_COLLECT) - .handleOutgoingPacket(player, entity.getId()); + TaleOfKingdomsClient.getAPI().getClientPacket(Packets.FOREMAN_COLLECT) + .sendPacket(player, new ForemanCollectPacket(entity.getId())); return; } @@ -90,8 +92,8 @@ protected void build(FlowLayout rootComponent) { rootComponent.child( Components.button(Text.translatable("menu.taleofkingdoms.foreman.buy_worker"), c -> { if (MinecraftClient.getInstance().getServer() == null) { - TaleOfKingdomsClient.getAPI().getClientPacketHandler(Packets.FOREMAN_BUY_WORKER) - .handleOutgoingPacket(player, entity.getId()); + TaleOfKingdomsClient.getAPI().getClientPacket(Packets.FOREMAN_BUY_WORKER) + .sendPacket(player, new ForemanBuyWorkerPacket(entity.getId())); return; } diff --git a/src/client/java/com/convallyria/taleofkingdoms/client/gui/entity/shop/DefaultShopScreen.java b/src/client/java/com/convallyria/taleofkingdoms/client/gui/entity/shop/DefaultShopScreen.java index cd779ca2..74c2abe0 100644 --- a/src/client/java/com/convallyria/taleofkingdoms/client/gui/entity/shop/DefaultShopScreen.java +++ b/src/client/java/com/convallyria/taleofkingdoms/client/gui/entity/shop/DefaultShopScreen.java @@ -43,7 +43,7 @@ public abstract class DefaultShopScreen extends BaseUIModelScreen im private LabelComponent coinsLabel, selectedItemLabel; public DefaultShopScreen(PlayerEntity player, ShopEntity entity, ConquestInstance instance) { - super(FlowLayout.class, BaseUIModelScreen.DataSource.asset(new Identifier(TaleOfKingdoms.MODID, "shop_ui_model"))); + super(FlowLayout.class, BaseUIModelScreen.DataSource.asset(Identifier.of(TaleOfKingdoms.MODID, "shop_ui_model"))); this.player = player; this.entity = entity; this.instance = instance; diff --git a/src/client/java/com/convallyria/taleofkingdoms/client/gui/entity/shop/widget/ShopButtonWidget.java b/src/client/java/com/convallyria/taleofkingdoms/client/gui/entity/shop/widget/ShopButtonWidget.java index e82146e8..6cd0c2cd 100644 --- a/src/client/java/com/convallyria/taleofkingdoms/client/gui/entity/shop/widget/ShopButtonWidget.java +++ b/src/client/java/com/convallyria/taleofkingdoms/client/gui/entity/shop/widget/ShopButtonWidget.java @@ -35,7 +35,7 @@ public ShopItem getShopItem() { @Override public void renderWidget(DrawContext context, int mouseX, int mouseY, float delta) { - Identifier identifier = new Identifier(TaleOfKingdoms.MODID,"textures/gui/gui.png"); + Identifier identifier = Identifier.of(TaleOfKingdoms.MODID,"textures/gui/gui.png"); RenderSystem.setShader(GameRenderer::getPositionTexProgram); RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); boolean flag = isMouseOver(mouseX, mouseY); diff --git a/src/client/java/com/convallyria/taleofkingdoms/client/gui/entity/shop/widget/ShopScreenInterface.java b/src/client/java/com/convallyria/taleofkingdoms/client/gui/entity/shop/widget/ShopScreenInterface.java index 18440c92..4825479a 100644 --- a/src/client/java/com/convallyria/taleofkingdoms/client/gui/entity/shop/widget/ShopScreenInterface.java +++ b/src/client/java/com/convallyria/taleofkingdoms/client/gui/entity/shop/widget/ShopScreenInterface.java @@ -2,9 +2,9 @@ import com.convallyria.taleofkingdoms.TaleOfKingdoms; import com.convallyria.taleofkingdoms.TaleOfKingdomsAPI; -import com.convallyria.taleofkingdoms.client.TaleOfKingdomsClientAPI; import com.convallyria.taleofkingdoms.common.entity.ShopEntity; import com.convallyria.taleofkingdoms.common.packet.Packets; +import com.convallyria.taleofkingdoms.common.packet.c2s.ToggleSellGuiPacket; import com.convallyria.taleofkingdoms.common.shop.ShopItem; import net.minecraft.block.BlockState; import net.minecraft.client.MinecraftClient; @@ -28,8 +28,8 @@ default void openSellGui(ShopEntity entity, PlayerEntity player) { BlockPos pos = entity.getBlockPos().add(0, 2, 0); final TaleOfKingdomsAPI api = TaleOfKingdoms.getAPI(); if (MinecraftClient.getInstance().getServer() == null) { - ((TaleOfKingdomsClientAPI) api).getClientPacketHandler(Packets.TOGGLE_SELL_GUI) - .handleOutgoingPacket(player, false, entity.getGUIType()); + api.getClientPacket(Packets.TOGGLE_SELL_GUI) + .sendPacket(player, new ToggleSellGuiPacket(false, entity.getGUIType())); return; } diff --git a/src/client/java/com/convallyria/taleofkingdoms/client/gui/generic/ScreenStartConquest.java b/src/client/java/com/convallyria/taleofkingdoms/client/gui/generic/ScreenStartConquest.java index c2f692ec..527da4ba 100644 --- a/src/client/java/com/convallyria/taleofkingdoms/client/gui/generic/ScreenStartConquest.java +++ b/src/client/java/com/convallyria/taleofkingdoms/client/gui/generic/ScreenStartConquest.java @@ -112,7 +112,7 @@ public void init() { @Override public void render(DrawContext context, int mouseX, int mouseY, float delta) { - this.renderBackground(context, mouseX, mouseY, delta); + super.render(context, mouseX, mouseY, delta); String text = Translations.DARKNESS.getFormatted(); int currentHeight = this.height / 2 - 110; for (String toRender : text.split("\n")) { @@ -123,7 +123,6 @@ public void render(DrawContext context, int mouseX, int mouseY, float delta) { context.drawCenteredTextWithShadow(this.textRenderer, Translations.HERO.getFormatted(), this.width / 2, currentHeight + 10, 0xFFFFFF); context.drawCenteredTextWithShadow(this.textRenderer, Text.translatable("menu.taleofkingdoms.startconquest.exit"), this.width / 2, currentHeight + 65, 0xFFFFFF); this.text.render(context, mouseX, mouseY, delta); - super.render(context, mouseX, mouseY, delta); } @Override diff --git a/src/client/java/com/convallyria/taleofkingdoms/client/gui/generic/owo/update/UpdateScreen.java b/src/client/java/com/convallyria/taleofkingdoms/client/gui/generic/owo/update/UpdateScreen.java index 381ebd95..bce55407 100644 --- a/src/client/java/com/convallyria/taleofkingdoms/client/gui/generic/owo/update/UpdateScreen.java +++ b/src/client/java/com/convallyria/taleofkingdoms/client/gui/generic/owo/update/UpdateScreen.java @@ -23,7 +23,7 @@ public class UpdateScreen extends BaseUIModelScreen { public UpdateScreen() { - super(FlowLayout.class, BaseUIModelScreen.DataSource.asset(new Identifier(TaleOfKingdoms.MODID, "update_ui_model"))); + super(FlowLayout.class, BaseUIModelScreen.DataSource.asset(Identifier.of(TaleOfKingdoms.MODID, "update_ui_model"))); } @Override diff --git a/src/client/java/com/convallyria/taleofkingdoms/client/gui/shop/ScreenSellItem.java b/src/client/java/com/convallyria/taleofkingdoms/client/gui/shop/ScreenSellItem.java index e4dc839b..98013c50 100644 --- a/src/client/java/com/convallyria/taleofkingdoms/client/gui/shop/ScreenSellItem.java +++ b/src/client/java/com/convallyria/taleofkingdoms/client/gui/shop/ScreenSellItem.java @@ -2,10 +2,10 @@ import com.convallyria.taleofkingdoms.TaleOfKingdoms; import com.convallyria.taleofkingdoms.TaleOfKingdomsAPI; -import com.convallyria.taleofkingdoms.client.TaleOfKingdomsClientAPI; import com.convallyria.taleofkingdoms.common.entity.EntityTypes; import com.convallyria.taleofkingdoms.common.entity.ShopEntity; import com.convallyria.taleofkingdoms.common.packet.Packets; +import com.convallyria.taleofkingdoms.common.packet.c2s.ToggleSellGuiPacket; import com.convallyria.taleofkingdoms.common.world.ConquestInstance; import com.convallyria.taleofkingdoms.common.world.guild.GuildPlayer; import com.mojang.blaze3d.systems.RenderSystem; @@ -26,7 +26,7 @@ public class ScreenSellItem extends HandledScreen { //A path to the gui texture. In this example we use the texture from the dispenser - private static final Identifier TEXTURE = new Identifier(TaleOfKingdoms.MODID, "textures/gui/guisell.png"); + private static final Identifier TEXTURE = Identifier.of(TaleOfKingdoms.MODID, "textures/gui/guisell.png"); private final PlayerInventory playerInventory; @@ -85,8 +85,8 @@ public void close() { protected void deleteBlock(TaleOfKingdomsAPI api, ShopEntity entity) { if (MinecraftClient.getInstance().getServer() == null) { - ((TaleOfKingdomsClientAPI) api).getClientPacketHandler(Packets.TOGGLE_SELL_GUI) - .handleOutgoingPacket(playerInventory.player, true, entity.getGUIType()); + api.getClientPacket(Packets.TOGGLE_SELL_GUI) + .sendPacket(playerInventory.player, new ToggleSellGuiPacket(true, entity.getGUIType())); return; } diff --git a/src/client/java/com/convallyria/taleofkingdoms/client/packet/ClientPacketHandler.java b/src/client/java/com/convallyria/taleofkingdoms/client/packet/ClientPacketHandler.java deleted file mode 100644 index 79c1e73b..00000000 --- a/src/client/java/com/convallyria/taleofkingdoms/client/packet/ClientPacketHandler.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.convallyria.taleofkingdoms.client.packet; - -import com.convallyria.taleofkingdoms.common.packet.PacketHandler; -import com.convallyria.taleofkingdoms.common.packet.context.ClientPacketContext; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.util.Identifier; - -@Environment(EnvType.CLIENT) -public abstract class ClientPacketHandler extends PacketHandler { - - public ClientPacketHandler(Identifier packet) { - super(packet); - } - - @Override - protected void register() { - ClientPlayNetworking.registerGlobalReceiver(getPacket(), (client, handler, buf, responseSender) -> { - ClientPacketContext context = new ClientPacketContext(EnvType.CLIENT, client.player, client); - handleIncomingPacket(context, buf); - }); - } - - @Override - protected void sendPacket(PlayerEntity player, PacketByteBuf passedData) { - ClientPlayNetworking.send(getPacket(), passedData); - } -} diff --git a/src/client/java/com/convallyria/taleofkingdoms/client/packet/both/BothSignContractPacketHandler.java b/src/client/java/com/convallyria/taleofkingdoms/client/packet/both/BothSignContractPacketHandler.java index 62af1546..57968802 100644 --- a/src/client/java/com/convallyria/taleofkingdoms/client/packet/both/BothSignContractPacketHandler.java +++ b/src/client/java/com/convallyria/taleofkingdoms/client/packet/both/BothSignContractPacketHandler.java @@ -1,26 +1,22 @@ package com.convallyria.taleofkingdoms.client.packet.both; import com.convallyria.taleofkingdoms.TaleOfKingdoms; -import com.convallyria.taleofkingdoms.client.packet.ClientPacketHandler; -import com.convallyria.taleofkingdoms.common.translation.Translations; import com.convallyria.taleofkingdoms.common.packet.Packets; +import com.convallyria.taleofkingdoms.common.packet.both.SignContractPacket; import com.convallyria.taleofkingdoms.common.packet.context.PacketContext; +import com.convallyria.taleofkingdoms.common.translation.Translations; import com.convallyria.taleofkingdoms.common.world.guild.GuildPlayer; -import io.netty.buffer.Unpooled; import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.network.PacketByteBuf; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -public final class BothSignContractPacketHandler extends ClientPacketHandler { +public final class BothSignContractPacketHandler extends InOutClientPacketHandler { public BothSignContractPacketHandler() { - super(Packets.SIGN_CONTRACT); + super(Packets.SIGN_CONTRACT, SignContractPacket.CODEC); } @Override - public void handleIncomingPacket(PacketContext context, PacketByteBuf attachedData) { - boolean sign = attachedData.readBoolean(); + public void handleIncomingPacket(PacketContext context, SignContractPacket packet) { + boolean sign = packet.signed(); context.taskQueue().execute(() -> TaleOfKingdoms.getAPI().getConquestInstanceStorage().mostRecentInstance().ifPresent(instance -> { final PlayerEntity player = context.player(); final GuildPlayer guildPlayer = instance.getPlayer(player); @@ -28,14 +24,4 @@ public void handleIncomingPacket(PacketContext context, PacketByteBuf attachedDa if (sign) Translations.GUILDMASTER_CONTRACT_SIGN.send(player); })); } - - @Override - public void handleOutgoingPacket(@NotNull PlayerEntity player, @Nullable Object... data) { - if (data != null && data[0] instanceof Boolean) { - boolean sign = (Boolean) data[0]; - PacketByteBuf passedData = new PacketByteBuf(Unpooled.buffer()); - passedData.writeBoolean(sign); - sendPacket(player, passedData); - } - } } diff --git a/src/client/java/com/convallyria/taleofkingdoms/client/packet/both/InOutClientPacketHandler.java b/src/client/java/com/convallyria/taleofkingdoms/client/packet/both/InOutClientPacketHandler.java new file mode 100644 index 00000000..51f844fd --- /dev/null +++ b/src/client/java/com/convallyria/taleofkingdoms/client/packet/both/InOutClientPacketHandler.java @@ -0,0 +1,36 @@ +package com.convallyria.taleofkingdoms.client.packet.both; + +import com.convallyria.taleofkingdoms.common.packet.PacketHandler; +import com.convallyria.taleofkingdoms.common.packet.context.ClientPacketContext; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; +import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry; +import net.minecraft.client.MinecraftClient; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.network.RegistryByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.packet.CustomPayload; + +@Environment(EnvType.CLIENT) +public abstract class InOutClientPacketHandler extends PacketHandler { + + public InOutClientPacketHandler(CustomPayload.Id packet, PacketCodec codec) { + super(packet, codec); + } + + @Override + protected void register() { + PayloadTypeRegistry.playS2C().register(this.getPacket(), codec); + PayloadTypeRegistry.playC2S().register(this.getPacket(), codec); + ClientPlayNetworking.registerGlobalReceiver(getPacket(), (payload, ctx) -> { + ClientPacketContext context = new ClientPacketContext(EnvType.CLIENT, ctx.player(), MinecraftClient.getInstance()); + handleIncomingPacket(context, payload); + }); + } + + @Override + public void sendPacket(PlayerEntity player, T packet) { + ClientPlayNetworking.send(packet); + } +} diff --git a/src/client/java/com/convallyria/taleofkingdoms/client/packet/incoming/InClientPacketHandler.java b/src/client/java/com/convallyria/taleofkingdoms/client/packet/incoming/InClientPacketHandler.java new file mode 100644 index 00000000..15162f6a --- /dev/null +++ b/src/client/java/com/convallyria/taleofkingdoms/client/packet/incoming/InClientPacketHandler.java @@ -0,0 +1,35 @@ +package com.convallyria.taleofkingdoms.client.packet.incoming; + +import com.convallyria.taleofkingdoms.common.packet.PacketHandler; +import com.convallyria.taleofkingdoms.common.packet.context.ClientPacketContext; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; +import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry; +import net.minecraft.client.MinecraftClient; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.network.RegistryByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.packet.CustomPayload; + +@Environment(EnvType.CLIENT) +public abstract class InClientPacketHandler extends PacketHandler { + + public InClientPacketHandler(CustomPayload.Id packet, PacketCodec codec) { + super(packet, codec); + } + + @Override + protected void register() { + PayloadTypeRegistry.playS2C().register(this.getPacket(), codec); + ClientPlayNetworking.registerGlobalReceiver(getPacket(), (payload, ctx) -> { + ClientPacketContext context = new ClientPacketContext(EnvType.CLIENT, ctx.player(), MinecraftClient.getInstance()); + handleIncomingPacket(context, payload); + }); + } + + @Override + public void sendPacket(PlayerEntity player, T packet) { + throw new UnsupportedOperationException(); + } +} diff --git a/src/client/java/com/convallyria/taleofkingdoms/client/packet/incoming/IncomingInstanceSyncPacketHandler.java b/src/client/java/com/convallyria/taleofkingdoms/client/packet/incoming/IncomingInstanceSyncPacketHandler.java index c5f4aa11..07bc2c18 100644 --- a/src/client/java/com/convallyria/taleofkingdoms/client/packet/incoming/IncomingInstanceSyncPacketHandler.java +++ b/src/client/java/com/convallyria/taleofkingdoms/client/packet/incoming/IncomingInstanceSyncPacketHandler.java @@ -2,26 +2,22 @@ import com.convallyria.taleofkingdoms.TaleOfKingdoms; import com.convallyria.taleofkingdoms.TaleOfKingdomsAPI; -import com.convallyria.taleofkingdoms.client.packet.ClientPacketHandler; import com.convallyria.taleofkingdoms.common.packet.Packets; import com.convallyria.taleofkingdoms.common.packet.context.PacketContext; +import com.convallyria.taleofkingdoms.common.packet.s2c.InstanceSyncPacket; import com.convallyria.taleofkingdoms.common.world.ConquestInstance; import net.minecraft.client.MinecraftClient; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.network.PacketByteBuf; import net.minecraft.text.Text; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -public final class IncomingInstanceSyncPacketHandler extends ClientPacketHandler { +public final class IncomingInstanceSyncPacketHandler extends InClientPacketHandler { public IncomingInstanceSyncPacketHandler() { - super(Packets.INSTANCE_SYNC); + super(Packets.INSTANCE_SYNC, InstanceSyncPacket.CODEC); } @Override - public void handleIncomingPacket(PacketContext context, PacketByteBuf attachedData) { - final ConquestInstance instance = attachedData.decodeAsJson(ConquestInstance.CODEC); + public void handleIncomingPacket(PacketContext context, InstanceSyncPacket sync) { + final ConquestInstance instance = sync.instance(); context.taskQueue().execute(() -> { MinecraftClient client = (MinecraftClient) context.taskQueue(); if (TaleOfKingdoms.CONFIG.mainConfig.developerMode) { @@ -40,9 +36,4 @@ public void handleIncomingPacket(PacketContext context, PacketByteBuf attachedDa } }); } - - @Override - public void handleOutgoingPacket(@NotNull PlayerEntity player, @Nullable Object... data) { - throw new IllegalStateException("Not supported"); - } } diff --git a/src/client/java/com/convallyria/taleofkingdoms/client/packet/incoming/IncomingOpenScreenPacketHandler.java b/src/client/java/com/convallyria/taleofkingdoms/client/packet/incoming/IncomingOpenScreenPacketHandler.java index 2db8621c..5226a8e8 100644 --- a/src/client/java/com/convallyria/taleofkingdoms/client/packet/incoming/IncomingOpenScreenPacketHandler.java +++ b/src/client/java/com/convallyria/taleofkingdoms/client/packet/incoming/IncomingOpenScreenPacketHandler.java @@ -13,7 +13,6 @@ import com.convallyria.taleofkingdoms.client.gui.entity.kingdom.StockMarketScreen; import com.convallyria.taleofkingdoms.client.gui.entity.kingdom.WardenScreen; import com.convallyria.taleofkingdoms.client.gui.entity.shop.FoodShopScreen; -import com.convallyria.taleofkingdoms.client.packet.ClientPacketHandler; import com.convallyria.taleofkingdoms.common.entity.guild.BankerEntity; import com.convallyria.taleofkingdoms.common.entity.guild.BlacksmithEntity; import com.convallyria.taleofkingdoms.common.entity.guild.CityBuilderEntity; @@ -27,29 +26,25 @@ import com.convallyria.taleofkingdoms.common.entity.kingdom.warden.WardenEntity; import com.convallyria.taleofkingdoms.common.packet.Packets; import com.convallyria.taleofkingdoms.common.packet.context.PacketContext; +import com.convallyria.taleofkingdoms.common.packet.s2c.OpenScreenPacket; import com.convallyria.taleofkingdoms.common.world.ConquestInstance; -import com.convallyria.taleofkingdoms.server.packet.outgoing.OutgoingOpenScreenPacketHandler; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.screen.Screen; import net.minecraft.entity.Entity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.network.PacketByteBuf; import net.minecraft.text.Text; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import java.util.Optional; -public final class IncomingOpenScreenPacketHandler extends ClientPacketHandler { +public final class IncomingOpenScreenPacketHandler extends InClientPacketHandler { public IncomingOpenScreenPacketHandler() { - super(Packets.OPEN_CLIENT_SCREEN); + super(Packets.OPEN_CLIENT_SCREEN, OpenScreenPacket.CODEC); } @Override - public void handleIncomingPacket(PacketContext context, PacketByteBuf attachedData) { - final OutgoingOpenScreenPacketHandler.ScreenTypes type = attachedData.readEnumConstant(OutgoingOpenScreenPacketHandler.ScreenTypes.class); - final int entityId = attachedData.readInt(); + public void handleIncomingPacket(PacketContext context, OpenScreenPacket openScreen) { + final OpenScreenPacket.ScreenTypes type = openScreen.type(); + final int entityId = openScreen.entityId(); context.taskQueue().execute(() -> { MinecraftClient client = (MinecraftClient) context.taskQueue(); if (TaleOfKingdoms.CONFIG.mainConfig.developerMode) { @@ -62,7 +57,7 @@ public void handleIncomingPacket(PacketContext context, PacketByteBuf attachedDa final Entity entityById = client.world.getEntityById(entityId); if (entityById == null) { - TaleOfKingdoms.LOGGER.warn("Desync! " + entityId + " was not found."); + TaleOfKingdoms.LOGGER.warn("Desync! {} was not found.", entityId); return; } @@ -90,9 +85,4 @@ public void handleIncomingPacket(PacketContext context, PacketByteBuf attachedDa client.setScreen(screen); }); } - - @Override - public void handleOutgoingPacket(@NotNull PlayerEntity player, @Nullable Object... data) { - throw new IllegalStateException("Not supported"); - } } diff --git a/src/client/java/com/convallyria/taleofkingdoms/client/packet/outgoing/OutClientPacketHandler.java b/src/client/java/com/convallyria/taleofkingdoms/client/packet/outgoing/OutClientPacketHandler.java new file mode 100644 index 00000000..67dcc8d2 --- /dev/null +++ b/src/client/java/com/convallyria/taleofkingdoms/client/packet/outgoing/OutClientPacketHandler.java @@ -0,0 +1,29 @@ +package com.convallyria.taleofkingdoms.client.packet.outgoing; + +import com.convallyria.taleofkingdoms.common.packet.PacketHandler; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; +import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.network.RegistryByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.packet.CustomPayload; + +@Environment(EnvType.CLIENT) +public abstract class OutClientPacketHandler extends PacketHandler { + + public OutClientPacketHandler(CustomPayload.Id packet, PacketCodec codec) { + super(packet, codec); + } + + @Override + protected void register() { + PayloadTypeRegistry.playC2S().register(this.getPacket(), codec); + } + + @Override + public void sendPacket(PlayerEntity player, T packet) { + ClientPlayNetworking.send(packet); + } +} diff --git a/src/client/java/com/convallyria/taleofkingdoms/client/packet/outgoing/OutgoingBankerInteractPacketHandler.java b/src/client/java/com/convallyria/taleofkingdoms/client/packet/outgoing/OutgoingBankerInteractPacketHandler.java index c5847570..e8ea531a 100644 --- a/src/client/java/com/convallyria/taleofkingdoms/client/packet/outgoing/OutgoingBankerInteractPacketHandler.java +++ b/src/client/java/com/convallyria/taleofkingdoms/client/packet/outgoing/OutgoingBankerInteractPacketHandler.java @@ -1,31 +1,12 @@ package com.convallyria.taleofkingdoms.client.packet.outgoing; -import com.convallyria.taleofkingdoms.client.packet.ClientPacketHandler; -import com.convallyria.taleofkingdoms.common.entity.guild.banker.BankerMethod; import com.convallyria.taleofkingdoms.common.packet.Packets; -import com.convallyria.taleofkingdoms.common.packet.context.PacketContext; -import io.netty.buffer.Unpooled; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.network.PacketByteBuf; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import com.convallyria.taleofkingdoms.common.packet.c2s.BankerInteractPacket; -public final class OutgoingBankerInteractPacketHandler extends ClientPacketHandler { +public final class OutgoingBankerInteractPacketHandler extends OutClientPacketHandler { public OutgoingBankerInteractPacketHandler() { - super(Packets.BANKER_INTERACT); + super(Packets.BANKER_INTERACT, BankerInteractPacket.CODEC); } - @Override - public void handleIncomingPacket(PacketContext context, PacketByteBuf attachedData) { - throw new IllegalArgumentException("Not supported"); - } - - @Override - public void handleOutgoingPacket(@NotNull PlayerEntity player, @Nullable Object... data) { - PacketByteBuf passedData = new PacketByteBuf(Unpooled.buffer()); - passedData.writeEnumConstant((BankerMethod) data[0]); - passedData.writeInt((Integer) data[1]); - sendPacket(player, passedData); - } } diff --git a/src/client/java/com/convallyria/taleofkingdoms/client/packet/outgoing/OutgoingBuildKingdomPacket.java b/src/client/java/com/convallyria/taleofkingdoms/client/packet/outgoing/OutgoingBuildKingdomPacket.java index 09fe5e43..c09f7fc4 100644 --- a/src/client/java/com/convallyria/taleofkingdoms/client/packet/outgoing/OutgoingBuildKingdomPacket.java +++ b/src/client/java/com/convallyria/taleofkingdoms/client/packet/outgoing/OutgoingBuildKingdomPacket.java @@ -1,29 +1,12 @@ package com.convallyria.taleofkingdoms.client.packet.outgoing; -import com.convallyria.taleofkingdoms.client.packet.ClientPacketHandler; import com.convallyria.taleofkingdoms.common.packet.Packets; -import com.convallyria.taleofkingdoms.common.packet.context.PacketContext; -import io.netty.buffer.Unpooled; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.network.PacketByteBuf; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import com.convallyria.taleofkingdoms.common.packet.c2s.BuildKingdomPacket; -public final class OutgoingBuildKingdomPacket extends ClientPacketHandler { +public final class OutgoingBuildKingdomPacket extends OutClientPacketHandler { public OutgoingBuildKingdomPacket() { - super(Packets.BUILD_KINGDOM); + super(Packets.BUILD_KINGDOM, BuildKingdomPacket.CODEC); } - @Override - public void handleIncomingPacket(PacketContext context, PacketByteBuf attachedData) { - throw new IllegalArgumentException("Not supported"); - } - - @Override - public void handleOutgoingPacket(@NotNull PlayerEntity player, @Nullable Object... data) { - PacketByteBuf passedData = new PacketByteBuf(Unpooled.buffer()); - passedData.writeInt((Integer) data[0]); - sendPacket(player, passedData); - } } diff --git a/src/client/java/com/convallyria/taleofkingdoms/client/packet/outgoing/OutgoingBuyItemPacketHandler.java b/src/client/java/com/convallyria/taleofkingdoms/client/packet/outgoing/OutgoingBuyItemPacketHandler.java index b28e4553..18a64395 100644 --- a/src/client/java/com/convallyria/taleofkingdoms/client/packet/outgoing/OutgoingBuyItemPacketHandler.java +++ b/src/client/java/com/convallyria/taleofkingdoms/client/packet/outgoing/OutgoingBuyItemPacketHandler.java @@ -1,31 +1,12 @@ package com.convallyria.taleofkingdoms.client.packet.outgoing; -import com.convallyria.taleofkingdoms.client.packet.ClientPacketHandler; import com.convallyria.taleofkingdoms.common.packet.Packets; -import com.convallyria.taleofkingdoms.common.packet.context.PacketContext; -import io.netty.buffer.Unpooled; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.network.PacketByteBuf; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import com.convallyria.taleofkingdoms.common.packet.c2s.BuyItemPacket; -public final class OutgoingBuyItemPacketHandler extends ClientPacketHandler { +public final class OutgoingBuyItemPacketHandler extends OutClientPacketHandler { public OutgoingBuyItemPacketHandler() { - super(Packets.BUY_ITEM); + super(Packets.BUY_ITEM, BuyItemPacket.CODEC); } - @Override - public void handleIncomingPacket(PacketContext context, PacketByteBuf attachedData) { - throw new IllegalArgumentException("Not supported"); - } - - @Override - public void handleOutgoingPacket(@NotNull PlayerEntity player, @Nullable Object... data) { - PacketByteBuf passedData = new PacketByteBuf(Unpooled.buffer()); - passedData.writeString((String) data[0]); - passedData.writeInt((Integer) data[1]); - passedData.writeEnumConstant((Enum) data[2]); - sendPacket(player, passedData); - } } diff --git a/src/client/java/com/convallyria/taleofkingdoms/client/packet/outgoing/OutgoingCityBuilderActionPacketHandler.java b/src/client/java/com/convallyria/taleofkingdoms/client/packet/outgoing/OutgoingCityBuilderActionPacketHandler.java index 86fe7192..7b1249bc 100644 --- a/src/client/java/com/convallyria/taleofkingdoms/client/packet/outgoing/OutgoingCityBuilderActionPacketHandler.java +++ b/src/client/java/com/convallyria/taleofkingdoms/client/packet/outgoing/OutgoingCityBuilderActionPacketHandler.java @@ -1,36 +1,11 @@ package com.convallyria.taleofkingdoms.client.packet.outgoing; -import com.convallyria.taleofkingdoms.client.packet.ClientPacketHandler; -import com.convallyria.taleofkingdoms.common.kingdom.builds.BuildCosts; import com.convallyria.taleofkingdoms.common.packet.Packets; -import com.convallyria.taleofkingdoms.common.packet.action.CityBuilderAction; -import com.convallyria.taleofkingdoms.common.packet.context.PacketContext; -import io.netty.buffer.Unpooled; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.network.PacketByteBuf; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import com.convallyria.taleofkingdoms.common.packet.c2s.CityBuilderActionPacket; -public final class OutgoingCityBuilderActionPacketHandler extends ClientPacketHandler { +public final class OutgoingCityBuilderActionPacketHandler extends OutClientPacketHandler { public OutgoingCityBuilderActionPacketHandler() { - super(Packets.CITYBUILDER_ACTION); - } - - @Override - public void handleIncomingPacket(PacketContext context, PacketByteBuf attachedData) { - throw new IllegalArgumentException("Not supported"); - } - - @Override - public void handleOutgoingPacket(@NotNull PlayerEntity player, @Nullable Object... data) { - PacketByteBuf passedData = new PacketByteBuf(Unpooled.buffer()); - passedData.writeInt((Integer) data[0]); - final CityBuilderAction action = (CityBuilderAction) data[1]; - passedData.writeEnumConstant(action); - if (action == CityBuilderAction.BUILD) { - passedData.writeEnumConstant((BuildCosts) data[2]); - } - sendPacket(player, passedData); + super(Packets.CITYBUILDER_ACTION, CityBuilderActionPacket.CODEC); } } diff --git a/src/client/java/com/convallyria/taleofkingdoms/client/packet/outgoing/OutgoingFixGuildPacketHandler.java b/src/client/java/com/convallyria/taleofkingdoms/client/packet/outgoing/OutgoingFixGuildPacketHandler.java index 993424e1..a25f58de 100644 --- a/src/client/java/com/convallyria/taleofkingdoms/client/packet/outgoing/OutgoingFixGuildPacketHandler.java +++ b/src/client/java/com/convallyria/taleofkingdoms/client/packet/outgoing/OutgoingFixGuildPacketHandler.java @@ -1,28 +1,11 @@ package com.convallyria.taleofkingdoms.client.packet.outgoing; -import com.convallyria.taleofkingdoms.client.packet.ClientPacketHandler; import com.convallyria.taleofkingdoms.common.packet.Packets; -import com.convallyria.taleofkingdoms.common.packet.context.PacketContext; -import io.netty.buffer.Unpooled; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.network.PacketByteBuf; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import com.convallyria.taleofkingdoms.common.packet.c2s.FixGuildPacket; -public final class OutgoingFixGuildPacketHandler extends ClientPacketHandler { +public final class OutgoingFixGuildPacketHandler extends OutClientPacketHandler { public OutgoingFixGuildPacketHandler() { - super(Packets.FIX_GUILD); - } - - @Override - public void handleIncomingPacket(PacketContext context, PacketByteBuf attachedData) { - throw new IllegalArgumentException("Not supported"); - } - - @Override - public void handleOutgoingPacket(@NotNull PlayerEntity player, @Nullable Object... data) { - PacketByteBuf passedData = new PacketByteBuf(Unpooled.buffer()); - sendPacket(player, passedData); + super(Packets.FIX_GUILD, FixGuildPacket.CODEC); } } diff --git a/src/client/java/com/convallyria/taleofkingdoms/client/packet/outgoing/OutgoingForemanBuyWorkerPacketHandler.java b/src/client/java/com/convallyria/taleofkingdoms/client/packet/outgoing/OutgoingForemanBuyWorkerPacketHandler.java index a7504932..8f510656 100644 --- a/src/client/java/com/convallyria/taleofkingdoms/client/packet/outgoing/OutgoingForemanBuyWorkerPacketHandler.java +++ b/src/client/java/com/convallyria/taleofkingdoms/client/packet/outgoing/OutgoingForemanBuyWorkerPacketHandler.java @@ -1,29 +1,12 @@ package com.convallyria.taleofkingdoms.client.packet.outgoing; -import com.convallyria.taleofkingdoms.client.packet.ClientPacketHandler; import com.convallyria.taleofkingdoms.common.packet.Packets; -import com.convallyria.taleofkingdoms.common.packet.context.PacketContext; -import io.netty.buffer.Unpooled; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.network.PacketByteBuf; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import com.convallyria.taleofkingdoms.common.packet.c2s.ForemanBuyWorkerPacket; -public final class OutgoingForemanBuyWorkerPacketHandler extends ClientPacketHandler { +public final class OutgoingForemanBuyWorkerPacketHandler extends OutClientPacketHandler { public OutgoingForemanBuyWorkerPacketHandler() { - super(Packets.FOREMAN_BUY_WORKER); + super(Packets.FOREMAN_BUY_WORKER, ForemanBuyWorkerPacket.CODEC); } - @Override - public void handleIncomingPacket(PacketContext context, PacketByteBuf attachedData) { - throw new IllegalArgumentException("Not supported"); - } - - @Override - public void handleOutgoingPacket(@NotNull PlayerEntity player, @Nullable Object... data) { - PacketByteBuf passedData = new PacketByteBuf(Unpooled.buffer()); - passedData.writeInt((Integer) data[0]); - sendPacket(player, passedData); - } } diff --git a/src/client/java/com/convallyria/taleofkingdoms/client/packet/outgoing/OutgoingForemanCollectPacketHandler.java b/src/client/java/com/convallyria/taleofkingdoms/client/packet/outgoing/OutgoingForemanCollectPacketHandler.java index 390fb050..da1c3f59 100644 --- a/src/client/java/com/convallyria/taleofkingdoms/client/packet/outgoing/OutgoingForemanCollectPacketHandler.java +++ b/src/client/java/com/convallyria/taleofkingdoms/client/packet/outgoing/OutgoingForemanCollectPacketHandler.java @@ -1,29 +1,12 @@ package com.convallyria.taleofkingdoms.client.packet.outgoing; -import com.convallyria.taleofkingdoms.client.packet.ClientPacketHandler; import com.convallyria.taleofkingdoms.common.packet.Packets; -import com.convallyria.taleofkingdoms.common.packet.context.PacketContext; -import io.netty.buffer.Unpooled; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.network.PacketByteBuf; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import com.convallyria.taleofkingdoms.common.packet.c2s.ForemanCollectPacket; -public final class OutgoingForemanCollectPacketHandler extends ClientPacketHandler { +public final class OutgoingForemanCollectPacketHandler extends OutClientPacketHandler { public OutgoingForemanCollectPacketHandler() { - super(Packets.FOREMAN_COLLECT); + super(Packets.FOREMAN_COLLECT, ForemanCollectPacket.CODEC); } - @Override - public void handleIncomingPacket(PacketContext context, PacketByteBuf attachedData) { - throw new IllegalArgumentException("Not supported"); - } - - @Override - public void handleOutgoingPacket(@NotNull PlayerEntity player, @Nullable Object... data) { - PacketByteBuf passedData = new PacketByteBuf(Unpooled.buffer()); - passedData.writeInt((Integer) data[0]); - sendPacket(player, passedData); - } } diff --git a/src/client/java/com/convallyria/taleofkingdoms/client/packet/outgoing/OutgoingHunterPacketHandler.java b/src/client/java/com/convallyria/taleofkingdoms/client/packet/outgoing/OutgoingHunterPacketHandler.java index 6059e95d..2dd6aa16 100644 --- a/src/client/java/com/convallyria/taleofkingdoms/client/packet/outgoing/OutgoingHunterPacketHandler.java +++ b/src/client/java/com/convallyria/taleofkingdoms/client/packet/outgoing/OutgoingHunterPacketHandler.java @@ -1,29 +1,12 @@ package com.convallyria.taleofkingdoms.client.packet.outgoing; -import com.convallyria.taleofkingdoms.client.packet.ClientPacketHandler; import com.convallyria.taleofkingdoms.common.packet.Packets; -import com.convallyria.taleofkingdoms.common.packet.context.PacketContext; -import io.netty.buffer.Unpooled; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.network.PacketByteBuf; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import com.convallyria.taleofkingdoms.common.packet.c2s.HireHunterPacket; -public final class OutgoingHunterPacketHandler extends ClientPacketHandler { +public final class OutgoingHunterPacketHandler extends OutClientPacketHandler { public OutgoingHunterPacketHandler() { - super(Packets.HIRE_HUNTER); + super(Packets.HIRE_HUNTER, HireHunterPacket.CODEC); } - @Override - public void handleIncomingPacket(PacketContext context, PacketByteBuf attachedData) { - throw new IllegalArgumentException("Not supported"); - } - - @Override - public void handleOutgoingPacket(@NotNull PlayerEntity player, @Nullable Object... data) { - PacketByteBuf passedData = new PacketByteBuf(Unpooled.buffer()); - passedData.writeBoolean((Boolean) data[0]); // False if hiring, true if retiring - sendPacket(player, passedData); - } } diff --git a/src/client/java/com/convallyria/taleofkingdoms/client/packet/outgoing/OutgoingInnkeeperPacketHandler.java b/src/client/java/com/convallyria/taleofkingdoms/client/packet/outgoing/OutgoingInnkeeperPacketHandler.java index b8140b49..006a7e4d 100644 --- a/src/client/java/com/convallyria/taleofkingdoms/client/packet/outgoing/OutgoingInnkeeperPacketHandler.java +++ b/src/client/java/com/convallyria/taleofkingdoms/client/packet/outgoing/OutgoingInnkeeperPacketHandler.java @@ -1,29 +1,12 @@ package com.convallyria.taleofkingdoms.client.packet.outgoing; -import com.convallyria.taleofkingdoms.client.packet.ClientPacketHandler; import com.convallyria.taleofkingdoms.common.packet.Packets; -import com.convallyria.taleofkingdoms.common.packet.context.PacketContext; -import io.netty.buffer.Unpooled; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.network.PacketByteBuf; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import com.convallyria.taleofkingdoms.common.packet.c2s.InnkeeperActionPacket; -public final class OutgoingInnkeeperPacketHandler extends ClientPacketHandler { +public final class OutgoingInnkeeperPacketHandler extends OutClientPacketHandler { public OutgoingInnkeeperPacketHandler() { - super(Packets.INNKEEPER_HIRE_ROOM); + super(Packets.INNKEEPER_HIRE_ROOM, InnkeeperActionPacket.CODEC); } - @Override - public void handleIncomingPacket(PacketContext context, PacketByteBuf attachedData) { - throw new IllegalArgumentException("Not supported"); - } - - @Override - public void handleOutgoingPacket(@NotNull PlayerEntity player, @Nullable Object... data) { - PacketByteBuf passedData = new PacketByteBuf(Unpooled.buffer()); - passedData.writeBoolean((Boolean) data[0]); // True if resting, false if waiting to night - sendPacket(player, passedData); - } } diff --git a/src/client/java/com/convallyria/taleofkingdoms/client/packet/outgoing/OutgoingToggleSellGuiPacketHandler.java b/src/client/java/com/convallyria/taleofkingdoms/client/packet/outgoing/OutgoingToggleSellGuiPacketHandler.java index 53e48c8b..17b14962 100644 --- a/src/client/java/com/convallyria/taleofkingdoms/client/packet/outgoing/OutgoingToggleSellGuiPacketHandler.java +++ b/src/client/java/com/convallyria/taleofkingdoms/client/packet/outgoing/OutgoingToggleSellGuiPacketHandler.java @@ -1,31 +1,12 @@ package com.convallyria.taleofkingdoms.client.packet.outgoing; -import com.convallyria.taleofkingdoms.client.packet.ClientPacketHandler; import com.convallyria.taleofkingdoms.common.packet.Packets; -import com.convallyria.taleofkingdoms.common.packet.context.PacketContext; -import com.convallyria.taleofkingdoms.common.shop.ShopParser; -import io.netty.buffer.Unpooled; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.network.PacketByteBuf; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import com.convallyria.taleofkingdoms.common.packet.c2s.ToggleSellGuiPacket; -public final class OutgoingToggleSellGuiPacketHandler extends ClientPacketHandler { +public final class OutgoingToggleSellGuiPacketHandler extends OutClientPacketHandler { public OutgoingToggleSellGuiPacketHandler() { - super(Packets.TOGGLE_SELL_GUI); + super(Packets.TOGGLE_SELL_GUI, ToggleSellGuiPacket.CODEC); } - @Override - public void handleIncomingPacket(PacketContext context, PacketByteBuf attachedData) { - throw new IllegalArgumentException("Not supported"); - } - - @Override - public void handleOutgoingPacket(@NotNull PlayerEntity player, @Nullable Object... data) { - PacketByteBuf passedData = new PacketByteBuf(Unpooled.buffer()); - passedData.writeBoolean((Boolean) data[0]); - passedData.writeEnumConstant((ShopParser.GUI) data[1]); - sendPacket(player, passedData); - } } diff --git a/src/client/java/com/convallyria/taleofkingdoms/client/utils/ShopBuyUtil.java b/src/client/java/com/convallyria/taleofkingdoms/client/utils/ShopBuyUtil.java index a7912b12..87b6953d 100644 --- a/src/client/java/com/convallyria/taleofkingdoms/client/utils/ShopBuyUtil.java +++ b/src/client/java/com/convallyria/taleofkingdoms/client/utils/ShopBuyUtil.java @@ -4,6 +4,7 @@ import com.convallyria.taleofkingdoms.client.TaleOfKingdomsClientAPI; import com.convallyria.taleofkingdoms.common.entity.ShopEntity; import com.convallyria.taleofkingdoms.common.packet.Packets; +import com.convallyria.taleofkingdoms.common.packet.c2s.BuyItemPacket; import com.convallyria.taleofkingdoms.common.shop.ShopItem; import com.convallyria.taleofkingdoms.common.world.ConquestInstance; import com.convallyria.taleofkingdoms.common.world.guild.GuildPlayer; @@ -26,8 +27,8 @@ public static void buyItem(ConquestInstance instance, PlayerEntity player, ShopI api.executeOnMain(() -> { MinecraftServer server = MinecraftClient.getInstance().getServer(); if (server == null) { - api.getClientPacketHandler(Packets.BUY_ITEM) - .handleOutgoingPacket(player, Registries.ITEM.getId(shopItem.getItem().asItem()).toString(), count, entity.getGUIType()); + api.getClientPacket(Packets.BUY_ITEM) + .sendPacket(player, new BuyItemPacket(Registries.ITEM.getId(shopItem.getItem().asItem()).toString(), count, entity.getGUIType())); return; } diff --git a/src/main/java/com/convallyria/taleofkingdoms/TaleOfKingdoms.java b/src/main/java/com/convallyria/taleofkingdoms/TaleOfKingdoms.java index f3c74a7b..7a26ec74 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/TaleOfKingdoms.java +++ b/src/main/java/com/convallyria/taleofkingdoms/TaleOfKingdoms.java @@ -71,6 +71,7 @@ import net.minecraft.command.argument.TextArgumentType; import net.minecraft.registry.Registries; import net.minecraft.registry.Registry; +import net.minecraft.registry.RegistryWrapper; import net.minecraft.resource.featuretoggle.FeatureFlags; import net.minecraft.screen.ScreenHandlerType; import net.minecraft.structure.processor.StructureProcessorType; @@ -109,13 +110,13 @@ public class TaleOfKingdoms implements ModInitializer { public static final BlockEntityType SELL_BLOCK_ENTITY; // a public identifier for multiple parts of our bigger chest - public static final Identifier SELL_BLOCK_IDENTIFIER = new Identifier(MODID, "sell_block"); + public static final Identifier SELL_BLOCK_IDENTIFIER = Identifier.of(MODID, "sell_block"); static { //We use registerSimple here because our Entity is not an ExtendedScreenHandlerFactory //but a NamedScreenHandlerFactory. //In a later Tutorial you will see what ExtendedScreenHandlerFactory can do! - SELL_SCREEN_HANDLER = Registry.register(Registries.SCREEN_HANDLER, new Identifier(TaleOfKingdoms.MODID, "sell_screen_handler"), new ScreenHandlerType<>(SellScreenHandler::new, FeatureFlags.VANILLA_FEATURES)); + SELL_SCREEN_HANDLER = Registry.register(Registries.SCREEN_HANDLER, Identifier.of(TaleOfKingdoms.MODID, "sell_screen_handler"), new ScreenHandlerType<>(SellScreenHandler::new, FeatureFlags.VANILLA_FEATURES)); SELL_BLOCK = Registry.register(Registries.BLOCK, SELL_BLOCK_IDENTIFIER, new SellBlock(FabricBlockSettings.copyOf(Blocks.CHEST))); @@ -250,14 +251,14 @@ private void registerCommands() { } public void registerFeatures() { - Registry.register(Registries.STRUCTURE_PIECE, new Identifier(MODID, "bandit_camp_piece"), TOKStructures.BANDIT_CAMP); - Registry.register(Registries.STRUCTURE_PIECE, new Identifier(MODID, "gateway_piece"), TOKStructures.GATEWAY); - Registry.register(Registries.STRUCTURE_PIECE, new Identifier(MODID, "reficule_village_piece"), TOKStructures.REFICULE_VILLAGE); + Registry.register(Registries.STRUCTURE_PIECE, Identifier.of(MODID, "bandit_camp_piece"), TOKStructures.BANDIT_CAMP); + Registry.register(Registries.STRUCTURE_PIECE, Identifier.of(MODID, "gateway_piece"), TOKStructures.GATEWAY); + Registry.register(Registries.STRUCTURE_PIECE, Identifier.of(MODID, "reficule_village_piece"), TOKStructures.REFICULE_VILLAGE); } - public static Text parse(StringReader stringReader) throws CommandSyntaxException { + public static Text parse(StringReader stringReader, RegistryWrapper.WrapperLookup registries) throws CommandSyntaxException { try { - Text text = Text.Serialization.fromJson(stringReader.getString()); + Text text = Text.Serialization.fromJson(stringReader.getString(), registries); if (text == null) { throw TextArgumentType.INVALID_COMPONENT_EXCEPTION.createWithContext(stringReader, "empty"); } else { diff --git a/src/main/java/com/convallyria/taleofkingdoms/TaleOfKingdomsAPI.java b/src/main/java/com/convallyria/taleofkingdoms/TaleOfKingdomsAPI.java index 94f03af0..7f13114b 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/TaleOfKingdomsAPI.java +++ b/src/main/java/com/convallyria/taleofkingdoms/TaleOfKingdomsAPI.java @@ -9,8 +9,8 @@ import com.convallyria.taleofkingdoms.managers.SoundManager; import net.fabricmc.api.EnvType; import net.fabricmc.loader.api.FabricLoader; +import net.minecraft.network.packet.CustomPayload; import net.minecraft.server.MinecraftServer; -import net.minecraft.util.Identifier; import org.jetbrains.annotations.NotNull; import java.util.Collection; @@ -23,6 +23,7 @@ public abstract class TaleOfKingdomsAPI { private final TaleOfKingdoms mod; private final ConquestInstanceStorage cis; private final Map, IManager> managers = new HashMap<>(); + private final Map, PacketHandler>> packetHandlers = new HashMap<>(); private final Scheduler scheduler; @@ -84,7 +85,31 @@ public Collection getManagers() { */ public abstract void executeOnMain(Runnable runnable); - public abstract PacketHandler getPacketHandler(Identifier packet); + public void registerPacketHandler(EnvType envType, PacketHandler packet) { + final Map, PacketHandler> handlers = packetHandlers.getOrDefault(envType, new HashMap<>()); + handlers.put(packet.getPacket(), packet); + packetHandlers.put(envType, handlers); + } + + // Packet explanation + // getServerPacket gets a packet sent/received by dedicated or integrated server + // getClientPacket gets a packet sent/received by the client + + public PacketHandler getServerPacket(CustomPayload.Id packet) { + return getPacketHandler(EnvType.SERVER, packet); + } + + public PacketHandler getClientPacket(CustomPayload.Id packet) { + return getPacketHandler(EnvType.CLIENT, packet); + } + + private PacketHandler getPacketHandler(EnvType envType, CustomPayload.Id packet) { + final PacketHandler packetHandler = packetHandlers.get(envType).get(packet); + if (packetHandler == null) { + throw new IllegalArgumentException("Failed to find packet '" + packet.id().toString() + "' on environment " + envType + "!"); + } + return (PacketHandler) packetHandler; + } @NotNull public SchematicHandler getSchematicHandler() { diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/block/SellBlock.java b/src/main/java/com/convallyria/taleofkingdoms/common/block/SellBlock.java index c9ebef86..1bb90aac 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/block/SellBlock.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/block/SellBlock.java @@ -2,7 +2,7 @@ import com.convallyria.taleofkingdoms.common.block.entity.SellBlockEntity; import com.mojang.serialization.MapCodec; -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.block.AbstractBlock; import net.minecraft.block.BlockRenderType; import net.minecraft.block.BlockState; import net.minecraft.block.BlockWithEntity; @@ -12,7 +12,6 @@ import net.minecraft.screen.NamedScreenHandlerFactory; import net.minecraft.screen.ScreenHandler; import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; import net.minecraft.util.ItemScatterer; import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.math.BlockPos; @@ -20,7 +19,7 @@ public class SellBlock extends BlockWithEntity { - public static final MapCodec CODEC = MapCodec.unit(() -> new SellBlock(FabricBlockSettings.copyOf(Blocks.CHEST))); + public static final MapCodec CODEC = MapCodec.unit(() -> new SellBlock(AbstractBlock.Settings.copy(Blocks.CHEST))); public SellBlock(Settings settings) { super(settings); @@ -41,8 +40,9 @@ public BlockRenderType getRenderType(BlockState state) { return BlockRenderType.INVISIBLE; } + @Override - public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { + protected ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, BlockHitResult hit) { if (!world.isClient) { //This will call the createScreenHandlerFactory method from BlockWithEntity, which will return our blockEntity casted to //a namedScreenHandlerFactory. If your block class does not extend BlockWithEntity, it needs to implement createScreenHandlerFactory. @@ -56,7 +56,6 @@ public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEnt return ActionResult.SUCCESS; } - //This method will drop all items onto the ground when the block is broken @Override public void onStateReplaced(BlockState state, World world, BlockPos pos, BlockState newState, boolean moved) { diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/block/entity/SellBlockEntity.java b/src/main/java/com/convallyria/taleofkingdoms/common/block/entity/SellBlockEntity.java index e8c07c12..1f75ed81 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/block/entity/SellBlockEntity.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/block/entity/SellBlockEntity.java @@ -10,6 +10,7 @@ import net.minecraft.inventory.Inventories; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NbtCompound; +import net.minecraft.registry.RegistryWrapper; import net.minecraft.screen.NamedScreenHandlerFactory; import net.minecraft.screen.ScreenHandler; import net.minecraft.text.Text; @@ -49,15 +50,15 @@ public Text getDisplayName() { } @Override - public void readNbt(NbtCompound nbt) { - super.readNbt(nbt); - Inventories.readNbt(nbt, this.inventory); + public void readNbt(NbtCompound nbt, RegistryWrapper.WrapperLookup registryLookup) { + super.readNbt(nbt, registryLookup); + Inventories.readNbt(nbt, this.inventory, registryLookup); } @Override - public void writeNbt(NbtCompound nbt) { - super.writeNbt(nbt); - Inventories.writeNbt(nbt, this.inventory); + public void writeNbt(NbtCompound nbt, RegistryWrapper.WrapperLookup registryLookup) { + super.writeNbt(nbt, registryLookup); + Inventories.writeNbt(nbt, this.inventory, registryLookup); } } diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/datafixer/Schemas.java b/src/main/java/com/convallyria/taleofkingdoms/common/datafixer/Schemas.java index 7eafc3f3..d3a21f67 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/datafixer/Schemas.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/datafixer/Schemas.java @@ -18,9 +18,7 @@ private static DataFixer create() { build(dataFixerBuilder); TaleOfKingdoms.LOGGER.info("Building datafixer"); - - // Let's copy LazyDFU and use DataFixerBuilder#buildUnoptimized. - return dataFixerBuilder.buildUnoptimized(); + return dataFixerBuilder.build().fixer(); } private static void build(DataFixerBuilder builder) { diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/entity/EntityTypes.java b/src/main/java/com/convallyria/taleofkingdoms/common/entity/EntityTypes.java index 7f1bfd7b..dc09a123 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/entity/EntityTypes.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/entity/EntityTypes.java @@ -22,6 +22,7 @@ import com.convallyria.taleofkingdoms.common.entity.kingdom.HumanFarmerEntity; import com.convallyria.taleofkingdoms.common.entity.kingdom.ItemShopEntity; import com.convallyria.taleofkingdoms.common.entity.kingdom.KingdomVillagerEntity; +import com.convallyria.taleofkingdoms.common.entity.kingdom.StockMarketEntity; import com.convallyria.taleofkingdoms.common.entity.kingdom.warden.ArcherHireableEntity; import com.convallyria.taleofkingdoms.common.entity.kingdom.warden.WardenEntity; import com.convallyria.taleofkingdoms.common.entity.kingdom.warden.WarriorHireableEntity; @@ -29,12 +30,9 @@ import com.convallyria.taleofkingdoms.common.entity.kingdom.workers.LumberWorkerEntity; import com.convallyria.taleofkingdoms.common.entity.kingdom.workers.QuarryForemanEntity; import com.convallyria.taleofkingdoms.common.entity.kingdom.workers.QuarryWorkerEntity; -import com.convallyria.taleofkingdoms.common.entity.kingdom.StockMarketEntity; import com.convallyria.taleofkingdoms.common.entity.reficule.ReficuleGuardianEntity; import com.convallyria.taleofkingdoms.common.entity.reficule.ReficuleMageEntity; import com.convallyria.taleofkingdoms.common.entity.reficule.ReficuleSoldierEntity; -import net.fabricmc.fabric.api.object.builder.v1.entity.FabricEntityTypeBuilder; -import net.minecraft.entity.EntityDimensions; import net.minecraft.entity.EntityType; import net.minecraft.entity.SpawnGroup; import net.minecraft.registry.Registries; @@ -45,109 +43,110 @@ public class EntityTypes { - private static final EntityDimensions HUMAN_ENTITY_DIMENSIONS = EntityDimensions.fixed(0.6f, 1.8f); + private static final float HUMAN_WIDTH = 0.6f; + private static final float HUMAN_HEIGHT = 1.8f; public static final EntityType FARMER = Registry.register( Registries.ENTITY_TYPE, - new Identifier(TaleOfKingdoms.MODID, "farmer"), - FabricEntityTypeBuilder.create(SpawnGroup.MISC, FarmerEntity::new).dimensions(HUMAN_ENTITY_DIMENSIONS).build() + Identifier.of(TaleOfKingdoms.MODID, "farmer"), + EntityType.Builder.create(FarmerEntity::new, SpawnGroup.MISC).dimensions(HUMAN_WIDTH, HUMAN_HEIGHT).build() ); public static final EntityType GUILDMASTER = Registry.register( Registries.ENTITY_TYPE, - new Identifier(TaleOfKingdoms.MODID, "guild_master"), - FabricEntityTypeBuilder.create(SpawnGroup.MISC, GuildMasterEntity::new).dimensions(HUMAN_ENTITY_DIMENSIONS).build() + Identifier.of(TaleOfKingdoms.MODID, "guild_master"), + EntityType.Builder.create(GuildMasterEntity::new, SpawnGroup.MISC).dimensions(HUMAN_WIDTH, HUMAN_HEIGHT).build() ); public static final EntityType GUILDMASTER_DEFENDER = Registry.register( Registries.ENTITY_TYPE, - new Identifier(TaleOfKingdoms.MODID, "guild_master_defender"), - FabricEntityTypeBuilder.create(SpawnGroup.MISC, GuildMasterDefenderEntity::new).fireImmune().dimensions(HUMAN_ENTITY_DIMENSIONS).build() + Identifier.of(TaleOfKingdoms.MODID, "guild_master_defender"), + EntityType.Builder.create(GuildMasterDefenderEntity::new, SpawnGroup.MISC).makeFireImmune().dimensions(HUMAN_WIDTH, HUMAN_HEIGHT).build() ); public static final EntityType BLACKSMITH = Registry.register( Registries.ENTITY_TYPE, - new Identifier(TaleOfKingdoms.MODID, "blacksmith"), - FabricEntityTypeBuilder.create(SpawnGroup.MISC, BlacksmithEntity::new).dimensions(HUMAN_ENTITY_DIMENSIONS).build() + Identifier.of(TaleOfKingdoms.MODID, "blacksmith"), + EntityType.Builder.create(BlacksmithEntity::new, SpawnGroup.MISC).dimensions(HUMAN_WIDTH, HUMAN_HEIGHT).build() ); public static final EntityType CITYBUILDER = Registry.register( Registries.ENTITY_TYPE, - new Identifier(TaleOfKingdoms.MODID, "city_builder"), - FabricEntityTypeBuilder.create(SpawnGroup.MISC, CityBuilderEntity::new).dimensions(HUMAN_ENTITY_DIMENSIONS).build() + Identifier.of(TaleOfKingdoms.MODID, "city_builder"), + EntityType.Builder.create(CityBuilderEntity::new, SpawnGroup.MISC).dimensions(HUMAN_WIDTH, HUMAN_HEIGHT).build() ); public static final EntityType KNIGHT = Registry.register( Registries.ENTITY_TYPE, - new Identifier(TaleOfKingdoms.MODID, "knight"), - FabricEntityTypeBuilder.create(SpawnGroup.MISC, KnightEntity::new).dimensions(HUMAN_ENTITY_DIMENSIONS).build() + Identifier.of(TaleOfKingdoms.MODID, "knight"), + EntityType.Builder.create(KnightEntity::new, SpawnGroup.MISC).dimensions(HUMAN_WIDTH, HUMAN_HEIGHT).build() ); public static final EntityType INNKEEPER = Registry.register( Registries.ENTITY_TYPE, - new Identifier(TaleOfKingdoms.MODID, "innkeeper"), - FabricEntityTypeBuilder.create(SpawnGroup.MISC, InnkeeperEntity::new).dimensions(HUMAN_ENTITY_DIMENSIONS).build() + Identifier.of(TaleOfKingdoms.MODID, "innkeeper"), + EntityType.Builder.create(InnkeeperEntity::new, SpawnGroup.MISC).dimensions(HUMAN_WIDTH, HUMAN_HEIGHT).build() ); public static final EntityType HUNTER = Registry.register( Registries.ENTITY_TYPE, - new Identifier(TaleOfKingdoms.MODID, "hunter"), - FabricEntityTypeBuilder.create(SpawnGroup.MISC, HunterEntity::new).dimensions(HUMAN_ENTITY_DIMENSIONS).build() + Identifier.of(TaleOfKingdoms.MODID, "hunter"), + EntityType.Builder.create(HunterEntity::new, SpawnGroup.MISC).dimensions(HUMAN_WIDTH, HUMAN_HEIGHT).build() ); public static final EntityType GUILDGUARD = Registry.register( Registries.ENTITY_TYPE, - new Identifier(TaleOfKingdoms.MODID, "guild_guard"), - FabricEntityTypeBuilder.create(SpawnGroup.MISC, GuildGuardEntity::new).dimensions(HUMAN_ENTITY_DIMENSIONS).build() + Identifier.of(TaleOfKingdoms.MODID, "guild_guard"), + EntityType.Builder.create(GuildGuardEntity::new, SpawnGroup.MISC).dimensions(HUMAN_WIDTH, HUMAN_HEIGHT).build() ); public static final EntityType GUILDVILLAGER = Registry.register( Registries.ENTITY_TYPE, - new Identifier(TaleOfKingdoms.MODID, "guild_villager"), - FabricEntityTypeBuilder.create(SpawnGroup.MISC, GuildVillagerEntity::new).dimensions(HUMAN_ENTITY_DIMENSIONS).build() + Identifier.of(TaleOfKingdoms.MODID, "guild_villager"), + EntityType.Builder.create(GuildVillagerEntity::new, SpawnGroup.MISC).dimensions(HUMAN_WIDTH, HUMAN_HEIGHT).build() ); public static final EntityType GUILDARCHER = Registry.register( Registries.ENTITY_TYPE, - new Identifier(TaleOfKingdoms.MODID, "guild_archer"), - FabricEntityTypeBuilder.create(SpawnGroup.MISC, GuildArcherEntity::new).dimensions(HUMAN_ENTITY_DIMENSIONS).build() + Identifier.of(TaleOfKingdoms.MODID, "guild_archer"), + EntityType.Builder.create(GuildArcherEntity::new, SpawnGroup.MISC).dimensions(HUMAN_WIDTH, HUMAN_HEIGHT).build() ); public static final EntityType LONE = Registry.register( Registries.ENTITY_TYPE, - new Identifier(TaleOfKingdoms.MODID, "lone"), - FabricEntityTypeBuilder.create(SpawnGroup.MISC, LoneEntity::new).dimensions(HUMAN_ENTITY_DIMENSIONS).build() + Identifier.of(TaleOfKingdoms.MODID, "lone"), + EntityType.Builder.create(LoneEntity::new, SpawnGroup.MISC).dimensions(HUMAN_WIDTH, HUMAN_HEIGHT).build() ); public static final EntityType BANKER = Registry.register( Registries.ENTITY_TYPE, - new Identifier(TaleOfKingdoms.MODID, "banker"), - FabricEntityTypeBuilder.create(SpawnGroup.MISC, BankerEntity::new).dimensions(HUMAN_ENTITY_DIMENSIONS).build() + Identifier.of(TaleOfKingdoms.MODID, "banker"), + EntityType.Builder.create(BankerEntity::new, SpawnGroup.MISC).dimensions(HUMAN_WIDTH, HUMAN_HEIGHT).build() ); public static final EntityType FOODSHOP = Registry.register( Registries.ENTITY_TYPE, - new Identifier(TaleOfKingdoms.MODID, "foodshop"), - FabricEntityTypeBuilder.create(SpawnGroup.MISC, FoodShopEntity::new).dimensions(HUMAN_ENTITY_DIMENSIONS).build() + Identifier.of(TaleOfKingdoms.MODID, "foodshop"), + EntityType.Builder.create(FoodShopEntity::new, SpawnGroup.MISC).dimensions(HUMAN_WIDTH, HUMAN_HEIGHT).build() ); public static final EntityType GUILDCAPTAIN = Registry.register( Registries.ENTITY_TYPE, - new Identifier(TaleOfKingdoms.MODID, "guild_captain"), - FabricEntityTypeBuilder.create(SpawnGroup.MISC, GuildCaptainEntity::new).dimensions(HUMAN_ENTITY_DIMENSIONS).build() + Identifier.of(TaleOfKingdoms.MODID, "guild_captain"), + EntityType.Builder.create(GuildCaptainEntity::new, SpawnGroup.MISC).dimensions(HUMAN_WIDTH, HUMAN_HEIGHT).build() ); public static final EntityType LONEVILLAGER = Registry.register( Registries.ENTITY_TYPE, - new Identifier(TaleOfKingdoms.MODID, "lone_villager"), - FabricEntityTypeBuilder.create(SpawnGroup.MISC, LoneVillagerEntity::new).dimensions(HUMAN_ENTITY_DIMENSIONS).build() + Identifier.of(TaleOfKingdoms.MODID, "lone_villager"), + EntityType.Builder.create(LoneVillagerEntity::new, SpawnGroup.MISC).dimensions(HUMAN_WIDTH, HUMAN_HEIGHT).build() ); public static final EntityType REFICULE_SOLDIER = Registry.register( Registries.ENTITY_TYPE, - new Identifier(TaleOfKingdoms.MODID, "reficule_soldier"), - FabricEntityTypeBuilder.create(SpawnGroup.MISC, ReficuleSoldierEntity::new).dimensions(HUMAN_ENTITY_DIMENSIONS).build() + Identifier.of(TaleOfKingdoms.MODID, "reficule_soldier"), + EntityType.Builder.create(ReficuleSoldierEntity::new, SpawnGroup.MISC).dimensions(HUMAN_WIDTH, HUMAN_HEIGHT).build() ); public static final EntityType REFICULE_GUARDIAN = Registry.register( Registries.ENTITY_TYPE, - new Identifier(TaleOfKingdoms.MODID, "reficule_guardian"), - FabricEntityTypeBuilder.create(SpawnGroup.MISC, ReficuleGuardianEntity::new).dimensions(HUMAN_ENTITY_DIMENSIONS).build() + Identifier.of(TaleOfKingdoms.MODID, "reficule_guardian"), + EntityType.Builder.create(ReficuleGuardianEntity::new, SpawnGroup.MISC).dimensions(HUMAN_WIDTH, HUMAN_HEIGHT).build() ); public static final EntityType REFICULE_MAGE = Registry.register( Registries.ENTITY_TYPE, - new Identifier(TaleOfKingdoms.MODID, "reficule_mage"), - FabricEntityTypeBuilder.create(SpawnGroup.MISC, ReficuleMageEntity::new).dimensions(HUMAN_ENTITY_DIMENSIONS).build() + Identifier.of(TaleOfKingdoms.MODID, "reficule_mage"), + EntityType.Builder.create(ReficuleMageEntity::new, SpawnGroup.MISC).dimensions(HUMAN_WIDTH, HUMAN_HEIGHT).build() ); public static final EntityType BANDIT = Registry.register( Registries.ENTITY_TYPE, - new Identifier(TaleOfKingdoms.MODID, "bandit"), - FabricEntityTypeBuilder.create(SpawnGroup.MISC, BanditEntity::new).dimensions(HUMAN_ENTITY_DIMENSIONS).build() + Identifier.of(TaleOfKingdoms.MODID, "bandit"), + EntityType.Builder.create(BanditEntity::new, SpawnGroup.MISC).dimensions(HUMAN_WIDTH, HUMAN_HEIGHT).build() ); // ========================= @@ -155,74 +154,74 @@ public class EntityTypes { // ========================= public static final EntityType ITEM_SHOP = Registry.register( Registries.ENTITY_TYPE, - new Identifier(TaleOfKingdoms.MODID, "item_shop"), - FabricEntityTypeBuilder.create(SpawnGroup.MISC, ItemShopEntity::new).dimensions(HUMAN_ENTITY_DIMENSIONS).build() + Identifier.of(TaleOfKingdoms.MODID, "item_shop"), + EntityType.Builder.create(ItemShopEntity::new, SpawnGroup.MISC).dimensions(HUMAN_WIDTH, HUMAN_HEIGHT).build() ); public static final EntityType KINGDOM_VILLAGER = Registry.register( Registries.ENTITY_TYPE, - new Identifier(TaleOfKingdoms.MODID, "kingdom_villager"), - FabricEntityTypeBuilder.create(SpawnGroup.MISC, KingdomVillagerEntity::new).dimensions(HUMAN_ENTITY_DIMENSIONS).build() + Identifier.of(TaleOfKingdoms.MODID, "kingdom_villager"), + EntityType.Builder.create(KingdomVillagerEntity::new, SpawnGroup.MISC).dimensions(HUMAN_WIDTH, HUMAN_HEIGHT).build() ); public static final EntityType STOCK_MARKET = Registry.register( Registries.ENTITY_TYPE, - new Identifier(TaleOfKingdoms.MODID, "stock_market"), - FabricEntityTypeBuilder.create(SpawnGroup.MISC, StockMarketEntity::new).dimensions(HUMAN_ENTITY_DIMENSIONS).build() + Identifier.of(TaleOfKingdoms.MODID, "stock_market"), + EntityType.Builder.create(StockMarketEntity::new, SpawnGroup.MISC).dimensions(HUMAN_WIDTH, HUMAN_HEIGHT).build() ); public static final EntityType QUARRY_FOREMAN = Registry.register( Registries.ENTITY_TYPE, - new Identifier(TaleOfKingdoms.MODID, "quarry_foreman"), - FabricEntityTypeBuilder.create(SpawnGroup.MISC, QuarryForemanEntity::new).dimensions(HUMAN_ENTITY_DIMENSIONS).build() + Identifier.of(TaleOfKingdoms.MODID, "quarry_foreman"), + EntityType.Builder.create(QuarryForemanEntity::new, SpawnGroup.MISC).dimensions(HUMAN_WIDTH, HUMAN_HEIGHT).build() ); public static final EntityType LUMBER_FOREMAN = Registry.register( Registries.ENTITY_TYPE, - new Identifier(TaleOfKingdoms.MODID, "lumber_foreman"), - FabricEntityTypeBuilder.create(SpawnGroup.MISC, LumberForemanEntity::new).dimensions(HUMAN_ENTITY_DIMENSIONS).build() + Identifier.of(TaleOfKingdoms.MODID, "lumber_foreman"), + EntityType.Builder.create(LumberForemanEntity::new, SpawnGroup.MISC).dimensions(HUMAN_WIDTH, HUMAN_HEIGHT).build() ); public static final EntityType QUARRY_WORKER = Registry.register( Registries.ENTITY_TYPE, - new Identifier(TaleOfKingdoms.MODID, "quarry_worker"), - FabricEntityTypeBuilder.create(SpawnGroup.MISC, QuarryWorkerEntity::new).dimensions(HUMAN_ENTITY_DIMENSIONS).build() + Identifier.of(TaleOfKingdoms.MODID, "quarry_worker"), + EntityType.Builder.create(QuarryWorkerEntity::new, SpawnGroup.MISC).dimensions(HUMAN_WIDTH, HUMAN_HEIGHT).build() ); public static final EntityType LUMBER_WORKER = Registry.register( Registries.ENTITY_TYPE, - new Identifier(TaleOfKingdoms.MODID, "lumber_worker"), - FabricEntityTypeBuilder.create(SpawnGroup.MISC, LumberWorkerEntity::new).dimensions(HUMAN_ENTITY_DIMENSIONS).build() + Identifier.of(TaleOfKingdoms.MODID, "lumber_worker"), + EntityType.Builder.create(LumberWorkerEntity::new, SpawnGroup.MISC).dimensions(HUMAN_WIDTH, HUMAN_HEIGHT).build() ); public static final EntityType WARDEN = Registry.register( Registries.ENTITY_TYPE, - new Identifier(TaleOfKingdoms.MODID, "warden"), - FabricEntityTypeBuilder.create(SpawnGroup.MISC, WardenEntity::new).dimensions(HUMAN_ENTITY_DIMENSIONS).build() + Identifier.of(TaleOfKingdoms.MODID, "warden"), + EntityType.Builder.create(WardenEntity::new, SpawnGroup.MISC).dimensions(HUMAN_WIDTH, HUMAN_HEIGHT).build() ); public static final EntityType WARRIOR = Registry.register( Registries.ENTITY_TYPE, - new Identifier(TaleOfKingdoms.MODID, "warrior_mercenary"), - FabricEntityTypeBuilder.create(SpawnGroup.MISC, WarriorHireableEntity::new).dimensions(HUMAN_ENTITY_DIMENSIONS).build() + Identifier.of(TaleOfKingdoms.MODID, "warrior_mercenary"), + EntityType.Builder.create(WarriorHireableEntity::new, SpawnGroup.MISC).dimensions(HUMAN_WIDTH, HUMAN_HEIGHT).build() ); public static final EntityType ARCHER = Registry.register( Registries.ENTITY_TYPE, - new Identifier(TaleOfKingdoms.MODID, "archer_mercenary"), - FabricEntityTypeBuilder.create(SpawnGroup.MISC, ArcherHireableEntity::new).dimensions(HUMAN_ENTITY_DIMENSIONS).build() + Identifier.of(TaleOfKingdoms.MODID, "archer_mercenary"), + EntityType.Builder.create(ArcherHireableEntity::new, SpawnGroup.MISC).dimensions(HUMAN_WIDTH, HUMAN_HEIGHT).build() ); public static final EntityType BLOCK_SHOP = Registry.register( Registries.ENTITY_TYPE, - new Identifier(TaleOfKingdoms.MODID, "block_shop"), - FabricEntityTypeBuilder.create(SpawnGroup.MISC, BlockShopEntity::new).dimensions(HUMAN_ENTITY_DIMENSIONS).build() + Identifier.of(TaleOfKingdoms.MODID, "block_shop"), + EntityType.Builder.create(BlockShopEntity::new, SpawnGroup.MISC).dimensions(HUMAN_WIDTH, HUMAN_HEIGHT).build() ); public static final EntityType HUMAN_FARMER = Registry.register( Registries.ENTITY_TYPE, - new Identifier(TaleOfKingdoms.MODID, "human_farmer"), - FabricEntityTypeBuilder.create(SpawnGroup.MISC, HumanFarmerEntity::new).dimensions(HUMAN_ENTITY_DIMENSIONS).build() + Identifier.of(TaleOfKingdoms.MODID, "human_farmer"), + EntityType.Builder.create(HumanFarmerEntity::new, SpawnGroup.MISC).dimensions(HUMAN_WIDTH, HUMAN_HEIGHT).build() ); public static final List> SHOP_ENTITIES = List.of(EntityTypes.BLACKSMITH, EntityTypes.ITEM_SHOP, EntityTypes.FOODSHOP, EntityTypes.BLOCK_SHOP, EntityTypes.STOCK_MARKET); diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/entity/TOKEntity.java b/src/main/java/com/convallyria/taleofkingdoms/common/entity/TOKEntity.java index 11119361..ce8f0a93 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/entity/TOKEntity.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/entity/TOKEntity.java @@ -22,7 +22,7 @@ protected TOKEntity(@NotNull EntityType entityType, @ } protected static Identifier identifier(String path) { - return new Identifier(TaleOfKingdoms.MODID, path); + return Identifier.of(TaleOfKingdoms.MODID, path); } @Override diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/entity/ai/goal/CrossbowAttackGoal.java b/src/main/java/com/convallyria/taleofkingdoms/common/entity/ai/goal/CrossbowAttackGoal.java index c32715df..cb421148 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/entity/ai/goal/CrossbowAttackGoal.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/entity/ai/goal/CrossbowAttackGoal.java @@ -1,5 +1,7 @@ package com.convallyria.taleofkingdoms.common.entity.ai.goal; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.ChargedProjectilesComponent; import net.minecraft.entity.CrossbowUser; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.ai.RangedAttackMob; @@ -14,10 +16,11 @@ import java.util.EnumSet; +// 1:1 copy of Minecraft source, except T extends MobEntity public class CrossbowAttackGoal extends Goal { public static final UniformIntProvider COOLDOWN_RANGE = TimeHelper.betweenSeconds(1, 2); private final T actor; - private Stage stage; + private Stage stage = Stage.UNCHARGED; private final double speed; private final float squaredRange; private int seeingTargetTicker; @@ -25,13 +28,13 @@ public class CrossbowAttackGoal= CrossbowItem.getPullTime(itemStack)) { + if (i >= CrossbowItem.getPullTime(itemStack, this.actor)) { this.actor.stopUsingItem(); this.stage = Stage.CHARGED; this.chargedTicksLeft = 20 + this.actor.getRandom().nextInt(20); @@ -115,25 +126,19 @@ public void tick() { } } else if (this.stage == Stage.READY_TO_ATTACK && bl) { this.actor.shootAt(livingEntity, 1.0F); - ItemStack itemStack2 = this.actor.getStackInHand(ProjectileUtil.getHandPossiblyHolding(this.actor, Items.CROSSBOW)); - CrossbowItem.setCharged(itemStack2, false); this.stage = Stage.UNCHARGED; } - } } private boolean isUncharged() { - return this.stage == CrossbowAttackGoal.Stage.UNCHARGED; + return this.stage == Stage.UNCHARGED; } - enum Stage { + static enum Stage { UNCHARGED, CHARGING, CHARGED, READY_TO_ATTACK; - - Stage() { - } } } diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/entity/ai/goal/spell/FireballSpellGoal.java b/src/main/java/com/convallyria/taleofkingdoms/common/entity/ai/goal/spell/FireballSpellGoal.java index 0092794f..28280401 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/entity/ai/goal/spell/FireballSpellGoal.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/entity/ai/goal/spell/FireballSpellGoal.java @@ -50,7 +50,7 @@ protected void castSpell() { double x = spellCaster.getX(); double y = spellCaster.getEyeY(); double z = spellCaster.getZ(); - FireballEntity fireballEntity = new FireballEntity(spellCaster.getWorld(), spellCaster, x, y, z, 1); + FireballEntity fireballEntity = new FireballEntity(spellCaster.getWorld(), spellCaster, new Vec3d(x, y, z), 1); fireballEntity.updatePosition(spellCaster.getX() + vec3d.x * 4.0D, spellCaster.getBodyY(0.5D) + 0.5D, fireballEntity.getZ() + vec3d.z * 4.0D); double d = target.getX() - spellCaster.getX(); double e = target.getBodyY(0.3333333333333333D) - fireballEntity.getY(); diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/entity/generic/BanditEntity.java b/src/main/java/com/convallyria/taleofkingdoms/common/entity/generic/BanditEntity.java index 452ba572..9be53229 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/entity/generic/BanditEntity.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/entity/generic/BanditEntity.java @@ -24,13 +24,11 @@ import net.minecraft.entity.mob.Monster; import net.minecraft.entity.mob.PathAwareEntity; import net.minecraft.entity.projectile.PersistentProjectileEntity; -import net.minecraft.entity.projectile.ProjectileEntity; import net.minecraft.entity.projectile.ProjectileUtil; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.item.RangedWeaponItem; -import net.minecraft.nbt.NbtCompound; import net.minecraft.sound.SoundEvents; import net.minecraft.util.Hand; import net.minecraft.util.Identifier; @@ -113,10 +111,10 @@ public Optional getSkin() { @Nullable @Override - public EntityData initialize(ServerWorldAccess serverWorldAccess, LocalDifficulty localDifficulty, SpawnReason spawnReason, @Nullable EntityData entityData, @Nullable NbtCompound nbtCompound) { + public EntityData initialize(ServerWorldAccess serverWorldAccess, LocalDifficulty localDifficulty, SpawnReason spawnReason, @Nullable EntityData entityData) { this.initEquipment(random, localDifficulty); - this.updateEnchantments(random, localDifficulty); - return super.initialize(serverWorldAccess, localDifficulty, spawnReason, entityData, nbtCompound); + this.updateEnchantments(serverWorldAccess, random, localDifficulty); + return super.initialize(serverWorldAccess, localDifficulty, spawnReason, entityData); } @Override @@ -190,8 +188,9 @@ public void tick() { @Override public void shootAt(LivingEntity target, float pullProgress) { - ItemStack itemStack = this.getProjectileType(this.getStackInHand(ProjectileUtil.getHandPossiblyHolding(this, Items.BOW))); - PersistentProjectileEntity persistentProjectileEntity = this.createArrowProjectile(itemStack, pullProgress); + final ItemStack shotFrom = this.getStackInHand(ProjectileUtil.getHandPossiblyHolding(this, Items.BOW)); + ItemStack itemStack = this.getProjectileType(shotFrom); + PersistentProjectileEntity persistentProjectileEntity = this.createArrowProjectile(itemStack, pullProgress, shotFrom); double d = target.getX() - this.getX(); double e = target.getBodyY(0.3333333333333333D) - persistentProjectileEntity.getY(); double f = target.getZ() - this.getZ(); @@ -201,13 +200,8 @@ public void shootAt(LivingEntity target, float pullProgress) { this.getWorld().spawnEntity(persistentProjectileEntity); } - @Override - public void shoot(LivingEntity target, ItemStack crossbow, ProjectileEntity projectile, float multiShotSpray) { - this.shoot(this, target, projectile, multiShotSpray, 1.6F); - } - - protected PersistentProjectileEntity createArrowProjectile(ItemStack arrow, float damageModifier) { - return ProjectileUtil.createArrowProjectile(this, arrow, damageModifier); + protected PersistentProjectileEntity createArrowProjectile(ItemStack arrow, float damageModifier, ItemStack shotFrom) { + return ProjectileUtil.createArrowProjectile(this, arrow, damageModifier, shotFrom.isEmpty() ? null : shotFrom); } @Override diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/entity/generic/HunterEntity.java b/src/main/java/com/convallyria/taleofkingdoms/common/entity/generic/HunterEntity.java index 12eeba9a..339aad04 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/entity/generic/HunterEntity.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/entity/generic/HunterEntity.java @@ -93,8 +93,9 @@ public boolean isStationary() { @Override public void shootAt(LivingEntity target, float pullProgress) { - ItemStack itemStack = this.getProjectileType(this.getStackInHand(ProjectileUtil.getHandPossiblyHolding(this, Items.BOW))); - PersistentProjectileEntity persistentProjectileEntity = this.createArrowProjectile(itemStack, pullProgress); + final ItemStack shotFrom = this.getStackInHand(ProjectileUtil.getHandPossiblyHolding(this, Items.BOW)); + ItemStack itemStack = this.getProjectileType(shotFrom); + PersistentProjectileEntity persistentProjectileEntity = this.createArrowProjectile(itemStack, pullProgress, shotFrom); double d = target.getX() - this.getX(); double e = target.getBodyY(0.3333333333333333D) - persistentProjectileEntity.getY(); double f = target.getZ() - this.getZ(); @@ -104,8 +105,8 @@ public void shootAt(LivingEntity target, float pullProgress) { this.getWorld().spawnEntity(persistentProjectileEntity); } - protected PersistentProjectileEntity createArrowProjectile(ItemStack arrow, float damageModifier) { - return ProjectileUtil.createArrowProjectile(this, arrow, damageModifier); + protected PersistentProjectileEntity createArrowProjectile(ItemStack arrow, float damageModifier, ItemStack shotFrom) { + return ProjectileUtil.createArrowProjectile(this, arrow, damageModifier, shotFrom.isEmpty() ? null : shotFrom); } public void updateAttackType() { diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/entity/generic/SpellcastingEntity.java b/src/main/java/com/convallyria/taleofkingdoms/common/entity/generic/SpellcastingEntity.java index d9365aa1..4976472b 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/entity/generic/SpellcastingEntity.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/entity/generic/SpellcastingEntity.java @@ -9,6 +9,7 @@ import net.minecraft.entity.data.TrackedDataHandlerRegistry; import net.minecraft.entity.mob.HostileEntity; import net.minecraft.nbt.NbtCompound; +import net.minecraft.particle.EntityEffectParticleEffect; import net.minecraft.particle.ParticleTypes; import net.minecraft.sound.SoundEvent; import net.minecraft.util.math.MathHelper; @@ -40,19 +41,22 @@ public boolean canImmediatelyDespawn(double distanceSquared) { @Override public void checkDespawn() { } - protected void initDataTracker() { - super.initDataTracker(); - this.dataTracker.startTracking(SPELL, (byte)0); + @Override + protected void initDataTracker(DataTracker.Builder builder) { + super.initDataTracker(builder); + builder.add(SPELL, (byte)0); } - public void readCustomDataFromTag(NbtCompound tag) { - super.readCustomDataFromNbt(tag); - this.spellTicks = tag.getInt("SpellTicks"); + @Override + public void readCustomDataFromNbt(NbtCompound nbt) { + super.readCustomDataFromNbt(nbt); + this.spellTicks = nbt.getInt("SpellTicks"); } - public void writeCustomDataToTag(NbtCompound tag) { - super.writeCustomDataToNbt(tag); - tag.putInt("SpellTicks", this.spellTicks); + @Override + public void writeCustomDataToNbt(NbtCompound nbt) { + super.writeCustomDataToNbt(nbt); + nbt.putInt("SpellTicks", this.spellTicks); } @Environment(EnvType.CLIENT) @@ -81,6 +85,7 @@ protected SpellcastingEntity.Spell getSpell() { return !this.getWorld().isClient ? this.spell : SpellcastingEntity.Spell.byId(this.dataTracker.get(SPELL)); } + @Override protected void mobTick() { super.mobTick(); if (this.spellTicks > 0) { @@ -89,18 +94,39 @@ protected void mobTick() { } + @Override public void tick() { super.tick(); if (this.getWorld().isClient && this.isSpellcasting()) { - SpellcastingEntity.Spell spell = this.getSpell(); - double d = spell.particleVelocity[0]; - double e = spell.particleVelocity[1]; - double f = spell.particleVelocity[2]; - float g = this.bodyYaw * 0.017453292F + MathHelper.cos((float)this.age * 0.6662F) * 0.25F; - float h = MathHelper.cos(g); - float i = MathHelper.sin(g); - this.getWorld().addParticle(ParticleTypes.ENTITY_EFFECT, this.getX() + (double)h * 0.6D, this.getY() + 1.8D, this.getZ() + (double)i * 0.6D, d, e, f); - this.getWorld().addParticle(ParticleTypes.ENTITY_EFFECT, this.getX() - (double)h * 0.6D, this.getY() + 1.8D, this.getZ() - (double)i * 0.6D, d, e, f); + Spell spell = this.getSpell(); + float f = (float) spell.particleVelocity[0]; + float g = (float) spell.particleVelocity[1]; + float h = (float) spell.particleVelocity[2]; + float i = this.bodyYaw * (float) (Math.PI / 180.0) + MathHelper.cos((float)this.age * 0.6662F) * 0.25F; + float j = MathHelper.cos(i); + float k = MathHelper.sin(i); + double d = 0.6 * (double)this.getScale(); + double e = 1.8 * (double)this.getScale(); + this.getWorld() + .addParticle( + EntityEffectParticleEffect.create(ParticleTypes.ENTITY_EFFECT, f, g, h), + this.getX() + (double)j * d, + this.getY() + e, + this.getZ() + (double)k * d, + 0.0, + 0.0, + 0.0 + ); + this.getWorld() + .addParticle( + EntityEffectParticleEffect.create(ParticleTypes.ENTITY_EFFECT, f, g, h), + this.getX() - (double)j * d, + this.getY() + e, + this.getZ() - (double)k * d, + 0.0, + 0.0, + 0.0 + ); } } diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/entity/guild/BankerEntity.java b/src/main/java/com/convallyria/taleofkingdoms/common/entity/guild/BankerEntity.java index 09137a92..7b0c7b0f 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/entity/guild/BankerEntity.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/entity/guild/BankerEntity.java @@ -3,7 +3,7 @@ import com.convallyria.taleofkingdoms.TaleOfKingdoms; import com.convallyria.taleofkingdoms.common.entity.TOKEntity; import com.convallyria.taleofkingdoms.common.packet.Packets; -import com.convallyria.taleofkingdoms.server.packet.outgoing.OutgoingOpenScreenPacketHandler; +import com.convallyria.taleofkingdoms.common.packet.s2c.OpenScreenPacket; import net.minecraft.entity.EntityType; import net.minecraft.entity.ai.goal.LookAtEntityGoal; import net.minecraft.entity.mob.PathAwareEntity; @@ -25,7 +25,7 @@ protected void initGoals() { @Override protected ActionResult interactMob(PlayerEntity player, Hand hand) { if (hand == Hand.OFF_HAND || player.getWorld().isClient()) return ActionResult.FAIL; - TaleOfKingdoms.getAPI().getPacketHandler(Packets.OPEN_CLIENT_SCREEN).handleOutgoingPacket(player, OutgoingOpenScreenPacketHandler.ScreenTypes.BANKER, this.getId()); + TaleOfKingdoms.getAPI().getServerPacket(Packets.OPEN_CLIENT_SCREEN).sendPacket(player, new OpenScreenPacket(OpenScreenPacket.ScreenTypes.BANKER, this.getId())); return ActionResult.PASS; } diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/entity/guild/BlacksmithEntity.java b/src/main/java/com/convallyria/taleofkingdoms/common/entity/guild/BlacksmithEntity.java index af50d285..42651693 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/entity/guild/BlacksmithEntity.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/entity/guild/BlacksmithEntity.java @@ -3,8 +3,8 @@ import com.convallyria.taleofkingdoms.TaleOfKingdoms; import com.convallyria.taleofkingdoms.common.entity.ShopEntity; import com.convallyria.taleofkingdoms.common.packet.Packets; +import com.convallyria.taleofkingdoms.common.packet.s2c.OpenScreenPacket; import com.convallyria.taleofkingdoms.common.shop.ShopParser; -import com.convallyria.taleofkingdoms.server.packet.outgoing.OutgoingOpenScreenPacketHandler; import net.minecraft.entity.EntityType; import net.minecraft.entity.ai.goal.LookAtEntityGoal; import net.minecraft.entity.mob.PathAwareEntity; @@ -33,7 +33,7 @@ protected void initGoals() { @Override protected ActionResult interactMob(PlayerEntity player, Hand hand) { if (hand == Hand.OFF_HAND || player.getWorld().isClient()) return ActionResult.FAIL; - TaleOfKingdoms.getAPI().getPacketHandler(Packets.OPEN_CLIENT_SCREEN).handleOutgoingPacket(player, OutgoingOpenScreenPacketHandler.ScreenTypes.BLACKSMITH, this.getId()); + TaleOfKingdoms.getAPI().getServerPacket(Packets.OPEN_CLIENT_SCREEN).sendPacket(player, new OpenScreenPacket(OpenScreenPacket.ScreenTypes.BLACKSMITH, this.getId())); return ActionResult.PASS; } diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/entity/guild/CityBuilderEntity.java b/src/main/java/com/convallyria/taleofkingdoms/common/entity/guild/CityBuilderEntity.java index 67325f18..c7ef8475 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/entity/guild/CityBuilderEntity.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/entity/guild/CityBuilderEntity.java @@ -9,12 +9,12 @@ import com.convallyria.taleofkingdoms.common.kingdom.poi.KingdomPOI; import com.convallyria.taleofkingdoms.common.packet.PacketHandler; import com.convallyria.taleofkingdoms.common.packet.Packets; +import com.convallyria.taleofkingdoms.common.packet.s2c.OpenScreenPacket; import com.convallyria.taleofkingdoms.common.schematic.Schematic; import com.convallyria.taleofkingdoms.common.translation.Translations; import com.convallyria.taleofkingdoms.common.utils.InventoryUtils; import com.convallyria.taleofkingdoms.common.world.ConquestInstance; import com.convallyria.taleofkingdoms.common.world.guild.GuildPlayer; -import com.convallyria.taleofkingdoms.server.packet.outgoing.OutgoingOpenScreenPacketHandler; import net.minecraft.entity.EntityType; import net.minecraft.entity.InventoryOwner; import net.minecraft.entity.ai.goal.LookAtEntityGoal; @@ -53,11 +53,11 @@ public class CityBuilderEntity extends TOKEntity implements InventoryOwner { } @Override - protected void initDataTracker() { - super.initDataTracker(); - this.dataTracker.startTracking(MOVING_TO_LOCATION, false); - this.dataTracker.startTracking(STONE, 0); - this.dataTracker.startTracking(WOOD, 0); + protected void initDataTracker(DataTracker.Builder builder) { + super.initDataTracker(builder); + builder.add(MOVING_TO_LOCATION, false); + builder.add(STONE, 0); + builder.add(WOOD, 0); } private final FollowPlayerGoal followPlayerGoal = new FollowPlayerGoal(this, 0.75F, 5, 50); @@ -204,13 +204,13 @@ public void stopTarget() { } private void openScreen(PlayerEntity player, @Nullable PlayerKingdom kingdom, ConquestInstance instance) { - final PacketHandler open = TaleOfKingdoms.getAPI().getPacketHandler(Packets.OPEN_CLIENT_SCREEN); + final PacketHandler open = TaleOfKingdoms.getAPI().getServerPacket(Packets.OPEN_CLIENT_SCREEN); if (kingdom == null) { - open.handleOutgoingPacket(player, OutgoingOpenScreenPacketHandler.ScreenTypes.CITY_BUILDER_BEGIN, this.getId()); + open.sendPacket(player, new OpenScreenPacket(OpenScreenPacket.ScreenTypes.CITY_BUILDER_BEGIN, this.getId())); return; } - open.handleOutgoingPacket(player, OutgoingOpenScreenPacketHandler.ScreenTypes.CITY_BUILDER_TIER, this.getId()); + open.sendPacket(player, new OpenScreenPacket(OpenScreenPacket.ScreenTypes.CITY_BUILDER_TIER, this.getId())); } public boolean canAffordBuild(@Nullable PlayerKingdom kingdom, BuildCosts build) { @@ -253,13 +253,13 @@ public int getWood() { @Override public void writeCustomDataToNbt(NbtCompound nbt) { super.writeCustomDataToNbt(nbt); - nbt.put("Inventory", this.inventory.toNbtList()); + nbt.put("Inventory", this.inventory.toNbtList(this.getRegistryManager())); } @Override public void readCustomDataFromNbt(NbtCompound nbt) { super.readCustomDataFromNbt(nbt); - this.inventory.readNbtList(nbt.getList("Inventory", NbtElement.COMPOUND_TYPE)); + this.inventory.readNbtList(nbt.getList("Inventory", NbtElement.COMPOUND_TYPE), this.getRegistryManager()); this.getDataTracker().set(STONE, inventory.count(Items.COBBLESTONE)); this.getDataTracker().set(WOOD, inventory.count(Items.OAK_LOG)); } diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/entity/guild/FoodShopEntity.java b/src/main/java/com/convallyria/taleofkingdoms/common/entity/guild/FoodShopEntity.java index ecfb3844..919fcb73 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/entity/guild/FoodShopEntity.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/entity/guild/FoodShopEntity.java @@ -3,8 +3,8 @@ import com.convallyria.taleofkingdoms.TaleOfKingdoms; import com.convallyria.taleofkingdoms.common.entity.ShopEntity; import com.convallyria.taleofkingdoms.common.packet.Packets; +import com.convallyria.taleofkingdoms.common.packet.s2c.OpenScreenPacket; import com.convallyria.taleofkingdoms.common.shop.ShopParser; -import com.convallyria.taleofkingdoms.server.packet.outgoing.OutgoingOpenScreenPacketHandler; import net.minecraft.entity.EntityType; import net.minecraft.entity.ai.goal.LookAtEntityGoal; import net.minecraft.entity.mob.PathAwareEntity; @@ -33,7 +33,7 @@ protected void initGoals() { @Override protected ActionResult interactMob(PlayerEntity player, Hand hand) { if (hand == Hand.OFF_HAND || player.getWorld().isClient()) return ActionResult.FAIL; - TaleOfKingdoms.getAPI().getPacketHandler(Packets.OPEN_CLIENT_SCREEN).handleOutgoingPacket(player, OutgoingOpenScreenPacketHandler.ScreenTypes.FOOD_SHOP, this.getId()); + TaleOfKingdoms.getAPI().getServerPacket(Packets.OPEN_CLIENT_SCREEN).sendPacket(player, new OpenScreenPacket(OpenScreenPacket.ScreenTypes.FOOD_SHOP, this.getId())); return ActionResult.PASS; } diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/entity/guild/GuildArcherEntity.java b/src/main/java/com/convallyria/taleofkingdoms/common/entity/guild/GuildArcherEntity.java index 0e611399..7030ac83 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/entity/guild/GuildArcherEntity.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/entity/guild/GuildArcherEntity.java @@ -1,6 +1,5 @@ package com.convallyria.taleofkingdoms.common.entity.guild; -import com.convallyria.taleofkingdoms.common.translation.Translations; import com.convallyria.taleofkingdoms.common.entity.EntityTypes; import com.convallyria.taleofkingdoms.common.entity.States; import com.convallyria.taleofkingdoms.common.entity.TOKEntity; @@ -8,6 +7,7 @@ import com.convallyria.taleofkingdoms.common.entity.ai.goal.CrossbowAttackGoal; import com.convallyria.taleofkingdoms.common.entity.ai.goal.ImprovedFollowTargetGoal; import com.convallyria.taleofkingdoms.common.entity.ai.goal.WanderAroundGuildGoal; +import com.convallyria.taleofkingdoms.common.translation.Translations; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.entity.CrossbowUser; @@ -25,13 +25,11 @@ import net.minecraft.entity.mob.PathAwareEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.projectile.PersistentProjectileEntity; -import net.minecraft.entity.projectile.ProjectileEntity; import net.minecraft.entity.projectile.ProjectileUtil; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.item.RangedWeaponItem; -import net.minecraft.nbt.NbtCompound; import net.minecraft.sound.SoundEvents; import net.minecraft.util.ActionResult; import net.minecraft.util.Hand; @@ -95,8 +93,8 @@ public States.State getState() { } @Override - public EntityData initialize(ServerWorldAccess world, LocalDifficulty difficulty, SpawnReason spawnReason, @Nullable EntityData entityData, @Nullable NbtCompound entityTag) { - EntityData entityReturnData = super.initialize(world, difficulty, spawnReason, entityData, entityTag); + public EntityData initialize(ServerWorldAccess world, LocalDifficulty difficulty, SpawnReason spawnReason, @Nullable EntityData entityData) { + EntityData entityReturnData = super.initialize(world, difficulty, spawnReason, entityData); int value = ThreadLocalRandom.current().nextInt(2); this.setStackInHand(Hand.MAIN_HAND, new ItemStack(value == 1 ? Items.BOW : Items.CROSSBOW)); if (this.getStackInHand(Hand.MAIN_HAND).getItem() == Items.BOW) { @@ -151,8 +149,9 @@ protected ActionResult interactMob(PlayerEntity player, Hand hand) { @Override public void shootAt(LivingEntity target, float pullProgress) { - ItemStack itemStack = this.getProjectileType(this.getStackInHand(ProjectileUtil.getHandPossiblyHolding(this, Items.BOW))); - PersistentProjectileEntity persistentProjectileEntity = this.createArrowProjectile(itemStack, pullProgress); + final ItemStack shotFrom = this.getStackInHand(ProjectileUtil.getHandPossiblyHolding(this, Items.BOW)); + ItemStack itemStack = this.getProjectileType(shotFrom); + PersistentProjectileEntity persistentProjectileEntity = this.createArrowProjectile(itemStack, pullProgress, shotFrom); double d = target.getX() - this.getX(); double e = target.getBodyY(0.3333333333333333D) - persistentProjectileEntity.getY(); double g = target.getZ() - this.getZ(); @@ -162,13 +161,8 @@ public void shootAt(LivingEntity target, float pullProgress) { this.getWorld().spawnEntity(persistentProjectileEntity); } - @Override - public void shoot(LivingEntity target, ItemStack crossbow, ProjectileEntity projectile, float multiShotSpray) { - this.shoot(this, target, projectile, multiShotSpray, 1.6F); - } - - protected PersistentProjectileEntity createArrowProjectile(ItemStack arrow, float damageModifier) { - return ProjectileUtil.createArrowProjectile(this, arrow, damageModifier); + protected PersistentProjectileEntity createArrowProjectile(ItemStack arrow, float damageModifier, ItemStack shotFrom) { + return ProjectileUtil.createArrowProjectile(this, arrow, damageModifier, shotFrom.isEmpty() ? null : shotFrom); } @Override diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/entity/guild/GuildMasterDefenderEntity.java b/src/main/java/com/convallyria/taleofkingdoms/common/entity/guild/GuildMasterDefenderEntity.java index bb61f0a8..c6b2408c 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/entity/guild/GuildMasterDefenderEntity.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/entity/guild/GuildMasterDefenderEntity.java @@ -104,7 +104,7 @@ protected ActionResult interactMob(PlayerEntity player, Hand hand) { return ActionResult.SUCCESS; } - if (instance.getReficuleAttackers().size() == 0) { + if (instance.getReficuleAttackers().isEmpty()) { final GuildPlayer guildPlayer = instance.getPlayer(player); if (!guildPlayer.hasRebuiltGuild() && guildPlayer.getWorthiness() >= 750 && guildPlayer.getKingdom() == null) { Runnable fixGuild = () -> { @@ -125,7 +125,7 @@ protected ActionResult interactMob(PlayerEntity player, Hand hand) { guildPlayer.setHasRebuiltGuild(true); instance.setUnderAttack(false); final Entity entity = serverPlayerEntity.getWorld().getEntityById(this.getId()); - entity.teleport(entity.getX(), entity.getY() + 100, entity.getZ()); + entity.requestTeleport(entity.getX(), entity.getY() + 100, entity.getZ()); entity.remove(RemovalReason.DISCARDED); Translations.GUILDMASTER_THANK_YOU.send(player); } else { diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/entity/guild/GuildMasterEntity.java b/src/main/java/com/convallyria/taleofkingdoms/common/entity/guild/GuildMasterEntity.java index 317a4c36..df684696 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/entity/guild/GuildMasterEntity.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/entity/guild/GuildMasterEntity.java @@ -5,8 +5,8 @@ import com.convallyria.taleofkingdoms.common.entity.EntityTypes; import com.convallyria.taleofkingdoms.common.entity.TOKEntity; import com.convallyria.taleofkingdoms.common.packet.Packets; +import com.convallyria.taleofkingdoms.common.packet.s2c.OpenScreenPacket; import com.convallyria.taleofkingdoms.common.world.ConquestInstance; -import com.convallyria.taleofkingdoms.server.packet.outgoing.OutgoingOpenScreenPacketHandler; import net.minecraft.entity.EntityType; import net.minecraft.entity.ai.goal.LookAtEntityGoal; import net.minecraft.entity.attribute.DefaultAttributeContainer; @@ -48,7 +48,7 @@ protected ActionResult interactMob(PlayerEntity player, Hand hand) { TaleOfKingdomsAPI api = TaleOfKingdoms.getAPI(); if (player instanceof ServerPlayerEntity) { - api.getPacketHandler(Packets.OPEN_CLIENT_SCREEN).handleOutgoingPacket(player, OutgoingOpenScreenPacketHandler.ScreenTypes.GUILD_MASTER, this.getId()); + api.getServerPacket(Packets.OPEN_CLIENT_SCREEN).sendPacket(player, new OpenScreenPacket(OpenScreenPacket.ScreenTypes.GUILD_MASTER, this.getId())); return ActionResult.FAIL; } diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/entity/guild/InnkeeperEntity.java b/src/main/java/com/convallyria/taleofkingdoms/common/entity/guild/InnkeeperEntity.java index e9749229..0ddfeb27 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/entity/guild/InnkeeperEntity.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/entity/guild/InnkeeperEntity.java @@ -4,10 +4,10 @@ import com.convallyria.taleofkingdoms.common.entity.TOKEntity; import com.convallyria.taleofkingdoms.common.entity.ai.goal.WanderAroundGuildGoal; import com.convallyria.taleofkingdoms.common.packet.Packets; +import com.convallyria.taleofkingdoms.common.packet.s2c.OpenScreenPacket; import com.convallyria.taleofkingdoms.common.translation.Translations; import com.convallyria.taleofkingdoms.common.world.ConquestInstance; import com.convallyria.taleofkingdoms.common.world.guild.GuildPlayer; -import com.convallyria.taleofkingdoms.server.packet.outgoing.OutgoingOpenScreenPacketHandler; import net.minecraft.entity.EntityType; import net.minecraft.entity.ai.goal.LookAtEntityGoal; import net.minecraft.entity.mob.PathAwareEntity; @@ -41,7 +41,7 @@ protected ActionResult interactMob(PlayerEntity player, Hand hand) { } if (player instanceof ServerPlayerEntity) { - TaleOfKingdoms.getAPI().getPacketHandler(Packets.OPEN_CLIENT_SCREEN).handleOutgoingPacket(player, OutgoingOpenScreenPacketHandler.ScreenTypes.INNKEEPER, this.getId()); + TaleOfKingdoms.getAPI().getServerPacket(Packets.OPEN_CLIENT_SCREEN).sendPacket(player, new OpenScreenPacket(OpenScreenPacket.ScreenTypes.INNKEEPER, this.getId())); } return ActionResult.PASS; diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/entity/kingdom/BlockShopEntity.java b/src/main/java/com/convallyria/taleofkingdoms/common/entity/kingdom/BlockShopEntity.java index 2753965b..55b69190 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/entity/kingdom/BlockShopEntity.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/entity/kingdom/BlockShopEntity.java @@ -3,8 +3,8 @@ import com.convallyria.taleofkingdoms.TaleOfKingdoms; import com.convallyria.taleofkingdoms.common.entity.ShopEntity; import com.convallyria.taleofkingdoms.common.packet.Packets; +import com.convallyria.taleofkingdoms.common.packet.s2c.OpenScreenPacket; import com.convallyria.taleofkingdoms.common.shop.ShopParser; -import com.convallyria.taleofkingdoms.server.packet.outgoing.OutgoingOpenScreenPacketHandler; import net.minecraft.entity.EntityType; import net.minecraft.entity.ai.goal.LookAtEntityGoal; import net.minecraft.entity.mob.PathAwareEntity; @@ -29,7 +29,7 @@ protected void initGoals() { @Override protected ActionResult interactMob(PlayerEntity player, Hand hand) { if (hand == Hand.OFF_HAND || player.getWorld().isClient()) return ActionResult.FAIL; - TaleOfKingdoms.getAPI().getPacketHandler(Packets.OPEN_CLIENT_SCREEN).handleOutgoingPacket(player, OutgoingOpenScreenPacketHandler.ScreenTypes.BLOCK_SHOP, this.getId()); + TaleOfKingdoms.getAPI().getServerPacket(Packets.OPEN_CLIENT_SCREEN).sendPacket(player, new OpenScreenPacket(OpenScreenPacket.ScreenTypes.BLOCK_SHOP, this.getId())); return ActionResult.PASS; } diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/entity/kingdom/ForemanEntity.java b/src/main/java/com/convallyria/taleofkingdoms/common/entity/kingdom/ForemanEntity.java index 157ef255..f110c7bd 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/entity/kingdom/ForemanEntity.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/entity/kingdom/ForemanEntity.java @@ -9,12 +9,12 @@ import com.convallyria.taleofkingdoms.common.kingdom.PlayerKingdom; import com.convallyria.taleofkingdoms.common.kingdom.poi.KingdomPOI; import com.convallyria.taleofkingdoms.common.packet.Packets; +import com.convallyria.taleofkingdoms.common.packet.s2c.OpenScreenPacket; import com.convallyria.taleofkingdoms.common.translation.Translations; import com.convallyria.taleofkingdoms.common.utils.EntityUtils; import com.convallyria.taleofkingdoms.common.utils.InventoryUtils; import com.convallyria.taleofkingdoms.common.world.ConquestInstance; import com.convallyria.taleofkingdoms.common.world.guild.GuildPlayer; -import com.convallyria.taleofkingdoms.server.packet.outgoing.OutgoingOpenScreenPacketHandler; import net.minecraft.entity.EntityType; import net.minecraft.entity.InventoryOwner; import net.minecraft.entity.ai.goal.LookAtEntityGoal; @@ -46,10 +46,10 @@ public abstract class ForemanEntity extends TOKEntity implements InventoryOwner } @Override - protected void initDataTracker() { - super.initDataTracker(); - this.dataTracker.startTracking(STONE, 0); - this.dataTracker.startTracking(WOOD, 0); + protected void initDataTracker(DataTracker.Builder builder) { + super.initDataTracker(builder); + builder.add(STONE, 0); + builder.add(WOOD, 0); } private final SimpleInventory inventory = new SimpleInventory(20); @@ -74,7 +74,7 @@ protected ActionResult interactMob(PlayerEntity player, Hand hand) { if (api == null) return ActionResult.FAIL; if (api.getConquestInstanceStorage().mostRecentInstance().isEmpty()) return ActionResult.FAIL; if (hand == Hand.OFF_HAND || player.getWorld().isClient()) return ActionResult.FAIL; - TaleOfKingdoms.getAPI().getPacketHandler(Packets.OPEN_CLIENT_SCREEN).handleOutgoingPacket(player, OutgoingOpenScreenPacketHandler.ScreenTypes.FOREMAN, this.getId()); + TaleOfKingdoms.getAPI().getServerPacket(Packets.OPEN_CLIENT_SCREEN).sendPacket(player, new OpenScreenPacket(OpenScreenPacket.ScreenTypes.FOREMAN, this.getId())); return ActionResult.PASS; } @@ -135,13 +135,13 @@ public int getWood() { @Override public void writeCustomDataToNbt(NbtCompound nbt) { super.writeCustomDataToNbt(nbt); - nbt.put("Inventory", this.inventory.toNbtList()); + nbt.put("Inventory", this.inventory.toNbtList(this.getRegistryManager())); } @Override public void readCustomDataFromNbt(NbtCompound nbt) { super.readCustomDataFromNbt(nbt); - this.inventory.readNbtList(nbt.getList("Inventory", NbtElement.COMPOUND_TYPE)); + this.inventory.readNbtList(nbt.getList("Inventory", NbtElement.COMPOUND_TYPE), this.getRegistryManager()); this.getDataTracker().set(STONE, inventory.count(Items.COBBLESTONE)); this.getDataTracker().set(WOOD, inventory.count(Items.OAK_LOG)); } diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/entity/kingdom/HumanFarmerEntity.java b/src/main/java/com/convallyria/taleofkingdoms/common/entity/kingdom/HumanFarmerEntity.java index f7a3d5fa..81364bb5 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/entity/kingdom/HumanFarmerEntity.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/entity/kingdom/HumanFarmerEntity.java @@ -9,7 +9,6 @@ import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; -import net.minecraft.nbt.NbtCompound; import net.minecraft.sound.SoundEvent; import net.minecraft.util.ActionResult; import net.minecraft.util.Hand; @@ -28,9 +27,9 @@ public class HumanFarmerEntity extends VillagerEntity implements MultiSkinned { private static final List VALID_SKINS = List.of( - new Identifier(TaleOfKingdoms.MODID, "textures/entity/updated_textures/tok_farmer.png"), - new Identifier(TaleOfKingdoms.MODID, "textures/entity/updated_textures/innkeeper.png"), - new Identifier(TaleOfKingdoms.MODID, "textures/entity/updated_textures/tok_farmer_3.png") + Identifier.of(TaleOfKingdoms.MODID, "textures/entity/updated_textures/tok_farmer.png"), + Identifier.of(TaleOfKingdoms.MODID, "textures/entity/updated_textures/innkeeper.png"), + Identifier.of(TaleOfKingdoms.MODID, "textures/entity/updated_textures/tok_farmer_3.png") ); private final Identifier skin; @@ -44,8 +43,8 @@ public HumanFarmerEntity(EntityType entityType, World @Nullable @Override - public EntityData initialize(ServerWorldAccess world, LocalDifficulty difficulty, SpawnReason spawnReason, @Nullable EntityData entityData, @Nullable NbtCompound entityNbt) { - EntityData data = super.initialize(world, difficulty, spawnReason, entityData, entityNbt); + public EntityData initialize(ServerWorldAccess world, LocalDifficulty difficulty, SpawnReason spawnReason, @Nullable EntityData entityData) { + EntityData data = super.initialize(world, difficulty, spawnReason, entityData); this.setVillagerData(this.getVillagerData().withProfession(VillagerProfession.FARMER)); this.setStackInHand(Hand.MAIN_HAND, new ItemStack(Items.WOODEN_HOE)); return data; diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/entity/kingdom/ItemShopEntity.java b/src/main/java/com/convallyria/taleofkingdoms/common/entity/kingdom/ItemShopEntity.java index f2b072ec..42013689 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/entity/kingdom/ItemShopEntity.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/entity/kingdom/ItemShopEntity.java @@ -3,8 +3,8 @@ import com.convallyria.taleofkingdoms.TaleOfKingdoms; import com.convallyria.taleofkingdoms.common.entity.ShopEntity; import com.convallyria.taleofkingdoms.common.packet.Packets; +import com.convallyria.taleofkingdoms.common.packet.s2c.OpenScreenPacket; import com.convallyria.taleofkingdoms.common.shop.ShopParser; -import com.convallyria.taleofkingdoms.server.packet.outgoing.OutgoingOpenScreenPacketHandler; import net.minecraft.entity.EntityType; import net.minecraft.entity.ai.goal.LookAtEntityGoal; import net.minecraft.entity.mob.PathAwareEntity; @@ -33,9 +33,10 @@ protected void initGoals() { @Override protected ActionResult interactMob(PlayerEntity player, Hand hand) { if (hand == Hand.OFF_HAND || player.getWorld().isClient()) return ActionResult.FAIL; - TaleOfKingdoms.getAPI().getPacketHandler(Packets.OPEN_CLIENT_SCREEN).handleOutgoingPacket(player, OutgoingOpenScreenPacketHandler.ScreenTypes.ITEM_SHOP, this.getId()); + TaleOfKingdoms.getAPI().getServerPacket(Packets.OPEN_CLIENT_SCREEN).sendPacket(player, new OpenScreenPacket(OpenScreenPacket.ScreenTypes.ITEM_SHOP, this.getId())); return ActionResult.PASS; } + @Override public boolean isStationary() { return true; diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/entity/kingdom/StockMarketEntity.java b/src/main/java/com/convallyria/taleofkingdoms/common/entity/kingdom/StockMarketEntity.java index 61c70063..5c75ed26 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/entity/kingdom/StockMarketEntity.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/entity/kingdom/StockMarketEntity.java @@ -5,11 +5,11 @@ import com.convallyria.taleofkingdoms.common.entity.ShopEntity; import com.convallyria.taleofkingdoms.common.kingdom.PlayerKingdom; import com.convallyria.taleofkingdoms.common.packet.Packets; +import com.convallyria.taleofkingdoms.common.packet.s2c.OpenScreenPacket; import com.convallyria.taleofkingdoms.common.shop.ShopItem; import com.convallyria.taleofkingdoms.common.shop.ShopParser; import com.convallyria.taleofkingdoms.common.world.ConquestInstance; import com.convallyria.taleofkingdoms.common.world.guild.GuildPlayer; -import com.convallyria.taleofkingdoms.server.packet.outgoing.OutgoingOpenScreenPacketHandler; import net.minecraft.entity.EntityType; import net.minecraft.entity.ai.goal.LookAtEntityGoal; import net.minecraft.entity.mob.PathAwareEntity; @@ -61,7 +61,7 @@ protected ActionResult interactMob(PlayerEntity player, Hand hand) { } if (hand == Hand.OFF_HAND || player.getWorld().isClient()) return ActionResult.FAIL; - TaleOfKingdoms.getAPI().getPacketHandler(Packets.OPEN_CLIENT_SCREEN).handleOutgoingPacket(player, OutgoingOpenScreenPacketHandler.ScreenTypes.STOCK_MARKET, this.getId()); + TaleOfKingdoms.getAPI().getServerPacket(Packets.OPEN_CLIENT_SCREEN).sendPacket(player, new OpenScreenPacket(OpenScreenPacket.ScreenTypes.STOCK_MARKET, this.getId())); return ActionResult.PASS; } diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/entity/kingdom/warden/ArcherHireableEntity.java b/src/main/java/com/convallyria/taleofkingdoms/common/entity/kingdom/warden/ArcherHireableEntity.java index 25ef2665..e6b5224a 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/entity/kingdom/warden/ArcherHireableEntity.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/entity/kingdom/warden/ArcherHireableEntity.java @@ -15,12 +15,10 @@ import net.minecraft.entity.attribute.EntityAttributes; import net.minecraft.entity.mob.PathAwareEntity; import net.minecraft.entity.projectile.PersistentProjectileEntity; -import net.minecraft.entity.projectile.ProjectileEntity; import net.minecraft.entity.projectile.ProjectileUtil; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.item.RangedWeaponItem; -import net.minecraft.nbt.NbtCompound; import net.minecraft.sound.SoundEvents; import net.minecraft.text.Text; import net.minecraft.util.Hand; @@ -113,8 +111,8 @@ public Text getGuardText() { } @Override - public EntityData initialize(ServerWorldAccess world, LocalDifficulty difficulty, SpawnReason spawnReason, @Nullable EntityData entityData, @Nullable NbtCompound entityTag) { - EntityData entityReturnData = super.initialize(world, difficulty, spawnReason, entityData, entityTag); + public EntityData initialize(ServerWorldAccess world, LocalDifficulty difficulty, SpawnReason spawnReason, @Nullable EntityData entityData) { + EntityData entityReturnData = super.initialize(world, difficulty, spawnReason, entityData); int value = ThreadLocalRandom.current().nextInt(2); this.setStackInHand(Hand.MAIN_HAND, new ItemStack(value == 1 ? Items.BOW : Items.CROSSBOW)); return entityReturnData; @@ -135,8 +133,9 @@ public void tick() { @Override public void shootAt(LivingEntity target, float pullProgress) { - ItemStack itemStack = this.getProjectileType(this.getStackInHand(ProjectileUtil.getHandPossiblyHolding(this, Items.BOW))); - PersistentProjectileEntity persistentProjectileEntity = this.createArrowProjectile(itemStack, pullProgress); + final ItemStack shotFrom = this.getStackInHand(ProjectileUtil.getHandPossiblyHolding(this, Items.BOW)); + ItemStack itemStack = this.getProjectileType(shotFrom); + PersistentProjectileEntity persistentProjectileEntity = this.createArrowProjectile(itemStack, pullProgress, shotFrom); double d = target.getX() - this.getX(); double e = target.getBodyY(0.3333333333333333D) - persistentProjectileEntity.getY(); double g = target.getZ() - this.getZ(); @@ -147,13 +146,8 @@ public void shootAt(LivingEntity target, float pullProgress) { this.getWorld().spawnEntity(persistentProjectileEntity); } - @Override - public void shoot(LivingEntity target, ItemStack crossbow, ProjectileEntity projectile, float multiShotSpray) { - this.shoot(this, target, projectile, multiShotSpray, 1.6F); - } - - protected PersistentProjectileEntity createArrowProjectile(ItemStack arrow, float damageModifier) { - return ProjectileUtil.createArrowProjectile(this, arrow, damageModifier); + protected PersistentProjectileEntity createArrowProjectile(ItemStack arrow, float damageModifier, ItemStack shotFrom) { + return ProjectileUtil.createArrowProjectile(this, arrow, damageModifier, shotFrom.isEmpty() ? null : shotFrom); } @Override diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/entity/kingdom/warden/WardenEntity.java b/src/main/java/com/convallyria/taleofkingdoms/common/entity/kingdom/warden/WardenEntity.java index 24d7a5a7..de54ca83 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/entity/kingdom/warden/WardenEntity.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/entity/kingdom/warden/WardenEntity.java @@ -6,10 +6,10 @@ import com.convallyria.taleofkingdoms.common.entity.TOKEntity; import com.convallyria.taleofkingdoms.common.kingdom.PlayerKingdom; import com.convallyria.taleofkingdoms.common.packet.Packets; +import com.convallyria.taleofkingdoms.common.packet.s2c.OpenScreenPacket; import com.convallyria.taleofkingdoms.common.utils.EntityUtils; import com.convallyria.taleofkingdoms.common.world.ConquestInstance; import com.convallyria.taleofkingdoms.common.world.guild.GuildPlayer; -import com.convallyria.taleofkingdoms.server.packet.outgoing.OutgoingOpenScreenPacketHandler; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityType; import net.minecraft.entity.ai.goal.LookAtEntityGoal; @@ -73,7 +73,7 @@ protected ActionResult interactMob(PlayerEntity player, Hand hand) { if (api == null) return ActionResult.FAIL; if (api.getConquestInstanceStorage().mostRecentInstance().isEmpty()) return ActionResult.FAIL; if (hand == Hand.OFF_HAND || player.getWorld().isClient()) return ActionResult.FAIL; - TaleOfKingdoms.getAPI().getPacketHandler(Packets.OPEN_CLIENT_SCREEN).handleOutgoingPacket(player, OutgoingOpenScreenPacketHandler.ScreenTypes.WARDEN, this.getId()); + TaleOfKingdoms.getAPI().getServerPacket(Packets.OPEN_CLIENT_SCREEN).sendPacket(player, new OpenScreenPacket(OpenScreenPacket.ScreenTypes.WARDEN, this.getId())); return ActionResult.PASS; } diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/entity/kingdom/warden/WardenHireable.java b/src/main/java/com/convallyria/taleofkingdoms/common/entity/kingdom/warden/WardenHireable.java index ba505bd1..37ccf871 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/entity/kingdom/warden/WardenHireable.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/entity/kingdom/warden/WardenHireable.java @@ -83,9 +83,9 @@ public boolean isFollowingPlayer() { public abstract Text getGuardText(); @Override - protected void initDataTracker() { - super.initDataTracker(); - this.dataTracker.startTracking(TOTAL_EXPERIENCE, internalTotalExperience); + protected void initDataTracker(DataTracker.Builder builder) { + super.initDataTracker(builder); + builder.add(TOTAL_EXPERIENCE, internalTotalExperience); } @Override diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/entity/reficule/ReficuleGuardianEntity.java b/src/main/java/com/convallyria/taleofkingdoms/common/entity/reficule/ReficuleGuardianEntity.java index 493f1ae7..9d6e38b5 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/entity/reficule/ReficuleGuardianEntity.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/entity/reficule/ReficuleGuardianEntity.java @@ -5,6 +5,7 @@ import com.convallyria.taleofkingdoms.common.entity.ai.goal.BowAttackGoal; import com.convallyria.taleofkingdoms.common.entity.ai.goal.ImprovedFollowTargetGoal; import com.convallyria.taleofkingdoms.common.entity.ai.goal.TeleportTowardsPlayerGoal; +import net.minecraft.enchantment.Enchantment; import net.minecraft.enchantment.Enchantments; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityType; @@ -20,6 +21,9 @@ import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.item.RangedWeaponItem; +import net.minecraft.registry.DynamicRegistryManager; +import net.minecraft.registry.RegistryKeys; +import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.sound.SoundEvents; import net.minecraft.util.Hand; import net.minecraft.world.World; @@ -30,7 +34,9 @@ public class ReficuleGuardianEntity extends TOKEntity implements Monster, Telepo public ReficuleGuardianEntity(@NotNull EntityType entityType, @NotNull World world) { super(entityType, world); ItemStack bow = new ItemStack(Items.BOW); - bow.addEnchantment(Enchantments.POWER, 1); // Want them to look fancy :) + DynamicRegistryManager dynamicRegistryManager = world.getRegistryManager(); + RegistryEntry enchant = dynamicRegistryManager.get(RegistryKeys.ENCHANTMENT).getEntry(Enchantments.POWER).orElseThrow(); + bow.addEnchantment(enchant, 1); // Want them to look fancy :) this.setStackInHand(Hand.MAIN_HAND, bow); } @@ -85,8 +91,9 @@ public boolean isStationary() { @Override public void shootAt(LivingEntity target, float pullProgress) { - ItemStack itemStack = this.getProjectileType(this.getStackInHand(ProjectileUtil.getHandPossiblyHolding(this, Items.BOW))); - PersistentProjectileEntity persistentProjectileEntity = this.createArrowProjectile(itemStack, pullProgress); + final ItemStack shotFrom = this.getStackInHand(ProjectileUtil.getHandPossiblyHolding(this, Items.BOW)); + ItemStack itemStack = this.getProjectileType(shotFrom); + PersistentProjectileEntity persistentProjectileEntity = this.createArrowProjectile(itemStack, pullProgress, shotFrom); double d = target.getX() - this.getX(); double e = target.getBodyY(0.3333333333333333D) - persistentProjectileEntity.getY(); double g = target.getZ() - this.getZ(); @@ -96,8 +103,8 @@ public void shootAt(LivingEntity target, float pullProgress) { this.getWorld().spawnEntity(persistentProjectileEntity); } - protected PersistentProjectileEntity createArrowProjectile(ItemStack arrow, float damageModifier) { - return ProjectileUtil.createArrowProjectile(this, arrow, damageModifier); + protected PersistentProjectileEntity createArrowProjectile(ItemStack arrow, float damageModifier, ItemStack shotFrom) { + return ProjectileUtil.createArrowProjectile(this, arrow, damageModifier, shotFrom.isEmpty() ? null : shotFrom); } @Override diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/entity/reficule/ReficuleMageEntity.java b/src/main/java/com/convallyria/taleofkingdoms/common/entity/reficule/ReficuleMageEntity.java index 2f61097c..ae158570 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/entity/reficule/ReficuleMageEntity.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/entity/reficule/ReficuleMageEntity.java @@ -10,6 +10,7 @@ import com.convallyria.taleofkingdoms.common.entity.generic.SpellcastingEntity; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.minecraft.enchantment.Enchantment; import net.minecraft.enchantment.Enchantments; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityData; @@ -32,8 +33,10 @@ import net.minecraft.entity.projectile.ProjectileUtil; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; -import net.minecraft.nbt.NbtCompound; import net.minecraft.particle.ParticleTypes; +import net.minecraft.registry.DynamicRegistryManager; +import net.minecraft.registry.RegistryKeys; +import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.sound.SoundEvent; import net.minecraft.sound.SoundEvents; import net.minecraft.util.math.Box; @@ -121,12 +124,15 @@ public static DefaultAttributeContainer.Builder createMobAttributes() { .add(EntityAttributes.GENERIC_ATTACK_KNOCKBACK, 1.5D); } + @Nullable @Override - public EntityData initialize(ServerWorldAccess world, LocalDifficulty difficulty, SpawnReason spawnReason, @Nullable EntityData entityData, @Nullable NbtCompound entityTag) { + public EntityData initialize(ServerWorldAccess world, LocalDifficulty difficulty, SpawnReason spawnReason, @Nullable EntityData entityData) { ItemStack wand = new ItemStack(Items.STICK); - wand.addEnchantment(Enchantments.MENDING, 1); // Want them to look fancy :) + DynamicRegistryManager dynamicRegistryManager = world.getRegistryManager(); + RegistryEntry enchant = dynamicRegistryManager.get(RegistryKeys.ENCHANTMENT).getEntry(Enchantments.MENDING).orElseThrow(); + wand.addEnchantment(enchant, 1); // Want them to look fancy :) this.equipStack(EquipmentSlot.OFFHAND, wand); - return super.initialize(world, difficulty, spawnReason, entityData, entityTag); + return super.initialize(world, difficulty, spawnReason, entityData); } @Environment(EnvType.CLIENT) @@ -196,8 +202,9 @@ public SoundEvent getCastSpellSound() { @Override public void shootAt(LivingEntity livingEntity, float f) { - ItemStack itemStack = this.getProjectileType(this.getStackInHand(ProjectileUtil.getHandPossiblyHolding(this, Items.BOW))); - PersistentProjectileEntity persistentProjectileEntity = ProjectileUtil.createArrowProjectile(this, itemStack, f); + final ItemStack shotFrom = this.getStackInHand(ProjectileUtil.getHandPossiblyHolding(this, Items.BOW)); + ItemStack itemStack = this.getProjectileType(shotFrom); + PersistentProjectileEntity persistentProjectileEntity = ProjectileUtil.createArrowProjectile(this, itemStack, f, shotFrom); double d = livingEntity.getX() - this.getX(); double e = livingEntity.getBodyY(0.3333333333333333D) - persistentProjectileEntity.getY(); double g = livingEntity.getZ() - this.getZ(); diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/entity/reficule/ReficuleSoldierEntity.java b/src/main/java/com/convallyria/taleofkingdoms/common/entity/reficule/ReficuleSoldierEntity.java index f989f88b..d8230d5e 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/entity/reficule/ReficuleSoldierEntity.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/entity/reficule/ReficuleSoldierEntity.java @@ -4,6 +4,7 @@ import com.convallyria.taleofkingdoms.common.entity.TOKEntity; import com.convallyria.taleofkingdoms.common.entity.ai.goal.ImprovedFollowTargetGoal; import com.convallyria.taleofkingdoms.common.entity.ai.goal.TeleportTowardsPlayerGoal; +import net.minecraft.enchantment.Enchantment; import net.minecraft.enchantment.Enchantments; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityType; @@ -15,6 +16,9 @@ import net.minecraft.entity.mob.PathAwareEntity; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; +import net.minecraft.registry.DynamicRegistryManager; +import net.minecraft.registry.RegistryKeys; +import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.util.Hand; import net.minecraft.world.World; import org.jetbrains.annotations.NotNull; @@ -24,7 +28,9 @@ public class ReficuleSoldierEntity extends TOKEntity implements Monster, Telepor public ReficuleSoldierEntity(@NotNull EntityType entityType, @NotNull World world) { super(entityType, world); ItemStack ironSword = new ItemStack(Items.IRON_SWORD); - ironSword.addEnchantment(Enchantments.MENDING, 1); // Want them to look fancy :) + DynamicRegistryManager dynamicRegistryManager = world.getRegistryManager(); + RegistryEntry enchant = dynamicRegistryManager.get(RegistryKeys.ENCHANTMENT).getEntry(Enchantments.MENDING).orElseThrow(); + ironSword.addEnchantment(enchant, 1); // Want them to look fancy :) this.setStackInHand(Hand.MAIN_HAND, ironSword); } diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/generator/BanditCampGenerator.java b/src/main/java/com/convallyria/taleofkingdoms/common/generator/BanditCampGenerator.java index d986b1e1..7c27a6a1 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/generator/BanditCampGenerator.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/generator/BanditCampGenerator.java @@ -23,7 +23,7 @@ public class BanditCampGenerator { - private static final Identifier SMALL_BANDIT_CAMP = new Identifier(TaleOfKingdoms.MODID, "bandit_camp/small_bandit_camp"); + private static final Identifier SMALL_BANDIT_CAMP = Identifier.of(TaleOfKingdoms.MODID, "bandit_camp/small_bandit_camp"); public static void addPieces(StructureTemplateManager manager, BlockPos pos, BlockRotation blockRotation, StructurePiecesHolder structurePiecesHolder, Random random) { final Direction direction = Direction.random(random); diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/generator/GatewayGenerator.java b/src/main/java/com/convallyria/taleofkingdoms/common/generator/GatewayGenerator.java index e387770c..9e5cc59f 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/generator/GatewayGenerator.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/generator/GatewayGenerator.java @@ -24,8 +24,8 @@ public class GatewayGenerator { - private static final Identifier GATEWAY = new Identifier(TaleOfKingdoms.MODID, "gateway/gateway"); - private static final Identifier BARS = new Identifier(TaleOfKingdoms.MODID, "gateway/bars"); + private static final Identifier GATEWAY = Identifier.of(TaleOfKingdoms.MODID, "gateway/gateway"); + private static final Identifier BARS = Identifier.of(TaleOfKingdoms.MODID, "gateway/bars"); public static void addPieces(StructureTemplateManager manager, BlockPos pos, BlockRotation blockRotation, StructurePiecesHolder structurePiecesHolder, Random random) { final Direction direction = Direction.random(random); diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/generator/ReficuleVillageGenerator.java b/src/main/java/com/convallyria/taleofkingdoms/common/generator/ReficuleVillageGenerator.java index 70ffb3d4..231a01e3 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/generator/ReficuleVillageGenerator.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/generator/ReficuleVillageGenerator.java @@ -23,12 +23,12 @@ public class ReficuleVillageGenerator { - private static final Identifier ONE = new Identifier(TaleOfKingdoms.MODID, "reficule_village/reficule_village_one"); - private static final Identifier THREE = new Identifier(TaleOfKingdoms.MODID, "reficule_village/reficule_village_three"); - private static final Identifier FOUR = new Identifier(TaleOfKingdoms.MODID, "reficule_village/reficule_village_four"); - private static final Identifier MIDDLE = new Identifier(TaleOfKingdoms.MODID, "reficule_village/reficule_village_middle"); - private static final Identifier MIDDLE_TWO = new Identifier(TaleOfKingdoms.MODID, "reficule_village/reficule_village_middle_two"); - private static final Identifier TOWER = new Identifier(TaleOfKingdoms.MODID, "reficule_village/reficule_village_tower"); + private static final Identifier ONE = Identifier.of(TaleOfKingdoms.MODID, "reficule_village/reficule_village_one"); + private static final Identifier THREE = Identifier.of(TaleOfKingdoms.MODID, "reficule_village/reficule_village_three"); + private static final Identifier FOUR = Identifier.of(TaleOfKingdoms.MODID, "reficule_village/reficule_village_four"); + private static final Identifier MIDDLE = Identifier.of(TaleOfKingdoms.MODID, "reficule_village/reficule_village_middle"); + private static final Identifier MIDDLE_TWO = Identifier.of(TaleOfKingdoms.MODID, "reficule_village/reficule_village_middle_two"); + private static final Identifier TOWER = Identifier.of(TaleOfKingdoms.MODID, "reficule_village/reficule_village_tower"); public static void addPieces(StructureTemplateManager manager, BlockPos pos, BlockRotation blockRotation, StructurePiecesHolder structurePiecesHolder, Random random) { ReficuleVillagePiece onePiece = new ReficuleVillagePiece(manager, ONE, pos.subtract(new Vec3i(0, 6, 0)), BlockRotation.NONE, 0); diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/generator/biome/TOKBiomeTags.java b/src/main/java/com/convallyria/taleofkingdoms/common/generator/biome/TOKBiomeTags.java index ae2bb527..57e6160b 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/generator/biome/TOKBiomeTags.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/generator/biome/TOKBiomeTags.java @@ -14,6 +14,6 @@ public class TOKBiomeTags { private TOKBiomeTags() {} private static TagKey of(String id) { - return TagKey.of(RegistryKeys.BIOME, new Identifier(TaleOfKingdoms.MODID, id)); + return TagKey.of(RegistryKeys.BIOME, Identifier.of(TaleOfKingdoms.MODID, id)); } } \ No newline at end of file diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/generator/processor/GatewayStructureProcessor.java b/src/main/java/com/convallyria/taleofkingdoms/common/generator/processor/GatewayStructureProcessor.java index 51a5cd2f..321a13df 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/generator/processor/GatewayStructureProcessor.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/generator/processor/GatewayStructureProcessor.java @@ -5,7 +5,7 @@ import com.convallyria.taleofkingdoms.common.entity.EntityTypes; import com.convallyria.taleofkingdoms.common.utils.EntityUtils; import com.convallyria.taleofkingdoms.common.world.ConquestInstance; -import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; import net.minecraft.block.StructureBlock; import net.minecraft.entity.mob.MobEntity; import net.minecraft.structure.StructurePlacementData; @@ -23,9 +23,7 @@ public class GatewayStructureProcessor extends StructureProcessor { public static final GatewayStructureProcessor INSTANCE = new GatewayStructureProcessor(); - public static final Codec CODEC = Codec.unit(() -> { - return INSTANCE; - }); + public static final MapCodec CODEC = MapCodec.unit(() -> INSTANCE); public GatewayStructureProcessor() { } diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/generator/processor/GuildStructureProcessor.java b/src/main/java/com/convallyria/taleofkingdoms/common/generator/processor/GuildStructureProcessor.java index b502bb3e..c1d6dfdd 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/generator/processor/GuildStructureProcessor.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/generator/processor/GuildStructureProcessor.java @@ -6,7 +6,7 @@ import com.convallyria.taleofkingdoms.common.schematic.SchematicOptions; import com.convallyria.taleofkingdoms.common.utils.EntityUtils; import com.convallyria.taleofkingdoms.common.world.ConquestInstance; -import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; import net.minecraft.block.Blocks; import net.minecraft.block.StructureBlock; import net.minecraft.entity.EntityType; @@ -30,9 +30,7 @@ public class GuildStructureProcessor extends StructureProcessor { public static final GuildStructureProcessor INSTANCE = new GuildStructureProcessor(); - public static final Codec CODEC = Codec.unit(() -> { - return INSTANCE; - }); + public static final MapCodec CODEC = MapCodec.unit(() -> INSTANCE); private final List options; @@ -61,9 +59,9 @@ public StructureTemplate.StructureBlockInfo process(WorldView world, BlockPos po if (options.contains(SchematicOptions.NO_ENTITIES)) return air; Vec3d spawnPos = currentBlockInfo.pos().toCenterPos(); - final EntityType type = Registries.ENTITY_TYPE.getOrEmpty(new Identifier(TaleOfKingdoms.MODID, metadata)).orElse(null); + final EntityType type = Registries.ENTITY_TYPE.getOrEmpty(Identifier.of(TaleOfKingdoms.MODID, metadata)).orElse(null); if (type == null) { - TaleOfKingdoms.LOGGER.error("Unable to find entity " + metadata); + TaleOfKingdoms.LOGGER.error("Unable to find entity {}", metadata); return air; } diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/generator/processor/PlayerKingdomStructureProcessor.java b/src/main/java/com/convallyria/taleofkingdoms/common/generator/processor/PlayerKingdomStructureProcessor.java index ad80b25c..00a7d9c0 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/generator/processor/PlayerKingdomStructureProcessor.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/generator/processor/PlayerKingdomStructureProcessor.java @@ -3,7 +3,7 @@ import com.convallyria.taleofkingdoms.TaleOfKingdoms; import com.convallyria.taleofkingdoms.common.kingdom.PlayerKingdom; import com.convallyria.taleofkingdoms.common.kingdom.poi.KingdomPOI; -import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; import net.minecraft.block.Blocks; import net.minecraft.block.StructureBlock; import net.minecraft.nbt.NbtCompound; @@ -19,7 +19,7 @@ public class PlayerKingdomStructureProcessor extends StructureProcessor { public static final PlayerKingdomStructureProcessor INSTANCE = new PlayerKingdomStructureProcessor(); - public static final Codec CODEC = Codec.unit(() -> INSTANCE); + public static final MapCodec CODEC = MapCodec.unit(() -> INSTANCE); private final PlayerKingdom kingdom; private final ServerPlayerEntity player; diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/generator/structure/BanditCampStructure.java b/src/main/java/com/convallyria/taleofkingdoms/common/generator/structure/BanditCampStructure.java index 4841bbdd..eb3e37d9 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/generator/structure/BanditCampStructure.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/generator/structure/BanditCampStructure.java @@ -2,7 +2,7 @@ import com.convallyria.taleofkingdoms.TaleOfKingdoms; import com.convallyria.taleofkingdoms.common.generator.BanditCampGenerator; -import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; import net.minecraft.structure.StructurePiecesCollector; import net.minecraft.util.BlockRotation; import net.minecraft.util.math.BlockPos; @@ -16,7 +16,7 @@ public class BanditCampStructure extends Structure { - public static final Codec CODEC = createCodec(BanditCampStructure::new); + public static final MapCodec CODEC = createCodec(BanditCampStructure::new); public BanditCampStructure(Config config) { super(config); diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/generator/structure/GatewayStructure.java b/src/main/java/com/convallyria/taleofkingdoms/common/generator/structure/GatewayStructure.java index f4cdbdde..1a14313b 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/generator/structure/GatewayStructure.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/generator/structure/GatewayStructure.java @@ -2,7 +2,7 @@ import com.convallyria.taleofkingdoms.TaleOfKingdoms; import com.convallyria.taleofkingdoms.common.generator.GatewayGenerator; -import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; import net.minecraft.structure.StructurePiecesCollector; import net.minecraft.util.BlockRotation; import net.minecraft.util.math.BlockPos; @@ -16,7 +16,7 @@ public class GatewayStructure extends Structure { - public static final Codec CODEC = createCodec(GatewayStructure::new); + public static final MapCodec CODEC = createCodec(GatewayStructure::new); public GatewayStructure(Config config) { super(config); diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/generator/structure/ReficuleVillageStructure.java b/src/main/java/com/convallyria/taleofkingdoms/common/generator/structure/ReficuleVillageStructure.java index f78df2a1..b9af5c4c 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/generator/structure/ReficuleVillageStructure.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/generator/structure/ReficuleVillageStructure.java @@ -2,7 +2,7 @@ import com.convallyria.taleofkingdoms.TaleOfKingdoms; import com.convallyria.taleofkingdoms.common.generator.ReficuleVillageGenerator; -import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; import net.minecraft.structure.StructurePiecesCollector; import net.minecraft.util.BlockRotation; import net.minecraft.util.math.BlockPos; @@ -15,7 +15,7 @@ public class ReficuleVillageStructure extends Structure { - public static final Codec CODEC = createCodec(ReficuleVillageStructure::new); + public static final MapCodec CODEC = createCodec(ReficuleVillageStructure::new); public ReficuleVillageStructure(Config config) { super(config); diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/generator/structure/TOKStructureKeys.java b/src/main/java/com/convallyria/taleofkingdoms/common/generator/structure/TOKStructureKeys.java index 84851fb0..445cacc0 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/generator/structure/TOKStructureKeys.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/generator/structure/TOKStructureKeys.java @@ -12,6 +12,6 @@ public class TOKStructureKeys { public static final RegistryKey REFICULE_VILLAGE = of("reficule_village"); private static RegistryKey of(String id) { - return RegistryKey.of(RegistryKeys.STRUCTURE, new Identifier(TaleOfKingdoms.MODID, id)); + return RegistryKey.of(RegistryKeys.STRUCTURE, Identifier.of(TaleOfKingdoms.MODID, id)); } } diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/generator/structure/TOKStructureSetKeys.java b/src/main/java/com/convallyria/taleofkingdoms/common/generator/structure/TOKStructureSetKeys.java index 84094de7..0a30d889 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/generator/structure/TOKStructureSetKeys.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/generator/structure/TOKStructureSetKeys.java @@ -12,6 +12,6 @@ public class TOKStructureSetKeys { public static final RegistryKey GATEWAYS = of("gateways"); private static RegistryKey of(String id) { - return RegistryKey.of(RegistryKeys.STRUCTURE_SET, new Identifier(TaleOfKingdoms.MODID, id)); + return RegistryKey.of(RegistryKeys.STRUCTURE_SET, Identifier.of(TaleOfKingdoms.MODID, id)); } } diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/generator/structure/TOKStructures.java b/src/main/java/com/convallyria/taleofkingdoms/common/generator/structure/TOKStructures.java index 46c723df..5e6e7206 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/generator/structure/TOKStructures.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/generator/structure/TOKStructures.java @@ -8,6 +8,7 @@ import com.convallyria.taleofkingdoms.common.generator.util.StructureConfigCreator; import com.convallyria.taleofkingdoms.mixin.StructureTypeAccessor; import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; import net.minecraft.registry.Registerable; import net.minecraft.registry.RegistryKey; import net.minecraft.structure.StructurePieceType; @@ -41,10 +42,10 @@ public static void registerStructureFeatures(Registerable structureRe // Ignore this here for now, was just messing around with manually adding template pools for jigsaw structures. // final Function single = SinglePoolElement.ofSingle("taleofkingdoms:gateway"); // final List, Integer>> of = List.of(Pair.of(single, 1)); -// StructurePool pool = new StructurePool(new Identifier(TaleOfKingdoms.MODID, "gateway"), new Identifier("empty"), of, StructurePool.Projection.RIGID); +// StructurePool pool = new StructurePool(Identifier.of(TaleOfKingdoms.MODID, "gateway"), Identifier.of("empty"), of, StructurePool.Projection.RIGID); // System.out.println("c: " + pool.getElementCount()); -// Registry.register(BuiltinRegistries.STRUCTURE_POOL, new Identifier(TaleOfKingdoms.MODID, "gateway"), pool); -// final StructurePool gateway = BuiltinRegistries.STRUCTURE_POOL.get(new Identifier(TaleOfKingdoms.MODID, "gateway")); +// Registry.register(BuiltinRegistries.STRUCTURE_POOL, Identifier.of(TaleOfKingdoms.MODID, "gateway"), pool); +// final StructurePool gateway = BuiltinRegistries.STRUCTURE_POOL.get(Identifier.of(TaleOfKingdoms.MODID, "gateway")); // System.out.println("e: " + gateway); registerStructure(structureRegisterable, TOKStructureKeys.BANDIT_CAMP, new BanditCampStructure(StructureConfigCreator .create() @@ -63,7 +64,7 @@ public static void registerStructureFeatures(Registerable structureRe .build(structureRegisterable))); } - private static StructureType registerType(String name, Codec structure) { + private static StructureType registerType(String name, MapCodec structure) { return StructureTypeAccessor.callRegister(TaleOfKingdoms.MODID + ":" + name, structure); } diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/item/ItemRegistry.java b/src/main/java/com/convallyria/taleofkingdoms/common/item/ItemRegistry.java index dedf28c7..31e97039 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/item/ItemRegistry.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/item/ItemRegistry.java @@ -22,7 +22,7 @@ public class ItemRegistry extends Listener { public static final Map ITEMS = new HashMap<>(); - public static final RegistryKey TOK_ITEM_GROUP = RegistryKey.of(RegistryKeys.ITEM_GROUP, new Identifier(TaleOfKingdoms.MODID, "general")); + public static final RegistryKey TOK_ITEM_GROUP = RegistryKey.of(RegistryKeys.ITEM_GROUP, Identifier.of(TaleOfKingdoms.MODID, "general")); static { Registry.register(Registries.ITEM_GROUP, TOK_ITEM_GROUP, FabricItemGroup.builder() @@ -65,8 +65,8 @@ public static void registerItems() { TaleOfKingdoms.LOGGER.info("Loading items..."); int index = 1; for (TOKItem item : ITEMS.keySet()) { - TaleOfKingdoms.LOGGER.info("[" + index + "/" + ITEMS.values().size() + "] Loading item: " + item.getRegistryName()); - Registry.register(Registries.ITEM, new Identifier(TaleOfKingdoms.MODID, item.getRegistryName()), ITEMS.get(item)); + TaleOfKingdoms.LOGGER.info("[{}/{}] Loading item: {}", index, ITEMS.values().size(), item.getRegistryName()); + Registry.register(Registries.ITEM, Identifier.of(TaleOfKingdoms.MODID, item.getRegistryName()), ITEMS.get(item)); index++; } } diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/item/common/ItemPouch.java b/src/main/java/com/convallyria/taleofkingdoms/common/item/common/ItemPouch.java index 311e2a7c..e074f459 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/item/common/ItemPouch.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/item/common/ItemPouch.java @@ -1,23 +1,12 @@ package com.convallyria.taleofkingdoms.common.item.common; -import com.convallyria.taleofkingdoms.TaleOfKingdoms; -import com.convallyria.taleofkingdoms.common.world.ConquestInstance; -import com.convallyria.taleofkingdoms.common.world.guild.GuildPlayer; -import net.minecraft.client.item.TooltipContext; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvents; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; import net.minecraft.util.Hand; import net.minecraft.util.TypedActionResult; import net.minecraft.world.World; -import org.jetbrains.annotations.Nullable; -import java.util.List; import java.util.UUID; public class ItemPouch extends Item { @@ -31,59 +20,59 @@ public ItemPouch(Settings settings) { @Override public TypedActionResult use(World world, PlayerEntity user, Hand hand) { final UUID uuid = user.getUuid(); - if (world.isClient()) return TypedActionResult.fail(user.getStackInHand(hand)); - ConquestInstance instance = TaleOfKingdoms.getAPI().getConquestInstanceStorage().mostRecentInstance().get(); - final GuildPlayer guildPlayer = instance.getPlayer(user); + if (true || world.isClient()) return TypedActionResult.fail(user.getStackInHand(hand)); +// ConquestInstance instance = TaleOfKingdoms.getAPI().getConquestInstanceStorage().mostRecentInstance().get(); +// final GuildPlayer guildPlayer = instance.getPlayer(user); ItemStack itemStack = user.getStackInHand(hand); - if (itemStack.hasNbt()) { - NbtCompound compoundTag = itemStack.getNbt(); - if (compoundTag.contains("coins")) { - int coins = compoundTag.getInt("coins"); - if (coins == maxCoins) { - guildPlayer.setCoins(guildPlayer.getCoins() + coins); - compoundTag.remove("coins"); - user.playSound(SoundEvents.ENTITY_PLAYER_ATTACK_SWEEP, SoundCategory.MASTER, 1f, 1f); - itemStack.setNbt(compoundTag); - return TypedActionResult.pass(itemStack); - } - } - } - - if (guildPlayer.getCoins() >= 100) { - if (!itemStack.hasNbt()) { - NbtCompound compoundTag = new NbtCompound(); - compoundTag.putInt("coins", 100); - guildPlayer.setCoins(guildPlayer.getCoins() - 100); - itemStack.setNbt(compoundTag); - user.playSound(SoundEvents.ITEM_ARMOR_EQUIP_GENERIC, SoundCategory.MASTER, 1f, 1f); - } else { - NbtCompound compoundTag = itemStack.getNbt(); - if (!compoundTag.contains("coins")) { - compoundTag.putInt("coins", 100); - guildPlayer.setCoins(guildPlayer.getCoins() - 100); - user.playSound(SoundEvents.ITEM_ARMOR_EQUIP_GENERIC, SoundCategory.MASTER, 1f, 1f); - } else { - int coins = compoundTag.getInt("coins"); - if (coins <= (maxCoins - 100)) { - compoundTag.putInt("coins", coins + 100); - guildPlayer.setCoins(guildPlayer.getCoins() - 100); - user.playSound(SoundEvents.ITEM_ARMOR_EQUIP_GENERIC, SoundCategory.MASTER, 1f, 1f); - } - } - itemStack.setNbt(compoundTag); - } - } +// if (itemStack.hasNbt()) { +// NbtCompound compoundTag = itemStack.getNbt(); +// if (compoundTag.contains("coins")) { +// int coins = compoundTag.getInt("coins"); +// if (coins == maxCoins) { +// guildPlayer.setCoins(guildPlayer.getCoins() + coins); +// compoundTag.remove("coins"); +// user.playSound(SoundEvents.ENTITY_PLAYER_ATTACK_SWEEP, SoundCategory.MASTER, 1f, 1f); +// itemStack.setNbt(compoundTag); +// return TypedActionResult.pass(itemStack); +// } +// } +// } +// +// if (guildPlayer.getCoins() >= 100) { +// if (!itemStack.hasNbt()) { +// NbtCompound compoundTag = new NbtCompound(); +// compoundTag.putInt("coins", 100); +// guildPlayer.setCoins(guildPlayer.getCoins() - 100); +// itemStack.setNbt(compoundTag); +// user.playSound(SoundEvents.ITEM_ARMOR_EQUIP_GENERIC, SoundCategory.MASTER, 1f, 1f); +// } else { +// NbtCompound compoundTag = itemStack.getNbt(); +// if (!compoundTag.contains("coins")) { +// compoundTag.putInt("coins", 100); +// guildPlayer.setCoins(guildPlayer.getCoins() - 100); +// user.playSound(SoundEvents.ITEM_ARMOR_EQUIP_GENERIC, SoundCategory.MASTER, 1f, 1f); +// } else { +// int coins = compoundTag.getInt("coins"); +// if (coins <= (maxCoins - 100)) { +// compoundTag.putInt("coins", coins + 100); +// guildPlayer.setCoins(guildPlayer.getCoins() - 100); +// user.playSound(SoundEvents.ITEM_ARMOR_EQUIP_GENERIC, SoundCategory.MASTER, 1f, 1f); +// } +// } +// itemStack.setNbt(compoundTag); +// } +// } return TypedActionResult.pass(itemStack); } - @Override - public void appendTooltip(ItemStack stack, @Nullable World world, List tooltip, TooltipContext context) { - if (stack.hasNbt()) { - NbtCompound compoundTag = stack.getNbt(); - if (compoundTag.contains("coins")) { - int coins = compoundTag.getInt("coins"); - tooltip.add(Text.literal("Coins: " + coins).formatted(Formatting.GOLD, Formatting.ITALIC)); - } - } - } +// @Override +// public void appendTooltip(ItemStack stack, @Nullable World world, List tooltip, TooltipContext context) { +// if (stack.hasNbt()) { +// NbtCompound compoundTag = stack.getNbt(); +// if (compoundTag.contains("coins")) { +// int coins = compoundTag.getInt("coins"); +// tooltip.add(Text.literal("Coins: " + coins).formatted(Formatting.GOLD, Formatting.ITALIC)); +// } +// } +// } } diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/kingdom/KingdomTier.java b/src/main/java/com/convallyria/taleofkingdoms/common/kingdom/KingdomTier.java index 89cb02d1..0efa664d 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/kingdom/KingdomTier.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/kingdom/KingdomTier.java @@ -1,12 +1,11 @@ package com.convallyria.taleofkingdoms.common.kingdom; import com.convallyria.taleofkingdoms.common.schematic.Schematic; -import com.convallyria.taleofkingdoms.common.serialization.EnumCodec; import net.minecraft.text.Text; import net.minecraft.util.math.Vec3i; import org.jetbrains.annotations.Nullable; -public enum KingdomTier implements EnumCodec.Values { +public enum KingdomTier { TIER_ONE(Text.translatable("menu.taleofkingdoms.generic.tier_one"), Schematic.TIER_1_KINGDOM, Vec3i.ZERO), TIER_TWO(Text.translatable("menu.taleofkingdoms.generic.tier_two"), Schematic.TIER_2_KINGDOM, new Vec3i(16, 0, 49)); @@ -41,9 +40,4 @@ public boolean isHigherThanOrEqual(@Nullable KingdomTier tier) { if (tier == null) return false; return this.ordinal() >= tier.ordinal(); } - - @Override - public String getSerializedName() { - return this.name(); - } } diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/kingdom/builds/BuildCosts.java b/src/main/java/com/convallyria/taleofkingdoms/common/kingdom/builds/BuildCosts.java index f0595bef..b5912f65 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/kingdom/builds/BuildCosts.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/kingdom/builds/BuildCosts.java @@ -3,11 +3,10 @@ import com.convallyria.taleofkingdoms.common.kingdom.KingdomTier; import com.convallyria.taleofkingdoms.common.kingdom.poi.KingdomPOI; import com.convallyria.taleofkingdoms.common.schematic.Schematic; -import com.convallyria.taleofkingdoms.common.serialization.EnumCodec; import net.minecraft.text.Text; import net.minecraft.util.BlockRotation; -public enum BuildCosts implements EnumCodec.Values { +public enum BuildCosts { SMALL_HOUSE_1(Text.translatable("menu.taleofkingdoms.citybuilder.small_house"), KingdomTier.TIER_ONE, Schematic.TIER_1_SMALL_HOUSE_VARIANT_ONE, BlockRotation.COUNTERCLOCKWISE_90, KingdomPOI.TIER_ONE_SMALL_HOUSE_1, 192, 128), SMALL_HOUSE_2(Text.translatable("menu.taleofkingdoms.citybuilder.small_house"), KingdomTier.TIER_ONE, Schematic.TIER_1_SMALL_HOUSE_VARIANT_TWO, BlockRotation.CLOCKWISE_180, KingdomPOI.TIER_ONE_SMALL_HOUSE_2, 192, 128), LARGE_HOUSE(Text.translatable("menu.taleofkingdoms.citybuilder.large_house"), KingdomTier.TIER_ONE, Schematic.TIER_1_LARGE_HOUSE, BlockRotation.COUNTERCLOCKWISE_90, KingdomPOI.TIER_ONE_LARGE_HOUSE, 192, 320), @@ -77,9 +76,4 @@ public int getWood() { public int getStone() { return stone; } - - @Override - public String getSerializedName() { - return name(); - } } diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/kingdom/poi/KingdomPOI.java b/src/main/java/com/convallyria/taleofkingdoms/common/kingdom/poi/KingdomPOI.java index e3c1709b..a0a7ca2a 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/kingdom/poi/KingdomPOI.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/kingdom/poi/KingdomPOI.java @@ -5,7 +5,6 @@ import com.convallyria.taleofkingdoms.common.entity.TOKEntity; import com.convallyria.taleofkingdoms.common.kingdom.PlayerKingdom; import com.convallyria.taleofkingdoms.common.kingdom.builds.BuildCosts; -import com.convallyria.taleofkingdoms.common.serialization.EnumCodec; import com.convallyria.taleofkingdoms.common.utils.EntityUtils; import net.minecraft.entity.EntityType; import net.minecraft.server.network.ServerPlayerEntity; @@ -14,7 +13,7 @@ import java.util.Optional; -public enum KingdomPOI implements EnumCodec.Values { +public enum KingdomPOI { CITY_BUILDER_WELL_POI("CityBuilderWellPOI") { @Override public void compute(PlayerKingdom kingdom, ServerPlayerEntity player, StructureTemplate.StructureBlockInfo info) { @@ -31,7 +30,7 @@ public void compute(PlayerKingdom kingdom, ServerPlayerEntity player, StructureT kingdom.getKingdomEntity(player.getWorld(), EntityTypes.CITYBUILDER).ifPresent(entity -> { entity.requestTeleport(finalPos.getX(), finalPos.getY(), finalPos.getZ()); entity.setTarget(finalPos); - TaleOfKingdoms.LOGGER.info("Teleported city builder to " + finalPos); + TaleOfKingdoms.LOGGER.info("Teleported city builder to {}", finalPos); }); } }, @@ -176,9 +175,4 @@ public static Optional getFrom(String poiName) { } return Optional.empty(); } - - @Override - public String getSerializedName() { - return this.name(); - } } diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/loot/TOKLootTables.java b/src/main/java/com/convallyria/taleofkingdoms/common/loot/TOKLootTables.java index 797b8c83..f241a80f 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/loot/TOKLootTables.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/loot/TOKLootTables.java @@ -2,32 +2,35 @@ import com.convallyria.taleofkingdoms.TaleOfKingdoms; import com.google.common.collect.Sets; +import net.minecraft.loot.LootTable; +import net.minecraft.registry.RegistryKey; +import net.minecraft.registry.RegistryKeys; import net.minecraft.util.Identifier; import java.util.Collections; import java.util.Set; public class TOKLootTables { - private static final Set LOOT_TABLES = Sets.newHashSet(); - private static final Set LOOT_TABLES_READ_ONLY; - public static final Identifier SMALL_BANDIT_CAMP; - public static final Identifier REFICULE_VILLAGE_WELL; - public static final Identifier REFICULE_VILLAGE_HOUSE; - public static final Identifier REFICULE_VILLAGE_TOWER; + private static final Set> LOOT_TABLES = Sets.newHashSet(); + private static final Set> LOOT_TABLES_READ_ONLY; + public static final RegistryKey SMALL_BANDIT_CAMP; + public static final RegistryKey REFICULE_VILLAGE_WELL; + public static final RegistryKey REFICULE_VILLAGE_HOUSE; + public static final RegistryKey REFICULE_VILLAGE_TOWER; - private static Identifier register(String id) { - return registerLootTable(new Identifier(TaleOfKingdoms.MODID, id)); + private static RegistryKey register(String id) { + return registerLootTable(RegistryKey.of(RegistryKeys.LOOT_TABLE, Identifier.of(TaleOfKingdoms.MODID, id))); } - private static Identifier registerLootTable(Identifier id) { + private static RegistryKey registerLootTable(RegistryKey id) { if (LOOT_TABLES.add(id)) { return id; } else { - throw new IllegalArgumentException("" + id + " is already a registered built-in loot table"); + throw new IllegalArgumentException(id.getValue() + " is already a registered built-in loot table"); } } - public static Set getAll() { + public static Set> getAll() { return LOOT_TABLES_READ_ONLY; } diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/packet/PacketHandler.java b/src/main/java/com/convallyria/taleofkingdoms/common/packet/PacketHandler.java index b5606a57..b51dab8b 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/packet/PacketHandler.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/packet/PacketHandler.java @@ -3,49 +3,46 @@ import com.convallyria.taleofkingdoms.TaleOfKingdoms; import com.convallyria.taleofkingdoms.common.packet.context.PacketContext; import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.RegistryByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.packet.CustomPayload; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.util.Identifier; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -public abstract class PacketHandler { +public abstract class PacketHandler { - protected final Identifier packet; + protected final CustomPayload.Id packet; + protected final PacketCodec codec; /** * Creates a new packet handler and registers it for incoming handling. * @param packet the {@link Identifier} for the packet */ - public PacketHandler(Identifier packet) { + public PacketHandler(CustomPayload.Id packet, PacketCodec codec) { TaleOfKingdoms.LOGGER.info("Registered packet handler [" + this.getClass().getSimpleName() + "]"); this.packet = packet; + this.codec = codec; register(); } /** * Gets the packet identifier. - * @return the {@link Identifier} + * @return the {@link CustomPayload.Id} */ - public Identifier getPacket() { + public CustomPayload.Id getPacket() { return packet; } /** * Handles a packet that is incoming (client receiving from server, or server receiving from client) * @param context the {@link PlayerEntity} - * @param attachedData the {@link PacketByteBuf}, which is data sent via {@link #handleOutgoingPacket(PlayerEntity, Object...)} + * @param packet the {@link CustomPayload} */ - public abstract void handleIncomingPacket(PacketContext context, PacketByteBuf attachedData); - - /** - * Handles a packet that is outgoing (client sending to server, or server sending to client) - * @param player the player sending it - * @param data extra data to post with the packet, some packets may require different data - */ - public abstract void handleOutgoingPacket(@NotNull PlayerEntity player, @Nullable Object... data); + public void handleIncomingPacket(PacketContext context, T packet) { + throw new UnsupportedOperationException("Not supported"); + } - protected abstract void sendPacket(PlayerEntity player, PacketByteBuf passedData); + public abstract void sendPacket(PlayerEntity player, T packet); /** * Registers the packet to receive incoming data. diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/packet/Packets.java b/src/main/java/com/convallyria/taleofkingdoms/common/packet/Packets.java index 5eee8f6c..a48c6dfb 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/packet/Packets.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/packet/Packets.java @@ -1,26 +1,41 @@ package com.convallyria.taleofkingdoms.common.packet; import com.convallyria.taleofkingdoms.TaleOfKingdoms; +import com.convallyria.taleofkingdoms.common.packet.both.SignContractPacket; +import com.convallyria.taleofkingdoms.common.packet.c2s.BankerInteractPacket; +import com.convallyria.taleofkingdoms.common.packet.c2s.BuildKingdomPacket; +import com.convallyria.taleofkingdoms.common.packet.c2s.BuyItemPacket; +import com.convallyria.taleofkingdoms.common.packet.c2s.CityBuilderActionPacket; +import com.convallyria.taleofkingdoms.common.packet.c2s.FixGuildPacket; +import com.convallyria.taleofkingdoms.common.packet.c2s.ForemanBuyWorkerPacket; +import com.convallyria.taleofkingdoms.common.packet.c2s.ForemanCollectPacket; +import com.convallyria.taleofkingdoms.common.packet.c2s.HireHunterPacket; +import com.convallyria.taleofkingdoms.common.packet.c2s.InnkeeperActionPacket; +import com.convallyria.taleofkingdoms.common.packet.c2s.ToggleSellGuiPacket; +import com.convallyria.taleofkingdoms.common.packet.c2s.UpgradeKingdomPacket; +import com.convallyria.taleofkingdoms.common.packet.s2c.InstanceSyncPacket; +import com.convallyria.taleofkingdoms.common.packet.s2c.OpenScreenPacket; +import net.minecraft.network.packet.CustomPayload; import net.minecraft.util.Identifier; public class Packets { - public static final Identifier INSTANCE_SYNC = register("instance_sync"); - public static final Identifier OPEN_CLIENT_SCREEN = register("open_client_screen"); - public static final Identifier SIGN_CONTRACT = register("sign_contract"); - public static final Identifier FIX_GUILD = register("fix_guild"); - public static final Identifier TOGGLE_SELL_GUI = register("toggle_sell_gui"); - public static final Identifier BUY_ITEM = register("buy_item"); - public static final Identifier BANKER_INTERACT = register("banker_interact"); - public static final Identifier HIRE_HUNTER = register("hire_hunter"); - public static final Identifier INNKEEPER_HIRE_ROOM = register("innkeeper_hire_room"); - public static final Identifier BUILD_KINGDOM = register("build_kingdom"); - public static final Identifier UPGRADE_KINGDOM = register("upgrade_kingdom"); - public static final Identifier FOREMAN_BUY_WORKER = register("foreman_buy_worker"); - public static final Identifier FOREMAN_COLLECT = register("foreman_collect"); - public static final Identifier CITYBUILDER_ACTION = register("citybuilder_action"); + public static final CustomPayload.Id INSTANCE_SYNC = register("instance_sync"); + public static final CustomPayload.Id OPEN_CLIENT_SCREEN = register("open_client_screen"); + public static final CustomPayload.Id SIGN_CONTRACT = register("sign_contract"); + public static final CustomPayload.Id FIX_GUILD = register("fix_guild"); + public static final CustomPayload.Id TOGGLE_SELL_GUI = register("toggle_sell_gui"); + public static final CustomPayload.Id BUY_ITEM = register("buy_item"); + public static final CustomPayload.Id BANKER_INTERACT = register("banker_interact"); + public static final CustomPayload.Id HIRE_HUNTER = register("hire_hunter"); + public static final CustomPayload.Id INNKEEPER_HIRE_ROOM = register("innkeeper_hire_room"); + public static final CustomPayload.Id BUILD_KINGDOM = register("build_kingdom"); + public static final CustomPayload.Id UPGRADE_KINGDOM = register("upgrade_kingdom"); + public static final CustomPayload.Id FOREMAN_BUY_WORKER = register("foreman_buy_worker"); + public static final CustomPayload.Id FOREMAN_COLLECT = register("foreman_collect"); + public static final CustomPayload.Id CITYBUILDER_ACTION = register("citybuilder_action"); - private static Identifier register(String id) { - return new Identifier(TaleOfKingdoms.MODID, id); + private static CustomPayload.Id register(String id) { + return new CustomPayload.Id<>(Identifier.of(TaleOfKingdoms.MODID, id)); } } diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/packet/both/SignContractPacket.java b/src/main/java/com/convallyria/taleofkingdoms/common/packet/both/SignContractPacket.java new file mode 100644 index 00000000..20297e76 --- /dev/null +++ b/src/main/java/com/convallyria/taleofkingdoms/common/packet/both/SignContractPacket.java @@ -0,0 +1,19 @@ +package com.convallyria.taleofkingdoms.common.packet.both; + +import com.convallyria.taleofkingdoms.common.packet.Packets; +import net.minecraft.network.RegistryByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.codec.PacketCodecs; +import net.minecraft.network.packet.CustomPayload; + +public record SignContractPacket(boolean signed) implements CustomPayload { + + public static final PacketCodec CODEC = PacketCodec.tuple( + PacketCodecs.BOOL, SignContractPacket::signed, + SignContractPacket::new); + + @Override + public Id getId() { + return Packets.SIGN_CONTRACT; + } +} diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/packet/c2s/BankerInteractPacket.java b/src/main/java/com/convallyria/taleofkingdoms/common/packet/c2s/BankerInteractPacket.java new file mode 100644 index 00000000..df73daeb --- /dev/null +++ b/src/main/java/com/convallyria/taleofkingdoms/common/packet/c2s/BankerInteractPacket.java @@ -0,0 +1,21 @@ +package com.convallyria.taleofkingdoms.common.packet.c2s; + +import com.convallyria.taleofkingdoms.common.entity.guild.banker.BankerMethod; +import com.convallyria.taleofkingdoms.common.packet.Packets; +import net.minecraft.network.RegistryByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.codec.PacketCodecs; +import net.minecraft.network.packet.CustomPayload; + +public record BankerInteractPacket(BankerMethod method, int coins) implements CustomPayload { + + public static final PacketCodec CODEC = PacketCodec.tuple( + PacketCodecs.indexed(i -> BankerMethod.values()[i], BankerMethod::ordinal), BankerInteractPacket::method, + PacketCodecs.INTEGER, BankerInteractPacket::coins, + BankerInteractPacket::new); + + @Override + public Id getId() { + return Packets.BANKER_INTERACT; + } +} diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/packet/c2s/BuildKingdomPacket.java b/src/main/java/com/convallyria/taleofkingdoms/common/packet/c2s/BuildKingdomPacket.java new file mode 100644 index 00000000..842e5f70 --- /dev/null +++ b/src/main/java/com/convallyria/taleofkingdoms/common/packet/c2s/BuildKingdomPacket.java @@ -0,0 +1,19 @@ +package com.convallyria.taleofkingdoms.common.packet.c2s; + +import com.convallyria.taleofkingdoms.common.packet.Packets; +import net.minecraft.network.RegistryByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.codec.PacketCodecs; +import net.minecraft.network.packet.CustomPayload; + +public record BuildKingdomPacket(int entityId) implements CustomPayload { + + public static final PacketCodec CODEC = PacketCodec.tuple( + PacketCodecs.INTEGER, BuildKingdomPacket::entityId, + BuildKingdomPacket::new); + + @Override + public CustomPayload.Id getId() { + return Packets.BUILD_KINGDOM; + } +} diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/packet/c2s/BuyItemPacket.java b/src/main/java/com/convallyria/taleofkingdoms/common/packet/c2s/BuyItemPacket.java new file mode 100644 index 00000000..cb3dd30a --- /dev/null +++ b/src/main/java/com/convallyria/taleofkingdoms/common/packet/c2s/BuyItemPacket.java @@ -0,0 +1,22 @@ +package com.convallyria.taleofkingdoms.common.packet.c2s; + +import com.convallyria.taleofkingdoms.common.packet.Packets; +import com.convallyria.taleofkingdoms.common.shop.ShopParser; +import net.minecraft.network.RegistryByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.codec.PacketCodecs; +import net.minecraft.network.packet.CustomPayload; + +public record BuyItemPacket(String itemName, int count, ShopParser.GUI type) implements CustomPayload { + + public static final PacketCodec CODEC = PacketCodec.tuple( + PacketCodecs.string(128), BuyItemPacket::itemName, + PacketCodecs.INTEGER, BuyItemPacket::count, + PacketCodecs.indexed(i -> ShopParser.GUI.values()[i], ShopParser.GUI::ordinal), BuyItemPacket::type, + BuyItemPacket::new); + + @Override + public Id getId() { + return Packets.BUY_ITEM; + } +} diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/packet/c2s/CityBuilderActionPacket.java b/src/main/java/com/convallyria/taleofkingdoms/common/packet/c2s/CityBuilderActionPacket.java new file mode 100644 index 00000000..03d07757 --- /dev/null +++ b/src/main/java/com/convallyria/taleofkingdoms/common/packet/c2s/CityBuilderActionPacket.java @@ -0,0 +1,25 @@ +package com.convallyria.taleofkingdoms.common.packet.c2s; + +import com.convallyria.taleofkingdoms.common.kingdom.builds.BuildCosts; +import com.convallyria.taleofkingdoms.common.packet.Packets; +import com.convallyria.taleofkingdoms.common.packet.action.CityBuilderAction; +import net.minecraft.network.RegistryByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.codec.PacketCodecs; +import net.minecraft.network.packet.CustomPayload; + +import java.util.Optional; + +public record CityBuilderActionPacket(int entityId, CityBuilderAction action, Optional costs) implements CustomPayload { + + public static final PacketCodec CODEC = PacketCodec.tuple( + PacketCodecs.INTEGER, CityBuilderActionPacket::entityId, + PacketCodecs.indexed(i -> CityBuilderAction.values()[i], CityBuilderAction::ordinal), CityBuilderActionPacket::action, + PacketCodecs.optional(PacketCodecs.indexed(i -> BuildCosts.values()[i], BuildCosts::ordinal)), CityBuilderActionPacket::costs, + CityBuilderActionPacket::new); + + @Override + public Id getId() { + return Packets.CITYBUILDER_ACTION; + } +} diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/packet/c2s/FixGuildPacket.java b/src/main/java/com/convallyria/taleofkingdoms/common/packet/c2s/FixGuildPacket.java new file mode 100644 index 00000000..6b48945c --- /dev/null +++ b/src/main/java/com/convallyria/taleofkingdoms/common/packet/c2s/FixGuildPacket.java @@ -0,0 +1,16 @@ +package com.convallyria.taleofkingdoms.common.packet.c2s; + +import com.convallyria.taleofkingdoms.common.packet.Packets; +import net.minecraft.network.RegistryByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.packet.CustomPayload; + +public record FixGuildPacket() implements CustomPayload { + + public static final PacketCodec CODEC = PacketCodec.unit(new FixGuildPacket()); + + @Override + public Id getId() { + return Packets.FIX_GUILD; + } +} diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/packet/c2s/ForemanBuyWorkerPacket.java b/src/main/java/com/convallyria/taleofkingdoms/common/packet/c2s/ForemanBuyWorkerPacket.java new file mode 100644 index 00000000..ac9a8f62 --- /dev/null +++ b/src/main/java/com/convallyria/taleofkingdoms/common/packet/c2s/ForemanBuyWorkerPacket.java @@ -0,0 +1,19 @@ +package com.convallyria.taleofkingdoms.common.packet.c2s; + +import com.convallyria.taleofkingdoms.common.packet.Packets; +import net.minecraft.network.RegistryByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.codec.PacketCodecs; +import net.minecraft.network.packet.CustomPayload; + +public record ForemanBuyWorkerPacket(int entityId) implements CustomPayload { + + public static final PacketCodec CODEC = PacketCodec.tuple( + PacketCodecs.INTEGER, ForemanBuyWorkerPacket::entityId, + ForemanBuyWorkerPacket::new); + + @Override + public Id getId() { + return Packets.FOREMAN_BUY_WORKER; + } +} diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/packet/c2s/ForemanCollectPacket.java b/src/main/java/com/convallyria/taleofkingdoms/common/packet/c2s/ForemanCollectPacket.java new file mode 100644 index 00000000..aff41e0a --- /dev/null +++ b/src/main/java/com/convallyria/taleofkingdoms/common/packet/c2s/ForemanCollectPacket.java @@ -0,0 +1,19 @@ +package com.convallyria.taleofkingdoms.common.packet.c2s; + +import com.convallyria.taleofkingdoms.common.packet.Packets; +import net.minecraft.network.RegistryByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.codec.PacketCodecs; +import net.minecraft.network.packet.CustomPayload; + +public record ForemanCollectPacket(int entityId) implements CustomPayload { + + public static final PacketCodec CODEC = PacketCodec.tuple( + PacketCodecs.INTEGER, ForemanCollectPacket::entityId, + ForemanCollectPacket::new); + + @Override + public Id getId() { + return Packets.FOREMAN_BUY_WORKER; + } +} diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/packet/c2s/HireHunterPacket.java b/src/main/java/com/convallyria/taleofkingdoms/common/packet/c2s/HireHunterPacket.java new file mode 100644 index 00000000..f80b207b --- /dev/null +++ b/src/main/java/com/convallyria/taleofkingdoms/common/packet/c2s/HireHunterPacket.java @@ -0,0 +1,19 @@ +package com.convallyria.taleofkingdoms.common.packet.c2s; + +import com.convallyria.taleofkingdoms.common.packet.Packets; +import net.minecraft.network.RegistryByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.codec.PacketCodecs; +import net.minecraft.network.packet.CustomPayload; + +public record HireHunterPacket(boolean retire) implements CustomPayload { + + public static final PacketCodec CODEC = PacketCodec.tuple( + PacketCodecs.BOOL, HireHunterPacket::retire, + HireHunterPacket::new); + + @Override + public Id getId() { + return Packets.HIRE_HUNTER; + } +} diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/packet/c2s/InnkeeperActionPacket.java b/src/main/java/com/convallyria/taleofkingdoms/common/packet/c2s/InnkeeperActionPacket.java new file mode 100644 index 00000000..f4d5cda1 --- /dev/null +++ b/src/main/java/com/convallyria/taleofkingdoms/common/packet/c2s/InnkeeperActionPacket.java @@ -0,0 +1,19 @@ +package com.convallyria.taleofkingdoms.common.packet.c2s; + +import com.convallyria.taleofkingdoms.common.packet.Packets; +import net.minecraft.network.RegistryByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.codec.PacketCodecs; +import net.minecraft.network.packet.CustomPayload; + +public record InnkeeperActionPacket(boolean resting) implements CustomPayload { + + public static final PacketCodec CODEC = PacketCodec.tuple( + PacketCodecs.BOOL, InnkeeperActionPacket::resting, + InnkeeperActionPacket::new); + + @Override + public Id getId() { + return Packets.INNKEEPER_HIRE_ROOM; + } +} diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/packet/c2s/ToggleSellGuiPacket.java b/src/main/java/com/convallyria/taleofkingdoms/common/packet/c2s/ToggleSellGuiPacket.java new file mode 100644 index 00000000..eab71e3d --- /dev/null +++ b/src/main/java/com/convallyria/taleofkingdoms/common/packet/c2s/ToggleSellGuiPacket.java @@ -0,0 +1,21 @@ +package com.convallyria.taleofkingdoms.common.packet.c2s; + +import com.convallyria.taleofkingdoms.common.packet.Packets; +import com.convallyria.taleofkingdoms.common.shop.ShopParser; +import net.minecraft.network.RegistryByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.codec.PacketCodecs; +import net.minecraft.network.packet.CustomPayload; + +public record ToggleSellGuiPacket(boolean close, ShopParser.GUI type) implements CustomPayload { + + public static final PacketCodec CODEC = PacketCodec.tuple( + PacketCodecs.BOOL, ToggleSellGuiPacket::close, + PacketCodecs.indexed(i -> ShopParser.GUI.values()[i], ShopParser.GUI::ordinal), ToggleSellGuiPacket::type, + ToggleSellGuiPacket::new); + + @Override + public Id getId() { + return Packets.TOGGLE_SELL_GUI; + } +} diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/packet/c2s/UpgradeKingdomPacket.java b/src/main/java/com/convallyria/taleofkingdoms/common/packet/c2s/UpgradeKingdomPacket.java new file mode 100644 index 00000000..0d065030 --- /dev/null +++ b/src/main/java/com/convallyria/taleofkingdoms/common/packet/c2s/UpgradeKingdomPacket.java @@ -0,0 +1,19 @@ +package com.convallyria.taleofkingdoms.common.packet.c2s; + +import com.convallyria.taleofkingdoms.common.packet.Packets; +import net.minecraft.network.RegistryByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.codec.PacketCodecs; +import net.minecraft.network.packet.CustomPayload; + +public record UpgradeKingdomPacket(int entityId) implements CustomPayload { + + public static final PacketCodec CODEC = PacketCodec.tuple( + PacketCodecs.INTEGER, UpgradeKingdomPacket::entityId, + UpgradeKingdomPacket::new); + + @Override + public Id getId() { + return Packets.UPGRADE_KINGDOM; + } +} diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/packet/s2c/InstanceSyncPacket.java b/src/main/java/com/convallyria/taleofkingdoms/common/packet/s2c/InstanceSyncPacket.java new file mode 100644 index 00000000..6dad9aa4 --- /dev/null +++ b/src/main/java/com/convallyria/taleofkingdoms/common/packet/s2c/InstanceSyncPacket.java @@ -0,0 +1,25 @@ +package com.convallyria.taleofkingdoms.common.packet.s2c; + +import com.convallyria.taleofkingdoms.common.packet.Packets; +import com.convallyria.taleofkingdoms.common.world.ConquestInstance; +import net.minecraft.network.RegistryByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.codec.PacketCodecs; +import net.minecraft.network.packet.CustomPayload; + +public record InstanceSyncPacket(ConquestInstance instance) implements CustomPayload { + + public static final PacketCodec CODEC = PacketCodec.tuple( + PacketCodecs.codec(ConquestInstance.CODEC), sync -> { + if (sync.instance().getGuildPlayers().size() > 1) { + throw new IllegalStateException("Leaking extra guild player information!"); + } + return sync.instance(); + }, + InstanceSyncPacket::new); + + @Override + public Id getId() { + return Packets.INSTANCE_SYNC; + } +} diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/packet/s2c/OpenScreenPacket.java b/src/main/java/com/convallyria/taleofkingdoms/common/packet/s2c/OpenScreenPacket.java new file mode 100644 index 00000000..8881e9c2 --- /dev/null +++ b/src/main/java/com/convallyria/taleofkingdoms/common/packet/s2c/OpenScreenPacket.java @@ -0,0 +1,35 @@ +package com.convallyria.taleofkingdoms.common.packet.s2c; + +import com.convallyria.taleofkingdoms.common.packet.Packets; +import net.minecraft.network.RegistryByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.codec.PacketCodecs; +import net.minecraft.network.packet.CustomPayload; + +public record OpenScreenPacket(ScreenTypes type, int entityId) implements CustomPayload { + + public static final PacketCodec CODEC = PacketCodec.tuple( + PacketCodecs.indexed(i -> ScreenTypes.values()[i], ScreenTypes::ordinal), OpenScreenPacket::type, + PacketCodecs.INTEGER, OpenScreenPacket::entityId, + OpenScreenPacket::new); + + public enum ScreenTypes { + GUILD_MASTER, + BLACKSMITH, + INNKEEPER, + BANKER, + FOOD_SHOP, + ITEM_SHOP, + BLOCK_SHOP, + CITY_BUILDER_BEGIN, + CITY_BUILDER_TIER, + STOCK_MARKET, + FOREMAN, + WARDEN + } + + @Override + public Id getId() { + return Packets.OPEN_CLIENT_SCREEN; + } +} diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/schematic/Schematic.java b/src/main/java/com/convallyria/taleofkingdoms/common/schematic/Schematic.java index 8c9b543d..83aa0d98 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/schematic/Schematic.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/schematic/Schematic.java @@ -7,13 +7,13 @@ * An enum of schematics, with file paths, that are available to paste. */ public enum Schematic { - GUILD_CASTLE(new Identifier(TaleOfKingdoms.MODID, "guild/guildnew")), - TIER_1_KINGDOM(new Identifier(TaleOfKingdoms.MODID, "player_kingdom/tier_one")), - TIER_2_KINGDOM(new Identifier(TaleOfKingdoms.MODID, "player_kingdom/tier_two")), - TIER_1_BLACKSMITH_HOUSE(new Identifier(TaleOfKingdoms.MODID, "player_kingdom/blacksmith/tier_one_house_blacksmith")), + GUILD_CASTLE("guild/guildnew"), + TIER_1_KINGDOM("player_kingdom/tier_one"), + TIER_2_KINGDOM("player_kingdom/tier_two"), + TIER_1_BLACKSMITH_HOUSE("player_kingdom/blacksmith/tier_one_house_blacksmith"), TIER_1_STOCK_MARKET("player_kingdom/stock_market/tier_one_stock_market"), TIER_1_LARGE_HOUSE("player_kingdom/large_house/tier_one_large_house_new"), - TIER_1_SMALL_HOUSE(new Identifier(TaleOfKingdoms.MODID, "player_kingdom/small_house/tier_one_small_house")), + TIER_1_SMALL_HOUSE("player_kingdom/small_house/tier_one_small_house"), TIER_1_SMALL_HOUSE_VARIANT_ONE("player_kingdom/small_house/tier_one_small_house_one_new"), TIER_1_SMALL_HOUSE_VARIANT_TWO("player_kingdom/small_house/tier_one_small_house_two_new"), @@ -24,12 +24,12 @@ public enum Schematic { TIER_2_BAKE_HOUSE("player_kingdom/bake_house/tier_two_bake_house"), TIER_2_BUILDER_HOUSE("player_kingdom/builder_house/tier_two_builder_house"), TIER_2_BLOCK_SHOP("player_kingdom/block_shop/tier_two_block_shop"); - //GUILD_CASTLE_OLD(new Identifier(TaleOfKingdoms.MODID, "/assets/schematics/GuildCastle.schematic")); + //GUILD_CASTLE_OLD(Identifier.of(TaleOfKingdoms.MODID, "/assets/schematics/GuildCastle.schematic")); private final Identifier path; Schematic(String path) { - this(new Identifier(TaleOfKingdoms.MODID, path)); + this(Identifier.of(TaleOfKingdoms.MODID, path)); } Schematic(Identifier path) { diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/schematic/SchematicHandler.java b/src/main/java/com/convallyria/taleofkingdoms/common/schematic/SchematicHandler.java index b0cca256..6ff31d0c 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/schematic/SchematicHandler.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/schematic/SchematicHandler.java @@ -9,6 +9,7 @@ import net.minecraft.block.Block; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.structure.StructurePlacementData; +import net.minecraft.structure.StructureTemplate; import net.minecraft.structure.processor.JigsawReplacementStructureProcessor; import net.minecraft.util.BlockRotation; import net.minecraft.util.math.BlockBox; @@ -52,24 +53,23 @@ public CompletableFuture pasteSchematic(Schematic schematic, ServerPla } protected void pasteSchematic(Schematic schematic, ServerPlayerEntity player, BlockPos position, BlockRotation rotation, CompletableFuture cf, SchematicOptions... options) { - TaleOfKingdoms.LOGGER.info("Loading schematic, please wait: " + schematic.toString()); - player.getServerWorld().getStructureTemplateManager().getTemplate(schematic.getPath()).ifPresent(structure -> { - final boolean old = SharedConstants.isDevelopment; - SharedConstants.isDevelopment = true; // We want to crash if something went wrong - StructurePlacementData structurePlacementData = new StructurePlacementData(); - structurePlacementData.setRotation(rotation); - TaleOfKingdoms.getAPI().getConquestInstanceStorage().mostRecentInstance().ifPresent(instance -> { - final GuildPlayer guildPlayer = instance.getPlayer(player); - final PlayerKingdom kingdom = guildPlayer.getKingdom(); - if (kingdom == null) return; - structurePlacementData.addProcessor(new PlayerKingdomStructureProcessor(kingdom, player)); - }); - structurePlacementData.addProcessor(new GuildStructureProcessor(options)); - structurePlacementData.addProcessor(JigsawReplacementStructureProcessor.INSTANCE); - structure.place(player.getServerWorld(), position, position, structurePlacementData, Random.create(), Block.NOTIFY_ALL); - BlockBox box = structure.calculateBoundingBox(structurePlacementData, position); - cf.complete(box); - SharedConstants.isDevelopment = old; // Put it back to what it was. + TaleOfKingdoms.LOGGER.info("Loading schematic, please wait: {}", schematic.toString()); + final StructureTemplate structure = player.getServerWorld().getStructureTemplateManager().getTemplate(schematic.getPath()).orElseThrow(); + final boolean old = SharedConstants.isDevelopment; + SharedConstants.isDevelopment = true; // We want to crash if something went wrong + StructurePlacementData structurePlacementData = new StructurePlacementData(); + structurePlacementData.setRotation(rotation); + TaleOfKingdoms.getAPI().getConquestInstanceStorage().mostRecentInstance().ifPresent(instance -> { + final GuildPlayer guildPlayer = instance.getPlayer(player); + final PlayerKingdom kingdom = guildPlayer.getKingdom(); + if (kingdom == null) return; + structurePlacementData.addProcessor(new PlayerKingdomStructureProcessor(kingdom, player)); }); + structurePlacementData.addProcessor(new GuildStructureProcessor(options)); + structurePlacementData.addProcessor(JigsawReplacementStructureProcessor.INSTANCE); + structure.place(player.getServerWorld(), position, position, structurePlacementData, Random.create(), Block.NOTIFY_ALL); + BlockBox box = structure.calculateBoundingBox(structurePlacementData, position); + cf.complete(box); + SharedConstants.isDevelopment = old; // Put it back to what it was. } } diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/serialization/EnumCodec.java b/src/main/java/com/convallyria/taleofkingdoms/common/serialization/EnumCodec.java index 893e8ba6..07ea0189 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/serialization/EnumCodec.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/serialization/EnumCodec.java @@ -7,7 +7,7 @@ import java.util.Optional; -public record EnumCodec & EnumCodec.Values>(Class clazz) implements PrimitiveCodec { +public record EnumCodec>(Class clazz) implements PrimitiveCodec { @Override public DataResult read(DynamicOps dynamicOps, T t) { @@ -16,35 +16,21 @@ public DataResult read(DynamicOps dynamicOps, T t) { if (res.error().isPresent() || result.isEmpty()) return DataResult.error(() -> "Unable to parse EnumCodec for \"" + clazz.getSimpleName() + "\": " + (res.error().isPresent() ? res.error().get().message() : "(no error)"), Lifecycle.stable()); - Optional value = Values.getValue(clazz, result.get()); + Optional value = getValue(clazz, result.get()); return value.map(DataResult::success).orElseGet(() -> DataResult.error(() -> "Unable to parse EnumCodec for \"" + clazz.getSimpleName() + "\": Unknown enum value \"" + result.get() + "\"", Lifecycle.stable())); } @Override public T write(DynamicOps dynamicOps, E e) { - return dynamicOps.createString(e.getSerializedName()); + return dynamicOps.createString(e.name()); } - static > DataResult validate(String name, E[] enumValues) { - for (E e : enumValues) { - if (e.name().equals(name)) { - return DataResult.success(e); - } - } - return DataResult.error(() -> String.format("\"%s\" has no enum value \"%s\"!", "", name), Lifecycle.stable()); - } - - public interface Values { - - String getSerializedName(); - - static & Values> Optional getValue(Class clazz, String serializedName) { - for (E e : clazz.getEnumConstants()) { - if (e.getSerializedName().equalsIgnoreCase(serializedName)) { - return Optional.of(e); - } - } - return Optional.empty(); + static > Optional getValue(Class clazz, String serializedName) { + for (E e : clazz.getEnumConstants()) { + if (e.name().equalsIgnoreCase(serializedName)) { + return Optional.of(e); + } } + return Optional.empty(); } } \ No newline at end of file diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/shop/ShopParser.java b/src/main/java/com/convallyria/taleofkingdoms/common/shop/ShopParser.java index b66da49a..782ba6f0 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/shop/ShopParser.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/shop/ShopParser.java @@ -95,7 +95,7 @@ private boolean loadShopJson() { } private Item getItem(String name) throws ReflectiveOperationException { - return Registries.ITEM.get(new Identifier(name.toLowerCase(TaleOfKingdoms.DEFAULT_LOCALE))); + return Registries.ITEM.get(Identifier.of(name.toLowerCase(TaleOfKingdoms.DEFAULT_LOCALE))); } // Make recursive function to look for {} and split by "," diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/utils/EntityUtils.java b/src/main/java/com/convallyria/taleofkingdoms/common/utils/EntityUtils.java index a9c51dd1..7b910aa2 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/utils/EntityUtils.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/utils/EntityUtils.java @@ -21,9 +21,9 @@ public static T spawnEntity(EntityType type, ServerWorl T entity = type.create(serverWorldAccess.toServerWorld()); if (entity == null) return null; entity.refreshPositionAndAngles(pos, 0.0F, 0.0F); - entity.initialize(serverWorldAccess, serverWorldAccess.getLocalDifficulty(pos), SpawnReason.COMMAND, null, null); + entity.initialize(serverWorldAccess, serverWorldAccess.getLocalDifficulty(pos), SpawnReason.COMMAND, null); serverWorldAccess.spawnEntityAndPassengers(entity); - TaleOfKingdoms.LOGGER.debug("Spawned entity " + entity.getType().getUntranslatedName() + " " + entity + " " + entity.getX() + "," + entity.getY() + "," + entity.getZ()); + TaleOfKingdoms.LOGGER.debug("Spawned entity {} {} {},{},{}", entity.getType().getUntranslatedName(), entity, entity.getX(), entity.getY(), entity.getZ()); return entity; } } diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/utils/InventoryUtils.java b/src/main/java/com/convallyria/taleofkingdoms/common/utils/InventoryUtils.java index 68d9c765..6bdf87b6 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/utils/InventoryUtils.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/utils/InventoryUtils.java @@ -41,7 +41,7 @@ public static int getSlotWithStack(SimpleInventory inventory, ItemStack stack) { } public static boolean areItemsEqual(ItemStack stack1, ItemStack stack2) { - return stack1.getItem() == stack2.getItem() && ItemStack.canCombine(stack1, stack2); + return stack1.getItem() == stack2.getItem() && ItemStack.areItemsAndComponentsEqual(stack1, stack2); } public static int count(Inventory inventory, TagKey tag) { diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/world/ConquestInstance.java b/src/main/java/com/convallyria/taleofkingdoms/common/world/ConquestInstance.java index 1d4bdc2d..a7095ac3 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/world/ConquestInstance.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/world/ConquestInstance.java @@ -2,7 +2,6 @@ import com.convallyria.taleofkingdoms.TaleOfKingdoms; import com.convallyria.taleofkingdoms.TaleOfKingdomsAPI; -import com.convallyria.taleofkingdoms.common.translation.Translations; import com.convallyria.taleofkingdoms.common.entity.EntityTypes; import com.convallyria.taleofkingdoms.common.entity.generic.LoneVillagerEntity; import com.convallyria.taleofkingdoms.common.entity.guild.GuildMasterEntity; @@ -10,6 +9,7 @@ import com.convallyria.taleofkingdoms.common.kingdom.PlayerKingdom; import com.convallyria.taleofkingdoms.common.schematic.Schematic; import com.convallyria.taleofkingdoms.common.schematic.SchematicOptions; +import com.convallyria.taleofkingdoms.common.translation.Translations; import com.convallyria.taleofkingdoms.common.utils.EntityUtils; import com.convallyria.taleofkingdoms.common.world.guild.GuildPlayer; import com.google.gson.Gson; @@ -175,12 +175,12 @@ public boolean hasAttacked(UUID uuid) { public void attack(PlayerEntity player, ServerWorldAccess world) { if (canAttack(player)) { - TaleOfKingdoms.LOGGER.info("Initiating guild attack for player " + player.getName()); + TaleOfKingdoms.LOGGER.info("Initiating guild attack for player {}", player.getName()); EntityUtils.spawnEntity(EntityTypes.GUILDMASTER_DEFENDER, world, player.getBlockPos()); this.underAttack = true; Translations.GUILDMASTER_HELP.send(player); - Identifier gateway = new Identifier(TaleOfKingdoms.MODID, "gateway/gateway"); + Identifier gateway = Identifier.of(TaleOfKingdoms.MODID, "gateway/gateway"); world.toServerWorld().getStructureTemplateManager().getTemplate(gateway).ifPresent(structure -> { for (BlockPos reficuleAttackLocation : reficuleAttackLocations) { StructurePlacementData structurePlacementData = new StructurePlacementData(); diff --git a/src/main/java/com/convallyria/taleofkingdoms/datagen/TaleOfKingdomsModDataGeneratorEntry.java b/src/main/java/com/convallyria/taleofkingdoms/datagen/TaleOfKingdomsModDataGeneratorEntry.java index 05373eb6..dc9e7f55 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/datagen/TaleOfKingdomsModDataGeneratorEntry.java +++ b/src/main/java/com/convallyria/taleofkingdoms/datagen/TaleOfKingdomsModDataGeneratorEntry.java @@ -1,12 +1,11 @@ package com.convallyria.taleofkingdoms.datagen; import com.convallyria.taleofkingdoms.TaleOfKingdoms; -import com.convallyria.taleofkingdoms.datagen.loottables.TOKLootTableProviders; +import com.convallyria.taleofkingdoms.datagen.loottables.TOKChestLootTableGenerator; import com.convallyria.taleofkingdoms.datagen.worldgen.TaleOfKingdomsModWorldGenBootstrap; import com.convallyria.taleofkingdoms.datagen.worldgen.TaleOfKingdomsModWorldGenProvider; import net.fabricmc.fabric.api.datagen.v1.DataGeneratorEntrypoint; import net.fabricmc.fabric.api.datagen.v1.FabricDataGenerator; -import net.minecraft.data.server.loottable.LootTableProvider; import net.minecraft.registry.RegistryBuilder; import net.minecraft.registry.RegistryKeys; @@ -21,7 +20,7 @@ public void onInitializeDataGenerator(FabricDataGenerator fabricDataGenerator) { // // }; - pack.addProvider((FabricDataGenerator.Pack.Factory) TOKLootTableProviders::createVanillaProvider); + pack.addProvider(TOKChestLootTableGenerator::new); pack.addProvider(TaleOfKingdomsModWorldGenProvider::new); } diff --git a/src/main/java/com/convallyria/taleofkingdoms/datagen/loottables/TOKChestLootTableGenerator.java b/src/main/java/com/convallyria/taleofkingdoms/datagen/loottables/TOKChestLootTableGenerator.java index f1f9f321..fef3ddf2 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/datagen/loottables/TOKChestLootTableGenerator.java +++ b/src/main/java/com/convallyria/taleofkingdoms/datagen/loottables/TOKChestLootTableGenerator.java @@ -2,22 +2,30 @@ import com.convallyria.taleofkingdoms.common.item.ItemRegistry; import com.convallyria.taleofkingdoms.common.loot.TOKLootTables; -import net.minecraft.data.server.loottable.LootTableGenerator; +import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput; +import net.fabricmc.fabric.api.datagen.v1.provider.SimpleFabricLootTableProvider; import net.minecraft.item.Items; import net.minecraft.loot.LootPool; import net.minecraft.loot.LootTable; +import net.minecraft.loot.context.LootContextTypes; import net.minecraft.loot.entry.ItemEntry; import net.minecraft.loot.function.SetCountLootFunction; import net.minecraft.loot.provider.number.ConstantLootNumberProvider; import net.minecraft.loot.provider.number.UniformLootNumberProvider; -import net.minecraft.util.Identifier; +import net.minecraft.registry.RegistryKey; +import net.minecraft.registry.RegistryWrapper; +import java.util.concurrent.CompletableFuture; import java.util.function.BiConsumer; -public class TOKChestLootTableGenerator implements LootTableGenerator { +public class TOKChestLootTableGenerator extends SimpleFabricLootTableProvider { + + public TOKChestLootTableGenerator(FabricDataOutput output, CompletableFuture registryLookup) { + super(output, registryLookup, LootContextTypes.BLOCK); + } @Override - public void accept(BiConsumer exporter) { + public void accept(BiConsumer, LootTable.Builder> exporter) { exporter.accept(TOKLootTables.SMALL_BANDIT_CAMP, LootTable.builder().pool( LootPool.builder() .bonusRolls(ConstantLootNumberProvider.create(0)) diff --git a/src/main/java/com/convallyria/taleofkingdoms/datagen/loottables/TOKLootTableProviders.java b/src/main/java/com/convallyria/taleofkingdoms/datagen/loottables/TOKLootTableProviders.java deleted file mode 100644 index de4fd6b7..00000000 --- a/src/main/java/com/convallyria/taleofkingdoms/datagen/loottables/TOKLootTableProviders.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.convallyria.taleofkingdoms.datagen.loottables; - -import com.convallyria.taleofkingdoms.common.loot.TOKLootTables; -import net.minecraft.data.DataOutput; -import net.minecraft.data.server.loottable.LootTableProvider; -import net.minecraft.loot.context.LootContextTypes; - -import java.util.List; - -public class TOKLootTableProviders { - public static LootTableProvider createVanillaProvider(DataOutput output) { - return new LootTableProvider(output, TOKLootTables.getAll(), List.of(new LootTableProvider.LootTypeGenerator(TOKChestLootTableGenerator::new, LootContextTypes.CHEST))); - } -} \ No newline at end of file diff --git a/src/main/java/com/convallyria/taleofkingdoms/managers/SoundManager.java b/src/main/java/com/convallyria/taleofkingdoms/managers/SoundManager.java index 99d07da8..e9c27ae8 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/managers/SoundManager.java +++ b/src/main/java/com/convallyria/taleofkingdoms/managers/SoundManager.java @@ -22,8 +22,8 @@ public SoundManager(TaleOfKingdoms tok) { } private void addSound(TOKSound sound) { - Identifier identifier = new Identifier(TaleOfKingdoms.MODID, sound.getPath()); - TaleOfKingdoms.LOGGER.info("Loading sound: " + sound.getPath()); + Identifier identifier = Identifier.of(TaleOfKingdoms.MODID, sound.getPath()); + TaleOfKingdoms.LOGGER.info("Loading sound: {}", sound.getPath()); events.put(sound, SoundEvent.of(identifier)); } @@ -38,7 +38,7 @@ public String getName() { private void register() { events.forEach((name, event) -> { - Identifier identifier = new Identifier(TaleOfKingdoms.MODID, name.getPath()); + Identifier identifier = Identifier.of(TaleOfKingdoms.MODID, name.getPath()); Registry.register(Registries.SOUND_EVENT, identifier, event); }); } diff --git a/src/main/java/com/convallyria/taleofkingdoms/mixin/StructureTypeAccessor.java b/src/main/java/com/convallyria/taleofkingdoms/mixin/StructureTypeAccessor.java index efd5f9f0..ddb0154f 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/mixin/StructureTypeAccessor.java +++ b/src/main/java/com/convallyria/taleofkingdoms/mixin/StructureTypeAccessor.java @@ -1,6 +1,6 @@ package com.convallyria.taleofkingdoms.mixin; -import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; import net.minecraft.world.gen.structure.Structure; import net.minecraft.world.gen.structure.StructureType; import org.spongepowered.asm.mixin.Mixin; @@ -10,7 +10,7 @@ public interface StructureTypeAccessor { @Invoker - static StructureType callRegister(String id, Codec codec) { + static StructureType callRegister(String id, MapCodec codec) { throw new UnsupportedOperationException(); } } \ No newline at end of file diff --git a/src/main/java/com/convallyria/taleofkingdoms/server/TaleOfKingdomsServer.java b/src/main/java/com/convallyria/taleofkingdoms/server/TaleOfKingdomsServer.java index a1c4f39e..7a3fa46d 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/server/TaleOfKingdomsServer.java +++ b/src/main/java/com/convallyria/taleofkingdoms/server/TaleOfKingdomsServer.java @@ -1,8 +1,9 @@ package com.convallyria.taleofkingdoms.server; import com.convallyria.taleofkingdoms.TaleOfKingdoms; +import com.convallyria.taleofkingdoms.common.packet.PacketHandler; import com.convallyria.taleofkingdoms.server.listener.ServerGameInstanceListener; -import com.convallyria.taleofkingdoms.server.packet.ServerPacketHandler; +import com.convallyria.taleofkingdoms.server.packet.both.BothSignContractPacketHandler; import com.convallyria.taleofkingdoms.server.packet.incoming.IncomingBankerInteractPacketHandler; import com.convallyria.taleofkingdoms.server.packet.incoming.IncomingBuildKingdomPacket; import com.convallyria.taleofkingdoms.server.packet.incoming.IncomingBuyItemPacketHandler; @@ -12,12 +13,12 @@ import com.convallyria.taleofkingdoms.server.packet.incoming.IncomingForemanCollectPacketHandler; import com.convallyria.taleofkingdoms.server.packet.incoming.IncomingHunterPacketHandler; import com.convallyria.taleofkingdoms.server.packet.incoming.IncomingInnkeeperPacketHandler; -import com.convallyria.taleofkingdoms.server.packet.incoming.IncomingSignContractPacketHandler; import com.convallyria.taleofkingdoms.server.packet.incoming.IncomingToggleSellGuiPacketHandler; import com.convallyria.taleofkingdoms.server.packet.outgoing.OutgoingInstanceSyncPacketHandler; import com.convallyria.taleofkingdoms.server.packet.outgoing.OutgoingOpenScreenPacketHandler; import com.convallyria.taleofkingdoms.server.world.ServerConquestInstance; import net.fabricmc.api.DedicatedServerModInitializer; +import net.fabricmc.api.EnvType; public class TaleOfKingdomsServer implements DedicatedServerModInitializer { @@ -35,6 +36,8 @@ public void onInitializeServer() { } private void registerPacketHandlers() { + registerHandler(new BothSignContractPacketHandler()); + registerHandler(new IncomingBankerInteractPacketHandler()); registerHandler(new IncomingBuildKingdomPacket()); registerHandler(new IncomingBuyItemPacketHandler()); @@ -44,7 +47,6 @@ private void registerPacketHandlers() { registerHandler(new IncomingForemanCollectPacketHandler()); registerHandler(new IncomingHunterPacketHandler()); registerHandler(new IncomingInnkeeperPacketHandler()); - registerHandler(new IncomingSignContractPacketHandler()); registerHandler(new IncomingToggleSellGuiPacketHandler()); registerHandler(new OutgoingInstanceSyncPacketHandler()); @@ -55,8 +57,8 @@ private void registerListeners() { new ServerGameInstanceListener(); } - protected void registerHandler(ServerPacketHandler serverPacketHandler) { - api.registerServerHandler(serverPacketHandler); + protected void registerHandler(PacketHandler serverPacketHandler) { + api.registerPacketHandler(EnvType.SERVER, serverPacketHandler); } private void registerTasks() { diff --git a/src/main/java/com/convallyria/taleofkingdoms/server/TaleOfKingdomsServerAPI.java b/src/main/java/com/convallyria/taleofkingdoms/server/TaleOfKingdomsServerAPI.java index 61921dcb..9eebf45b 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/server/TaleOfKingdomsServerAPI.java +++ b/src/main/java/com/convallyria/taleofkingdoms/server/TaleOfKingdomsServerAPI.java @@ -2,22 +2,16 @@ import com.convallyria.taleofkingdoms.TaleOfKingdoms; import com.convallyria.taleofkingdoms.TaleOfKingdomsAPI; -import com.convallyria.taleofkingdoms.common.packet.PacketHandler; -import com.convallyria.taleofkingdoms.server.packet.ServerPacketHandler; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.server.MinecraftServer; import net.minecraft.server.dedicated.MinecraftDedicatedServer; -import net.minecraft.util.Identifier; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; import java.util.function.Consumer; @Environment(EnvType.SERVER) public class TaleOfKingdomsServerAPI extends TaleOfKingdomsAPI { - private final Map serverPacketHandlers = new ConcurrentHashMap<>(); private MinecraftDedicatedServer minecraftServer; public TaleOfKingdomsServerAPI(TaleOfKingdoms mod) { @@ -34,11 +28,6 @@ public void executeOnMain(Runnable runnable) { executeOnDedicatedServer(runnable); } - @Override - public PacketHandler getPacketHandler(Identifier packet) { - return getServerPacketHandler(packet); - } - /** * Executes a task on the dedicated server. * @param runnable task to run @@ -58,12 +47,4 @@ public void setServer(MinecraftDedicatedServer minecraftServer) { this.minecraftServer = minecraftServer; } - - public ServerPacketHandler getServerPacketHandler(Identifier identifier) { - return serverPacketHandlers.get(identifier); - } - - public void registerServerHandler(ServerPacketHandler serverPacketHandler) { - serverPacketHandlers.put(serverPacketHandler.getPacket(), serverPacketHandler); - } } diff --git a/src/main/java/com/convallyria/taleofkingdoms/server/commands/TaleOfKingdomsCommand.java b/src/main/java/com/convallyria/taleofkingdoms/server/commands/TaleOfKingdomsCommand.java index f940dcdd..a1de07b4 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/server/commands/TaleOfKingdomsCommand.java +++ b/src/main/java/com/convallyria/taleofkingdoms/server/commands/TaleOfKingdomsCommand.java @@ -16,7 +16,7 @@ public int run(CommandContext context) throws CommandSyntax Entity entity = context.getSource().getEntity(); if (entity != null) { String message = "[\"\",{\"text\":\"Tale of Kingdoms: A new Conquest\",\"bold\":true,\"underlined\":true,\"color\":\"blue\"},{\"text\":\"\\n\"},{\"text\":\"By Cotander/SamB440 & others. (hover)\",\"color\":\"blue\",\"clickEvent\":{\"action\":\"open_url\",\"value\":\"https://gitlab.com/SamB440/tale-of-kingdoms/-/blob/master/src/main/resources/fabric.mod.json\"},\"hoverEvent\":{\"action\":\"show_text\",\"contents\":[{\"text\":\"Marackai, Aksel0206, PyroPyxel, Sheepguard, michaelb229, The_KingCobra200, Krol05, BeingAmazing(Ben)#6423. Click to view full list.\"}]}},{\"text\":\"\\n\"},{\"text\":\" Take a look at our website: \",\"color\":\"gold\"},{\"text\":\"https://www.convallyria.com\",\"underlined\":true,\"color\":\"gold\",\"clickEvent\":{\"action\":\"open_url\",\"value\":\"https://www.convallyria.com\"},\"hoverEvent\":{\"action\":\"show_text\",\"contents\":[{\"text\":\"Click to view our website.\"}]}},{\"text\":\"\\n\"},{\"text\":\" Join our Discord: \",\"color\":\"gold\"},{\"text\":\"https://discord.gg/fh62mxU\",\"underlined\":true,\"color\":\"gold\",\"clickEvent\":{\"action\":\"open_url\",\"value\":\"https://discord.gg/fh62mxU\"},\"hoverEvent\":{\"action\":\"show_text\",\"contents\":[{\"text\":\"Click to join our Discord.\"}]}},{\"text\":\"\\n\"},{\"text\":\"\\n\"},{\"text\":\"Copyright (C) Convallyria 2021\",\"color\":\"gray\"}]"; - entity.sendMessage(Texts.parse(context.getSource(), TaleOfKingdoms.parse(new StringReader(message)), entity, 0)); + entity.sendMessage(Texts.parse(context.getSource(), TaleOfKingdoms.parse(new StringReader(message), entity.getRegistryManager()), entity, 0)); return 1; } return 0; diff --git a/src/main/java/com/convallyria/taleofkingdoms/server/commands/debug/TaleOfKingdomsDebugCommand.java b/src/main/java/com/convallyria/taleofkingdoms/server/commands/debug/TaleOfKingdomsDebugCommand.java index 671f99d6..24bf9f2b 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/server/commands/debug/TaleOfKingdomsDebugCommand.java +++ b/src/main/java/com/convallyria/taleofkingdoms/server/commands/debug/TaleOfKingdomsDebugCommand.java @@ -15,7 +15,7 @@ public int run(CommandContext context) throws CommandSyntax Entity entity = context.getSource().getEntity(); if (entity != null) { String message = "{\"text\":\"List of debug commands: invoke, set\"}"; - entity.sendMessage(Texts.parse(context.getSource(), TaleOfKingdoms.parse(new StringReader(message)), entity, 0)); + entity.sendMessage(Texts.parse(context.getSource(), TaleOfKingdoms.parse(new StringReader(message), entity.getRegistryManager()), entity, 0)); return 1; } return 0; diff --git a/src/main/java/com/convallyria/taleofkingdoms/server/commands/debug/TaleOfKingdomsInvokeCommand.java b/src/main/java/com/convallyria/taleofkingdoms/server/commands/debug/TaleOfKingdomsInvokeCommand.java index 625b4f10..84e4f6f9 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/server/commands/debug/TaleOfKingdomsInvokeCommand.java +++ b/src/main/java/com/convallyria/taleofkingdoms/server/commands/debug/TaleOfKingdomsInvokeCommand.java @@ -23,7 +23,7 @@ public int run(CommandContext context) throws CommandSyntax Entity entity = context.getSource().getEntity(); if (entity != null) { String message = "{\"text\":\"List of invoke events: saveVillagers, guildAttack\"}"; - entity.sendMessage(Texts.parse(context.getSource(), TaleOfKingdoms.parse(new StringReader(message)), entity, 0)); + entity.sendMessage(Texts.parse(context.getSource(), TaleOfKingdoms.parse(new StringReader(message), entity.getRegistryManager()), entity, 0)); return 1; } return 0; diff --git a/src/main/java/com/convallyria/taleofkingdoms/server/packet/ServerPacketHandler.java b/src/main/java/com/convallyria/taleofkingdoms/server/packet/ServerPacketHandler.java deleted file mode 100644 index a269d50c..00000000 --- a/src/main/java/com/convallyria/taleofkingdoms/server/packet/ServerPacketHandler.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.convallyria.taleofkingdoms.server.packet; - -import com.convallyria.taleofkingdoms.common.packet.PacketHandler; -import com.convallyria.taleofkingdoms.common.packet.context.ServerPacketContext; -import net.fabricmc.api.EnvType; -import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.util.Identifier; - -public abstract class ServerPacketHandler extends PacketHandler { - - public ServerPacketHandler(Identifier packet) { - super(packet); - } - - @Override - protected void register() { - ServerPlayNetworking.registerGlobalReceiver(this.getPacket(), (server, player, handler, buf, responseSender) -> { - ServerPacketContext context = new ServerPacketContext(EnvType.SERVER, player, server); - handleIncomingPacket(context, buf); - }); - } - - @Override - protected void sendPacket(PlayerEntity player, PacketByteBuf passedData) { - ServerPlayNetworking.send((ServerPlayerEntity) player, getPacket(), passedData); - } -} diff --git a/src/main/java/com/convallyria/taleofkingdoms/server/packet/both/BothSignContractPacketHandler.java b/src/main/java/com/convallyria/taleofkingdoms/server/packet/both/BothSignContractPacketHandler.java new file mode 100644 index 00000000..f6a6adda --- /dev/null +++ b/src/main/java/com/convallyria/taleofkingdoms/server/packet/both/BothSignContractPacketHandler.java @@ -0,0 +1,42 @@ +package com.convallyria.taleofkingdoms.server.packet.both; + +import com.convallyria.taleofkingdoms.TaleOfKingdoms; +import com.convallyria.taleofkingdoms.common.entity.EntityTypes; +import com.convallyria.taleofkingdoms.common.entity.guild.GuildMasterEntity; +import com.convallyria.taleofkingdoms.common.packet.Packets; +import com.convallyria.taleofkingdoms.common.packet.both.SignContractPacket; +import com.convallyria.taleofkingdoms.common.packet.context.PacketContext; +import com.convallyria.taleofkingdoms.common.world.guild.GuildPlayer; +import net.minecraft.entity.player.PlayerEntity; + +import java.util.Optional; + +public final class BothSignContractPacketHandler extends InOutServerPacketHandler { + + public BothSignContractPacketHandler() { + super(Packets.SIGN_CONTRACT, SignContractPacket.CODEC); + } + + @Override + public void handleIncomingPacket(PacketContext context, SignContractPacket packet) { + final boolean sign = packet.signed(); + context.taskQueue().execute(() -> TaleOfKingdoms.getAPI().getConquestInstanceStorage().mostRecentInstance().ifPresent(instance -> { + PlayerEntity player = context.player(); + Optional entity = instance.getGuildEntity(player.getWorld(), EntityTypes.GUILDMASTER); + if (entity.isEmpty()) { + TaleOfKingdoms.LOGGER.info("Rejected {}: GuildMaster entity returned null.", getPacket().toString()); + return; + } + + if (!player.getEyePos().isInRange(entity.get().getPos(), 8)) { + TaleOfKingdoms.LOGGER.info("Rejected {}: Not in range.", getPacket().toString()); + return; + } + + final GuildPlayer guildPlayer = instance.getPlayer(player); + TaleOfKingdoms.LOGGER.info("Handling contract sign for player {}: {}", player.getUuid(), sign); + guildPlayer.setSignedContract(sign); + this.sendPacket(player, new SignContractPacket(true)); + })); + } +} diff --git a/src/main/java/com/convallyria/taleofkingdoms/server/packet/both/InOutServerPacketHandler.java b/src/main/java/com/convallyria/taleofkingdoms/server/packet/both/InOutServerPacketHandler.java new file mode 100644 index 00000000..4a1561de --- /dev/null +++ b/src/main/java/com/convallyria/taleofkingdoms/server/packet/both/InOutServerPacketHandler.java @@ -0,0 +1,33 @@ +package com.convallyria.taleofkingdoms.server.packet.both; + +import com.convallyria.taleofkingdoms.common.packet.PacketHandler; +import com.convallyria.taleofkingdoms.common.packet.context.ServerPacketContext; +import net.fabricmc.api.EnvType; +import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry; +import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.network.RegistryByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.packet.CustomPayload; + +public abstract class InOutServerPacketHandler extends PacketHandler { + + public InOutServerPacketHandler(CustomPayload.Id packet, PacketCodec codec) { + super(packet, codec); + } + + @Override + protected void register() { + PayloadTypeRegistry.playC2S().register(this.getPacket(), codec); + PayloadTypeRegistry.playS2C().register(this.getPacket(), codec); + ServerPlayNetworking.registerGlobalReceiver(this.getPacket(), (payload, ctx) -> { + ServerPacketContext context = new ServerPacketContext(EnvType.SERVER, ctx.player(), ctx.player().getServer()); + handleIncomingPacket(context, payload); + }); + } + + @Override + public void sendPacket(PlayerEntity player, T packet) { + throw new UnsupportedOperationException(); + } +} diff --git a/src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/InServerPacketHandler.java b/src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/InServerPacketHandler.java new file mode 100644 index 00000000..d0a6d455 --- /dev/null +++ b/src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/InServerPacketHandler.java @@ -0,0 +1,32 @@ +package com.convallyria.taleofkingdoms.server.packet.incoming; + +import com.convallyria.taleofkingdoms.common.packet.PacketHandler; +import com.convallyria.taleofkingdoms.common.packet.context.ServerPacketContext; +import net.fabricmc.api.EnvType; +import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry; +import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.network.RegistryByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.packet.CustomPayload; + +public abstract class InServerPacketHandler extends PacketHandler { + + public InServerPacketHandler(CustomPayload.Id packet, PacketCodec codec) { + super(packet, codec); + } + + @Override + protected void register() { + PayloadTypeRegistry.playC2S().register(this.getPacket(), codec); + ServerPlayNetworking.registerGlobalReceiver(this.getPacket(), (payload, ctx) -> { + ServerPacketContext context = new ServerPacketContext(EnvType.SERVER, ctx.player(), ctx.player().getServer()); + handleIncomingPacket(context, payload); + }); + } + + @Override + public void sendPacket(PlayerEntity player, T packet) { + throw new UnsupportedOperationException(); + } +} diff --git a/src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/IncomingBankerInteractPacketHandler.java b/src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/IncomingBankerInteractPacketHandler.java index 5f0734f0..932daeab 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/IncomingBankerInteractPacketHandler.java +++ b/src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/IncomingBankerInteractPacketHandler.java @@ -5,32 +5,27 @@ import com.convallyria.taleofkingdoms.common.entity.guild.BankerEntity; import com.convallyria.taleofkingdoms.common.entity.guild.banker.BankerMethod; import com.convallyria.taleofkingdoms.common.packet.Packets; +import com.convallyria.taleofkingdoms.common.packet.c2s.BankerInteractPacket; import com.convallyria.taleofkingdoms.common.packet.context.PacketContext; import com.convallyria.taleofkingdoms.common.world.guild.GuildPlayer; -import com.convallyria.taleofkingdoms.server.packet.ServerPacketHandler; import com.convallyria.taleofkingdoms.server.world.ServerConquestInstance; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.network.PacketByteBuf; import net.minecraft.server.network.ServerPlayerEntity; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import java.util.Optional; import java.util.UUID; -public final class IncomingBankerInteractPacketHandler extends ServerPacketHandler { +public final class IncomingBankerInteractPacketHandler extends InServerPacketHandler { public IncomingBankerInteractPacketHandler() { - super(Packets.BANKER_INTERACT); + super(Packets.BANKER_INTERACT, BankerInteractPacket.CODEC); } @Override - public void handleIncomingPacket(PacketContext context, PacketByteBuf attachedData) { + public void handleIncomingPacket(PacketContext context, BankerInteractPacket packet) { ServerPlayerEntity player = (ServerPlayerEntity) context.player(); UUID uuid = player.getUuid(); - BankerMethod method = attachedData.readEnumConstant(BankerMethod.class); - int coins = attachedData.readInt(); context.taskQueue().execute(() -> TaleOfKingdoms.getAPI().getConquestInstanceStorage().mostRecentInstance().ifPresent(instance -> { + final int coins = packet.coins(); if (!instance.isInGuild(player)) { reject(player, "Not in guild."); return; @@ -49,7 +44,7 @@ public void handleIncomingPacket(PacketContext context, PacketByteBuf attachedDa return; } - if (method == BankerMethod.DEPOSIT) { + if (packet.method() == BankerMethod.DEPOSIT) { if (guildPlayer.getCoins() < coins) { reject(player, "Not enough coins."); return; @@ -67,9 +62,4 @@ public void handleIncomingPacket(PacketContext context, PacketByteBuf attachedDa ServerConquestInstance.sync(player, instance); })); } - - @Override - public void handleOutgoingPacket(@NotNull PlayerEntity player, @Nullable Object... data) { - throw new IllegalArgumentException("Not supported"); - } } diff --git a/src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/IncomingBuildKingdomPacket.java b/src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/IncomingBuildKingdomPacket.java index 62c12564..d8ba6bff 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/IncomingBuildKingdomPacket.java +++ b/src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/IncomingBuildKingdomPacket.java @@ -6,31 +6,27 @@ import com.convallyria.taleofkingdoms.common.kingdom.PlayerKingdom; import com.convallyria.taleofkingdoms.common.kingdom.poi.KingdomPOI; import com.convallyria.taleofkingdoms.common.packet.Packets; +import com.convallyria.taleofkingdoms.common.packet.c2s.BuildKingdomPacket; import com.convallyria.taleofkingdoms.common.packet.context.PacketContext; import com.convallyria.taleofkingdoms.common.schematic.Schematic; import com.convallyria.taleofkingdoms.common.world.guild.GuildPlayer; -import com.convallyria.taleofkingdoms.server.packet.ServerPacketHandler; import com.convallyria.taleofkingdoms.server.world.ServerConquestInstance; import net.minecraft.entity.Entity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.network.PacketByteBuf; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3i; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -public final class IncomingBuildKingdomPacket extends ServerPacketHandler { +public final class IncomingBuildKingdomPacket extends InServerPacketHandler { public IncomingBuildKingdomPacket() { - super(Packets.BUILD_KINGDOM); + super(Packets.BUILD_KINGDOM, BuildKingdomPacket.CODEC); } @Override - public void handleIncomingPacket(PacketContext context, PacketByteBuf attachedData) { + public void handleIncomingPacket(PacketContext context, BuildKingdomPacket packet) { ServerPlayerEntity player = (ServerPlayerEntity) context.player(); - final int entityId = attachedData.readInt(); + final int entityId = packet.entityId(); context.taskQueue().execute(() -> { final TaleOfKingdomsAPI api = TaleOfKingdoms.getAPI(); api.getConquestInstanceStorage().mostRecentInstance().ifPresent(instance -> { @@ -81,9 +77,4 @@ public void handleIncomingPacket(PacketContext context, PacketByteBuf attachedDa }); }); } - - @Override - public void handleOutgoingPacket(@NotNull PlayerEntity player, @Nullable Object... data) { - throw new IllegalArgumentException("Not supported"); - } } diff --git a/src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/IncomingBuyItemPacketHandler.java b/src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/IncomingBuyItemPacketHandler.java index 450669de..117537d2 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/IncomingBuyItemPacketHandler.java +++ b/src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/IncomingBuyItemPacketHandler.java @@ -4,34 +4,30 @@ import com.convallyria.taleofkingdoms.common.entity.EntityTypes; import com.convallyria.taleofkingdoms.common.entity.ShopEntity; import com.convallyria.taleofkingdoms.common.packet.Packets; +import com.convallyria.taleofkingdoms.common.packet.c2s.BuyItemPacket; import com.convallyria.taleofkingdoms.common.packet.context.PacketContext; import com.convallyria.taleofkingdoms.common.shop.ShopItem; import com.convallyria.taleofkingdoms.common.shop.ShopParser; import com.convallyria.taleofkingdoms.common.world.guild.GuildPlayer; -import com.convallyria.taleofkingdoms.server.packet.ServerPacketHandler; import com.convallyria.taleofkingdoms.server.world.ServerConquestInstance; -import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; -import net.minecraft.network.PacketByteBuf; import net.minecraft.registry.Registries; import net.minecraft.server.network.ServerPlayerEntity; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import java.util.Optional; -public final class IncomingBuyItemPacketHandler extends ServerPacketHandler { +public final class IncomingBuyItemPacketHandler extends InServerPacketHandler { public IncomingBuyItemPacketHandler() { - super(Packets.BUY_ITEM); + super(Packets.BUY_ITEM, BuyItemPacket.CODEC); } @Override - public void handleIncomingPacket(PacketContext context, PacketByteBuf attachedData) { + public void handleIncomingPacket(PacketContext context, BuyItemPacket packet) { ServerPlayerEntity player = (ServerPlayerEntity) context.player(); - String itemName = attachedData.readString(128); - int count = attachedData.readInt(); - ShopParser.GUI type = attachedData.readEnumConstant(ShopParser.GUI.class); + String itemName = packet.itemName(); + int count = packet.count(); + ShopParser.GUI type = packet.type(); context.taskQueue().execute(() -> TaleOfKingdoms.getAPI().getConquestInstanceStorage().mostRecentInstance().ifPresent(instance -> { if (!instance.isInGuild(player)) { reject(player, "Not in guild."); @@ -71,11 +67,6 @@ public void handleIncomingPacket(PacketContext context, PacketByteBuf attachedDa })); } - @Override - public void handleOutgoingPacket(@NotNull PlayerEntity player, @Nullable Object... data) { - throw new IllegalArgumentException("Not supported"); - } - private ShopItem getShopItem(String name, ShopEntity entity) { for (ShopItem shopItem : entity.getShopItems()) { if (Registries.ITEM.getId(shopItem.getItem().asItem()).toString().equals(name)) return shopItem; diff --git a/src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/IncomingCityBuilderActionPacketHandler.java b/src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/IncomingCityBuilderActionPacketHandler.java index 8247d6ff..e44b9fee 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/IncomingCityBuilderActionPacketHandler.java +++ b/src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/IncomingCityBuilderActionPacketHandler.java @@ -6,35 +6,27 @@ import com.convallyria.taleofkingdoms.common.kingdom.builds.BuildCosts; import com.convallyria.taleofkingdoms.common.packet.Packets; import com.convallyria.taleofkingdoms.common.packet.action.CityBuilderAction; +import com.convallyria.taleofkingdoms.common.packet.c2s.CityBuilderActionPacket; import com.convallyria.taleofkingdoms.common.packet.context.PacketContext; import com.convallyria.taleofkingdoms.common.world.guild.GuildPlayer; -import com.convallyria.taleofkingdoms.server.packet.ServerPacketHandler; import com.convallyria.taleofkingdoms.server.world.ServerConquestInstance; import net.minecraft.entity.Entity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.network.PacketByteBuf; import net.minecraft.server.network.ServerPlayerEntity; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -public final class IncomingCityBuilderActionPacketHandler extends ServerPacketHandler { +import java.util.Optional; + +public final class IncomingCityBuilderActionPacketHandler extends InServerPacketHandler { public IncomingCityBuilderActionPacketHandler() { - super(Packets.CITYBUILDER_ACTION); + super(Packets.CITYBUILDER_ACTION, CityBuilderActionPacket.CODEC); } @Override - public void handleIncomingPacket(PacketContext context, PacketByteBuf attachedData) { - ServerPlayerEntity player = (ServerPlayerEntity) context.player(); - int entityId = attachedData.readInt(); - CityBuilderAction action = attachedData.readEnumConstant(CityBuilderAction.class); - BuildCosts buildCosts; - if (action == CityBuilderAction.BUILD && attachedData.isReadable()) { - buildCosts = attachedData.readEnumConstant(BuildCosts.class); - } else { - buildCosts = null; - } - + public void handleIncomingPacket(PacketContext context, CityBuilderActionPacket packet) { + final ServerPlayerEntity player = (ServerPlayerEntity) context.player(); + final int entityId = packet.entityId(); + final CityBuilderAction action = packet.action(); + final Optional buildCosts = packet.costs(); context.taskQueue().execute(() -> TaleOfKingdoms.getAPI().getConquestInstanceStorage().mostRecentInstance().ifPresent(instance -> { final Entity entityById = player.getWorld().getEntityById(entityId); if (!(entityById instanceof CityBuilderEntity cityBuilderEntity) || entityById.distanceTo(player) > 5) { @@ -64,29 +56,24 @@ public void handleIncomingPacket(PacketContext context, PacketByteBuf attachedDa case GIVE_64_STONE -> cityBuilderEntity.give64stone(player); case FIX_KINGDOM -> cityBuilderEntity.fixKingdom(player, kingdom); case BUILD -> { - if (buildCosts == null) { + if (buildCosts.isEmpty()) { reject(player, "Invalid build cost"); return; } - if (cityBuilderEntity.getWood() < buildCosts.getWood() || cityBuilderEntity.getStone() < buildCosts.getStone()) { + if (cityBuilderEntity.getWood() < buildCosts.get().getWood() || cityBuilderEntity.getStone() < buildCosts.get().getStone()) { reject(player, "Not enough resources"); return; } - if (kingdom.getTier() != buildCosts.getTier()) { + if (kingdom.getTier() != buildCosts.get().getTier()) { reject(player, "Invalid build for tier"); return; } - cityBuilderEntity.build(player, buildCosts, kingdom).thenAccept((v) -> ServerConquestInstance.sync(player, instance)); + cityBuilderEntity.build(player, buildCosts.get(), kingdom).thenAccept((v) -> ServerConquestInstance.sync(player, instance)); } } })); } - - @Override - public void handleOutgoingPacket(@NotNull PlayerEntity player, @Nullable Object... data) { - throw new IllegalArgumentException("Not supported"); - } } diff --git a/src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/IncomingFixGuildPacketHandler.java b/src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/IncomingFixGuildPacketHandler.java index 6f35aded..4b42dbff 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/IncomingFixGuildPacketHandler.java +++ b/src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/IncomingFixGuildPacketHandler.java @@ -3,33 +3,29 @@ import com.convallyria.taleofkingdoms.TaleOfKingdoms; import com.convallyria.taleofkingdoms.TaleOfKingdomsAPI; import com.convallyria.taleofkingdoms.common.packet.Packets; +import com.convallyria.taleofkingdoms.common.packet.c2s.FixGuildPacket; import com.convallyria.taleofkingdoms.common.packet.context.PacketContext; import com.convallyria.taleofkingdoms.common.schematic.SchematicOptions; import com.convallyria.taleofkingdoms.common.utils.InventoryUtils; import com.convallyria.taleofkingdoms.common.world.guild.GuildPlayer; -import com.convallyria.taleofkingdoms.server.packet.ServerPacketHandler; import com.convallyria.taleofkingdoms.server.world.ServerConquestInstance; -import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; -import net.minecraft.network.PacketByteBuf; import net.minecraft.registry.tag.ItemTags; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.text.Text; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -public final class IncomingFixGuildPacketHandler extends ServerPacketHandler { +public final class IncomingFixGuildPacketHandler extends InServerPacketHandler { private long lastRebuild; public IncomingFixGuildPacketHandler() { - super(Packets.FIX_GUILD); + super(Packets.FIX_GUILD, FixGuildPacket.CODEC); } @Override - public void handleIncomingPacket(PacketContext context, PacketByteBuf attachedData) { + public void handleIncomingPacket(PacketContext context, FixGuildPacket packet) { ServerPlayerEntity player = (ServerPlayerEntity) context.player(); String playerContext = getPacket().toString() + " @ <" + player.getName().getString() + ":" + player.getIp() + ">"; final TaleOfKingdomsAPI api = TaleOfKingdoms.getAPI(); @@ -69,9 +65,4 @@ public void handleIncomingPacket(PacketContext context, PacketByteBuf attachedDa this.lastRebuild = System.currentTimeMillis(); })); } - - @Override - public void handleOutgoingPacket(@NotNull PlayerEntity player, @Nullable Object... data) { - throw new IllegalArgumentException("Not supported"); - } } diff --git a/src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/IncomingForemanBuyWorkerPacketHandler.java b/src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/IncomingForemanBuyWorkerPacketHandler.java index 2942eefa..5ffef6df 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/IncomingForemanBuyWorkerPacketHandler.java +++ b/src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/IncomingForemanBuyWorkerPacketHandler.java @@ -3,25 +3,21 @@ import com.convallyria.taleofkingdoms.TaleOfKingdoms; import com.convallyria.taleofkingdoms.common.entity.kingdom.ForemanEntity; import com.convallyria.taleofkingdoms.common.packet.Packets; +import com.convallyria.taleofkingdoms.common.packet.c2s.ForemanBuyWorkerPacket; import com.convallyria.taleofkingdoms.common.packet.context.PacketContext; -import com.convallyria.taleofkingdoms.server.packet.ServerPacketHandler; import net.minecraft.entity.Entity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.network.PacketByteBuf; import net.minecraft.server.network.ServerPlayerEntity; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -public final class IncomingForemanBuyWorkerPacketHandler extends ServerPacketHandler { +public final class IncomingForemanBuyWorkerPacketHandler extends InServerPacketHandler { public IncomingForemanBuyWorkerPacketHandler() { - super(Packets.FOREMAN_BUY_WORKER); + super(Packets.FOREMAN_BUY_WORKER, ForemanBuyWorkerPacket.CODEC); } @Override - public void handleIncomingPacket(PacketContext context, PacketByteBuf attachedData) { + public void handleIncomingPacket(PacketContext context, ForemanBuyWorkerPacket packet) { ServerPlayerEntity player = (ServerPlayerEntity) context.player(); - int entityId = attachedData.readInt(); + int entityId = packet.entityId(); context.taskQueue().execute(() -> TaleOfKingdoms.getAPI().getConquestInstanceStorage().mostRecentInstance().ifPresent(instance -> { final Entity entityById = player.getWorld().getEntityById(entityId); if (!(entityById instanceof ForemanEntity foremanEntity) || entityById.distanceTo(player) > 5) { @@ -32,9 +28,4 @@ public void handleIncomingPacket(PacketContext context, PacketByteBuf attachedDa foremanEntity.buyWorker(player, instance); })); } - - @Override - public void handleOutgoingPacket(@NotNull PlayerEntity player, @Nullable Object... data) { - throw new IllegalArgumentException("Not supported"); - } } diff --git a/src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/IncomingForemanCollectPacketHandler.java b/src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/IncomingForemanCollectPacketHandler.java index 1ca014f7..4e97d076 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/IncomingForemanCollectPacketHandler.java +++ b/src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/IncomingForemanCollectPacketHandler.java @@ -4,26 +4,22 @@ import com.convallyria.taleofkingdoms.common.entity.kingdom.ForemanEntity; import com.convallyria.taleofkingdoms.common.entity.kingdom.workers.QuarryForemanEntity; import com.convallyria.taleofkingdoms.common.packet.Packets; +import com.convallyria.taleofkingdoms.common.packet.c2s.ForemanCollectPacket; import com.convallyria.taleofkingdoms.common.packet.context.PacketContext; -import com.convallyria.taleofkingdoms.server.packet.ServerPacketHandler; import net.minecraft.entity.Entity; -import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.Items; -import net.minecraft.network.PacketByteBuf; import net.minecraft.server.network.ServerPlayerEntity; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -public final class IncomingForemanCollectPacketHandler extends ServerPacketHandler { +public final class IncomingForemanCollectPacketHandler extends InServerPacketHandler { public IncomingForemanCollectPacketHandler() { - super(Packets.FOREMAN_COLLECT); + super(Packets.FOREMAN_COLLECT, ForemanCollectPacket.CODEC); } @Override - public void handleIncomingPacket(PacketContext context, PacketByteBuf attachedData) { + public void handleIncomingPacket(PacketContext context, ForemanCollectPacket packet) { ServerPlayerEntity player = (ServerPlayerEntity) context.player(); - int entityId = attachedData.readInt(); + int entityId = packet.entityId(); context.taskQueue().execute(() -> TaleOfKingdoms.getAPI().getConquestInstanceStorage().mostRecentInstance().ifPresent(instance -> { final Entity entityById = player.getWorld().getEntityById(entityId); if (!(entityById instanceof ForemanEntity foremanEntity) || entityById.distanceTo(player) > 5) { @@ -34,9 +30,4 @@ public void handleIncomingPacket(PacketContext context, PacketByteBuf attachedDa foremanEntity.collect64(player, entityById instanceof QuarryForemanEntity ? Items.COBBLESTONE : Items.OAK_LOG); })); } - - @Override - public void handleOutgoingPacket(@NotNull PlayerEntity player, @Nullable Object... data) { - throw new IllegalArgumentException("Not supported"); - } } diff --git a/src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/IncomingHunterPacketHandler.java b/src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/IncomingHunterPacketHandler.java index 162f1e0a..0bbf2e57 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/IncomingHunterPacketHandler.java +++ b/src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/IncomingHunterPacketHandler.java @@ -5,34 +5,30 @@ import com.convallyria.taleofkingdoms.common.entity.generic.HunterEntity; import com.convallyria.taleofkingdoms.common.entity.guild.GuildMasterEntity; import com.convallyria.taleofkingdoms.common.packet.Packets; +import com.convallyria.taleofkingdoms.common.packet.c2s.HireHunterPacket; import com.convallyria.taleofkingdoms.common.packet.context.PacketContext; import com.convallyria.taleofkingdoms.common.utils.EntityUtils; import com.convallyria.taleofkingdoms.common.world.guild.GuildPlayer; import com.convallyria.taleofkingdoms.server.TaleOfKingdomsServer; -import com.convallyria.taleofkingdoms.server.packet.ServerPacketHandler; import com.convallyria.taleofkingdoms.server.world.ServerConquestInstance; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.entity.Entity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.network.PacketByteBuf; import net.minecraft.server.network.ServerPlayerEntity; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import java.util.Optional; @Environment(EnvType.SERVER) -public final class IncomingHunterPacketHandler extends ServerPacketHandler { +public final class IncomingHunterPacketHandler extends InServerPacketHandler { public IncomingHunterPacketHandler() { - super(Packets.HIRE_HUNTER); + super(Packets.HIRE_HUNTER, HireHunterPacket.CODEC); } @Override - public void handleIncomingPacket(PacketContext context, PacketByteBuf attachedData) { + public void handleIncomingPacket(PacketContext context, HireHunterPacket packet) { ServerPlayerEntity player = (ServerPlayerEntity) context.player(); - boolean retire = attachedData.readBoolean(); + boolean retire = packet.retire(); context.taskQueue().execute(() -> TaleOfKingdoms.getAPI().getConquestInstanceStorage().mostRecentInstance().ifPresent(instance -> { final GuildPlayer guildPlayer = instance.getPlayer(player); if (!instance.isInGuild(player)) { @@ -83,9 +79,4 @@ public void handleIncomingPacket(PacketContext context, PacketByteBuf attachedDa ServerConquestInstance.sync(player, instance); })); } - - @Override - public void handleOutgoingPacket(@NotNull PlayerEntity player, @Nullable Object... data) { - throw new IllegalArgumentException("Not supported"); - } } diff --git a/src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/IncomingInnkeeperPacketHandler.java b/src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/IncomingInnkeeperPacketHandler.java index e9bf19ed..204310fb 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/IncomingInnkeeperPacketHandler.java +++ b/src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/IncomingInnkeeperPacketHandler.java @@ -4,39 +4,33 @@ import com.convallyria.taleofkingdoms.common.entity.EntityTypes; import com.convallyria.taleofkingdoms.common.entity.guild.InnkeeperEntity; import com.convallyria.taleofkingdoms.common.packet.Packets; +import com.convallyria.taleofkingdoms.common.packet.c2s.InnkeeperActionPacket; import com.convallyria.taleofkingdoms.common.packet.context.PacketContext; import com.convallyria.taleofkingdoms.common.utils.BlockUtils; import com.convallyria.taleofkingdoms.common.world.guild.GuildPlayer; import com.convallyria.taleofkingdoms.server.TaleOfKingdomsServer; -import com.convallyria.taleofkingdoms.server.packet.ServerPacketHandler; import com.convallyria.taleofkingdoms.server.world.ServerConquestInstance; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.entity.effect.StatusEffectInstance; import net.minecraft.entity.effect.StatusEffects; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.network.PacketByteBuf; import net.minecraft.server.MinecraftServer; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.util.math.BlockPos; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import java.util.Optional; -import java.util.UUID; @Environment(EnvType.SERVER) -public final class IncomingInnkeeperPacketHandler extends ServerPacketHandler { +public final class IncomingInnkeeperPacketHandler extends InServerPacketHandler { public IncomingInnkeeperPacketHandler() { - super(Packets.INNKEEPER_HIRE_ROOM); + super(Packets.INNKEEPER_HIRE_ROOM, InnkeeperActionPacket.CODEC); } @Override - public void handleIncomingPacket(PacketContext context, PacketByteBuf attachedData) { + public void handleIncomingPacket(PacketContext context, InnkeeperActionPacket packet) { ServerPlayerEntity player = (ServerPlayerEntity) context.player(); - UUID uuid = player.getUuid(); - boolean resting = attachedData.readBoolean(); + boolean resting = packet.resting(); context.taskQueue().execute(() -> TaleOfKingdoms.getAPI().getConquestInstanceStorage().mostRecentInstance().ifPresent(instance -> { if (!instance.isInGuild(player)) { reject(player, "Not in guild."); @@ -85,9 +79,4 @@ public void handleIncomingPacket(PacketContext context, PacketByteBuf attachedDa ServerConquestInstance.sync(player, instance); })); } - - @Override - public void handleOutgoingPacket(@NotNull PlayerEntity player, @Nullable Object... data) { - throw new IllegalArgumentException("Not supported"); - } } diff --git a/src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/IncomingSignContractPacketHandler.java b/src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/IncomingSignContractPacketHandler.java deleted file mode 100644 index a3fff3b7..00000000 --- a/src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/IncomingSignContractPacketHandler.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.convallyria.taleofkingdoms.server.packet.incoming; - -import com.convallyria.taleofkingdoms.TaleOfKingdoms; -import com.convallyria.taleofkingdoms.common.entity.EntityTypes; -import com.convallyria.taleofkingdoms.common.entity.guild.GuildMasterEntity; -import com.convallyria.taleofkingdoms.common.packet.Packets; -import com.convallyria.taleofkingdoms.common.packet.context.PacketContext; -import com.convallyria.taleofkingdoms.common.world.guild.GuildPlayer; -import com.convallyria.taleofkingdoms.server.packet.ServerPacketHandler; -import io.netty.buffer.Unpooled; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.network.PacketByteBuf; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.Optional; - -public final class IncomingSignContractPacketHandler extends ServerPacketHandler { - - public IncomingSignContractPacketHandler() { - super(Packets.SIGN_CONTRACT); - } - - @Override - public void handleIncomingPacket(PacketContext context, PacketByteBuf attachedData) { - boolean sign = attachedData.readBoolean(); - context.taskQueue().execute(() -> TaleOfKingdoms.getAPI().getConquestInstanceStorage().mostRecentInstance().ifPresent(instance -> { - PlayerEntity player = context.player(); - Optional entity = instance.getGuildEntity(player.getWorld(), EntityTypes.GUILDMASTER); - if (entity.isEmpty()) { - TaleOfKingdoms.LOGGER.info("Rejected " + getPacket().toString() + ": GuildMaster entity returned null."); - return; - } - - if (!player.getEyePos().isInRange(entity.get().getPos(), 8)) { - TaleOfKingdoms.LOGGER.info("Rejected " + getPacket().toString() + ": Not in range."); - return; - } - - final GuildPlayer guildPlayer = instance.getPlayer(player); - TaleOfKingdoms.LOGGER.info("Handling contract sign for player " + player.getUuid() + ": " + sign); - guildPlayer.setSignedContract(sign); - this.handleOutgoingPacket(player, true); - })); - } - - @Override - public void handleOutgoingPacket(@NotNull PlayerEntity player, @Nullable Object... data) { - if (data != null && data[0] instanceof Boolean) { - boolean sign = (Boolean) data[0]; - PacketByteBuf passedData = new PacketByteBuf(Unpooled.buffer()); - passedData.writeBoolean(sign); - sendPacket(player, passedData); - } - } -} diff --git a/src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/IncomingToggleSellGuiPacketHandler.java b/src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/IncomingToggleSellGuiPacketHandler.java index 1603c5a6..771a9b43 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/IncomingToggleSellGuiPacketHandler.java +++ b/src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/IncomingToggleSellGuiPacketHandler.java @@ -5,32 +5,28 @@ import com.convallyria.taleofkingdoms.common.entity.EntityTypes; import com.convallyria.taleofkingdoms.common.entity.ShopEntity; import com.convallyria.taleofkingdoms.common.packet.Packets; +import com.convallyria.taleofkingdoms.common.packet.c2s.ToggleSellGuiPacket; import com.convallyria.taleofkingdoms.common.packet.context.PacketContext; import com.convallyria.taleofkingdoms.common.shop.ShopParser; -import com.convallyria.taleofkingdoms.server.packet.ServerPacketHandler; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.network.PacketByteBuf; import net.minecraft.screen.NamedScreenHandlerFactory; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.util.math.BlockPos; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import java.util.Optional; -public final class IncomingToggleSellGuiPacketHandler extends ServerPacketHandler { +public final class IncomingToggleSellGuiPacketHandler extends InServerPacketHandler { public IncomingToggleSellGuiPacketHandler() { - super(Packets.TOGGLE_SELL_GUI); + super(Packets.TOGGLE_SELL_GUI, ToggleSellGuiPacket.CODEC); } @Override - public void handleIncomingPacket(PacketContext context, PacketByteBuf attachedData) { + public void handleIncomingPacket(PacketContext context, ToggleSellGuiPacket packet) { ServerPlayerEntity player = (ServerPlayerEntity) context.player(); - boolean close = attachedData.readBoolean(); - ShopParser.GUI type = attachedData.readEnumConstant(ShopParser.GUI.class); + boolean close = packet.close(); + ShopParser.GUI type = packet.type(); context.taskQueue().execute(() -> { final TaleOfKingdomsAPI api = TaleOfKingdoms.getAPI(); api.getConquestInstanceStorage().mostRecentInstance().ifPresent(instance -> { @@ -71,9 +67,4 @@ public void handleIncomingPacket(PacketContext context, PacketByteBuf attachedDa }); }); } - - @Override - public void handleOutgoingPacket(@NotNull PlayerEntity player, @Nullable Object... data) { - throw new IllegalArgumentException("Not supported"); - } } diff --git a/src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/IncomingUpgradeKingdomPacketHandler.java b/src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/IncomingUpgradeKingdomPacketHandler.java new file mode 100644 index 00000000..ef9d4727 --- /dev/null +++ b/src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/IncomingUpgradeKingdomPacketHandler.java @@ -0,0 +1,25 @@ +package com.convallyria.taleofkingdoms.server.packet.incoming; + +import com.convallyria.taleofkingdoms.TaleOfKingdoms; +import com.convallyria.taleofkingdoms.common.packet.Packets; +import com.convallyria.taleofkingdoms.common.packet.c2s.UpgradeKingdomPacket; +import com.convallyria.taleofkingdoms.common.packet.context.PacketContext; +import net.minecraft.server.network.ServerPlayerEntity; + +import java.util.UUID; + +public final class IncomingUpgradeKingdomPacketHandler extends InServerPacketHandler { + + public IncomingUpgradeKingdomPacketHandler() { + super(Packets.UPGRADE_KINGDOM, UpgradeKingdomPacket.CODEC); + } + + @Override + public void handleIncomingPacket(PacketContext context, UpgradeKingdomPacket packet) { + ServerPlayerEntity player = (ServerPlayerEntity) context.player(); + UUID uuid = player.getUuid(); + context.taskQueue().execute(() -> TaleOfKingdoms.getAPI().getConquestInstanceStorage().mostRecentInstance().ifPresent(instance -> { + throw new UnsupportedOperationException(); + })); + } +} diff --git a/src/main/java/com/convallyria/taleofkingdoms/server/packet/outgoing/OutServerPacketHandler.java b/src/main/java/com/convallyria/taleofkingdoms/server/packet/outgoing/OutServerPacketHandler.java new file mode 100644 index 00000000..82d0f40d --- /dev/null +++ b/src/main/java/com/convallyria/taleofkingdoms/server/packet/outgoing/OutServerPacketHandler.java @@ -0,0 +1,36 @@ +package com.convallyria.taleofkingdoms.server.packet.outgoing; + +import com.convallyria.taleofkingdoms.TaleOfKingdoms; +import com.convallyria.taleofkingdoms.common.packet.PacketHandler; +import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry; +import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.network.RegistryByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.packet.CustomPayload; +import net.minecraft.server.network.ServerPlayerEntity; + +public abstract class OutServerPacketHandler extends PacketHandler { + + public OutServerPacketHandler(CustomPayload.Id packet, PacketCodec codec) { + super(packet, codec); + } + + @Override + protected void register() { + try { + PayloadTypeRegistry.playS2C().register(this.getPacket(), codec); + } catch (IllegalArgumentException ignored) { + // Terrible way to fix this problem but I can't think of a better way to set up the mod + // We are registering an integrated server packet open_client_screen + // So we have it registered as an incoming packet handler from server + // And an outgoing via integrated server + TaleOfKingdoms.LOGGER.warn("Ignoring duplicate registered packet: {}", this.getPacket().id().toString()); + } + } + + @Override + public void sendPacket(PlayerEntity player, T packet) { + ServerPlayNetworking.send((ServerPlayerEntity) player, packet); + } +} diff --git a/src/main/java/com/convallyria/taleofkingdoms/server/packet/outgoing/OutgoingInstanceSyncPacketHandler.java b/src/main/java/com/convallyria/taleofkingdoms/server/packet/outgoing/OutgoingInstanceSyncPacketHandler.java index 139268ed..43d5e620 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/server/packet/outgoing/OutgoingInstanceSyncPacketHandler.java +++ b/src/main/java/com/convallyria/taleofkingdoms/server/packet/outgoing/OutgoingInstanceSyncPacketHandler.java @@ -1,43 +1,12 @@ package com.convallyria.taleofkingdoms.server.packet.outgoing; import com.convallyria.taleofkingdoms.common.packet.Packets; -import com.convallyria.taleofkingdoms.common.packet.context.PacketContext; -import com.convallyria.taleofkingdoms.common.world.ConquestInstance; -import com.convallyria.taleofkingdoms.server.packet.ServerPacketHandler; -import io.netty.buffer.Unpooled; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.server.network.ServerPlayerEntity; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import com.convallyria.taleofkingdoms.common.packet.s2c.InstanceSyncPacket; -import java.util.UUID; - -public final class OutgoingInstanceSyncPacketHandler extends ServerPacketHandler { +public final class OutgoingInstanceSyncPacketHandler extends OutServerPacketHandler { public OutgoingInstanceSyncPacketHandler() { - super(Packets.INSTANCE_SYNC); - } - - @Override - public void handleIncomingPacket(PacketContext context, PacketByteBuf attachedData) { - throw new IllegalStateException("Not supported"); + super(Packets.INSTANCE_SYNC, InstanceSyncPacket.CODEC); } - @Override - public void handleOutgoingPacket(@NotNull PlayerEntity player, @Nullable Object... data) { - if (data != null && data[0] instanceof ConquestInstance instance - && player instanceof ServerPlayerEntity) { - PacketByteBuf passedData = new PacketByteBuf(Unpooled.buffer()); - // Copy the instance but only make it reference the current player. We don't want to leak data (or waste bandwidth). - ConquestInstance copy = new ConquestInstance(instance.getName(), instance.getStart(), instance.getEnd(), instance.getOrigin()); - copy.uploadData(instance); - for (UUID uuid : copy.getGuildPlayers().keySet()) { - if (uuid.equals(player.getUuid())) continue; - copy.getGuildPlayers().remove(uuid); - } - passedData.encodeAsJson(ConquestInstance.CODEC, copy); - sendPacket(player, passedData); - } - } } diff --git a/src/main/java/com/convallyria/taleofkingdoms/server/packet/outgoing/OutgoingOpenScreenPacketHandler.java b/src/main/java/com/convallyria/taleofkingdoms/server/packet/outgoing/OutgoingOpenScreenPacketHandler.java index ef535dfe..56a81b6b 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/server/packet/outgoing/OutgoingOpenScreenPacketHandler.java +++ b/src/main/java/com/convallyria/taleofkingdoms/server/packet/outgoing/OutgoingOpenScreenPacketHandler.java @@ -1,48 +1,11 @@ package com.convallyria.taleofkingdoms.server.packet.outgoing; import com.convallyria.taleofkingdoms.common.packet.Packets; -import com.convallyria.taleofkingdoms.common.packet.context.PacketContext; -import com.convallyria.taleofkingdoms.server.packet.ServerPacketHandler; -import io.netty.buffer.Unpooled; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.server.network.ServerPlayerEntity; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import com.convallyria.taleofkingdoms.common.packet.s2c.OpenScreenPacket; -public final class OutgoingOpenScreenPacketHandler extends ServerPacketHandler { - - public enum ScreenTypes { - GUILD_MASTER, - BLACKSMITH, - INNKEEPER, - BANKER, - FOOD_SHOP, - ITEM_SHOP, - BLOCK_SHOP, - CITY_BUILDER_BEGIN, - CITY_BUILDER_TIER, - STOCK_MARKET, - FOREMAN, - WARDEN - } +public final class OutgoingOpenScreenPacketHandler extends OutServerPacketHandler { public OutgoingOpenScreenPacketHandler() { - super(Packets.OPEN_CLIENT_SCREEN); - } - - @Override - public void handleIncomingPacket(PacketContext context, PacketByteBuf attachedData) { - throw new IllegalStateException("Not supported"); - } - - @Override - public void handleOutgoingPacket(@NotNull PlayerEntity player, @Nullable Object... data) { - if (data != null && player instanceof ServerPlayerEntity) { - PacketByteBuf passedData = new PacketByteBuf(Unpooled.buffer()); - passedData.writeEnumConstant((ScreenTypes) data[0]); - passedData.writeInt((Integer) data[1]); - sendPacket(player, passedData); - } + super(Packets.OPEN_CLIENT_SCREEN, OpenScreenPacket.CODEC); } } diff --git a/src/main/java/com/convallyria/taleofkingdoms/server/world/ServerConquestInstance.java b/src/main/java/com/convallyria/taleofkingdoms/server/world/ServerConquestInstance.java index eb8208f0..5050a5b9 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/server/world/ServerConquestInstance.java +++ b/src/main/java/com/convallyria/taleofkingdoms/server/world/ServerConquestInstance.java @@ -2,6 +2,7 @@ import com.convallyria.taleofkingdoms.common.packet.PacketHandler; import com.convallyria.taleofkingdoms.common.packet.Packets; +import com.convallyria.taleofkingdoms.common.packet.s2c.InstanceSyncPacket; import com.convallyria.taleofkingdoms.common.world.ConquestInstance; import com.convallyria.taleofkingdoms.server.TaleOfKingdomsServer; import com.convallyria.taleofkingdoms.server.TaleOfKingdomsServerAPI; @@ -10,12 +11,21 @@ import net.minecraft.server.network.ServerPlayerEntity; import org.jetbrains.annotations.NotNull; +import java.util.UUID; + @Environment(EnvType.SERVER) public class ServerConquestInstance { public static void sync(@NotNull ServerPlayerEntity player, @NotNull ConquestInstance instance) { final TaleOfKingdomsServerAPI api = TaleOfKingdomsServer.getAPI(); - PacketHandler packetHandler = api.getServerPacketHandler(Packets.INSTANCE_SYNC); - packetHandler.handleOutgoingPacket(player, instance); + // Copy the instance but only make it reference the current player. We don't want to leak data (or waste bandwidth). + ConquestInstance copy = new ConquestInstance(instance.getName(), instance.getStart(), instance.getEnd(), instance.getOrigin()); + copy.uploadData(instance); + for (UUID uuid : copy.getGuildPlayers().keySet()) { + if (uuid.equals(player.getUuid())) continue; + copy.getGuildPlayers().remove(uuid); + } + PacketHandler packetHandler = api.getServerPacket(Packets.INSTANCE_SYNC); + packetHandler.sendPacket(player, new InstanceSyncPacket(copy)); } } diff --git a/src/main/resources/data/taleofkingdoms/structures/bandit_camp/small_bandit_camp.nbt b/src/main/resources/data/taleofkingdoms/structure/bandit_camp/small_bandit_camp.nbt similarity index 100% rename from src/main/resources/data/taleofkingdoms/structures/bandit_camp/small_bandit_camp.nbt rename to src/main/resources/data/taleofkingdoms/structure/bandit_camp/small_bandit_camp.nbt diff --git a/src/main/resources/data/taleofkingdoms/structures/gateway/bars.nbt b/src/main/resources/data/taleofkingdoms/structure/gateway/bars.nbt similarity index 100% rename from src/main/resources/data/taleofkingdoms/structures/gateway/bars.nbt rename to src/main/resources/data/taleofkingdoms/structure/gateway/bars.nbt diff --git a/src/main/resources/data/taleofkingdoms/structures/gateway/gateway.nbt b/src/main/resources/data/taleofkingdoms/structure/gateway/gateway.nbt similarity index 100% rename from src/main/resources/data/taleofkingdoms/structures/gateway/gateway.nbt rename to src/main/resources/data/taleofkingdoms/structure/gateway/gateway.nbt diff --git a/src/main/resources/data/taleofkingdoms/structures/guild/guild-1.16.nbt b/src/main/resources/data/taleofkingdoms/structure/guild/guild-1.16.nbt similarity index 100% rename from src/main/resources/data/taleofkingdoms/structures/guild/guild-1.16.nbt rename to src/main/resources/data/taleofkingdoms/structure/guild/guild-1.16.nbt diff --git a/src/main/resources/data/taleofkingdoms/structures/guild/guild-1.18.nbt b/src/main/resources/data/taleofkingdoms/structure/guild/guild-1.18.nbt similarity index 100% rename from src/main/resources/data/taleofkingdoms/structures/guild/guild-1.18.nbt rename to src/main/resources/data/taleofkingdoms/structure/guild/guild-1.18.nbt diff --git a/src/main/resources/data/taleofkingdoms/structures/guild/guild-1.20.2.nbt b/src/main/resources/data/taleofkingdoms/structure/guild/guild-1.20.2.nbt similarity index 100% rename from src/main/resources/data/taleofkingdoms/structures/guild/guild-1.20.2.nbt rename to src/main/resources/data/taleofkingdoms/structure/guild/guild-1.20.2.nbt diff --git a/src/main/resources/data/taleofkingdoms/structures/guild/guild-old.nbt b/src/main/resources/data/taleofkingdoms/structure/guild/guild-old.nbt similarity index 100% rename from src/main/resources/data/taleofkingdoms/structures/guild/guild-old.nbt rename to src/main/resources/data/taleofkingdoms/structure/guild/guild-old.nbt diff --git a/src/main/resources/data/taleofkingdoms/structures/guild/guildnew.nbt b/src/main/resources/data/taleofkingdoms/structure/guild/guildnew.nbt similarity index 100% rename from src/main/resources/data/taleofkingdoms/structures/guild/guildnew.nbt rename to src/main/resources/data/taleofkingdoms/structure/guild/guildnew.nbt diff --git a/src/main/resources/data/taleofkingdoms/structures/player_kingdom/bake_house/tier_two_bake_house.nbt b/src/main/resources/data/taleofkingdoms/structure/player_kingdom/bake_house/tier_two_bake_house.nbt similarity index 100% rename from src/main/resources/data/taleofkingdoms/structures/player_kingdom/bake_house/tier_two_bake_house.nbt rename to src/main/resources/data/taleofkingdoms/structure/player_kingdom/bake_house/tier_two_bake_house.nbt diff --git a/src/main/resources/data/taleofkingdoms/structures/player_kingdom/barracks/tier_two_barracks.nbt b/src/main/resources/data/taleofkingdoms/structure/player_kingdom/barracks/tier_two_barracks.nbt similarity index 100% rename from src/main/resources/data/taleofkingdoms/structures/player_kingdom/barracks/tier_two_barracks.nbt rename to src/main/resources/data/taleofkingdoms/structure/player_kingdom/barracks/tier_two_barracks.nbt diff --git a/src/main/resources/data/taleofkingdoms/structures/player_kingdom/blacksmith/tier_one_house_blacksmith.nbt b/src/main/resources/data/taleofkingdoms/structure/player_kingdom/blacksmith/tier_one_house_blacksmith.nbt similarity index 100% rename from src/main/resources/data/taleofkingdoms/structures/player_kingdom/blacksmith/tier_one_house_blacksmith.nbt rename to src/main/resources/data/taleofkingdoms/structure/player_kingdom/blacksmith/tier_one_house_blacksmith.nbt diff --git a/src/main/resources/data/taleofkingdoms/structures/player_kingdom/blacksmith/tier_one_house_blacksmith_old.nbt b/src/main/resources/data/taleofkingdoms/structure/player_kingdom/blacksmith/tier_one_house_blacksmith_old.nbt similarity index 100% rename from src/main/resources/data/taleofkingdoms/structures/player_kingdom/blacksmith/tier_one_house_blacksmith_old.nbt rename to src/main/resources/data/taleofkingdoms/structure/player_kingdom/blacksmith/tier_one_house_blacksmith_old.nbt diff --git a/src/main/resources/data/taleofkingdoms/structures/player_kingdom/block_shop/tier_two_block_shop.nbt b/src/main/resources/data/taleofkingdoms/structure/player_kingdom/block_shop/tier_two_block_shop.nbt similarity index 100% rename from src/main/resources/data/taleofkingdoms/structures/player_kingdom/block_shop/tier_two_block_shop.nbt rename to src/main/resources/data/taleofkingdoms/structure/player_kingdom/block_shop/tier_two_block_shop.nbt diff --git a/src/main/resources/data/taleofkingdoms/structures/player_kingdom/builder_house/tier_two_builder_house.nbt b/src/main/resources/data/taleofkingdoms/structure/player_kingdom/builder_house/tier_two_builder_house.nbt similarity index 100% rename from src/main/resources/data/taleofkingdoms/structures/player_kingdom/builder_house/tier_two_builder_house.nbt rename to src/main/resources/data/taleofkingdoms/structure/player_kingdom/builder_house/tier_two_builder_house.nbt diff --git a/src/main/resources/data/taleofkingdoms/structures/player_kingdom/large_house/tier_one_large_house.nbt b/src/main/resources/data/taleofkingdoms/structure/player_kingdom/large_house/tier_one_large_house.nbt similarity index 100% rename from src/main/resources/data/taleofkingdoms/structures/player_kingdom/large_house/tier_one_large_house.nbt rename to src/main/resources/data/taleofkingdoms/structure/player_kingdom/large_house/tier_one_large_house.nbt diff --git a/src/main/resources/data/taleofkingdoms/structures/player_kingdom/large_house/tier_one_large_house_new.nbt b/src/main/resources/data/taleofkingdoms/structure/player_kingdom/large_house/tier_one_large_house_new.nbt similarity index 100% rename from src/main/resources/data/taleofkingdoms/structures/player_kingdom/large_house/tier_one_large_house_new.nbt rename to src/main/resources/data/taleofkingdoms/structure/player_kingdom/large_house/tier_one_large_house_new.nbt diff --git a/src/main/resources/data/taleofkingdoms/structures/player_kingdom/large_house/tier_two_large_house.nbt b/src/main/resources/data/taleofkingdoms/structure/player_kingdom/large_house/tier_two_large_house.nbt similarity index 100% rename from src/main/resources/data/taleofkingdoms/structures/player_kingdom/large_house/tier_two_large_house.nbt rename to src/main/resources/data/taleofkingdoms/structure/player_kingdom/large_house/tier_two_large_house.nbt diff --git a/src/main/resources/data/taleofkingdoms/structures/player_kingdom/small_house/tier_one_small_house.nbt b/src/main/resources/data/taleofkingdoms/structure/player_kingdom/small_house/tier_one_small_house.nbt similarity index 100% rename from src/main/resources/data/taleofkingdoms/structures/player_kingdom/small_house/tier_one_small_house.nbt rename to src/main/resources/data/taleofkingdoms/structure/player_kingdom/small_house/tier_one_small_house.nbt diff --git a/src/main/resources/data/taleofkingdoms/structures/player_kingdom/small_house/tier_one_small_house_one_new.nbt b/src/main/resources/data/taleofkingdoms/structure/player_kingdom/small_house/tier_one_small_house_one_new.nbt similarity index 100% rename from src/main/resources/data/taleofkingdoms/structures/player_kingdom/small_house/tier_one_small_house_one_new.nbt rename to src/main/resources/data/taleofkingdoms/structure/player_kingdom/small_house/tier_one_small_house_one_new.nbt diff --git a/src/main/resources/data/taleofkingdoms/structures/player_kingdom/small_house/tier_one_small_house_two_new.nbt b/src/main/resources/data/taleofkingdoms/structure/player_kingdom/small_house/tier_one_small_house_two_new.nbt similarity index 100% rename from src/main/resources/data/taleofkingdoms/structures/player_kingdom/small_house/tier_one_small_house_two_new.nbt rename to src/main/resources/data/taleofkingdoms/structure/player_kingdom/small_house/tier_one_small_house_two_new.nbt diff --git a/src/main/resources/data/taleofkingdoms/structures/player_kingdom/small_house/tier_two_small_house_variant_one.nbt b/src/main/resources/data/taleofkingdoms/structure/player_kingdom/small_house/tier_two_small_house_variant_one.nbt similarity index 100% rename from src/main/resources/data/taleofkingdoms/structures/player_kingdom/small_house/tier_two_small_house_variant_one.nbt rename to src/main/resources/data/taleofkingdoms/structure/player_kingdom/small_house/tier_two_small_house_variant_one.nbt diff --git a/src/main/resources/data/taleofkingdoms/structures/player_kingdom/small_house/tier_two_small_house_variant_two.nbt b/src/main/resources/data/taleofkingdoms/structure/player_kingdom/small_house/tier_two_small_house_variant_two.nbt similarity index 100% rename from src/main/resources/data/taleofkingdoms/structures/player_kingdom/small_house/tier_two_small_house_variant_two.nbt rename to src/main/resources/data/taleofkingdoms/structure/player_kingdom/small_house/tier_two_small_house_variant_two.nbt diff --git a/src/main/resources/data/taleofkingdoms/structures/player_kingdom/stock_market/tier_one_stock_market.nbt b/src/main/resources/data/taleofkingdoms/structure/player_kingdom/stock_market/tier_one_stock_market.nbt similarity index 100% rename from src/main/resources/data/taleofkingdoms/structures/player_kingdom/stock_market/tier_one_stock_market.nbt rename to src/main/resources/data/taleofkingdoms/structure/player_kingdom/stock_market/tier_one_stock_market.nbt diff --git a/src/main/resources/data/taleofkingdoms/structures/player_kingdom/tier_1_pre.nbt b/src/main/resources/data/taleofkingdoms/structure/player_kingdom/tier_1_pre.nbt similarity index 100% rename from src/main/resources/data/taleofkingdoms/structures/player_kingdom/tier_1_pre.nbt rename to src/main/resources/data/taleofkingdoms/structure/player_kingdom/tier_1_pre.nbt diff --git a/src/main/resources/data/taleofkingdoms/structures/player_kingdom/tier_one.nbt b/src/main/resources/data/taleofkingdoms/structure/player_kingdom/tier_one.nbt similarity index 100% rename from src/main/resources/data/taleofkingdoms/structures/player_kingdom/tier_one.nbt rename to src/main/resources/data/taleofkingdoms/structure/player_kingdom/tier_one.nbt diff --git a/src/main/resources/data/taleofkingdoms/structures/player_kingdom/tier_one_old.nbt b/src/main/resources/data/taleofkingdoms/structure/player_kingdom/tier_one_old.nbt similarity index 100% rename from src/main/resources/data/taleofkingdoms/structures/player_kingdom/tier_one_old.nbt rename to src/main/resources/data/taleofkingdoms/structure/player_kingdom/tier_one_old.nbt diff --git a/src/main/resources/data/taleofkingdoms/structures/player_kingdom/tier_two.nbt b/src/main/resources/data/taleofkingdoms/structure/player_kingdom/tier_two.nbt similarity index 100% rename from src/main/resources/data/taleofkingdoms/structures/player_kingdom/tier_two.nbt rename to src/main/resources/data/taleofkingdoms/structure/player_kingdom/tier_two.nbt diff --git a/src/main/resources/data/taleofkingdoms/structures/player_kingdom/tier_two_complete.nbt b/src/main/resources/data/taleofkingdoms/structure/player_kingdom/tier_two_complete.nbt similarity index 100% rename from src/main/resources/data/taleofkingdoms/structures/player_kingdom/tier_two_complete.nbt rename to src/main/resources/data/taleofkingdoms/structure/player_kingdom/tier_two_complete.nbt diff --git a/src/main/resources/data/taleofkingdoms/structures/player_kingdom/tier_two_old.nbt b/src/main/resources/data/taleofkingdoms/structure/player_kingdom/tier_two_old.nbt similarity index 100% rename from src/main/resources/data/taleofkingdoms/structures/player_kingdom/tier_two_old.nbt rename to src/main/resources/data/taleofkingdoms/structure/player_kingdom/tier_two_old.nbt diff --git a/src/main/resources/data/taleofkingdoms/structures/reficule_village/reficule_village_four.nbt b/src/main/resources/data/taleofkingdoms/structure/reficule_village/reficule_village_four.nbt similarity index 100% rename from src/main/resources/data/taleofkingdoms/structures/reficule_village/reficule_village_four.nbt rename to src/main/resources/data/taleofkingdoms/structure/reficule_village/reficule_village_four.nbt diff --git a/src/main/resources/data/taleofkingdoms/structures/reficule_village/reficule_village_middle.nbt b/src/main/resources/data/taleofkingdoms/structure/reficule_village/reficule_village_middle.nbt similarity index 100% rename from src/main/resources/data/taleofkingdoms/structures/reficule_village/reficule_village_middle.nbt rename to src/main/resources/data/taleofkingdoms/structure/reficule_village/reficule_village_middle.nbt diff --git a/src/main/resources/data/taleofkingdoms/structures/reficule_village/reficule_village_middle_two.nbt b/src/main/resources/data/taleofkingdoms/structure/reficule_village/reficule_village_middle_two.nbt similarity index 100% rename from src/main/resources/data/taleofkingdoms/structures/reficule_village/reficule_village_middle_two.nbt rename to src/main/resources/data/taleofkingdoms/structure/reficule_village/reficule_village_middle_two.nbt diff --git a/src/main/resources/data/taleofkingdoms/structures/reficule_village/reficule_village_one.nbt b/src/main/resources/data/taleofkingdoms/structure/reficule_village/reficule_village_one.nbt similarity index 100% rename from src/main/resources/data/taleofkingdoms/structures/reficule_village/reficule_village_one.nbt rename to src/main/resources/data/taleofkingdoms/structure/reficule_village/reficule_village_one.nbt diff --git a/src/main/resources/data/taleofkingdoms/structures/reficule_village/reficule_village_three.nbt b/src/main/resources/data/taleofkingdoms/structure/reficule_village/reficule_village_three.nbt similarity index 100% rename from src/main/resources/data/taleofkingdoms/structures/reficule_village/reficule_village_three.nbt rename to src/main/resources/data/taleofkingdoms/structure/reficule_village/reficule_village_three.nbt diff --git a/src/main/resources/data/taleofkingdoms/structures/reficule_village/reficule_village_tower.nbt b/src/main/resources/data/taleofkingdoms/structure/reficule_village/reficule_village_tower.nbt similarity index 100% rename from src/main/resources/data/taleofkingdoms/structures/reficule_village/reficule_village_tower.nbt rename to src/main/resources/data/taleofkingdoms/structure/reficule_village/reficule_village_tower.nbt diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 9264cf10..0dfb5e31 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -62,9 +62,9 @@ "depends": { "fabricloader": ">=0.15.0", "fabric-api": "*", - "minecraft": "~1.20.3", - "java": ">=17", - "owo": "^0.12.0 <0.13.0" + "minecraft": "~1.21", + "java": ">=21", + "owo": "^0.12.10 <0.13.0" }, "suggests": { "flamingo": "*" diff --git a/src/main/resources/taleofkingdoms.mixins.json b/src/main/resources/taleofkingdoms.mixins.json index 88f01fe7..5ce079e7 100644 --- a/src/main/resources/taleofkingdoms.mixins.json +++ b/src/main/resources/taleofkingdoms.mixins.json @@ -2,7 +2,7 @@ "required": true, "minVersion": "0.8.2", "package": "com.convallyria.taleofkingdoms.mixin", - "compatibilityLevel": "JAVA_17", + "compatibilityLevel": "JAVA_21", "mixins": [ "StructureTypeAccessor", "common.EntityDeathEvent",