Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package dev.ryanhcode.sable.mixin.camera.camera_rotation;

import com.llamalad7.mixinextras.injector.ModifyReturnValue;
import dev.ryanhcode.sable.companion.math.JOMLConversion;
import dev.ryanhcode.sable.companion.math.Pose3dc;
import dev.ryanhcode.sable.mixinhelpers.camera.camera_rotation.EntitySubLevelRotationHelper;
Expand All @@ -22,8 +23,8 @@ public abstract class EntityMixin {

@Shadow private Level level;

@Inject(method = "calculateViewVector", at = @At("RETURN"), cancellable = true)
public void sable$calculateViewVector(final float f, final float g, final CallbackInfoReturnable<Vec3> cir) {
@ModifyReturnValue(method = "calculateViewVector", at = @At("RETURN"))
public Vec3 sable$calculateViewVector(final Vec3 viewVector, final float f, final float g) {
final Function<SubLevel, Pose3dc> provider;

if (this.level instanceof final LevelPoseProviderExtension levelPoseProvider) {
Expand All @@ -35,8 +36,9 @@ public abstract class EntityMixin {
final Quaterniond orientation = EntitySubLevelRotationHelper.getEntityOrientation((Entity) (Object) this, provider, 0.0f, EntitySubLevelRotationHelper.Type.CAMERA);

if (orientation != null) {
final Vec3 viewVector = cir.getReturnValue();
cir.setReturnValue(JOMLConversion.toMojang(orientation.transform(JOMLConversion.toJOML(viewVector))));
return JOMLConversion.toMojang(orientation.transform(JOMLConversion.toJOML(viewVector)));
} else {
return viewVector;
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package dev.ryanhcode.sable.mixin.camera.camera_rotation;

import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
import com.llamalad7.mixinextras.sugar.Share;
import com.llamalad7.mixinextras.sugar.ref.LocalRef;
import dev.ryanhcode.sable.mixinhelpers.camera.camera_rotation.EntitySubLevelRotationHelper;
Expand All @@ -9,15 +10,14 @@
import net.minecraft.client.gui.Gui;
import net.minecraft.world.entity.Entity;
import org.joml.Matrix4f;
import org.joml.Matrix4fStack;
import org.joml.Quaterniond;
import org.joml.Quaternionf;
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.Redirect;
import org.spongepowered.asm.mixin.injection.ModifyArg;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

/**
Expand All @@ -38,32 +38,39 @@ public class GuiMixin {
mountedOrientation.set(ridingOrientation);
}

@Redirect(method = "renderCrosshair", at = @At(value = "INVOKE", target = "Lorg/joml/Matrix4fStack;rotateX(F)Lorg/joml/Matrix4f;"))
private Matrix4f sable$redirectRotateX(final Matrix4fStack stack, final float angle, @Share("mountedOrientation") final LocalRef<Quaterniond> mountedOrientation) {
@ModifyArg(method = "renderCrosshair", at = @At(value = "INVOKE", target = "Lorg/joml/Matrix4fStack;rotateX(F)Lorg/joml/Matrix4f;"), index = 0)
private float sable$modifyRotateXAngle(final float angle, @Share("mountedOrientation") final LocalRef<Quaterniond> mountedOrientation) {
if (mountedOrientation.get() != null) {
final float pt = this.minecraft.getTimer().getGameTimeDeltaPartialTick(true);
final Camera camera = this.minecraft.gameRenderer.getMainCamera();
final Entity entity = camera.getEntity();

return stack.rotateX(-entity.getViewXRot(pt) * (float) (Math.PI / 180.0));
return -entity.getViewXRot(pt) * (float) (Math.PI / 180.0);
}

return stack.rotateX(angle);
return angle;
}

@Redirect(method = "renderCrosshair", at = @At(value = "INVOKE", target = "Lorg/joml/Matrix4fStack;rotateY(F)Lorg/joml/Matrix4f;"))
private Matrix4f sable$redirectRotateY(final Matrix4fStack stack, final float angle, @Share("mountedOrientation") final LocalRef<Quaterniond> mountedOrientation) {
@ModifyArg(method = "renderCrosshair", at = @At(value = "INVOKE", target = "Lorg/joml/Matrix4fStack;rotateY(F)Lorg/joml/Matrix4f;"), index = 0)
private float sable$modifyRotateYAngle(final float angle, @Share("mountedOrientation") final LocalRef<Quaterniond> mountedOrientation) {
if (mountedOrientation.get() != null) {
final float pt = this.minecraft.getTimer().getGameTimeDeltaPartialTick(true);
final Camera camera = this.minecraft.gameRenderer.getMainCamera();
final Entity entity = camera.getEntity();

stack.rotateY(entity.getViewYRot(pt) * (float) (Math.PI / 180.0));
return entity.getViewYRot(pt) * (float) (Math.PI / 180.0);
}

return angle;
}

return stack.rotate(new Quaternionf(mountedOrientation.get()).conjugate());
@ModifyExpressionValue(method = "renderCrosshair", at = @At(value = "INVOKE", target = "Lorg/joml/Matrix4fStack;rotateY(F)Lorg/joml/Matrix4f;"))
private Matrix4f sable$modifyRotateY(final Matrix4f original, @Share("mountedOrientation") final LocalRef<Quaterniond> mountedOrientation) {
if (mountedOrientation.get() != null) {
return original.rotate(new Quaternionf(mountedOrientation.get()).conjugate());
}

return stack.rotateY(angle);
return original;
}

}
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package dev.ryanhcode.sable.mixin.camera.camera_zoom;

import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
import com.llamalad7.mixinextras.injector.v2.WrapWithCondition;
import dev.ryanhcode.sable.SableClientConfig;
import dev.ryanhcode.sable.mixinhelpers.camera.new_camera_types.SableCameraTypes;
import dev.ryanhcode.sable.mixinterface.camera.camera_zoom.CameraZoomExtension;
Expand All @@ -19,16 +18,16 @@ public class MouseHandlerMixin {

@Shadow @Final private Minecraft minecraft;

@WrapOperation(method = "onScroll", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Inventory;swapPaint(D)V"))
private void sable$onScroll(final Inventory instance, final double d, final Operation<Void> original) {
@WrapWithCondition(method = "onScroll", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Inventory;swapPaint(D)V"))
private boolean sable$onScroll(final Inventory instance, final double d) {
final CameraType cameraType = this.minecraft.options.getCameraType();
if (cameraType == SableCameraTypes.SUB_LEVEL_VIEW || cameraType == SableCameraTypes.SUB_LEVEL_VIEW_UNLOCKED) {
final CameraZoomExtension extension = ((CameraZoomExtension) this.minecraft.gameRenderer.getMainCamera());

extension.sable$setZoomAmount((float) (extension.sable$getZoomAmount() - d * SableClientConfig.ZOOM_SENSITIVITY.get()));
return;
return false;
}

original.call(instance, d);
return true;
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
package dev.ryanhcode.sable.mixin.clip_overwrite;

import com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod;
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import dev.ryanhcode.sable.ActiveSableCompanion;
import dev.ryanhcode.sable.Sable;
import dev.ryanhcode.sable.api.SubLevelHelper;
import dev.ryanhcode.sable.companion.math.BoundingBox3d;
import dev.ryanhcode.sable.companion.math.JOMLConversion;
import dev.ryanhcode.sable.companion.math.Pose3dc;
Expand All @@ -15,42 +16,30 @@
import net.minecraft.world.level.ClipContext;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.material.FluidState;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.HitResult;
import net.minecraft.world.phys.Vec3;
import net.minecraft.world.phys.shapes.VoxelShape;
import org.jetbrains.annotations.NotNull;
import org.joml.Vector3dc;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Overwrite;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique;

import java.util.function.Predicate;

/**
* Overwrites raycasts to take sublevels into account
*
* TODO: The priority is currently higher simply to take priority over lithium, but usage of Lithium's raycast replacement alongside our sub-level stuff would be far nicer.
*/
@Mixin(value = BlockGetter.class, priority = 1100)
@Mixin(BlockGetter.class)
public interface BlockGetterMixin {

@Shadow
BlockState getBlockState(BlockPos blockPos);

/**
* @author RyanH
* @reason Overwrites raycasts to take sublevels into account
*/
@Overwrite
default BlockHitResult clip(ClipContext clipContext) {
final BlockGetter self = (BlockGetter) this;

// order to make sure this is the innermost wrap
@WrapMethod(method = "clip")
default BlockHitResult sable$wrapClip(ClipContext clipContext, final Operation<BlockHitResult> original) {
if (!(this instanceof final Level level) || (clipContext instanceof final ClipContextExtension extension && extension.sable$doNotProject())) {
// If the level cannot have sublevels, use the original method
return originalClip(self, clipContext);
return original.call(clipContext);
}

final SubLevel ignoredSubLevel = clipContext instanceof final ClipContextExtension extension ?
Expand Down Expand Up @@ -93,7 +82,7 @@ default BlockHitResult clip(ClipContext clipContext) {
final Vec3 diff = clipContext.getFrom().subtract(clipContext.getTo());
minResult = BlockHitResult.miss(clipContext.getTo(), Direction.getNearest(diff.x, diff.y, diff.z), BlockPos.containing(clipContext.getTo()));
} else {
minResult = originalClip(self, clipContext);
minResult = original.call(clipContext);
minDistance = minResult.getLocation().distanceTo(clipContext.getFrom());
}

Expand Down Expand Up @@ -121,7 +110,8 @@ default BlockHitResult clip(ClipContext clipContext) {


final ClipContext subClipContext = new ClipContext(JOMLConversion.toMojang(from), JOMLConversion.toMojang(to), clipContext.block, clipContext.fluid, clipContext.collisionContext);
final BlockHitResult subResult = originalClip(subLevel.getLevel(), subClipContext);
((ClipContextExtension) subClipContext).sable$setDoNotProject(true);
final BlockHitResult subResult = subLevel.getLevel().clip(subClipContext);
final double distance = subResult.getLocation().distanceTo(subClipContext.getFrom());

if ((distance < minDistance || minResult.getType() == HitResult.Type.MISS) && subResult.getType() != HitResult.Type.MISS) {
Expand All @@ -132,26 +122,4 @@ default BlockHitResult clip(ClipContext clipContext) {

return minResult;
}

@Unique
private static @NotNull BlockHitResult originalClip(final BlockGetter level, final ClipContext clipContext) {
return BlockGetter.traverseBlocks(clipContext.getFrom(), clipContext.getTo(), clipContext, (clipContextx, blockPos) -> {
final BlockState blockState = level.getBlockState(blockPos);
final FluidState fluidState = level.getFluidState(blockPos);
final Vec3 vec3 = clipContextx.getFrom();
final Vec3 vec32 = clipContextx.getTo();
final VoxelShape voxelShape = clipContextx.getBlockShape(blockState, level, blockPos);
final BlockHitResult blockHitResult = level.clipWithInteractionOverride(vec3, vec32, blockPos, voxelShape, blockState);
final VoxelShape voxelShape2 = clipContextx.getFluidShape(fluidState, level, blockPos);
final BlockHitResult blockHitResult2 = voxelShape2.clip(vec3, vec32, blockPos);
final double d = blockHitResult == null ? Double.MAX_VALUE : clipContextx.getFrom().distanceToSqr(blockHitResult.getLocation());
final double e = blockHitResult2 == null ? Double.MAX_VALUE : clipContextx.getFrom().distanceToSqr(blockHitResult2.getLocation());
return d <= e ? blockHitResult : blockHitResult2;
}, clipContextx -> {
final Vec3 vec3 = clipContextx.getFrom().subtract(clipContextx.getTo());
return BlockHitResult.miss(clipContextx.getTo(), Direction.getNearest(vec3.x, vec3.y, vec3.z), BlockPos.containing(clipContextx.getTo()));
});
}


}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package dev.ryanhcode.sable.mixin.command;

import com.google.common.collect.ImmutableList;
import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
import dev.ryanhcode.sable.command.data_accessor.SubLevelDataAccessor;
Expand All @@ -14,13 +15,11 @@
@Mixin(DataCommands.class)
public class DataCommandsMixin {

@WrapOperation(method = "<clinit>", at = @At(value = "INVOKE", target = "Lcom/google/common/collect/ImmutableList;of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Lcom/google/common/collect/ImmutableList;", remap = false))
private static <E> ImmutableList<Function<String, DataCommands.DataProvider>> sable$allProviders(final E e1, final E e2, final E e3, final Operation<ImmutableList<Function<String, DataCommands.DataProvider>>> original) {
@SuppressWarnings("unchecked")
final ImmutableList<Function<String, DataCommands.DataProvider>> providers = (ImmutableList<Function<String, DataCommands.DataProvider>>) ((Operation) original).call(e1, e2, e3);
@ModifyExpressionValue(method = "<clinit>", at = @At(value = "INVOKE", target = "Lcom/google/common/collect/ImmutableList;of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Lcom/google/common/collect/ImmutableList;", remap = false))
private static ImmutableList<Function<String, DataCommands.DataProvider>> sable$allProviders(final ImmutableList<Function<String, DataCommands.DataProvider>> providers) {
final ObjectArrayList<Function<String, DataCommands.DataProvider>> mutableList = new ObjectArrayList<>(providers);
mutableList.add(SubLevelDataAccessor.PROVIDER);

return ImmutableList.copyOf(mutableList);
return ImmutableList.copyOf(mutableList);
}
}
Original file line number Diff line number Diff line change
@@ -1,17 +1,15 @@
package dev.ryanhcode.sable.mixin.command;

import com.google.common.collect.Lists;
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
import com.llamalad7.mixinextras.sugar.Local;
import com.mojang.brigadier.builder.ArgumentBuilder;
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import com.mojang.brigadier.tree.LiteralCommandNode;
import dev.ryanhcode.sable.api.command.SableCommandHelper;
import dev.ryanhcode.sable.api.command.SubLevelArgumentType;
import dev.ryanhcode.sable.companion.math.Pose3d;
import dev.ryanhcode.sable.api.sublevel.ServerSubLevelContainer;
import dev.ryanhcode.sable.api.sublevel.SubLevelContainer;
import dev.ryanhcode.sable.companion.math.Pose3d;
import dev.ryanhcode.sable.sublevel.SubLevel;
import dev.ryanhcode.sable.sublevel.plot.LevelPlot;
import net.minecraft.commands.CommandSourceStack;
Expand All @@ -34,9 +32,9 @@ public class ExecuteCommandMixin {
* TODO: Better injection target here would be nice. And to split these out of the mixins.
*/
@SuppressWarnings("unchecked")
@WrapOperation(method = "register", at = @At(value = "INVOKE", target = "Lcom/mojang/brigadier/builder/LiteralArgumentBuilder;then(Lcom/mojang/brigadier/builder/ArgumentBuilder;)Lcom/mojang/brigadier/builder/ArgumentBuilder;", ordinal = 31, remap = false))
private static ArgumentBuilder sable$then(final LiteralArgumentBuilder instance, final ArgumentBuilder argumentBuilder, final Operation<ArgumentBuilder> original, @Local final LiteralCommandNode<CommandSourceStack> literalCommandNode) {
return instance.then(argumentBuilder)
@ModifyExpressionValue(method = "register", at = @At(value = "INVOKE", target = "Lcom/mojang/brigadier/builder/LiteralArgumentBuilder;then(Lcom/mojang/brigadier/builder/ArgumentBuilder;)Lcom/mojang/brigadier/builder/ArgumentBuilder;", ordinal = 31, remap = false))
private static ArgumentBuilder sable$then(final ArgumentBuilder original, @Local final LiteralCommandNode<CommandSourceStack> literalCommandNode) {
return original
.then(
Commands.literal("in_sub_level")
.then(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,39 +1,39 @@
package dev.ryanhcode.sable.mixin.enchanting_table;

import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
import com.llamalad7.mixinextras.sugar.Local;
import dev.ryanhcode.sable.Sable;
import dev.ryanhcode.sable.api.SubLevelHelper;
import dev.ryanhcode.sable.sublevel.SubLevel;
import net.minecraft.core.BlockPos;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.block.entity.EnchantingTableBlockEntity;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;

@Mixin(EnchantingTableBlockEntity.class)
public class EnchantingTableBlockEntityMixin {

@Redirect(method = "bookAnimationTick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Player;getX()D"))
private static double sable$getPlayerX(final Player instance, @Local(argsOnly = true) final BlockPos blockPos) {
@WrapOperation(method = "bookAnimationTick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Player;getX()D"))
private static double sable$getPlayerX(final Player instance, final Operation<Double> original, @Local(argsOnly = true) final BlockPos blockPos) {
final SubLevel subLevel = Sable.HELPER.getContaining(instance.level(), blockPos);

if (subLevel != null) {
return subLevel.logicalPose().transformPositionInverse(instance.getEyePosition()).x();
}

return instance.getX();
return original.call(instance);
}

@Redirect(method = "bookAnimationTick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Player;getZ()D"))
private static double sable$getPlayerZ(final Player instance, @Local(argsOnly = true) final BlockPos blockPos) {
@WrapOperation(method = "bookAnimationTick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Player;getZ()D"))
private static double sable$getPlayerZ(final Player instance, final Operation<Double> original, @Local(argsOnly = true) final BlockPos blockPos) {
final SubLevel subLevel = Sable.HELPER.getContaining(instance.level(), blockPos);

if (subLevel != null) {
return subLevel.logicalPose().transformPositionInverse(instance.getEyePosition()).z();
}

return instance.getZ();
return original.call(instance);
}

}
Loading