From c011463dab9065d7d858940a897ce425f7f08387 Mon Sep 17 00:00:00 2001 From: Louis_Quepierts Date: Tue, 6 Aug 2024 20:52:44 +0800 Subject: [PATCH] Fixed bugs will cause NaN and crash --- .../simpleanimator/api/IAnimateHandler.java | 1 + .../simpleanimator/api/IInteractHandler.java | 3 +- .../api/animation/Animation.java | 13 +-- .../api/animation/AnimationSection.java | 90 ++++++++----------- .../api/animation/Animator.java | 1 - .../simpleanimator/core/PlayerUtils.java | 22 +++-- .../simpleanimator/core/SimpleAnimator.java | 6 ++ .../core/animation/AnimationManager.java | 21 +---- .../core/animation/InteractionManager.java | 61 +------------ .../core/animation/RequestHolder.java | 2 +- .../core/client/ClientAnimator.java | 49 +++++----- .../core/client/ClientInteractionManager.java | 49 ---------- .../core/client/ClientPlayerNavigator.java | 12 ++- .../CubeListBuilderManipulator.java | 2 +- .../core/client/util/IModelUpdater.java | 8 ++ .../core/command/AnimateCommand.java | 9 +- .../core/command/InteractCommand.java | 5 +- .../core/config/ClientConfiguration.java | 36 +++++++- .../core/config/CommonConfiguration.java | 37 +++++++- .../core/mixin/CameraMixin.java | 29 +++--- .../core/mixin/CapeLayerMixin.java | 2 +- .../core/mixin/EntityMixin.java | 80 +++++++++++++++-- .../mixin/EntityRenderDispatcherMixin.java | 51 +++++++++++ .../core/mixin/GameRendererMixin.java | 87 ++++++++++++++++++ .../core/mixin/ItemInHandRendererMixin.java | 41 +++------ .../core/mixin/LivingEntityRendererMixin.java | 22 +++-- .../core/mixin/MinecraftClientMixin.java | 63 +++++++++++++ .../core/mixin/PlayerMixin.java | 52 ++++++----- .../core/mixin/PlayerRendererMixin.java | 22 ++--- .../core/mixin/accessor}/CameraAccessor.java | 5 +- .../CubeDefinitionAccessor.java | 5 +- .../mixin/accessor/KeyMappingAccessor.java | 14 +++ .../mixin/model/CubeListBuilderMixin.java | 6 +- .../core/mixin/model/PlayerModelMixin.java | 16 +--- .../simpleanimator/core/network/BiPacket.java | 3 + .../network/packet/AnimatorDataPacket.java | 5 +- .../network/packet/AnimatorPlayPacket.java | 3 + .../network/packet/AnimatorStopPacket.java | 3 + .../network/packet/InteractAcceptPacket.java | 14 +-- .../network/packet/InteractCancelPacket.java | 3 + .../network/packet/InteractInvitePacket.java | 3 + .../batch/ClientUpdateAnimationPacket.java | 2 +- .../batch/ClientUpdateAnimatorPacket.java | 2 +- .../batch/ClientUpdateInteractionPacket.java | 2 +- .../core/proxy/ClientProxy.java | 7 ++ .../core/proxy/CommonProxy.java | 9 +- .../assets/simple_animator/lang/en_us.json | 3 +- .../simple_animator-common.mixins.json | 7 +- fabric/build.gradle | 2 +- .../fabric/SimpleAnimatorFabric.java | 8 +- .../fabric/mixin/GameRendererMixin.java | 60 ------------- .../network/FabricClientNetworkImpl.java | 39 ++++++++ .../fabric/network/FabricNetworkImpl.java | 25 ++---- .../fabric/proxy/FabricClientProxy.java | 18 +--- .../resources/simple_animator.mixins.json | 2 - forge/build.gradle | 5 +- .../config/ForgeCommonConfiguration.java | 32 ------- .../forge/network/ForgeNetworkImpl.java | 1 - .../forge/proxy/ForgeClientProxy.java | 85 +----------------- .../forge/proxy/ForgeCommonProxy.java | 12 ++- forge/src/main/resources/META-INF/mods.toml | 35 ++++---- gradle.properties | 1 + 62 files changed, 711 insertions(+), 602 deletions(-) delete mode 100644 common/src/main/java/net/quepierts/simpleanimator/core/client/ClientInteractionManager.java rename common/src/main/java/net/quepierts/simpleanimator/core/client/{ => util}/CubeListBuilderManipulator.java (87%) create mode 100644 common/src/main/java/net/quepierts/simpleanimator/core/client/util/IModelUpdater.java create mode 100644 common/src/main/java/net/quepierts/simpleanimator/core/mixin/EntityRenderDispatcherMixin.java create mode 100644 common/src/main/java/net/quepierts/simpleanimator/core/mixin/GameRendererMixin.java create mode 100644 common/src/main/java/net/quepierts/simpleanimator/core/mixin/MinecraftClientMixin.java rename {fabric/src/main/java/net/quepierts/simpleanimator/fabric/mixin => common/src/main/java/net/quepierts/simpleanimator/core/mixin/accessor}/CameraAccessor.java (63%) rename common/src/main/java/net/quepierts/simpleanimator/core/mixin/{model => accessor}/CubeDefinitionAccessor.java (81%) create mode 100644 common/src/main/java/net/quepierts/simpleanimator/core/mixin/accessor/KeyMappingAccessor.java delete mode 100644 fabric/src/main/java/net/quepierts/simpleanimator/fabric/mixin/GameRendererMixin.java create mode 100644 fabric/src/main/java/net/quepierts/simpleanimator/fabric/network/FabricClientNetworkImpl.java delete mode 100644 forge/src/main/java/net/quepierts/simpleanimator/forge/config/ForgeCommonConfiguration.java diff --git a/common/src/main/java/net/quepierts/simpleanimator/api/IAnimateHandler.java b/common/src/main/java/net/quepierts/simpleanimator/api/IAnimateHandler.java index 34a070e..68fd6b6 100644 --- a/common/src/main/java/net/quepierts/simpleanimator/api/IAnimateHandler.java +++ b/common/src/main/java/net/quepierts/simpleanimator/api/IAnimateHandler.java @@ -4,6 +4,7 @@ import net.quepierts.simpleanimator.api.animation.Animator; import org.jetbrains.annotations.NotNull; +@SuppressWarnings("unused") public interface IAnimateHandler { boolean simpleanimator$isRunning(); diff --git a/common/src/main/java/net/quepierts/simpleanimator/api/IInteractHandler.java b/common/src/main/java/net/quepierts/simpleanimator/api/IInteractHandler.java index a2090b6..5be2120 100644 --- a/common/src/main/java/net/quepierts/simpleanimator/api/IInteractHandler.java +++ b/common/src/main/java/net/quepierts/simpleanimator/api/IInteractHandler.java @@ -5,9 +5,10 @@ import net.quepierts.simpleanimator.core.animation.RequestHolder; import org.jetbrains.annotations.NotNull; +@SuppressWarnings("unused") public interface IInteractHandler { boolean simpleanimator$invite(@NotNull Player target, @NotNull ResourceLocation interact, boolean update); - boolean simpleanimator$accept(@NotNull Player requester, boolean update); + boolean simpleanimator$accept(@NotNull Player requester, boolean update, boolean forced); void simpleanimator$cancel(boolean update); diff --git a/common/src/main/java/net/quepierts/simpleanimator/api/animation/Animation.java b/common/src/main/java/net/quepierts/simpleanimator/api/animation/Animation.java index 2f4917e..156f9fc 100644 --- a/common/src/main/java/net/quepierts/simpleanimator/api/animation/Animation.java +++ b/common/src/main/java/net/quepierts/simpleanimator/api/animation/Animation.java @@ -13,8 +13,9 @@ import java.util.Optional; public class Animation { - private static final String KEY_REQUEST = "request"; + private static final String KEY_REQUEST = "invite"; private static final String KEY_WAITING = "waiting"; + private static final String KEY_CANCEL = "cancel"; private static final String KEY_ENTER = "enter"; private static final String KEY_LOOP = "main"; private static final String KEY_EXIT = "exit"; @@ -58,9 +59,10 @@ public static Animation[] serialize(JsonObject json) { if (!waiting.repeatable()) throw new RuntimeException("\"waiting\" should be looped!"); + final AnimationSection cancel = AnimationSection.fromJsonObject(object.getAsJsonObject(KEY_CANCEL), Type.INVITE); animations[0] = new Animation( - request, waiting, null, + request, waiting, cancel, override, movable, true, Type.INVITE ); animations[1] = new Animation( @@ -108,7 +110,7 @@ private Animation( } private static boolean isInteractiveAnimation(JsonObject json) { - return json.has("request"); + return json.has(KEY_REQUEST); } private static boolean getBoolean(JsonObject json, String key, boolean def) { @@ -124,11 +126,12 @@ public AnimationSection get(AnimationState state) { } public float getFadeIn(ClientAnimator animator) { - AnimationState nextState = animator.getNextState(); AnimationSection animation = get(animator.getCurState()); - if (nextState == AnimationState.IDLE) { + if (animator.getNextState() == AnimationState.IDLE) { return animation.getFadeOut(); + } else if (animator.getCurState() == AnimationState.IDLE) { + return get(animator.getNextState()).getFadeIn(); } else { return animation.getFadeIn(); } diff --git a/common/src/main/java/net/quepierts/simpleanimator/api/animation/AnimationSection.java b/common/src/main/java/net/quepierts/simpleanimator/api/animation/AnimationSection.java index 72c57ae..d2f2dc1 100644 --- a/common/src/main/java/net/quepierts/simpleanimator/api/animation/AnimationSection.java +++ b/common/src/main/java/net/quepierts/simpleanimator/api/animation/AnimationSection.java @@ -1,6 +1,5 @@ package net.quepierts.simpleanimator.api.animation; -import com.google.common.collect.Maps; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; @@ -9,14 +8,16 @@ import net.minecraft.network.FriendlyByteBuf; import net.minecraft.util.Mth; import net.minecraft.util.StringUtil; -import net.quepierts.simpleanimator.core.animation.AnimationState; import net.quepierts.simpleanimator.core.animation.LerpMode; import net.quepierts.simpleanimator.core.animation.ModelBone; import net.quepierts.simpleanimator.core.client.ClientAnimator; import net.quepierts.simpleanimator.core.client.state.IAnimationState; import org.joml.Vector3f; -import java.util.*; +import java.util.EnumMap; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; public class AnimationSection { public static final Vector3f ZERO = new Vector3f(0); @@ -266,7 +267,7 @@ public void update(ModelBone bone, ModelPart part, ClientAnimator animator, floa final KeyFrame[] rotFrames = data.rotation(); if (animator.isTransferring()) { - final float time = Mth.clamp(animator.getTimer() / fadeIn, 0.0f, 1.0f); + final float time = fadeIn == 0 ? 1.0f : Mth.clamp(animator.getTimer() / fadeIn, 0.0f, 1.0f); if (posFrames.length != 0) { cache.position().set(linearLerp( @@ -301,39 +302,6 @@ public void update(ModelBone bone, ModelPart part, ClientAnimator animator, floa } } - public void update(ModelBone bone, PartPose pose, ClientAnimator.Cache cache, AnimationState state, float time) { - BoneData data = this.keyFrames.get(bone); - if (data == null) { - cache.position().set(pose.x, pose.y, pose.z); - cache.rotation().set(pose.xRot, pose.yRot, pose.zRot); - return; - } - - Vector3f position = new Vector3f(pose.x, pose.y, pose.z); - Vector3f rotation = new Vector3f(pose.xRot, pose.yRot, pose.zRot); - float localT; - KeyFrame[] posFrames = data.position(); - KeyFrame[] rotFrames = data.rotation(); - switch (state) { - case ENTER: - localT = time / fadeIn; - if (posFrames.length != 0) - cache.position().set(linearLerp(position, posFrames[0].vec3(), localT)); - if (rotFrames.length != 0) - cache.rotation().set(linearLerp(rotation, rotFrames[0].vec3(), localT)); - break; - case LOOP: - interpolate(posFrames, cache.position(), time); - interpolate(rotFrames, cache.rotation(), time); - break; - case EXIT: - localT = time / fadeOut; - cache.position().set(linearLerp(cache.position(), position, localT)); - cache.rotation().set(linearLerp(cache.rotation(), rotation, localT)); - break; - } - } - public static void interpolate(KeyFrame[] keyframes, Vector3f out, float time) { KeyFrame kf0 = null, kf1 = null, kf2 = null, kf3 = null; for (int i = 0; i < keyframes.length - 1; i++) { @@ -418,11 +386,10 @@ public static void toNetwork(FriendlyByteBuf byteBuf, AnimationSection animation byteBuf.writeFloat(animation.length); byteBuf.writeFloat(animation.fadeIn); byteBuf.writeFloat(animation.fadeOut); - byteBuf.writeMap( - animation.keyFrames, - FriendlyByteBuf::writeEnum, - BoneData::toNetwork - ); + + for (ModelBone value : ModelBone.values()) { + byteBuf.writeOptional(Optional.ofNullable(animation.keyFrames.get(value)), BoneData::toNetwork); + } } public static AnimationSection fromNetwork(FriendlyByteBuf byteBuf) { @@ -430,11 +397,11 @@ public static AnimationSection fromNetwork(FriendlyByteBuf byteBuf) { final float length = byteBuf.readFloat(); final float fadeIn = byteBuf.readFloat(); final float fadeOut = byteBuf.readFloat(); - final EnumMap map = byteBuf.readMap( - i -> Maps.newEnumMap(ModelBone.class), - buf -> buf.readEnum(ModelBone.class), - BoneData::fromNetwork - ); + final EnumMap map = new EnumMap<>(ModelBone.class); + for (ModelBone value : ModelBone.values()) { + Optional optional = byteBuf.readOptional(BoneData::fromNetwork); + optional.ifPresent(boneData -> map.put(value, boneData)); + } return new AnimationSection(repeat, length, fadeIn, fadeOut, map); } @@ -455,17 +422,30 @@ public static KeyFrame fromNetwork(FriendlyByteBuf byteBuf) { public record BoneData(KeyFrame[] rotation, KeyFrame[] position) { public static void toNetwork(FriendlyByteBuf byteBuf, BoneData data) { - byteBuf.writeCollection(Arrays.asList(data.rotation), KeyFrame::toNetwork); - byteBuf.writeCollection(Arrays.asList(data.position), KeyFrame::toNetwork); + writeArray(byteBuf, data.rotation); + writeArray(byteBuf, data.position); } public static BoneData fromNetwork(FriendlyByteBuf byteBuf) { - List rotation = byteBuf.readList(KeyFrame::fromNetwork); - List position = byteBuf.readList(KeyFrame::fromNetwork); - return new BoneData( - rotation.toArray(new KeyFrame[0]), - position.toArray(new KeyFrame[0]) - ); + KeyFrame[] rotate = readArray(byteBuf); + KeyFrame[] position = readArray(byteBuf); + return new BoneData(rotate, position); + } + + private static void writeArray(FriendlyByteBuf byteBuf, KeyFrame[] arr) { + byteBuf.writeVarInt(arr.length); + for (KeyFrame keyFrame : arr) { + KeyFrame.toNetwork(byteBuf, keyFrame); + } + } + + private static KeyFrame[] readArray(FriendlyByteBuf byteBuf) { + int i = byteBuf.readVarInt(); + KeyFrame[] arr = new KeyFrame[i]; + for (int i1 = 0; i1 < i; i1++) { + arr[i1] = KeyFrame.fromNetwork(byteBuf); + } + return arr; } } } diff --git a/common/src/main/java/net/quepierts/simpleanimator/api/animation/Animator.java b/common/src/main/java/net/quepierts/simpleanimator/api/animation/Animator.java index 28dbeac..221150f 100644 --- a/common/src/main/java/net/quepierts/simpleanimator/api/animation/Animator.java +++ b/common/src/main/java/net/quepierts/simpleanimator/api/animation/Animator.java @@ -30,7 +30,6 @@ public Animator(UUID uuid) { } public void sync(AnimatorDataPacket packet) { - SimpleAnimator.LOGGER.debug("Update: {} {} ,", this.getClass().getSimpleName(), packet); this.animationLocation = packet.animationLocation; this.animation = SimpleAnimator.getProxy().getAnimationManager().getAnimation(packet.animationLocation); this.curState = packet.curState; diff --git a/common/src/main/java/net/quepierts/simpleanimator/core/PlayerUtils.java b/common/src/main/java/net/quepierts/simpleanimator/core/PlayerUtils.java index a9de092..9bcbd32 100644 --- a/common/src/main/java/net/quepierts/simpleanimator/core/PlayerUtils.java +++ b/common/src/main/java/net/quepierts/simpleanimator/core/PlayerUtils.java @@ -1,12 +1,13 @@ package net.quepierts.simpleanimator.core; import net.minecraft.util.Mth; +import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.phys.Vec2; import net.minecraft.world.phys.Vec3; public class PlayerUtils { - public static boolean isRiding(Player player) { + public static boolean isRiding(Entity player) { return player != null && player.getVehicle() != null; } @@ -25,18 +26,23 @@ public static float normalizeRadians(double rad) { return (float) Math.toRadians(normalizeAngle((float) Math.toDegrees(rad))); } - public static Vec3 getRelativePosition(Player player, double forward, double left) { + public static Vec3 getRelativePositionWorldSpace(Player player, double forward, double left) { Vec2 vec2 = new Vec2(0, player.yBodyRot); Vec3 vec3 = player.position(); - float f = Mth.cos((vec2.y + 90.0F) * ((float)Math.PI / 180F)); - float f1 = Mth.sin((vec2.y + 90.0F) * ((float)Math.PI / 180F)); - Vec3 vec31 = new Vec3(f, 0, f1); - Vec3 vec33 = new Vec3(-f1, 0, f); - double d0 = vec31.x * forward + vec33.x * left; - double d2 = vec31.z * forward + vec33.z * left; + final float f = Mth.cos((vec2.y + 90.0F) * ((float)Math.PI / 180F)); + final float f1 = Mth.sin((vec2.y + 90.0F) * ((float)Math.PI / 180F)); + final double d0 = f * forward - f1 * left; + final double d2 = f1 * forward + f * left; return new Vec3(vec3.x + d0, vec3.y, vec3.z + d2); } + public static Vec3 getRelativePosition(Player player, double forward, double left) { + Vec2 vec2 = new Vec2(0, player.yBodyRot); + final float f = Mth.cos((vec2.y + 90.0F) * ((float)Math.PI / 180F)); + final float f1 = Mth.sin((vec2.y + 90.0F) * ((float)Math.PI / 180F)); + return new Vec3(f * forward - f1 * left, 0, f1 * forward + f * left); + } + public static double distanceSqr2D(Vec3 src, Vec3 dest) { double x = dest.x - src.x; double z = dest.z - src.z; diff --git a/common/src/main/java/net/quepierts/simpleanimator/core/SimpleAnimator.java b/common/src/main/java/net/quepierts/simpleanimator/core/SimpleAnimator.java index 0c9dcb9..ac4cb92 100644 --- a/common/src/main/java/net/quepierts/simpleanimator/core/SimpleAnimator.java +++ b/common/src/main/java/net/quepierts/simpleanimator/core/SimpleAnimator.java @@ -1,6 +1,10 @@ package net.quepierts.simpleanimator.core; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; import com.mojang.logging.LogUtils; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.quepierts.simpleanimator.core.network.INetwork; import net.quepierts.simpleanimator.core.proxy.ClientProxy; import net.quepierts.simpleanimator.core.proxy.CommonProxy; @@ -9,6 +13,7 @@ public abstract class SimpleAnimator { public static final String MOD_ID = "simple_animator"; public static final Logger LOGGER = LogUtils.getLogger(); + public static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); private static CommonProxy proxy; private static INetwork network; @@ -23,6 +28,7 @@ public static CommonProxy getProxy() { return proxy; } + @Environment(EnvType.CLIENT) public static ClientProxy getClient() { return (ClientProxy) proxy; } diff --git a/common/src/main/java/net/quepierts/simpleanimator/core/animation/AnimationManager.java b/common/src/main/java/net/quepierts/simpleanimator/core/animation/AnimationManager.java index 61f14f0..b075cc1 100644 --- a/common/src/main/java/net/quepierts/simpleanimator/core/animation/AnimationManager.java +++ b/common/src/main/java/net/quepierts/simpleanimator/core/animation/AnimationManager.java @@ -6,7 +6,6 @@ import com.mojang.datafixers.util.Pair; import com.mojang.logging.LogUtils; import net.minecraft.Util; -import net.minecraft.client.Minecraft; import net.minecraft.resources.FileToIdConverter; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; @@ -108,7 +107,6 @@ private CompletableFuture>> load(Resour list.add(CompletableFuture.supplyAsync(() -> { try (Reader reader = resource.openAsReader()) { Animation[] animations = Animation.fromStream(reader); - LOGGER.warn("Loaded animation {} from {} in data pack {}", resourceLocation, location, resource.sourcePackId()); return Pair.of(resourceLocation, animations); } catch (IOException e) { LOGGER.warn("Couldn't read animation {} from {} in data pack {}", resourceLocation, location, resource.sourcePackId()); @@ -200,9 +198,6 @@ private static void load( } public void sync(ServerPlayer player) { - if (Minecraft.getInstance().player != null && Minecraft.getInstance().player.getUUID().equals(player.getUUID())) - return; - LOGGER.info("Send Animations to Client"); SimpleAnimator.getNetwork().sendToPlayer(new ClientUpdateAnimationPacket(this.animations), player); SimpleAnimator.getNetwork().sendToPlayer(new ClientUpdateInteractionPacket(this.interactions), player); @@ -211,20 +206,10 @@ public void sync(ServerPlayer player) { public void sync(PlayerList list) { ClientUpdateAnimationPacket animationPacket = new ClientUpdateAnimationPacket(this.animations); ClientUpdateInteractionPacket interactionPacket = new ClientUpdateInteractionPacket(this.interactions); - if (Minecraft.getInstance().player != null) { - UUID uuid = Minecraft.getInstance().player.getUUID(); - for (ServerPlayer player : list.getPlayers()) { - if (player.getUUID().equals(uuid)) - continue; - SimpleAnimator.getNetwork().sendToPlayer(animationPacket, player); - SimpleAnimator.getNetwork().sendToPlayer(interactionPacket, player); - } - } else { - for (ServerPlayer player : list.getPlayers()) { - SimpleAnimator.getNetwork().sendToPlayer(animationPacket, player); - SimpleAnimator.getNetwork().sendToPlayer(interactionPacket, player); - } + for (ServerPlayer player : list.getPlayers()) { + SimpleAnimator.getNetwork().sendToPlayer(animationPacket, player); + SimpleAnimator.getNetwork().sendToPlayer(interactionPacket, player); } } diff --git a/common/src/main/java/net/quepierts/simpleanimator/core/animation/InteractionManager.java b/common/src/main/java/net/quepierts/simpleanimator/core/animation/InteractionManager.java index 495995b..d241cb4 100644 --- a/common/src/main/java/net/quepierts/simpleanimator/core/animation/InteractionManager.java +++ b/common/src/main/java/net/quepierts/simpleanimator/core/animation/InteractionManager.java @@ -1,14 +1,7 @@ package net.quepierts.simpleanimator.core.animation; -import net.minecraft.commands.arguments.EntityAnchorArgument; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.phys.Vec3; -import net.quepierts.simpleanimator.api.animation.Animator; -import net.quepierts.simpleanimator.api.animation.Interaction; -import net.quepierts.simpleanimator.core.PlayerUtils; import net.quepierts.simpleanimator.core.SimpleAnimator; -import net.quepierts.simpleanimator.core.proxy.CommonProxy; import org.jetbrains.annotations.Nullable; import java.util.HashMap; @@ -22,59 +15,9 @@ public InteractionManager() { requests = new HashMap<>(); } - @Deprecated - public boolean invite(Player requester, Player receiver, ResourceLocation location) { - if (requester == receiver) - return false; - - CommonProxy proxy = SimpleAnimator.getProxy(); - Animator animator = proxy.getAnimatorManager().createIfAbsent(requester.getUUID()); - - if (animator.getAnimation() != null && !animator.getAnimation().isAbortable()) - return false; - - Interaction interaction = proxy.getAnimationManager().getInteraction(location); - - if (interaction == null) - return false; - - SimpleAnimator.LOGGER.info(interaction.toString()); - - this.createIfAbsent(receiver.getUUID()).set(receiver.getUUID(), location); - animator.play(interaction.invite()); - return true; - } - - @Deprecated - public boolean accept(Player requester, Player receiver) { - RequestHolder request = this.requests.get(requester.getUUID()); - - if (request.hasRequest() || !request.getTarget().equals(receiver.getUUID())) - return false; - - Vec3 position = PlayerUtils.getRelativePosition(requester, 1, 0); - if (!PlayerUtils.inSameDimension(receiver, receiver) || receiver.distanceToSqr(position) > 0.01) - return false; - - CommonProxy proxy = SimpleAnimator.getProxy(); - Interaction interaction = proxy.getAnimationManager().getInteraction(request.getInteraction()); - - if (interaction == null) - return false; - - proxy.getAnimatorManager().createIfAbsent(requester.getUUID()).play(interaction.requester()); - proxy.getAnimatorManager().createIfAbsent(receiver.getUUID()).play(interaction.receiver()); - - receiver.moveTo(position); - receiver.lookAt(EntityAnchorArgument.Anchor.EYES, requester.getEyePosition()); - - request.cancel(); - return true; - } - public void reset() { for (RequestHolder holder : this.requests.values()) { - holder.cancel(); + holder.reset(); } } @@ -91,7 +34,7 @@ public void cancel(UUID requester) { RequestHolder request = get(requester); if (request != null) { - request.cancel(); + request.reset(); SimpleAnimator.getProxy().getAnimatorManager().createIfAbsent(requester).stop(); } } diff --git a/common/src/main/java/net/quepierts/simpleanimator/core/animation/RequestHolder.java b/common/src/main/java/net/quepierts/simpleanimator/core/animation/RequestHolder.java index c3afac3..760c92a 100644 --- a/common/src/main/java/net/quepierts/simpleanimator/core/animation/RequestHolder.java +++ b/common/src/main/java/net/quepierts/simpleanimator/core/animation/RequestHolder.java @@ -24,7 +24,7 @@ public boolean hasRequest() { return this.interaction; } - public void cancel() { + public void reset() { this.target = null; this.interaction = null; } diff --git a/common/src/main/java/net/quepierts/simpleanimator/core/client/ClientAnimator.java b/common/src/main/java/net/quepierts/simpleanimator/core/client/ClientAnimator.java index 2e5c350..2b449e0 100644 --- a/common/src/main/java/net/quepierts/simpleanimator/core/client/ClientAnimator.java +++ b/common/src/main/java/net/quepierts/simpleanimator/core/client/ClientAnimator.java @@ -1,6 +1,5 @@ package net.quepierts.simpleanimator.core.client; -import com.mojang.blaze3d.vertex.PoseStack; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.Minecraft; @@ -9,16 +8,16 @@ import net.minecraft.client.model.geom.PartPose; import net.minecraft.client.player.AbstractClientPlayer; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; +import net.quepierts.simpleanimator.api.animation.Animator; import net.quepierts.simpleanimator.core.PlayerUtils; import net.quepierts.simpleanimator.core.SimpleAnimator; import net.quepierts.simpleanimator.core.animation.AnimationState; -import net.quepierts.simpleanimator.api.animation.Animator; import net.quepierts.simpleanimator.core.animation.ModelBone; import net.quepierts.simpleanimator.core.client.state.IAnimationState; import net.quepierts.simpleanimator.core.network.packet.AnimatorDataPacket; import org.joml.Matrix4f; -import org.joml.Quaternionf; import org.joml.Vector3f; import java.util.Collections; @@ -68,12 +67,12 @@ public boolean play(ResourceLocation location) { } public boolean stop() { - if (!super.stop()) + if (this.animation == null || this.canStop() && !super.stop()) return false; this.timer = 0; this.nextState = this.animation.hasExitAnimation() ? AnimationState.EXIT : AnimationState.IDLE; this.procState = ProcessState.TRANSFER; - this.processed = false; + this.processed = true; return true; } @@ -194,25 +193,29 @@ public void reset(boolean update) { } } - public void processRoot(PoseStack poseStack, Player player) { - if (this.animation == null || PlayerUtils.isRiding(player)) - return; - + public Vector3f getCameraPosition(Entity entity) { + Cache head = cache.get(ModelBone.HEAD); Cache root = cache.get(ModelBone.ROOT); - Matrix4f mat = new Matrix4f(); - mat.translate( - root.position.x / 16, - root.position.y / -16, // invert Y axis - root.position.z / 16 - ); - - mat.rotate(new Quaternionf().rotationXYZ( - root.rotation.x, - root.rotation.y, - root.rotation.z - ) - ); - poseStack.mulPoseMatrix(mat); + + Vector3f position; + if (root.rotation().x == 0 && root.rotation().y == 0 && root.rotation().z == 0) { + position = new Vector3f(head.position()); + } else { + float eyeHeight = entity.getEyeHeight() * 16.0f; + position = new Matrix4f() + .rotateXYZ(root.rotation()).invert() + .transformPosition(new Vector3f(head.position()).add(0, eyeHeight, 0)) + .sub(0, eyeHeight, 0); + } + + position.add(root.position()) + .div(-16.0f, 16.0f, -16.0f); + + return position; + } + + public Vector3f getCameraRotation() { + return new Vector3f(cache.get(ModelBone.HEAD).rotation()).add(cache.get(ModelBone.ROOT).rotation()); } public record Cache(Vector3f position, Vector3f rotation) {} diff --git a/common/src/main/java/net/quepierts/simpleanimator/core/client/ClientInteractionManager.java b/common/src/main/java/net/quepierts/simpleanimator/core/client/ClientInteractionManager.java deleted file mode 100644 index 551faa3..0000000 --- a/common/src/main/java/net/quepierts/simpleanimator/core/client/ClientInteractionManager.java +++ /dev/null @@ -1,49 +0,0 @@ -package net.quepierts.simpleanimator.core.client; - -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.minecraft.client.Minecraft; -import net.minecraft.client.player.LocalPlayer; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.phys.Vec3; -import net.quepierts.simpleanimator.core.PlayerUtils; -import net.quepierts.simpleanimator.core.SimpleAnimator; -import net.quepierts.simpleanimator.core.animation.InteractionManager; -import net.quepierts.simpleanimator.core.animation.RequestHolder; -import net.quepierts.simpleanimator.core.network.packet.InteractAcceptPacket; - -import java.util.UUID; - -@Environment(EnvType.CLIENT) -public class ClientInteractionManager extends InteractionManager { - @Deprecated - @Override - public boolean accept(Player requester, Player receiver) { - if (receiver == Minecraft.getInstance().player) { - return tryAccept(requester); - } - return super.accept(requester, receiver); - } - - @Deprecated - public boolean tryAccept(Player requester) { - LocalPlayer player = Minecraft.getInstance().player; - assert player != null; - UUID uuid = requester.getUUID(); - - RequestHolder request = this.get(uuid); - if (request == null) - return false; - - Vec3 position = PlayerUtils.getRelativePosition(requester, 1, 0); - if (player.distanceToSqr(position) > 0.01) { - SimpleAnimator.getClient().getNavigator().navigateTo( - requester, 1, 0, - () -> SimpleAnimator.getNetwork().update(new InteractAcceptPacket(uuid, Minecraft.getInstance().player.getUUID())) - ); - return false; - } - - return super.accept(requester, player); - } -} diff --git a/common/src/main/java/net/quepierts/simpleanimator/core/client/ClientPlayerNavigator.java b/common/src/main/java/net/quepierts/simpleanimator/core/client/ClientPlayerNavigator.java index a8c305b..138d0dd 100644 --- a/common/src/main/java/net/quepierts/simpleanimator/core/client/ClientPlayerNavigator.java +++ b/common/src/main/java/net/quepierts/simpleanimator/core/client/ClientPlayerNavigator.java @@ -7,6 +7,7 @@ import net.minecraft.commands.arguments.EntityAnchorArgument; import net.minecraft.world.entity.player.Player; import net.minecraft.world.phys.Vec3; +import net.quepierts.simpleanimator.api.IAnimateHandler; import net.quepierts.simpleanimator.core.PlayerUtils; @Environment(EnvType.CLIENT) @@ -26,18 +27,23 @@ public class ClientPlayerNavigator { public void tick() { switch (phrase) { case RUNNING: + LocalPlayer player = Minecraft.getInstance().player; + if (!lastTargetPosition.equals(target.position())) { lastTargetPosition = target.position(); - targetPosition = PlayerUtils.getRelativePosition(target, forward, left); + targetPosition = PlayerUtils.getRelativePositionWorldSpace(target, forward, left); } - LocalPlayer player = Minecraft.getInstance().player; if (timer ++ > 1000) { this.stop(); return; } - if (PlayerUtils.distanceSqr2D(player.position(), targetPosition) < 0.001) { + if (((IAnimateHandler) player).simpleanimator$getAnimator().isRunning()) { + return; + } + + if (player.distanceToSqr(targetPosition) < 0.001) { player.moveTo(targetPosition); this.phrase = Phrase.FINISH; this.timer = 0; diff --git a/common/src/main/java/net/quepierts/simpleanimator/core/client/CubeListBuilderManipulator.java b/common/src/main/java/net/quepierts/simpleanimator/core/client/util/CubeListBuilderManipulator.java similarity index 87% rename from common/src/main/java/net/quepierts/simpleanimator/core/client/CubeListBuilderManipulator.java rename to common/src/main/java/net/quepierts/simpleanimator/core/client/util/CubeListBuilderManipulator.java index 85fd75c..31ce025 100644 --- a/common/src/main/java/net/quepierts/simpleanimator/core/client/CubeListBuilderManipulator.java +++ b/common/src/main/java/net/quepierts/simpleanimator/core/client/util/CubeListBuilderManipulator.java @@ -1,4 +1,4 @@ -package net.quepierts.simpleanimator.core.client; +package net.quepierts.simpleanimator.core.client.util; import net.minecraft.client.model.geom.builders.CubeDeformation; import net.minecraft.client.model.geom.builders.CubeListBuilder; diff --git a/common/src/main/java/net/quepierts/simpleanimator/core/client/util/IModelUpdater.java b/common/src/main/java/net/quepierts/simpleanimator/core/client/util/IModelUpdater.java new file mode 100644 index 0000000..01efc26 --- /dev/null +++ b/common/src/main/java/net/quepierts/simpleanimator/core/client/util/IModelUpdater.java @@ -0,0 +1,8 @@ +package net.quepierts.simpleanimator.core.client.util; + +import net.minecraft.client.player.AbstractClientPlayer; +import org.jetbrains.annotations.NotNull; + +public interface IModelUpdater { + void simpleAnimator$update(@NotNull AbstractClientPlayer pPlayer); +} diff --git a/common/src/main/java/net/quepierts/simpleanimator/core/command/AnimateCommand.java b/common/src/main/java/net/quepierts/simpleanimator/core/command/AnimateCommand.java index 8edb82f..cd3c870 100644 --- a/common/src/main/java/net/quepierts/simpleanimator/core/command/AnimateCommand.java +++ b/common/src/main/java/net/quepierts/simpleanimator/core/command/AnimateCommand.java @@ -3,24 +3,22 @@ import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.suggestion.SuggestionProvider; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; import net.minecraft.commands.SharedSuggestionProvider; import net.minecraft.commands.arguments.ResourceLocationArgument; +import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.GameType; -import net.quepierts.simpleanimator.core.SimpleAnimator; import net.quepierts.simpleanimator.api.animation.Animator; +import net.quepierts.simpleanimator.core.SimpleAnimator; import net.quepierts.simpleanimator.core.network.packet.AnimatorPlayPacket; import net.quepierts.simpleanimator.core.network.packet.AnimatorStopPacket; import java.util.UUID; -@Environment(EnvType.CLIENT) public class AnimateCommand { public static final SuggestionProvider SUGGEST_ANIMATION = (context, builder) -> SharedSuggestionProvider.suggestResource(SimpleAnimator.getProxy().getAnimationManager().getAnimationNames(), builder); @@ -48,13 +46,12 @@ private static int query(CommandContext context) { Entity entity = context.getSource().getEntity(); if (entity instanceof ServerPlayer) { Animator animator = SimpleAnimator.getProxy().getAnimatorManager().createIfAbsent(entity.getUUID()); - SimpleAnimator.LOGGER.info("{}: {}", animator.getAnimationLocation(), animator.getTimer()); + context.getSource().sendSystemMessage(Component.translatable("animator.commands.message.query", animator.getAnimationLocation())); } return 1; } private static int play(CommandContext context) { - SimpleAnimator.LOGGER.info("Player Animate"); if (context.getSource().getEntity() instanceof ServerPlayer player) { if (player.gameMode.getGameModeForPlayer() == GameType.SPECTATOR) return 0; diff --git a/common/src/main/java/net/quepierts/simpleanimator/core/command/InteractCommand.java b/common/src/main/java/net/quepierts/simpleanimator/core/command/InteractCommand.java index 758b33d..cb72eaa 100644 --- a/common/src/main/java/net/quepierts/simpleanimator/core/command/InteractCommand.java +++ b/common/src/main/java/net/quepierts/simpleanimator/core/command/InteractCommand.java @@ -15,7 +15,6 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Player; import net.quepierts.simpleanimator.api.IInteractHandler; -import net.quepierts.simpleanimator.core.PlayerUtils; import net.quepierts.simpleanimator.core.SimpleAnimator; import net.quepierts.simpleanimator.core.animation.RequestHolder; import net.quepierts.simpleanimator.core.network.packet.InteractAcceptPacket; @@ -50,7 +49,7 @@ private static int invite(CommandContext context) throws Com ResourceLocation location = ResourceLocationArgument.getId(context, "interaction"); - if (!PlayerUtils.inSameDimension(player, target) || player.distanceToSqr(target) > 1024) { + if (!((IInteractHandler) player).simpleanimator$invite(target, location, false)) { return 0; } @@ -80,7 +79,7 @@ private static int accept(CommandContext context) throws Com return 0; } - SimpleAnimator.getNetwork().sendToAllPlayers(new InteractAcceptPacket(requester.getUUID(), player.getUUID()), player); + SimpleAnimator.getNetwork().sendToAllPlayers(new InteractAcceptPacket(requester.getUUID(), player.getUUID(), false), player); return 1; } diff --git a/common/src/main/java/net/quepierts/simpleanimator/core/config/ClientConfiguration.java b/common/src/main/java/net/quepierts/simpleanimator/core/config/ClientConfiguration.java index 4134d27..aa32b42 100644 --- a/common/src/main/java/net/quepierts/simpleanimator/core/config/ClientConfiguration.java +++ b/common/src/main/java/net/quepierts/simpleanimator/core/config/ClientConfiguration.java @@ -1,10 +1,44 @@ package net.quepierts.simpleanimator.core.config; +import com.google.common.io.Files; +import net.quepierts.simpleanimator.core.SimpleAnimator; + +import java.io.File; +import java.io.IOException; +import java.io.Reader; +import java.io.Writer; +import java.nio.charset.StandardCharsets; + // WIP public class ClientConfiguration { + private static final File FILE = new File("config", "simpleanimator-client.json"); + + ClientConfiguration() {} + + public static ClientConfiguration load() { + if (FILE.exists()) { + try (Reader reader = Files.newReader(FILE, StandardCharsets.UTF_8)) { + return SimpleAnimator.GSON.fromJson(reader, ClientConfiguration.class); + } catch (IOException e) { + SimpleAnimator.LOGGER.warn("Error occurred during loading common configuration!"); + } + } + ClientConfiguration configuration = new ClientConfiguration(); + configuration.write(); + return configuration; + } + + public void write() { + FILE.deleteOnExit(); + try (Writer writer = Files.newWriter(FILE, StandardCharsets.UTF_8)) { + writer.write(SimpleAnimator.GSON.toJson(this)); + } catch (IOException e) { + SimpleAnimator.LOGGER.warn("Error occurred during writing common configuration!"); + } + } // TODO: 2024/8/4 May be enable bend model? - public static boolean hasBendModel() { + public boolean hasBendModel() { return false; } } diff --git a/common/src/main/java/net/quepierts/simpleanimator/core/config/CommonConfiguration.java b/common/src/main/java/net/quepierts/simpleanimator/core/config/CommonConfiguration.java index c9ba92f..700eb5f 100644 --- a/common/src/main/java/net/quepierts/simpleanimator/core/config/CommonConfiguration.java +++ b/common/src/main/java/net/quepierts/simpleanimator/core/config/CommonConfiguration.java @@ -1,9 +1,40 @@ package net.quepierts.simpleanimator.core.config; +import com.google.common.io.Files; +import net.quepierts.simpleanimator.core.SimpleAnimator; + +import java.io.File; +import java.io.IOException; +import java.io.Reader; +import java.io.Writer; +import java.nio.charset.StandardCharsets; + public class CommonConfiguration { - protected static boolean syncAnimationToClient; + private static final File FILE = new File("config", "simpleanimator-common.json"); + + CommonConfiguration() {} - public static boolean shouldSyncAnimationToClient() { - return syncAnimationToClient; + public static CommonConfiguration load() { + if (FILE.exists()) { + try (Reader reader = Files.newReader(FILE, StandardCharsets.UTF_8)) { + return SimpleAnimator.GSON.fromJson(reader, CommonConfiguration.class); + } catch (IOException e) { + SimpleAnimator.LOGGER.warn("Error occurred during loading common configuration!"); + } + } + CommonConfiguration configuration = new CommonConfiguration(); + configuration.write(); + return configuration; } + + public void write() { + FILE.deleteOnExit(); + try (Writer writer = Files.newWriter(FILE, StandardCharsets.UTF_8)) { + writer.write(SimpleAnimator.GSON.toJson(this)); + } catch (IOException e) { + SimpleAnimator.LOGGER.warn("Error occurred during writing common configuration!"); + } + } + + public int interactInviteDistanceSquare = 1024; } diff --git a/common/src/main/java/net/quepierts/simpleanimator/core/mixin/CameraMixin.java b/common/src/main/java/net/quepierts/simpleanimator/core/mixin/CameraMixin.java index cf4c8d9..9a815a5 100644 --- a/common/src/main/java/net/quepierts/simpleanimator/core/mixin/CameraMixin.java +++ b/common/src/main/java/net/quepierts/simpleanimator/core/mixin/CameraMixin.java @@ -1,5 +1,7 @@ package net.quepierts.simpleanimator.core.mixin; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; @@ -10,20 +12,19 @@ import net.minecraft.world.phys.Vec3; import net.quepierts.simpleanimator.core.SimpleAnimator; import net.quepierts.simpleanimator.core.client.ClientAnimator; -import net.quepierts.simpleanimator.core.animation.ModelBone; +import org.joml.Vector3f; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +@Environment(EnvType.CLIENT) @Mixin(Camera.class) public abstract class CameraMixin { @Shadow protected abstract void setPosition(double pX, double pY, double pZ); - @Shadow private boolean detached; - @Shadow private Vec3 position; @Inject( @@ -32,22 +33,13 @@ public abstract class CameraMixin { value = "INVOKE", target = "Lnet/minecraft/client/Camera;setPosition(DDD)V", shift = At.Shift.AFTER - ), - cancellable = true + ) ) public void applyAnimation(BlockGetter pLevel, Entity pEntity, boolean pDetached, boolean pThirdPersonReverse, float pPartialTick, CallbackInfo ci) { - if (detached) - return; - ClientAnimator animator = SimpleAnimator.getClient().getClientAnimatorManager().getLocalAnimator(); - if (animator.isRunning()) { - ClientAnimator.Cache root = animator.getCache(ModelBone.ROOT); - ClientAnimator.Cache head = animator.getCache(ModelBone.HEAD); - - final float left = (root.position().x + head.position().x) / -16.0f; - final float up = (root.position().y + head.position().y) / 16.0f; - final float forward = (root.position().z + head.position().z) / -16.0f; + if (animator.isRunning() && animator.isProcessed()) { + Vector3f position = animator.getCameraPosition(pEntity); LocalPlayer player = Minecraft.getInstance().player; Vec2 vec2 = new Vec2(0, player.yBodyRot); @@ -55,14 +47,13 @@ public void applyAnimation(BlockGetter pLevel, Entity pEntity, boolean pDetached float f1 = Mth.sin((vec2.y + 90.0F) * ((float)Math.PI / 180F)); Vec3 vec31 = new Vec3(f, 0, f1); Vec3 vec33 = new Vec3(-f1, 0, f); - double d0 = vec31.x * forward + vec33.x * left; - double d2 = vec31.z * forward + vec33.z * left; + double d0 = vec31.x * position.z + vec33.x * position.x; + double d2 = vec31.z * position.z + vec33.z * position.x; this.setPosition( this.position.x + d0, - this.position.y + up, + this.position.y + position.y, this.position.z + d2); - ci.cancel(); } } } diff --git a/common/src/main/java/net/quepierts/simpleanimator/core/mixin/CapeLayerMixin.java b/common/src/main/java/net/quepierts/simpleanimator/core/mixin/CapeLayerMixin.java index 9e4e063..763e675 100644 --- a/common/src/main/java/net/quepierts/simpleanimator/core/mixin/CapeLayerMixin.java +++ b/common/src/main/java/net/quepierts/simpleanimator/core/mixin/CapeLayerMixin.java @@ -14,8 +14,8 @@ import net.minecraft.client.renderer.entity.layers.RenderLayer; import net.minecraft.client.renderer.texture.OverlayTexture; import net.quepierts.simpleanimator.core.SimpleAnimator; -import net.quepierts.simpleanimator.core.client.ClientAnimator; import net.quepierts.simpleanimator.core.animation.ModelBone; +import net.quepierts.simpleanimator.core.client.ClientAnimator; 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/net/quepierts/simpleanimator/core/mixin/EntityMixin.java b/common/src/main/java/net/quepierts/simpleanimator/core/mixin/EntityMixin.java index 091a26c..61e68c9 100644 --- a/common/src/main/java/net/quepierts/simpleanimator/core/mixin/EntityMixin.java +++ b/common/src/main/java/net/quepierts/simpleanimator/core/mixin/EntityMixin.java @@ -3,21 +3,47 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.Minecraft; +import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; -import net.quepierts.simpleanimator.core.SimpleAnimator; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; +import net.quepierts.simpleanimator.api.IAnimateHandler; +import net.quepierts.simpleanimator.api.animation.Animator; import net.quepierts.simpleanimator.core.client.ClientAnimator; +import org.joml.Vector3f; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import java.util.UUID; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Environment(EnvType.CLIENT) @Mixin(Entity.class) -public class EntityMixin { - @Shadow protected UUID uuid; +public abstract class EntityMixin { + @Shadow protected abstract Vec3 calculateViewVector(float g, float h); + + @Shadow public abstract Vec3 position(); + + @Shadow public abstract Level level(); + + @Shadow public abstract float getViewXRot(float f); + + @Shadow public abstract float getViewYRot(float f); + + @Shadow public double xo; + + @Shadow public double yo; + + @Shadow public double zo; + + @Shadow public abstract double getX(); + + @Shadow public abstract double getY(); + + @Shadow public abstract double getZ(); + + @Shadow public abstract float getEyeHeight(); @Inject( method = "turn", @@ -25,12 +51,52 @@ public class EntityMixin { cancellable = true ) public void limitTurn(double pYRot, double pXRot, CallbackInfo ci) { - if (!uuid.equals(Minecraft.getInstance().player.getUUID())) + if ((Object) this != Minecraft.getInstance().player) return; - ClientAnimator animator = SimpleAnimator.getClient().getClientAnimatorManager().getLocalAnimator(); + Animator animator = ((IAnimateHandler) this).simpleanimator$getAnimator(); if (animator.isRunning() && animator.getAnimation().isOverride()) ci.cancel(); } + + @Inject( + method = "getEyePosition(F)Lnet/minecraft/world/phys/Vec3;", + at = @At("HEAD"), + cancellable = true + ) + public void getEyePositionDuringAnimating(float f, CallbackInfoReturnable cir) { + if ((Object) this != Minecraft.getInstance().player) + return; + + ClientAnimator animator = (ClientAnimator) ((IAnimateHandler) this).simpleanimator$getAnimator(); + if (animator.isRunning() && animator.isProcessed() && !animator.getAnimation().isOverride()) { + Vector3f position = animator.getCameraPosition((Entity) (Object) this); + double d0 = Mth.lerp(f, this.xo, this.getX()) + position.x; + double d1 = Mth.lerp(f, this.yo, this.getY()) + (double)this.getEyeHeight() + position.y; + double d2 = Mth.lerp(f, this.zo, this.getZ()) + position.z; + cir.setReturnValue(new Vec3(d0, d1, d2)); + cir.cancel(); + } + } + + @Inject( + method = "getViewVector", + at = @At("HEAD"), + cancellable = true + ) + public void getViewVectorDuringAnimating(float f, CallbackInfoReturnable cir) { + if ((Object) this != Minecraft.getInstance().player) + return; + + ClientAnimator animator = (ClientAnimator) ((IAnimateHandler) this).simpleanimator$getAnimator(); + if (animator.isRunning() && animator.isProcessed() && !animator.getAnimation().isOverride()) { + Vector3f rotation = animator.getCameraRotation(); + cir.setReturnValue(this.calculateViewVector( + this.getViewXRot(f) + rotation.x * Mth.RAD_TO_DEG, + this.getViewYRot(f) + rotation.y * Mth.RAD_TO_DEG + )); + cir.cancel(); + } + } } diff --git a/common/src/main/java/net/quepierts/simpleanimator/core/mixin/EntityRenderDispatcherMixin.java b/common/src/main/java/net/quepierts/simpleanimator/core/mixin/EntityRenderDispatcherMixin.java new file mode 100644 index 0000000..e853513 --- /dev/null +++ b/common/src/main/java/net/quepierts/simpleanimator/core/mixin/EntityRenderDispatcherMixin.java @@ -0,0 +1,51 @@ +package net.quepierts.simpleanimator.core.mixin; + +import com.mojang.blaze3d.vertex.PoseStack; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.entity.EntityRenderDispatcher; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.phys.Vec3; +import net.quepierts.simpleanimator.api.IAnimateHandler; +import net.quepierts.simpleanimator.core.PlayerUtils; +import net.quepierts.simpleanimator.core.animation.ModelBone; +import net.quepierts.simpleanimator.core.client.ClientAnimator; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Environment(EnvType.CLIENT) +@Mixin(EntityRenderDispatcher.class) +public class EntityRenderDispatcherMixin { + @Inject( + method = "render", + at = @At( + value = "INVOKE", + target = "Lcom/mojang/blaze3d/vertex/PoseStack;translate(DDD)V", + ordinal = 0, + shift = At.Shift.AFTER + ) + ) + public void applyRootTranslation(E entity, double d, double e, double f, float g, float h, PoseStack poseStack, MultiBufferSource multiBufferSource, int i, CallbackInfo ci) { + if (PlayerUtils.isRiding(entity)) + return; + + if (entity instanceof IAnimateHandler handler) { + ClientAnimator animator = (ClientAnimator) handler.simpleanimator$getAnimator(); + + if (animator.isRunning() && animator.isProcessed()) { + ClientAnimator.Cache root = animator.getCache(ModelBone.ROOT); + Vec3 position = PlayerUtils.getRelativePosition((Player) entity, root.position().z, root.position().x); + + poseStack.translate( + position.x / -16f, + 0, // don't move shadow y + position.z / -16f + ); + } + } + } +} diff --git a/common/src/main/java/net/quepierts/simpleanimator/core/mixin/GameRendererMixin.java b/common/src/main/java/net/quepierts/simpleanimator/core/mixin/GameRendererMixin.java new file mode 100644 index 0000000..44fedfd --- /dev/null +++ b/common/src/main/java/net/quepierts/simpleanimator/core/mixin/GameRendererMixin.java @@ -0,0 +1,87 @@ +package net.quepierts.simpleanimator.core.mixin; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Axis; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.Camera; +import net.minecraft.client.CameraType; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.client.renderer.ItemInHandRenderer; +import net.minecraft.util.Mth; +import net.quepierts.simpleanimator.api.IAnimateHandler; +import net.quepierts.simpleanimator.api.animation.Animator; +import net.quepierts.simpleanimator.core.SimpleAnimator; +import net.quepierts.simpleanimator.core.client.ClientAnimator; +import net.quepierts.simpleanimator.core.client.util.IModelUpdater; +import net.quepierts.simpleanimator.core.mixin.accessor.CameraAccessor; +import org.joml.Vector3f; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@SuppressWarnings("all") +@Environment(EnvType.CLIENT) +@Mixin(GameRenderer.class) +public class GameRendererMixin { + @Shadow @Final private Camera mainCamera; + + @Shadow @Final public ItemInHandRenderer itemInHandRenderer; + + @Shadow @Final Minecraft minecraft; + + @Inject( + method = "shouldRenderBlockOutline", + at = @At("HEAD"), + cancellable = true + ) + public void dontRenderBlockOutline(CallbackInfoReturnable cir) { + ((IModelUpdater) this.itemInHandRenderer).simpleAnimator$update(this.minecraft.player); + + Animator animator = ((IAnimateHandler) this.minecraft.player).simpleanimator$getAnimator(); + if (animator.isRunning() && animator.getAnimation().isOverride()) { + cir.setReturnValue(false); + cir.cancel(); + } + } + + @Inject( + method = "renderLevel", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/client/Camera;setup(Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/world/entity/Entity;ZZF)V", + shift = At.Shift.AFTER + ) + ) + public void applyCameraRotation(float f, long l, PoseStack poseStack, CallbackInfo ci) { + if (this.minecraft.options.getCameraType() != CameraType.FIRST_PERSON) + return; + + ((IModelUpdater) this.itemInHandRenderer).simpleAnimator$update(this.minecraft.player); + + ClientAnimator animator = SimpleAnimator.getClient().getClientAnimatorManager().getLocalAnimator(); + + if (animator.isRunning() && animator.getAnimation().isOverride() && animator.isProcessed()) { + Vector3f rotation = animator.getCameraRotation().mul(Mth.RAD_TO_DEG); + + LocalPlayer player = this.minecraft.player; + float yRot = player.yHeadRot - player.yBodyRot; + float xRot = player.getXRot(); + + + Camera camera = this.mainCamera; + ((CameraAccessor) camera).simpleanimator$setRotation( + camera.getYRot() + rotation.y - yRot, + camera.getXRot() + rotation.x - xRot + ); + + poseStack.mulPose(Axis.ZP.rotationDegrees(rotation.z)); + } + } +} diff --git a/common/src/main/java/net/quepierts/simpleanimator/core/mixin/ItemInHandRendererMixin.java b/common/src/main/java/net/quepierts/simpleanimator/core/mixin/ItemInHandRendererMixin.java index c500998..4526497 100644 --- a/common/src/main/java/net/quepierts/simpleanimator/core/mixin/ItemInHandRendererMixin.java +++ b/common/src/main/java/net/quepierts/simpleanimator/core/mixin/ItemInHandRendererMixin.java @@ -1,49 +1,36 @@ package net.quepierts.simpleanimator.core.mixin; -import com.mojang.blaze3d.vertex.PoseStack; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.model.PlayerModel; import net.minecraft.client.player.AbstractClientPlayer; import net.minecraft.client.renderer.ItemInHandRenderer; -import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.entity.EntityRenderDispatcher; import net.minecraft.client.renderer.entity.player.PlayerRenderer; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.item.ItemStack; -import net.quepierts.simpleanimator.core.SimpleAnimator; +import net.quepierts.simpleanimator.api.IAnimateHandler; import net.quepierts.simpleanimator.core.client.ClientAnimator; +import net.quepierts.simpleanimator.core.client.util.IModelUpdater; +import org.jetbrains.annotations.NotNull; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.Unique; @Environment(EnvType.CLIENT) @Mixin(ItemInHandRenderer.class) -public class ItemInHandRendererMixin { +public class ItemInHandRendererMixin implements IModelUpdater { @Shadow @Final private EntityRenderDispatcher entityRenderDispatcher; - @Inject( - method = "renderArmWithItem", - at = @At( - value = "INVOKE", - target = "Lcom/mojang/blaze3d/vertex/PoseStack;pushPose()V", - shift = At.Shift.AFTER - ) - ) - public void update(AbstractClientPlayer pPlayer, float pPartialTicks, float pPitch, InteractionHand pHand, float pSwingProgress, ItemStack pStack, float pEquippedProgress, PoseStack pPoseStack, MultiBufferSource pBuffer, int pCombinedLight, CallbackInfo ci) { - if (!pStack.isEmpty()) { - ClientAnimator animator = SimpleAnimator.getClient().getClientAnimatorManager().getAnimator(pPlayer.getUUID()); + @Unique + public void simpleAnimator$update(@NotNull AbstractClientPlayer pPlayer) { + ClientAnimator animator = (ClientAnimator) ((IAnimateHandler) pPlayer).simpleanimator$getAnimator(); - if (animator != null && animator.isRunning()) { - PlayerRenderer playerrenderer = (PlayerRenderer)this.entityRenderDispatcher.getRenderer(pPlayer); - PlayerModel model = playerrenderer.getModel(); - float yaw = pPlayer.yHeadRot - pPlayer.yBodyRot; - float pitch = pPlayer.getXRot(); - model.setupAnim(pPlayer, 0.0F, 0.0F, 0.0F, yaw, pitch); - } + if (animator.isRunning()) { + PlayerRenderer playerrenderer = (PlayerRenderer)this.entityRenderDispatcher.getRenderer(pPlayer); + PlayerModel model = playerrenderer.getModel(); + float yaw = pPlayer.yHeadRot - pPlayer.yBodyRot; + float pitch = pPlayer.getXRot(); + model.setupAnim(pPlayer, 0F, 0F, 0F, yaw, pitch); } } } diff --git a/common/src/main/java/net/quepierts/simpleanimator/core/mixin/LivingEntityRendererMixin.java b/common/src/main/java/net/quepierts/simpleanimator/core/mixin/LivingEntityRendererMixin.java index fe290a7..dece3e1 100644 --- a/common/src/main/java/net/quepierts/simpleanimator/core/mixin/LivingEntityRendererMixin.java +++ b/common/src/main/java/net/quepierts/simpleanimator/core/mixin/LivingEntityRendererMixin.java @@ -7,9 +7,11 @@ import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.entity.LivingEntityRenderer; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.player.Player; -import net.quepierts.simpleanimator.core.SimpleAnimator; +import net.quepierts.simpleanimator.api.IAnimateHandler; +import net.quepierts.simpleanimator.core.PlayerUtils; +import net.quepierts.simpleanimator.core.animation.ModelBone; import net.quepierts.simpleanimator.core.client.ClientAnimator; +import org.joml.Quaternionf; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -27,10 +29,20 @@ public class LivingEntityRendererMixin 1024) { + if (!PlayerUtils.inSameDimension((Player) (Object) this, target) || this.distanceToSqr(target) > SimpleAnimator.getProxy().getConfig().interactInviteDistanceSquare) { return false; } @@ -107,7 +108,7 @@ public void createAnimator(Level level, BlockPos blockPos, float f, GameProfile } @Unique @Override - public boolean simpleanimator$accept(@NotNull Player requester, boolean update) { + public boolean simpleanimator$accept(@NotNull Player requester, boolean update, boolean forced) { PlayerMixin req = (PlayerMixin) (Object) requester; if (!req.simpleanimator$request.hasRequest() || !this.getUUID().equals(req.simpleanimator$request.getTarget())) @@ -117,35 +118,30 @@ public void createAnimator(Level level, BlockPos blockPos, float f, GameProfile return false; this.simpleanimator$cancel(false); + this.simpleanimator$stopAnimate(false); - Vec3 position = PlayerUtils.getRelativePosition(requester, 1, 0); + Vec3 position = PlayerUtils.getRelativePositionWorldSpace(requester, 1, 0); - if (this.distanceToSqr(position) > 0.1f) { + if (!forced && this.distanceToSqr(position) > 0.1f) { if (this.isLocalPlayer()) { - SimpleAnimator.getClient() - .getNavigator() - .navigateTo(requester, 1, 0, () -> { - this.simpleanimator$accept(requester, true); - //SimpleAnimator.getNetwork().update(new InteractAcceptPacket(requester.getUUID(), this.getUUID())); - }); + simpleAnimator$navigate(requester); } return false; } Interaction interaction = SimpleAnimator.getProxy().getAnimationManager().getInteraction(req.simpleanimator$request.getInteraction()); - req.simpleanimator$request.cancel(); - - if (interaction == null) - return true; - - req.simpleanimator$animator.play(interaction.requester()); - this.simpleanimator$animator.play(interaction.receiver()); + req.simpleanimator$request.reset(); - this.moveTo(position); + this.setPos(position); this.lookAt(EntityAnchorArgument.Anchor.EYES, req.getEyePosition()); + if (interaction != null) { + req.simpleanimator$animator.play(interaction.requester()); + this.simpleanimator$animator.play(interaction.receiver()); + } + if (update && this.isLocalPlayer()) { - SimpleAnimator.getNetwork().update(new InteractAcceptPacket(requester.getUUID(), this.getUUID())); + SimpleAnimator.getNetwork().update(new InteractAcceptPacket(requester.getUUID(), this.getUUID(), forced)); } return true; } @@ -156,7 +152,7 @@ public void createAnimator(Level level, BlockPos blockPos, float f, GameProfile return; this.simpleanimator$animator.stop(); - this.simpleanimator$request.cancel(); + this.simpleanimator$request.reset(); if (update && this.isLocalPlayer()) { SimpleAnimator.getNetwork().update(new InteractCancelPacket(this.getUUID())); @@ -172,4 +168,14 @@ public void createAnimator(Level level, BlockPos blockPos, float f, GameProfile public RequestHolder simpleanimator$getRequest() { return this.simpleanimator$request; } + + @Unique @Environment(EnvType.CLIENT) + private void simpleAnimator$navigate(Player requester) { + SimpleAnimator.getClient() + .getNavigator() + .navigateTo(requester, 1, 0, () -> { + this.simpleanimator$accept(requester, true, true); + //SimpleAnimator.getNetwork().update(new InteractAcceptPacket(requester.getUUID(), this.getUUID())); + }); + } } diff --git a/common/src/main/java/net/quepierts/simpleanimator/core/mixin/PlayerRendererMixin.java b/common/src/main/java/net/quepierts/simpleanimator/core/mixin/PlayerRendererMixin.java index 28d629e..f696250 100644 --- a/common/src/main/java/net/quepierts/simpleanimator/core/mixin/PlayerRendererMixin.java +++ b/common/src/main/java/net/quepierts/simpleanimator/core/mixin/PlayerRendererMixin.java @@ -3,17 +3,16 @@ import com.mojang.blaze3d.vertex.PoseStack; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.Minecraft; import net.minecraft.client.model.PlayerModel; import net.minecraft.client.model.geom.ModelPart; import net.minecraft.client.player.AbstractClientPlayer; -import net.minecraft.client.player.LocalPlayer; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.client.renderer.entity.LivingEntityRenderer; import net.minecraft.client.renderer.entity.player.PlayerRenderer; import net.minecraft.client.renderer.texture.OverlayTexture; +import net.quepierts.simpleanimator.api.IAnimateHandler; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -35,16 +34,13 @@ public PlayerRendererMixin(EntityRendererProvider.Context pContext, PlayerModel< ), cancellable = true ) - public void cancel(PoseStack pPoseStack, MultiBufferSource pBuffer, int pCombinedLight, AbstractClientPlayer pPlayer, ModelPart pRendererArm, ModelPart pRendererArmwear, CallbackInfo ci) { - PlayerModel model = this.getModel(); - LocalPlayer pEntity = Minecraft.getInstance().player; - float yaw = pEntity.yHeadRot - pEntity.yBodyRot; - float pitch = pEntity.getXRot(); - model.setupAnim(pPlayer, 0.0F, 0.0F, 0.0F, yaw, pitch); - pRendererArm.xRot = 0.0F; - pRendererArm.render(pPoseStack, pBuffer.getBuffer(RenderType.entitySolid(pPlayer.getSkinTextureLocation())), pCombinedLight, OverlayTexture.NO_OVERLAY); - pRendererArmwear.xRot = 0.0F; - pRendererArmwear.render(pPoseStack, pBuffer.getBuffer(RenderType.entityTranslucent(pPlayer.getSkinTextureLocation())), pCombinedLight, OverlayTexture.NO_OVERLAY); - ci.cancel(); + public void forceSetupAnimWithRotation(PoseStack pPoseStack, MultiBufferSource pBuffer, int pCombinedLight, AbstractClientPlayer pPlayer, ModelPart pRendererArm, ModelPart pRendererArmwear, CallbackInfo ci) { + if (((IAnimateHandler) pPlayer).simpleanimator$getAnimator().isRunning()) { + pRendererArm.xRot = 0.0F; + pRendererArm.render(pPoseStack, pBuffer.getBuffer(RenderType.entitySolid(pPlayer.getSkinTextureLocation())), pCombinedLight, OverlayTexture.NO_OVERLAY); + pRendererArmwear.xRot = 0.0F; + pRendererArmwear.render(pPoseStack, pBuffer.getBuffer(RenderType.entityTranslucent(pPlayer.getSkinTextureLocation())), pCombinedLight, OverlayTexture.NO_OVERLAY); + ci.cancel(); + } } } diff --git a/fabric/src/main/java/net/quepierts/simpleanimator/fabric/mixin/CameraAccessor.java b/common/src/main/java/net/quepierts/simpleanimator/core/mixin/accessor/CameraAccessor.java similarity index 63% rename from fabric/src/main/java/net/quepierts/simpleanimator/fabric/mixin/CameraAccessor.java rename to common/src/main/java/net/quepierts/simpleanimator/core/mixin/accessor/CameraAccessor.java index 9a0050d..21cfc9d 100644 --- a/fabric/src/main/java/net/quepierts/simpleanimator/fabric/mixin/CameraAccessor.java +++ b/common/src/main/java/net/quepierts/simpleanimator/core/mixin/accessor/CameraAccessor.java @@ -1,9 +1,12 @@ -package net.quepierts.simpleanimator.fabric.mixin; +package net.quepierts.simpleanimator.core.mixin.accessor; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.minecraft.client.Camera; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Invoker; +@Environment(EnvType.CLIENT) @Mixin(Camera.class) public interface CameraAccessor { @Invoker("setRotation") diff --git a/common/src/main/java/net/quepierts/simpleanimator/core/mixin/model/CubeDefinitionAccessor.java b/common/src/main/java/net/quepierts/simpleanimator/core/mixin/accessor/CubeDefinitionAccessor.java similarity index 81% rename from common/src/main/java/net/quepierts/simpleanimator/core/mixin/model/CubeDefinitionAccessor.java rename to common/src/main/java/net/quepierts/simpleanimator/core/mixin/accessor/CubeDefinitionAccessor.java index 948516c..3c8ec01 100644 --- a/common/src/main/java/net/quepierts/simpleanimator/core/mixin/model/CubeDefinitionAccessor.java +++ b/common/src/main/java/net/quepierts/simpleanimator/core/mixin/accessor/CubeDefinitionAccessor.java @@ -1,5 +1,7 @@ -package net.quepierts.simpleanimator.core.mixin.model; +package net.quepierts.simpleanimator.core.mixin.accessor; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.minecraft.client.model.geom.builders.CubeDefinition; import net.minecraft.client.model.geom.builders.CubeDeformation; import net.minecraft.core.Direction; @@ -9,6 +11,7 @@ import java.util.Set; +@Environment(EnvType.CLIENT) @Mixin(CubeDefinition.class) public interface CubeDefinitionAccessor { @Invoker("") diff --git a/common/src/main/java/net/quepierts/simpleanimator/core/mixin/accessor/KeyMappingAccessor.java b/common/src/main/java/net/quepierts/simpleanimator/core/mixin/accessor/KeyMappingAccessor.java new file mode 100644 index 0000000..a18e2d7 --- /dev/null +++ b/common/src/main/java/net/quepierts/simpleanimator/core/mixin/accessor/KeyMappingAccessor.java @@ -0,0 +1,14 @@ +package net.quepierts.simpleanimator.core.mixin.accessor; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.KeyMapping; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Environment(EnvType.CLIENT) +@Mixin(KeyMapping.class) +public interface KeyMappingAccessor { + @Invoker("release") + void simpleanimator$release(); +} diff --git a/common/src/main/java/net/quepierts/simpleanimator/core/mixin/model/CubeListBuilderMixin.java b/common/src/main/java/net/quepierts/simpleanimator/core/mixin/model/CubeListBuilderMixin.java index cff7076..5997d43 100644 --- a/common/src/main/java/net/quepierts/simpleanimator/core/mixin/model/CubeListBuilderMixin.java +++ b/common/src/main/java/net/quepierts/simpleanimator/core/mixin/model/CubeListBuilderMixin.java @@ -1,10 +1,13 @@ package net.quepierts.simpleanimator.core.mixin.model; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.minecraft.client.model.geom.builders.CubeDefinition; import net.minecraft.client.model.geom.builders.CubeDeformation; import net.minecraft.client.model.geom.builders.CubeListBuilder; import net.minecraft.core.Direction; -import net.quepierts.simpleanimator.core.client.CubeListBuilderManipulator; +import net.quepierts.simpleanimator.core.client.util.CubeListBuilderManipulator; +import net.quepierts.simpleanimator.core.mixin.accessor.CubeDefinitionAccessor; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -13,6 +16,7 @@ import java.util.List; import java.util.Set; +@Environment(EnvType.CLIENT) @Mixin(CubeListBuilder.class) public abstract class CubeListBuilderMixin implements CubeListBuilderManipulator { diff --git a/common/src/main/java/net/quepierts/simpleanimator/core/mixin/model/PlayerModelMixin.java b/common/src/main/java/net/quepierts/simpleanimator/core/mixin/model/PlayerModelMixin.java index cfa760e..c889c0f 100644 --- a/common/src/main/java/net/quepierts/simpleanimator/core/mixin/model/PlayerModelMixin.java +++ b/common/src/main/java/net/quepierts/simpleanimator/core/mixin/model/PlayerModelMixin.java @@ -5,19 +5,12 @@ import net.minecraft.client.model.HumanoidModel; import net.minecraft.client.model.PlayerModel; import net.minecraft.client.model.geom.ModelPart; -import net.minecraft.client.model.geom.PartPose; -import net.minecraft.client.model.geom.builders.CubeDeformation; -import net.minecraft.client.model.geom.builders.CubeListBuilder; -import net.minecraft.client.model.geom.builders.MeshDefinition; -import net.minecraft.client.model.geom.builders.PartDefinition; import net.minecraft.client.player.AbstractClientPlayer; import net.minecraft.core.Direction; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.quepierts.simpleanimator.core.SimpleAnimator; import net.quepierts.simpleanimator.core.client.ClientAnimator; -import net.quepierts.simpleanimator.core.client.CubeListBuilderManipulator; -import net.quepierts.simpleanimator.core.config.ClientConfiguration; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -25,8 +18,6 @@ import org.spongepowered.asm.mixin.injection.At; 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; import java.util.Set; @@ -56,7 +47,6 @@ public PlayerModelMixin(ModelPart pRoot) { at = @At("HEAD") ) public void resetModelParts(T livingEntity, float f, float g, float h, float i, float j, CallbackInfo ci) { - // Prevent model parts will fly away this.head.resetPose(); this.body.resetPose(); this.leftArm.resetPose(); @@ -112,7 +102,7 @@ public void process(T pEntity, float pLimbSwing, float pLimbSwingAmount, float p } } - @Inject( + /*@Inject( method = "createMesh", at = @At( value = "RETURN", @@ -121,7 +111,7 @@ public void process(T pEntity, float pLimbSwing, float pLimbSwingAmount, float p locals = LocalCapture.CAPTURE_FAILHARD ) private static void replaceMesh(CubeDeformation cubeDeformation, boolean bl, CallbackInfoReturnable cir, MeshDefinition meshDefinition, PartDefinition partDefinition) { - if (!ClientConfiguration.hasBendModel()) + if (!SimpleAnimator.getClient().getClientConfiguration().s) return; if (bl) { @@ -149,5 +139,5 @@ private static void replaceMesh(CubeDeformation cubeDeformation, boolean bl, Cal left_arm.addOrReplaceChild("left_hand_sleeve", ((CubeListBuilderManipulator) CubeListBuilder.create().texOffs(48, 54)).simpleAnimator$addBox(-2.0F, 0.0F, -2.0F, 4.0F, 6.0F, 4.0F, new CubeDeformation(0.0F), LOWER_MODEL), PartPose.offset(1.0F, 4.0F, 0.0F)); right_arm.addOrReplaceChild("right_hand_sleeve", ((CubeListBuilderManipulator) CubeListBuilder.create().texOffs(40, 38)).simpleAnimator$addBox(-2.0F, 0.0F, -2.0F, 4.0F, 6.0F, 4.0F, new CubeDeformation(0.0F), LOWER_MODEL), PartPose.offset(1.0F, 4.0F, 0.0F)); } - } + }*/ } diff --git a/common/src/main/java/net/quepierts/simpleanimator/core/network/BiPacket.java b/common/src/main/java/net/quepierts/simpleanimator/core/network/BiPacket.java index 74e2218..dae3f7e 100644 --- a/common/src/main/java/net/quepierts/simpleanimator/core/network/BiPacket.java +++ b/common/src/main/java/net/quepierts/simpleanimator/core/network/BiPacket.java @@ -1,5 +1,7 @@ package net.quepierts.simpleanimator.core.network; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.minecraft.server.level.ServerPlayer; import org.jetbrains.annotations.NotNull; @@ -18,5 +20,6 @@ public void handle(NetworkContext context) { protected abstract void update(@NotNull ServerPlayer sender); + @Environment(EnvType.CLIENT) protected abstract void sync(); } diff --git a/common/src/main/java/net/quepierts/simpleanimator/core/network/packet/AnimatorDataPacket.java b/common/src/main/java/net/quepierts/simpleanimator/core/network/packet/AnimatorDataPacket.java index 29ca025..93a6947 100644 --- a/common/src/main/java/net/quepierts/simpleanimator/core/network/packet/AnimatorDataPacket.java +++ b/common/src/main/java/net/quepierts/simpleanimator/core/network/packet/AnimatorDataPacket.java @@ -1,11 +1,13 @@ package net.quepierts.simpleanimator.core.network.packet; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; +import net.quepierts.simpleanimator.api.animation.Animator; import net.quepierts.simpleanimator.core.SimpleAnimator; import net.quepierts.simpleanimator.core.animation.AnimationState; -import net.quepierts.simpleanimator.api.animation.Animator; import org.jetbrains.annotations.NotNull; import java.util.UUID; @@ -77,6 +79,7 @@ public void update(@NotNull ServerPlayer sender) { } @Override + @Environment(EnvType.CLIENT) public void sync() { SimpleAnimator.getProxy().getAnimatorManager().createIfAbsent(owner).sync(this); } diff --git a/common/src/main/java/net/quepierts/simpleanimator/core/network/packet/AnimatorPlayPacket.java b/common/src/main/java/net/quepierts/simpleanimator/core/network/packet/AnimatorPlayPacket.java index 071ec9a..4f5e3fe 100644 --- a/common/src/main/java/net/quepierts/simpleanimator/core/network/packet/AnimatorPlayPacket.java +++ b/common/src/main/java/net/quepierts/simpleanimator/core/network/packet/AnimatorPlayPacket.java @@ -1,5 +1,7 @@ package net.quepierts.simpleanimator.core.network.packet; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; @@ -33,6 +35,7 @@ public void update(@NotNull ServerPlayer sender) { } @Override + @Environment(EnvType.CLIENT) public void sync() { SimpleAnimator.getProxy().getAnimatorManager().createIfAbsent(owner).play(animation); } diff --git a/common/src/main/java/net/quepierts/simpleanimator/core/network/packet/AnimatorStopPacket.java b/common/src/main/java/net/quepierts/simpleanimator/core/network/packet/AnimatorStopPacket.java index 4a88019..b7aa3c2 100644 --- a/common/src/main/java/net/quepierts/simpleanimator/core/network/packet/AnimatorStopPacket.java +++ b/common/src/main/java/net/quepierts/simpleanimator/core/network/packet/AnimatorStopPacket.java @@ -1,5 +1,7 @@ package net.quepierts.simpleanimator.core.network.packet; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.server.level.ServerPlayer; import net.quepierts.simpleanimator.core.SimpleAnimator; @@ -23,6 +25,7 @@ public void update(@NotNull ServerPlayer sender) { } @Override + @Environment(EnvType.CLIENT) public void sync() { SimpleAnimator.getProxy().getAnimatorManager().createIfAbsent(this.owner).stop(); } diff --git a/common/src/main/java/net/quepierts/simpleanimator/core/network/packet/InteractAcceptPacket.java b/common/src/main/java/net/quepierts/simpleanimator/core/network/packet/InteractAcceptPacket.java index a25cfa9..5a461f9 100644 --- a/common/src/main/java/net/quepierts/simpleanimator/core/network/packet/InteractAcceptPacket.java +++ b/common/src/main/java/net/quepierts/simpleanimator/core/network/packet/InteractAcceptPacket.java @@ -13,30 +13,34 @@ public class InteractAcceptPacket extends UserPacket { private final UUID target; + private final boolean forced; public InteractAcceptPacket(FriendlyByteBuf byteBuf) { super(byteBuf); this.target = byteBuf.readUUID(); + this.forced = byteBuf.readBoolean(); } - public InteractAcceptPacket(UUID requester, UUID receiver) { + public InteractAcceptPacket(UUID requester, UUID receiver, boolean forced) { super(requester); this.target = receiver; + this.forced = forced; } @Override public void write(FriendlyByteBuf buffer) { super.write(buffer); buffer.writeUUID(this.target); + buffer.writeBoolean(this.forced); } @Override public void update(@NotNull ServerPlayer sender) { - Player target = sender.level().getPlayerByUUID(this.target); - if (target == null) + Player requester = sender.level().getPlayerByUUID(this.owner); + if (requester == null) return; - if (((IInteractHandler) target).simpleanimator$accept(sender, false)) { + if (((IInteractHandler) sender).simpleanimator$accept(requester, false, forced)) { SimpleAnimator.getNetwork().sendToPlayers(this, sender); } } @@ -48,6 +52,6 @@ protected void sync() { Player requester = level.getPlayerByUUID(this.owner); Player target = level.getPlayerByUUID(this.target); - ((IInteractHandler) target).simpleanimator$accept(requester, false); + ((IInteractHandler) target).simpleanimator$accept(requester, false, forced); } } diff --git a/common/src/main/java/net/quepierts/simpleanimator/core/network/packet/InteractCancelPacket.java b/common/src/main/java/net/quepierts/simpleanimator/core/network/packet/InteractCancelPacket.java index 37d3215..12d44db 100644 --- a/common/src/main/java/net/quepierts/simpleanimator/core/network/packet/InteractCancelPacket.java +++ b/common/src/main/java/net/quepierts/simpleanimator/core/network/packet/InteractCancelPacket.java @@ -1,5 +1,7 @@ package net.quepierts.simpleanimator.core.network.packet; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.server.level.ServerPlayer; import net.quepierts.simpleanimator.core.SimpleAnimator; @@ -24,6 +26,7 @@ protected void update(@NotNull ServerPlayer sender) { } @Override + @Environment(EnvType.CLIENT) protected void sync() { SimpleAnimator.getProxy().getInteractionManager().cancel(this.owner); } diff --git a/common/src/main/java/net/quepierts/simpleanimator/core/network/packet/InteractInvitePacket.java b/common/src/main/java/net/quepierts/simpleanimator/core/network/packet/InteractInvitePacket.java index 1c69dc4..4da715b 100644 --- a/common/src/main/java/net/quepierts/simpleanimator/core/network/packet/InteractInvitePacket.java +++ b/common/src/main/java/net/quepierts/simpleanimator/core/network/packet/InteractInvitePacket.java @@ -1,5 +1,7 @@ package net.quepierts.simpleanimator.core.network.packet; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.network.FriendlyByteBuf; @@ -48,6 +50,7 @@ public void update(@NotNull ServerPlayer sender) { } @Override + @Environment(EnvType.CLIENT) public void sync() { ClientLevel level = Minecraft.getInstance().level; Player requester = level.getPlayerByUUID(this.owner); diff --git a/common/src/main/java/net/quepierts/simpleanimator/core/network/packet/batch/ClientUpdateAnimationPacket.java b/common/src/main/java/net/quepierts/simpleanimator/core/network/packet/batch/ClientUpdateAnimationPacket.java index c05c428..f42c82a 100644 --- a/common/src/main/java/net/quepierts/simpleanimator/core/network/packet/batch/ClientUpdateAnimationPacket.java +++ b/common/src/main/java/net/quepierts/simpleanimator/core/network/packet/batch/ClientUpdateAnimationPacket.java @@ -3,8 +3,8 @@ import com.google.common.collect.ImmutableMap; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceLocation; -import net.quepierts.simpleanimator.core.SimpleAnimator; import net.quepierts.simpleanimator.api.animation.Animation; +import net.quepierts.simpleanimator.core.SimpleAnimator; import net.quepierts.simpleanimator.core.network.ISync; import java.util.Map; diff --git a/common/src/main/java/net/quepierts/simpleanimator/core/network/packet/batch/ClientUpdateAnimatorPacket.java b/common/src/main/java/net/quepierts/simpleanimator/core/network/packet/batch/ClientUpdateAnimatorPacket.java index 7096e7e..418434a 100644 --- a/common/src/main/java/net/quepierts/simpleanimator/core/network/packet/batch/ClientUpdateAnimatorPacket.java +++ b/common/src/main/java/net/quepierts/simpleanimator/core/network/packet/batch/ClientUpdateAnimatorPacket.java @@ -1,9 +1,9 @@ package net.quepierts.simpleanimator.core.network.packet.batch; import net.minecraft.network.FriendlyByteBuf; +import net.quepierts.simpleanimator.api.animation.Animator; import net.quepierts.simpleanimator.core.SimpleAnimator; import net.quepierts.simpleanimator.core.animation.AnimationState; -import net.quepierts.simpleanimator.api.animation.Animator; import net.quepierts.simpleanimator.core.network.ISync; import net.quepierts.simpleanimator.core.network.packet.AnimatorDataPacket; diff --git a/common/src/main/java/net/quepierts/simpleanimator/core/network/packet/batch/ClientUpdateInteractionPacket.java b/common/src/main/java/net/quepierts/simpleanimator/core/network/packet/batch/ClientUpdateInteractionPacket.java index 80b4ade..3d52182 100644 --- a/common/src/main/java/net/quepierts/simpleanimator/core/network/packet/batch/ClientUpdateInteractionPacket.java +++ b/common/src/main/java/net/quepierts/simpleanimator/core/network/packet/batch/ClientUpdateInteractionPacket.java @@ -3,8 +3,8 @@ import com.google.common.collect.ImmutableMap; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceLocation; -import net.quepierts.simpleanimator.core.SimpleAnimator; import net.quepierts.simpleanimator.api.animation.Interaction; +import net.quepierts.simpleanimator.core.SimpleAnimator; import net.quepierts.simpleanimator.core.network.ISync; import java.util.Map; diff --git a/common/src/main/java/net/quepierts/simpleanimator/core/proxy/ClientProxy.java b/common/src/main/java/net/quepierts/simpleanimator/core/proxy/ClientProxy.java index 52a8011..7721c38 100644 --- a/common/src/main/java/net/quepierts/simpleanimator/core/proxy/ClientProxy.java +++ b/common/src/main/java/net/quepierts/simpleanimator/core/proxy/ClientProxy.java @@ -2,15 +2,18 @@ import net.quepierts.simpleanimator.core.client.ClientAnimatorManager; import net.quepierts.simpleanimator.core.client.ClientPlayerNavigator; +import net.quepierts.simpleanimator.core.config.ClientConfiguration; public class ClientProxy extends CommonProxy { private final ClientPlayerNavigator navigator; private final Runnable setup; + private final ClientConfiguration config; public ClientProxy(Runnable common, Runnable client) { super(new ClientAnimatorManager(), common); this.navigator = new ClientPlayerNavigator(); this.setup = client; + this.config = ClientConfiguration.load(); } public ClientPlayerNavigator getNavigator() { @@ -26,4 +29,8 @@ public void setup() { super.setup(); this.setup.run(); } + + public ClientConfiguration getClientConfiguration() { + return config; + } } diff --git a/common/src/main/java/net/quepierts/simpleanimator/core/proxy/CommonProxy.java b/common/src/main/java/net/quepierts/simpleanimator/core/proxy/CommonProxy.java index e402560..5c14541 100644 --- a/common/src/main/java/net/quepierts/simpleanimator/core/proxy/CommonProxy.java +++ b/common/src/main/java/net/quepierts/simpleanimator/core/proxy/CommonProxy.java @@ -1,9 +1,10 @@ package net.quepierts.simpleanimator.core.proxy; -import net.quepierts.simpleanimator.core.animation.AnimationManager; import net.quepierts.simpleanimator.api.animation.Animator; +import net.quepierts.simpleanimator.core.animation.AnimationManager; import net.quepierts.simpleanimator.core.animation.AnimatorManager; import net.quepierts.simpleanimator.core.animation.InteractionManager; +import net.quepierts.simpleanimator.core.config.CommonConfiguration; public class CommonProxy { protected final AnimatorManager animatorManager; @@ -11,6 +12,7 @@ public class CommonProxy { protected final InteractionManager interactionManager; private final Runnable setup; + private final CommonConfiguration config; public CommonProxy(Runnable setup) { this(new AnimatorManager<>(), setup); @@ -21,6 +23,7 @@ protected CommonProxy(AnimatorManager animatorManager, Runna this.animatorManager = animatorManager; this.interactionManager = new InteractionManager(); this.setup = setup; + this.config = CommonConfiguration.load(); } public AnimatorManager getAnimatorManager() { @@ -35,6 +38,10 @@ public InteractionManager getInteractionManager() { return interactionManager; } + public CommonConfiguration getConfig() { + return config; + } + public void setup() { this.setup.run(); } diff --git a/common/src/main/resources/assets/simple_animator/lang/en_us.json b/common/src/main/resources/assets/simple_animator/lang/en_us.json index 98f7383..49d38a2 100644 --- a/common/src/main/resources/assets/simple_animator/lang/en_us.json +++ b/common/src/main/resources/assets/simple_animator/lang/en_us.json @@ -1,5 +1,6 @@ { "animator.commands.failed.invalid_source": "Invalid execute source for command", "animator.commands.failed.same_player": "You cannot get request from your self", - "animator.commands.failed.nonexistent_request": "Nonexistent request" + "animator.commands.failed.nonexistent_request": "Nonexistent request", + "animator.commands.message.query": "Animation[{}]" } \ No newline at end of file diff --git a/common/src/main/resources/simple_animator-common.mixins.json b/common/src/main/resources/simple_animator-common.mixins.json index f4adf06..32e921d 100644 --- a/common/src/main/resources/simple_animator-common.mixins.json +++ b/common/src/main/resources/simple_animator-common.mixins.json @@ -10,11 +10,16 @@ "CameraMixin", "CapeLayerMixin", "EntityMixin", + "EntityRenderDispatcherMixin", + "GameRendererMixin", "ItemInHandRendererMixin", + "accessor.KeyMappingAccessor", "LivingEntityRendererMixin", "LocalPlayerMixin", + "MinecraftClientMixin", "PlayerRendererMixin", - "model.CubeDefinitionAccessor", + "accessor.CameraAccessor", + "accessor.CubeDefinitionAccessor", "model.CubeListBuilderMixin", "model.PlayerModelMixin" ], diff --git a/fabric/build.gradle b/fabric/build.gradle index 7874534..9d66c2d 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -40,7 +40,7 @@ remapJar { injectAccessWidener = true inputFile.set(shadowJar.archiveFile) dependsOn shadowJar - archiveClassifier = "fabric" + archiveAppendix.set("fabric-${rootProject.minecraft_version}") } jar { diff --git a/fabric/src/main/java/net/quepierts/simpleanimator/fabric/SimpleAnimatorFabric.java b/fabric/src/main/java/net/quepierts/simpleanimator/fabric/SimpleAnimatorFabric.java index ba7aa1d..faa2043 100644 --- a/fabric/src/main/java/net/quepierts/simpleanimator/fabric/SimpleAnimatorFabric.java +++ b/fabric/src/main/java/net/quepierts/simpleanimator/fabric/SimpleAnimatorFabric.java @@ -4,6 +4,7 @@ import net.fabricmc.api.ModInitializer; import net.fabricmc.loader.api.FabricLoader; import net.quepierts.simpleanimator.core.SimpleAnimator; +import net.quepierts.simpleanimator.fabric.network.FabricClientNetworkImpl; import net.quepierts.simpleanimator.fabric.network.FabricNetworkImpl; import net.quepierts.simpleanimator.fabric.proxy.FabricClientProxy; import net.quepierts.simpleanimator.fabric.proxy.FabricCommonProxy; @@ -11,11 +12,12 @@ public class SimpleAnimatorFabric implements ModInitializer { @Override public void onInitialize() { + boolean isClient = FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT; SimpleAnimator.init( - FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT, - FabricClientProxy::setup, + isClient, FabricCommonProxy::setup, - new FabricNetworkImpl() + FabricClientProxy::setup, + isClient ? new FabricClientNetworkImpl() : new FabricNetworkImpl() ); } } \ No newline at end of file diff --git a/fabric/src/main/java/net/quepierts/simpleanimator/fabric/mixin/GameRendererMixin.java b/fabric/src/main/java/net/quepierts/simpleanimator/fabric/mixin/GameRendererMixin.java deleted file mode 100644 index 3570a66..0000000 --- a/fabric/src/main/java/net/quepierts/simpleanimator/fabric/mixin/GameRendererMixin.java +++ /dev/null @@ -1,60 +0,0 @@ -package net.quepierts.simpleanimator.fabric.mixin; - -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.math.Axis; -import net.minecraft.client.Camera; -import net.minecraft.client.CameraType; -import net.minecraft.client.Minecraft; -import net.minecraft.client.player.LocalPlayer; -import net.minecraft.client.renderer.GameRenderer; -import net.quepierts.simpleanimator.core.SimpleAnimator; -import net.quepierts.simpleanimator.core.animation.ModelBone; -import net.quepierts.simpleanimator.core.client.ClientAnimator; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(GameRenderer.class) -public class GameRendererMixin { - @Shadow @Final private Camera mainCamera; - - @Inject( - method = "renderLevel", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/client/Camera;setup(Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/world/entity/Entity;ZZF)V", - shift = At.Shift.AFTER - ) - ) - public void applyCameraRotation(float f, long l, PoseStack poseStack, CallbackInfo ci) { - if (Minecraft.getInstance().options.getCameraType() != CameraType.FIRST_PERSON) - return; - - ClientAnimator animator = SimpleAnimator.getClient().getClientAnimatorManager().getLocalAnimator(); - - if (animator.isRunning() && animator.getAnimation().isOverride() && animator.isProcessed()) { - ClientAnimator.Cache root = animator.getCache(ModelBone.ROOT); - ClientAnimator.Cache head = animator.getCache(ModelBone.HEAD); - - LocalPlayer player = Minecraft.getInstance().player; - assert player != null; - float yRot = player.yHeadRot - player.yBodyRot; - float xRot = player.getXRot(); - - float x = (float) Math.toDegrees(root.rotation().x + head.rotation().x); - float y = (float) Math.toDegrees(root.rotation().y + head.rotation().y); - - Camera camera = this.mainCamera; - ((CameraAccessor) camera).simpleanimator$setRotation( - camera.getYRot() + y - yRot, - camera.getXRot() + x - xRot - ); - - poseStack.mulPose(Axis.ZP.rotation(root.rotation().z + head.rotation().z)); - } - - } -} diff --git a/fabric/src/main/java/net/quepierts/simpleanimator/fabric/network/FabricClientNetworkImpl.java b/fabric/src/main/java/net/quepierts/simpleanimator/fabric/network/FabricClientNetworkImpl.java new file mode 100644 index 0000000..64b89a0 --- /dev/null +++ b/fabric/src/main/java/net/quepierts/simpleanimator/fabric/network/FabricClientNetworkImpl.java @@ -0,0 +1,39 @@ +package net.quepierts.simpleanimator.fabric.network; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; +import net.fabricmc.fabric.api.networking.v1.PacketType; +import net.quepierts.simpleanimator.core.network.IPacket; +import net.quepierts.simpleanimator.core.network.NetworkContext; +import net.quepierts.simpleanimator.core.network.NetworkDirection; +import net.quepierts.simpleanimator.core.network.NetworkPackets; + +@Environment(EnvType.CLIENT) +public class FabricClientNetworkImpl extends FabricNetworkImpl { + public FabricClientNetworkImpl() { + super(); + } + + @Override + public void update(IPacket packet) { + PacketType type = this.getPacketID(packet); + if (type == null) + return; + + ClientPlayNetworking.send(new FabricPacketImpl(packet)); + } + + @Override + public void register(NetworkPackets.PacketType packet) { + super.register(packet); + + if (packet.direction != NetworkDirection.PLAY_TO_SERVER) { + ClientPlayNetworking.registerGlobalReceiver( + this.packets.get(packet.type), + (fabricPacket, player, responseSender) -> fabricPacket.getPacket().handle(new NetworkContext(NetworkDirection.PLAY_TO_CLIENT, null)) + ); + } + } +} + diff --git a/fabric/src/main/java/net/quepierts/simpleanimator/fabric/network/FabricNetworkImpl.java b/fabric/src/main/java/net/quepierts/simpleanimator/fabric/network/FabricNetworkImpl.java index a792bd8..d16f931 100644 --- a/fabric/src/main/java/net/quepierts/simpleanimator/fabric/network/FabricNetworkImpl.java +++ b/fabric/src/main/java/net/quepierts/simpleanimator/fabric/network/FabricNetworkImpl.java @@ -1,7 +1,8 @@ package net.quepierts.simpleanimator.fabric.network; import com.google.common.collect.ImmutableMap; -import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.networking.v1.FabricPacket; import net.fabricmc.fabric.api.networking.v1.PacketType; import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; @@ -17,7 +18,7 @@ import java.util.Locale; public class FabricNetworkImpl implements INetwork { - private final ImmutableMap, PacketType> packets; + protected final ImmutableMap, PacketType> packets; public FabricNetworkImpl() { NetworkPackets[] values = NetworkPackets.values(); @@ -80,23 +81,20 @@ public void sendToPlayers(IPacket packet, ServerPlayer player) { if (serverPlayer == player) continue; - ServerPlayNetworking.send(player, new FabricPacketImpl(packet)); + ServerPlayNetworking.send(serverPlayer, new FabricPacketImpl(packet)); } } @Override + @Environment(EnvType.CLIENT) public void update(IPacket packet) { - PacketType type = this.getPacketID(packet); - if (type == null) - return; - ClientPlayNetworking.send(new FabricPacketImpl(packet)); } - private PacketType getPacketID(IPacket packet) { + protected PacketType getPacketID(IPacket packet) { return this.packets.get(packet.getClass()); } - private boolean notExist(IPacket packet) { + protected boolean notExist(IPacket packet) { return !this.packets.containsKey(packet.getClass()); } @@ -109,16 +107,9 @@ public void register(NetworkPackets.PacketType packet) { (fabricPacket, player, responseSender) -> fabricPacket.getPacket().handle(new NetworkContext(NetworkDirection.PLAY_TO_SERVER, player)) ); } - - if (packet.direction != NetworkDirection.PLAY_TO_SERVER) { - ClientPlayNetworking.registerGlobalReceiver( - this.packets.get(packet.type), - (fabricPacket, player, responseSender) -> fabricPacket.getPacket().handle(new NetworkContext(NetworkDirection.PLAY_TO_CLIENT, null)) - ); - } } - private final class FabricPacketImpl implements FabricPacket { + protected final class FabricPacketImpl implements FabricPacket { private final IPacket packet; public FabricPacketImpl(IPacket packet) { this.packet = packet; diff --git a/fabric/src/main/java/net/quepierts/simpleanimator/fabric/proxy/FabricClientProxy.java b/fabric/src/main/java/net/quepierts/simpleanimator/fabric/proxy/FabricClientProxy.java index cbed13d..b62e37e 100644 --- a/fabric/src/main/java/net/quepierts/simpleanimator/fabric/proxy/FabricClientProxy.java +++ b/fabric/src/main/java/net/quepierts/simpleanimator/fabric/proxy/FabricClientProxy.java @@ -1,38 +1,22 @@ package net.quepierts.simpleanimator.fabric.proxy; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; -import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext; -import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents; -import net.minecraft.Util; import net.minecraft.client.Minecraft; import net.quepierts.simpleanimator.core.SimpleAnimator; import net.quepierts.simpleanimator.core.proxy.ClientProxy; public class FabricClientProxy { public static void setup() { - WorldRenderEvents.BEFORE_ENTITIES.register(FabricClientProxy::onWorldRenderBeforeEntities); ClientTickEvents.START_CLIENT_TICK.register(FabricClientProxy::onClientTick); proxy = SimpleAnimator.getClient(); } private static ClientProxy proxy; private static boolean canClear = false; - private static long time = Util.getMillis(); - - private static void onWorldRenderBeforeEntities(WorldRenderContext context) { - Minecraft minecraft = Minecraft.getInstance(); - long t = Util.getMillis(); - - if (!minecraft.isPaused() && minecraft.level != null) { - canClear = true; - proxy.getAnimatorManager().tick((t - time) / 1000f); - } - - time = t; - } private static void onClientTick(Minecraft minecraft) { if (minecraft.level != null) { + canClear = true; if (proxy.getNavigator().isNavigating()) { proxy.getNavigator().tick(); } diff --git a/fabric/src/main/resources/simple_animator.mixins.json b/fabric/src/main/resources/simple_animator.mixins.json index b763ceb..b38e9a4 100644 --- a/fabric/src/main/resources/simple_animator.mixins.json +++ b/fabric/src/main/resources/simple_animator.mixins.json @@ -6,8 +6,6 @@ "mixins": [ ], "client": [ - "CameraAccessor", - "GameRendererMixin" ], "injectors": { "defaultRequire": 1 diff --git a/forge/build.gradle b/forge/build.gradle index 43e5a9e..98f8a75 100644 --- a/forge/build.gradle +++ b/forge/build.gradle @@ -27,11 +27,14 @@ dependencies { shadowCommon(project(path: ":common", configuration: "transformProductionForge")) { transitive = false } } +String forge_version_range = "${rootProject.forge_version_range}" + processResources { inputs.property "version", project.version filesMatching("META-INF/mods.toml") { expand "version": project.version + expand "forge_version_range": forge_version_range } } @@ -45,7 +48,7 @@ shadowJar { remapJar { inputFile.set(shadowJar.archiveFile) dependsOn shadowJar - archiveClassifier.set("forge") + archiveAppendix.set("forge-${rootProject.minecraft_version}") } jar { diff --git a/forge/src/main/java/net/quepierts/simpleanimator/forge/config/ForgeCommonConfiguration.java b/forge/src/main/java/net/quepierts/simpleanimator/forge/config/ForgeCommonConfiguration.java deleted file mode 100644 index 75dfd54..0000000 --- a/forge/src/main/java/net/quepierts/simpleanimator/forge/config/ForgeCommonConfiguration.java +++ /dev/null @@ -1,32 +0,0 @@ -package net.quepierts.simpleanimator.forge.config; - -import net.minecraftforge.common.ForgeConfigSpec; -import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.fml.ModLoadingContext; -import net.minecraftforge.fml.config.ModConfig; -import net.minecraftforge.fml.event.config.ModConfigEvent; -import net.quepierts.simpleanimator.core.config.CommonConfiguration; - -public class ForgeCommonConfiguration extends CommonConfiguration { - private static final ForgeConfigSpec SPEC; - - private static final ForgeConfigSpec.BooleanValue SHOULD_SYNC_ANIMATION; - public static void register(ModLoadingContext context, IEventBus bus) { - context.registerConfig(ModConfig.Type.COMMON, SPEC); - bus.addListener(ForgeCommonConfiguration::onLoadConfig); - } - - private static void onLoadConfig(ModConfigEvent event) { - CommonConfiguration.syncAnimationToClient = SHOULD_SYNC_ANIMATION.get(); - } - - static { - final ForgeConfigSpec.Builder builder = new ForgeConfigSpec.Builder(); - - SHOULD_SYNC_ANIMATION = builder - .comment("Whether animations on server will sync to clients") - .define("shouldSyncAnimation", false); - - SPEC = builder.build(); - } -} diff --git a/forge/src/main/java/net/quepierts/simpleanimator/forge/network/ForgeNetworkImpl.java b/forge/src/main/java/net/quepierts/simpleanimator/forge/network/ForgeNetworkImpl.java index 13464d6..21114b8 100644 --- a/forge/src/main/java/net/quepierts/simpleanimator/forge/network/ForgeNetworkImpl.java +++ b/forge/src/main/java/net/quepierts/simpleanimator/forge/network/ForgeNetworkImpl.java @@ -67,7 +67,6 @@ public void register(NetworkPackets.PacketType type) { .decoder(type.decoder) .consumerNetworkThread((packet, supplier) -> { NetworkEvent.Context context = supplier.get(); - SimpleAnimator.LOGGER.info("Handler Packet: {}", packet.getClass().getSimpleName()); context.enqueueWork(() -> type.handler.accept(packet, new NetworkContext(s2f(context.getDirection()), context.getSender()))); context.setPacketHandled(true); }) diff --git a/forge/src/main/java/net/quepierts/simpleanimator/forge/proxy/ForgeClientProxy.java b/forge/src/main/java/net/quepierts/simpleanimator/forge/proxy/ForgeClientProxy.java index d73b35a..f116848 100644 --- a/forge/src/main/java/net/quepierts/simpleanimator/forge/proxy/ForgeClientProxy.java +++ b/forge/src/main/java/net/quepierts/simpleanimator/forge/proxy/ForgeClientProxy.java @@ -1,17 +1,10 @@ package net.quepierts.simpleanimator.forge.proxy; -import net.minecraft.Util; -import net.minecraft.client.CameraType; import net.minecraft.client.Minecraft; -import net.minecraft.client.player.LocalPlayer; -import net.minecraftforge.client.event.InputEvent; -import net.minecraftforge.client.event.ViewportEvent; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.TickEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.quepierts.simpleanimator.core.SimpleAnimator; -import net.quepierts.simpleanimator.core.animation.ModelBone; -import net.quepierts.simpleanimator.core.client.ClientAnimator; import net.quepierts.simpleanimator.core.proxy.ClientProxy; public class ForgeClientProxy { @@ -19,7 +12,6 @@ public static void setup() { MinecraftForge.EVENT_BUS.register(new ForgeClientProxy()); } - private static long time = Util.getMillis(); private final ClientProxy proxy; private ForgeClientProxy() { this.proxy = SimpleAnimator.getClient(); @@ -27,22 +19,6 @@ private ForgeClientProxy() { private boolean canClear = false; - @SubscribeEvent - public void onRenderTick(TickEvent.RenderTickEvent event) { - if (event.phase == TickEvent.Phase.END) - return; - - Minecraft minecraft = Minecraft.getInstance(); - long t = Util.getMillis(); - - if (!minecraft.isPaused() && minecraft.level != null) { - canClear = true; - this.proxy.getAnimatorManager().tick((t - time) / 1000f); - } - - time = t; - } - @SubscribeEvent public void onClientTick(TickEvent.ClientTickEvent event) { Minecraft minecraft = Minecraft.getInstance(); @@ -51,6 +27,7 @@ public void onClientTick(TickEvent.ClientTickEvent event) { return; if (minecraft.level != null) { + canClear = true; if (this.proxy.getNavigator().isNavigating()) { this.proxy.getNavigator().tick(); } @@ -61,40 +38,6 @@ public void onClientTick(TickEvent.ClientTickEvent event) { } /*@SubscribeEvent - public void onMovementInputUpdate(MovementInputUpdateEvent event) { - LocalPlayer player = Minecraft.getInstance().player; - Input input = event.getInput(); - boolean hasInput = input.forwardImpulse != 0 || input.leftImpulse != 0 || input.jumping || input.shiftKeyDown; - - if (hasInput) { - UUID uuid = player.getUUID(); - if (this.proxy.getNavigator().isNavigating()) { - this.proxy.getNavigator().stop(); - } - - if (this.proxy.getClientInteractionHandler().requesting()) { - this.proxy.getClientInteractionHandler().cancel(uuid); - SimpleAnimator.getNetwork().update(new InteractCancelPacket(uuid)); - return; - } - - ClientAnimator animator = this.proxy.getClientAnimatorManager().getLocalAnimator(); - - if (animator.isRunning() && !animator.getAnimation().isMovable()) { - if (animator.canStop() && animator.getAnimation().isAbortable()) { - animator.stop(); - SimpleAnimator.getNetwork().update(new AnimatorStopPacket(uuid)); - } - - input.forwardImpulse = 0.0f; - input.leftImpulse = 0.0f; - input.jumping = false; - input.shiftKeyDown = false; - } - } - }*/ - - @SubscribeEvent public void onInteractionKeyMappingTriggered(InputEvent.InteractionKeyMappingTriggered event) { ClientAnimator animator = this.proxy.getClientAnimatorManager().getLocalAnimator(); @@ -102,29 +45,5 @@ public void onInteractionKeyMappingTriggered(InputEvent.InteractionKeyMappingTri event.setCanceled(true); event.setSwingHand(false); } - } - - @SubscribeEvent - public void onComputeCameraAngles(ViewportEvent.ComputeCameraAngles event) { - if (Minecraft.getInstance().options.getCameraType() != CameraType.FIRST_PERSON) - return; - - ClientAnimator animator = this.proxy.getClientAnimatorManager().getLocalAnimator(); - - if (animator.isRunning() && animator.getAnimation().isOverride() && animator.isProcessed()) { - ClientAnimator.Cache root = animator.getCache(ModelBone.ROOT); - ClientAnimator.Cache head = animator.getCache(ModelBone.HEAD); - - LocalPlayer player = Minecraft.getInstance().player; - assert player != null; - float yRot = player.yHeadRot - player.yBodyRot; - float xRot = player.getXRot(); - - float x = (float) Math.toDegrees(root.rotation().x + head.rotation().x); - float y = (float) Math.toDegrees(root.rotation().y + head.rotation().y); - event.setPitch(event.getPitch() + x - xRot); - event.setYaw(event.getYaw() + y - yRot); - event.setRoll(event.getRoll() + (float) Math.toDegrees(root.rotation().z + head.rotation().z)); - } - } + }*/ } diff --git a/forge/src/main/java/net/quepierts/simpleanimator/forge/proxy/ForgeCommonProxy.java b/forge/src/main/java/net/quepierts/simpleanimator/forge/proxy/ForgeCommonProxy.java index 3d96a48..6b52c3b 100644 --- a/forge/src/main/java/net/quepierts/simpleanimator/forge/proxy/ForgeCommonProxy.java +++ b/forge/src/main/java/net/quepierts/simpleanimator/forge/proxy/ForgeCommonProxy.java @@ -9,7 +9,6 @@ import net.minecraftforge.event.entity.EntityLeaveLevelEvent; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.ModLoadingContext; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.quepierts.simpleanimator.core.SimpleAnimator; @@ -17,7 +16,6 @@ import net.quepierts.simpleanimator.core.command.InteractCommand; import net.quepierts.simpleanimator.core.network.NetworkPackets; import net.quepierts.simpleanimator.core.proxy.CommonProxy; -import net.quepierts.simpleanimator.forge.config.ForgeCommonConfiguration; import java.util.UUID; @@ -26,7 +24,6 @@ public static void setup() { MinecraftForge.EVENT_BUS.register(new ForgeCommonProxy()); IEventBus bus = FMLJavaModLoadingContext.get().getModEventBus(); bus.addListener(ForgeCommonProxy::commonSetup); - ForgeCommonConfiguration.register(ModLoadingContext.get(), bus); } private static void commonSetup(FMLCommonSetupEvent event) { @@ -71,9 +68,10 @@ public void onEntityLeaveLevel(EntityLeaveLevelEvent event) { @SubscribeEvent public void onOnDatapackSync(OnDatapackSyncEvent event) { - if (event.getPlayer() == null) - return; - - this.proxy.getAnimationManager().sync(event.getPlayer()); + if (event.getPlayer() != null) { + this.proxy.getAnimationManager().sync(event.getPlayer()); + } else { + this.proxy.getAnimationManager().sync(event.getPlayerList()); + } } } diff --git a/forge/src/main/resources/META-INF/mods.toml b/forge/src/main/resources/META-INF/mods.toml index 87c071b..44feb28 100644 --- a/forge/src/main/resources/META-INF/mods.toml +++ b/forge/src/main/resources/META-INF/mods.toml @@ -6,28 +6,27 @@ license="MIT" modId="simple_animator" version="${version}" displayName="SimpleAnimator" -logoFile="simple_animamtor.png" +logoFile="simple_animator.png" authors="Louis_Quepierts" description=''' ''' # A dependency - use the . to indicate dependency for a specific modid. Dependencies are optional. [[dependencies.simple_animator]] #optional - # the modid of the dependency - modId="forge" #mandatory - # Does this dependency have to exist - if not, ordering below must be specified - mandatory=true #mandatory - # The version range of the dependency - versionRange="[46,)" #mandatory - # An ordering relationship for the dependency - BEFORE or AFTER required if the relationship is not mandatory - ordering="NONE" - # Side this dependency is applied on - BOTH, CLIENT or SERVER - side="BOTH" -# Here's another dependency + # the modid of the dependency + modId="forge" #mandatory + # Does this dependency have to exist - if not, ordering below must be specified + mandatory=true #mandatory + # The version range of the dependency + versionRange="[46,)" #mandatory + # An ordering relationship for the dependency - BEFORE or AFTER required if the relationship is not mandatory + ordering="NONE" + # Side this dependency is applied on - BOTH, CLIENT or SERVER + side="BOTH" + # Here's another dependency [[dependencies.simple_animator]] - modId="minecraft" - mandatory=true - # This version range declares a minimum of the current minecraft version up to but not including the next major version - versionRange="[1.20,1.21)" - ordering="NONE" - side="BOTH" + modId="minecraft" + mandatory=true + versionRange="[1.20,1.20.2)" + ordering="NONE" + side="BOTH" diff --git a/gradle.properties b/gradle.properties index 2964081..c3d2064 100644 --- a/gradle.properties +++ b/gradle.properties @@ -13,3 +13,4 @@ fabric_loader_version=0.14.21 fabric_api_version=0.83.0+1.20 forge_version=1.20-46.0.10 +forge_version_range=[1.20,1.20.2) \ No newline at end of file