Skip to content

Commit

Permalink
Added fabric create mixins
Browse files Browse the repository at this point in the history
  • Loading branch information
StewStrong committed Oct 16, 2023
1 parent dad25fc commit cb158e8
Show file tree
Hide file tree
Showing 11 changed files with 428 additions and 1 deletion.
20 changes: 20 additions & 0 deletions common/src/main/resources/valkyrienskies-common.mixins.json
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,26 @@
"feature.transform_particles.MixinLevelRenderer",
"feature.transform_particles.MixinParticle",
"feature.vs2_alpha_hud.MixinGui",
"mod_compat.create.client.MixinAABBOutline",
"mod_compat.create.client.MixinBlockClusterOutline",
"mod_compat.create.client.MixinCarriageContraptionInstance",
"mod_compat.create.client.MixinCogwheelBlockItem",
"mod_compat.create.client.MixinCogwheelBlockItemHitOnShaft",
"mod_compat.create.client.MixinContraptionHandlerClient",
"mod_compat.create.client.MixinContraptionRenderDispatcher",
"mod_compat.create.client.MixinContraptionRenderInfo",
"mod_compat.create.client.MixinFilteringRenderer",
"mod_compat.create.client.MixinGhostBlockRenderer",
"mod_compat.create.client.MixinLinkRenderer",
"mod_compat.create.client.MixinMinecartInstance",
"mod_compat.create.client.MixinMultiplePlacementHelpers",
"mod_compat.create.client.MixinOrientedContraptionEntity",
"mod_compat.create.client.MixinOutline",
"mod_compat.create.client.MixinPlacementHelpers",
"mod_compat.create.client.MixinSoundScapes",
"mod_compat.create.client.MixinTileEntityRenderHelper",
"mod_compat.create.client.MixinTrackBlockOutline",
"mod_compat.create.client.MixinTrainRelocator",
"mod_compat.flywheel.InstancingEngineAccessor",
"mod_compat.flywheel.MixinBlockEntityInstanceManager",
"mod_compat.flywheel.MixinInstanceManager",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package org.valkyrienskies.mod.fabric.mixin.compat.create;

import com.simibubi.create.content.kinetics.base.BlockBreakingKineticBlockEntity;
import net.minecraft.core.BlockPos;
import net.minecraft.world.level.ClipContext;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.HitResult;
import net.minecraft.world.phys.Vec3;
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.Redirect;
import org.valkyrienskies.core.api.ships.Ship;
import org.valkyrienskies.mod.common.VSGameUtilsKt;
import org.valkyrienskies.mod.common.util.VectorConversionsMCKt;

@Mixin(BlockBreakingKineticBlockEntity.class)
public abstract class MixinBlockBreakingKineticTileEntity {

@Shadow
protected abstract BlockPos getBreakingPos();

@Redirect(
method = "tick",
at = @At(
value = "INVOKE",
target = "Lcom/simibubi/create/content/kinetics/base/BlockBreakingKineticBlockEntity;getBreakingPos()Lnet/minecraft/core/BlockPos;"
)
)
private BlockPos getBreakingBlockPos(final BlockBreakingKineticBlockEntity self) {
final BlockPos orig = this.getBreakingPos();
final Vec3 origin;
final Vec3 target;
final Ship ship = VSGameUtilsKt.getShipManagingPos(self.getLevel(), self.getBlockPos());

if (ship != null) {
origin = VectorConversionsMCKt.toMinecraft(
ship.getShipToWorld()
.transformPosition(VectorConversionsMCKt.toJOMLD(self.getBlockPos()).add(0.5, 0.5, 0.5))
);
target = VectorConversionsMCKt.toMinecraft(
ship.getShipToWorld().transformPosition(VectorConversionsMCKt.toJOMLD(orig).add(0.5, 0.5, 0.5))
);
} else {
origin = Vec3.atCenterOf(self.getBlockPos());
target = Vec3.atCenterOf(orig);
}

final Vec3 diff = target.subtract(origin);
final BlockHitResult result = self.getLevel().clip(new ClipContext(
origin.add(diff.scale(0.4)),
target.add(diff.scale(0.2)),
ClipContext.Block.COLLIDER,
ClipContext.Fluid.NONE,
null
));

if (result.getType() == HitResult.Type.MISS) {
return orig;
}

return result.getBlockPos();
}

}

Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package org.valkyrienskies.mod.fabric.mixin.compat.create;

