From 1d550b2cac825baeeefda71b1f19ce1d750498e9 Mon Sep 17 00:00:00 2001 From: Polymeta <40173118+Polymeta@users.noreply.github.com> Date: Tue, 13 May 2025 16:27:07 +0100 Subject: [PATCH] mixin cleanup Signed-off-by: Polymeta <40173118+Polymeta@users.noreply.github.com> --- .../mod/common/mixin/LocalPlayerMixin.java | 119 ------------------ .../common/mixin/client/LocalPlayerMixin.java | 99 ++++++++++++++- .../resources/mixins.cobblemon-common.json | 2 - 3 files changed, 96 insertions(+), 124 deletions(-) delete mode 100644 common/src/main/java/com/cobblemon/mod/common/mixin/LocalPlayerMixin.java diff --git a/common/src/main/java/com/cobblemon/mod/common/mixin/LocalPlayerMixin.java b/common/src/main/java/com/cobblemon/mod/common/mixin/LocalPlayerMixin.java deleted file mode 100644 index 874e88f44e..0000000000 --- a/common/src/main/java/com/cobblemon/mod/common/mixin/LocalPlayerMixin.java +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright (C) 2023 Cobblemon Contributors - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. - */ - -package com.cobblemon.mod.common.mixin; - -import com.cobblemon.mod.common.OrientationControllable; -import com.cobblemon.mod.common.api.orientation.OrientationController; -import com.cobblemon.mod.common.api.riding.Seat; -import com.cobblemon.mod.common.client.entity.PokemonClientDelegate; -import com.cobblemon.mod.common.client.render.MatrixWrapper; -import com.cobblemon.mod.common.client.render.models.blockbench.FloatingState; -import com.cobblemon.mod.common.client.render.models.blockbench.PosableModel; -import com.cobblemon.mod.common.client.render.models.blockbench.repository.VaryingModelRepository; -import com.cobblemon.mod.common.entity.pokemon.PokemonEntity; -import com.mojang.authlib.GameProfile; -import net.minecraft.client.CameraType; -import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.client.player.AbstractClientPlayer; -import net.minecraft.client.player.LocalPlayer; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.level.ClipContext; -import net.minecraft.world.phys.HitResult; -import net.minecraft.world.phys.Vec3; -import org.jetbrains.annotations.NotNull; -import org.joml.Matrix3f; -import org.joml.Vector3f; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import java.util.Map; - -@Mixin(LocalPlayer.class) -public abstract class LocalPlayerMixin extends AbstractClientPlayer implements OrientationControllable { - @Shadow - private float jumpRidingScale; - - public LocalPlayerMixin(ClientLevel clientLevel, GameProfile gameProfile) { - super(clientLevel, gameProfile); - } - - @Inject(method = "getJumpRidingScale", at = @At("HEAD"), cancellable = true) - public void modifyJumpRidingScale(CallbackInfoReturnable cir) { - LocalPlayer player = (LocalPlayer) (Object) this; - if (player.isPassenger() && player.getVehicle() instanceof PokemonEntity pokemonEntity) { - var rideValue = pokemonEntity.ifRidingAvailableSupply(null, (behaviour, settings, state) -> { - if (behaviour.canJump(settings, state, pokemonEntity, player)) return null; - return behaviour.setRideBar(settings, state, pokemonEntity, player); - }); - if (rideValue != null) { - cir.setReturnValue(rideValue); - } - } - } - - @Override - public HitResult pick(double hitDistance, float partialTicks, boolean hitFluids) { - Entity vehicle = this.getVehicle(); - if (vehicle instanceof PokemonEntity pokemonEntity) { - int seatIndex = pokemonEntity.getPassengers().indexOf(this); - Seat seat = pokemonEntity.getSeats().get(seatIndex); - - PokemonClientDelegate delegate = (PokemonClientDelegate) pokemonEntity.getDelegate(); - MatrixWrapper locator = delegate.getLocatorStates().get(seat.getLocator()); - - if (locator == null) { - super.pick(hitDistance, partialTicks, hitFluids); - } - - Vec3 locatorOffset = new Vec3(locator.getMatrix().getTranslation(new Vector3f())); - - OrientationController controller = this.getOrientationController(); - - float currEyeHeight = this.getEyeHeight(); - Vector3f offset = new Vector3f(new Vector3f(0f, currEyeHeight - (this.getBbHeight() / 2), 0f)); - - if (Minecraft.getInstance().options.getCameraType() == CameraType.FIRST_PERSON) { - PosableModel model = VaryingModelRepository.INSTANCE.getPoser(pokemonEntity.getPokemon().getSpecies().getResourceIdentifier(), new FloatingState()); - offset.add(cobblemon$getFirstPersonOffset(model, seat)); - } - - Matrix3f orientation = controller.isActive() && controller.getOrientation() != null ? controller.getOrientation() : new Matrix3f(); - Vec3 rotatedEyeHeight = new Vec3(orientation.transform(offset)); - - Vec3 eyePosition = locatorOffset.add(pokemonEntity.position()).add(rotatedEyeHeight); - - Vec3 viewVector = this.getViewVector(partialTicks); - Vec3 viewDistanceVector = eyePosition.add(viewVector.x * hitDistance, viewVector.y * hitDistance, viewVector.z * hitDistance); - return this.level() - .clip( - new ClipContext( - eyePosition, viewDistanceVector, ClipContext.Block.OUTLINE, hitFluids ? net.minecraft.world.level.ClipContext.Fluid.ANY : net.minecraft.world.level.ClipContext.Fluid.NONE, this - ) - ); - } - - return super.pick(hitDistance, partialTicks, hitFluids); - } - - @Unique - private static @NotNull Vector3f cobblemon$getFirstPersonOffset(PosableModel model, Seat seat) { - Map cameraOffsets = model.getFirstPersonCameraOffset(); - - if (cameraOffsets.containsKey(seat.getLocator())) { - return cameraOffsets.get(seat.getLocator()).toVector3f(); - } else { - return new Vector3f(0f, 0f, 0f); - } - } -} diff --git a/common/src/main/java/com/cobblemon/mod/common/mixin/client/LocalPlayerMixin.java b/common/src/main/java/com/cobblemon/mod/common/mixin/client/LocalPlayerMixin.java index e1f12ba952..ef48a0c5ad 100644 --- a/common/src/main/java/com/cobblemon/mod/common/mixin/client/LocalPlayerMixin.java +++ b/common/src/main/java/com/cobblemon/mod/common/mixin/client/LocalPlayerMixin.java @@ -10,27 +10,51 @@ package com.cobblemon.mod.common.mixin.client; import com.cobblemon.mod.common.CobblemonNetwork; import com.cobblemon.mod.common.OrientationControllable; +import com.cobblemon.mod.common.api.orientation.OrientationController; +import com.cobblemon.mod.common.api.riding.Seat; +import com.cobblemon.mod.common.client.entity.PokemonClientDelegate; +import com.cobblemon.mod.common.client.render.MatrixWrapper; +import com.cobblemon.mod.common.client.render.models.blockbench.FloatingState; +import com.cobblemon.mod.common.client.render.models.blockbench.PosableModel; +import com.cobblemon.mod.common.client.render.models.blockbench.repository.VaryingModelRepository; import com.cobblemon.mod.common.entity.pokemon.PokemonEntity; import com.cobblemon.mod.common.net.messages.server.orientation.ServerboundUpdateOrientationPacket; +import com.mojang.authlib.GameProfile; +import net.minecraft.client.CameraType; import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.player.AbstractClientPlayer; import net.minecraft.client.player.LocalPlayer; +import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.level.ClipContext; import net.minecraft.world.level.Level; +import net.minecraft.world.phys.HitResult; +import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.NotNull; import org.joml.Matrix3f; +import org.joml.Vector3f; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; 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 java.util.Map; @Mixin(LocalPlayer.class) -public abstract class LocalPlayerMixin extends LivingEntity { +public abstract class LocalPlayerMixin extends AbstractClientPlayer implements OrientationControllable{ @Unique Matrix3f cobblemon$lastOrientation; - protected LocalPlayerMixin(EntityType entityType, Level level) { - super(entityType, level); + @Shadow + private float jumpRidingScale; + + public LocalPlayerMixin(ClientLevel clientLevel, GameProfile gameProfile) { + super(clientLevel, gameProfile); } // @Inject(method = "sendPosition", at = @At("TAIL")) @@ -76,4 +100,73 @@ public abstract class LocalPlayerMixin extends LivingEntity { if (!(this instanceof OrientationControllable controllable)) return; controllable.getOrientationController().setActive(false); } + + @Inject(method = "getJumpRidingScale", at = @At("HEAD"), cancellable = true) + public void modifyJumpRidingScale(CallbackInfoReturnable cir) { + LocalPlayer player = (LocalPlayer) (Object) this; + if (player.isPassenger() && player.getVehicle() instanceof PokemonEntity pokemonEntity) { + var rideValue = pokemonEntity.ifRidingAvailableSupply(null, (behaviour, settings, state) -> { + if (behaviour.canJump(settings, state, pokemonEntity, player)) return null; + return behaviour.setRideBar(settings, state, pokemonEntity, player); + }); + if (rideValue != null) { + cir.setReturnValue(rideValue); + } + } + } + + @Override + public HitResult pick(double hitDistance, float partialTicks, boolean hitFluids) { + Entity vehicle = this.getVehicle(); + if (vehicle instanceof PokemonEntity pokemonEntity) { + int seatIndex = pokemonEntity.getPassengers().indexOf(this); + Seat seat = pokemonEntity.getSeats().get(seatIndex); + + PokemonClientDelegate delegate = (PokemonClientDelegate) pokemonEntity.getDelegate(); + MatrixWrapper locator = delegate.getLocatorStates().get(seat.getLocator()); + + if (locator == null) { + super.pick(hitDistance, partialTicks, hitFluids); + } + + Vec3 locatorOffset = new Vec3(locator.getMatrix().getTranslation(new Vector3f())); + + OrientationController controller = this.getOrientationController(); + + float currEyeHeight = this.getEyeHeight(); + Vector3f offset = new Vector3f(new Vector3f(0f, currEyeHeight - (this.getBbHeight() / 2), 0f)); + + if (Minecraft.getInstance().options.getCameraType() == CameraType.FIRST_PERSON) { + PosableModel model = VaryingModelRepository.INSTANCE.getPoser(pokemonEntity.getPokemon().getSpecies().getResourceIdentifier(), new FloatingState()); + offset.add(cobblemon$getFirstPersonOffset(model, seat)); + } + + Matrix3f orientation = controller.isActive() && controller.getOrientation() != null ? controller.getOrientation() : new Matrix3f(); + Vec3 rotatedEyeHeight = new Vec3(orientation.transform(offset)); + + Vec3 eyePosition = locatorOffset.add(pokemonEntity.position()).add(rotatedEyeHeight); + + Vec3 viewVector = this.getViewVector(partialTicks); + Vec3 viewDistanceVector = eyePosition.add(viewVector.x * hitDistance, viewVector.y * hitDistance, viewVector.z * hitDistance); + return this.level() + .clip( + new ClipContext( + eyePosition, viewDistanceVector, ClipContext.Block.OUTLINE, hitFluids ? net.minecraft.world.level.ClipContext.Fluid.ANY : net.minecraft.world.level.ClipContext.Fluid.NONE, this + ) + ); + } + + return super.pick(hitDistance, partialTicks, hitFluids); + } + + @Unique + private static @NotNull Vector3f cobblemon$getFirstPersonOffset(PosableModel model, Seat seat) { + Map cameraOffsets = model.getFirstPersonCameraOffset(); + + if (cameraOffsets.containsKey(seat.getLocator())) { + return cameraOffsets.get(seat.getLocator()).toVector3f(); + } else { + return new Vector3f(0f, 0f, 0f); + } + } } diff --git a/common/src/main/resources/mixins.cobblemon-common.json b/common/src/main/resources/mixins.cobblemon-common.json index c5afcf9a49..6fcd62413d 100644 --- a/common/src/main/resources/mixins.cobblemon-common.json +++ b/common/src/main/resources/mixins.cobblemon-common.json @@ -54,7 +54,6 @@ "ItemStackComponentizationFixMixin", "LecternBlockMixin", "LivingEntityMixin", - "LocalPlayerMixin", "MinecraftDedicatedServerMixin", "NbtUtilsMixin", "PiglinBarterMixin", @@ -75,7 +74,6 @@ "accessor.BiomeAccessor", "accessor.BoatEntityAccessor", "accessor.ChunkMapAccessor", - "accessor.EntryListWidgetAccessor", "accessor.StatusEffectInstanceAccessor", "accessor.TrackedEntityAccessor", "entity.EntityMixin",