Skip to content

Commit 35618be

Browse files
committed
Merge branch '1.19.4' into 1.18.2
2 parents 17809e0 + f1a54be commit 35618be

20 files changed

+178
-101
lines changed

.github/workflows/push_build_and_release.yml

+39-3
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,11 @@ on:
1212
inputs:
1313
release:
1414
description: 'Release'
15-
required: true
15+
required: false
16+
default: 'true'
17+
discord_message:
18+
description: 'Discord Message'
19+
required: false
1620
default: 'false'
1721

1822
permissions:
@@ -54,12 +58,13 @@ jobs:
5458
!**/*-dev.jar
5559
!**/*-shadow.jar
5660
!**/*-transformProduction*.jar
61+
!**/testmod*/
5762
release:
5863
name: "Release"
5964
needs: build
6065
runs-on: ubuntu-latest
6166
if: |
62-
!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[release]') && github.event.inputs.release == 'true'
67+
!contains(github.event.head_commit.message, '[no_release]') && github.event.inputs.release != 'false'
6368
steps:
6469
- uses: actions/checkout@v4
6570

@@ -74,6 +79,10 @@ jobs:
7479
- name: Setup Gradle
7580
uses: gradle/actions/setup-gradle@v3
7681

82+
- name: Extract Artifact Type
83+
run: |
84+
cat $GITHUB_WORKSPACE/gradle.properties | grep ^artifact_type= >> $GITHUB_ENV
85+
7786
- name: Publish to Maven, CurseForge & Modrinth
7887
run: ./gradlew publish modrinth curseforge --no-daemon
7988
env:
@@ -91,15 +100,42 @@ jobs:
91100
- name: Create version name
92101
run: echo "version_name_git=$minecraft_version-$mod_version" >> $GITHUB_ENV
93102
- name: Create GitHub Tag
103+
if: |
104+
${{ env.artifact_type }} == 'release'
94105
uses: EndBug/latest-tag@latest
95106
with:
96107
ref: "${{ env.version_name_git }}"
97108
- name: Create GitHub Release
109+
if: |
110+
${{ env.artifact_type }} == 'release'
98111
uses: softprops/action-gh-release@v2
99112
with:
100113
tag_name: "${{ env.version_name_git }}"
101114
files: |
102115
fabric/build/libs/${{ env.archives_base_name }}-${{ env.mod_version }}-fabric.jar,
103116
forge/build/libs/${{ env.archives_base_name }}-${{ env.mod_version }}-forge.jar,
104117
neoforge/build/libs/${{ env.archives_base_name }}-${{ env.mod_version }}-neoforge.jar
105-
body_path: ${{ github.workspace }}/extracted.CHANGELOG.md
118+
body_path: ${{ github.workspace }}/extracted.CHANGELOG.md
119+
discord_message:
120+
name: "Send Discord Release Message"
121+
needs: build
122+
runs-on: ubuntu-latest
123+
if: |
124+
github.event.inputs.discord_message == 'true'
125+
steps:
126+
- uses: actions/checkout@v4
127+
128+
- name: Set up JDK 21
129+
uses: actions/setup-java@v4
130+
with:
131+
java-version: 21
132+
distribution: 'temurin'
133+
- name: Validate Gradle Wrapper
134+
uses: gradle/actions/wrapper-validation@v3
135+
136+
- name: Setup Gradle
137+
uses: gradle/actions/setup-gradle@v3
138+
- name: Send Discord Message
139+
run: ./gradlew discordRelease --no-daemon
140+
env:
141+
DISCORD_WEB_HOOK: ${{ secrets.DISCORD_WEB_HOOK }}

CHANGELOG.md

+12
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,45 @@
1+
remorphed 3.6.3
2+
================
3+
4+
- fix crash when morphing back and unlockFriendlyNormal is true
5+
- use new walkers API Levels & use PlayerMorph.class
6+
17
remorphed 3.6.2
28
================
9+
310
- update to CraftedCore 4.2 & Walkers 4.4.2
411
- temporarily disable caching thread in menu to prevent wrong rendering
512

