From eab39bf9d16edc50b89f5d438c68699826d73a36 Mon Sep 17 00:00:00 2001 From: Kurt Cancemi Date: Sat, 20 May 2023 01:56:39 -0400 Subject: [PATCH 1/3] Add 1.19.4 Support * Architectury updated to 8.1.80 * Architectury Loom updated to 1.2-SNAPSHOT * Gradle updated to 8.1.1 * Shadow updated to 8.1.1 * Omega-Config updated to 1.3.0+1.19.2 * Targeting Fabric loader 0.14.19 * Targeting Fabric API version 0.81.1+1.19.4 * Targeting Forge version 45.0.64 * Requiring Java 17+ --- build.gradle | 2 +- .../main/java/draylar/identity/Identity.java | 4 +- .../ability/AbilityOverlayRenderer.java | 2 +- .../identity/ability/impl/CreeperAbility.java | 3 +- .../identity/ability/impl/EvokerAbility.java | 6 +- .../identity/api/IdentityGranting.java | 4 +- .../draylar/identity/api/PlayerFavorites.java | 10 - .../draylar/identity/api/PlayerIdentity.java | 4 +- .../draylar/identity/api/PlayerUnlocks.java | 9 - .../identity/api/model/EntityArms.java | 14 +- .../identity/api/variant/IdentityType.java | 10 +- .../identity/command/IdentityCommand.java | 41 +-- .../impl/tick/identity/FrogTickHandler.java | 9 +- .../impl/variant/CatTypeProvider.java | 6 +- .../impl/variant/FoxTypeProvider.java | 6 +- .../impl/variant/FrogTypeProvider.java | 7 +- .../impl/variant/ParrotTypeProvider.java | 4 +- .../variant/TropicalFishTypeProvider.java | 5 +- .../main/java/draylar/identity/math/math.java | 20 ++ .../identity/mixin/DrownedOverlayMixin.java | 2 +- .../identity/mixin/InGameHudMixin.java | 6 +- .../identity/mixin/LivingEntityMixin.java | 4 +- .../identity/mixin/PlayerEntityMixin.java | 11 +- .../mixin/PlayerEntityRendererMixin.java | 10 +- .../identity/mixin/PlayerManagerMixin.java | 7 +- .../identity/mixin/PlayerSonicBoomMixin.java | 4 +- .../identity/mixin/PlayerSwimmingMixin.java | 2 +- .../identity/mixin/RavagerEntityMixin.java | 6 +- .../mixin/ServerPlayerEntityMixin.java | 6 +- .../identity/mixin/StrayOverlayMixin.java | 2 +- .../mixin/accessor/FoxEntityAccessor.java | 2 +- .../mixin/accessor/LimbAnimatorAccessor.java | 18 ++ .../player/ClientPlayerDataCacheMixin.java | 5 +- .../mixin/player/PlayerEntityDataMixin.java | 12 +- .../identity/network/ServerNetworking.java | 2 - .../network/impl/FavoritePackets.java | 6 +- .../identity/network/impl/SwapPackets.java | 6 +- .../identity/registry/IdentityEntityTags.java | 6 +- .../identity/screen/IdentityScreen.java | 22 +- .../identity/screen/widget/EntityWidget.java | 20 +- .../identity/screen/widget/HelpWidget.java | 11 +- .../identity/screen/widget/PlayerWidget.java | 4 +- .../src/main/resources/identity.mixins.json | 4 +- fabric/build.gradle | 12 +- fabric/gradle.properties | 8 +- fabric/src/main/resources/fabric.mod.json | 2 +- .../resources/identity-fabric.mixins.json | 2 +- forge/build.gradle | 8 +- .../main/resources/identity-forge.mixins.json | 2 +- gradle.properties | 12 +- gradle/wrapper/gradle-wrapper.jar | Bin 55616 -> 62076 bytes gradle/wrapper/gradle-wrapper.properties | 5 +- gradlew | 279 +++++++++++------- gradlew.bat | 192 ++++++------ 54 files changed, 462 insertions(+), 404 deletions(-) create mode 100644 common/src/main/java/draylar/identity/math/math.java create mode 100644 common/src/main/java/draylar/identity/mixin/accessor/LimbAnimatorAccessor.java diff --git a/build.gradle b/build.gradle index 88f4fe0..eb0d8a3 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ plugins { id 'java-library' id "architectury-plugin" version "3.4-SNAPSHOT" - id "dev.architectury.loom" version "0.12.0-SNAPSHOT" apply false + id "dev.architectury.loom" version "1.2-SNAPSHOT" apply false } java { diff --git a/common/src/main/java/draylar/identity/Identity.java b/common/src/main/java/draylar/identity/Identity.java index c64bb3f..df4576a 100644 --- a/common/src/main/java/draylar/identity/Identity.java +++ b/common/src/main/java/draylar/identity/Identity.java @@ -23,7 +23,7 @@ import net.minecraft.network.PacketByteBuf; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.registry.Registries; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -98,7 +98,7 @@ public static boolean isAquatic(LivingEntity entity) { } public static int getCooldown(EntityType type) { - String id = Registry.ENTITY_TYPE.getId(type).toString(); + String id = Registries.ENTITY_TYPE.getId(type).toString(); return IdentityConfig.getInstance().getAbilityCooldownMap().getOrDefault(id, 20); } } diff --git a/common/src/main/java/draylar/identity/ability/AbilityOverlayRenderer.java b/common/src/main/java/draylar/identity/ability/AbilityOverlayRenderer.java index 7e4ed4f..75c2e0f 100644 --- a/common/src/main/java/draylar/identity/ability/AbilityOverlayRenderer.java +++ b/common/src/main/java/draylar/identity/ability/AbilityOverlayRenderer.java @@ -111,7 +111,7 @@ else if(ticksSinceUpdate > fadingProgress) { // BakedModel heldItemModel = MinecraftClient.getInstance().getItemRenderer().getHeldItemModel(stack, client.world, player); // renderGuiItemModel(matrices, stack, (int) (width * .95f), (int) (height * .92f), heldItemModel); MinecraftClient.getInstance().getItemRenderer() - .renderGuiItemIcon(stack, (int) (width * .95f), (int) (height * .92f)); + .renderGuiItemIcon(matrices, stack, (int) (width * .95f), (int) (height * .92f)); RenderSystem.disableScissor(); matrices.pop(); diff --git a/common/src/main/java/draylar/identity/ability/impl/CreeperAbility.java b/common/src/main/java/draylar/identity/ability/impl/CreeperAbility.java index 133792d..ea9a314 100644 --- a/common/src/main/java/draylar/identity/ability/impl/CreeperAbility.java +++ b/common/src/main/java/draylar/identity/ability/impl/CreeperAbility.java @@ -6,13 +6,14 @@ import net.minecraft.item.Item; import net.minecraft.item.Items; import net.minecraft.world.World; +import net.minecraft.world.World.ExplosionSourceType; import net.minecraft.world.explosion.Explosion; public class CreeperAbility extends IdentityAbility { @Override public void onUse(PlayerEntity player, CreeperEntity identity, World world) { - world.createExplosion(player, player.getX(), player.getY(), player.getZ(), 3.0f, Explosion.DestructionType.NONE); + world.createExplosion(player, player.getX(), player.getY(), player.getZ(), 3.0f, ExplosionSourceType.NONE); } @Override diff --git a/common/src/main/java/draylar/identity/ability/impl/EvokerAbility.java b/common/src/main/java/draylar/identity/ability/impl/EvokerAbility.java index a15c64a..ef5b43e 100644 --- a/common/src/main/java/draylar/identity/ability/impl/EvokerAbility.java +++ b/common/src/main/java/draylar/identity/ability/impl/EvokerAbility.java @@ -30,7 +30,7 @@ public void onUse(PlayerEntity player, EvokerEntity identity, World world) { // If the block underneath is solid, we are good to go. EvokerFangsEntity fangs = new EvokerFangsEntity(world, origin.getX(), origin.getY(), origin.getZ(), player.getYaw(), blockOut * 2, player); - BlockPos underneathPosition = new BlockPos(origin).down(); + BlockPos underneathPosition = BlockPos.ofFloored(origin).down(); BlockState underneath = world.getBlockState(underneathPosition); if(underneath.isSideSolidFullSquare(world, underneathPosition, Direction.UP) && world.isAir(underneathPosition.up())) { world.spawnEntity(fangs); @@ -38,7 +38,7 @@ public void onUse(PlayerEntity player, EvokerEntity identity, World world) { } // Check underneath (2x down) again... - BlockPos underneath2Position = new BlockPos(origin).down(2); + BlockPos underneath2Position = BlockPos.ofFloored(origin).down(2); BlockState underneath2 = world.getBlockState(underneath2Position); if(underneath2.isSideSolidFullSquare(world, underneath2Position, Direction.UP) && world.isAir(underneath2Position.up())) { fangs.setPos(fangs.getX(), fangs.getY() - 1, fangs.getZ()); @@ -48,7 +48,7 @@ public void onUse(PlayerEntity player, EvokerEntity identity, World world) { } // Check above (1x up) - BlockPos upPosition = new BlockPos(origin).up(); + BlockPos upPosition = BlockPos.ofFloored(origin).up(); BlockState up = world.getBlockState(underneath2Position); if(up.isSideSolidFullSquare(world, upPosition, Direction.UP) && world.isAir(upPosition)) { fangs.setPos(fangs.getX(), fangs.getY() + 1, fangs.getZ()); diff --git a/common/src/main/java/draylar/identity/api/IdentityGranting.java b/common/src/main/java/draylar/identity/api/IdentityGranting.java index 779551d..1641322 100644 --- a/common/src/main/java/draylar/identity/api/IdentityGranting.java +++ b/common/src/main/java/draylar/identity/api/IdentityGranting.java @@ -8,7 +8,7 @@ import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.stat.Stats; import net.minecraft.text.Text; -import net.minecraft.util.registry.Registry; +import net.minecraft.registry.Registries; public class IdentityGranting { @@ -18,7 +18,7 @@ public static void grantByAttack(PlayerEntity player, IdentityType granted) { // If the player has to kill a certain number of mobs before unlocking an Identity, check their statistic for the specific type. if(IdentityConfig.getInstance().requiresKillsForIdentity()) { - String id = Registry.ENTITY_TYPE.getId(granted.getEntityType()).toString(); + String id = Registries.ENTITY_TYPE.getId(granted.getEntityType()).toString(); // Check against a specific count requirement or the default count. int required = IdentityConfig.getInstance().getRequiredKillsForIdentity(); diff --git a/common/src/main/java/draylar/identity/api/PlayerFavorites.java b/common/src/main/java/draylar/identity/api/PlayerFavorites.java index 3b7b02f..1c91e02 100644 --- a/common/src/main/java/draylar/identity/api/PlayerFavorites.java +++ b/common/src/main/java/draylar/identity/api/PlayerFavorites.java @@ -1,22 +1,12 @@ package draylar.identity.api; -import dev.architectury.networking.NetworkManager; import draylar.identity.api.variant.IdentityType; import draylar.identity.impl.PlayerDataProvider; -import draylar.identity.network.NetworkHandler; import draylar.identity.network.impl.FavoritePackets; -import io.netty.buffer.Unpooled; import net.minecraft.entity.EntityType; import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.NbtList; -import net.minecraft.nbt.NbtString; -import net.minecraft.network.PacketByteBuf; import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; -import java.util.List; import java.util.Set; public class PlayerFavorites { diff --git a/common/src/main/java/draylar/identity/api/PlayerIdentity.java b/common/src/main/java/draylar/identity/api/PlayerIdentity.java index d6aab1d..3ef42f0 100644 --- a/common/src/main/java/draylar/identity/api/PlayerIdentity.java +++ b/common/src/main/java/draylar/identity/api/PlayerIdentity.java @@ -10,7 +10,7 @@ import net.minecraft.nbt.NbtCompound; import net.minecraft.network.PacketByteBuf; import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.util.registry.Registry; +import net.minecraft.registry.Registries; public class PlayerIdentity { @@ -57,7 +57,7 @@ public static void sync(ServerPlayerEntity changed, ServerPlayerEntity packetTar // put entity type ID under the key "id", or "minecraft:empty" if no identity is equipped (or the identity entity type is invalid) packet.writeUuid(changed.getUuid()); - packet.writeString(identity == null ? "minecraft:empty" : Registry.ENTITY_TYPE.getId(identity.getType()).toString()); + packet.writeString(identity == null ? "minecraft:empty" : Registries.ENTITY_TYPE.getId(identity.getType()).toString()); packet.writeNbt(entityTag); NetworkManager.sendToPlayer(packetTarget, NetworkHandler.IDENTITY_SYNC, packet); } diff --git a/common/src/main/java/draylar/identity/api/PlayerUnlocks.java b/common/src/main/java/draylar/identity/api/PlayerUnlocks.java index 834459d..41f33a4 100644 --- a/common/src/main/java/draylar/identity/api/PlayerUnlocks.java +++ b/common/src/main/java/draylar/identity/api/PlayerUnlocks.java @@ -1,23 +1,14 @@ package draylar.identity.api; import dev.architectury.event.EventResult; -import dev.architectury.networking.NetworkManager; import draylar.identity.api.event.UnlockIdentityCallback; import draylar.identity.api.variant.IdentityType; import draylar.identity.impl.PlayerDataProvider; -import draylar.identity.network.NetworkHandler; import draylar.identity.network.impl.UnlockPackets; -import io.netty.buffer.Unpooled; import net.minecraft.entity.EntityType; import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.NbtList; -import net.minecraft.nbt.NbtString; -import net.minecraft.network.PacketByteBuf; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.util.ActionResult; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; public class PlayerUnlocks { diff --git a/common/src/main/java/draylar/identity/api/model/EntityArms.java b/common/src/main/java/draylar/identity/api/model/EntityArms.java index ad34c7a..1ba16c0 100644 --- a/common/src/main/java/draylar/identity/api/model/EntityArms.java +++ b/common/src/main/java/draylar/identity/api/model/EntityArms.java @@ -8,8 +8,8 @@ import net.minecraft.entity.EntityType; import net.minecraft.entity.LivingEntity; import net.minecraft.util.Pair; -import net.minecraft.util.math.Vec3f; import org.jetbrains.annotations.Nullable; +import draylar.identity.math.math; import java.util.LinkedHashMap; import java.util.Map; @@ -71,15 +71,15 @@ public static void init() { register(LlamaEntityModel.class, (llama, model) -> ((LlamaEntityModelAccessor) model).getRightFrontLeg(), (stack, model) -> {}); register(PandaEntityModel.class, (llama, model) -> ((QuadrupedEntityModelAccessor) model).getRightFrontLeg(), (stack, model) -> stack.translate(0, -0.5, 0)); register(BlazeEntityModel.class, (llama, model) -> ((BlazeEntityModelAccessor) model).getRods()[10], (stack, model) -> { - stack.multiply(Vec3f.POSITIVE_Z.getDegreesQuaternion(45)); - stack.multiply(Vec3f.POSITIVE_Y.getDegreesQuaternion(-15)); - stack.multiply(Vec3f.POSITIVE_X.getDegreesQuaternion(-25)); + stack.multiply(math.getDegreesQuaternion(math.POSITIVE_Z(), 45)); + stack.multiply(math.getDegreesQuaternion(math.POSITIVE_Y(), -15)); + stack.multiply(math.getDegreesQuaternion(math.POSITIVE_X(), -25)); stack.translate(0, 0, -.25); }); register(OcelotEntityModel.class, (ocelot, model) -> ((OcelotEntityModelAccessor) model).getRightFrontLeg(), (stack, model) -> {}); register(SpiderEntityModel.class, (spider, model) -> ((SpiderEntityModelAccessor) model).getRightFrontLeg(), (stack, model) -> { - stack.multiply(Vec3f.POSITIVE_Y.getDegreesQuaternion(-15)); - stack.multiply(Vec3f.POSITIVE_X.getDegreesQuaternion(15)); + stack.multiply(math.getDegreesQuaternion(math.POSITIVE_Y(), -15)); + stack.multiply(math.getDegreesQuaternion(math.POSITIVE_X(), 15)); stack.translate(0, 0, 0); }); register(IronGolemEntityModel.class, (golem, model) -> model.getRightArm(), (stack, model) -> { @@ -101,7 +101,7 @@ public static void init() { // types register(EntityType.PILLAGER, (pillager, model) -> ((IllagerEntityModelAccessor) model).getRightArm(), (stack, model) -> { - stack.multiply(Vec3f.POSITIVE_X.getDegreesQuaternion(-10)); + stack.multiply(math.getDegreesQuaternion(math.POSITIVE_X(), -10)); stack.translate(0, .5, -.3); }); } diff --git a/common/src/main/java/draylar/identity/api/variant/IdentityType.java b/common/src/main/java/draylar/identity/api/variant/IdentityType.java index 22b6703..de16a5f 100644 --- a/common/src/main/java/draylar/identity/api/variant/IdentityType.java +++ b/common/src/main/java/draylar/identity/api/variant/IdentityType.java @@ -7,7 +7,7 @@ import net.minecraft.nbt.NbtCompound; import net.minecraft.text.Text; import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.registry.Registries; import net.minecraft.world.World; import org.jetbrains.annotations.Nullable; @@ -78,16 +78,16 @@ public static IdentityType from(Z entity) { @Nullable public static IdentityType from(NbtCompound compound) { Identifier id = new Identifier(compound.getString("EntityID")); - if(!Registry.ENTITY_TYPE.containsId(id)) { + if(!Registries.ENTITY_TYPE.containsId(id)) { return null; } - return new IdentityType(Registry.ENTITY_TYPE.get(id), compound.contains("Variant") ? compound.getInt("Variant") : -1); + return new IdentityType(Registries.ENTITY_TYPE.get(id), compound.contains("Variant") ? compound.getInt("Variant") : -1); } public static List> getAllTypes(World world) { if(LIVING_TYPE_CASH.isEmpty()) { - for (EntityType type : Registry.ENTITY_TYPE) { + for (EntityType type : Registries.ENTITY_TYPE) { Entity instance = type.create(world); if(instance instanceof LivingEntity) { LIVING_TYPE_CASH.add((EntityType) type); @@ -124,7 +124,7 @@ public static IdentityType from(EntityType entity public NbtCompound writeCompound() { NbtCompound compound = new NbtCompound(); - compound.putString("EntityID", Registry.ENTITY_TYPE.getId(type).toString()); + compound.putString("EntityID", Registries.ENTITY_TYPE.getId(type).toString()); compound.putInt("Variant", variantData); return compound; } diff --git a/common/src/main/java/draylar/identity/command/IdentityCommand.java b/common/src/main/java/draylar/identity/command/IdentityCommand.java index 63530c8..be90e68 100644 --- a/common/src/main/java/draylar/identity/command/IdentityCommand.java +++ b/common/src/main/java/draylar/identity/command/IdentityCommand.java @@ -7,7 +7,7 @@ import draylar.identity.api.platform.IdentityConfig; import draylar.identity.api.variant.IdentityType; import net.minecraft.command.argument.EntityArgumentType; -import net.minecraft.command.argument.EntitySummonArgumentType; +import net.minecraft.command.argument.RegistryEntryArgumentType; import net.minecraft.command.argument.NbtCompoundArgumentType; import net.minecraft.command.suggestion.SuggestionProviders; import net.minecraft.entity.Entity; @@ -20,7 +20,8 @@ import net.minecraft.server.world.ServerWorld; import net.minecraft.text.Text; import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.registry.RegistryKeys; +import net.minecraft.registry.Registries; import org.jetbrains.annotations.Nullable; public class IdentityCommand { @@ -50,12 +51,12 @@ public static void register() { return 1; }) ) - .then(CommandManager.argument("identity", EntitySummonArgumentType.entitySummon()).suggests(SuggestionProviders.SUMMONABLE_ENTITIES) + .then(CommandManager.argument("identity", RegistryEntryArgumentType.registryEntry(ctx, RegistryKeys.ENTITY_TYPE)).suggests(SuggestionProviders.SUMMONABLE_ENTITIES) .executes(context -> { grant( context.getSource().getPlayer(), EntityArgumentType.getPlayer(context, "player"), - EntitySummonArgumentType.getEntitySummon(context, "identity"), + EntityType.getId(RegistryEntryArgumentType.getSummonableEntityType(context, "identity").value()), null ); return 1; @@ -67,7 +68,7 @@ public static void register() { grant( context.getSource().getPlayer(), EntityArgumentType.getPlayer(context, "player"), - EntitySummonArgumentType.getEntitySummon(context, "identity"), + EntityType.getId(RegistryEntryArgumentType.getSummonableEntityType(context, "identity").value()), nbt ); @@ -93,12 +94,12 @@ public static void register() { return 1; }) ) - .then(CommandManager.argument("identity", EntitySummonArgumentType.entitySummon()).suggests(SuggestionProviders.SUMMONABLE_ENTITIES) + .then(CommandManager.argument("identity", RegistryEntryArgumentType.registryEntry(ctx, RegistryKeys.ENTITY_TYPE)).suggests(SuggestionProviders.SUMMONABLE_ENTITIES) .executes(context -> { revoke( context.getSource().getPlayer(), EntityArgumentType.getPlayer(context, "player"), - EntitySummonArgumentType.getEntitySummon(context, "identity"), + EntityType.getId(RegistryEntryArgumentType.getSummonableEntityType(context, "identity").value()), null ); return 1; @@ -110,7 +111,7 @@ public static void register() { revoke( context.getSource().getPlayer(), EntityArgumentType.getPlayer(context, "player"), - EntitySummonArgumentType.getEntitySummon(context, "identity"), + EntityType.getId(RegistryEntryArgumentType.getSummonableEntityType(context, "identity").value()), nbt ); @@ -124,11 +125,11 @@ public static void register() { LiteralCommandNode equip = CommandManager .literal("equip") .then(CommandManager.argument("player", EntityArgumentType.players()) - .then(CommandManager.argument("identity", EntitySummonArgumentType.entitySummon()).suggests(SuggestionProviders.SUMMONABLE_ENTITIES) + .then(CommandManager.argument("identity", RegistryEntryArgumentType.registryEntry(ctx, RegistryKeys.ENTITY_TYPE)).suggests(SuggestionProviders.SUMMONABLE_ENTITIES) .executes(context -> { equip(context.getSource().getPlayer(), EntityArgumentType.getPlayer(context, "player"), - EntitySummonArgumentType.getEntitySummon(context, "identity"), + EntityType.getId(RegistryEntryArgumentType.getSummonableEntityType(context, "identity").value()), null); return 1; @@ -139,7 +140,7 @@ public static void register() { equip(context.getSource().getPlayer(), EntityArgumentType.getPlayer(context, "player"), - EntitySummonArgumentType.getEntitySummon(context, "identity"), + EntityType.getId(RegistryEntryArgumentType.getSummonableEntityType(context, "identity").value()), nbt); return 1; @@ -166,22 +167,22 @@ public static void register() { .literal("test") .then(CommandManager.argument("player", EntityArgumentType.player()) .then(CommandManager.literal("not") - .then(CommandManager.argument("identity", EntitySummonArgumentType.entitySummon()).suggests(SuggestionProviders.SUMMONABLE_ENTITIES) + .then(CommandManager.argument("identity", RegistryEntryArgumentType.registryEntry(ctx, RegistryKeys.ENTITY_TYPE)).suggests(SuggestionProviders.SUMMONABLE_ENTITIES) .executes(context -> { return testNot( context.getSource().getPlayer(), EntityArgumentType.getPlayer(context, "player"), - EntitySummonArgumentType.getEntitySummon(context, "identity") + EntityType.getId(RegistryEntryArgumentType.getSummonableEntityType(context, "identity").value()) ); }) ) ) - .then(CommandManager.argument("identity", EntitySummonArgumentType.entitySummon()).suggests(SuggestionProviders.SUMMONABLE_ENTITIES) + .then(CommandManager.argument("identity", RegistryEntryArgumentType.registryEntry(ctx, RegistryKeys.ENTITY_TYPE)).suggests(SuggestionProviders.SUMMONABLE_ENTITIES) .executes(context -> { return test( context.getSource().getPlayer(), EntityArgumentType.getPlayer(context, "player"), - EntitySummonArgumentType.getEntitySummon(context, "identity") + EntityType.getId(RegistryEntryArgumentType.getSummonableEntityType(context, "identity").value()) ); }) ) @@ -199,7 +200,7 @@ public static void register() { } private static int test(ServerPlayerEntity source, ServerPlayerEntity player, Identifier identity) { - EntityType type = Registry.ENTITY_TYPE.get(identity); + EntityType type = Registries.ENTITY_TYPE.get(identity); if(PlayerIdentity.getIdentity(player) != null && PlayerIdentity.getIdentity(player).getType().equals(type)) { if(IdentityConfig.getInstance().logCommands()) { @@ -217,7 +218,7 @@ private static int test(ServerPlayerEntity source, ServerPlayerEntity player, Id } private static int testNot(ServerPlayerEntity source, ServerPlayerEntity player, Identifier identity) { - EntityType type = Registry.ENTITY_TYPE.get(identity); + EntityType type = Registries.ENTITY_TYPE.get(identity); if(PlayerIdentity.getIdentity(player) != null && !PlayerIdentity.getIdentity(player).getType().equals(type)) { if(IdentityConfig.getInstance().logCommands()) { @@ -235,7 +236,7 @@ private static int testNot(ServerPlayerEntity source, ServerPlayerEntity player, } private static void grant(ServerPlayerEntity source, ServerPlayerEntity player, Identifier id, @Nullable NbtCompound nbt) { - IdentityType type = new IdentityType(Registry.ENTITY_TYPE.get(id)); + IdentityType type = new IdentityType(Registries.ENTITY_TYPE.get(id)); Text name = Text.translatable(type.getEntityType().getTranslationKey()); // If the specified granting NBT is not null, change the IdentityType to reflect potential variants. @@ -265,7 +266,7 @@ private static void grant(ServerPlayerEntity source, ServerPlayerEntity player, } private static void revoke(ServerPlayerEntity source, ServerPlayerEntity player, Identifier id, @Nullable NbtCompound nbt) { - IdentityType type = new IdentityType(Registry.ENTITY_TYPE.get(id)); + IdentityType type = new IdentityType(Registries.ENTITY_TYPE.get(id)); Text name = Text.translatable(type.getEntityType().getTranslationKey()); // If the specified granting NBT is not null, change the IdentityType to reflect potential variants. @@ -303,7 +304,7 @@ private static void equip(ServerPlayerEntity source, ServerPlayerEntity player, ServerWorld serverWorld = source.getWorld(); created = EntityType.loadEntityWithPassengers(copy, serverWorld, it -> it); } else { - EntityType entity = Registry.ENTITY_TYPE.get(identity); + EntityType entity = Registries.ENTITY_TYPE.get(identity); created = entity.create(player.world); } diff --git a/common/src/main/java/draylar/identity/impl/tick/identity/FrogTickHandler.java b/common/src/main/java/draylar/identity/impl/tick/identity/FrogTickHandler.java index 6e0713a..4e2b95b 100644 --- a/common/src/main/java/draylar/identity/impl/tick/identity/FrogTickHandler.java +++ b/common/src/main/java/draylar/identity/impl/tick/identity/FrogTickHandler.java @@ -14,12 +14,13 @@ public void tick(PlayerEntity player, FrogEntity frog) { boolean walk = player.isOnGround() && player.getVelocity().horizontalLengthSquared() > 1.0E-6 && !player.isInsideWaterOrBubbleColumn(); boolean swim = player.getVelocity().horizontalLengthSquared() > 1.0E-6 && player.isInsideWaterOrBubbleColumn(); + /* // Walking implementation if (walk) { frog.walkingAnimationState.startIfNotRunning(frog.age); } else { frog.walkingAnimationState.stop(); - } + }*/ // Jumping if(!player.isOnGround() && !swim && !walk && !player.isInsideWaterOrBubbleColumn()) { @@ -31,12 +32,12 @@ public void tick(PlayerEntity player, FrogEntity frog) { // Swimming if (swim) { frog.idlingInWaterAnimationState.stop(); - frog.swimmingAnimationState.startIfNotRunning(frog.age); + //frog.swimmingAnimationState.startIfNotRunning(frog.age); } else if (player.isInsideWaterOrBubbleColumn()) { - frog.swimmingAnimationState.stop(); + //frog.swimmingAnimationState.stop(); frog.idlingInWaterAnimationState.startIfNotRunning(frog.age); } else { - frog.swimmingAnimationState.stop(); + //frog.swimmingAnimationState.stop(); frog.idlingInWaterAnimationState.stop(); } diff --git a/common/src/main/java/draylar/identity/impl/variant/CatTypeProvider.java b/common/src/main/java/draylar/identity/impl/variant/CatTypeProvider.java index 0fc0ca5..e3fce50 100644 --- a/common/src/main/java/draylar/identity/impl/variant/CatTypeProvider.java +++ b/common/src/main/java/draylar/identity/impl/variant/CatTypeProvider.java @@ -6,7 +6,7 @@ import net.minecraft.entity.passive.CatEntity; import net.minecraft.text.MutableText; import net.minecraft.text.Text; -import net.minecraft.util.registry.Registry; +import net.minecraft.registry.Registries; import net.minecraft.world.World; import java.util.Map; @@ -30,13 +30,13 @@ public class CatTypeProvider extends TypeProvider { @Override public int getVariantData(CatEntity entity) { - return Registry.CAT_VARIANT.getRawId(entity.getVariant()); + return Registries.CAT_VARIANT.getRawId(entity.getVariant()); } @Override public CatEntity create(EntityType type, World world, int data) { CatEntity cat = new CatEntity(type, world); - cat.setVariant(Registry.CAT_VARIANT.get(data)); + cat.setVariant(Registries.CAT_VARIANT.get(data)); return cat; } diff --git a/common/src/main/java/draylar/identity/impl/variant/FoxTypeProvider.java b/common/src/main/java/draylar/identity/impl/variant/FoxTypeProvider.java index 1898e88..bf3a0ef 100644 --- a/common/src/main/java/draylar/identity/impl/variant/FoxTypeProvider.java +++ b/common/src/main/java/draylar/identity/impl/variant/FoxTypeProvider.java @@ -12,13 +12,13 @@ public class FoxTypeProvider extends TypeProvider { @Override public int getVariantData(FoxEntity entity) { - return entity.getFoxType().getId(); + return entity.getVariant().getId(); } @Override public FoxEntity create(EntityType type, World world, int data) { FoxEntity fox = new FoxEntity(type, world); - ((FoxEntityAccessor) fox).callSetType(FoxEntity.Type.fromId(data)); + ((FoxEntityAccessor) fox).callSetVariant(FoxEntity.Type.fromId(data)); return fox; } @@ -34,6 +34,6 @@ public int getRange() { @Override public Text modifyText(FoxEntity entity, MutableText text) { - return Text.literal(formatTypePrefix(FoxEntity.Type.fromId(getVariantData(entity)).getKey()) + " ").append(text); + return Text.literal(formatTypePrefix(FoxEntity.Type.fromId(getVariantData(entity)).name()) + " ").append(text); } } diff --git a/common/src/main/java/draylar/identity/impl/variant/FrogTypeProvider.java b/common/src/main/java/draylar/identity/impl/variant/FrogTypeProvider.java index e2c332e..9e65fe7 100644 --- a/common/src/main/java/draylar/identity/impl/variant/FrogTypeProvider.java +++ b/common/src/main/java/draylar/identity/impl/variant/FrogTypeProvider.java @@ -3,11 +3,10 @@ import com.google.common.collect.ImmutableMap; import draylar.identity.api.variant.TypeProvider; import net.minecraft.entity.EntityType; -import net.minecraft.entity.passive.CatEntity; import net.minecraft.entity.passive.FrogEntity; import net.minecraft.text.MutableText; import net.minecraft.text.Text; -import net.minecraft.util.registry.Registry; +import net.minecraft.registry.Registries; import net.minecraft.world.World; import java.util.Map; @@ -23,13 +22,13 @@ public class FrogTypeProvider extends TypeProvider { @Override public int getVariantData(FrogEntity entity) { - return Registry.FROG_VARIANT.getRawId(entity.getVariant()); + return Registries.FROG_VARIANT.getRawId(entity.getVariant()); } @Override public FrogEntity create(EntityType type, World world, int data) { FrogEntity frog = new FrogEntity(type, world); - frog.setVariant(Registry.FROG_VARIANT.get(data)); + frog.setVariant(Registries.FROG_VARIANT.get(data)); return frog; } diff --git a/common/src/main/java/draylar/identity/impl/variant/ParrotTypeProvider.java b/common/src/main/java/draylar/identity/impl/variant/ParrotTypeProvider.java index b8c1dd9..f292d4b 100644 --- a/common/src/main/java/draylar/identity/impl/variant/ParrotTypeProvider.java +++ b/common/src/main/java/draylar/identity/impl/variant/ParrotTypeProvider.java @@ -21,13 +21,13 @@ public class ParrotTypeProvider extends TypeProvider { @Override public int getVariantData(ParrotEntity entity) { - return entity.getVariant(); + return entity.getVariant().getId(); } @Override public ParrotEntity create(EntityType type, World world, int data) { ParrotEntity parrot = new ParrotEntity(type, world); - parrot.setVariant(data); + parrot.setVariant(ParrotEntity.Variant.byIndex(data)); return parrot; } diff --git a/common/src/main/java/draylar/identity/impl/variant/TropicalFishTypeProvider.java b/common/src/main/java/draylar/identity/impl/variant/TropicalFishTypeProvider.java index fdf8aa5..2b360dc 100644 --- a/common/src/main/java/draylar/identity/impl/variant/TropicalFishTypeProvider.java +++ b/common/src/main/java/draylar/identity/impl/variant/TropicalFishTypeProvider.java @@ -3,6 +3,7 @@ import draylar.identity.api.variant.TypeProvider; import net.minecraft.entity.EntityType; import net.minecraft.entity.passive.TropicalFishEntity; +import net.minecraft.entity.passive.TropicalFishEntity.Variety; import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.world.World; @@ -12,13 +13,13 @@ public class TropicalFishTypeProvider extends TypeProvider { @Override public int getVariantData(TropicalFishEntity entity) { - return entity.getVariant(); + return entity.getVariant().getId(); } @Override public TropicalFishEntity create(EntityType type, World world, int data) { TropicalFishEntity fish = new TropicalFishEntity(type, world); - fish.setVariant(data); + fish.setVariant(TropicalFishEntity.getVariety(data)); return fish; } diff --git a/common/src/main/java/draylar/identity/math/math.java b/common/src/main/java/draylar/identity/math/math.java new file mode 100644 index 0000000..d2f97ea --- /dev/null +++ b/common/src/main/java/draylar/identity/math/math.java @@ -0,0 +1,20 @@ +package draylar.identity.math; + +import org.joml.Quaternionf; +import org.joml.Vector3f; + +public class math { + final public static Vector3f POSITIVE_X() { + return new Vector3f(1, 0, 0); + } + final public static Vector3f POSITIVE_Y() { + return new Vector3f(0, 1, 0); + } + final public static Vector3f POSITIVE_Z() { + return new Vector3f(0, 0, 1); + } + + public static Quaternionf getDegreesQuaternion(Vector3f axis, float angle) { + return new Quaternionf().fromAxisAngleDeg(axis, angle); + } +} diff --git a/common/src/main/java/draylar/identity/mixin/DrownedOverlayMixin.java b/common/src/main/java/draylar/identity/mixin/DrownedOverlayMixin.java index e4a6741..ca4a478 100644 --- a/common/src/main/java/draylar/identity/mixin/DrownedOverlayMixin.java +++ b/common/src/main/java/draylar/identity/mixin/DrownedOverlayMixin.java @@ -30,7 +30,7 @@ private void onRender(MatrixStack matrixStack, VertexConsumerProvider vertexCons DrownedEntityModel model = getContextModel(); if (model != null) { - model.setAttributes(this.model); + this.model.copyBipedStateTo(model); model.sneaking = drownedEntity.isSneaking(); } } diff --git a/common/src/main/java/draylar/identity/mixin/InGameHudMixin.java b/common/src/main/java/draylar/identity/mixin/InGameHudMixin.java index 07a9995..14cdbb7 100644 --- a/common/src/main/java/draylar/identity/mixin/InGameHudMixin.java +++ b/common/src/main/java/draylar/identity/mixin/InGameHudMixin.java @@ -7,8 +7,8 @@ import net.minecraft.entity.LivingEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.fluid.Fluid; -import net.minecraft.tag.FluidTags; -import net.minecraft.tag.TagKey; +import net.minecraft.registry.tag.FluidTags; +import net.minecraft.registry.tag.TagKey; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -21,7 +21,7 @@ public abstract class InGameHudMixin { @ModifyArg( method = "renderStatusBars", - at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/PlayerEntity;isSubmergedIn(Lnet/minecraft/tag/TagKey;)Z") + at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/PlayerEntity;isSubmergedIn(Lnet/minecraft/registry/tag/TagKey;)Z") ) private TagKey shouldRenderBreath(TagKey tag) { PlayerEntity player = this.getCameraPlayer(); diff --git a/common/src/main/java/draylar/identity/mixin/LivingEntityMixin.java b/common/src/main/java/draylar/identity/mixin/LivingEntityMixin.java index 6a86075..9748c4a 100644 --- a/common/src/main/java/draylar/identity/mixin/LivingEntityMixin.java +++ b/common/src/main/java/draylar/identity/mixin/LivingEntityMixin.java @@ -20,7 +20,7 @@ import net.minecraft.entity.passive.DolphinEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.fluid.FluidState; -import net.minecraft.tag.FluidTags; +import net.minecraft.registry.tag.FluidTags; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import org.jetbrains.annotations.Nullable; @@ -129,7 +129,7 @@ private void handleFallDamage(float fallDistance, float damageMultiplier, Damage LivingEntity.FallSounds fallSounds = identity.getFallSounds(); this.playSound(damageAmount > 4 ? fallSounds.big() : fallSounds.small(), 1.0F, 1.0F); ((LivingEntityAccessor) identity).callPlayBlockFallSound(); - this.damage(DamageSource.FALL, (float) damageAmount); + this.damage(world.getDamageSources().fall(), (float) damageAmount); cir.setReturnValue(true); } else { cir.setReturnValue(false); diff --git a/common/src/main/java/draylar/identity/mixin/PlayerEntityMixin.java b/common/src/main/java/draylar/identity/mixin/PlayerEntityMixin.java index baff03d..691356b 100644 --- a/common/src/main/java/draylar/identity/mixin/PlayerEntityMixin.java +++ b/common/src/main/java/draylar/identity/mixin/PlayerEntityMixin.java @@ -10,6 +10,7 @@ import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.*; import net.minecraft.entity.damage.DamageSource; +import net.minecraft.entity.damage.DamageSources; import net.minecraft.entity.mob.MobEntity; import net.minecraft.entity.mob.RavagerEntity; import net.minecraft.entity.mob.WardenEntity; @@ -18,10 +19,10 @@ import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.vehicle.BoatEntity; import net.minecraft.item.ItemStack; +import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.sound.SoundEvent; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.registry.RegistryEntry; import net.minecraft.world.World; import net.minecraft.world.biome.Biome; import org.spongepowered.asm.mixin.Mixin; @@ -96,7 +97,7 @@ private void tickAquaticBreathingOutsideWater(CallbackInfo ci) { // Air has ran out, start drowning if(this.getAir() == -20) { this.setAir(0); - this.damage(DamageSource.DROWN, 2.0F); + this.damage(world.getDamageSources().drown(), 2.0F); } } else { this.setAir(300); @@ -315,7 +316,7 @@ private void tickFire(CallbackInfo ci) { private boolean isInDaylight() { if(world.isDay() && !world.isClient) { float brightnessAtEyes = getBrightnessAtEyes(); - BlockPos daylightTestPosition = new BlockPos(getX(), (double) Math.round(getY()), getZ()); + BlockPos daylightTestPosition = BlockPos.ofFloored(getX(), (double) Math.round(getY()), getZ()); // move test position up one block for boats if(getVehicle() instanceof BoatEntity) { @@ -341,8 +342,8 @@ private void tickTemperature(CallbackInfo ci) { // damage player if they are an identity that gets hurt by high temps (eg. snow golem in nether) if(type.isIn(IdentityEntityTags.HURT_BY_HIGH_TEMPERATURE)) { Biome biome = world.getBiome(getBlockPos()).value(); - if (biome.isHot(getBlockPos())) { - player.damage(DamageSource.ON_FIRE, 1.0f); + if (!biome.isCold(getBlockPos())) { + player.damage(world.getDamageSources().onFire(), 1.0f); } } } diff --git a/common/src/main/java/draylar/identity/mixin/PlayerEntityRendererMixin.java b/common/src/main/java/draylar/identity/mixin/PlayerEntityRendererMixin.java index 5447ab7..f2bdfda 100644 --- a/common/src/main/java/draylar/identity/mixin/PlayerEntityRendererMixin.java +++ b/common/src/main/java/draylar/identity/mixin/PlayerEntityRendererMixin.java @@ -9,6 +9,7 @@ import draylar.identity.mixin.accessor.EntityAccessor; import draylar.identity.mixin.accessor.LivingEntityAccessor; import draylar.identity.mixin.accessor.LivingEntityRendererAccessor; +import draylar.identity.mixin.accessor.LimbAnimatorAccessor; import net.minecraft.client.MinecraftClient; import net.minecraft.client.model.ModelPart; import net.minecraft.client.network.AbstractClientPlayerEntity; @@ -22,6 +23,8 @@ import net.minecraft.entity.EntityType; import net.minecraft.entity.EquipmentSlot; import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.attribute.EntityAttribute; +import net.minecraft.entity.attribute.EntityAttributes; import net.minecraft.entity.mob.MobEntity; import net.minecraft.entity.mob.PhantomEntity; import net.minecraft.entity.passive.TameableEntity; @@ -59,9 +62,9 @@ private void redirectRender(LivingEntityRenderer renderer, LivingEntity player, // sync player data to identity identity if(identity != null) { - identity.lastLimbDistance = player.lastLimbDistance; - identity.limbDistance = player.limbDistance; - identity.limbAngle = player.limbAngle; + ((LimbAnimatorAccessor)identity.limbAnimator).setPrevSpeed(((LimbAnimatorAccessor)player.limbAnimator).getPrevSpeed()); + identity.limbAnimator.setSpeed(player.limbAnimator.getSpeed()); + ((LimbAnimatorAccessor)identity.limbAnimator).setPos(player.limbAnimator.getPos()); identity.handSwinging = player.handSwinging; identity.handSwingTicks = player.handSwingTicks; identity.lastHandSwingProgress = player.lastHandSwingProgress; @@ -113,6 +116,7 @@ private void redirectRender(LivingEntityRenderer renderer, LivingEntity player, ((LivingEntityAccessor) identity).callSetLivingFlag(1, player.isUsingItem()); identity.getItemUseTime(); ((LivingEntityAccessor) identity).callTickActiveItemStack(); + identity.hurtTime = player.hurtTime; // update identity specific properties EntityUpdater entityUpdater = EntityUpdaters.getUpdater((EntityType) identity.getType()); diff --git a/common/src/main/java/draylar/identity/mixin/PlayerManagerMixin.java b/common/src/main/java/draylar/identity/mixin/PlayerManagerMixin.java index bc02858..e2c343a 100644 --- a/common/src/main/java/draylar/identity/mixin/PlayerManagerMixin.java +++ b/common/src/main/java/draylar/identity/mixin/PlayerManagerMixin.java @@ -15,15 +15,12 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; @Mixin(PlayerManager.class) public class PlayerManagerMixin { - @Inject(at = @At( - value = "INVOKE", - target = "Lnet/minecraft/server/network/ServerPlayNetworkHandler;sendPacket(Lnet/minecraft/network/Packet;)V", - ordinal = 0 - ), method = "onPlayerConnect") + @Inject(method = "onPlayerConnect", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/world/ServerWorld;onPlayerConnected(Lnet/minecraft/server/network/ServerPlayerEntity;)V"), locals = LocalCapture.CAPTURE_FAILSOFT) private void connect(ClientConnection connection, ServerPlayerEntity player, CallbackInfo ci) { PlayerJoinCallback.EVENT.invoker().onPlayerJoin(player); } diff --git a/common/src/main/java/draylar/identity/mixin/PlayerSonicBoomMixin.java b/common/src/main/java/draylar/identity/mixin/PlayerSonicBoomMixin.java index 5905465..6a2f501 100644 --- a/common/src/main/java/draylar/identity/mixin/PlayerSonicBoomMixin.java +++ b/common/src/main/java/draylar/identity/mixin/PlayerSonicBoomMixin.java @@ -77,7 +77,7 @@ private void tickSonicBoom(CallbackInfo ci) { ((ServerWorld) world).spawnParticles(ParticleTypes.SONIC_BOOM, particlePos.x, particlePos.y, particlePos.z, 1, 0.0, 0.0, 0.0, 0.0); // Locate entities around the particle location for damage - hit.addAll(world.getEntitiesByClass(LivingEntity.class, new Box(new BlockPos(particlePos.getX(), particlePos.getY(), particlePos.getZ())).expand(2), it -> !(it instanceof WolfEntity))); + hit.addAll(world.getEntitiesByClass(LivingEntity.class, new Box(BlockPos.ofFloored(particlePos.getX(), particlePos.getY(), particlePos.getZ())).expand(2), it -> !(it instanceof WolfEntity))); } // Don't hit ourselves @@ -86,7 +86,7 @@ private void tickSonicBoom(CallbackInfo ci) { // Find for (Entity hitTarget : hit) { if(hitTarget instanceof LivingEntity living) { - living.damage(DamageSource.sonicBoom((PlayerEntity) (Object) this), 10.0f); + living.damage(world.getDamageSources().sonicBoom((PlayerEntity) (Object) this), 10.0f); double vertical = 0.5 * (1.0 - living.getAttributeValue(EntityAttributes.GENERIC_KNOCKBACK_RESISTANCE)); double horizontal = 2.5 * (1.0 - living.getAttributeValue(EntityAttributes.GENERIC_KNOCKBACK_RESISTANCE)); living.addVelocity(normalized.getX() * horizontal, normalized.getY() * vertical, normalized.getZ() * horizontal); diff --git a/common/src/main/java/draylar/identity/mixin/PlayerSwimmingMixin.java b/common/src/main/java/draylar/identity/mixin/PlayerSwimmingMixin.java index 4048cec..2bd9be6 100644 --- a/common/src/main/java/draylar/identity/mixin/PlayerSwimmingMixin.java +++ b/common/src/main/java/draylar/identity/mixin/PlayerSwimmingMixin.java @@ -5,7 +5,7 @@ import net.minecraft.entity.LivingEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.fluid.Fluid; -import net.minecraft.tag.TagKey; +import net.minecraft.registry.tag.TagKey; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; diff --git a/common/src/main/java/draylar/identity/mixin/RavagerEntityMixin.java b/common/src/main/java/draylar/identity/mixin/RavagerEntityMixin.java index 534ac3a..80cbd61 100644 --- a/common/src/main/java/draylar/identity/mixin/RavagerEntityMixin.java +++ b/common/src/main/java/draylar/identity/mixin/RavagerEntityMixin.java @@ -24,7 +24,7 @@ public void travel(Vec3d movementInput) { // Ensure Ravager has a passenger if (hasPassengers()) { - LivingEntity rider = (LivingEntity) getPrimaryPassenger(); + LivingEntity rider = (LivingEntity) getFirstPassenger(); // Only players should be able to control Ravager if (rider instanceof PlayerEntity) { @@ -44,7 +44,7 @@ public void travel(Vec3d movementInput) { } // Update movement/velocity - this.airStrafingSpeed = this.getMovementSpeed() * 0.1F; + //this.airStrafingSpeed = this.getMovementSpeed() * 0.1F; if (this.isLogicalSideForUpdatingMovement()) { this.setMovementSpeed((float) this.getAttributeValue(EntityAttributes.GENERIC_MOVEMENT_SPEED)); super.travel(new Vec3d(sidewaysSpeed, movementInput.y, forwardSpeed)); @@ -53,7 +53,7 @@ public void travel(Vec3d movementInput) { } // Limb updates for movement - this.updateLimbs(this, false); + this.updateLimbs(false); return; } } diff --git a/common/src/main/java/draylar/identity/mixin/ServerPlayerEntityMixin.java b/common/src/main/java/draylar/identity/mixin/ServerPlayerEntityMixin.java index 0c7e761..d8eacd0 100644 --- a/common/src/main/java/draylar/identity/mixin/ServerPlayerEntityMixin.java +++ b/common/src/main/java/draylar/identity/mixin/ServerPlayerEntityMixin.java @@ -10,12 +10,10 @@ import net.minecraft.entity.LivingEntity; import net.minecraft.entity.damage.DamageSource; import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.network.encryption.PlayerPublicKey; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.text.Text; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -29,8 +27,8 @@ public abstract class ServerPlayerEntityMixin extends PlayerEntity { @Shadow public abstract boolean isSpectator(); @Shadow public abstract void sendMessage(Text message, boolean actionBar); - public ServerPlayerEntityMixin(World world, BlockPos pos, float yaw, GameProfile gameProfile, @Nullable PlayerPublicKey publicKey) { - super(world, pos, yaw, gameProfile, publicKey); + public ServerPlayerEntityMixin(World world, BlockPos pos, float yaw, GameProfile gameProfile) { + super(world, pos, yaw, gameProfile); } @Inject( diff --git a/common/src/main/java/draylar/identity/mixin/StrayOverlayMixin.java b/common/src/main/java/draylar/identity/mixin/StrayOverlayMixin.java index 53775e3..8fa0ce7 100644 --- a/common/src/main/java/draylar/identity/mixin/StrayOverlayMixin.java +++ b/common/src/main/java/draylar/identity/mixin/StrayOverlayMixin.java @@ -34,7 +34,7 @@ private void onRender(MatrixStack matrixStack, VertexConsumerProvider vertexCons M model = getContextModel(); if (model instanceof BipedEntityModel) { - ((BipedEntityModel) model).setAttributes(this.model); + this.model.copyBipedStateTo((BipedEntityModel) model); ((BipedEntityModel) model).sneaking = mobEntity.isInSneakingPose(); } } diff --git a/common/src/main/java/draylar/identity/mixin/accessor/FoxEntityAccessor.java b/common/src/main/java/draylar/identity/mixin/accessor/FoxEntityAccessor.java index dd9ac54..172e96f 100644 --- a/common/src/main/java/draylar/identity/mixin/accessor/FoxEntityAccessor.java +++ b/common/src/main/java/draylar/identity/mixin/accessor/FoxEntityAccessor.java @@ -8,5 +8,5 @@ public interface FoxEntityAccessor { @Invoker - void callSetType(FoxEntity.Type type); + void callSetVariant(FoxEntity.Type type); } diff --git a/common/src/main/java/draylar/identity/mixin/accessor/LimbAnimatorAccessor.java b/common/src/main/java/draylar/identity/mixin/accessor/LimbAnimatorAccessor.java new file mode 100644 index 0000000..cd0d715 --- /dev/null +++ b/common/src/main/java/draylar/identity/mixin/accessor/LimbAnimatorAccessor.java @@ -0,0 +1,18 @@ +package draylar.identity.mixin.accessor; + +import net.minecraft.entity.LimbAnimator; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(LimbAnimator.class) +public interface LimbAnimatorAccessor +{ + @Accessor("prevSpeed") + float getPrevSpeed(); + + @Accessor("pos") + void setPos(float pos); + + @Accessor("prevSpeed") + void setPrevSpeed(float prevSpeed); +} diff --git a/common/src/main/java/draylar/identity/mixin/player/ClientPlayerDataCacheMixin.java b/common/src/main/java/draylar/identity/mixin/player/ClientPlayerDataCacheMixin.java index 53e2694..03c8308 100644 --- a/common/src/main/java/draylar/identity/mixin/player/ClientPlayerDataCacheMixin.java +++ b/common/src/main/java/draylar/identity/mixin/player/ClientPlayerDataCacheMixin.java @@ -14,9 +14,6 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import java.util.HashMap; -import java.util.Map; - @Environment(EnvType.CLIENT) @Mixin(ClientPlayNetworkHandler.class) public class ClientPlayerDataCacheMixin { @@ -33,7 +30,7 @@ private void beforePlayerReset(PlayerRespawnS2CPacket packet, CallbackInfo ci) { // This inject applies data cached from the previous inject. // Re-applying on the client will help to prevent sync blips which occur when wiping data and waiting for the server to send a sync packet. - @Inject(method = "onPlayerRespawn", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;getRegistryKey()Lnet/minecraft/util/registry/RegistryKey;", ordinal = 1)) + @Inject(method = "onPlayerRespawn", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;getRegistryKey()Lnet/minecraft/registry/RegistryKey;", ordinal = 1)) private void afterPlayerReset(PlayerRespawnS2CPacket packet, CallbackInfo ci) { if(dataCache != null && client.player != null) { ((PlayerDataProvider) client.player).setIdentity(dataCache.getIdentity()); diff --git a/common/src/main/java/draylar/identity/mixin/player/PlayerEntityDataMixin.java b/common/src/main/java/draylar/identity/mixin/player/PlayerEntityDataMixin.java index 8377207..829f73e 100644 --- a/common/src/main/java/draylar/identity/mixin/player/PlayerEntityDataMixin.java +++ b/common/src/main/java/draylar/identity/mixin/player/PlayerEntityDataMixin.java @@ -25,7 +25,7 @@ import net.minecraft.server.world.ServerWorld; import net.minecraft.sound.SoundEvent; import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.registry.Registries; import net.minecraft.world.World; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; @@ -62,8 +62,8 @@ private void readNbt(NbtCompound tag, CallbackInfo info) { NbtList unlockedIdList = tag.getList("UnlockedMorphs", NbtElement.STRING_TYPE); unlockedIdList.forEach(entityRegistryID -> { Identifier id = new Identifier(entityRegistryID.asString()); - if(Registry.ENTITY_TYPE.containsId(id)) { - EntityType type = Registry.ENTITY_TYPE.get(id); + if(Registries.ENTITY_TYPE.containsId(id)) { + EntityType type = Registries.ENTITY_TYPE.get(id); // The variant added from the UnlockedMorphs list will default to the fallback value if needed (eg. Sheep => White) // This value will be re-serialize in UnlockedIdentities list, so this is 100% for old save conversions @@ -90,8 +90,8 @@ private void readNbt(NbtCompound tag, CallbackInfo info) { NbtList favoriteIdList = tag.getList("FavoriteIdentities", NbtElement.STRING_TYPE); favoriteIdList.forEach(registryID -> { Identifier id = new Identifier(registryID.asString()); - if(Registry.ENTITY_TYPE.containsId(id)) { - EntityType type = Registry.ENTITY_TYPE.get(id); + if(Registries.ENTITY_TYPE.containsId(id)) { + EntityType type = Registries.ENTITY_TYPE.get(id); favorites.add(new IdentityType(type)); } }); @@ -156,7 +156,7 @@ private NbtCompound writeCurrentIdentity(NbtCompound tag) { } // put entity type ID under the key "id", or "minecraft:empty" if no identity is equipped (or the identity entity type is invalid) - tag.putString("id", identity == null ? "minecraft:empty" : Registry.ENTITY_TYPE.getId(identity.getType()).toString()); + tag.putString("id", identity == null ? "minecraft:empty" : Registries.ENTITY_TYPE.getId(identity.getType()).toString()); tag.put("EntityData", entityTag); return tag; } diff --git a/common/src/main/java/draylar/identity/network/ServerNetworking.java b/common/src/main/java/draylar/identity/network/ServerNetworking.java index 4b177fc..73c3815 100644 --- a/common/src/main/java/draylar/identity/network/ServerNetworking.java +++ b/common/src/main/java/draylar/identity/network/ServerNetworking.java @@ -3,7 +3,6 @@ import dev.architectury.networking.NetworkManager; import draylar.identity.ability.AbilityRegistry; import draylar.identity.api.PlayerIdentity; -import draylar.identity.api.platform.IdentityConfig; import draylar.identity.api.PlayerAbilities; import draylar.identity.network.impl.FavoritePackets; import draylar.identity.network.impl.SwapPackets; @@ -11,7 +10,6 @@ import net.minecraft.entity.LivingEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.util.registry.Registry; public class ServerNetworking implements NetworkHandler { diff --git a/common/src/main/java/draylar/identity/network/impl/FavoritePackets.java b/common/src/main/java/draylar/identity/network/impl/FavoritePackets.java index 51e76ed..d6479dd 100644 --- a/common/src/main/java/draylar/identity/network/impl/FavoritePackets.java +++ b/common/src/main/java/draylar/identity/network/impl/FavoritePackets.java @@ -13,7 +13,7 @@ import net.minecraft.nbt.NbtList; import net.minecraft.network.PacketByteBuf; import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.util.registry.Registry; +import net.minecraft.registry.Registries; import org.jetbrains.annotations.Nullable; import java.util.Set; @@ -22,7 +22,7 @@ public class FavoritePackets { public static void sendFavoriteRequest(IdentityType type, boolean favorite) { PacketByteBuf packet = new PacketByteBuf(Unpooled.buffer()); - packet.writeIdentifier(Registry.ENTITY_TYPE.getId(type.getEntityType())); + packet.writeIdentifier(Registries.ENTITY_TYPE.getId(type.getEntityType())); packet.writeInt(type.getVariantData()); packet.writeBoolean(favorite); NetworkManager.sendToServer(ClientNetworking.FAVORITE_UPDATE, packet); @@ -30,7 +30,7 @@ public static void sendFavoriteRequest(IdentityType type, boolean favorite) { public static void registerFavoriteRequestHandler() { NetworkManager.registerReceiver(NetworkManager.Side.C2S, NetworkHandler.FAVORITE_UPDATE, (buf, context) -> { - EntityType entityType = Registry.ENTITY_TYPE.get(buf.readIdentifier()); + EntityType entityType = Registries.ENTITY_TYPE.get(buf.readIdentifier()); int variant = buf.readInt(); boolean favorite = buf.readBoolean(); ServerPlayerEntity player = (ServerPlayerEntity) context.getPlayer(); diff --git a/common/src/main/java/draylar/identity/network/impl/SwapPackets.java b/common/src/main/java/draylar/identity/network/impl/SwapPackets.java index 80ac7f1..6088d12 100644 --- a/common/src/main/java/draylar/identity/network/impl/SwapPackets.java +++ b/common/src/main/java/draylar/identity/network/impl/SwapPackets.java @@ -12,7 +12,7 @@ import net.minecraft.entity.player.PlayerEntity; import net.minecraft.network.PacketByteBuf; import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.util.registry.Registry; +import net.minecraft.registry.Registries; import org.jetbrains.annotations.Nullable; public class SwapPackets { @@ -21,7 +21,7 @@ public static void registerIdentityRequestPacketHandler() { NetworkManager.registerReceiver(NetworkManager.Side.C2S, NetworkHandler.IDENTITY_REQUEST, (buf, context) -> { boolean validType = buf.readBoolean(); if(validType) { - EntityType entityType = Registry.ENTITY_TYPE.get(buf.readIdentifier()); + EntityType entityType = Registries.ENTITY_TYPE.get(buf.readIdentifier()); int variant = buf.readInt(); context.getPlayer().getServer().execute(() -> { @@ -59,7 +59,7 @@ public static void sendSwapRequest(@Nullable IdentityType type) { packet.writeBoolean(type != null); if(type != null) { - packet.writeIdentifier(Registry.ENTITY_TYPE.getId(type.getEntityType())); + packet.writeIdentifier(Registries.ENTITY_TYPE.getId(type.getEntityType())); packet.writeInt(type.getVariantData()); } diff --git a/common/src/main/java/draylar/identity/registry/IdentityEntityTags.java b/common/src/main/java/draylar/identity/registry/IdentityEntityTags.java index e1deda1..cc0a912 100644 --- a/common/src/main/java/draylar/identity/registry/IdentityEntityTags.java +++ b/common/src/main/java/draylar/identity/registry/IdentityEntityTags.java @@ -2,8 +2,8 @@ import draylar.identity.Identity; import net.minecraft.entity.EntityType; -import net.minecraft.tag.TagKey; -import net.minecraft.util.registry.Registry; +import net.minecraft.registry.tag.TagKey; +import net.minecraft.registry.RegistryKeys; public class IdentityEntityTags { @@ -26,6 +26,6 @@ public static void init() { } private static TagKey> register(String id) { - return TagKey.of(Registry.ENTITY_TYPE_KEY, Identity.id(id)); + return TagKey.of(RegistryKeys.ENTITY_TYPE, Identity.id(id)); } } diff --git a/common/src/main/java/draylar/identity/screen/IdentityScreen.java b/common/src/main/java/draylar/identity/screen/IdentityScreen.java index a6e9e20..0551317 100644 --- a/common/src/main/java/draylar/identity/screen/IdentityScreen.java +++ b/common/src/main/java/draylar/identity/screen/IdentityScreen.java @@ -14,6 +14,7 @@ import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.Selectable; import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.tooltip.Tooltip; import net.minecraft.client.gui.widget.ButtonWidget; import net.minecraft.client.gui.widget.PressableWidget; import net.minecraft.client.network.ClientPlayerEntity; @@ -25,6 +26,7 @@ import net.minecraft.text.Text; import java.util.ArrayList; +import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -115,6 +117,7 @@ public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) { MinecraftClient.getInstance().textRenderer.draw(matrices, message, xPosition, yPosition, 0xFFFFFF); } + /* // tooltips for (Selectable selectable : ((ScreenAccessor) this).getSelectables()) { if(selectable instanceof PressableWidget button) { @@ -123,7 +126,7 @@ public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) { break; } } - } + }*/ searchBar.render(matrices, mouseX, mouseY, delta); playerButton.render(matrices, mouseX, mouseY, delta); @@ -154,7 +157,7 @@ public void renderEntityWidgets(MatrixStack matrices, int mouseX, int mouseY, fl @Override public boolean mouseScrolled(double mouseX, double mouseY, double amount) { if(entityWidgets.size() > 0) { - float firstPos = entityWidgets.get(0).y; + float firstPos = entityWidgets.get(0).getY(); // Top section should always have mobs, prevent scrolling the entire list down the screen if(amount == 1 && firstPos >= 35) { @@ -163,7 +166,7 @@ public boolean mouseScrolled(double mouseX, double mouseY, double amount) { ((ScreenAccessor) this).getSelectables().forEach(button -> { if(button instanceof EntityWidget widget) { - widget.y = (int) (widget.y + amount * 10); + widget.setPosition(widget.getX(), (int) (widget.getY() + amount * 10)); } }); } @@ -204,6 +207,7 @@ private void populateEntityWidgets(ClientPlayerEntity player, List @Override public boolean mouseClicked(double mouseX, double mouseY, int button) { - boolean bl = mouseX >= (double) this.x && mouseX < (double) (this.x + this.width) && mouseY >= (double) this.y && mouseY < (double) (this.y + this.height); + boolean bl = mouseX >= (double) this.getX() && mouseX < (double) (this.getX() + this.width) && mouseY >= (double) this.getY() && mouseY < (double) (this.getY() + this.height); if(bl) { // Update current Identity @@ -78,7 +79,7 @@ public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) { // Some entities (namely Aether mobs) crash when rendered in a GUI. // Unsure as to the cause, but this try/catch should prevent the game from entirely dipping out. try { - InventoryScreen.drawEntity(x + this.getWidth() / 2, (int) (y + this.getHeight() * .75f), size, -10, -10, entity); + InventoryScreen.drawEntity(matrices, this.getX() + this.getWidth() / 2, (int) (this.getY() + this.getHeight() * .75f), size, -10, -10, entity); } catch (Exception ignored) { } @@ -86,13 +87,13 @@ public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) { // Render selected outline if(active) { RenderSystem.setShaderTexture(0, Identity.id("textures/gui/selected.png")); - DrawableHelper.drawTexture(matrices, x, y, getWidth(), getHeight(), 0, 0, 48, 32, 48, 32); + DrawableHelper.drawTexture(matrices, this.getX(), this.getY(), getWidth(), getHeight(), 0, 0, 48, 32, 48, 32); } // Render favorite star if(starred) { RenderSystem.setShaderTexture(0, Identity.id("textures/gui/star.png")); - DrawableHelper.drawTexture(matrices, x, y, 0, 0, 15, 15, 15, 15); + DrawableHelper.drawTexture(matrices, this.getX(), this.getY(), 0, 0, 15, 15, 15, 15); } // Draw tooltip @@ -122,16 +123,7 @@ public void onPress() { } @Override - public void renderTooltip(MatrixStack matrices, int mouseX, int mouseY) { - Screen currentScreen = MinecraftClient.getInstance().currentScreen; - - if(currentScreen != null) { - currentScreen.renderTooltip(matrices, Collections.singletonList(type.createTooltipText(entity)), mouseX, mouseY); - } - } - - @Override - public void appendNarrations(NarrationMessageBuilder builder) { + public void appendClickableNarrations(NarrationMessageBuilder builder) { } } diff --git a/common/src/main/java/draylar/identity/screen/widget/HelpWidget.java b/common/src/main/java/draylar/identity/screen/widget/HelpWidget.java index 25451ae..9980203 100644 --- a/common/src/main/java/draylar/identity/screen/widget/HelpWidget.java +++ b/common/src/main/java/draylar/identity/screen/widget/HelpWidget.java @@ -14,15 +14,6 @@ public class HelpWidget extends ButtonWidget { public HelpWidget(int x, int y, int width, int height) { super(x, y, width, height, Text.of("?"), (widget) -> { MinecraftClient.getInstance().setScreen(new IdentityHelpScreen()); - }); - } - - @Override - public void renderTooltip(MatrixStack matrices, int mouseX, int mouseY) { - Screen currentScreen = MinecraftClient.getInstance().currentScreen; - - if(currentScreen != null) { - currentScreen.renderTooltip(matrices, Collections.singletonList(Text.translatable("identity.help")), mouseX, mouseY + 15); - } + }, null); } } diff --git a/common/src/main/java/draylar/identity/screen/widget/PlayerWidget.java b/common/src/main/java/draylar/identity/screen/widget/PlayerWidget.java index 16464d2..b57c28f 100644 --- a/common/src/main/java/draylar/identity/screen/widget/PlayerWidget.java +++ b/common/src/main/java/draylar/identity/screen/widget/PlayerWidget.java @@ -32,7 +32,7 @@ public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) { // RenderSystem.setShaderTexture(0, Identity.id("textures/gui/player.png")); - DrawableHelper.drawTexture(matrices, x, y, 16, 16, 0, 0, 8, 8, 8, 8); + DrawableHelper.drawTexture(matrices, this.getX(), this.getY(), 16, 16, 0, 0, 8, 8, 8, 8); super.render(matrices, mouseX, mouseY, delta); } @@ -49,7 +49,7 @@ public void onPress() { } @Override - public void appendNarrations(NarrationMessageBuilder builder) { + public void appendClickableNarrations(NarrationMessageBuilder builder) { } } diff --git a/common/src/main/resources/identity.mixins.json b/common/src/main/resources/identity.mixins.json index 61e1b4f..3e85fec 100644 --- a/common/src/main/resources/identity.mixins.json +++ b/common/src/main/resources/identity.mixins.json @@ -2,7 +2,7 @@ "required": true, "minVersion": "0.8", "package": "draylar.identity.mixin", - "compatibilityLevel": "JAVA_16", + "compatibilityLevel": "JAVA_17", "mixins": [ "ActiveTargetGoalMixin", "CreeperEntityMixin", @@ -36,6 +36,7 @@ "accessor.FoxEntityAccessor", "accessor.IronGolemEntityAccessor", "accessor.LivingEntityAccessor", + "accessor.LimbAnimatorAccessor", "accessor.MobEntityAccessor", "accessor.ParrotEntityAccessor", "accessor.RavagerEntityAccessor", @@ -57,6 +58,7 @@ "accessor.BlazeEntityModelAccessor", "accessor.EntityShadowAccessor", "accessor.IllagerEntityModelAccessor", + "accessor.LimbAnimatorAccessor", "accessor.LivingEntityRendererAccessor", "accessor.LlamaEntityModelAccessor", "accessor.OcelotEntityModelAccessor", diff --git a/fabric/build.gradle b/fabric/build.gradle index 6c40b3e..9a4e1ae 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -1,5 +1,5 @@ plugins { - id "com.github.johnrengelman.shadow" version "7.1.0" + id "com.github.johnrengelman.shadow" version "8.1.1" } architectury { @@ -16,7 +16,7 @@ configurations { } repositories { - maven { url 'https://jitpack.io' } + maven { url 'https://maven.draylar.dev/releases' } } @@ -29,7 +29,7 @@ dependencies { shadowCommon(project(path: ":common", configuration: "transformProductionFabric")) { transitive = false } // config - modImplementation include ("com.github.Draylar.omega-config:omega-config-base:1.2.3-1.18.1") { + modImplementation include ("dev.draylar.omega-config:omega-config-base:1.3.0+1.19.2") { exclude group: "net.fabricmc.fabric-api" } } @@ -46,17 +46,17 @@ processResources { shadowJar { configurations = [project.configurations.shadowCommon] - classifier "dev-shadow" + archiveClassifier.set("dev-shadow") } remapJar { input.set shadowJar.archiveFile dependsOn shadowJar - classifier "fabric" + archiveClassifier.set("fabric") } jar { - classifier "dev" + archiveClassifier.set("dev") } sourcesJar { diff --git a/fabric/gradle.properties b/fabric/gradle.properties index 6fc4a24..4fa6150 100644 --- a/fabric/gradle.properties +++ b/fabric/gradle.properties @@ -3,10 +3,10 @@ org.gradle.jvmargs=-Xmx4G # Fabric Properties # check these on https://fabricmc.net/use -minecraft_version=1.19 -yarn_mappings=1.19+build.4 -loader_version=0.14.8 +minecraft_version=1.19.4 +yarn_mappings=1.19.4+build.2 +loader_version=0.14.19 # Dependencies # currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api -fabric_version=0.57.0+1.19 \ No newline at end of file +fabric_version=0.81.1+1.19.4 \ No newline at end of file diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index 214bdfb..5fa91f6 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -29,7 +29,7 @@ ], "depends": { "fabricloader": ">=0.8.7+build.201", - "fabric": "*", + "fabric-api": "*", "architectury": "*" } } diff --git a/fabric/src/main/resources/identity-fabric.mixins.json b/fabric/src/main/resources/identity-fabric.mixins.json index f5c3129..8991085 100644 --- a/fabric/src/main/resources/identity-fabric.mixins.json +++ b/fabric/src/main/resources/identity-fabric.mixins.json @@ -2,7 +2,7 @@ "required": true, "minVersion": "0.8", "package": "draylar.identity.fabric.mixin", - "compatibilityLevel": "JAVA_16", + "compatibilityLevel": "JAVA_17", "mixins": [ "WitherEntityMixin" ], diff --git a/forge/build.gradle b/forge/build.gradle index 80260fb..a3a223b 100644 --- a/forge/build.gradle +++ b/forge/build.gradle @@ -1,5 +1,5 @@ plugins { - id "com.github.johnrengelman.shadow" version "7.1.0" + id "com.github.johnrengelman.shadow" version "8.1.1" } loom { @@ -40,17 +40,17 @@ processResources { shadowJar { exclude "fabric.mod.json" configurations = [project.configurations.shadowCommon] - classifier "dev-shadow" + archiveClassifier.set("dev-shadow") } remapJar { input.set shadowJar.archiveFile dependsOn shadowJar - classifier "forge" + archiveClassifier.set("forge") } jar { - classifier "dev" + archiveClassifier.set("dev") } sourcesJar { diff --git a/forge/src/main/resources/identity-forge.mixins.json b/forge/src/main/resources/identity-forge.mixins.json index 12f6d00..c5eeda9 100644 --- a/forge/src/main/resources/identity-forge.mixins.json +++ b/forge/src/main/resources/identity-forge.mixins.json @@ -2,7 +2,7 @@ "required": true, "minVersion": "0.8", "package": "draylar.identity.forge.mixin", - "compatibilityLevel": "JAVA_16", + "compatibilityLevel": "JAVA_17", "mixins": [ "WitherEntityMixin" ], diff --git a/gradle.properties b/gradle.properties index 044fe8f..873b29d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,16 +1,16 @@ org.gradle.jvmargs=-Xmx4G # Base Versions -minecraft_version=1.19.1 +minecraft_version=1.19.4 archives_base_name=identity mod_version=2.6.1 maven_group=dev.draylar # Loader Versions -fabric_loader_version=0.14.8 -fabric_api_version=0.58.5+1.19.1 -yarn_mappings=1.19.1+build.5 -forge_version=42.0.1 +fabric_loader_version=0.14.19 +fabric_api_version=0.81.1+1.19.4 +yarn_mappings=1.19.4+build.2 +forge_version=45.0.64 # Dependency Versions -architectury_version=6.0.34 \ No newline at end of file +architectury_version=8.1.80 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 5c2d1cf016b3885f6930543d57b744ea8c220a1a..c1962a79e29d3e0ab67b14947c167a862655af9b 100644 GIT binary patch delta 42671 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index fe753c9..37aef8d 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip +networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists \ No newline at end of file +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 8e25e6c..aeb74cb 100755 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ -#!/usr/bin/env sh +#!/bin/sh # -# Copyright 2015 the original author or authors. +# Copyright © 2015-2021 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -17,78 +17,110 @@ # ############################################################################## -## -## Gradle start up script for UN*X -## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# 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 +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# ############################################################################## # Attempt to set APP_HOME + # Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +MAX_FD=maximum warn () { echo "$*" -} +} >&2 die () { echo echo "$*" echo exit 1 -} +} >&2 # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -97,7 +129,7 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD="java" + JAVACMD=java which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the @@ -105,84 +137,109 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac fi -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) fi - i=$((i+1)) + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg done - case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac fi -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=$(save "$@") -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' -# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong -if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then - cd "$(dirname "$0")" +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" fi +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index 9618d8d..6689b85 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,100 +1,92 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto init - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega From 2798ebc6d40792a324412dba777053730e0aeed6 Mon Sep 17 00:00:00 2001 From: Kurt Cancemi Date: Wed, 24 May 2023 18:28:01 -0400 Subject: [PATCH 2/3] Remove No Longer Needed m_35106_ Mixin for PiglinBruteBrain This was needed because Forge didn't have method_30255 while Identity did, but now both of them have it so it is no longer necessary. --- .../identity/mixin/PiglinBruteBrainMixin.java | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/common/src/main/java/draylar/identity/mixin/PiglinBruteBrainMixin.java b/common/src/main/java/draylar/identity/mixin/PiglinBruteBrainMixin.java index 4ca672b..6502899 100644 --- a/common/src/main/java/draylar/identity/mixin/PiglinBruteBrainMixin.java +++ b/common/src/main/java/draylar/identity/mixin/PiglinBruteBrainMixin.java @@ -21,9 +21,7 @@ public class PiglinBruteBrainMixin { * * @reason method_30255 is the desugared lambda used by method_30249 that searches for a nearby player to aggro on. * This mixin modifies the search logic to exclude players disguised as anything besides a Wither Skeleton or Wither. - * We target fabric and forge separately due to arch not being able to find the backed methods of the targeted lambdas */ - @Group(name = "method_30249FilterLambda", min = 1, max = 1) @Inject( method = "method_30255", at = @At("HEAD"), expect = 0, cancellable = true) private static void identity$method_30249FilterLambdaIntermediary(AbstractPiglinEntity abstractPiglinEntity, LivingEntity livingEntity, CallbackInfoReturnable cir) { if(livingEntity instanceof PlayerEntity player) { @@ -34,16 +32,4 @@ public class PiglinBruteBrainMixin { } } } - - @Group(name = "method_30249FilterLambda", min = 1, max = 1) - @Inject(method = "m_35106_", at = @At("HEAD"), remap = false, expect = 0, cancellable = true) - private static void identity$method_30249FilterLambdaSRG(AbstractPiglinEntity abstractPiglinEntity, LivingEntity livingEntity, CallbackInfoReturnable cir) { - if(livingEntity instanceof PlayerEntity player) { - LivingEntity identity = PlayerIdentity.getIdentity(player); - - if(identity != null && !(identity instanceof WitherSkeletonEntity) && !(identity instanceof WitherEntity)) { - cir.setReturnValue(false); - } - } - } } From c52d84434c29cd8f23acee1474d98b735155bceb Mon Sep 17 00:00:00 2001 From: Kurt Cancemi Date: Wed, 24 May 2023 18:34:28 -0400 Subject: [PATCH 3/3] Bump version to 2.7.0 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 873b29d..485222e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ org.gradle.jvmargs=-Xmx4G # Base Versions minecraft_version=1.19.4 archives_base_name=identity -mod_version=2.6.1 +mod_version=2.7.0 maven_group=dev.draylar # Loader Versions