From 05f34eea023542535e398912474c0c50f81bbed1 Mon Sep 17 00:00:00 2001 From: ToCraft Date: Fri, 31 May 2024 15:26:08 +0200 Subject: [PATCH 1/6] disable forge 1.20.6 for now --- gradle.properties | 2 +- settings.gradle | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index e3608db..aeb259e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -21,5 +21,5 @@ modrinth_id=8aeV5uJW required_dependencies=woodwalkers,crafted-core optional_dependencies= # Platforms -enabled_platforms=fabric,forge,neoforge +enabled_platforms=fabric,neoforge java_version=21 \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index fa4ea68..70cb68c 100644 --- a/settings.gradle +++ b/settings.gradle @@ -10,7 +10,7 @@ pluginManagement { include("common") include("fabric") -include("forge") +//include("forge") include("neoforge") rootProject.name = "remorphed" \ No newline at end of file From 8871db653484b88c5d4beedcb230994dd243221f Mon Sep 17 00:00:00 2001 From: ToCraft Date: Fri, 31 May 2024 15:26:57 +0200 Subject: [PATCH 2/6] fix crash when morphing back and unlockFriendlyNormal is true --- .../remorphed/events/ShapeEventsCallback.java | 29 ----------------- .../handler/ShapeEventsCallback.java | 31 +++++++++++++++++++ 2 files changed, 31 insertions(+), 29 deletions(-) delete mode 100644 common/src/main/java/tocraft/remorphed/events/ShapeEventsCallback.java create mode 100644 common/src/main/java/tocraft/remorphed/handler/ShapeEventsCallback.java diff --git a/common/src/main/java/tocraft/remorphed/events/ShapeEventsCallback.java b/common/src/main/java/tocraft/remorphed/events/ShapeEventsCallback.java deleted file mode 100644 index 662be9c..0000000 --- a/common/src/main/java/tocraft/remorphed/events/ShapeEventsCallback.java +++ /dev/null @@ -1,29 +0,0 @@ -package tocraft.remorphed.events; - -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.monster.Enemy; -import tocraft.remorphed.Remorphed; -import tocraft.remorphed.impl.RemorphedPlayerDataProvider; -import tocraft.walkers.Walkers; -import tocraft.walkers.api.variant.ShapeType; - -public class ShapeEventsCallback { - public InteractionResult event(ServerPlayer player, ShapeType type) { - // check if the walkers unlock mechanic should be used - if (!Remorphed.CONFIG.lockTransform && Remorphed.CONFIG.unlockFriendlyNormal) { - LivingEntity entityToBeUnlocked = type.create(player.level()); - if (!(entityToBeUnlocked instanceof Enemy)) - ((RemorphedPlayerDataProvider) player).remorphed$getUnlockedShapes().put(type, Remorphed.getKillToUnlock(type.getEntityType())); - } - // check if entity is unlocked by remorphed, prevents native unlock mechanic by walkers - else if (!Remorphed.canUseShape(player, type)) { - if (!Walkers.hasSpecialShape(player.getUUID()) || !type.getEntityType().equals(EntityType.WOLF)) - return InteractionResult.FAIL; - } - - return InteractionResult.PASS; - } -} diff --git a/common/src/main/java/tocraft/remorphed/handler/ShapeEventsCallback.java b/common/src/main/java/tocraft/remorphed/handler/ShapeEventsCallback.java new file mode 100644 index 0000000..a7aff8e --- /dev/null +++ b/common/src/main/java/tocraft/remorphed/handler/ShapeEventsCallback.java @@ -0,0 +1,31 @@ +package tocraft.remorphed.events; + +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.monster.Enemy; +import tocraft.remorphed.Remorphed; +import tocraft.remorphed.impl.RemorphedPlayerDataProvider; +import tocraft.walkers.Walkers; +import tocraft.walkers.api.variant.ShapeType; + +public class ShapeEventsCallback { + public InteractionResult event(ServerPlayer player, ShapeType type) { + if (type != null) { + // check if the walkers unlock mechanic should be used + if (!Remorphed.CONFIG.lockTransform && Remorphed.CONFIG.unlockFriendlyNormal) { + LivingEntity entityToBeUnlocked = type.create(player.level()); + if (!(entityToBeUnlocked instanceof Enemy)) + ((RemorphedPlayerDataProvider) player).remorphed$getUnlockedShapes().put(type, Remorphed.getKillToUnlock(type.getEntityType())); + } + // check if entity is unlocked by remorphed, prevents native unlock mechanic by walkers + else if (!Remorphed.canUseShape(player, type)) { + if (!Walkers.hasSpecialShape(player.getUUID()) || !type.getEntityType().equals(EntityType.WOLF)) + return InteractionResult.FAIL; + } + } + + return InteractionResult.PASS; + } +} From a5949d468cbd092c06f74757a52ab467dd982190 Mon Sep 17 00:00:00 2001 From: ToCraft Date: Sun, 2 Jun 2024 11:50:46 +0200 Subject: [PATCH 3/6] add support for discordRelease task --- .github/workflows/push_build_and_release.yml | 27 +++++++++++++++++++- gradle.properties | 5 +++- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/.github/workflows/push_build_and_release.yml b/.github/workflows/push_build_and_release.yml index 00ebbc4..c1c2e76 100644 --- a/.github/workflows/push_build_and_release.yml +++ b/.github/workflows/push_build_and_release.yml @@ -14,6 +14,10 @@ on: description: 'Release' required: true default: 'false' + discord_message: + description: 'Discord Message' + required: false + default: 'false' permissions: contents: write @@ -54,6 +58,7 @@ jobs: !**/*-dev.jar !**/*-shadow.jar !**/*-transformProduction*.jar + !**/testmod*/ release: name: "Release" needs: build @@ -102,4 +107,24 @@ jobs: fabric/build/libs/${{ env.archives_base_name }}-${{ env.mod_version }}-fabric.jar, forge/build/libs/${{ env.archives_base_name }}-${{ env.mod_version }}-forge.jar, neoforge/build/libs/${{ env.archives_base_name }}-${{ env.mod_version }}-neoforge.jar - body_path: ${{ github.workspace }}/extracted.CHANGELOG.md \ No newline at end of file + body_path: ${{ github.workspace }}/extracted.CHANGELOG.md + discord_message: + name: "Send Discord Release Message" + needs: build + runs-on: ubuntu-latest + if: github.event.inputs.discord_message == 'true' + steps: + - uses: actions/checkout@v4 + + - name: Set up JDK 21 + uses: actions/setup-java@v4 + with: + java-version: 21 + distribution: 'temurin' + - name: Validate Gradle Wrapper + uses: gradle/actions/wrapper-validation@v3 + + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v3 + - name: Send Discord Message + run: ./gradlew discordRelease --no-daemon \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index aeb259e..4fc3fc7 100644 --- a/gradle.properties +++ b/gradle.properties @@ -22,4 +22,7 @@ required_dependencies=woodwalkers,crafted-core optional_dependencies= # Platforms enabled_platforms=fabric,neoforge -java_version=21 \ No newline at end of file +java_version=21 +# Discord Webhook +web_hook_url=https://discord.com/api/webhooks/1246758962431393902/jXWzrr6_UEJiscW-ZdTJS9xTX0mDylIf1ZUiZ4Nzvq70nV1yLSh8vZgsjAYaJTai_z2a +ping_role=1183385230820790313 \ No newline at end of file From 8402516d0eb5d97576d9312cb0e178e322113d02 Mon Sep 17 00:00:00 2001 From: To_Craft Date: Tue, 4 Jun 2024 07:27:44 +0200 Subject: [PATCH 4/6] update to newest gradlemaster [no_release] --- .github/workflows/push_build_and_release.yml | 21 +++++++++++++++----- gradle.properties | 3 +-- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/.github/workflows/push_build_and_release.yml b/.github/workflows/push_build_and_release.yml index c1c2e76..105a921 100644 --- a/.github/workflows/push_build_and_release.yml +++ b/.github/workflows/push_build_and_release.yml @@ -12,8 +12,8 @@ on: inputs: release: description: 'Release' - required: true - default: 'false' + required: false + default: 'true' discord_message: description: 'Discord Message' required: false @@ -64,7 +64,7 @@ jobs: needs: build runs-on: ubuntu-latest if: | - !contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[release]') && github.event.inputs.release == 'true' + !contains(github.event.head_commit.message, '[no_release]') && github.event.inputs.release != 'false' steps: - uses: actions/checkout@v4 @@ -79,6 +79,10 @@ jobs: - name: Setup Gradle uses: gradle/actions/setup-gradle@v3 + - name: Extract Artifact Type + run: | + cat $GITHUB_WORKSPACE/gradle.properties | grep ^artifact_type= >> $GITHUB_ENV + - name: Publish to Maven, CurseForge & Modrinth run: ./gradlew publish modrinth curseforge --no-daemon env: @@ -96,10 +100,14 @@ jobs: - name: Create version name run: echo "version_name_git=$minecraft_version-$mod_version" >> $GITHUB_ENV - name: Create GitHub Tag + if: | + ${{ env.artifact_type }} == 'release' uses: EndBug/latest-tag@latest with: ref: "${{ env.version_name_git }}" - name: Create GitHub Release + if: | + ${{ env.artifact_type }} == 'release' uses: softprops/action-gh-release@v2 with: tag_name: "${{ env.version_name_git }}" @@ -112,7 +120,8 @@ jobs: name: "Send Discord Release Message" needs: build runs-on: ubuntu-latest - if: github.event.inputs.discord_message == 'true' + if: | + github.event.inputs.discord_message == 'true' steps: - uses: actions/checkout@v4 @@ -127,4 +136,6 @@ jobs: - name: Setup Gradle uses: gradle/actions/setup-gradle@v3 - name: Send Discord Message - run: ./gradlew discordRelease --no-daemon \ No newline at end of file + run: ./gradlew discordRelease --no-daemon + env: + DISCORD_WEB_HOOK: ${{ secrets.DISCORD_WEB_HOOK }} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 4fc3fc7..9f83f59 100644 --- a/gradle.properties +++ b/gradle.properties @@ -24,5 +24,4 @@ optional_dependencies= enabled_platforms=fabric,neoforge java_version=21 # Discord Webhook -web_hook_url=https://discord.com/api/webhooks/1246758962431393902/jXWzrr6_UEJiscW-ZdTJS9xTX0mDylIf1ZUiZ4Nzvq70nV1yLSh8vZgsjAYaJTai_z2a -ping_role=1183385230820790313 \ No newline at end of file +ping_role=1183385230820790313 From 3d6b5e36283c17ab47ff720afaf66871b36227f5 Mon Sep 17 00:00:00 2001 From: ToCraft Date: Wed, 5 Jun 2024 16:46:01 +0200 Subject: [PATCH 5/6] use new walkers API Levels & use PlayerMorph.class --- CHANGELOG.md | 6 +++++ build.gradle | 6 ++--- .../java/tocraft/remorphed/Remorphed.java | 21 ++++++++------- .../remorphed/command/RemorphedCommand.java | 10 +++---- .../remorphed/handler/LivingDeathHandler.java | 6 ++--- .../handler/PlayerRespawnHandler.java | 11 ++++---- .../handler/ShapeEventsCallback.java | 18 ++++++++----- .../client/ClientPlayerRespawnHandler.java | 9 ++++--- .../tocraft/remorphed/impl/PlayerMorph.java | 26 +++++++++++++++++++ .../impl/RemorphedPlayerDataProvider.java | 5 ++-- .../remorphed/mixin/PlayerEntityMixin.java | 10 ++----- .../remorphed/network/ClientNetworking.java | 13 +++++----- .../remorphed/network/NetworkHandler.java | 14 +++++----- .../remorphed/screen/RemorphedScreen.java | 8 +++--- .../screen/widget/SpecialShapeWidget.java | 4 +-- gradle.properties | 4 +-- .../remorphed/neoforge/RemorphedNeoForge.java | 1 + 17 files changed, 103 insertions(+), 69 deletions(-) create mode 100644 common/src/main/java/tocraft/remorphed/impl/PlayerMorph.java diff --git a/CHANGELOG.md b/CHANGELOG.md index cd95269..dda8ddd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,20 +1,24 @@ remorphed 3.6.2 ================ + - update to CraftedCore 4.2 & Walkers 4.4.2 - temporarily disable caching thread in menu to prevent wrong rendering remorphed 3.6.1 ================ + - fix issues with entity caching in menu remorphed 3.6 ================ + - selected entity is rendered first - add compatibility for walkers 4.2 (and variants menu) - skills can renderer multiple times per entity if required (e.g. the MobEffectSkill can render multiple icons now) remorphed 3.5 ================ + - change entity orientation in menu - fix sync error - fix render scissor (no more entities in the menu) @@ -22,12 +26,14 @@ remorphed 3.5 remorphed 3.4 ================ + - fix crash on startup for 1.20.2+ - player data will be properly restored on death now (required re-login before) - fix only craftedcore 3.0 possible on Fabric remorphed 3.3 ================ + - menu loads entities in the background - menu only renders visible entities (fixes low FPS in the menu) - fix every entity available in survival diff --git a/build.gradle b/build.gradle index af29469..f944caa 100644 --- a/build.gradle +++ b/build.gradle @@ -7,8 +7,8 @@ apply from: "https://raw.githubusercontent.com/ToCraft/GradleMaster/main/main.gr ext { mod_meta = [ - minecraft_version : minecraft_version, version: version, - craftedcore_version : craftedcore_version, - woodwalkers_version : woodwalkers_version + minecraft_version : minecraft_version, version: version, + craftedcore_version: craftedcore_version, + woodwalkers_version: woodwalkers_version ] } diff --git a/common/src/main/java/tocraft/remorphed/Remorphed.java b/common/src/main/java/tocraft/remorphed/Remorphed.java index e2fd793..a92e031 100644 --- a/common/src/main/java/tocraft/remorphed/Remorphed.java +++ b/common/src/main/java/tocraft/remorphed/Remorphed.java @@ -1,11 +1,9 @@ package tocraft.remorphed; -import io.netty.buffer.Unpooled; import net.fabricmc.api.EnvType; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; -import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; @@ -22,13 +20,14 @@ import tocraft.craftedcore.platform.VersionChecker; import tocraft.remorphed.command.RemorphedCommand; import tocraft.remorphed.config.RemorphedConfig; -import tocraft.remorphed.events.ShapeEventsCallback; import tocraft.remorphed.handler.LivingDeathHandler; import tocraft.remorphed.handler.PlayerRespawnHandler; -import tocraft.remorphed.impl.RemorphedPlayerDataProvider; +import tocraft.remorphed.handler.ShapeEventsCallback; +import tocraft.remorphed.impl.PlayerMorph; import tocraft.remorphed.network.NetworkHandler; import tocraft.walkers.Walkers; import tocraft.walkers.api.events.ShapeEvents; +import tocraft.walkers.api.platform.ApiLevel; import tocraft.walkers.api.variant.ShapeType; import java.util.ArrayList; @@ -45,6 +44,11 @@ public class Remorphed { public static boolean displayTraitsInMenu = true; public void initialize() { + ShapeEvents.UNLOCK_SHAPE.register(new ShapeEventsCallback()); + if (!CONFIG.unlockFriendlyNormal) { + ApiLevel.setApiLevel(ApiLevel.MORPHING_AND_VARIANTS_MENU_ONLY); + } + // add DarkShadow_2k to devs (for creating the special shape icon and concepts) Walkers.devs.add(UUID.fromString("74b6d9b3-c8c1-40db-ab82-ccc290d1aa03")); @@ -54,8 +58,6 @@ public void initialize() { NetworkHandler.registerPacketReceiver(); - ShapeEvents.UNLOCK_SHAPE.register(((player, type) -> new ShapeEventsCallback().event(player, type))); - ShapeEvents.SWAP_SHAPE.register(((player, shape) -> new ShapeEventsCallback().event(player, ShapeType.from(shape)))); CommandEvents.REGISTRATION.register(new RemorphedCommand()); EntityEvents.LIVING_DEATH.register(new LivingDeathHandler()); PlayerEvents.PLAYER_RESPAWN.register(new PlayerRespawnHandler()); @@ -73,7 +75,7 @@ public static boolean canUseEveryShape(Player player) { } public static boolean canUseShape(Player player, ShapeType type) { - return canUseEveryShape(player) || !Remorphed.CONFIG.lockTransform && (type == null || Remorphed.getKillToUnlock(type.getEntityType()) <= 0 || ((RemorphedPlayerDataProvider) player).remorphed$getKills(type) >= Remorphed.getKillToUnlock(type.getEntityType())); + return canUseEveryShape(player) || !Remorphed.CONFIG.lockTransform && (type == null || Remorphed.getKillToUnlock(type.getEntityType()) <= 0 || PlayerMorph.getKills(player, type) >= Remorphed.getKillToUnlock(type.getEntityType())); } public static List> getUnlockedShapes(Player player) { @@ -86,7 +88,7 @@ public static List> getUnlockedShapes(Player player) { } return unlocked; } else { - return new ArrayList<>(((RemorphedPlayerDataProvider) player).remorphed$getUnlockedShapes().keySet().stream().filter(type -> canUseShape(player, type)).toList()); + return new ArrayList<>(PlayerMorph.getUnlockedShapes(player).keySet().stream().filter(type -> canUseShape(player, type)).toList()); } } @@ -101,11 +103,10 @@ public static void sync(ServerPlayer player) { } public static void sync(ServerPlayer changed, ServerPlayer packetTarget) { - FriendlyByteBuf packet = new FriendlyByteBuf(Unpooled.buffer()); CompoundTag compoundTag = new CompoundTag(); // serialize current shape data to tag if it exists - Map, Integer> unlockedShapes = ((RemorphedPlayerDataProvider) changed).remorphed$getUnlockedShapes(); + Map, Integer> unlockedShapes = PlayerMorph.getUnlockedShapes(changed); ListTag list = new ListTag(); diff --git a/common/src/main/java/tocraft/remorphed/command/RemorphedCommand.java b/common/src/main/java/tocraft/remorphed/command/RemorphedCommand.java index 23ab5a4..1f6164f 100644 --- a/common/src/main/java/tocraft/remorphed/command/RemorphedCommand.java +++ b/common/src/main/java/tocraft/remorphed/command/RemorphedCommand.java @@ -23,7 +23,7 @@ import org.jetbrains.annotations.Nullable; import tocraft.craftedcore.event.common.CommandEvents; import tocraft.remorphed.Remorphed; -import tocraft.remorphed.impl.RemorphedPlayerDataProvider; +import tocraft.remorphed.impl.PlayerMorph; import tocraft.walkers.api.PlayerShapeChanger; import tocraft.walkers.api.variant.ShapeType; @@ -32,7 +32,7 @@ private static int hasShape(CommandSourceStack source, ServerPlayer player, Reso ShapeType type = getType(source.getLevel(), id, nbt); Component name = Component.translatable(type.getEntityType().getDescriptionId()); - if (((RemorphedPlayerDataProvider) player).remorphed$getUnlockedShapes().containsKey(type)) { + if (PlayerMorph.getUnlockedShapes(player).containsKey(type)) { source.sendSystemMessage(Component.translatable(Remorphed.MODID + ".hasShape_success", player.getDisplayName(), name)); @@ -47,7 +47,7 @@ private static void removeShape(CommandSourceStack source, ServerPlayer player, ShapeType type = getType(source.getLevel(), id, nbt); Component name = Component.translatable(type.getEntityType().getDescriptionId()); - ((RemorphedPlayerDataProvider) player).remorphed$getUnlockedShapes().remove(type); + PlayerMorph.getUnlockedShapes(player).remove(type); source.sendSystemMessage(Component.translatable(Remorphed.MODID + ".removeShape", name, player.getDisplayName())); } @@ -56,13 +56,13 @@ private static void addShape(CommandSourceStack source, ServerPlayer player, Res ShapeType type = getType(source.getLevel(), id, nbt); Component name = Component.translatable(type.getEntityType().getDescriptionId()); - ((RemorphedPlayerDataProvider) player).remorphed$getUnlockedShapes().put(type, Remorphed.getKillToUnlock(type.getEntityType())); + PlayerMorph.getUnlockedShapes(player).put(type, Remorphed.getKillToUnlock(type.getEntityType())); source.sendSystemMessage(Component.translatable(Remorphed.MODID + ".addShape", player.getDisplayName(), name)); } private static void clearShapes(CommandSourceStack source, ServerPlayer player) { - ((RemorphedPlayerDataProvider) player).remorphed$getUnlockedShapes().clear(); + PlayerMorph.getUnlockedShapes(player).clear(); source.sendSystemMessage(Component.translatable(Remorphed.MODID + ".clearShapes", player.getDisplayName())); PlayerShapeChanger.change2ndShape(player, null); diff --git a/common/src/main/java/tocraft/remorphed/handler/LivingDeathHandler.java b/common/src/main/java/tocraft/remorphed/handler/LivingDeathHandler.java index 776ba14..8550c6f 100644 --- a/common/src/main/java/tocraft/remorphed/handler/LivingDeathHandler.java +++ b/common/src/main/java/tocraft/remorphed/handler/LivingDeathHandler.java @@ -7,7 +7,7 @@ import net.minecraft.world.entity.player.Player; import tocraft.craftedcore.event.common.EntityEvents; import tocraft.remorphed.Remorphed; -import tocraft.remorphed.impl.RemorphedPlayerDataProvider; +import tocraft.remorphed.impl.PlayerMorph; import tocraft.walkers.api.PlayerShape; import tocraft.walkers.api.PlayerShapeChanger; import tocraft.walkers.api.variant.ShapeType; @@ -18,9 +18,9 @@ public InteractionResult die(LivingEntity entity, DamageSource source) { if (!(entity instanceof Player) && source.getEntity() instanceof ServerPlayer killer) { ShapeType type = ShapeType.from(entity); if (type != null) { - ((RemorphedPlayerDataProvider) killer).remorphed$addKill(type); + PlayerMorph.addKill(killer, type); - if (Remorphed.CONFIG.autoTransform && ((RemorphedPlayerDataProvider) killer).remorphed$getKills(type) >= Remorphed.getKillToUnlock(type.getEntityType())) { + if (Remorphed.CONFIG.autoTransform && PlayerMorph.getKills(killer, type) >= Remorphed.getKillToUnlock(type.getEntityType())) { PlayerShapeChanger.change2ndShape(killer, type); PlayerShape.updateShapes(killer, type.create(killer.level())); } diff --git a/common/src/main/java/tocraft/remorphed/handler/PlayerRespawnHandler.java b/common/src/main/java/tocraft/remorphed/handler/PlayerRespawnHandler.java index 63348b0..2f21512 100644 --- a/common/src/main/java/tocraft/remorphed/handler/PlayerRespawnHandler.java +++ b/common/src/main/java/tocraft/remorphed/handler/PlayerRespawnHandler.java @@ -1,16 +1,15 @@ package tocraft.remorphed.handler; -import net.minecraft.client.player.LocalPlayer; import net.minecraft.server.level.ServerPlayer; -import tocraft.craftedcore.event.client.ClientPlayerEvents; import tocraft.craftedcore.event.common.PlayerEvents; -import tocraft.remorphed.impl.RemorphedPlayerDataProvider; +import tocraft.remorphed.impl.PlayerMorph; public class PlayerRespawnHandler implements PlayerEvents.PlayerRespawn { @Override public void clone(ServerPlayer oldPlayer, ServerPlayer newPlayer) { - ((RemorphedPlayerDataProvider) newPlayer).remorphed$setUnlockedShapes(((RemorphedPlayerDataProvider) oldPlayer).remorphed$getUnlockedShapes()); - ((RemorphedPlayerDataProvider) newPlayer).remorphed$getFavorites().clear(); - ((RemorphedPlayerDataProvider) newPlayer).remorphed$getFavorites().addAll(((RemorphedPlayerDataProvider) oldPlayer).remorphed$getFavorites()); + PlayerMorph.getUnlockedShapes(newPlayer).clear(); + PlayerMorph.getUnlockedShapes(newPlayer).putAll(PlayerMorph.getUnlockedShapes(oldPlayer)); + PlayerMorph.getFavorites(newPlayer).clear(); + PlayerMorph.getFavorites(newPlayer).addAll(PlayerMorph.getFavorites(oldPlayer)); } } diff --git a/common/src/main/java/tocraft/remorphed/handler/ShapeEventsCallback.java b/common/src/main/java/tocraft/remorphed/handler/ShapeEventsCallback.java index a7aff8e..8e52310 100644 --- a/common/src/main/java/tocraft/remorphed/handler/ShapeEventsCallback.java +++ b/common/src/main/java/tocraft/remorphed/handler/ShapeEventsCallback.java @@ -1,4 +1,4 @@ -package tocraft.remorphed.events; +package tocraft.remorphed.handler; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionResult; @@ -6,23 +6,27 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.monster.Enemy; import tocraft.remorphed.Remorphed; -import tocraft.remorphed.impl.RemorphedPlayerDataProvider; +import tocraft.remorphed.impl.PlayerMorph; import tocraft.walkers.Walkers; +import tocraft.walkers.api.events.ShapeEvents; import tocraft.walkers.api.variant.ShapeType; -public class ShapeEventsCallback { - public InteractionResult event(ServerPlayer player, ShapeType type) { +public class ShapeEventsCallback implements ShapeEvents.UnlockShapeCallback { + @Override + public InteractionResult unlock(ServerPlayer player, ShapeType type) { if (type != null) { // check if the walkers unlock mechanic should be used if (!Remorphed.CONFIG.lockTransform && Remorphed.CONFIG.unlockFriendlyNormal) { LivingEntity entityToBeUnlocked = type.create(player.level()); - if (!(entityToBeUnlocked instanceof Enemy)) - ((RemorphedPlayerDataProvider) player).remorphed$getUnlockedShapes().put(type, Remorphed.getKillToUnlock(type.getEntityType())); + if (!(entityToBeUnlocked instanceof Enemy)) { + PlayerMorph.getUnlockedShapes(player).put(type, Remorphed.getKillToUnlock(type.getEntityType())); + } } // check if entity is unlocked by remorphed, prevents native unlock mechanic by walkers else if (!Remorphed.canUseShape(player, type)) { - if (!Walkers.hasSpecialShape(player.getUUID()) || !type.getEntityType().equals(EntityType.WOLF)) + if (!type.getEntityType().equals(EntityType.WOLF) || !Walkers.hasSpecialShape(player.getUUID())) { return InteractionResult.FAIL; + } } } diff --git a/common/src/main/java/tocraft/remorphed/handler/client/ClientPlayerRespawnHandler.java b/common/src/main/java/tocraft/remorphed/handler/client/ClientPlayerRespawnHandler.java index ee5d159..c665c95 100644 --- a/common/src/main/java/tocraft/remorphed/handler/client/ClientPlayerRespawnHandler.java +++ b/common/src/main/java/tocraft/remorphed/handler/client/ClientPlayerRespawnHandler.java @@ -2,13 +2,14 @@ import net.minecraft.client.player.LocalPlayer; import tocraft.craftedcore.event.client.ClientPlayerEvents; -import tocraft.remorphed.impl.RemorphedPlayerDataProvider; +import tocraft.remorphed.impl.PlayerMorph; public class ClientPlayerRespawnHandler implements ClientPlayerEvents.ClientPlayerRespawn { @Override public void respawn(LocalPlayer oldPlayer, LocalPlayer newPlayer) { - ((RemorphedPlayerDataProvider) newPlayer).remorphed$setUnlockedShapes(((RemorphedPlayerDataProvider) oldPlayer).remorphed$getUnlockedShapes()); - ((RemorphedPlayerDataProvider) newPlayer).remorphed$getFavorites().clear(); - ((RemorphedPlayerDataProvider) newPlayer).remorphed$getFavorites().addAll(((RemorphedPlayerDataProvider) oldPlayer).remorphed$getFavorites()); + PlayerMorph.getUnlockedShapes(newPlayer).clear(); + PlayerMorph.getUnlockedShapes(newPlayer).putAll(PlayerMorph.getUnlockedShapes(oldPlayer)); + PlayerMorph.getFavorites(newPlayer).clear(); + PlayerMorph.getFavorites(newPlayer).addAll(PlayerMorph.getFavorites(oldPlayer)); } } diff --git a/common/src/main/java/tocraft/remorphed/impl/PlayerMorph.java b/common/src/main/java/tocraft/remorphed/impl/PlayerMorph.java new file mode 100644 index 0000000..b986513 --- /dev/null +++ b/common/src/main/java/tocraft/remorphed/impl/PlayerMorph.java @@ -0,0 +1,26 @@ +package tocraft.remorphed.impl; + +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import tocraft.walkers.api.variant.ShapeType; + +import java.util.Map; +import java.util.Set; + +public class PlayerMorph { + public static Map, Integer> getUnlockedShapes(Player player) { + return ((RemorphedPlayerDataProvider) player).remorphed$getUnlockedShapes(); + } + + public static void addKill(Player player, ShapeType type) { + ((RemorphedPlayerDataProvider) player).remorphed$addKill(type); + } + + public static int getKills(Player player, ShapeType type) { + return ((RemorphedPlayerDataProvider) player).remorphed$getKills(type); + } + + public static Set> getFavorites(Player player) { + return ((RemorphedPlayerDataProvider) player).remorphed$getFavorites(); + } +} diff --git a/common/src/main/java/tocraft/remorphed/impl/RemorphedPlayerDataProvider.java b/common/src/main/java/tocraft/remorphed/impl/RemorphedPlayerDataProvider.java index fe9b47d..908917d 100644 --- a/common/src/main/java/tocraft/remorphed/impl/RemorphedPlayerDataProvider.java +++ b/common/src/main/java/tocraft/remorphed/impl/RemorphedPlayerDataProvider.java @@ -6,12 +6,13 @@ import java.util.Map; import java.util.Set; +/** + * @see PlayerMorph + */ public interface RemorphedPlayerDataProvider { Map, Integer> remorphed$getUnlockedShapes(); - void remorphed$setUnlockedShapes(Map, Integer> types); - void remorphed$addKill(ShapeType type); int remorphed$getKills(ShapeType type); diff --git a/common/src/main/java/tocraft/remorphed/mixin/PlayerEntityMixin.java b/common/src/main/java/tocraft/remorphed/mixin/PlayerEntityMixin.java index 5210b9b..11ea19e 100644 --- a/common/src/main/java/tocraft/remorphed/mixin/PlayerEntityMixin.java +++ b/common/src/main/java/tocraft/remorphed/mixin/PlayerEntityMixin.java @@ -24,11 +24,11 @@ import java.util.Map; import java.util.Set; -@SuppressWarnings({"DataFlowIssue", "resource", "ControlFlowStatementWithoutBraces"}) +@SuppressWarnings({"DataFlowIssue", "resource", "ControlFlowStatementWithoutBraces", "unused"}) @Mixin(Player.class) public abstract class PlayerEntityMixin extends LivingEntity implements RemorphedPlayerDataProvider { @Unique - private Map, Integer> remorphed$unlockedShapes = new HashMap<>(); + private final Map, Integer> remorphed$unlockedShapes = new HashMap<>(); @Unique private final Set> remorphed$favoriteShapes = new HashSet<>(); @Unique @@ -120,12 +120,6 @@ private void writeNbt(CompoundTag tag, CallbackInfo info) { return remorphed$unlockedShapes; } - @Unique - @Override - public void remorphed$setUnlockedShapes(Map, Integer> types) { - remorphed$unlockedShapes = types; - } - @Unique @Override public void remorphed$addKill(ShapeType type) { diff --git a/common/src/main/java/tocraft/remorphed/network/ClientNetworking.java b/common/src/main/java/tocraft/remorphed/network/ClientNetworking.java index bd395f8..6f7e0cd 100644 --- a/common/src/main/java/tocraft/remorphed/network/ClientNetworking.java +++ b/common/src/main/java/tocraft/remorphed/network/ClientNetworking.java @@ -14,7 +14,7 @@ import tocraft.craftedcore.client.CraftedCoreClient; import tocraft.craftedcore.network.ModernNetworking; import tocraft.craftedcore.network.client.ClientNetworking.ApplicablePacket; -import tocraft.remorphed.impl.RemorphedPlayerDataProvider; +import tocraft.remorphed.impl.PlayerMorph; import tocraft.walkers.api.variant.ShapeType; import java.util.HashMap; @@ -46,18 +46,19 @@ public static void handleUnlockedSyncPacket(ModernNetworking.Context context, Co @Nullable Player syncTarget = player.getCommandSenderWorld().getPlayerByUUID(uuid); - if (syncTarget != null) - ((RemorphedPlayerDataProvider) syncTarget).remorphed$setUnlockedShapes(unlockedShapes); + if (syncTarget != null) { + PlayerMorph.getUnlockedShapes(player).clear(); + PlayerMorph.getUnlockedShapes(player).putAll(unlockedShapes); + } }); } private static void handleFavoriteSyncPacket(ModernNetworking.Context context, CompoundTag tag) { ClientNetworking.runOrQueue(context, player -> { - RemorphedPlayerDataProvider data = (RemorphedPlayerDataProvider) player; - data.remorphed$getFavorites().clear(); + PlayerMorph.getFavorites(player).clear(); ListTag idList = tag.getList("FavoriteShapes", Tag.TAG_COMPOUND); - idList.forEach(compound -> data.remorphed$getFavorites().add(ShapeType.from((CompoundTag) compound))); + idList.forEach(compound -> PlayerMorph.getFavorites(player).add(ShapeType.from((CompoundTag) compound))); }); } diff --git a/common/src/main/java/tocraft/remorphed/network/NetworkHandler.java b/common/src/main/java/tocraft/remorphed/network/NetworkHandler.java index 26c5e9e..8a4db2a 100644 --- a/common/src/main/java/tocraft/remorphed/network/NetworkHandler.java +++ b/common/src/main/java/tocraft/remorphed/network/NetworkHandler.java @@ -12,7 +12,7 @@ import org.jetbrains.annotations.Nullable; import tocraft.craftedcore.network.ModernNetworking; import tocraft.remorphed.Remorphed; -import tocraft.remorphed.impl.RemorphedPlayerDataProvider; +import tocraft.remorphed.impl.PlayerMorph; import tocraft.walkers.Walkers; import tocraft.walkers.api.PlayerShape; import tocraft.walkers.api.PlayerShapeChanger; @@ -70,7 +70,7 @@ private static void handleShapeRequestPacket(ModernNetworking.Context context, C } public static void sendFavoriteSync(ServerPlayer player) { - Set> favorites = ((RemorphedPlayerDataProvider) player).remorphed$getFavorites(); + Set> favorites = PlayerMorph.getFavorites(player); CompoundTag tag = new CompoundTag(); ListTag idList = new ListTag(); favorites.forEach(type -> idList.add(type.writeCompound())); @@ -93,16 +93,16 @@ private static void handleFavoriteRequestPacket(ModernNetworking.Context context EntityType entityType = (EntityType) BuiltInRegistries.ENTITY_TYPE.get(new ResourceLocation(packet.getString("id"))); int variant = packet.getInt("variant"); boolean favorite = packet.getBoolean("favorite"); - RemorphedPlayerDataProvider playerData = (RemorphedPlayerDataProvider) context.getPlayer(); context.getPlayer().getServer().execute(() -> { @Nullable ShapeType type = ShapeType.from(entityType, variant); if (type != null) { - if (favorite) - playerData.remorphed$getFavorites().add(type); - else - playerData.remorphed$getFavorites().remove(type); + if (favorite) { + PlayerMorph.getFavorites(context.getPlayer()).add(type); + } else { + PlayerMorph.getFavorites(context.getPlayer()).remove(type); + } // resync favorites sendFavoriteSync((ServerPlayer) context.getPlayer()); } diff --git a/common/src/main/java/tocraft/remorphed/screen/RemorphedScreen.java b/common/src/main/java/tocraft/remorphed/screen/RemorphedScreen.java index 860ef8e..08c7865 100644 --- a/common/src/main/java/tocraft/remorphed/screen/RemorphedScreen.java +++ b/common/src/main/java/tocraft/remorphed/screen/RemorphedScreen.java @@ -17,7 +17,7 @@ import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.player.Player; import tocraft.remorphed.Remorphed; -import tocraft.remorphed.impl.RemorphedPlayerDataProvider; +import tocraft.remorphed.impl.PlayerMorph; import tocraft.remorphed.mixin.accessor.ScreenAccessor; import tocraft.remorphed.screen.widget.EntityWidget; import tocraft.remorphed.screen.widget.PlayerWidget; @@ -78,8 +78,8 @@ public void init() { } else if (Objects.equals(second, currentShape)) { return 1; } else { - boolean firstIsFav = ((RemorphedPlayerDataProvider) minecraft.player).remorphed$getFavorites().contains(first); - boolean secondIsFav = ((RemorphedPlayerDataProvider) minecraft.player).remorphed$getFavorites().contains(second); + boolean firstIsFav = PlayerMorph.getFavorites(minecraft.player).contains(first); + boolean secondIsFav = PlayerMorph.getFavorites(minecraft.player).contains(second); if (firstIsFav == secondIsFav) return 0; if (firstIsFav) @@ -204,7 +204,7 @@ private void populateEntityWidgets(List> rendered) { (ShapeType) type, entity, this, - ((RemorphedPlayerDataProvider) minecraft.player).remorphed$getFavorites().contains(type), + PlayerMorph.getFavorites(minecraft.player).contains(type), type.equals(currentType) ); diff --git a/common/src/main/java/tocraft/remorphed/screen/widget/SpecialShapeWidget.java b/common/src/main/java/tocraft/remorphed/screen/widget/SpecialShapeWidget.java index 9e52cd2..f547cf3 100644 --- a/common/src/main/java/tocraft/remorphed/screen/widget/SpecialShapeWidget.java +++ b/common/src/main/java/tocraft/remorphed/screen/widget/SpecialShapeWidget.java @@ -12,7 +12,7 @@ import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.animal.Wolf; import tocraft.remorphed.Remorphed; -import tocraft.remorphed.impl.RemorphedPlayerDataProvider; +import tocraft.remorphed.impl.PlayerMorph; import tocraft.remorphed.network.NetworkHandler; import tocraft.remorphed.screen.RemorphedScreen; import tocraft.walkers.Walkers; @@ -39,7 +39,7 @@ public SpecialShapeWidget(int x, int y, int width, int height, RemorphedScreen p if (Minecraft.getInstance().player != null && PlayerShape.getCurrentShape(Minecraft.getInstance().player) instanceof Wolf wolf) wolf.saveWithoutId(nbt); this.isCurrent = nbt.contains("isSpecial") && nbt.getBoolean("isSpecial"); - this.isAvailable = Remorphed.canUseEveryShape(Minecraft.getInstance().player) || ((RemorphedPlayerDataProvider) Minecraft.getInstance().player).remorphed$getUnlockedShapes().keySet().stream().anyMatch(type -> type.getEntityType().equals(EntityType.WOLF)); + this.isAvailable = Remorphed.canUseEveryShape(Minecraft.getInstance().player) || (PlayerMorph.getUnlockedShapes(Minecraft.getInstance().player)).keySet().stream().anyMatch(type -> type.getEntityType().equals(EntityType.WOLF)); setTooltip(Tooltip.create(Component.translatable(isAvailable ? "remorphed.special_shape_available" : "remorphed.special_shape_unavailable"))); } diff --git a/gradle.properties b/gradle.properties index 9f83f59..43a51cb 100644 --- a/gradle.properties +++ b/gradle.properties @@ -13,8 +13,8 @@ parchmentmc_mappings=2024.05.01 forge_version=50.0.6 neoforge_version=20.6.1-beta # Dependency Versions -craftedcore_version=4.2 -woodwalkers_version=4.4.3 +craftedcore_version=4.2.3 +woodwalkers_version=4.5 # Upload data curseforge_id=950721 modrinth_id=8aeV5uJW diff --git a/neoforge/src/main/java/tocraft/remorphed/neoforge/RemorphedNeoForge.java b/neoforge/src/main/java/tocraft/remorphed/neoforge/RemorphedNeoForge.java index 5002283..7f8b345 100644 --- a/neoforge/src/main/java/tocraft/remorphed/neoforge/RemorphedNeoForge.java +++ b/neoforge/src/main/java/tocraft/remorphed/neoforge/RemorphedNeoForge.java @@ -3,6 +3,7 @@ import net.neoforged.fml.common.Mod; import tocraft.remorphed.Remorphed; +@SuppressWarnings("unused") @Mod(Remorphed.MODID) public class RemorphedNeoForge { From e29f6b03ba0861d10c00aad1ac28d24b6c401f0c Mon Sep 17 00:00:00 2001 From: ToCraft Date: Wed, 5 Jun 2024 16:47:09 +0200 Subject: [PATCH 6/6] change version to 3.6.3 --- CHANGELOG.md | 6 ++++++ gradle.properties | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dda8ddd..04616a9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +remorphed 3.6.3 +================ + +- fix crash when morphing back and unlockFriendlyNormal is true +- use new walkers API Levels & use PlayerMorph.class + remorphed 3.6.2 ================ diff --git a/gradle.properties b/gradle.properties index 43a51cb..09b2714 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ minecraft_version=1.20.6 supported_versions=1.20.6 archives_base_name=remorphed artifact_type=release -mod_version=3.6.2 +mod_version=3.6.3 maven_group=dev.tocraft # Loader Versions fabric_loader_version=0.15.11