613
remorphed 3.6.1
714
================
15+
816
- fix issues with entity caching in menu
917

1018
remorphed 3.6
1119
================
20+
1221
- selected entity is rendered first
1322
- add compatibility for walkers 4.2 (and variants menu)
1423
- skills can renderer multiple times per entity if required (e.g. the MobEffectSkill can render multiple icons now)
1524

1625
remorphed 3.5
1726
================
27+
1828
- change entity orientation in menu
1929
- fix sync error
2030
- fix render scissor (no more entities in the menu)
2131
- some skills render the icon (toggleable)
2232

2333
remorphed 3.4
2434
================
35+
2536
- fix crash on startup for 1.20.2+
2637
- player data will be properly restored on death now (required re-login before)
2738
- fix only craftedcore 3.0 possible on Fabric
2839

2940
remorphed 3.3
3041
================
42+
3143
- menu loads entities in the background
3244
- menu only renders visible entities (fixes low FPS in the menu)
3345
- fix every entity available in survival

build.gradle

+3-3
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ apply from: "https://raw.githubusercontent.com/ToCraft/GradleMaster/main/main.gr
77

88
ext {
99
mod_meta = [
10-
minecraft_version : minecraft_version, version: version,
11-
craftedcore_version : craftedcore_version,
12-
woodwalkers_version : woodwalkers_version
10+
minecraft_version : minecraft_version, version: version,
11+
craftedcore_version: craftedcore_version,
12+
woodwalkers_version: woodwalkers_version
1313
]
1414
}

common/src/main/java/tocraft/remorphed/Remorphed.java

+11-11
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
package tocraft.remorphed;
22

3-
import io.netty.buffer.Unpooled;
43
import net.fabricmc.api.EnvType;
54
import net.minecraft.core.Registry;
65
import net.minecraft.nbt.CompoundTag;
76
import net.minecraft.nbt.ListTag;
8-
import net.minecraft.network.FriendlyByteBuf;
9-
import net.minecraft.network.chat.Component;
107
import net.minecraft.network.chat.TextComponent;
118
import net.minecraft.resources.ResourceLocation;
129
import net.minecraft.server.level.ServerPlayer;
@@ -23,13 +20,14 @@
2320
import tocraft.craftedcore.platform.VersionChecker;
2421
import tocraft.remorphed.command.RemorphedCommand;
2522
import tocraft.remorphed.config.RemorphedConfig;
26-
import tocraft.remorphed.events.ShapeEventsCallback;
2723
import tocraft.remorphed.handler.LivingDeathHandler;
2824
import tocraft.remorphed.handler.PlayerRespawnHandler;
29-
import tocraft.remorphed.impl.RemorphedPlayerDataProvider;
25+
import tocraft.remorphed.handler.ShapeEventsCallback;
26+
import tocraft.remorphed.impl.PlayerMorph;
3027
import tocraft.remorphed.network.NetworkHandler;
3128
import tocraft.walkers.Walkers;
3229
import tocraft.walkers.api.events.ShapeEvents;
30+
import tocraft.walkers.api.platform.ApiLevel;
3331
import tocraft.walkers.api.variant.ShapeType;
3432