import com.simibubi.create.content.kinetics.millstone.MillstoneBlock;
import com.simibubi.create.content.logistics.chute.AbstractChuteBlock;
import com.simibubi.create.content.processing.basin.BasinBlock;
import java.util.Iterator;
import net.minecraft.core.BlockPos;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.phys.Vec3;
import org.joml.Vector3d;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
import org.valkyrienskies.core.api.ships.Ship;
import org.valkyrienskies.mod.common.VSGameUtilsKt;
import org.valkyrienskies.mod.common.util.VectorConversionsMCKt;

@Mixin(value = {
MillstoneBlock.class,
BasinBlock.class,
AbstractChuteBlock.class
})
public class MixinBlocks {

@Redirect(
method = "updateEntityAfterFallOn",
at = @At(
value = "INVOKE",
target = "Lnet/minecraft/world/entity/Entity;blockPosition()Lnet/minecraft/core/BlockPos;"
),
require = 0
)
protected BlockPos redirectBlockPosition(final Entity entity) {
final Iterator<Ship> ships =
VSGameUtilsKt.getShipsIntersecting(entity.level, entity.getBoundingBox()).iterator();
if (ships.hasNext()) {
final Vector3d pos = ships.next().getWorldToShip()
.transformPosition(VectorConversionsMCKt.toJOML(entity.position()));
return new BlockPos(Math.floor(pos.x), Math.floor(pos.y), Math.floor(pos.z));
} else {
return entity.blockPosition();
}
}

@Redirect(
method = "updateEntityAfterFallOn",
at = @At(
value = "INVOKE",
target = "Lnet/minecraft/world/entity/Entity;position()Lnet/minecraft/world/phys/Vec3;"
),
require = 0
)
Vec3 redirectPosition(final Entity entity) {
final Iterator<Ship> ships =
VSGameUtilsKt.getShipsIntersecting(entity.level, entity.getBoundingBox()).iterator();
if (ships.hasNext()) {
return VectorConversionsMCKt.toMinecraft(ships.next().getWorldToShip()
.transformPosition(VectorConversionsMCKt.toJOML(entity.position())));
} else {
return entity.position();
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package org.valkyrienskies.mod.fabric.mixin.compat.create;

import com.simibubi.create.content.contraptions.AbstractContraptionEntity;
import com.simibubi.create.content.contraptions.ControlledContraptionEntity;
import com.simibubi.create.content.contraptions.bearing.BearingContraption;
import com.simibubi.create.content.contraptions.behaviour.MovementContext;
import net.minecraft.core.Direction;
import net.minecraft.core.Vec3i;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.level.Level;
import net.minecraft.world.phys.Vec3;
import org.joml.Math;
import org.objectweb.asm.Opcodes;
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.Redirect;

@Mixin(ControlledContraptionEntity.class)
public abstract class MixinControlledContraptionEntity extends AbstractContraptionEntity {
public MixinControlledContraptionEntity(EntityType<?> entityTypeIn, Level worldIn) {
super(entityTypeIn, worldIn);
}

//Region start - fix actors in the center of a bearing contraption not triggering correctly (vanilla create bug)
@Shadow
protected float angleDelta;

@Redirect(method = "shouldActorTrigger", at = @At(value = "FIELD", opcode = Opcodes.PUTFIELD, target = "Lcom/simibubi/create/content/contraptions/behaviour/MovementContext;motion:Lnet/minecraft/world/phys/Vec3;"))
private void redirectPutMotion(MovementContext instance, Vec3 value) {
BearingContraption bc = (BearingContraption) contraption;
Direction facing = bc.getFacing();
Vec3i dir = facing.getNormal();

double scalar = Math.abs(angleDelta / 360.0) * Math.signum(dir.getX() + dir.getY() + dir.getZ());

instance.motion = new Vec3(Math.abs(dir.getX()), Math.abs(dir.getY()), Math.abs(dir.getZ())).scale(scalar);
}
//Region end
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package org.valkyrienskies.mod.fabric.mixin.compat.create.client;

import com.simibubi.create.content.contraptions.AbstractContraptionEntity;
import com.simibubi.create.content.contraptions.render.ContraptionRenderInfo;
import net.minecraft.client.multiplayer.ClientLevel;
import net.minecraft.world.phys.AABB;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
import org.valkyrienskies.mod.common.VSGameUtilsKt;

@Mixin(ContraptionRenderInfo.class)
public class MixinContraptionRenderInfo {

@Redirect(
at = @At(
value = "INVOKE",
target = "Lcom/simibubi/create/content/contraptions/AbstractContraptionEntity;getBoundingBoxForCulling()Lnet/minecraft/world/phys/AABB;"
),
method = "beginFrame"
)
private AABB redirectGetAABBForCulling(final AbstractContraptionEntity receiver) {
return VSGameUtilsKt.transformRenderAABBToWorld(((ClientLevel) receiver.level), receiver.position(),
receiver.getBoundingBoxForCulling());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package org.valkyrienskies.mod.fabric.mixin.compat.create.client;

import io.github.fabricators_of_create.porting_lib.block.CullingBlockEntityIterator;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.culling.Frustum;
import net.minecraft.world.level.Level;
import net.minecraft.world.phys.AABB;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
import org.valkyrienskies.mod.common.VSGameUtilsKt;

@Mixin(CullingBlockEntityIterator.class)
public abstract class MixinCullingBlockEntityIterator {
@Redirect(method = "nextCulled", at = @At(value = "INVOKE",
target = "Lnet/minecraft/client/renderer/culling/Frustum;isVisible(Lnet/minecraft/world/phys/AABB;)Z")
)
private boolean inject(final Frustum instance, final AABB arg) {
AABB newAABB = arg;
final Level level = Minecraft.getInstance().level;
if (level != null) {
newAABB = VSGameUtilsKt.transformAabbToWorld(level, arg);
}
return instance.isVisible(newAABB);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package org.valkyrienskies.mod.fabric.mixin.compat.create.client;

import com.jozufozu.flywheel.core.virtual.VirtualRenderWorld;
import com.mojang.math.Matrix4f;
import com.simibubi.create.content.contraptions.AbstractContraptionEntity;
import com.simibubi.create.content.contraptions.Contraption;
import com.simibubi.create.content.contraptions.render.ContraptionRenderInfo;
import com.simibubi.create.content.contraptions.render.FlwContraption;
import net.minecraft.util.Mth;
import net.minecraft.world.phys.AABB;
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.Redirect;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.valkyrienskies.core.api.ships.ClientShip;
import org.valkyrienskies.mod.common.VSClientGameUtils;
import org.valkyrienskies.mod.common.VSGameUtilsKt;

@Mixin(FlwContraption.class)
public class MixinFlwContraption extends ContraptionRenderInfo {

public MixinFlwContraption(
final Contraption contraption,
final VirtualRenderWorld renderWorld) {
super(contraption, renderWorld);
}

@Inject(at = @At("HEAD"), method = "setupModelViewPartial", cancellable = true, remap = false)
private static void beforeSetupModelViewPartial(final Matrix4f matrix, final Matrix4f modelMatrix,
final AbstractContraptionEntity entity, final double camX, final double camY, final double camZ, final float pt,
final CallbackInfo ci) {

if (VSGameUtilsKt.getShipManaging(entity) instanceof final ClientShip ship) {
VSClientGameUtils.transformRenderWithShip(ship.getRenderTransform(),
matrix,
Mth.lerp(pt, entity.xOld, entity.getX()),
Mth.lerp(pt, entity.yOld, entity.getY()),
Mth.lerp(pt, entity.zOld, entity.getZ()),
camX,
camY,
camZ
);

matrix.multiply(modelMatrix);
ci.cancel();
}
}

@Redirect(
at = @At(
value = "INVOKE",
target = "Lnet/minecraft/world/phys/AABB;move(DDD)Lnet/minecraft/world/phys/AABB;"
),
method = "beginFrame"
)
private AABB transformLightboxToWorld(final AABB aabb, final double negCamX, final double negCamY,
final double negCamZ) {
return VSGameUtilsKt.transformAabbToWorld(this.contraption.entity.level, aabb).move(negCamX, negCamY, negCamZ);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package org.valkyrienskies.mod.fabric.mixin.compat.create.client;

import com.simibubi.create.foundation.blockEntity.behaviour.scrollValue.ScrollValueBehaviour;
import org.spongepowered.asm.mixin.Mixin;

@Mixin(ScrollValueBehaviour.class)
public class MixinScrollValueBehaviour {

// @Redirect(
// at = @At(
// value = "INVOKE",
// target = "Lnet/minecraft/world/phys/Vec3;subtract(Lnet/minecraft/world/phys/Vec3;)Lnet/minecraft/world/phys/Vec3;"
// ),
// method = "testHit"
// )
// private Vec3 transformHitToShip(final Vec3 hitPos, final Vec3 blockPos) {
// final Vec3 inShipHit = VSGameUtilsKt.toShipRenderCoordinates(Minecraft.getInstance().level, blockPos, hitPos);
// return inShipHit.subtract(blockPos);
// }

}
Loading

0 comments on commit cb158e8

Please sign in to comment.