Skip to content

Commit

Permalink
Merge branch '1.20.1/main' into 1.20.1/twilightforest-compat
Browse files Browse the repository at this point in the history
  • Loading branch information
StewStrong authored Sep 27, 2024
2 parents 9da3937 + edf7675 commit e86939a
Show file tree
Hide file tree
Showing 73 changed files with 3,739 additions and 871 deletions.
6 changes: 0 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,6 @@ You can download official releases of Valkyrien Skies from our [website](https:/

## Development

Valkyrien Skies 2 source code is split between the code in this repository, and
the code in [vs-core](https://github.com/ValkyrienSkies/vs-core).

The Minecraft version dependent code lives in this repository, and the version
independent code lives in [vs-core](https://github.com/ValkyrienSkies/vs-core).

### IntelliJ

1. Clone the
Expand Down
11 changes: 11 additions & 0 deletions common/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,13 @@ dependencies {
modCompileOnly("curse.maven:ftb-teams-404468:4229138")
modCompileOnly("curse.maven:ftb-chunks-314906:4229120")

// EMF compat
modCompileOnly("curse.maven:entity-model-features-844662:5696901")
modCompileOnly("curse.maven:entity-texture-features-fabric-568563:5697084")

// Weather2 1.20.1
modCompileOnly("curse.maven:weather-storms-tornadoes-237746:5244118")

//Common create compat,
//We just use a version from a platform and hope the classes exist on both versions and mixins apply correctly
modCompileOnly("com.simibubi.create:create-fabric-${minecraft_version}:${create_fabric_version}")
Expand All @@ -36,6 +43,10 @@ dependencies {

modCompileOnly("maven.modrinth:create-utilities:${create_utilities_version}")
modImplementation("teamreborn:energy:${energy_version}")
// modCompileOnly("io.github.fabricators_of_create:Porting-Lib:${port_lib_version}+${minecraft_version}")

//Bluemap fabric 1.20.1
modCompileOnly("curse.maven:bluemap-406463:5555756")
}

architectury {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,50 +1,37 @@
package org.valkyrienskies.mod.mixin.feature.block_placement_orientation;

import net.minecraft.world.InteractionResult;
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.context.BlockPlaceContext;
import net.minecraft.world.level.block.state.BlockState;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.At.Shift;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
import org.valkyrienskies.mod.common.PlayerUtil;

@Mixin(BlockItem.class)
public abstract class MixinBlockItem {

@Inject(
at = @At(
value = "INVOKE",
target = "Lnet/minecraft/world/item/BlockItem;getPlacementState(Lnet/minecraft/world/item/context/BlockPlaceContext;)Lnet/minecraft/world/level/block/state/BlockState;"
),
method = "place",
locals = LocalCapture.CAPTURE_FAILHARD
)
private void transformPlayerWhenPlacing(final BlockPlaceContext ignore,
final CallbackInfoReturnable<InteractionResult> cir, final BlockPlaceContext context) {
if (context == null || context.getPlayer() == null) {
return;
}

PlayerUtil.transformPlayerTemporarily(context.getPlayer(), context.getLevel(), context.getClickedPos());
}

@Inject(
@WrapOperation(
at = @At(
value = "INVOKE",
target = "Lnet/minecraft/world/item/BlockItem;getPlacementState(Lnet/minecraft/world/item/context/BlockPlaceContext;)Lnet/minecraft/world/level/block/state/BlockState;",
shift = Shift.AFTER
target = "Lnet/minecraft/world/item/BlockItem;getPlacementState(Lnet/minecraft/world/item/context/BlockPlaceContext;)Lnet/minecraft/world/level/block/state/BlockState;"
),
method = "place"
)
private void untransformPlayerAfterPlacing(final BlockPlaceContext context,
final CallbackInfoReturnable<InteractionResult> cir) {
if (context.getPlayer() == null) {
return;
private BlockState transformPlayerWhenPlacing(
final BlockItem _instance, final BlockPlaceContext _ctx,
final Operation<BlockState> original, final BlockPlaceContext ctx
) {
if (ctx == null || ctx.getPlayer() == null) {
return null;
}

PlayerUtil.untransformPlayer(context.getPlayer());
return PlayerUtil.transformPlayerTemporarily(
ctx.getPlayer(),
ctx.getLevel(),
ctx.getClickedPos(),
() -> original.call(this, ctx)
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,8 @@ private void redirectSetVelocity(final MoverType moverType, final Vec3 movement,
- collisionResponseHorizontalNormal.z() * parallelHorizontalVelocityComponent
);
}
// The rest of the move function (including tryCheckInsideBlocks) is skipped, so calling it here
tryCheckInsideBlocks();
// Cancel the original invocation of Entity.setVelocity(DDD)V to remove vanilla behavior
callbackInfo.cancel();
}
Expand Down Expand Up @@ -226,6 +228,9 @@ private void preSpawnSprintParticle(final CallbackInfo ci) {
@Shadow
public abstract void setDeltaMovement(double x, double y, double z);

@Shadow
protected abstract void tryCheckInsideBlocks();

@Shadow
protected abstract Vec3 collide(Vec3 vec3d);

Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package org.valkyrienskies.mod.mixin.mod_compat.bluemap;

import de.bluecolored.bluemap.core.map.hires.TileModel;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Pseudo;
import org.spongepowered.asm.mixin.gen.Accessor;

@Mixin(TileModel.class)
@Pseudo
public interface HiresTileModelAccessor {

@Accessor("position")
float[] getPositions();

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package org.valkyrienskies.mod.mixin.mod_compat.bluemap;

import com.flowpowered.math.vector.Vector2i;
import de.bluecolored.bluemap.core.map.BmMap;
import de.bluecolored.bluemap.core.map.hires.HiresModelManager;
import de.bluecolored.bluemap.core.world.World;
import java.util.function.Predicate;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Pseudo;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
import org.valkyrienskies.mod.common.VSGameUtilsKt;
import org.valkyrienskies.mod.mixinducks.mod_compat.bluemap.WorldDuck;

@Mixin(BmMap.class)
@Pseudo
public class MixinBmMap {
@Shadow
@Final
private World world;

@Shadow
@Final
private HiresModelManager hiresModelManager;

@Redirect(
method = "renderTile",
at = @At(
value = "INVOKE",
target = "Ljava/util/function/Predicate;test(Ljava/lang/Object;)Z"
),
remap = false
)
boolean skipShipyard(final Predicate<Object> predicate, final Object object) {
final Vector2i tilePos = (Vector2i) object;
final var level = ((WorldDuck) world).valkyrienskies$getCorrelatingLevel();
final var grid = this.hiresModelManager.getTileGrid();
final var x = grid.getCellMinX(tilePos.getX()) + 1;
final var z = grid.getCellMinY(tilePos.getY()) + 1;

final var notShipyard = !VSGameUtilsKt.isBlockInShipyard(level, x, 0, z);

return predicate.test(tilePos) && notShipyard;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
package org.valkyrienskies.mod.mixin.mod_compat.bluemap;

import com.flowpowered.math.vector.Vector3i;
import de.bluecolored.bluemap.core.map.TileMetaConsumer;
import de.bluecolored.bluemap.core.map.hires.HiresModelManager;
import de.bluecolored.bluemap.core.map.hires.HiresModelRenderer;
import de.bluecolored.bluemap.core.map.hires.TileModel;
import de.bluecolored.bluemap.core.world.World;
import org.joml.Matrix4dc;
import org.joml.Vector3d;
import org.joml.Vector3dc;
import org.joml.primitives.AABBd;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Pseudo;
import org.spongepowered.asm.mixin.Unique;
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.mixinducks.mod_compat.bluemap.WorldDuck;

@Pseudo
@Mixin(HiresModelManager.class)
public class MixinHiresModelManager {

@Redirect(
remap = false,
method = "render",
at = @At(value = "INVOKE", target = "Lde/bluecolored/bluemap/core/map/hires/HiresModelRenderer;render(Lde/bluecolored/bluemap/core/world/World;Lcom/flowpowered/math/vector/Vector3i;Lcom/flowpowered/math/vector/Vector3i;Lde/bluecolored/bluemap/core/map/hires/TileModel;Lde/bluecolored/bluemap/core/map/TileMetaConsumer;)V")
)
void renderModel(final HiresModelRenderer instance, final World world,
final Vector3i min, final Vector3i max,
final TileModel model, final TileMetaConsumer tmc
) {
final var aabb = new AABBd(
min.getX(), min.getY(), min.getZ(),
max.getX(), max.getY(), max.getZ()
);

final var level = ((WorldDuck) world).valkyrienskies$getCorrelatingLevel();
if (level == null) {
System.out.println("Valkyrien Skies x BlueMap: Could not find correlating level for bluemap world");
return;
}

//TODO we are begging the gods to not have race conditions here
final var ships = VSGameUtilsKt.getShipsIntersecting(level, aabb);

var start = model.size();

for (final Ship ship : ships) {
if (!aabb.containsPoint(ship.getTransform().getPositionInWorld())) continue;
final var shipAABB = ship.getShipAABB();

assert shipAABB != null;
final var shipMin = new Vector3i(shipAABB.minX() - 1, shipAABB.minY() - 1, shipAABB.minZ() - 1);
final var shipMax = new Vector3i(shipAABB.maxX() + 1, shipAABB.maxY() + 1, shipAABB.maxZ() + 1);


// renders the ship with as origin shipMin.x, 0, shipMin.z
instance.render(world, shipMin, shipMax, model, tmc);

final var preTranslation = new Vector3d(
shipMin.getX(),
0,
shipMin.getZ()
);

final var postTranslation = new Vector3d(
-min.getX(),
0,
-min.getZ()
);

valkyrienskies$transformModel(start, model.size(), model, preTranslation, postTranslation, ship.getTransform().getShipToWorld());

start = model.size();
}


instance.render(world, min, max, model, tmc);
}

@Unique
private void valkyrienskies$transformModel(final int start, final int end, final TileModel model, final Vector3dc preTranslation, final Vector3dc postTranslation, final Matrix4dc transform) {
final var positions = ((HiresTileModelAccessor) model).getPositions();

for(int face = start; face < end; ++face) {
for(int i = 0; i < 3; ++i) {
final int index = face * 9 + i * 3;
final double x = ((double) positions[index]) + preTranslation.x();
final double y = ((double) positions[index + 1]) + preTranslation.y();
final double z = ((double) positions[index + 2]) + preTranslation.z();

final double newX = (x * transform.m00()) + (y * transform.m10()) + (z * transform.m20()) + transform.m30() + postTranslation.x();
final double newY = (x * transform.m01()) + (y * transform.m11()) + (z * transform.m21()) + transform.m31() + postTranslation.y();
final double newZ = (x * transform.m02()) + (y * transform.m12()) + (z * transform.m22()) + transform.m32() + postTranslation.z();

positions[index] = (float) newX;
positions[index + 1] = (float) newY;
positions[index + 2] = (float) newZ;
}
}
}
}
Loading

0 comments on commit e86939a

Please sign in to comment.