Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merge/1.18 to 1.19 #970

Merged
merged 3 commits into from
Sep 27, 2024
Merged
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
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
9 changes: 9 additions & 0 deletions common/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,18 @@ dependencies {
exclude module: "fastutil"
}

implementation("org.valkyrienskies.core:api:${rootProject.vs_core_version}")
implementation("org.valkyrienskies.core:api-game:${rootProject.vs_core_version}")
implementation("org.valkyrienskies.core:util:${rootProject.vs_core_version}")

// FTB Stuffs
modCompileOnly("curse.maven:ftb-util-404465:4210935")
modCompileOnly("curse.maven:ftb-teams-404468:4229138")
modCompileOnly("curse.maven:ftb-chunks-314906:4229120")

// Weather2 1.18
// modCompileOnly("curse.maven:weather-storms-tornadoes-237746:4426524")

//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 @@ -34,6 +39,10 @@ dependencies {
//implementation("io.github.fabricators_of_create.Porting-Lib:Porting-Lib:$port_lib_version+$minecraft_version")

modCompileOnly("maven.modrinth:create-big-cannons:${createbigcannons_version}")
// modCompileOnly("io.github.fabricators_of_create:Porting-Lib:${port_lib_version}+${minecraft_version}")

//Bluemap fabric 1.19
modCompileOnly("curse.maven:bluemap-406463:4474497")
}

architectury {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@
import org.valkyrienskies.core.api.ships.LoadedShip;
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;
Expand Down Expand Up @@ -112,8 +111,8 @@ private void preGetEyePosition(final float partialTicks, final CallbackInfoRetur
final LoadedShip shipMountedTo = shipMountedToData.getShipMountedTo();

final ShipTransform shipTransform;
if (shipMountedTo instanceof ShipObjectClient) {
shipTransform = ((ShipObjectClient) shipMountedTo).getRenderTransform();
if (shipMountedTo instanceof ClientShip) {
shipTransform = ((ClientShip) shipMountedTo).getRenderTransform();
} else {
shipTransform = shipMountedTo.getShipTransform();
}
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 @@ -116,6 +116,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 @@ -224,6 +226,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.HiresTileModel;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Pseudo;
import org.spongepowered.asm.mixin.gen.Accessor;

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

@Accessor("position")
double[] 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,100 @@
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.HiresTileModel;
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/HiresTileModel;Lde/bluecolored/bluemap/core/map/TileMetaConsumer;)V")
)
void renderModel(final HiresModelRenderer instance, final World world,
final Vector3i min, final Vector3i max,
final HiresTileModel 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 HiresTileModel 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 = positions[index] + preTranslation.x();
final double y = positions[index + 1] + preTranslation.y();
final double z = positions[index + 2] + preTranslation.z();
positions[index] = (x * transform.m00()) + (y * transform.m10()) + (z * transform.m20()) + transform.m30() + postTranslation.x();
positions[index + 1] = (x * transform.m01()) + (y * transform.m11()) + (z * transform.m21()) + transform.m31() + postTranslation.y();
positions[index + 2] = (x * transform.m02()) + (y * transform.m12()) + (z * transform.m22()) + transform.m32() + postTranslation.z();
}
}
}
}
Loading
Loading