3533
import java.util.ArrayList;
@@ -46,6 +44,11 @@ public class Remorphed {
4644
public static boolean displayTraitsInMenu = true;
4745

4846
public void initialize() {
47+
ShapeEvents.UNLOCK_SHAPE.register(new ShapeEventsCallback());
48+
if (!CONFIG.unlockFriendlyNormal) {
49+
ApiLevel.setApiLevel(ApiLevel.MORPHING_AND_VARIANTS_MENU_ONLY);
50+
}
51+
4952
// add DarkShadow_2k to devs (for creating the special shape icon and concepts)
5053
Walkers.devs.add(UUID.fromString("74b6d9b3-c8c1-40db-ab82-ccc290d1aa03"));
5154

@@ -55,8 +58,6 @@ public void initialize() {
5558

5659
NetworkHandler.registerPacketReceiver();
5760

58-
ShapeEvents.UNLOCK_SHAPE.register(((player, type) -> new ShapeEventsCallback().event(player, type)));
59-
ShapeEvents.SWAP_SHAPE.register(((player, shape) -> new ShapeEventsCallback().event(player, ShapeType.from(shape))));
6061
CommandEvents.REGISTRATION.register(new RemorphedCommand());
6162
EntityEvents.LIVING_DEATH.register(new LivingDeathHandler());
6263
PlayerEvents.PLAYER_RESPAWN.register(new PlayerRespawnHandler());
@@ -74,7 +75,7 @@ public static boolean canUseEveryShape(Player player) {
7475
}
7576

7677
public static boolean canUseShape(Player player, ShapeType<?> type) {
77-
return canUseEveryShape(player) || !Remorphed.CONFIG.lockTransform && (type == null || Remorphed.getKillToUnlock(type.getEntityType()) <= 0 || ((RemorphedPlayerDataProvider) player).remorphed$getKills(type) >= Remorphed.getKillToUnlock(type.getEntityType()));
78+
return canUseEveryShape(player) || !Remorphed.CONFIG.lockTransform && (type == null || Remorphed.getKillToUnlock(type.getEntityType()) <= 0 || PlayerMorph.getKills(player, type) >= Remorphed.getKillToUnlock(type.getEntityType()));
7879
}
7980

8081
public static List<ShapeType<?>> getUnlockedShapes(Player player) {
@@ -87,7 +88,7 @@ public static List<ShapeType<?>> getUnlockedShapes(Player player) {
8788
}
8889
return unlocked;
8990
} else {
90-
return new ArrayList<>(((RemorphedPlayerDataProvider) player).remorphed$getUnlockedShapes().keySet().stream().filter(type -> canUseShape(player, type)).toList());
91+
return new ArrayList<>(PlayerMorph.getUnlockedShapes(player).keySet().stream().filter(type -> canUseShape(player, type)).toList());
9192
}
9293
}
9394

@@ -102,11 +103,10 @@ public static void sync(ServerPlayer player) {
102103
}
103104

104105
public static void sync(ServerPlayer changed, ServerPlayer packetTarget) {
105-
FriendlyByteBuf packet = new FriendlyByteBuf(Unpooled.buffer());
106106
CompoundTag compoundTag = new CompoundTag();
107107

108108
// serialize current shape data to tag if it exists
109-
Map<ShapeType<?>, Integer> unlockedShapes = ((RemorphedPlayerDataProvider) changed).remorphed$getUnlockedShapes();
109+
Map<ShapeType<?>, Integer> unlockedShapes = PlayerMorph.getUnlockedShapes(changed);
110110

111111
ListTag list = new ListTag();
112112

common/src/main/java/tocraft/remorphed/command/RemorphedCommand.java

+5-5
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
import org.jetbrains.annotations.Nullable;
2323
import tocraft.craftedcore.event.common.CommandEvents;
2424
import tocraft.remorphed.Remorphed;
25-
import tocraft.remorphed.impl.RemorphedPlayerDataProvider;
25+
import tocraft.remorphed.impl.PlayerMorph;
2626
import tocraft.walkers.api.PlayerShapeChanger;
2727
import tocraft.walkers.api.variant.ShapeType;
2828

@@ -31,7 +31,7 @@ private static int hasShape(CommandSourceStack source, ServerPlayer player, Reso
3131
ShapeType<LivingEntity> type = getType(source.getLevel(), id, nbt);
3232
Component name = new TranslatableComponent(type.getEntityType().getDescriptionId());
3333

34-
if (((RemorphedPlayerDataProvider) player).remorphed$getUnlockedShapes().containsKey(type)) {
34+
if (PlayerMorph.getUnlockedShapes(player).containsKey(type)) {
3535
source.sendSuccess(new TranslatableComponent(Remorphed.MODID + ".hasShape_success",
3636
player.getDisplayName(), name), true);
3737

@@ -46,7 +46,7 @@ private static void removeShape(CommandSourceStack source, ServerPlayer player,
4646
ShapeType<LivingEntity> type = getType(source.getLevel(), id, nbt);
4747
Component name = new TranslatableComponent(type.getEntityType().getDescriptionId());
4848

49-
((RemorphedPlayerDataProvider) player).remorphed$getUnlockedShapes().remove(type);
49+
PlayerMorph.getUnlockedShapes(player).remove(type);
5050

5151
source.sendSuccess(new TranslatableComponent(Remorphed.MODID + ".removeShape", name, player.getDisplayName()), true);
5252
}
@@ -55,13 +55,13 @@ private static void addShape(CommandSourceStack source, ServerPlayer player, Res
5555
ShapeType<LivingEntity> type = getType(source.getLevel(), id, nbt);
5656
Component name = new TranslatableComponent(type.getEntityType().getDescriptionId());
5757

58-
((RemorphedPlayerDataProvider) player).remorphed$getUnlockedShapes().put(type, Remorphed.getKillToUnlock(type.getEntityType()));
58+
PlayerMorph.getUnlockedShapes(player).put(type, Remorphed.getKillToUnlock(type.getEntityType()));
5959

6060
source.sendSuccess(new TranslatableComponent(Remorphed.MODID + ".addShape", player.getDisplayName(), name), true);
6161
}
6262

6363
private static void clearShapes(CommandSourceStack source, ServerPlayer player) {
64-
((RemorphedPlayerDataProvider) player).remorphed$getUnlockedShapes().clear();
64+
PlayerMorph.getUnlockedShapes(player).clear();
6565

6666
source.sendSuccess(new TranslatableComponent(Remorphed.MODID + ".clearShapes", player.getDisplayName()), true);
6767
PlayerShapeChanger.change2ndShape(player, null);

common/src/main/java/tocraft/remorphed/events/ShapeEventsCallback.java

-29
This file was deleted.

common/src/main/java/tocraft/remorphed/handler/LivingDeathHandler.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import net.minecraft.world.entity.player.Player;
88
import tocraft.craftedcore.event.common.EntityEvents;
99
import tocraft.remorphed.Remorphed;
10-
import tocraft.remorphed.impl.RemorphedPlayerDataProvider;
10+
import tocraft.remorphed.impl.PlayerMorph;
1111
import tocraft.walkers.api.PlayerShape;
1212
import tocraft.walkers.api.PlayerShapeChanger;
1313
import tocraft.walkers.api.variant.ShapeType;
@@ -18,9 +18,9 @@ public InteractionResult die(LivingEntity entity, DamageSource source) {
1818
if (!(entity instanceof Player) && source.getEntity() instanceof ServerPlayer killer) {
1919
ShapeType<?> type = ShapeType.from(entity);
2020
if (type != null) {
21-
((RemorphedPlayerDataProvider) killer).remorphed$addKill(type);
21+
PlayerMorph.addKill(killer, type);
2222

23-
if (Remorphed.CONFIG.autoTransform && ((RemorphedPlayerDataProvider) killer).remorphed$getKills(type) >= Remorphed.getKillToUnlock(type.getEntityType())) {
23+
if (Remorphed.CONFIG.autoTransform && PlayerMorph.getKills(killer, type) >= Remorphed.getKillToUnlock(type.getEntityType())) {
2424
PlayerShapeChanger.change2ndShape(killer, type);
2525
PlayerShape.updateShapes(killer, type.create(killer.level));
2626
}
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
11
package tocraft.remorphed.handler;
22

3-
import net.minecraft.client.player.LocalPlayer;
43
import net.minecraft.server.level.ServerPlayer;
5-
import tocraft.craftedcore.event.client.ClientPlayerEvents;
64
import tocraft.craftedcore.event.common.PlayerEvents;
7-
import tocraft.remorphed.impl.RemorphedPlayerDataProvider;
5+
import tocraft.remorphed.impl.PlayerMorph;
86

97
public class PlayerRespawnHandler implements PlayerEvents.PlayerRespawn {
108
@Override
119
public void clone(ServerPlayer oldPlayer, ServerPlayer newPlayer) {
12-
((RemorphedPlayerDataProvider) newPlayer).remorphed$setUnlockedShapes(((RemorphedPlayerDataProvider) oldPlayer).remorphed$getUnlockedShapes());
13-
((RemorphedPlayerDataProvider) newPlayer).remorphed$getFavorites().clear();
14-
((RemorphedPlayerDataProvider) newPlayer).remorphed$getFavorites().addAll(((RemorphedPlayerDataProvider) oldPlayer).remorphed$getFavorites());
10+
PlayerMorph.getUnlockedShapes(newPlayer).clear();
11+
PlayerMorph.getUnlockedShapes(newPlayer).putAll(PlayerMorph.getUnlockedShapes(oldPlayer));
12+
PlayerMorph.getFavorites(newPlayer).clear();
13+
PlayerMorph.getFavorites(newPlayer).addAll(PlayerMorph.getFavorites(oldPlayer));
1514
}
1615
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package tocraft.remorphed.handler;
2+
3+
import net.minecraft.server.level.ServerPlayer;
4+
import net.minecraft.world.InteractionResult;
5+
import net.minecraft.world.entity.EntityType;
6+
import net.minecraft.world.entity.LivingEntity;
7+
import net.minecraft.world.entity.monster.Enemy;
8+
import tocraft.remorphed.Remorphed;
9+
import tocraft.remorphed.impl.PlayerMorph;
10+
import tocraft.walkers.Walkers;
11+
import tocraft.walkers.api.events.ShapeEvents;
12+
import tocraft.walkers.api.variant.ShapeType;
13+
14+
public class ShapeEventsCallback implements ShapeEvents.UnlockShapeCallback {
15+
@Override
16+
public InteractionResult unlock(ServerPlayer player, ShapeType<?> type) {
17+
if (type != null) {
18+
// check if the walkers unlock mechanic should be used
19+
if (!Remorphed.CONFIG.lockTransform && Remorphed.CONFIG.unlockFriendlyNormal) {
20+
LivingEntity entityToBeUnlocked = type.create(player.level);
21+
if (!(entityToBeUnlocked instanceof Enemy)) {
22+
PlayerMorph.getUnlockedShapes(player).put(type, Remorphed.getKillToUnlock(type.getEntityType()));
23+
}
24+
}
25+
// check if entity is unlocked by remorphed, prevents native unlock mechanic by walkers
26+
else if (!Remorphed.canUseShape(player, type)) {
27+
if (!type.getEntityType().equals(EntityType.WOLF) || !Walkers.hasSpecialShape(player.getUUID())) {
28+
return InteractionResult.FAIL;
29+
}
30+
}
31+
}
32+
33+
return InteractionResult.PASS;
34+
}
35+
}

common/src/main/java/tocraft/remorphed/handler/client/ClientPlayerRespawnHandler.java

+5-4
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@
22

33
import net.minecraft.client.player.LocalPlayer;
44
import tocraft.craftedcore.event.client.ClientPlayerEvents;
5-
import tocraft.remorphed.impl.RemorphedPlayerDataProvider;
5+
import tocraft.remorphed.impl.PlayerMorph;
66

77
public class ClientPlayerRespawnHandler implements ClientPlayerEvents.ClientPlayerRespawn {
88
@Override
99
public void respawn(LocalPlayer oldPlayer, LocalPlayer newPlayer) {
10-
((RemorphedPlayerDataProvider) newPlayer).remorphed$setUnlockedShapes(((RemorphedPlayerDataProvider) oldPlayer).remorphed$getUnlockedShapes());
11-
((RemorphedPlayerDataProvider) newPlayer).remorphed$getFavorites().clear();
12-
((RemorphedPlayerDataProvider) newPlayer).remorphed$getFavorites().addAll(((RemorphedPlayerDataProvider) oldPlayer).remorphed$getFavorites());
10+
PlayerMorph.getUnlockedShapes(newPlayer).clear();
11+
PlayerMorph.getUnlockedShapes(newPlayer).putAll(PlayerMorph.getUnlockedShapes(oldPlayer));
12+
PlayerMorph.getFavorites(newPlayer).clear();
13+
PlayerMorph.getFavorites(newPlayer).addAll(PlayerMorph.getFavorites(oldPlayer));
1314
}
1415
}

0 commit comments

Comments
 (0)