Skip to content

Commit

Permalink
Merged changes from 1.18.x
Browse files Browse the repository at this point in the history
  • Loading branch information
StewStrong committed Dec 25, 2023
2 parents 39b8d01 + c877334 commit cc6e5f8
Show file tree
Hide file tree
Showing 12 changed files with 114 additions and 103 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
import org.valkyrienskies.core.apigame.world.ClientShipWorldCore;
import org.valkyrienskies.mod.client.IVSCamera;
import org.valkyrienskies.mod.common.IShipObjectWorldClientProvider;
import org.valkyrienskies.mod.common.entity.ShipMountedToData;
import org.valkyrienskies.mod.common.VSGameUtilsKt;
import org.valkyrienskies.mod.common.util.EntityDraggingInformation;
import org.valkyrienskies.mod.common.util.IEntityDraggingInformationProvider;
Expand Down Expand Up @@ -134,14 +135,13 @@ private void preRender(final float tickDelta, final long startTime, final boolea
// This is set when an entity is mounted to a ship, or an entity is being dragged by a ship
Vector3dc entityShouldBeHere = null;

// First, try getting [entityShouldBeHere] from [shipMountedTo]
final ClientShip shipMountedTo =
VSGameUtilsKt.getShipObjectEntityMountedTo(clientWorld, entity);
// First, try getting the ship the entity is mounted to, if one exists
final ShipMountedToData shipMountedToData = VSGameUtilsKt.getShipMountedToData(entity, tickDelta);

if (shipMountedTo != null) {
if (shipMountedToData != null) {
final ClientShip shipMountedTo = (ClientShip) shipMountedToData.getShipMountedTo();
// If the entity is mounted to a ship then update their position
final Vector3dc passengerPos =
VSGameUtilsKt.getPassengerPos(entity.getVehicle(), entity.getMyRidingOffset(), tickDelta);
final Vector3dc passengerPos = shipMountedToData.getMountPosInShip();
entityShouldBeHere = shipMountedTo.getRenderTransform().getShipToWorld()
.transformPosition(passengerPos, new Vector3d());
entity.setPos(entityShouldBeHere.x(), entityShouldBeHere.y(), entityShouldBeHere.z());
Expand Down Expand Up @@ -248,41 +248,43 @@ private void setupCameraWithMountedShip(final LevelRenderer instance, final Pose
prepareCullFrustum.call(instance, matrixStack, vec3, matrix4f);
return;
}
final ClientShip playerShipMountedTo =
VSGameUtilsKt.getShipObjectEntityMountedTo(clientLevel, player);
if (playerShipMountedTo == null) {

final ShipMountedToData shipMountedToData = VSGameUtilsKt.getShipMountedToData(player, partialTicks);
if (shipMountedToData == null) {
prepareCullFrustum.call(instance, matrixStack, vec3, matrix4f);
return;
}

final Entity playerVehicle = player.getVehicle();
if (playerVehicle == null) {
prepareCullFrustum.call(instance, matrixStack, vec3, matrix4f);
return;
}

// Update [matrixStack] to mount the camera to the ship
final Vector3dc inShipPos =
VSGameUtilsKt.getPassengerPos(playerVehicle, player.getMyRidingOffset(), partialTicks);

final Camera camera = this.mainCamera;
if (camera == null) {
prepareCullFrustum.call(instance, matrixStack, vec3, matrix4f);
return;
}

final ClientShip clientShip = (ClientShip) shipMountedToData.getShipMountedTo();

((IVSCamera) camera).setupWithShipMounted(
this.minecraft.level,
this.minecraft.getCameraEntity() == null ? this.minecraft.player : this.minecraft.getCameraEntity(),
!this.minecraft.options.getCameraType().isFirstPerson(),
this.minecraft.options.getCameraType().isMirrored(),
partialTicks,
playerShipMountedTo,
inShipPos
clientShip,
shipMountedToData.getMountPosInShip()
);

// Apply the ship render transform to [matrixStack]
final Quaternion invShipRenderRotation = VectorConversionsMCKt.toMinecraft(
playerShipMountedTo.getRenderTransform().getShipToWorldRotation().conjugate(new Quaterniond()));
clientShip.getRenderTransform().getShipToWorldRotation().conjugate(new Quaterniond())
);
matrixStack.mulPose(invShipRenderRotation);

// We also need to recompute [inverseViewRotationMatrix] after updating [matrixStack]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.Vec3;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.joml.Vector3d;
import org.joml.Vector3dc;
import org.joml.primitives.AABBd;
Expand All @@ -33,6 +32,7 @@
import org.valkyrienskies.core.api.ships.Ship;
import org.valkyrienskies.core.api.ships.properties.ShipTransform;
import org.valkyrienskies.core.impl.game.ships.ShipObjectClient;
import org.valkyrienskies.mod.common.entity.ShipMountedToData;
import org.valkyrienskies.mod.common.VSGameUtilsKt;
import org.valkyrienskies.mod.common.util.EntityDraggingInformation;
import org.valkyrienskies.mod.common.util.IEntityDraggingInformationProvider;
Expand Down Expand Up @@ -105,11 +105,11 @@ private void originalCheckInside(final AABBd aABB) {
*/
@Inject(method = "getEyePosition(F)Lnet/minecraft/world/phys/Vec3;", at = @At("HEAD"), cancellable = true)
private void preGetEyePosition(final float partialTicks, final CallbackInfoReturnable<Vec3> cir) {
final LoadedShip shipMountedTo =
VSGameUtilsKt.getShipObjectEntityMountedTo(level, Entity.class.cast(this));
if (shipMountedTo == null) {
final ShipMountedToData shipMountedToData = VSGameUtilsKt.getShipMountedToData(Entity.class.cast(this), partialTicks);
if (shipMountedToData == null) {
return;
}
final LoadedShip shipMountedTo = shipMountedToData.getShipMountedTo();

final ShipTransform shipTransform;
if (shipMountedTo instanceof ShipObjectClient) {
Expand All @@ -118,24 +118,20 @@ private void preGetEyePosition(final float partialTicks, final CallbackInfoRetur
shipTransform = shipMountedTo.getShipTransform();
}
final Vector3dc basePos = shipTransform.getShipToWorldMatrix()
.transformPosition(VSGameUtilsKt.getPassengerPos(this.vehicle, getMyRidingOffset(), partialTicks),
new Vector3d());
.transformPosition(shipMountedToData.getMountPosInShip(), new Vector3d());
final Vector3dc eyeRelativePos = shipTransform.getShipCoordinatesToWorldCoordinatesRotation().transform(
new Vector3d(0.0, getEyeHeight(), 0.0)
);
final Vec3 newEyePos = VectorConversionsMCKt.toMinecraft(basePos.add(eyeRelativePos, new Vector3d()));
cir.setReturnValue(newEyePos);
}

@Shadow
private Vec3 position;

/**
* @reason Needed for players to pick blocks correctly when mounted to a ship
*/
@Inject(method = "calculateViewVector", at = @At("HEAD"), cancellable = true)
private void preCalculateViewVector(final float xRot, final float yRot, final CallbackInfoReturnable<Vec3> cir) {
final LoadedShip shipMountedTo = VSGameUtilsKt.getShipObjectEntityMountedTo(level, Entity.class.cast(this));
final LoadedShip shipMountedTo = VSGameUtilsKt.getShipMountedTo(Entity.class.cast(this));
if (shipMountedTo == null) {
return;
}
Expand Down Expand Up @@ -180,9 +176,6 @@ private void preCalculateViewVector(final float xRot, final float yRot, final Ca
@Shadow
public abstract double getX();

@Shadow
private @Nullable Entity vehicle;

@Shadow
public abstract float getEyeHeight();

Expand All @@ -191,9 +184,6 @@ private void preCalculateViewVector(final float xRot, final float yRot, final Ca
@Shadow
public abstract EntityType<?> getType();

@Shadow
public abstract double getMyRidingOffset();

@Override
@NotNull
public EntityDraggingInformation getDraggingInformation() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,19 @@
import net.minecraft.client.renderer.entity.EntityRenderer;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3;
import org.joml.Vector3d;
import org.joml.Vector3dc;
import org.joml.primitives.AABBd;
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;
import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
import org.valkyrienskies.core.api.ships.ClientShip;
import org.valkyrienskies.core.api.ships.properties.ShipTransform;
import org.valkyrienskies.mod.common.VSGameUtilsKt;
import org.valkyrienskies.mod.common.entity.ShipMountedToData;
import org.valkyrienskies.mod.common.entity.handling.VSEntityManager;
import org.valkyrienskies.mod.common.util.VectorConversionsMCKt;

Expand All @@ -32,27 +37,53 @@ <T extends Entity> void render(
final T entity, final double x, final double y, final double z, final float rotationYaw,
final float partialTicks, final PoseStack matrixStack,
final MultiBufferSource buffer, final int packedLight, final CallbackInfo ci,
final EntityRenderer<T> entityRenderer) {
final EntityRenderer<T> entityRenderer
) {
final ShipMountedToData shipMountedToData = VSGameUtilsKt.getShipMountedToData(entity, partialTicks);

final ClientShip ship =
(ClientShip) VSGameUtilsKt.getShipObjectManagingPos(entity.level, entity.blockPosition());
if (ship != null) {
if (shipMountedToData != null) {
// Remove the earlier applied translation
matrixStack.popPose();
matrixStack.pushPose();

VSEntityManager.INSTANCE.getHandler(entity)
.applyRenderTransform(ship, entity, entityRenderer, x, y, z,
rotationYaw, partialTicks, matrixStack,
buffer, packedLight);
} else if (entity.isPassenger()) {
final ClientShip vehicleShip =
(ClientShip) VSGameUtilsKt.getShipObjectManagingPos(entity.level,
entity.getVehicle().blockPosition());
// If the entity is a passenger and that vehicle is in ship space
if (vehicleShip != null) {
VSEntityManager.INSTANCE.getHandler(entity.getVehicle())
.applyRenderOnMountedEntity(vehicleShip, entity.getVehicle(), entity, partialTicks, matrixStack);
final ShipTransform renderTransform = ((ClientShip) shipMountedToData.getShipMountedTo()).getRenderTransform();

final Vec3 entityPosition = entity.getPosition(partialTicks);
final Vector3dc transformed = renderTransform.getShipToWorld().transformPosition(shipMountedToData.getMountPosInShip(), new Vector3d());

final double camX = x - entityPosition.x;
final double camY = y - entityPosition.y;
final double camZ = z - entityPosition.z;

final Vec3 offset = entityRenderer.getRenderOffset(entity, partialTicks);
final Vector3dc scale = renderTransform.getShipToWorldScaling();

matrixStack.translate(transformed.x() + camX, transformed.y() + camY, transformed.z() + camZ);
matrixStack.mulPose(VectorConversionsMCKt.toMinecraft(renderTransform.getShipToWorldRotation()));
matrixStack.scale((float) scale.x(), (float) scale.y(), (float) scale.z());
matrixStack.translate(offset.x, offset.y, offset.z);
} else {
final ClientShip ship =
(ClientShip) VSGameUtilsKt.getShipObjectManagingPos(entity.level, entity.blockPosition());
if (ship != null) {
// Remove the earlier applied translation
matrixStack.popPose();
matrixStack.pushPose();

VSEntityManager.INSTANCE.getHandler(entity)
.applyRenderTransform(ship, entity, entityRenderer, x, y, z,
rotationYaw, partialTicks, matrixStack,
buffer, packedLight);
} else if (entity.isPassenger()) {
final ClientShip vehicleShip =
(ClientShip) VSGameUtilsKt.getShipObjectManagingPos(entity.level,
entity.getVehicle().blockPosition());
// If the entity is a passenger and that vehicle is in ship space
if (vehicleShip != null) {
VSEntityManager.INSTANCE.getHandler(entity.getVehicle())
.applyRenderOnMountedEntity(vehicleShip, entity.getVehicle(), entity, partialTicks,
matrixStack);
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ private void injectListenerVelocity(final Listener listener, final Vec3 position
((HasOpenALVelocity) listener).setVelocity(new Vector3d());

if (level != null && player != null) {
final ClientShip mounted = VSGameUtilsKt.getShipObjectEntityMountedTo(level, player);
final ClientShip mounted = (ClientShip) VSGameUtilsKt.getShipMountedTo(player);
if (mounted != null) {
((HasOpenALVelocity) listener).setVelocity(mounted.getVelocity());
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
import com.simibubi.create.content.contraptions.OrientedContraptionEntity;
import com.simibubi.create.content.contraptions.StructureTransform;
import com.simibubi.create.content.contraptions.actors.harvester.HarvesterMovementBehaviour;
import com.simibubi.create.content.contraptions.actors.seat.SeatEntity;
import com.simibubi.create.content.contraptions.behaviour.MovementBehaviour;
import com.simibubi.create.content.contraptions.behaviour.MovementContext;
import com.simibubi.create.content.kinetics.base.BlockBreakingMovementBehaviour;
Expand Down Expand Up @@ -112,25 +111,6 @@ private void redirectTeleportTo(Entity instance, double x, double y, double z) {
}
}

//Region end
//Region start - fix entity rider position on ship contraptions
@Override
public void positionRider(@NotNull Entity passenger) {
if (!hasPassenger(passenger))
return;
Vec3 riderPos = getPassengerPosition(passenger, 1);
if (riderPos == null)
return;
if (!(passenger instanceof OrientedContraptionEntity)) {
Ship ship = VSGameUtilsKt.getShipManagingPos(passenger.level, riderPos.x, riderPos.y, riderPos.z);
riderPos.add(0, SeatEntity.getCustomEntitySeatOffset(passenger) - 1 / 8f, 0);
if (ship != null) {
riderPos = toMinecraft(ship.getShipToWorld().transformPosition(toJOML(riderPos)));
}
}
passenger.setPos(riderPos);
}

@Inject(method = "toGlobalVector(Lnet/minecraft/world/phys/Vec3;FZ)Lnet/minecraft/world/phys/Vec3;",
at = @At("HEAD"), cancellable = true)
private void redirectToGlobalVector(Vec3 localVec, final float partialTicks, final boolean prevAnchor, final CallbackInfoReturnable<Vec3> cir) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ private boolean needsFrustumUpdate(final boolean needsFrustumUpdate) {

// force frustum update if default behaviour says to OR if the player is mounted to a ship
return needsFrustumUpdate ||
(player != null && VSGameUtilsKt.getShipObjectEntityMountedTo(level, player) != null);
(player != null && VSGameUtilsKt.getShipMountedTo(player) != null);
}

/**
Expand Down
29 changes: 16 additions & 13 deletions common/src/main/kotlin/org/valkyrienskies/mod/common/VSGameUtils.kt
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ import org.valkyrienskies.core.apigame.world.properties.DimensionId
import org.valkyrienskies.core.game.ships.ShipObjectServer
import org.valkyrienskies.core.impl.hooks.VSEvents.TickEndEvent
import org.valkyrienskies.core.util.expand
import org.valkyrienskies.mod.common.entity.ShipMountedToData
import org.valkyrienskies.mod.common.entity.ShipMountedToDataProvider
import org.valkyrienskies.mod.common.util.DimensionIdProvider
import org.valkyrienskies.mod.common.util.MinecraftPlayer
import org.valkyrienskies.mod.common.util.set
Expand Down Expand Up @@ -242,11 +244,6 @@ fun Level?.getShipObjectManagingPos(posX: Double, posY: Double, posZ: Double) =
fun Level?.getShipObjectManagingPos(chunkPos: ChunkPos) =
getShipObjectManagingPos(chunkPos.x, chunkPos.z)

fun Level.getShipObjectEntityMountedTo(entity: Entity): LoadedShip? {
val vehicle = entity.vehicle ?: return null
return getShipObjectManagingPos(vehicle.position().toJOML())
}

// ClientLevel
fun ClientLevel?.getShipObjectManagingPos(chunkX: Int, chunkZ: Int) =
getShipObjectManagingPosImpl(this, chunkX, chunkZ) as ClientShip?
Expand All @@ -266,11 +263,6 @@ fun ClientLevel?.getShipObjectManagingPos(pos: Position) =
fun ClientLevel?.getShipObjectManagingPos(chunkPos: ChunkPos) =
getShipObjectManagingPos(chunkPos.x, chunkPos.z)

fun ClientLevel?.getShipObjectEntityMountedTo(entity: Entity): ClientShip? {
val vehicle = entity.vehicle ?: return null
return getShipObjectManagingPos(vehicle.position().toJOML())
}

// ServerWorld
fun ServerLevel?.getShipObjectManagingPos(chunkX: Int, chunkZ: Int) =
getShipObjectManagingPosImpl(this, chunkX, chunkZ) as ShipObjectServer?
Expand Down Expand Up @@ -417,7 +409,18 @@ fun Level.transformAabbToWorld(aabb: AABBdc, dest: AABBd): AABBd {
return dest.set(aabb)
}

fun Entity.getPassengerPos(myRidingOffset: Double, partialTicks: Float): Vector3dc {
return this.getPosition(partialTicks)
.add(0.0, this.passengersRidingOffset + myRidingOffset, 0.0).toJOML()
fun getShipMountedToData(passenger: Entity, partialTicks: Float? = null): ShipMountedToData? {
val vehicle = passenger.vehicle ?: return null
if (vehicle is ShipMountedToDataProvider) {
return vehicle.provideShipMountedToData(passenger, partialTicks)
}
val shipObjectEntityMountedTo = passenger.level.getShipObjectManagingPos(vehicle.position().toJOML()) ?: return null
val mountedPosInShip: Vector3dc = vehicle.getPosition(partialTicks ?: 0.0f)
.add(0.0, vehicle.passengersRidingOffset + passenger.myRidingOffset, 0.0).toJOML()

return ShipMountedToData(shipObjectEntityMountedTo, mountedPosInShip)
}

fun getShipMountedTo(entity: Entity): LoadedShip? {
return getShipMountedToData(entity)?.shipMountedTo
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package org.valkyrienskies.mod.common.entity

import org.joml.Vector3dc
import org.valkyrienskies.core.api.ships.LoadedShip

data class ShipMountedToData(
val shipMountedTo: LoadedShip,
val mountPosInShip: Vector3dc,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package org.valkyrienskies.mod.common.entity

import net.minecraft.world.entity.Entity

interface ShipMountedToDataProvider {
fun provideShipMountedToData(passenger: Entity, partialTicks: Float?): ShipMountedToData?
}
Loading

0 comments on commit cc6e5f8

Please sign in to comment.