From 5472229d41d88ce704b65bd1c14de7135206316e Mon Sep 17 00:00:00 2001 From: Weromano <84074856+Weromano@users.noreply.github.com> Date: Thu, 28 Sep 2023 20:27:54 +0200 Subject: [PATCH 01/52] Create 1_19_blocks --- .../data/valkyrienskies/vs_mass/1_19_blocks | 132 ++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 common/src/main/resources/data/valkyrienskies/vs_mass/1_19_blocks diff --git a/common/src/main/resources/data/valkyrienskies/vs_mass/1_19_blocks b/common/src/main/resources/data/valkyrienskies/vs_mass/1_19_blocks new file mode 100644 index 000000000..cee29a304 --- /dev/null +++ b/common/src/main/resources/data/valkyrienskies/vs_mass/1_19_blocks @@ -0,0 +1,132 @@ +[ + { + "block": "minecraft:pearlescent_froglight", + "mass": 3200.0, + "friction": 0.07, + "elasticity": 0.8 + }, + { + "block": "minecraft:verdant_froglight", + "mass": 3200.0, + "friction": 0.07, + "elasticity": 0.8 + }, + { + "block": "minecraft:ochre_froglight", + "mass": 3200.0, + "friction": 0.07, + "elasticity": 0.8 + }, + { + "block": "minecraft:frogspawn", + "mass": 1.0, + "friction": 0.03 + }, + { + "block": "minecraft:mangrove_log", + "mass": 900.0, + "friction": 0.6 + }, + { + "block": "minecraft:stripped_mangrove_log", + "mass": 900.0, + "friction": 0.4 + }, + { + "block": "minecraft:mangrove_wood", + "mass": 900.0, + "friction": 0.6 + }, + { + "block": "minecraft:stripped_mangrove_wood", + "mass": 900.0, + "friction": 0.4 + }, + { + "block": "minecraft:mangrove_planks", + "mass": 600.0, + "friction": 0.5 + }, + { + "block": "minecraft:mangrove_slab", + "mass": 300.0, + "friction": 0.5 + }, + { + "block": "minecraft:mangrove_stairs", + "mass": 450.0, + "friction": 0.5 + }, + { + "block": "minecraft:mangrove_propagule", + "mass": 15.0 + }, + { + "block": "minecraft:mangrove_roots", + "mass": 50.0, + "friction": 0.8 + }, + { + "block": "minecraft:muddy_mangrove_roots", + "mass": 1800.0, + "friction": 0.8 + }, + { + "block": "minecraft:mud", + "mass": 1800.0, + "friction": 0.9 + }, + { + "block": "minecraft:packed_mud", + "mass": 1450.0, + "friction": 0.7 + }, + { + "block": "minecraft:mud_bricks", + "mass": 1450.0, + "friction": 0.7 + }, + { + "block": "minecraft:mud_brick_wall", + "mass": 725.0, + "friction": 0.7 + }, + { + "block": "minecraft:mud_brick_slab", + "mass": 725.0, + "friction": 0.7 + }, + { + "block": "minecraft:mud_brick_stairs", + "mass": 1035.0, + "friction": 0.7 + }, + { + "block": "minecraft:reinforced_deepslate", + "mass": 3400.0, + "friction": 0.7 + }, + { + "block": "minecraft:sculk", + "mass": 400.0, + "friction": 0.2, + "elasticity": 0.3 + }, + { + "block": "minecraft:sculk_catalyst", + "mass": 600.0, + "friction": 0.2 + }, + { + "block": "minecraft:sculk_shrieker", + "mass": 200.0, + "friction": 0.2, + "elasticity": 0.3 + }, + { + "block": "minecraft:sculk_vein", + "mass": 8.0, + "friction": 0.2, + "elasticity": 0.03 + } +] From 4bc9c696970d3ec8b6886a951c3ac04d6e5f89d0 Mon Sep 17 00:00:00 2001 From: Weromano <84074856+Weromano@users.noreply.github.com> Date: Thu, 28 Sep 2023 20:31:17 +0200 Subject: [PATCH 02/52] Create 1_20_blocks --- .../data/valkyrienskies/vs_mass/1_20_blocks | 133 ++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 common/src/main/resources/data/valkyrienskies/vs_mass/1_20_blocks diff --git a/common/src/main/resources/data/valkyrienskies/vs_mass/1_20_blocks b/common/src/main/resources/data/valkyrienskies/vs_mass/1_20_blocks new file mode 100644 index 000000000..4a443127c --- /dev/null +++ b/common/src/main/resources/data/valkyrienskies/vs_mass/1_20_blocks @@ -0,0 +1,133 @@ +[ + { + "tag": "minecraft:all_hanging_signs", + "mass": 20.0, + "friction": 0.5 + }, + { + "block": "minecraft:bamboo_block", + "mass": 150.0, + "friction": 0.6 + }, + { + "block": "minecraft:stripped_bamboo_block", + "mass": 150.0, + "friction": 0.4 + }, + { + "block": "minecraft:bamboo_planks", + "mass": 100.0, + "friction": 0.5 + }, + { + "block": "minecraft:bamboo_mosaic", + "mass": 100.0, + "friction": 0.5 + }, + { + "block": "minecraft:bamboo_mosaic_slab", + "mass": 50.0, + "friction": 0.5 + }, + { + "block": "minecraft:bamboo_slab", + "mass": 50.0, + "friction": 0.5 + }, + { + "block": "minecraft:bamboo_stairs", + "mass": 75.0, + "friction": 0.5 + }, + { + "block": "minecraft:bamboo_mosaic_stairs", + "mass": 75.0, + "friction": 0.5 + }, + { + "block": "minecraft:calibrated_sculk_sensor", + "mass": 230.0, + "friction": 0.9, + "elasticity": 0.3 + }, + { + "block": "minecraft:cherry_wood", + "mass": 640.0, + "friction": 0.6 + }, + { + "block": "minecraft:cherry_log", + "mass": 640.0, + "friction": 0.6 + }, + { + "block": "minecraft:stripped_cherry_wood", + "mass": 640.0, + "friction": 0.4 + }, + { + "block": "minecraft:stripped_cherry_log", + "mass": 640.0, + "friction": 0.4 + }, + { + "block": "minecraft:cherry_planks", + "mass": 425.0, + "friction": 0.5 + }, + { + "block": "minecraft:cherry_slab", + "mass": 210.0, + "friction": 0.5 + }, + { + "block": "minecraft:cherry_stairs", + "mass": 315.0, + "friction": 0.5 + }, + { + "block": "minecraft:chiseled_bookshelf", + "mass": 650.0, + "friction": 0.5 + }, + { + "block": "minecraft:decorated_pot", + "mass": 250.0, + "friction": 0.35 + }, + { + "block": "minecraft:piglin_head", + "mass": 5.0 + }, + { + "block": "minecraft:piglin_wall_head", + "mass": 5.0 + }, + { + "block": "minecraft:pink_petals", + "mass": 1.0 + }, + { + "block": "minecraft:sniffer_egg", + "mass": 980.0, + "friction": 0.1 + }, + { + "block": "minecraft:suspicious_sand", + "mass": 1565.0, + "friction": 0.4 + }, + { + "block": "minecraft:suspicious_gravel", + "mass": 1685.0, + "friction": 0.7 + }, + { + "block": "minecraft:torchflower_crop", + "mass": 2.0 + }, + { + "block": "minecraft:pitcher_crop", + "mass": 2.0 + } +] From b742eebf3d4559fdd44e7b88b5b0b53d2fab0f4e Mon Sep 17 00:00:00 2001 From: TechTastic <74630543+TechTastic@users.noreply.github.com> Date: Fri, 17 Nov 2023 23:29:55 -0600 Subject: [PATCH 03/52] Added dependency for Modular Routers Mixin'd into ContainerModularRouter to fix distance check --- forge/build.gradle | 3 ++ .../MixinContainerModularRouter.java | 35 +++++++++++++++++++ .../valkyrienskies-forge.mixins.json | 1 + 3 files changed, 39 insertions(+) create mode 100644 forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/modular_routers/MixinContainerModularRouter.java diff --git a/forge/build.gradle b/forge/build.gradle index 6927771ed..d56e4a985 100644 --- a/forge/build.gradle +++ b/forge/build.gradle @@ -78,6 +78,9 @@ dependencies { //modImplementation("curse.maven:tis3d-238603:3738437") //modImplementation("curse.maven:markdownmanual-502485:3738124") + // Modular Routers + modCompileOnly("curse.maven:mr-250294:3776175") + // Add Kotlin for Forge (3.12.0) forgeRuntimeLibrary('curse.maven:kotlinforforge-351264:4513187') diff --git a/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/modular_routers/MixinContainerModularRouter.java b/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/modular_routers/MixinContainerModularRouter.java new file mode 100644 index 000000000..2d911dfaa --- /dev/null +++ b/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/modular_routers/MixinContainerModularRouter.java @@ -0,0 +1,35 @@ +package org.valkyrienskies.mod.forge.mixin.compat.modular_routers; + +import me.desht.modularrouters.block.tile.ModularRouterBlockEntity; +import me.desht.modularrouters.container.ContainerModularRouter; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; +import org.joml.Vector3d; +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.core.api.ships.Ship; +import org.valkyrienskies.mod.common.VSGameUtilsKt; +import org.valkyrienskies.mod.common.util.VectorConversionsMCKt; + +@Pseudo +@Mixin(ContainerModularRouter.class) +public class MixinContainerModularRouter { + @Shadow + @Final + private ModularRouterBlockEntity router; + + @Redirect(method = "stillValid", at = @At(target = "Lnet/minecraft/world/phys/Vec3;distanceToSqr(Lnet/minecraft/world/phys/Vec3;)D", value = "INVOKE")) + public double ValkyrienSkies$distanceCheck(final Vec3 instance, final Vec3 vec3) { + final Level level = router.getLevel(); + final Ship ship = VSGameUtilsKt.getShipManagingPos(level, instance); + if (ship == null) + return instance.distanceToSqr(vec3); + + final Vector3d newInstance = ship.getTransform().getShipToWorld().transformPosition(VectorConversionsMCKt.toJOML(instance)); + return VectorConversionsMCKt.toMinecraft(newInstance).distanceToSqr(vec3); + } +} diff --git a/forge/src/main/resources/valkyrienskies-forge.mixins.json b/forge/src/main/resources/valkyrienskies-forge.mixins.json index 448f11e1c..3379b2775 100644 --- a/forge/src/main/resources/valkyrienskies-forge.mixins.json +++ b/forge/src/main/resources/valkyrienskies-forge.mixins.json @@ -14,6 +14,7 @@ "compat.immersivengineering.MixinBlockEntityInventory", "compat.thermalexpansion.MixinTileCoFH", "compat.tis3d.MixinInfraredPacketEntity", + "compat.modular_routers.MixinContainerModularRouter", "feature.forge_interact.MixinIForgePlayer", "world.level.block.FireMixin" ], From 90e23ed86f11283185d8cc3f89c1822e5a926159 Mon Sep 17 00:00:00 2001 From: StewStrong Date: Mon, 20 Nov 2023 23:58:21 -0700 Subject: [PATCH 04/52] Don't drag entities that are mounted to an entity --- .../client/renderer/MixinGameRenderer.java | 60 +++++++++---------- .../mod/common/util/EntityDragger.kt | 3 +- .../common/util/EntityDraggingInformation.kt | 3 +- 3 files changed, 33 insertions(+), 33 deletions(-) diff --git a/common/src/main/java/org/valkyrienskies/mod/mixin/client/renderer/MixinGameRenderer.java b/common/src/main/java/org/valkyrienskies/mod/mixin/client/renderer/MixinGameRenderer.java index 46f0bbaa6..8bfef4dfd 100644 --- a/common/src/main/java/org/valkyrienskies/mod/mixin/client/renderer/MixinGameRenderer.java +++ b/common/src/main/java/org/valkyrienskies/mod/mixin/client/renderer/MixinGameRenderer.java @@ -144,41 +144,39 @@ private void preRender(final float tickDelta, final long startTime, final boolea continue; } - if (entityShouldBeHere == null) { - final EntityDraggingInformation entityDraggingInformation = - ((IEntityDraggingInformationProvider) entity).getDraggingInformation(); - final Long lastShipStoodOn = entityDraggingInformation.getLastShipStoodOn(); - // Then try getting [entityShouldBeHere] from [entityDraggingInformation] - if (lastShipStoodOn != null && entityDraggingInformation.isEntityBeingDraggedByAShip()) { - final ClientShip shipObject = - VSGameUtilsKt.getShipObjectWorld(clientWorld).getLoadedShips().getById(lastShipStoodOn); - if (shipObject != null) { - entityDraggingInformation.setCachedLastPosition( - new Vector3d(entity.xo, entity.yo, entity.zo)); - entityDraggingInformation.setRestoreCachedLastPosition(true); + final EntityDraggingInformation entityDraggingInformation = + ((IEntityDraggingInformationProvider) entity).getDraggingInformation(); + final Long lastShipStoodOn = entityDraggingInformation.getLastShipStoodOn(); + // Then try getting [entityShouldBeHere] from [entityDraggingInformation] + if (lastShipStoodOn != null && entityDraggingInformation.isEntityBeingDraggedByAShip()) { + final ClientShip shipObject = + VSGameUtilsKt.getShipObjectWorld(clientWorld).getLoadedShips().getById(lastShipStoodOn); + if (shipObject != null) { + entityDraggingInformation.setCachedLastPosition( + new Vector3d(entity.xo, entity.yo, entity.zo)); + entityDraggingInformation.setRestoreCachedLastPosition(true); - // The velocity added to the entity by ship dragging - final Vector3dc entityAddedVelocity = entityDraggingInformation.getAddedMovementLastTick(); + // The velocity added to the entity by ship dragging + final Vector3dc entityAddedVelocity = entityDraggingInformation.getAddedMovementLastTick(); - // The velocity of the entity before we added ship dragging - final double entityMovementX = entity.getX() - entityAddedVelocity.x() - entity.xo; - final double entityMovementY = entity.getY() - entityAddedVelocity.y() - entity.yo; - final double entityMovementZ = entity.getZ() - entityAddedVelocity.z() - entity.zo; + // The velocity of the entity before we added ship dragging + final double entityMovementX = entity.getX() - entityAddedVelocity.x() - entity.xo; + final double entityMovementY = entity.getY() - entityAddedVelocity.y() - entity.yo; + final double entityMovementZ = entity.getZ() - entityAddedVelocity.z() - entity.zo; - // Without ship dragging, the entity would've been here - final Vector3dc entityShouldBeHerePreTransform = new Vector3d( - entity.xo + entityMovementX * tickDelta, - entity.yo + entityMovementY * tickDelta, - entity.zo + entityMovementZ * tickDelta - ); + // Without ship dragging, the entity would've been here + final Vector3dc entityShouldBeHerePreTransform = new Vector3d( + entity.xo + entityMovementX * tickDelta, + entity.yo + entityMovementY * tickDelta, + entity.zo + entityMovementZ * tickDelta + ); - // Move [entityShouldBeHerePreTransform] with the ship, using the prev transform and the - // current render transform - entityShouldBeHere = shipObject.getRenderTransform().getShipToWorldMatrix() - .transformPosition( - shipObject.getPrevTickShipTransform().getWorldToShipMatrix() - .transformPosition(entityShouldBeHerePreTransform, new Vector3d())); - } + // Move [entityShouldBeHerePreTransform] with the ship, using the prev transform and the + // current render transform + entityShouldBeHere = shipObject.getRenderTransform().getShipToWorldMatrix() + .transformPosition( + shipObject.getPrevTickShipTransform().getWorldToShipMatrix() + .transformPosition(entityShouldBeHerePreTransform, new Vector3d())); } } diff --git a/common/src/main/kotlin/org/valkyrienskies/mod/common/util/EntityDragger.kt b/common/src/main/kotlin/org/valkyrienskies/mod/common/util/EntityDragger.kt index 64472ca35..425ef4c48 100644 --- a/common/src/main/kotlin/org/valkyrienskies/mod/common/util/EntityDragger.kt +++ b/common/src/main/kotlin/org/valkyrienskies/mod/common/util/EntityDragger.kt @@ -34,7 +34,7 @@ object EntityDragger { if (shipDraggingEntity != null) { if (entityDraggingInformation.isEntityBeingDraggedByAShip()) { // Compute how much we should drag the entity - val shipData = entity.level.shipObjectWorld.queryableShipData.getById(shipDraggingEntity) + val shipData = entity.level.shipObjectWorld.allShips.getById(shipDraggingEntity) if (shipData != null) { dragTheEntity = true @@ -114,6 +114,7 @@ object EntityDragger { } } entityDraggingInformation.ticksSinceStoodOnShip++ + entityDraggingInformation.mountedToEntity = entity.vehicle != null } } } diff --git a/common/src/main/kotlin/org/valkyrienskies/mod/common/util/EntityDraggingInformation.kt b/common/src/main/kotlin/org/valkyrienskies/mod/common/util/EntityDraggingInformation.kt index e0b140942..690263a87 100644 --- a/common/src/main/kotlin/org/valkyrienskies/mod/common/util/EntityDraggingInformation.kt +++ b/common/src/main/kotlin/org/valkyrienskies/mod/common/util/EntityDraggingInformation.kt @@ -16,13 +16,14 @@ class EntityDraggingInformation { field = value } var ticksSinceStoodOnShip: Int = 0 + var mountedToEntity: Boolean = false // Used by the client rendering code only var cachedLastPosition: Vector3dc? = null var restoreCachedLastPosition = false fun isEntityBeingDraggedByAShip(): Boolean { - return (lastShipStoodOn != null) && (ticksSinceStoodOnShip < 10) + return (lastShipStoodOn != null) && (ticksSinceStoodOnShip < 10) && !mountedToEntity } } From aa02ad9de4fe6d8919943229d85fbe23d322e286 Mon Sep 17 00:00:00 2001 From: StewStrong Date: Tue, 21 Nov 2023 04:58:15 -0700 Subject: [PATCH 05/52] Fixed Sodium rendering deleted ships --- .../sodium/MixinSodiumWorldRenderer.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/sodium/MixinSodiumWorldRenderer.java b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/sodium/MixinSodiumWorldRenderer.java index fd894a38a..1ed8a2766 100644 --- a/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/sodium/MixinSodiumWorldRenderer.java +++ b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/sodium/MixinSodiumWorldRenderer.java @@ -6,7 +6,9 @@ import it.unimi.dsi.fastutil.longs.Long2ObjectMap; import java.util.SortedSet; import me.jellysquid.mods.sodium.client.render.SodiumWorldRenderer; +import me.jellysquid.mods.sodium.client.render.chunk.RenderSectionManager; import net.minecraft.client.Camera; +import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderBuffers; @@ -17,9 +19,11 @@ import net.minecraft.world.phys.Vec3; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; 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.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.valkyrienskies.core.api.ships.ClientShip; import org.valkyrienskies.mod.common.VSGameUtilsKt; @@ -30,6 +34,27 @@ public class MixinSodiumWorldRenderer { @Shadow private ClientLevel world; + @Shadow + private RenderSectionManager renderSectionManager; + + @Unique + private boolean vs$prevFrameHadShips = false; + + /** + * @reason Fix ship ghosts when ships are deleted and camera hasn't moved, and ships not rendering when teleported + * and camera hasn't moved + */ + @Inject(method = "updateChunks", at = @At("HEAD")) + private void preUpdateChunks(final CallbackInfo callbackInfo) { + final boolean curFrameHasShips = + !VSGameUtilsKt.getShipObjectWorld(Minecraft.getInstance()).getLoadedShips().isEmpty(); + // Mark the graph dirty if ships were loaded this frame or the previous one + if (vs$prevFrameHadShips || curFrameHasShips) { + this.renderSectionManager.markGraphDirty(); + } + vs$prevFrameHadShips = curFrameHasShips; + } + @Redirect(method = "renderTileEntities", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/blockentity/BlockEntityRenderDispatcher;render(Lnet/minecraft/world/level/block/entity/BlockEntity;FLcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;)V")) private void renderShipChunkBlockEntity(final BlockEntityRenderDispatcher instance, final BlockEntity blockEntity, From a9b1a7c3dbca3c2255f1a330bc24d6ab8e2a121b Mon Sep 17 00:00:00 2001 From: StewStrong Date: Tue, 21 Nov 2023 05:32:56 -0700 Subject: [PATCH 06/52] Added necessary remap --- .../mod/mixin/mod_compat/create/pr/MixinSeatBlock.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/pr/MixinSeatBlock.java b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/pr/MixinSeatBlock.java index 5da93a395..19d90ac43 100644 --- a/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/pr/MixinSeatBlock.java +++ b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/pr/MixinSeatBlock.java @@ -40,8 +40,7 @@ private static void wrapSitDownSetPos(final SeatEntity seatEntity, final double at = @At( value = "INVOKE", target = "Lnet/minecraft/world/entity/Entity;blockPosition()Lnet/minecraft/core/BlockPos;" - ), - remap = false + ) ) private BlockPos wrapBlockPosInUpdateEntityAfterFallOn( final Entity entity, From 30f689dcc1c21e99e199d81bc284f26578d01da9 Mon Sep 17 00:00:00 2001 From: StewStrong Date: Tue, 21 Nov 2023 05:50:41 -0700 Subject: [PATCH 07/52] Updated vs-core --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 729994223..9dabb0c0e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -11,7 +11,7 @@ forge_version=1.18.2-40.2.4 create_fabric_version=0.5.1-c-build.1092+mc1.18.2 flywheel_version_fabric=0.6.9-38 createbigcannons_version= 0.5.2-nightly-e815ca4 -vs_core_version=1.1.0+f2a6aaad81 +vs_core_version=1.1.0+c957c12bf9 # Prevent kotlin from autoincluding stdlib as a dependency, which breaks # gradle's composite builds (includeBuild) for some reason. We'll add it manually kotlin.stdlib.default.dependency=false From b25fa9806dc286c45048251994b14a8d3e8a3ac5 Mon Sep 17 00:00:00 2001 From: StewStrong Date: Fri, 24 Nov 2023 23:08:44 -0700 Subject: [PATCH 08/52] Updated the thing --- .../mixin/feature/sound/client/MixinSoundEngine.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/common/src/main/java/org/valkyrienskies/mod/mixin/feature/sound/client/MixinSoundEngine.java b/common/src/main/java/org/valkyrienskies/mod/mixin/feature/sound/client/MixinSoundEngine.java index 47fad3930..7c5923fe4 100644 --- a/common/src/main/java/org/valkyrienskies/mod/mixin/feature/sound/client/MixinSoundEngine.java +++ b/common/src/main/java/org/valkyrienskies/mod/mixin/feature/sound/client/MixinSoundEngine.java @@ -19,6 +19,8 @@ import org.valkyrienskies.core.api.ships.ClientShip; import org.valkyrienskies.mod.client.audio.VelocityTickableSoundInstance; import org.valkyrienskies.mod.common.VSGameUtilsKt; +import org.valkyrienskies.mod.common.util.EntityDraggingInformation; +import org.valkyrienskies.mod.common.util.IEntityDraggingInformationProvider; import org.valkyrienskies.mod.mixinducks.com.mojang.blaze3d.audio.HasOpenALVelocity; @Mixin(SoundEngine.class) @@ -31,6 +33,7 @@ public abstract class MixinSoundEngine { protected abstract float calculatePitch(SoundInstance sound); // Applies the velocity provided by a VelocityTickableSoundInstance + @SuppressWarnings("unused") @WrapOperation( at = @At( value = "INVOKE", @@ -39,7 +42,7 @@ public abstract class MixinSoundEngine { ), method = "tickNonPaused" ) - private Object redirectGet(final Map instance, final Object obj, final Operation get) { + private Object redirectGet(final Map instance, final Object obj, final Operation get) { if (obj instanceof final VelocityTickableSoundInstance soundInstance) { final ChannelAccess.ChannelHandle handle = (ChannelAccess.ChannelHandle) instance.get(soundInstance); final float f = calculateVolume(soundInstance); @@ -59,6 +62,7 @@ private Object redirectGet(final Map instance, final Object obj, final Operation return get.call(instance, obj); } + @SuppressWarnings("unused") @WrapOperation( at = @At( value = "INVOKE", @@ -76,6 +80,12 @@ private void injectListenerVelocity(final Listener listener, final Vec3 position final ClientShip mounted = VSGameUtilsKt.getShipObjectEntityMountedTo(level, player); if (mounted != null) { ((HasOpenALVelocity) listener).setVelocity(mounted.getVelocity()); + } else { + final EntityDraggingInformation dragInfo = ((IEntityDraggingInformationProvider) player).getDraggingInformation(); + if (dragInfo.isEntityBeingDraggedByAShip()) { + final Vector3dc playerVel = dragInfo.getAddedMovementLastTick(); + ((HasOpenALVelocity) listener).setVelocity(playerVel); + } } } From e1d14c6343fe7a5e5041d8a8ab36be896aebac41 Mon Sep 17 00:00:00 2001 From: StewStrong Date: Sun, 26 Nov 2023 00:46:56 -0700 Subject: [PATCH 09/52] Fixed stabilized contraptions acting weird on ships --- .../client/renderer/MixinGameRenderer.java | 20 ++++-- .../mod/mixin/entity/MixinEntity.java | 5 ++ .../MixinOrientedContraptionEntity.java | 66 ------------------- .../MixinAbstractContraptionEntity.java | 8 ++- .../common/util/EntityDraggingInformation.kt | 2 + .../valkyrienskies-common.mixins.json | 1 - 6 files changed, 29 insertions(+), 73 deletions(-) delete mode 100644 common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/client/MixinOrientedContraptionEntity.java diff --git a/common/src/main/java/org/valkyrienskies/mod/mixin/client/renderer/MixinGameRenderer.java b/common/src/main/java/org/valkyrienskies/mod/mixin/client/renderer/MixinGameRenderer.java index 8bfef4dfd..22578544f 100644 --- a/common/src/main/java/org/valkyrienskies/mod/mixin/client/renderer/MixinGameRenderer.java +++ b/common/src/main/java/org/valkyrienskies/mod/mixin/client/renderer/MixinGameRenderer.java @@ -25,6 +25,7 @@ import org.spongepowered.asm.mixin.Unique; 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.core.apigame.world.ClientShipWorldCore; @@ -92,17 +93,23 @@ public HitResult modifyCrosshairTargetBlocks(final Entity receiver, final double return pick.call(receiver, maxDistance, tickDelta, includeFluids); } - @WrapOperation( + @Redirect( method = "pick", at = @At( value = "INVOKE", target = "Lnet/minecraft/world/phys/Vec3;distanceToSqr(Lnet/minecraft/world/phys/Vec3;)D" ) ) - public double correctDistanceChecks(final Vec3 instance, final Vec3 vec, final Operation distanceToSqr) { - return VSGameUtilsKt.squaredDistanceBetweenInclShips(this.minecraft.level, - vec.x, vec.y, vec.z, - instance.x, instance.y, instance.z); + public double correctDistanceChecks(final Vec3 instance, final Vec3 vec) { + return VSGameUtilsKt.squaredDistanceBetweenInclShips( + this.minecraft.level, + vec.x, + vec.y, + vec.z, + instance.x, + instance.y, + instance.z + ); } @Inject(method = "render", at = @At("HEAD")) @@ -120,6 +127,9 @@ private void preRender(final float tickDelta, final long startTime, final boolea // Also update entity last tick positions, so that they interpolate correctly for (final Entity entity : clientWorld.entitiesForRendering()) { + if (!((IEntityDraggingInformationProvider) entity).vs$shouldDrag()) { + continue; + } // The position we want to render [entity] at for this frame // This is set when an entity is mounted to a ship, or an entity is being dragged by a ship Vector3dc entityShouldBeHere = null; diff --git a/common/src/main/java/org/valkyrienskies/mod/mixin/entity/MixinEntity.java b/common/src/main/java/org/valkyrienskies/mod/mixin/entity/MixinEntity.java index f82f1e084..6a30ff909 100644 --- a/common/src/main/java/org/valkyrienskies/mod/mixin/entity/MixinEntity.java +++ b/common/src/main/java/org/valkyrienskies/mod/mixin/entity/MixinEntity.java @@ -199,4 +199,9 @@ private void preCalculateViewVector(final float xRot, final float yRot, final Ca public EntityDraggingInformation getDraggingInformation() { return draggingInformation; } + + @Override + public boolean vs$shouldDrag() { + return true; + } } diff --git a/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/client/MixinOrientedContraptionEntity.java b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/client/MixinOrientedContraptionEntity.java deleted file mode 100644 index 8dae3ebf8..000000000 --- a/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/client/MixinOrientedContraptionEntity.java +++ /dev/null @@ -1,66 +0,0 @@ -package org.valkyrienskies.mod.mixin.mod_compat.create.client; - -import com.jozufozu.flywheel.util.transform.TransformStack; -import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.content.contraptions.AbstractContraptionEntity; -import com.simibubi.create.content.contraptions.OrientedContraptionEntity; -import net.minecraft.client.Minecraft; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.phys.Vec3; -import org.joml.Quaterniond; -import org.joml.Vector3d; -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.ClientShip; -import org.valkyrienskies.mod.common.VSGameUtilsKt; -import org.valkyrienskies.mod.common.util.VectorConversionsMCKt; - -@Mixin(OrientedContraptionEntity.class) -public class MixinOrientedContraptionEntity { - - @Shadow - private Vec3 getCartOffset(float partialTicks, Entity ridingEntity) { - return Vec3.ZERO; - } - - @Redirect(method = "applyLocalTransforms", at = @At(value = "INVOKE", target = "Lcom/simibubi/create/content/contraptions/OrientedContraptionEntity;repositionOnCart(Lcom/mojang/blaze3d/vertex/PoseStack;FLnet/minecraft/world/entity/Entity;)V")) - private void redirectRepositionOnCart(OrientedContraptionEntity instance, PoseStack matrixStack, float partialTicks, Entity ridingEntity) { - - Vec3 cartPos = getCartOffset(partialTicks, ridingEntity); - if (cartPos != Vec3.ZERO) matrixStack.translate(cartPos.x, cartPos.y, cartPos.z); - - ClientShip ship = (ClientShip) VSGameUtilsKt.getShipManagingPos(instance.getCommandSenderWorld(), ridingEntity.blockPosition()); - if (ship != null) { - Quaterniond quaternion = new Quaterniond(); - ship.getRenderTransform().getShipToWorld().getNormalizedRotation(quaternion); - TransformStack.cast(matrixStack).rotateCentered(VectorConversionsMCKt.toMinecraft(quaternion)); - } - } - - @Redirect(method = "repositionOnContraption", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/vertex/PoseStack;translate(DDD)V", ordinal = 0)) - private void redirectTranslate(final PoseStack instance, final double pose, final double d, final double e) { - instance.translate(pose, d, e); - - ClientShip ship = (ClientShip) VSGameUtilsKt.getShipManagingPos(Minecraft.getInstance().level, ((AbstractContraptionEntity) (Object) this).getVehicle().blockPosition()); - if (ship != null) { - Quaterniond quaternion = new Quaterniond(); - ship.getRenderTransform().getShipToWorld().getNormalizedRotation(quaternion); - TransformStack.cast(instance).rotateCentered(VectorConversionsMCKt.toMinecraft(quaternion)); - } - } - - @Redirect(method = "getContraptionOffset", at = @At(value = "INVOKE", target = "Lcom/simibubi/create/content/contraptions/AbstractContraptionEntity;getPassengerPosition(Lnet/minecraft/world/entity/Entity;F)Lnet/minecraft/world/phys/Vec3;")) - private Vec3 redirectGetPassengerPosition(AbstractContraptionEntity instance, Entity passenger, float partialTicks) { - Vec3 result = instance.getPassengerPosition(passenger, partialTicks); - - ClientShip ship = (ClientShip) VSGameUtilsKt.getShipManagingPos(instance.getCommandSenderWorld(), instance.position()); - if (ship != null) { - Vector3d dest = new Vector3d(); - ship.getRenderTransform().getShipToWorld().transformPosition(VectorConversionsMCKt.toJOML(result), dest); - result = VectorConversionsMCKt.toMinecraft(dest); - } - return result; - } -} diff --git a/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/entity/MixinAbstractContraptionEntity.java b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/entity/MixinAbstractContraptionEntity.java index ea077730b..f8511fd70 100644 --- a/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/entity/MixinAbstractContraptionEntity.java +++ b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/entity/MixinAbstractContraptionEntity.java @@ -48,13 +48,14 @@ import org.valkyrienskies.core.api.ships.WingManager; import org.valkyrienskies.mod.common.CompatUtil; import org.valkyrienskies.mod.common.VSGameUtilsKt; +import org.valkyrienskies.mod.common.util.IEntityDraggingInformationProvider; import org.valkyrienskies.mod.common.util.VectorConversionsMCKt; import org.valkyrienskies.mod.compat.CreateConversionsKt; import org.valkyrienskies.mod.mixinducks.mod_compat.create.MixinAbstractContraptionEntityDuck; @Mixin(AbstractContraptionEntity.class) public abstract class MixinAbstractContraptionEntity extends Entity implements MixinAbstractContraptionEntityDuck, - ContraptionWingProvider { + ContraptionWingProvider, IEntityDraggingInformationProvider { public MixinAbstractContraptionEntity(EntityType entityType, Level level) { super(entityType, level); @@ -316,4 +317,9 @@ public Matrix4dc computeContraptionWingTransform() { final Vector3d pos = VectorConversionsMCKt.toJOML(thisAsAbstractContraptionEntity.getAnchorVec()); return new Matrix4d(rotationMatrix).setTranslation(pos); } + + @Override + public boolean vs$shouldDrag() { + return false; + } } diff --git a/common/src/main/kotlin/org/valkyrienskies/mod/common/util/EntityDraggingInformation.kt b/common/src/main/kotlin/org/valkyrienskies/mod/common/util/EntityDraggingInformation.kt index 690263a87..7b48e76bd 100644 --- a/common/src/main/kotlin/org/valkyrienskies/mod/common/util/EntityDraggingInformation.kt +++ b/common/src/main/kotlin/org/valkyrienskies/mod/common/util/EntityDraggingInformation.kt @@ -29,4 +29,6 @@ class EntityDraggingInformation { interface IEntityDraggingInformationProvider { val draggingInformation: EntityDraggingInformation + + fun `vs$shouldDrag`(): Boolean } diff --git a/common/src/main/resources/valkyrienskies-common.mixins.json b/common/src/main/resources/valkyrienskies-common.mixins.json index 8091744c0..6b270cb06 100644 --- a/common/src/main/resources/valkyrienskies-common.mixins.json +++ b/common/src/main/resources/valkyrienskies-common.mixins.json @@ -156,7 +156,6 @@ "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", From e59ff2aa46df6a9c598fae707ddb086d956e2512 Mon Sep 17 00:00:00 2001 From: StewStrong Date: Sun, 26 Nov 2023 21:16:31 -0700 Subject: [PATCH 10/52] Fixed order of rotations in VS teleport command --- .../valkyrienskies/mod/common/command/RelativeVector3.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/common/src/main/kotlin/org/valkyrienskies/mod/common/command/RelativeVector3.kt b/common/src/main/kotlin/org/valkyrienskies/mod/common/command/RelativeVector3.kt index f54cdb6d5..b935c2c63 100644 --- a/common/src/main/kotlin/org/valkyrienskies/mod/common/command/RelativeVector3.kt +++ b/common/src/main/kotlin/org/valkyrienskies/mod/common/command/RelativeVector3.kt @@ -6,10 +6,10 @@ import java.lang.Math.toRadians data class RelativeVector3(val x: RelativeValue, val y: RelativeValue, val z: RelativeValue) { fun toEulerRotation(sourcePitchDegrees: Double, sourceYawDegrees: Double, sourceRollDegrees: Double): Quaterniond = - Quaterniond().rotateXYZ( - toRadians(x.getRelativeValue(sourcePitchDegrees)), - toRadians(y.getRelativeValue(sourceYawDegrees)), + Quaterniond().rotateZYX( toRadians(z.getRelativeValue(sourceRollDegrees)), + toRadians(y.getRelativeValue(sourceYawDegrees)), + toRadians(x.getRelativeValue(sourcePitchDegrees)), ) fun toEulerRotationFromMCEntity(mcEntityPitch: Double, mcEntityYaw: Double) = From 6248cbdfd3a48cc3d454326215835ca4ea41c1fb Mon Sep 17 00:00:00 2001 From: ewoudje <7384674+ewoudje@users.noreply.github.com> Date: Wed, 29 Nov 2023 19:38:18 +0100 Subject: [PATCH 11/52] TFC mixin compat --- .../level/chunk/MixinChunkGenerator.java | 3 + .../compat/tfc/MixinTFCChunkGenerator.java | 102 ++++++++++++++++++ .../valkyrienskies-forge.mixins.json | 1 + 3 files changed, 106 insertions(+) create mode 100644 forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/tfc/MixinTFCChunkGenerator.java diff --git a/common/src/main/java/org/valkyrienskies/mod/mixin/world/level/chunk/MixinChunkGenerator.java b/common/src/main/java/org/valkyrienskies/mod/mixin/world/level/chunk/MixinChunkGenerator.java index 0b32dcda1..e65b21ae2 100644 --- a/common/src/main/java/org/valkyrienskies/mod/mixin/world/level/chunk/MixinChunkGenerator.java +++ b/common/src/main/java/org/valkyrienskies/mod/mixin/world/level/chunk/MixinChunkGenerator.java @@ -24,6 +24,9 @@ @Mixin(ChunkGenerator.class) public class MixinChunkGenerator { + // TODO its pretty standard to extend this class, if they do super.whatever, these mixins will not work correctly + // tfc in forge part of the mod has a bandaid solution, if this is fixed please remove that + @Inject(method = "findNearestMapFeature", at = @At("HEAD"), cancellable = true) private void preFindNearestMapFeature(ServerLevel serverLevel, HolderSet> holderSet, BlockPos blockPos, int i, boolean bl, final CallbackInfoReturnable>>> cir) { if (VS2ChunkAllocator.INSTANCE.isChunkInShipyardCompanion(blockPos.getX() >> 4, blockPos.getZ() >> 4)) { diff --git a/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/tfc/MixinTFCChunkGenerator.java b/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/tfc/MixinTFCChunkGenerator.java new file mode 100644 index 000000000..dd27c58ee --- /dev/null +++ b/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/tfc/MixinTFCChunkGenerator.java @@ -0,0 +1,102 @@ +package org.valkyrienskies.mod.forge.mixin.compat.tfc; + +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Executor; +import net.minecraft.core.RegistryAccess; +import net.minecraft.server.level.WorldGenRegion; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.LevelHeightAccessor; +import net.minecraft.world.level.NoiseColumn; +import net.minecraft.world.level.StructureFeatureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.biome.BiomeManager; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkAccess; +import net.minecraft.world.level.levelgen.GenerationStep; +import net.minecraft.world.level.levelgen.blending.Blender; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Pseudo; +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.CallbackInfoReturnable; +import org.valkyrienskies.mod.common.VS2ChunkAllocator; + +@Pseudo +@Mixin(targets = "net.dries007.tfc.world.TFCChunkGenerator") +public class MixinTFCChunkGenerator { + + @Inject(method = "m_183372_", at = @At("HEAD"), cancellable = true) + private void preApplyBiomeDecoration( + final WorldGenLevel worldGenLevel, final ChunkAccess chunkAccess, + final StructureFeatureManager structureFeatureManager, final CallbackInfo callbackInfo + ) { + final ChunkPos chunkPos = chunkAccess.getPos(); + if (VS2ChunkAllocator.INSTANCE.isChunkInShipyardCompanion(chunkPos.x, chunkPos.z)) { + callbackInfo.cancel(); + } + } + + @Inject(method = "m_62199_", at = @At("HEAD"), cancellable = true) + private void preCreateStructures( + final RegistryAccess registryAccess, + final StructureFeatureManager structureFeatureManager, final ChunkAccess chunkAccess, + final StructureManager structureManager, final long l, final CallbackInfo callbackInfo + ) { + final ChunkPos chunkPos = chunkAccess.getPos(); + if (VS2ChunkAllocator.INSTANCE.isChunkInShipyardCompanion(chunkPos.x, chunkPos.z)) { + callbackInfo.cancel(); + } + } + + @Inject(method = "m_62177_", at = @At("HEAD"), cancellable = true) + private void preCreateReferences( + final WorldGenLevel worldGenLevel, final StructureFeatureManager structureFeatureManager, + final ChunkAccess chunkAccess, final CallbackInfo callbackInfo + ) { + final ChunkPos chunkPos = chunkAccess.getPos(); + if (VS2ChunkAllocator.INSTANCE.isChunkInShipyardCompanion(chunkPos.x, chunkPos.z)) { + callbackInfo.cancel(); + } + } + + @Inject(method = "m_141914_", at = @At("HEAD"), cancellable = true) + private void preGetBaseColumn(int i, int j, LevelHeightAccessor levelHeightAccessor, CallbackInfoReturnable cir) { + if (VS2ChunkAllocator.INSTANCE.isChunkInShipyardCompanion(i, j)) { + cir.setReturnValue(new NoiseColumn(0, new BlockState[0])); + } + } + + @Inject(method = "m_183621_", at = @At("HEAD"), cancellable = true) + private void preBuildSurface(WorldGenRegion worldGenRegion, StructureFeatureManager structureFeatureManager, ChunkAccess chunkAccess, CallbackInfo ci) { + final ChunkPos chunkPos = chunkAccess.getPos(); + if (VS2ChunkAllocator.INSTANCE.isChunkInShipyardCompanion(chunkPos.x, chunkPos.z)) { + ci.cancel(); + } + } + + @Inject(method = "m_183516_", at = @At("HEAD"), cancellable = true) + private void preApplyCarvers(WorldGenRegion worldGenRegion, long l, BiomeManager biomeManager, StructureFeatureManager structureFeatureManager, ChunkAccess chunkAccess, GenerationStep.Carving carving, CallbackInfo ci) { + final ChunkPos chunkPos = chunkAccess.getPos(); + if (VS2ChunkAllocator.INSTANCE.isChunkInShipyardCompanion(chunkPos.x, chunkPos.z)) { + ci.cancel(); + } + } + + @Inject(method = "m_183489_", at = @At("HEAD"), cancellable = true) + private void preFillFromNoise(Executor executor, Blender blender, StructureFeatureManager structureFeatureManager, ChunkAccess chunkAccess, CallbackInfoReturnable> cir) { + final ChunkPos chunkPos = chunkAccess.getPos(); + if (VS2ChunkAllocator.INSTANCE.isChunkInShipyardCompanion(chunkPos.x, chunkPos.z)) { + cir.setReturnValue(CompletableFuture.completedFuture(chunkAccess)); + } + } + + @Inject(method = "m_6929_", at = @At("HEAD"), cancellable = true) + private void preSpawnOriginalMobs(WorldGenRegion worldGenRegion, CallbackInfo ci) { + final ChunkPos chunkPos = worldGenRegion.getCenter(); + if (VS2ChunkAllocator.INSTANCE.isChunkInShipyardCompanion(chunkPos.x, chunkPos.z)) { + ci.cancel(); + } + } +} diff --git a/forge/src/main/resources/valkyrienskies-forge.mixins.json b/forge/src/main/resources/valkyrienskies-forge.mixins.json index 3379b2775..c678251a6 100644 --- a/forge/src/main/resources/valkyrienskies-forge.mixins.json +++ b/forge/src/main/resources/valkyrienskies-forge.mixins.json @@ -12,6 +12,7 @@ "compat.create.MixinBlocks", "compat.create.MixinControlledContraptionEntity", "compat.immersivengineering.MixinBlockEntityInventory", + "compat.tfc.MixinTFCChunkGenerator", "compat.thermalexpansion.MixinTileCoFH", "compat.tis3d.MixinInfraredPacketEntity", "compat.modular_routers.MixinContainerModularRouter", From c2e8c77b4f9017cae26f4492b606a5b21b647bc0 Mon Sep 17 00:00:00 2001 From: MrSterner <32911664+mrsterner@users.noreply.github.com> Date: Thu, 30 Nov 2023 22:25:26 +0100 Subject: [PATCH 12/52] fixed create valuebox rendering on ships (#637) --- .../create/client/MixinValueBox.java | 38 +++++++++++++++++++ .../mod/common/VSClientGameUtils.kt | 5 +++ .../valkyrienskies-common.mixins.json | 1 + .../compat/create/client/MixinValueBox.java | 25 ------------ .../valkyrienskies-fabric.mixins.json | 3 +- .../compat/create/client/MixinValueBox.java | 23 ----------- .../valkyrienskies-forge.mixins.json | 1 - 7 files changed, 45 insertions(+), 51 deletions(-) create mode 100644 common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/client/MixinValueBox.java delete mode 100644 fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/create/client/MixinValueBox.java delete mode 100644 forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/create/client/MixinValueBox.java diff --git a/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/client/MixinValueBox.java b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/client/MixinValueBox.java new file mode 100644 index 000000000..acd4792f1 --- /dev/null +++ b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/client/MixinValueBox.java @@ -0,0 +1,38 @@ +package org.valkyrienskies.mod.mixin.mod_compat.create.client; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.mojang.blaze3d.vertex.PoseStack; +import com.simibubi.create.foundation.blockEntity.behaviour.ValueBox; +import net.minecraft.client.Minecraft; +import net.minecraft.core.BlockPos; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.valkyrienskies.core.api.ships.ClientShip; +import org.valkyrienskies.mod.common.VSClientGameUtils; + +@Mixin(ValueBox.class) +public class MixinValueBox { + + @Shadow + protected BlockPos pos; + + @WrapOperation( + method = "render", + at = @At( + value = "INVOKE", + target = "Lcom/mojang/blaze3d/vertex/PoseStack;translate(DDD)V", + ordinal = 0 + ) + ) + public void wrapOpTranslate(final PoseStack instance, final double x, final double y, final double z, final Operation operation) { + final ClientShip ship = VSClientGameUtils.getClientShip(x, y, z); + if (ship != null) { + final var camera = Minecraft.getInstance().gameRenderer.getMainCamera().getPosition(); + VSClientGameUtils.transformRenderWithShip(ship.getRenderTransform(), instance, pos.getX(),pos.getY(),pos.getZ(), camera.x, camera.y, camera.z ); + } else { + operation.call(instance, x, y, z); + } + } +} diff --git a/common/src/main/kotlin/org/valkyrienskies/mod/common/VSClientGameUtils.kt b/common/src/main/kotlin/org/valkyrienskies/mod/common/VSClientGameUtils.kt index 090da4119..116d3658c 100644 --- a/common/src/main/kotlin/org/valkyrienskies/mod/common/VSClientGameUtils.kt +++ b/common/src/main/kotlin/org/valkyrienskies/mod/common/VSClientGameUtils.kt @@ -33,6 +33,11 @@ object VSClientGameUtils { } } + @JvmStatic + fun getClientShip(offsetX: Double, offsetY: Double, offsetZ: Double): ClientShip? { + return Minecraft.getInstance().level?.getShipObjectManagingPos(offsetX, offsetY, offsetZ) + } + /** * Modify the last transform of [poseStack] to be the following: * diff --git a/common/src/main/resources/valkyrienskies-common.mixins.json b/common/src/main/resources/valkyrienskies-common.mixins.json index d91a6d85b..9c5d41cef 100644 --- a/common/src/main/resources/valkyrienskies-common.mixins.json +++ b/common/src/main/resources/valkyrienskies-common.mixins.json @@ -75,6 +75,7 @@ "mod_compat.create.blockentity.MixinCrushingWheelControllerTileEntity", "mod_compat.create.blockentity.MixinEjectorTileEntity", "mod_compat.create.blockentity.MixinEncasedFanTileEntity", + "mod_compat.create.client.MixinValueBox", "mod_compat.create.entity.MixinAbstractContraptionEntity", "mod_compat.create.entity.MixinCarriageContraptionEntity", "mod_compat.create.entity.MixinControlledContraptionEntity", diff --git a/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/create/client/MixinValueBox.java b/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/create/client/MixinValueBox.java deleted file mode 100644 index b946ce720..000000000 --- a/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/create/client/MixinValueBox.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.valkyrienskies.mod.fabric.mixin.compat.create.client; - -import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.foundation.blockEntity.behaviour.ValueBox; -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.VSClientGameUtils; - -@Mixin(ValueBox.class) -public class MixinValueBox { - - @Redirect( - method = "render", - at = @At( - value = "INVOKE", - target = "Lcom/mojang/blaze3d/vertex/PoseStack;translate(DDD)V" - ), - require = 0 - ) - public void redirectTranslate(final PoseStack instance, final double x, final double y, final double z) { - VSClientGameUtils.transformRenderIfInShipyard(instance, x, y, z); - } - -} diff --git a/fabric/src/main/resources/valkyrienskies-fabric.mixins.json b/fabric/src/main/resources/valkyrienskies-fabric.mixins.json index 04d2ec57f..c646cb2f7 100644 --- a/fabric/src/main/resources/valkyrienskies-fabric.mixins.json +++ b/fabric/src/main/resources/valkyrienskies-fabric.mixins.json @@ -21,8 +21,7 @@ "compat.create.client.MixinContraptionRenderInfo", "compat.create.client.MixinCullingBlockEntityIterator", "compat.create.client.MixinFlwContraption", - "compat.create.client.MixinSuperGlueSelectionHandler", - "compat.create.client.MixinValueBox" + "compat.create.client.MixinSuperGlueSelectionHandler" ], "injectors": { "defaultRequire": 1 diff --git a/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/create/client/MixinValueBox.java b/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/create/client/MixinValueBox.java deleted file mode 100644 index cf0f8f2bb..000000000 --- a/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/create/client/MixinValueBox.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.valkyrienskies.mod.forge.mixin.compat.create.client; - -import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.foundation.blockEntity.behaviour.ValueBox; -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.VSClientGameUtils; - -@Mixin(ValueBox.class) -public class MixinValueBox { - @Redirect( - method = "render", - at = @At( - value = "INVOKE", - target = "Lcom/mojang/blaze3d/vertex/PoseStack;translate(DDD)V" - ), - require = 0 - ) - public void redirectTranslate(final PoseStack instance, final double x, final double y, final double z) { - VSClientGameUtils.transformRenderIfInShipyard(instance, x, y, z); - } -} diff --git a/forge/src/main/resources/valkyrienskies-forge.mixins.json b/forge/src/main/resources/valkyrienskies-forge.mixins.json index 34deb5e14..e029a1dcf 100644 --- a/forge/src/main/resources/valkyrienskies-forge.mixins.json +++ b/forge/src/main/resources/valkyrienskies-forge.mixins.json @@ -23,7 +23,6 @@ "compat.create.client.MixinContraptionRenderInfo", "compat.create.client.MixinFlwContraption", "compat.create.client.MixinSuperGlueSelectionHandler", - "compat.create.client.MixinValueBox", "compat.sodium.MixinRenderSectionManager", "compat.tis3d.MixinCasingTileEntityRender", "compat.tis3d.MixinRenderContextImpl" From 19a64eae2d504a5d90bc024d30a41b2f2492c74f Mon Sep 17 00:00:00 2001 From: StewStrong Date: Sat, 2 Dec 2023 01:55:49 -0700 Subject: [PATCH 13/52] Updated vs-core --- forge/build.gradle | 4 ++-- gradle.properties | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/forge/build.gradle b/forge/build.gradle index d56e4a985..11e0a1807 100644 --- a/forge/build.gradle +++ b/forge/build.gradle @@ -107,11 +107,11 @@ dependencies { transitive = false } - forgeRuntimeLibrary shadowCommon("org.valkyrienskies:physics_api_krunch:1.0.0+10c94b01e2") { + forgeRuntimeLibrary shadowCommon("org.valkyrienskies:physics_api_krunch:1.0.0+ac2c4627d7") { transitive = false } - forgeRuntimeLibrary shadowCommon("org.valkyrienskies:physics_api:1.0.0+94304c13aa") { + forgeRuntimeLibrary shadowCommon("org.valkyrienskies:physics_api:1.0.0+ef379c4c1c") { transitive = false } diff --git a/gradle.properties b/gradle.properties index 9dabb0c0e..efcd30394 100644 --- a/gradle.properties +++ b/gradle.properties @@ -11,7 +11,7 @@ forge_version=1.18.2-40.2.4 create_fabric_version=0.5.1-c-build.1092+mc1.18.2 flywheel_version_fabric=0.6.9-38 createbigcannons_version= 0.5.2-nightly-e815ca4 -vs_core_version=1.1.0+c957c12bf9 +vs_core_version=1.1.0+3ca0e01760 # Prevent kotlin from autoincluding stdlib as a dependency, which breaks # gradle's composite builds (includeBuild) for some reason. We'll add it manually kotlin.stdlib.default.dependency=false From d20ba10b654d184316ec65b11fbff0cb4b8735bd Mon Sep 17 00:00:00 2001 From: StewStrong Date: Sat, 2 Dec 2023 03:28:12 -0700 Subject: [PATCH 14/52] Updated vs-core (again :sob:) --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index efcd30394..a45897e04 100644 --- a/gradle.properties +++ b/gradle.properties @@ -11,7 +11,7 @@ forge_version=1.18.2-40.2.4 create_fabric_version=0.5.1-c-build.1092+mc1.18.2 flywheel_version_fabric=0.6.9-38 createbigcannons_version= 0.5.2-nightly-e815ca4 -vs_core_version=1.1.0+3ca0e01760 +vs_core_version=1.1.0+d0aa57abb9 # Prevent kotlin from autoincluding stdlib as a dependency, which breaks # gradle's composite builds (includeBuild) for some reason. We'll add it manually kotlin.stdlib.default.dependency=false From 17f0d50ae6ff691ccae288cc1e5813d63f94bfe7 Mon Sep 17 00:00:00 2001 From: StewStrong Date: Sun, 3 Dec 2023 01:10:43 -0700 Subject: [PATCH 15/52] Fixed compat with create 0.5.1.f --- .../mod_compat/create/MixinAirCurrent.java | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/MixinAirCurrent.java b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/MixinAirCurrent.java index 52f9d86f8..f3583f559 100644 --- a/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/MixinAirCurrent.java +++ b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/MixinAirCurrent.java @@ -94,7 +94,8 @@ private static void clipFlowLimit(Level level, BlockPos start, float max, Direct } } - @Redirect(method = "tickAffectedEntities", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/phys/AABB;intersects(Lnet/minecraft/world/phys/AABB;)Z")) + // Require 0 because this mixin doesn't work in create 0.5.1f + @Redirect(method = "tickAffectedEntities", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/phys/AABB;intersects(Lnet/minecraft/world/phys/AABB;)Z"), require = 0) private boolean redirectIntersects(AABB instance, AABB other) { Ship ship = getShip(); if (ship != null) { @@ -104,13 +105,15 @@ private boolean redirectIntersects(AABB instance, AABB other) { } else return instance.intersects(other); } + // Require 0 because this mixin doesn't work in create 0.5.1f @Inject( - method = "tickAffectedEntities", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/world/entity/Entity;getDeltaMovement()Lnet/minecraft/world/phys/Vec3;" - ), - locals = LocalCapture.CAPTURE_FAILHARD + method = "tickAffectedEntities", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/entity/Entity;getDeltaMovement()Lnet/minecraft/world/phys/Vec3;" + ), + locals = LocalCapture.CAPTURE_FAILHARD, + require = 0 ) private void harvester(Level world, Direction facing, CallbackInfo ci, Iterator iterator, Entity entity, Vec3 center, Vec3i flow, float sneakModifier, float speed, double entityDistance, float acceleration) { Ship ship = getShip(); @@ -122,8 +125,9 @@ private void harvester(Level world, Direction facing, CallbackInfo ci, Iterator< this.acceleration = acceleration; } + // Require 0 because this mixin doesn't work in create 0.5.1f @Redirect(method = "tickAffectedEntities", - at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/Entity;setDeltaMovement(Lnet/minecraft/world/phys/Vec3;)V") + at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/Entity;setDeltaMovement(Lnet/minecraft/world/phys/Vec3;)V"), require = 0 ) private void redirectSetDeltaMovement(Entity instance, Vec3 motion) { Ship ship = getShip(); @@ -138,7 +142,8 @@ private void redirectSetDeltaMovement(Entity instance, Vec3 motion) { } } - @Redirect(method = "tickAffectedEntities", at = @At(value = "INVOKE", target = "Lcom/simibubi/create/foundation/utility/VecHelper;getCenterOf(Lnet/minecraft/core/Vec3i;)Lnet/minecraft/world/phys/Vec3;"), allow = 1) + // Require 0 because this mixin doesn't work in create 0.5.1f + @Redirect(method = "tickAffectedEntities", at = @At(value = "INVOKE", target = "Lcom/simibubi/create/foundation/utility/VecHelper;getCenterOf(Lnet/minecraft/core/Vec3i;)Lnet/minecraft/world/phys/Vec3;"), allow = 1, require = 0) private Vec3 redirectGetCenterOf(Vec3i pos) { Ship ship = getShip(); Vec3 result = VecHelper.getCenterOf(pos); From 5d5cec54787e4b9a3388dbc7c04ec83ac8201d75 Mon Sep 17 00:00:00 2001 From: StewStrong Date: Sun, 3 Dec 2023 05:45:52 -0700 Subject: [PATCH 16/52] Fixed compat with create 0.5.1.f (again) --- .../mod/mixin/mod_compat/create/MixinAirCurrent.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/MixinAirCurrent.java b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/MixinAirCurrent.java index f3583f559..70c1592e9 100644 --- a/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/MixinAirCurrent.java +++ b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/MixinAirCurrent.java @@ -112,7 +112,7 @@ private boolean redirectIntersects(AABB instance, AABB other) { value = "INVOKE", target = "Lnet/minecraft/world/entity/Entity;getDeltaMovement()Lnet/minecraft/world/phys/Vec3;" ), - locals = LocalCapture.CAPTURE_FAILHARD, + locals = LocalCapture.CAPTURE_FAILSOFT, require = 0 ) private void harvester(Level world, Direction facing, CallbackInfo ci, Iterator iterator, Entity entity, Vec3 center, Vec3i flow, float sneakModifier, float speed, double entityDistance, float acceleration) { From 847537425c655a0b615051f5da7d79a907dd6754 Mon Sep 17 00:00:00 2001 From: Weromano <84074856+Weromano@users.noreply.github.com> Date: Sat, 9 Dec 2023 12:05:21 +0100 Subject: [PATCH 17/52] Update masonry.json (#646) forgot to define masses for cut sandstone and cut red sandstone --- .../resources/data/valkyrienskies/vs_mass/masonry.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/common/src/main/resources/data/valkyrienskies/vs_mass/masonry.json b/common/src/main/resources/data/valkyrienskies/vs_mass/masonry.json index bd5e2a265..a2a151ed6 100644 --- a/common/src/main/resources/data/valkyrienskies/vs_mass/masonry.json +++ b/common/src/main/resources/data/valkyrienskies/vs_mass/masonry.json @@ -4,6 +4,16 @@ "mass": 1300.0, "friction": 0.6 }, + { + "block": "minecraft:cut_red_sandstone", + "mass": 2300.0, + "friction": 0.6 + }, + { + "block": "minecraft:cut_sandstone", + "mass": 2300.0, + "friction": 0.6 + }, { "block": "minecraft:smooth_stone_slab", "mass": 1300.0, From 27bc0196bbe3c0ee54007e1315209c948866c219 Mon Sep 17 00:00:00 2001 From: StewStrong Date: Sat, 16 Dec 2023 09:34:16 -0700 Subject: [PATCH 18/52] Made ships drag jumping entities for 1 second instead of 0.5 seconds --- .../mod/common/util/EntityDraggingInformation.kt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/common/src/main/kotlin/org/valkyrienskies/mod/common/util/EntityDraggingInformation.kt b/common/src/main/kotlin/org/valkyrienskies/mod/common/util/EntityDraggingInformation.kt index 7b48e76bd..353310f39 100644 --- a/common/src/main/kotlin/org/valkyrienskies/mod/common/util/EntityDraggingInformation.kt +++ b/common/src/main/kotlin/org/valkyrienskies/mod/common/util/EntityDraggingInformation.kt @@ -23,7 +23,12 @@ class EntityDraggingInformation { var restoreCachedLastPosition = false fun isEntityBeingDraggedByAShip(): Boolean { - return (lastShipStoodOn != null) && (ticksSinceStoodOnShip < 10) && !mountedToEntity + return (lastShipStoodOn != null) && (ticksSinceStoodOnShip < TICKS_TO_DRAG_ENTITIES) && !mountedToEntity + } + + companion object { + // Max number of ticks we will drag an entity after the entity has jumped off the ship + private const val TICKS_TO_DRAG_ENTITIES = 20 } } From 88d583220f32f1675a0baa3918702e2667ea7846 Mon Sep 17 00:00:00 2001 From: StewStrong Date: Sun, 17 Dec 2023 22:18:41 -0700 Subject: [PATCH 19/52] Fixing the processUnloads() crash --- .../MixinPersistentEntitySectionManager.java | 45 ++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/common/src/main/java/org/valkyrienskies/mod/mixin/feature/shipyard_entities/MixinPersistentEntitySectionManager.java b/common/src/main/java/org/valkyrienskies/mod/mixin/feature/shipyard_entities/MixinPersistentEntitySectionManager.java index fbbaf3831..e330afdf9 100644 --- a/common/src/main/java/org/valkyrienskies/mod/mixin/feature/shipyard_entities/MixinPersistentEntitySectionManager.java +++ b/common/src/main/java/org/valkyrienskies/mod/mixin/feature/shipyard_entities/MixinPersistentEntitySectionManager.java @@ -1,17 +1,24 @@ package org.valkyrienskies.mod.mixin.feature.shipyard_entities; +import it.unimi.dsi.fastutil.longs.Long2ObjectMap; +import it.unimi.dsi.fastutil.longs.LongOpenHashSet; +import it.unimi.dsi.fastutil.longs.LongSet; +import java.util.function.LongPredicate; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.Level; import net.minecraft.world.level.entity.EntitySectionStorage; import net.minecraft.world.level.entity.PersistentEntitySectionManager; +import net.minecraft.world.level.entity.Visibility; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; import org.valkyrienskies.mod.mixinducks.world.OfLevel; @Mixin(PersistentEntitySectionManager.class) -public class MixinPersistentEntitySectionManager implements OfLevel { +public abstract class MixinPersistentEntitySectionManager implements OfLevel { @Shadow @Final EntitySectionStorage sectionStorage; @@ -29,4 +36,40 @@ public void setLevel(final Level level) { this.level = level; ((OfLevel) this.sectionStorage).setLevel(level); } + + @Shadow + @Final + private LongSet chunksToUnload; + + @Shadow + @Final + private Long2ObjectMap chunkVisibility; + + @Shadow + private boolean processChunkUnload(final long l) { + throw new IllegalStateException("This should not be invoked"); + } + + /** + * This fixes this function randomly crashing. I'm not sure why but the removeIf() function is buggy + */ + @Redirect( + method = "processUnloads", + at = @At( + value = "INVOKE", + target = "Lit/unimi/dsi/fastutil/longs/LongSet;removeIf(Ljava/util/function/LongPredicate;)Z" + ) + ) + private boolean replaceProcessUnloads(final LongSet instance, final LongPredicate longPredicate) { + final LongSet toRemove = new LongOpenHashSet(); + for (final long key : this.chunksToUnload) { + if (this.chunkVisibility.get(key) != Visibility.HIDDEN) { + toRemove.add(key); + } else if (this.processChunkUnload(key)) { + toRemove.add(key); + } + } + chunksToUnload.removeAll(toRemove); + return !toRemove.isEmpty(); + } } From 3cd460526546d1ae07533b3ad0ff3b2407c82214 Mon Sep 17 00:00:00 2001 From: StewStrong Date: Sun, 17 Dec 2023 23:41:23 -0700 Subject: [PATCH 20/52] Fixing the processUnloads() crash (pt 2) --- .../MixinPersistentEntitySectionManager.java | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/common/src/main/java/org/valkyrienskies/mod/mixin/feature/shipyard_entities/MixinPersistentEntitySectionManager.java b/common/src/main/java/org/valkyrienskies/mod/mixin/feature/shipyard_entities/MixinPersistentEntitySectionManager.java index e330afdf9..4d6aa8996 100644 --- a/common/src/main/java/org/valkyrienskies/mod/mixin/feature/shipyard_entities/MixinPersistentEntitySectionManager.java +++ b/common/src/main/java/org/valkyrienskies/mod/mixin/feature/shipyard_entities/MixinPersistentEntitySectionManager.java @@ -3,7 +3,6 @@ import it.unimi.dsi.fastutil.longs.Long2ObjectMap; import it.unimi.dsi.fastutil.longs.LongOpenHashSet; import it.unimi.dsi.fastutil.longs.LongSet; -import java.util.function.LongPredicate; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.Level; import net.minecraft.world.level.entity.EntitySectionStorage; @@ -14,7 +13,8 @@ import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.valkyrienskies.mod.mixinducks.world.OfLevel; @Mixin(PersistentEntitySectionManager.class) @@ -53,14 +53,10 @@ private boolean processChunkUnload(final long l) { /** * This fixes this function randomly crashing. I'm not sure why but the removeIf() function is buggy */ - @Redirect( - method = "processUnloads", - at = @At( - value = "INVOKE", - target = "Lit/unimi/dsi/fastutil/longs/LongSet;removeIf(Ljava/util/function/LongPredicate;)Z" - ) + @Inject( + method = "processUnloads", at = @At(value = "HEAD"), cancellable = true ) - private boolean replaceProcessUnloads(final LongSet instance, final LongPredicate longPredicate) { + private void replaceProcessUnloads(final CallbackInfo ci) { final LongSet toRemove = new LongOpenHashSet(); for (final long key : this.chunksToUnload) { if (this.chunkVisibility.get(key) != Visibility.HIDDEN) { @@ -70,6 +66,6 @@ private boolean replaceProcessUnloads(final LongSet instance, final LongPredicat } } chunksToUnload.removeAll(toRemove); - return !toRemove.isEmpty(); + ci.cancel(); } } From e1ec1529f625c2374a0d72479503c111316978eb Mon Sep 17 00:00:00 2001 From: StewStrong Date: Mon, 18 Dec 2023 05:08:21 -0700 Subject: [PATCH 21/52] Updated vs-core --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index a45897e04..bfc4bec7b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -11,7 +11,7 @@ forge_version=1.18.2-40.2.4 create_fabric_version=0.5.1-c-build.1092+mc1.18.2 flywheel_version_fabric=0.6.9-38 createbigcannons_version= 0.5.2-nightly-e815ca4 -vs_core_version=1.1.0+d0aa57abb9 +vs_core_version=1.1.0+ec4fe54cd6 # Prevent kotlin from autoincluding stdlib as a dependency, which breaks # gradle's composite builds (includeBuild) for some reason. We'll add it manually kotlin.stdlib.default.dependency=false From 4bc1b4a6753f8a974ddfa1292b8ac0675f032eba Mon Sep 17 00:00:00 2001 From: StewStrong Date: Mon, 18 Dec 2023 09:55:49 -0700 Subject: [PATCH 22/52] Added kinematic property to ships --- forge/build.gradle | 4 ++-- gradle.properties | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/forge/build.gradle b/forge/build.gradle index 11e0a1807..1f360349c 100644 --- a/forge/build.gradle +++ b/forge/build.gradle @@ -107,11 +107,11 @@ dependencies { transitive = false } - forgeRuntimeLibrary shadowCommon("org.valkyrienskies:physics_api_krunch:1.0.0+ac2c4627d7") { + forgeRuntimeLibrary shadowCommon("org.valkyrienskies:physics_api_krunch:1.0.0+7db6a103f1") { transitive = false } - forgeRuntimeLibrary shadowCommon("org.valkyrienskies:physics_api:1.0.0+ef379c4c1c") { + forgeRuntimeLibrary shadowCommon("org.valkyrienskies:physics_api:1.0.0+0ba0cc41e1") { transitive = false } diff --git a/gradle.properties b/gradle.properties index bfc4bec7b..f03017752 100644 --- a/gradle.properties +++ b/gradle.properties @@ -11,7 +11,7 @@ forge_version=1.18.2-40.2.4 create_fabric_version=0.5.1-c-build.1092+mc1.18.2 flywheel_version_fabric=0.6.9-38 createbigcannons_version= 0.5.2-nightly-e815ca4 -vs_core_version=1.1.0+ec4fe54cd6 +vs_core_version=1.1.0+c37d346883 # Prevent kotlin from autoincluding stdlib as a dependency, which breaks # gradle's composite builds (includeBuild) for some reason. We'll add it manually kotlin.stdlib.default.dependency=false From 23f71c6a3fbe9e29e1734962ec384eeb92eed9d0 Mon Sep 17 00:00:00 2001 From: StewStrong Date: Thu, 21 Dec 2023 06:09:23 -0700 Subject: [PATCH 23/52] Fixed stickers being broken --- .../create/block/MixinStickerBlock.java | 33 +++++++++++++++---- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/block/MixinStickerBlock.java b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/block/MixinStickerBlock.java index b939eed99..ab6a7a908 100644 --- a/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/block/MixinStickerBlock.java +++ b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/block/MixinStickerBlock.java @@ -18,23 +18,42 @@ @Mixin(StickerBlock.class) public abstract class MixinStickerBlock extends WrenchableDirectionalBlock implements IBE { - public MixinStickerBlock(Properties properties) { + public MixinStickerBlock(final Properties properties) { super(properties); } @Override - public void onRemove(@NotNull BlockState state, @NotNull Level world, @NotNull BlockPos pos, @NotNull BlockState newState, boolean isMoving) { + public void onRemove( + @NotNull final BlockState state, + @NotNull final Level world, + @NotNull final BlockPos pos, + @NotNull final BlockState newState, + final boolean isMoving + ) { IBE.onRemove(state, world, pos, newState); } - @Inject(method = "neighborChanged", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/state/BlockState;getValue(Lnet/minecraft/world/level/block/state/properties/Property;)Ljava/lang/Comparable;", ordinal = 0), cancellable = true) - private void injectNeighbourChanged(BlockState state, Level worldIn, BlockPos pos, Block blockIn, BlockPos fromPos, boolean isMoving, CallbackInfo ci) { - StickerBlockEntity ste = getBlockEntity(worldIn, pos); - if (ste != null && ((IMixinStickerTileEntity) ste).isAlreadyPowered(false)) { + @Inject( + method = "neighborChanged", + at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/state/BlockState;getValue(Lnet/minecraft/world/level/block/state/properties/Property;)Ljava/lang/Comparable;", ordinal = 0), + cancellable = true + ) + private void injectNeighbourChanged( + final BlockState state, + final Level worldIn, + final BlockPos pos, + final Block blockIn, + final BlockPos fromPos, + final boolean isMoving, + final CallbackInfo ci + ) { + final StickerBlockEntity ste = getBlockEntity(worldIn, pos); + // By checking `instanceof IMixinStickerTileEntity` we only run this code if Clockwork is installed + if (ste instanceof final IMixinStickerTileEntity iMixinStickerTileEntity && iMixinStickerTileEntity.isAlreadyPowered(false)) { if (!worldIn.hasNeighborSignal(pos)) { ci.cancel(); } else { - ((IMixinStickerTileEntity) ste).isAlreadyPowered(true); + iMixinStickerTileEntity.isAlreadyPowered(true); } } } From 3396e16659e98ad723a883ff91daa5704c194d08 Mon Sep 17 00:00:00 2001 From: StewStrong Date: Thu, 21 Dec 2023 19:43:53 -0700 Subject: [PATCH 24/52] Fix replaceProcessUnloads I think? --- .../MixinPersistentEntitySectionManager.java | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/common/src/main/java/org/valkyrienskies/mod/mixin/feature/shipyard_entities/MixinPersistentEntitySectionManager.java b/common/src/main/java/org/valkyrienskies/mod/mixin/feature/shipyard_entities/MixinPersistentEntitySectionManager.java index 4d6aa8996..0f7068745 100644 --- a/common/src/main/java/org/valkyrienskies/mod/mixin/feature/shipyard_entities/MixinPersistentEntitySectionManager.java +++ b/common/src/main/java/org/valkyrienskies/mod/mixin/feature/shipyard_entities/MixinPersistentEntitySectionManager.java @@ -57,15 +57,20 @@ private boolean processChunkUnload(final long l) { method = "processUnloads", at = @At(value = "HEAD"), cancellable = true ) private void replaceProcessUnloads(final CallbackInfo ci) { - final LongSet toRemove = new LongOpenHashSet(); - for (final long key : this.chunksToUnload) { - if (this.chunkVisibility.get(key) != Visibility.HIDDEN) { - toRemove.add(key); - } else if (this.processChunkUnload(key)) { - toRemove.add(key); + // I don't know why this crashes, try-catch please help me! + try { + final LongSet toRemove = new LongOpenHashSet(); + for (final long key : this.chunksToUnload) { + if (this.chunkVisibility.get(key) != Visibility.HIDDEN) { + toRemove.add(key); + } else if (this.processChunkUnload(key)) { + toRemove.add(key); + } } + chunksToUnload.removeAll(toRemove); + } catch (final Exception e) { + e.printStackTrace(); } - chunksToUnload.removeAll(toRemove); ci.cancel(); } } From 89fa9804a3ed9b6c4b6a6298177423bf39f8b224 Mon Sep 17 00:00:00 2001 From: StewStrong Date: Fri, 22 Dec 2023 04:32:40 -0700 Subject: [PATCH 25/52] Increment version --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index f03017752..6f48be23d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=1G minecraft_version=1.18.2 enabled_platforms=quilt,fabric,forge archives_base_name=valkyrienskies-118 -mod_version=2.1.1-beta.3 +mod_version=2.1.1-beta.4 maven_group=org.valkyrienskies.mod architectury_version=4.10.86 fabric_loader_version=0.14.11 From 4a0b4b3cf60a05694a611b42b0534bb81db743f6 Mon Sep 17 00:00:00 2001 From: StewStrong Date: Sat, 23 Dec 2023 06:26:21 -0700 Subject: [PATCH 26/52] Moved vs maven to the bottom to fix gradle not working --- build.gradle | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/build.gradle b/build.gradle index 22d0e5286..b21a5193d 100644 --- a/build.gradle +++ b/build.gradle @@ -93,16 +93,6 @@ subprojects { includeModule "curse.maven", "kotlinforforge-351264" } } - maven { - name = "Valkyrien Skies Internal" - url = project.vs_maven_url ?: 'https://maven.valkyrienskies.org' - if (project.vs_maven_username && project.vs_maven_password) { - credentials { - username = project.vs_maven_username - password = project.vs_maven_password - } - } - } if (!project.block_external_repositories) { mavenLocal() maven { @@ -128,6 +118,16 @@ subprojects { maven { url = "https://maven.cafeteria.dev/releases" } // Fake Player API maven { url = "https://maven.jamieswhiteshirt.com/libs-release" } // Reach Entity Attributes } + maven { + name = "Valkyrien Skies Internal" + url = project.vs_maven_url ?: 'https://maven.valkyrienskies.org' + if (project.vs_maven_username && project.vs_maven_password) { + credentials { + username = project.vs_maven_username + password = project.vs_maven_password + } + } + } } // Remove automatically added repos From 39b8d01fbb587c64dd02e5eec85779880a6486d9 Mon Sep 17 00:00:00 2001 From: StewStrong Date: Sat, 23 Dec 2023 08:05:06 -0700 Subject: [PATCH 27/52] Changed version to 2.1.2-beta.1 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 3feb1e9f7..19d98b4c7 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=1G minecraft_version=1.19.2 enabled_platforms=quilt,fabric,forge archives_base_name=valkyrienskies-119 -mod_version=2.1.2 +mod_version=2.1.2-beta.1 maven_group=org.valkyrienskies.mod # https://www.curseforge.com/minecraft/mc-mods/architectury-api/files/ From ca668561f53f1d6b75de7ca193f6db3e2ce6b776 Mon Sep 17 00:00:00 2001 From: StewStrong <83003027+StewStrong@users.noreply.github.com> Date: Sun, 24 Dec 2023 09:41:10 -0800 Subject: [PATCH 28/52] Feature/refactor ship mounting (#660) * Initial work refactoring ship mounting * Make ShipMountedToData.shipMountedTo non-nullable * Renamed ship mounted to functions * Added ShipMountedToDataProvider * Only drag entities that aren't mounted to vehicles --- .../client/renderer/MixinGameRenderer.java | 30 ++++++++++--------- .../mod/mixin/entity/MixinEntity.java | 22 ++++---------- .../sound/client/MixinSoundEngine.java | 2 +- .../MixinLevelRendererVanilla.java | 2 +- .../valkyrienskies/mod/common/VSGameUtils.kt | 29 ++++++++++-------- .../mod/common/entity/ShipMountedToData.kt | 9 ++++++ .../entity/ShipMountedToDataProvider.kt | 7 +++++ .../mod/common/util/EntityDragger.kt | 15 ++++------ .../mod/common/util/MinecraftPlayer.kt | 16 +++------- .../forge/common/ValkyrienSkiesModForge.kt | 2 +- 10 files changed, 67 insertions(+), 67 deletions(-) create mode 100644 common/src/main/kotlin/org/valkyrienskies/mod/common/entity/ShipMountedToData.kt create mode 100644 common/src/main/kotlin/org/valkyrienskies/mod/common/entity/ShipMountedToDataProvider.kt diff --git a/common/src/main/java/org/valkyrienskies/mod/mixin/client/renderer/MixinGameRenderer.java b/common/src/main/java/org/valkyrienskies/mod/mixin/client/renderer/MixinGameRenderer.java index 22578544f..8b9c6fe44 100644 --- a/common/src/main/java/org/valkyrienskies/mod/mixin/client/renderer/MixinGameRenderer.java +++ b/common/src/main/java/org/valkyrienskies/mod/mixin/client/renderer/MixinGameRenderer.java @@ -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; @@ -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()); @@ -248,12 +248,13 @@ 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); @@ -261,8 +262,6 @@ private void setupCameraWithMountedShip(final LevelRenderer instance, final Pose } // 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) { @@ -270,19 +269,22 @@ private void setupCameraWithMountedShip(final LevelRenderer instance, final Pose 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] diff --git a/common/src/main/java/org/valkyrienskies/mod/mixin/entity/MixinEntity.java b/common/src/main/java/org/valkyrienskies/mod/mixin/entity/MixinEntity.java index 6a30ff909..94b1c5eb3 100644 --- a/common/src/main/java/org/valkyrienskies/mod/mixin/entity/MixinEntity.java +++ b/common/src/main/java/org/valkyrienskies/mod/mixin/entity/MixinEntity.java @@ -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; @@ -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; @@ -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 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) { @@ -118,8 +118,7 @@ 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) ); @@ -127,15 +126,12 @@ private void preGetEyePosition(final float partialTicks, final CallbackInfoRetur 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 cir) { - final LoadedShip shipMountedTo = VSGameUtilsKt.getShipObjectEntityMountedTo(level, Entity.class.cast(this)); + final LoadedShip shipMountedTo = VSGameUtilsKt.getShipMountedTo(Entity.class.cast(this)); if (shipMountedTo == null) { return; } @@ -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(); @@ -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() { diff --git a/common/src/main/java/org/valkyrienskies/mod/mixin/feature/sound/client/MixinSoundEngine.java b/common/src/main/java/org/valkyrienskies/mod/mixin/feature/sound/client/MixinSoundEngine.java index 7c5923fe4..b0a30a022 100644 --- a/common/src/main/java/org/valkyrienskies/mod/mixin/feature/sound/client/MixinSoundEngine.java +++ b/common/src/main/java/org/valkyrienskies/mod/mixin/feature/sound/client/MixinSoundEngine.java @@ -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 { diff --git a/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/vanilla_renderer/MixinLevelRendererVanilla.java b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/vanilla_renderer/MixinLevelRendererVanilla.java index 6c9cf355c..abc72d5f5 100644 --- a/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/vanilla_renderer/MixinLevelRendererVanilla.java +++ b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/vanilla_renderer/MixinLevelRendererVanilla.java @@ -96,7 +96,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); } /** diff --git a/common/src/main/kotlin/org/valkyrienskies/mod/common/VSGameUtils.kt b/common/src/main/kotlin/org/valkyrienskies/mod/common/VSGameUtils.kt index 8a51aa7e5..f7b0e59ec 100644 --- a/common/src/main/kotlin/org/valkyrienskies/mod/common/VSGameUtils.kt +++ b/common/src/main/kotlin/org/valkyrienskies/mod/common/VSGameUtils.kt @@ -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 @@ -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? @@ -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? @@ -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) + } + 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 } diff --git a/common/src/main/kotlin/org/valkyrienskies/mod/common/entity/ShipMountedToData.kt b/common/src/main/kotlin/org/valkyrienskies/mod/common/entity/ShipMountedToData.kt new file mode 100644 index 000000000..1cdd1996c --- /dev/null +++ b/common/src/main/kotlin/org/valkyrienskies/mod/common/entity/ShipMountedToData.kt @@ -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, +) diff --git a/common/src/main/kotlin/org/valkyrienskies/mod/common/entity/ShipMountedToDataProvider.kt b/common/src/main/kotlin/org/valkyrienskies/mod/common/entity/ShipMountedToDataProvider.kt new file mode 100644 index 000000000..4ea6fbb41 --- /dev/null +++ b/common/src/main/kotlin/org/valkyrienskies/mod/common/entity/ShipMountedToDataProvider.kt @@ -0,0 +1,7 @@ +package org.valkyrienskies.mod.common.entity + +import net.minecraft.world.entity.Entity + +interface ShipMountedToDataProvider { + fun provideShipMountedToData(passenger: Entity): ShipMountedToData? +} diff --git a/common/src/main/kotlin/org/valkyrienskies/mod/common/util/EntityDragger.kt b/common/src/main/kotlin/org/valkyrienskies/mod/common/util/EntityDragger.kt index 425ef4c48..2c6e4bf5f 100644 --- a/common/src/main/kotlin/org/valkyrienskies/mod/common/util/EntityDragger.kt +++ b/common/src/main/kotlin/org/valkyrienskies/mod/common/util/EntityDragger.kt @@ -4,7 +4,6 @@ import net.minecraft.server.level.ServerPlayer import net.minecraft.world.entity.Entity import org.joml.Vector3d import org.joml.Vector3dc -import org.valkyrienskies.mod.common.getShipObjectEntityMountedTo import org.valkyrienskies.mod.common.shipObjectWorld import kotlin.math.asin import kotlin.math.atan2 @@ -13,17 +12,13 @@ import kotlin.math.sin object EntityDragger { // How much we decay the addedMovement each tick after player hasn't collided with a ship for at least 10 ticks. - private const val addedMovementDecay = 0.9 + private const val ADDED_MOVEMENT_DECAY = 0.9 /** * Drag these entities with the ship they're standing on. */ fun dragEntitiesWithShips(entities: Iterable) { entities.forEach { entity -> - val shipMountedTo = entity.level.getShipObjectEntityMountedTo(entity) - // Don't drag entities that are already mounted to a ship - if (shipMountedTo != null) return@forEach - val entityDraggingInformation = (entity as IEntityDraggingInformationProvider).draggingInformation var dragTheEntity = false @@ -31,7 +26,9 @@ object EntityDragger { var addedYRot = 0.0 val shipDraggingEntity = entityDraggingInformation.lastShipStoodOn - if (shipDraggingEntity != null) { + + // Only drag entities that aren't mounted to vehicles + if (shipDraggingEntity != null && entity.vehicle == null) { if (entityDraggingInformation.isEntityBeingDraggedByAShip()) { // Compute how much we should drag the entity val shipData = entity.level.shipObjectWorld.allShips.getById(shipDraggingEntity) @@ -87,8 +84,8 @@ object EntityDragger { } else { dragTheEntity = true addedMovement = entityDraggingInformation.addedMovementLastTick - .mul(addedMovementDecay, Vector3d()) - addedYRot = entityDraggingInformation.addedYawRotLastTick * addedMovementDecay + .mul(ADDED_MOVEMENT_DECAY, Vector3d()) + addedYRot = entityDraggingInformation.addedYawRotLastTick * ADDED_MOVEMENT_DECAY } } diff --git a/common/src/main/kotlin/org/valkyrienskies/mod/common/util/MinecraftPlayer.kt b/common/src/main/kotlin/org/valkyrienskies/mod/common/util/MinecraftPlayer.kt index 9a0397035..603227d92 100644 --- a/common/src/main/kotlin/org/valkyrienskies/mod/common/util/MinecraftPlayer.kt +++ b/common/src/main/kotlin/org/valkyrienskies/mod/common/util/MinecraftPlayer.kt @@ -2,14 +2,11 @@ package org.valkyrienskies.mod.common.util import net.minecraft.world.entity.player.Player import org.joml.Vector3d -import org.joml.Vector3dc -import org.valkyrienskies.core.api.ships.properties.ShipId import org.valkyrienskies.core.apigame.world.IPlayer import org.valkyrienskies.core.apigame.world.PlayerState import org.valkyrienskies.core.apigame.world.properties.DimensionId import org.valkyrienskies.mod.common.dimensionId -import org.valkyrienskies.mod.common.getPassengerPos -import org.valkyrienskies.mod.common.getShipObjectEntityMountedTo +import org.valkyrienskies.mod.common.getShipMountedToData import org.valkyrienskies.mod.common.vsCore import java.lang.ref.WeakReference import java.util.UUID @@ -40,18 +37,13 @@ class MinecraftPlayer(playerObject: Player) : IPlayer { } override fun getPlayerState(): PlayerState { - var mountedShip: ShipId? = null - var mountedPos: Vector3dc? = null - player.level.getShipObjectEntityMountedTo(player)?.let { - mountedShip = it.id - mountedPos = player.vehicle!!.getPassengerPos(player.myRidingOffset, 0.0f) - } + val mountedShipAndPos = getShipMountedToData(player) return PlayerState( Vector3d(player.x, player.y, player.z), Vector3d(Vector3d(player.x - player.xo, player.y - player.yo, player.z - player.zo)), dimension, - mountedShip, - mountedPos, + mountedShipAndPos?.shipMountedTo?.id, + mountedShipAndPos?.mountPosInShip, ) } diff --git a/forge/src/main/kotlin/org/valkyrienskies/mod/forge/common/ValkyrienSkiesModForge.kt b/forge/src/main/kotlin/org/valkyrienskies/mod/forge/common/ValkyrienSkiesModForge.kt index 1906df862..9591baa35 100644 --- a/forge/src/main/kotlin/org/valkyrienskies/mod/forge/common/ValkyrienSkiesModForge.kt +++ b/forge/src/main/kotlin/org/valkyrienskies/mod/forge/common/ValkyrienSkiesModForge.kt @@ -76,7 +76,7 @@ class ValkyrienSkiesModForge { val vsCore = if (isClient) { VSCoreFactory.instance.newVsCoreClient(ForgeHooksImpl) } else { - org.valkyrienskies.core.apigame.VSCoreFactory.instance.newVsCoreServer(ForgeHooksImpl) + VSCoreFactory.instance.newVsCoreServer(ForgeHooksImpl) } VSForgeNetworking.registerPacketHandlers(vsCore.hooks) From cbbadd397b0d0fdf330d8b02b65756a5193bdd71 Mon Sep 17 00:00:00 2001 From: StewStrong Date: Sun, 24 Dec 2023 11:50:10 -0700 Subject: [PATCH 29/52] Added partialTicks to ShipMountedToDataProvider.provideShipMountedToData() --- .../main/kotlin/org/valkyrienskies/mod/common/VSGameUtils.kt | 2 +- .../mod/common/entity/ShipMountedToDataProvider.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/common/src/main/kotlin/org/valkyrienskies/mod/common/VSGameUtils.kt b/common/src/main/kotlin/org/valkyrienskies/mod/common/VSGameUtils.kt index f7b0e59ec..9368ad3fd 100644 --- a/common/src/main/kotlin/org/valkyrienskies/mod/common/VSGameUtils.kt +++ b/common/src/main/kotlin/org/valkyrienskies/mod/common/VSGameUtils.kt @@ -412,7 +412,7 @@ fun Level.transformAabbToWorld(aabb: AABBdc, dest: AABBd): AABBd { fun getShipMountedToData(passenger: Entity, partialTicks: Float? = null): ShipMountedToData? { val vehicle = passenger.vehicle ?: return null if (vehicle is ShipMountedToDataProvider) { - return vehicle.provideShipMountedToData(passenger) + return vehicle.provideShipMountedToData(passenger, partialTicks) } val shipObjectEntityMountedTo = passenger.level.getShipObjectManagingPos(vehicle.position().toJOML()) ?: return null val mountedPosInShip: Vector3dc = vehicle.getPosition(partialTicks ?: 0.0f) diff --git a/common/src/main/kotlin/org/valkyrienskies/mod/common/entity/ShipMountedToDataProvider.kt b/common/src/main/kotlin/org/valkyrienskies/mod/common/entity/ShipMountedToDataProvider.kt index 4ea6fbb41..852499f0b 100644 --- a/common/src/main/kotlin/org/valkyrienskies/mod/common/entity/ShipMountedToDataProvider.kt +++ b/common/src/main/kotlin/org/valkyrienskies/mod/common/entity/ShipMountedToDataProvider.kt @@ -3,5 +3,5 @@ package org.valkyrienskies.mod.common.entity import net.minecraft.world.entity.Entity interface ShipMountedToDataProvider { - fun provideShipMountedToData(passenger: Entity): ShipMountedToData? + fun provideShipMountedToData(passenger: Entity, partialTicks: Float?): ShipMountedToData? } From fbad5cbf7076af6b94b2d78247bd0c49bb069e82 Mon Sep 17 00:00:00 2001 From: StewStrong Date: Sun, 24 Dec 2023 14:12:24 -0700 Subject: [PATCH 30/52] Make it possible to disable Contraption positionRider changes --- .../MixinAbstractContraptionEntity.java | 30 +++++++++++-------- ...xinAbstractContraptionEntityDuckFlags.java | 5 ++++ 2 files changed, 22 insertions(+), 13 deletions(-) create mode 100644 common/src/main/java/org/valkyrienskies/mod/mixinducks/mod_compat/create/MixinAbstractContraptionEntityDuckFlags.java diff --git a/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/entity/MixinAbstractContraptionEntity.java b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/entity/MixinAbstractContraptionEntity.java index f8511fd70..0bc6f8637 100644 --- a/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/entity/MixinAbstractContraptionEntity.java +++ b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/entity/MixinAbstractContraptionEntity.java @@ -2,6 +2,7 @@ import static org.valkyrienskies.mod.common.util.VectorConversionsMCKt.toJOML; import static org.valkyrienskies.mod.common.util.VectorConversionsMCKt.toMinecraft; +import static org.valkyrienskies.mod.mixinducks.mod_compat.create.MixinAbstractContraptionEntityDuckFlags.ENABLE_DEFAULT_VS_CONTRAPTION_FIX; import com.simibubi.create.AllMovementBehaviours; import com.simibubi.create.content.contraptions.AbstractContraptionEntity; @@ -106,21 +107,24 @@ 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))); + @Inject(method = "positionRider", at = @At("HEAD"), cancellable = true) + public void prePositionRider(final Entity passenger, final MoveFunction callback, final CallbackInfo ci) { + if (ENABLE_DEFAULT_VS_CONTRAPTION_FIX) { + ci.cancel(); + if (!hasPassenger(passenger)) + return; + Vec3 riderPos = getPassengerPosition(passenger, 1); + if (riderPos == null) + return; + if (!(passenger instanceof OrientedContraptionEntity)) { + final 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); } - passenger.setPos(riderPos); } @Inject(method = "toGlobalVector(Lnet/minecraft/world/phys/Vec3;FZ)Lnet/minecraft/world/phys/Vec3;", diff --git a/common/src/main/java/org/valkyrienskies/mod/mixinducks/mod_compat/create/MixinAbstractContraptionEntityDuckFlags.java b/common/src/main/java/org/valkyrienskies/mod/mixinducks/mod_compat/create/MixinAbstractContraptionEntityDuckFlags.java new file mode 100644 index 000000000..42d2c05be --- /dev/null +++ b/common/src/main/java/org/valkyrienskies/mod/mixinducks/mod_compat/create/MixinAbstractContraptionEntityDuckFlags.java @@ -0,0 +1,5 @@ +package org.valkyrienskies.mod.mixinducks.mod_compat.create; + +public class MixinAbstractContraptionEntityDuckFlags { + public static boolean ENABLE_DEFAULT_VS_CONTRAPTION_FIX = true; +} From d9d9a3e3ddabb6c90390ef0feaf97a5615554115 Mon Sep 17 00:00:00 2001 From: StewStrong Date: Sun, 24 Dec 2023 14:43:34 -0700 Subject: [PATCH 31/52] Removed positionRider code from MixinAbstractContraptionEntity --- .../MixinAbstractContraptionEntity.java | 24 ------------------- ...xinAbstractContraptionEntityDuckFlags.java | 5 ---- 2 files changed, 29 deletions(-) delete mode 100644 common/src/main/java/org/valkyrienskies/mod/mixinducks/mod_compat/create/MixinAbstractContraptionEntityDuckFlags.java diff --git a/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/entity/MixinAbstractContraptionEntity.java b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/entity/MixinAbstractContraptionEntity.java index 0bc6f8637..3bb776a09 100644 --- a/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/entity/MixinAbstractContraptionEntity.java +++ b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/entity/MixinAbstractContraptionEntity.java @@ -2,14 +2,12 @@ import static org.valkyrienskies.mod.common.util.VectorConversionsMCKt.toJOML; import static org.valkyrienskies.mod.common.util.VectorConversionsMCKt.toMinecraft; -import static org.valkyrienskies.mod.mixinducks.mod_compat.create.MixinAbstractContraptionEntityDuckFlags.ENABLE_DEFAULT_VS_CONTRAPTION_FIX; import com.simibubi.create.AllMovementBehaviours; import com.simibubi.create.content.contraptions.AbstractContraptionEntity; import com.simibubi.create.content.contraptions.Contraption; import com.simibubi.create.content.contraptions.OrientedContraptionEntity; 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; @@ -105,28 +103,6 @@ private void redirectTeleportTo(Entity instance, double x, double y, double z) { } } - //Region end - //Region start - fix entity rider position on ship contraptions - @Inject(method = "positionRider", at = @At("HEAD"), cancellable = true) - public void prePositionRider(final Entity passenger, final MoveFunction callback, final CallbackInfo ci) { - if (ENABLE_DEFAULT_VS_CONTRAPTION_FIX) { - ci.cancel(); - if (!hasPassenger(passenger)) - return; - Vec3 riderPos = getPassengerPosition(passenger, 1); - if (riderPos == null) - return; - if (!(passenger instanceof OrientedContraptionEntity)) { - final 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 cir) { diff --git a/common/src/main/java/org/valkyrienskies/mod/mixinducks/mod_compat/create/MixinAbstractContraptionEntityDuckFlags.java b/common/src/main/java/org/valkyrienskies/mod/mixinducks/mod_compat/create/MixinAbstractContraptionEntityDuckFlags.java deleted file mode 100644 index 42d2c05be..000000000 --- a/common/src/main/java/org/valkyrienskies/mod/mixinducks/mod_compat/create/MixinAbstractContraptionEntityDuckFlags.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.valkyrienskies.mod.mixinducks.mod_compat.create; - -public class MixinAbstractContraptionEntityDuckFlags { - public static boolean ENABLE_DEFAULT_VS_CONTRAPTION_FIX = true; -} From b9cf9beec9c96269521e68905b65e24d4d6f5e6d Mon Sep 17 00:00:00 2001 From: StewStrong Date: Sun, 24 Dec 2023 15:52:05 -0700 Subject: [PATCH 32/52] Use ShipMountedToData when rendering entities --- .../MixinEntityRenderDispatcher.java | 65 +++++++++++++------ 1 file changed, 46 insertions(+), 19 deletions(-) diff --git a/common/src/main/java/org/valkyrienskies/mod/mixin/feature/shipyard_entities/MixinEntityRenderDispatcher.java b/common/src/main/java/org/valkyrienskies/mod/mixin/feature/shipyard_entities/MixinEntityRenderDispatcher.java index c04a1fe09..73c857a0b 100644 --- a/common/src/main/java/org/valkyrienskies/mod/mixin/feature/shipyard_entities/MixinEntityRenderDispatcher.java +++ b/common/src/main/java/org/valkyrienskies/mod/mixin/feature/shipyard_entities/MixinEntityRenderDispatcher.java @@ -8,6 +8,9 @@ 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; @@ -15,7 +18,9 @@ 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; @@ -32,27 +37,49 @@ 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 entityRenderer) { + final EntityRenderer entityRenderer + ) { + final ShipMountedToData shipMountedToData = VSGameUtilsKt.getShipMountedToData(entity, partialTicks); - final ClientShip ship = - (ClientShip) VSGameUtilsKt.getShipObjectManagingPos(entity.level, entity.blockPosition()); - if (ship != null) { - // Remove the earlier applied translation - matrixStack.popPose(); - matrixStack.pushPose(); + if (shipMountedToData != null) { + final ShipTransform renderTransform = ((ClientShip) shipMountedToData.getShipMountedTo()).getRenderTransform(); - 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 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); + } } } } From ee9a5f30fe068ce87eadffbd640448d4a3abcece Mon Sep 17 00:00:00 2001 From: StewStrong Date: Sun, 24 Dec 2023 16:05:45 -0700 Subject: [PATCH 33/52] Added code I forgot --- .../shipyard_entities/MixinEntityRenderDispatcher.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/common/src/main/java/org/valkyrienskies/mod/mixin/feature/shipyard_entities/MixinEntityRenderDispatcher.java b/common/src/main/java/org/valkyrienskies/mod/mixin/feature/shipyard_entities/MixinEntityRenderDispatcher.java index 73c857a0b..95a93dc7a 100644 --- a/common/src/main/java/org/valkyrienskies/mod/mixin/feature/shipyard_entities/MixinEntityRenderDispatcher.java +++ b/common/src/main/java/org/valkyrienskies/mod/mixin/feature/shipyard_entities/MixinEntityRenderDispatcher.java @@ -42,6 +42,10 @@ void render( final ShipMountedToData shipMountedToData = VSGameUtilsKt.getShipMountedToData(entity, partialTicks); if (shipMountedToData != null) { + // Remove the earlier applied translation + matrixStack.popPose(); + matrixStack.pushPose(); + final ShipTransform renderTransform = ((ClientShip) shipMountedToData.getShipMountedTo()).getRenderTransform(); final Vec3 entityPosition = entity.getPosition(partialTicks); From c877334879d0a424bbd8097f342dae8c2507e822 Mon Sep 17 00:00:00 2001 From: StewStrong Date: Sun, 24 Dec 2023 16:20:54 -0700 Subject: [PATCH 34/52] Increment version --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 6f48be23d..8e6bc5338 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=1G minecraft_version=1.18.2 enabled_platforms=quilt,fabric,forge archives_base_name=valkyrienskies-118 -mod_version=2.1.1-beta.4 +mod_version=2.1.1-beta.5 maven_group=org.valkyrienskies.mod architectury_version=4.10.86 fabric_loader_version=0.14.11 From b10a02f5db542c9e78e8cf7de0ef963dc047be63 Mon Sep 17 00:00:00 2001 From: MrSterner <32911664+mrsterner@users.noreply.github.com> Date: Tue, 26 Dec 2023 15:49:52 +0100 Subject: [PATCH 35/52] fixed create valuebox rendering, on 1.18 (#662) --- .../create/client/MixinValueBox.java | 39 +++++++++++++++++++ .../mod/common/VSClientGameUtils.kt | 5 +++ .../valkyrienskies-common.mixins.json | 1 + .../compat/create/client/MixinValueBox.java | 25 ------------ .../valkyrienskies-fabric.mixins.json | 3 +- .../compat/create/client/MixinValueBox.java | 23 ----------- .../valkyrienskies-forge.mixins.json | 1 - 7 files changed, 46 insertions(+), 51 deletions(-) create mode 100644 common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/client/MixinValueBox.java delete mode 100644 fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/create/client/MixinValueBox.java delete mode 100644 forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/create/client/MixinValueBox.java diff --git a/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/client/MixinValueBox.java b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/client/MixinValueBox.java new file mode 100644 index 000000000..9a1f3f327 --- /dev/null +++ b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/client/MixinValueBox.java @@ -0,0 +1,39 @@ +package org.valkyrienskies.mod.mixin.mod_compat.create.client; + + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.mojang.blaze3d.vertex.PoseStack; +import com.simibubi.create.foundation.blockEntity.behaviour.ValueBox; +import net.minecraft.client.Minecraft; +import net.minecraft.core.BlockPos; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.valkyrienskies.core.api.ships.ClientShip; +import org.valkyrienskies.mod.common.VSClientGameUtils; + +@Mixin(ValueBox.class) +public class MixinValueBox { + + @Shadow + protected BlockPos pos; + + @WrapOperation( + method = "render", + at = @At( + value = "INVOKE", + target = "Lcom/mojang/blaze3d/vertex/PoseStack;translate(DDD)V", + ordinal = 0 + ) + ) + public void wrapOpTranslate(final PoseStack instance, final double x, final double y, final double z, final Operation operation) { + final ClientShip ship = VSClientGameUtils.getClientShip(x, y, z); + if (ship != null) { + final var camera = Minecraft.getInstance().gameRenderer.getMainCamera().getPosition(); + VSClientGameUtils.transformRenderWithShip(ship.getRenderTransform(), instance, pos.getX(),pos.getY(),pos.getZ(), camera.x, camera.y, camera.z ); + } else { + operation.call(instance, x, y, z); + } + } +} diff --git a/common/src/main/kotlin/org/valkyrienskies/mod/common/VSClientGameUtils.kt b/common/src/main/kotlin/org/valkyrienskies/mod/common/VSClientGameUtils.kt index 090da4119..116d3658c 100644 --- a/common/src/main/kotlin/org/valkyrienskies/mod/common/VSClientGameUtils.kt +++ b/common/src/main/kotlin/org/valkyrienskies/mod/common/VSClientGameUtils.kt @@ -33,6 +33,11 @@ object VSClientGameUtils { } } + @JvmStatic + fun getClientShip(offsetX: Double, offsetY: Double, offsetZ: Double): ClientShip? { + return Minecraft.getInstance().level?.getShipObjectManagingPos(offsetX, offsetY, offsetZ) + } + /** * Modify the last transform of [poseStack] to be the following: * diff --git a/common/src/main/resources/valkyrienskies-common.mixins.json b/common/src/main/resources/valkyrienskies-common.mixins.json index 6b270cb06..b5c68eae8 100644 --- a/common/src/main/resources/valkyrienskies-common.mixins.json +++ b/common/src/main/resources/valkyrienskies-common.mixins.json @@ -77,6 +77,7 @@ "mod_compat.create.blockentity.MixinCrushingWheelControllerTileEntity", "mod_compat.create.blockentity.MixinEjectorTileEntity", "mod_compat.create.blockentity.MixinEncasedFanTileEntity", + "mod_compat.create.client.MixinValueBox", "mod_compat.create.entity.MixinAbstractContraptionEntity", "mod_compat.create.entity.MixinCarriageContraptionEntity", "mod_compat.create.entity.MixinControlledContraptionEntity", diff --git a/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/create/client/MixinValueBox.java b/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/create/client/MixinValueBox.java deleted file mode 100644 index b946ce720..000000000 --- a/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/compat/create/client/MixinValueBox.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.valkyrienskies.mod.fabric.mixin.compat.create.client; - -import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.foundation.blockEntity.behaviour.ValueBox; -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.VSClientGameUtils; - -@Mixin(ValueBox.class) -public class MixinValueBox { - - @Redirect( - method = "render", - at = @At( - value = "INVOKE", - target = "Lcom/mojang/blaze3d/vertex/PoseStack;translate(DDD)V" - ), - require = 0 - ) - public void redirectTranslate(final PoseStack instance, final double x, final double y, final double z) { - VSClientGameUtils.transformRenderIfInShipyard(instance, x, y, z); - } - -} diff --git a/fabric/src/main/resources/valkyrienskies-fabric.mixins.json b/fabric/src/main/resources/valkyrienskies-fabric.mixins.json index 59ece5b8c..2cbfecb71 100644 --- a/fabric/src/main/resources/valkyrienskies-fabric.mixins.json +++ b/fabric/src/main/resources/valkyrienskies-fabric.mixins.json @@ -20,8 +20,7 @@ "compat.create.client.MixinContraptionRenderInfo", "compat.create.client.MixinCullingBlockEntityIterator", "compat.create.client.MixinFlwContraption", - "compat.create.client.MixinSuperGlueSelectionHandler", - "compat.create.client.MixinValueBox" + "compat.create.client.MixinSuperGlueSelectionHandler" ], "injectors": { "defaultRequire": 1 diff --git a/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/create/client/MixinValueBox.java b/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/create/client/MixinValueBox.java deleted file mode 100644 index cf0f8f2bb..000000000 --- a/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/compat/create/client/MixinValueBox.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.valkyrienskies.mod.forge.mixin.compat.create.client; - -import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.foundation.blockEntity.behaviour.ValueBox; -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.VSClientGameUtils; - -@Mixin(ValueBox.class) -public class MixinValueBox { - @Redirect( - method = "render", - at = @At( - value = "INVOKE", - target = "Lcom/mojang/blaze3d/vertex/PoseStack;translate(DDD)V" - ), - require = 0 - ) - public void redirectTranslate(final PoseStack instance, final double x, final double y, final double z) { - VSClientGameUtils.transformRenderIfInShipyard(instance, x, y, z); - } -} diff --git a/forge/src/main/resources/valkyrienskies-forge.mixins.json b/forge/src/main/resources/valkyrienskies-forge.mixins.json index c678251a6..4423ab23b 100644 --- a/forge/src/main/resources/valkyrienskies-forge.mixins.json +++ b/forge/src/main/resources/valkyrienskies-forge.mixins.json @@ -25,7 +25,6 @@ "compat.create.client.MixinContraptionRenderInfo", "compat.create.client.MixinFlwContraption", "compat.create.client.MixinSuperGlueSelectionHandler", - "compat.create.client.MixinValueBox", "compat.sodium.MixinRenderSectionManager", "compat.tis3d.MixinCasingTileEntityRender", "compat.tis3d.MixinRenderContextImpl" From 2e0c5438328c380829817e3a26a8184eb3473eef Mon Sep 17 00:00:00 2001 From: StewStrong Date: Wed, 27 Dec 2023 15:55:33 -0700 Subject: [PATCH 36/52] Fixed enabling collision between ships not working --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 8e6bc5338..4d2d3c1de 100644 --- a/gradle.properties +++ b/gradle.properties @@ -11,7 +11,7 @@ forge_version=1.18.2-40.2.4 create_fabric_version=0.5.1-c-build.1092+mc1.18.2 flywheel_version_fabric=0.6.9-38 createbigcannons_version= 0.5.2-nightly-e815ca4 -vs_core_version=1.1.0+c37d346883 +vs_core_version=1.1.0+b19b27c4a4 # Prevent kotlin from autoincluding stdlib as a dependency, which breaks # gradle's composite builds (includeBuild) for some reason. We'll add it manually kotlin.stdlib.default.dependency=false From 72fac3232e20f1179b53d586f7825ab77f233ff4 Mon Sep 17 00:00:00 2001 From: StewStrong Date: Thu, 28 Dec 2023 10:13:44 -0700 Subject: [PATCH 37/52] Catch setWingGroupTransform() throwing an exception --- .../create/entity/MixinAbstractContraptionEntity.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/entity/MixinAbstractContraptionEntity.java b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/entity/MixinAbstractContraptionEntity.java index 3bb776a09..da842738a 100644 --- a/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/entity/MixinAbstractContraptionEntity.java +++ b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/entity/MixinAbstractContraptionEntity.java @@ -282,8 +282,14 @@ private void postTick(final CallbackInfo ci) { final LoadedServerShip ship = VSGameUtilsKt.getShipObjectManagingPos(serverLevel, VectorConversionsMCKt.toJOML(thisAsAbstractContraptionEntity.position())); if (ship != null) { - // This can happen if a player moves a train contraption from ship to world using a wrench - ship.getAttachment(WingManager.class).setWingGroupTransform(wingGroupId, computeContraptionWingTransform()); + try { + // This can happen if a player moves a train contraption from ship to world using a wrench + ship.getAttachment(WingManager.class) + .setWingGroupTransform(wingGroupId, computeContraptionWingTransform()); + } catch (final Exception e) { + // I'm not sure why, but this fails sometimes. For now just catch the error and print it + e.printStackTrace(); + } } } } From cf2626161b3185c4e337ac3904778859727894dd Mon Sep 17 00:00:00 2001 From: MrSterner <32911664+mrsterner@users.noreply.github.com> Date: Sat, 30 Dec 2023 10:53:01 +0100 Subject: [PATCH 38/52] added a null check and fixed missing parenthesis (#651) * fixed create valuebox rendering on ships * hm forgot () * hm forgot a inject :skull: * hm forgot a inject :skull: * added back the `block_external_repositories` --- .gitignore | 1 + .../mod/mixin/client/MixinMinecraft.java | 10 ++++++++++ .../seamless_copy/MixinClientPacketListener.java | 2 +- fabric/build.gradle | 6 +++--- gradle.properties | 4 ++-- 5 files changed, 17 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index 299156b30..e6b122f2a 100644 --- a/.gitignore +++ b/.gitignore @@ -39,3 +39,4 @@ forge*changelog.txt # Files generated for Fabric /fabric/src/generated/ +/.architectury-transformer/debug.log diff --git a/common/src/main/java/org/valkyrienskies/mod/mixin/client/MixinMinecraft.java b/common/src/main/java/org/valkyrienskies/mod/mixin/client/MixinMinecraft.java index 424b4f52a..691fd4cda 100644 --- a/common/src/main/java/org/valkyrienskies/mod/mixin/client/MixinMinecraft.java +++ b/common/src/main/java/org/valkyrienskies/mod/mixin/client/MixinMinecraft.java @@ -159,4 +159,14 @@ public void deleteShipObjectWorldClient() { shipObjectWorldCopy.destroyWorld(); shipObjectWorld = null; } + + @Inject( + method = "clearLevel", + at = @At("TAIL") + ) + private void postClearLevel(final CallbackInfo ci) { + if (shipObjectWorld != null) { + deleteShipObjectWorldClient(); + } + } } diff --git a/common/src/main/java/org/valkyrienskies/mod/mixin/feature/seamless_copy/MixinClientPacketListener.java b/common/src/main/java/org/valkyrienskies/mod/mixin/feature/seamless_copy/MixinClientPacketListener.java index e065d72a6..049d4369d 100644 --- a/common/src/main/java/org/valkyrienskies/mod/mixin/feature/seamless_copy/MixinClientPacketListener.java +++ b/common/src/main/java/org/valkyrienskies/mod/mixin/feature/seamless_copy/MixinClientPacketListener.java @@ -63,7 +63,7 @@ private void beforeClose(final CallbackInfo ci) { cancellable = true ) private void beforeHandleLevelChunk(final ClientboundLevelChunkWithLightPacket packet, final CallbackInfo ci) { - if (chunks.queue(packet.getX(), packet.getZ(), packet, level)) { + if (level != null && chunks.queue(packet.getX(), packet.getZ(), packet, level)) { ci.cancel(); } } diff --git a/fabric/build.gradle b/fabric/build.gradle index 0f2c84234..207057909 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -63,9 +63,9 @@ dependencies { } // CC Restitched - modImplementation("curse.maven:cc-restitched-462672:3908334"){ - exclude module: "jsonschema.module.addon" - } + //modImplementation("curse.maven:cc-restitched-462672:3908334"){ + // exclude module: "jsonschema.module.addon" + //} // CC Restitched //modImplementation("curse.maven:cc-tweaked-282001:${cc_tweaked_version}") diff --git a/gradle.properties b/gradle.properties index f6bf0becc..6294a666b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=1G minecraft_version=1.20.1 enabled_platforms=quilt,fabric,forge archives_base_name=valkyrienskies-120 -mod_version=2.1.4 +mod_version=2.1.6 maven_group=org.valkyrienskies.mod # https://www.curseforge.com/minecraft/mc-mods/architectury-api/files/ @@ -26,7 +26,7 @@ flywheel_version_fabric=0.6.9-6 # https://modrinth.com/mod/create-big-cannons/versions createbigcannons_version= 0.5.2.a -vs_core_version=1.1.0+f2a6aaad81 +vs_core_version=1.1.0+d0aa57abb9 # Prevent kotlin from autoincluding stdlib as a dependency, which breaks # gradle's composite builds (includeBuild) for some reason. We'll add it manually kotlin.stdlib.default.dependency=false From cb72d0f763fe0877176f58c901931079384b6f52 Mon Sep 17 00:00:00 2001 From: MrSterner <32911664+mrsterner@users.noreply.github.com> Date: Sat, 30 Dec 2023 16:31:12 +0100 Subject: [PATCH 39/52] loot container dupe fix (#668) * fixed create valuebox rendering on ships * loot container dupe fix --- .../kotlin/org/valkyrienskies/mod/util/RelocationUtil.kt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/common/src/main/kotlin/org/valkyrienskies/mod/util/RelocationUtil.kt b/common/src/main/kotlin/org/valkyrienskies/mod/util/RelocationUtil.kt index 8dfc6199c..099b846a5 100644 --- a/common/src/main/kotlin/org/valkyrienskies/mod/util/RelocationUtil.kt +++ b/common/src/main/kotlin/org/valkyrienskies/mod/util/RelocationUtil.kt @@ -6,6 +6,7 @@ import net.minecraft.world.level.Level import net.minecraft.world.level.block.Blocks import net.minecraft.world.level.block.Rotation import net.minecraft.world.level.block.Rotation.NONE +import net.minecraft.world.level.block.entity.RandomizableContainerBlockEntity import net.minecraft.world.level.block.state.BlockState import net.minecraft.world.level.chunk.LevelChunk import org.valkyrienskies.core.api.ships.ServerShip @@ -40,6 +41,11 @@ fun relocateBlock( it.clearContent() } + // so loot containers dont drop its content + if (it is RandomizableContainerBlockEntity) { + it.setLootTable(null, 0) + } + tag } From 02c6c71138b0a90b7e08d083e4abc8223bad15a3 Mon Sep 17 00:00:00 2001 From: MrSterner <32911664+mrsterner@users.noreply.github.com> Date: Sat, 30 Dec 2023 16:31:23 +0100 Subject: [PATCH 40/52] loot container dupe fix (#669) * fixed create valuebox rendering on ships * hm forgot () * hm forgot a inject :skull: * hm forgot a inject :skull: * added back the `block_external_repositories` * loot container dupe fix --- .../kotlin/org/valkyrienskies/mod/util/RelocationUtil.kt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/common/src/main/kotlin/org/valkyrienskies/mod/util/RelocationUtil.kt b/common/src/main/kotlin/org/valkyrienskies/mod/util/RelocationUtil.kt index 8dfc6199c..099b846a5 100644 --- a/common/src/main/kotlin/org/valkyrienskies/mod/util/RelocationUtil.kt +++ b/common/src/main/kotlin/org/valkyrienskies/mod/util/RelocationUtil.kt @@ -6,6 +6,7 @@ import net.minecraft.world.level.Level import net.minecraft.world.level.block.Blocks import net.minecraft.world.level.block.Rotation import net.minecraft.world.level.block.Rotation.NONE +import net.minecraft.world.level.block.entity.RandomizableContainerBlockEntity import net.minecraft.world.level.block.state.BlockState import net.minecraft.world.level.chunk.LevelChunk import org.valkyrienskies.core.api.ships.ServerShip @@ -40,6 +41,11 @@ fun relocateBlock( it.clearContent() } + // so loot containers dont drop its content + if (it is RandomizableContainerBlockEntity) { + it.setLootTable(null, 0) + } + tag } From eace2ef186ffb042710ee63d66ad41c9369ee9c4 Mon Sep 17 00:00:00 2001 From: StewStrong Date: Sat, 30 Dec 2023 12:20:01 -0700 Subject: [PATCH 41/52] Increment version --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 42b3794e2..b34061fed 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=1G minecraft_version=1.19.2 enabled_platforms=quilt,fabric,forge archives_base_name=valkyrienskies-119 -mod_version=2.1.2-beta.1 +mod_version=2.1.2-beta.2 maven_group=org.valkyrienskies.mod # https://www.curseforge.com/minecraft/mc-mods/architectury-api/files/ From 6ba8a8b1140f0b6a6259b61ac22be6300e5ed736 Mon Sep 17 00:00:00 2001 From: StewStrong Date: Sun, 31 Dec 2023 06:22:27 -0700 Subject: [PATCH 42/52] Fixed forge not working --- .../mod/common/ValkyrienSkiesMod.kt | 1 + .../mod/common/item/ShipCreatorItem.kt | 1 - .../mod/forge/common/ValkyrienSkiesModForge.kt | 18 +++++++++--------- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/common/src/main/kotlin/org/valkyrienskies/mod/common/ValkyrienSkiesMod.kt b/common/src/main/kotlin/org/valkyrienskies/mod/common/ValkyrienSkiesMod.kt index d14b0ee8e..0fb4029ba 100644 --- a/common/src/main/kotlin/org/valkyrienskies/mod/common/ValkyrienSkiesMod.kt +++ b/common/src/main/kotlin/org/valkyrienskies/mod/common/ValkyrienSkiesMod.kt @@ -77,6 +77,7 @@ object ValkyrienSkiesMod { output.accept(SHIP_CREATOR_ITEM) output.accept(SHIP_ASSEMBLER_ITEM) output.accept(SHIP_CREATOR_ITEM_SMALLER) + output.accept(PHYSICS_ENTITY_CREATOR_ITEM) } .build() } diff --git a/common/src/main/kotlin/org/valkyrienskies/mod/common/item/ShipCreatorItem.kt b/common/src/main/kotlin/org/valkyrienskies/mod/common/item/ShipCreatorItem.kt index 95e0e8afe..b4ad34e82 100644 --- a/common/src/main/kotlin/org/valkyrienskies/mod/common/item/ShipCreatorItem.kt +++ b/common/src/main/kotlin/org/valkyrienskies/mod/common/item/ShipCreatorItem.kt @@ -1,6 +1,5 @@ package org.valkyrienskies.mod.common.item -import net.minecraft.Util import net.minecraft.network.chat.Component import net.minecraft.server.level.ServerLevel import net.minecraft.world.InteractionResult diff --git a/forge/src/main/kotlin/org/valkyrienskies/mod/forge/common/ValkyrienSkiesModForge.kt b/forge/src/main/kotlin/org/valkyrienskies/mod/forge/common/ValkyrienSkiesModForge.kt index 354982fb0..58faea254 100644 --- a/forge/src/main/kotlin/org/valkyrienskies/mod/forge/common/ValkyrienSkiesModForge.kt +++ b/forge/src/main/kotlin/org/valkyrienskies/mod/forge/common/ValkyrienSkiesModForge.kt @@ -20,7 +20,6 @@ import net.minecraftforge.event.TagsUpdatedEvent import net.minecraftforge.fml.ModLoadingContext import net.minecraftforge.fml.common.Mod import net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus -import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent import net.minecraftforge.fml.event.lifecycle.FMLLoadCompleteEvent import net.minecraftforge.fml.loading.FMLEnvironment import net.minecraftforge.registries.DeferredRegister @@ -53,12 +52,12 @@ import org.valkyrienskies.mod.common.item.ShipAssemblerItem import org.valkyrienskies.mod.common.item.ShipCreatorItem import org.valkyrienskies.mod.compat.clothconfig.VSClothConfig -@Mod(ValkyrienSkiesMod.MOD_ID) +@Mod(MOD_ID) class ValkyrienSkiesModForge { - private val BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, ValkyrienSkiesMod.MOD_ID) - private val ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, ValkyrienSkiesMod.MOD_ID) - private val ENTITIES = DeferredRegister.create(ForgeRegistries.ENTITY_TYPES, ValkyrienSkiesMod.MOD_ID) - private val BLOCK_ENTITIES = DeferredRegister.create(ForgeRegistries.BLOCK_ENTITY_TYPES, ValkyrienSkiesMod.MOD_ID) + private val BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, MOD_ID) + private val ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, MOD_ID) + private val ENTITIES = DeferredRegister.create(ForgeRegistries.ENTITY_TYPES, MOD_ID) + private val BLOCK_ENTITIES = DeferredRegister.create(ForgeRegistries.BLOCK_ENTITY_TYPES, MOD_ID) private val TEST_CHAIR_REGISTRY: RegistryObject private val TEST_HINGE_REGISTRY: RegistryObject private val TEST_FLAP_REGISTRY: RegistryObject @@ -144,7 +143,7 @@ class ValkyrienSkiesModForge { ::ShipMountingEntity, MobCategory.MISC ).sized(.3f, .3f) - .build(ResourceLocation(ValkyrienSkiesMod.MOD_ID, "ship_mounting_entity").toString()) + .build(ResourceLocation(MOD_ID, "ship_mounting_entity").toString()) } PHYSICS_ENTITY_TYPE_REGISTRY = ENTITIES.register("vs_physics_entity") { @@ -154,7 +153,7 @@ class ValkyrienSkiesModForge { ).sized(.3f, .3f) .setUpdateInterval(1) .clientTrackingRange(10) - .build(ResourceLocation(ValkyrienSkiesMod.MOD_ID, "vs_physics_entity").toString()) + .build(ResourceLocation(MOD_ID, "vs_physics_entity").toString()) } SHIP_ASSEMBLER_ITEM_REGISTRY = @@ -163,7 +162,7 @@ class ValkyrienSkiesModForge { BlockEntityType.Builder.of(::TestHingeBlockEntity, TestHingeBlock).build(null) } - val deferredRegister = DeferredRegister.create(Registries.CREATIVE_MODE_TAB, MOD_ID); + val deferredRegister = DeferredRegister.create(Registries.CREATIVE_MODE_TAB, MOD_ID) deferredRegister.register("general") { ValkyrienSkiesMod.createCreativeTab() } @@ -216,5 +215,6 @@ class ValkyrienSkiesModForge { ValkyrienSkiesMod.PHYSICS_ENTITY_TYPE = PHYSICS_ENTITY_TYPE_REGISTRY.get() ValkyrienSkiesMod.SHIP_ASSEMBLER_ITEM = SHIP_ASSEMBLER_ITEM_REGISTRY.get() ValkyrienSkiesMod.TEST_HINGE_BLOCK_ENTITY_TYPE = TEST_HINGE_BLOCK_ENTITY_TYPE_REGISTRY.get() + ValkyrienSkiesMod.PHYSICS_ENTITY_CREATOR_ITEM = PHYSICS_ENTITY_CREATOR_ITEM_REGISTRY.get() } } From 72bd3df263ad03758cf4cf890c40cc18bbedd314 Mon Sep 17 00:00:00 2001 From: StewStrong Date: Sun, 31 Dec 2023 15:09:37 -0700 Subject: [PATCH 43/52] Removed forge tags from build.gradle --- fabric/build.gradle | 1 - fabric/gradle.properties | 1 - 2 files changed, 2 deletions(-) diff --git a/fabric/build.gradle b/fabric/build.gradle index 207057909..41bee0ba4 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -82,7 +82,6 @@ dependencies { modImplementation("io.github.fabricators_of_create.Porting-Lib:$module:$port_lib_version") } - //modImplementation("me.alphamode:ForgeTags:${forge_tags_version}") modImplementation("net.minecraftforge:forgeconfigapiport-fabric:${forge_config_api_port_version}") modImplementation("com.jamieswhiteshirt:reach-entity-attributes:${reach_entity_attributes_version}") modImplementation("dev.cafeteria:fake-player-api:${fake_player_api_version}") diff --git a/fabric/gradle.properties b/fabric/gradle.properties index 765de32ce..99711d555 100644 --- a/fabric/gradle.properties +++ b/fabric/gradle.properties @@ -11,7 +11,6 @@ reach_entity_attributes_version=2.4.0 # https://github.com/Fabricators-of-Create/Create/blob/4724359545de070788221dbb6387c31e582e9d45/gradle.properties#L32C14-L32C14 registrate_version=1.3.62-MC1.20.1 -forge_tags_version=2.1 # https://github.com/Fabricators-of-Create/Create/blob/4724359545de070788221dbb6387c31e582e9d45/gradle.properties#L33 milk_lib_version=1.2.60 # https://github.com/Fabricators-of-Create/Create/blob/4724359545de070788221dbb6387c31e582e9d45/gradle.properties#L35 From 876f5b5f2475f4e252a63e6778b4fde9cad11787 Mon Sep 17 00:00:00 2001 From: StewStrong Date: Sun, 31 Dec 2023 15:22:02 -0700 Subject: [PATCH 44/52] Disabled indium in dev environment --- fabric/build.gradle | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fabric/build.gradle b/fabric/build.gradle index 41bee0ba4..2a66d659b 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -41,7 +41,8 @@ dependencies { include(modImplementation("me.shedaniel.cloth:cloth-config-fabric:${cloth_config_version}")) modImplementation("maven.modrinth:sodium:${sodium_version}") - modRuntimeOnly("maven.modrinth:indium:${indium_version}") + // Disable indium until we update sodium to newer versions + // modRuntimeOnly("maven.modrinth:indium:${indium_version}") modImplementation("maven.modrinth:modmenu:${modmenu_version}") // Depend on the fabric API From 93dc01c6328bda7dcfe0b4152d019797e417923a Mon Sep 17 00:00:00 2001 From: StewStrong Date: Sun, 31 Dec 2023 16:53:46 -0700 Subject: [PATCH 45/52] Updated cloth config on forge --- forge/gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge/gradle.properties b/forge/gradle.properties index 3efbace5d..5471ecadc 100644 --- a/forge/gradle.properties +++ b/forge/gradle.properties @@ -3,7 +3,7 @@ loom.platform=forge kotlin.stdlib.default.dependency=false #Deps kotlin_version = 3.12.0 -cloth_config_version = 8.3.103 +cloth_config_version = 11.1.106 #Compat # https://github.com/Creators-of-Create/Create/wiki/Depending-on-Create From 151ecf5193fccf20a50fb0d4f0f001e4d6a16bfd Mon Sep 17 00:00:00 2001 From: StewStrong Date: Sun, 31 Dec 2023 17:04:22 -0700 Subject: [PATCH 46/52] Fixed creative tab name --- .../src/main/resources/assets/valkyrienskies/lang/en_us.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/common/src/main/resources/assets/valkyrienskies/lang/en_us.json b/common/src/main/resources/assets/valkyrienskies/lang/en_us.json index ddd33df22..61876437a 100644 --- a/common/src/main/resources/assets/valkyrienskies/lang/en_us.json +++ b/common/src/main/resources/assets/valkyrienskies/lang/en_us.json @@ -20,5 +20,6 @@ "command.valkyrienskies.get_ship.fail": "No ship found", "command.valkyrienskies.get_ship.only_usable_by_entities": "/vs get-ship can only be run by entities!", "tooltip.valkyrienskies.mass": "Mass", - "command.valkyrienskies.scale.success": "Scaled %d ships!" + "command.valkyrienskies.scale.success": "Scaled %d ships!", + "itemGroup.valkyrienSkies": "Valkyrien Skies" } From a8a4822dfd37f6eb1a1dc50c7e8db13c5bc81a91 Mon Sep 17 00:00:00 2001 From: StewStrong Date: Sun, 31 Dec 2023 19:25:50 -0700 Subject: [PATCH 47/52] Fixed forge block reach being too small --- .../mixin/feature/forge_interact/MixinIForgePlayer.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/feature/forge_interact/MixinIForgePlayer.java b/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/feature/forge_interact/MixinIForgePlayer.java index aae6afa18..5ed417167 100644 --- a/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/feature/forge_interact/MixinIForgePlayer.java +++ b/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/feature/forge_interact/MixinIForgePlayer.java @@ -18,13 +18,16 @@ public interface MixinIForgePlayer { @Shadow Player self(); + @Shadow + double getBlockReach(); + /** * Include ships in server-side distance check when player interacts with a block. */ @Overwrite(remap = false) default boolean canReach(final BlockPos pos, final double padding) { if (VSGameConfig.SERVER.getEnableInteractDistanceChecks()) { - final double reach = this.self().getEntityReach() + padding; + final double reach = this.getBlockReach() + padding; final Vec3 eyes = this.self().getEyePosition(); return VSGameUtilsKt.squaredDistanceBetweenInclShips(this.self().level(), pos.getX() + 0.5, From a52f38bd68363eb4a938f5f991f92fb170abefca Mon Sep 17 00:00:00 2001 From: StewStrong Date: Sun, 31 Dec 2023 20:00:08 -0700 Subject: [PATCH 48/52] Fixed fabric server not working --- fabric/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fabric/build.gradle b/fabric/build.gradle index 2a66d659b..888b16d0b 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -83,7 +83,7 @@ dependencies { modImplementation("io.github.fabricators_of_create.Porting-Lib:$module:$port_lib_version") } - modImplementation("net.minecraftforge:forgeconfigapiport-fabric:${forge_config_api_port_version}") + modImplementation("curse.maven:forge-config-api-port-fabric-547434:$config_api_id") modImplementation("com.jamieswhiteshirt:reach-entity-attributes:${reach_entity_attributes_version}") modImplementation("dev.cafeteria:fake-player-api:${fake_player_api_version}") modImplementation("io.github.tropheusj:milk-lib:${milk_lib_version}") From 39085d5cee7db4d08b065eb2792d64a1ed283634 Mon Sep 17 00:00:00 2001 From: StewStrong Date: Sun, 31 Dec 2023 20:52:02 -0700 Subject: [PATCH 49/52] Increment version --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index e096aab2a..e6d2c283f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=1G minecraft_version=1.20.1 enabled_platforms=quilt,fabric,forge archives_base_name=valkyrienskies-120 -mod_version=2.1.3-beta.1 +mod_version=2.1.3-beta.2 maven_group=org.valkyrienskies.mod # https://www.curseforge.com/minecraft/mc-mods/architectury-api/files/ From 21efe383e00fa41d81355d1edf11feca4fced05b Mon Sep 17 00:00:00 2001 From: Rubydesic Date: Fri, 5 Jan 2024 17:57:12 -0500 Subject: [PATCH 50/52] Add credits to FluffyJenkins for Create compat --- README.md | 8 ++++++++ .../valkyrienskies/mod/mixin/mod_compat/create/README.md | 8 ++++++++ 2 files changed, 16 insertions(+) create mode 100644 common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/README.md diff --git a/README.md b/README.md index c0ab5778b..5592c99ca 100644 --- a/README.md +++ b/README.md @@ -45,3 +45,11 @@ Occasionally forge will break in strange ways. When this occurs, delete all the `Error occurred during initialization of VM Could not reserve enough space for 4194304KB object heap` For patch the problem go to gradle.properties and change `org.gradle.jvmargs=-Xmx4096M` to `org.gradle.jvmargs=-Xmx1024` or `org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=1G` to `org.gradle.jvmargs=-Xmx1G -XX:MaxMetaspaceSize=1G` + +## Attributions + +Valkyrien Skies 2 was originally created by Triode and Rubydesic. You can check +other contributors by viewing the git history. + +The Create compatibility code was originally and largely written by [FluffyJenkins](https://github.com/FluffyJenkins/), +but the git history was clobbered when we transferred the code from Clockwork diff --git a/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/README.md b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/README.md new file mode 100644 index 000000000..2784f766a --- /dev/null +++ b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/README.md @@ -0,0 +1,8 @@ +# Create Compat + +This package contains the Create compatibility code + +## Attributions + +Most of this code was originally created by [FluffyJenkins](https://github.com/FluffyJenkins/). However, the git history +got clobbered when we transferred it over from the Clockwork repository, causing it to be attributed to StewStrong. From daf123148a3e32691acc5270162df92c9bd24271 Mon Sep 17 00:00:00 2001 From: Rubydesic Date: Mon, 29 Jan 2024 12:41:46 -0500 Subject: [PATCH 51/52] Move ValueBox mixin to client (#683) Avoid crash on dedicated server --- common/src/main/resources/valkyrienskies-common.mixins.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/main/resources/valkyrienskies-common.mixins.json b/common/src/main/resources/valkyrienskies-common.mixins.json index 3a9851d19..3a6c4a24a 100644 --- a/common/src/main/resources/valkyrienskies-common.mixins.json +++ b/common/src/main/resources/valkyrienskies-common.mixins.json @@ -76,7 +76,6 @@ "mod_compat.create.blockentity.MixinCrushingWheelControllerTileEntity", "mod_compat.create.blockentity.MixinEjectorTileEntity", "mod_compat.create.blockentity.MixinEncasedFanTileEntity", - "mod_compat.create.client.MixinValueBox", "mod_compat.create.entity.MixinAbstractContraptionEntity", "mod_compat.create.entity.MixinCarriageContraptionEntity", "mod_compat.create.entity.MixinControlledContraptionEntity", @@ -160,6 +159,7 @@ "mod_compat.create.client.MixinTileEntityRenderHelper", "mod_compat.create.client.MixinTrackBlockOutline", "mod_compat.create.client.MixinTrainRelocator", + "mod_compat.create.client.MixinValueBox", "mod_compat.flywheel.InstancingEngineAccessor", "mod_compat.flywheel.MixinBlockEntityInstanceManager", "mod_compat.flywheel.MixinInstanceManager", From 93b62e42528e96a61bf008483210e17bd8494c68 Mon Sep 17 00:00:00 2001 From: Fluffy Jenkins <31552479+FluffyJenkins@users.noreply.github.com> Date: Mon, 29 Jan 2024 17:57:13 +0000 Subject: [PATCH 52/52] Create Compat(1.20.1): Fixed track outlines and picking (#694) * Fixed track outlines on ships and fixed interaction bug when near curved track and a ship * Moved around mixins to disable track outline mixins if interactive is installed * logging --- .../ValkyrienCommonMixinConfigPlugin.java | 10 ++ .../create/client/MixinTrackBlockOutline.java | 85 ++++++----- .../trackOutlines/MixinBigOutlines.java | 92 ++++++++++++ .../trackOutlines/MixinTrackBlockOutline.java | 134 ++++++++++++++++++ .../valkyrienskies-common.mixins.json | 2 + 5 files changed, 286 insertions(+), 37 deletions(-) create mode 100644 common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/client/trackOutlines/MixinBigOutlines.java create mode 100644 common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/client/trackOutlines/MixinTrackBlockOutline.java diff --git a/common/src/main/java/org/valkyrienskies/mod/mixin/ValkyrienCommonMixinConfigPlugin.java b/common/src/main/java/org/valkyrienskies/mod/mixin/ValkyrienCommonMixinConfigPlugin.java index 3bc09f14e..ba5ad1b0a 100644 --- a/common/src/main/java/org/valkyrienskies/mod/mixin/ValkyrienCommonMixinConfigPlugin.java +++ b/common/src/main/java/org/valkyrienskies/mod/mixin/ValkyrienCommonMixinConfigPlugin.java @@ -7,6 +7,7 @@ import org.spongepowered.asm.mixin.Mixins; import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; import org.spongepowered.asm.mixin.extensibility.IMixinInfo; +import org.spongepowered.asm.service.MixinService; import org.valkyrienskies.mod.compat.VSRenderer; /** @@ -72,6 +73,15 @@ public boolean shouldApplyMixin(final String s, final String mixinClassName) { if (mixinClassName.contains("org.valkyrienskies.mod.mixin.feature.render_pathfinding")) { return PATH_FINDING_DEBUG; } + if (mixinClassName.contains("org.valkyrienskies.mod.mixin.mod_compat.create.client.trackOutlines")) { + //interactive has its own track outline stuff so disable fixed version of VS2's track outline stuff + if (classExists("org.valkyrienskies.create_interactive.mixin.client.MixinTrackBlockOutline")) { + MixinService.getService().getLogger("mixin") + .info("[VS2] found Interactive, disabling VS2's trackOutline Compat - " + + mixinClassName.substring(mixinClassName.lastIndexOf(".") + 1)); + return false; + } + } return true; } diff --git a/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/client/MixinTrackBlockOutline.java b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/client/MixinTrackBlockOutline.java index 57496850d..0eb6df4d8 100644 --- a/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/client/MixinTrackBlockOutline.java +++ b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/client/MixinTrackBlockOutline.java @@ -1,82 +1,93 @@ package org.valkyrienskies.mod.mixin.mod_compat.create.client; import com.simibubi.create.content.trains.track.TrackBlockOutline; +import com.simibubi.create.content.trains.track.TrackBlockOutline.BezierPointSelection; import com.simibubi.create.foundation.utility.RaycastHelper; -import java.util.List; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; import net.minecraft.core.BlockPos; import net.minecraft.world.entity.player.Player; import net.minecraft.world.phys.BlockHitResult; -import net.minecraft.world.phys.HitResult.Type; import net.minecraft.world.phys.Vec3; -import org.joml.Vector3d; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; 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.spongepowered.asm.mixin.injection.callback.LocalCapture; +import org.valkyrienskies.core.api.ships.Ship; import org.valkyrienskies.mod.common.VSGameUtilsKt; +import org.valkyrienskies.mod.common.util.VectorConversionsMCKt; @Mixin(TrackBlockOutline.class) public class MixinTrackBlockOutline { + + @Shadow + public static BezierPointSelection result; + @Unique + private static boolean valkyrienskies$toShip = false; @Unique - private static boolean isShip = false; + private static Ship valkyrienskies$ship; @Unique - private static BlockPos shipBlockPos; + private static Vec3 valkyrienskies$originalOrigin; @Inject( - method = "pickCurves", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/client/player/LocalPlayer;getEyePosition(F)Lnet/minecraft/world/phys/Vec3;" - ), locals = LocalCapture.CAPTURE_FAILHARD + method = "pickCurves", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/client/player/LocalPlayer;getEyePosition(F)Lnet/minecraft/world/phys/Vec3;" + ), locals = LocalCapture.CAPTURE_FAILHARD ) private static void stuff(final CallbackInfo ci, final Minecraft mc) { - if (mc.hitResult != null && mc.level != null && mc.hitResult.getType() == Type.BLOCK) { - shipBlockPos = ((BlockHitResult) mc.hitResult).getBlockPos(); - - final List - ships = VSGameUtilsKt.transformToNearbyShipsAndWorld(mc.level, shipBlockPos.getX(), shipBlockPos.getY(), - shipBlockPos.getZ(), 10); - isShip = !ships.isEmpty(); + if (mc.hitResult != null && mc.level != null && mc.player != null) { + valkyrienskies$toShip = false; + final boolean playerOnShip = VSGameUtilsKt.isBlockInShipyard(mc.level, mc.player.getOnPos()); + final boolean hitResultOnShip = + VSGameUtilsKt.isBlockInShipyard(mc.level, ((BlockHitResult) mc.hitResult).getBlockPos()); + if (playerOnShip && !hitResultOnShip) { + valkyrienskies$ship = VSGameUtilsKt.getShipManagingPos(mc.level, mc.player.getOnPos()); + //if blockstate is air then transform to ship + valkyrienskies$toShip = mc.level.getBlockState(BlockPos.containing(mc.hitResult.location)).isAir(); + } else if (hitResultOnShip) { + valkyrienskies$toShip = true; + valkyrienskies$ship = + VSGameUtilsKt.getShipManagingPos(mc.level, ((BlockHitResult) mc.hitResult).getBlockPos()); + } } } @Redirect( - method = "pickCurves()V", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/client/player/LocalPlayer;getEyePosition(F)Lnet/minecraft/world/phys/Vec3;" - ) + method = "pickCurves", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/client/player/LocalPlayer;getEyePosition(F)Lnet/minecraft/world/phys/Vec3;" + ) ) private static Vec3 redirectedOrigin(final LocalPlayer instance, final float v) { final Vec3 eyePos = instance.getEyePosition(v); - if (isShip) { - final List - ships = VSGameUtilsKt.transformToNearbyShipsAndWorld(instance.level(), eyePos.x, eyePos.y, eyePos.z, 10); - if (ships.isEmpty()) { - return eyePos; - } - final Vector3d tempVec = ships.get(0); - return new Vec3(tempVec.x, tempVec.y, tempVec.z); + if (valkyrienskies$toShip) { + valkyrienskies$originalOrigin = eyePos; + return VectorConversionsMCKt.toMinecraft( + valkyrienskies$ship.getWorldToShip().transformPosition(VectorConversionsMCKt.toJOML(eyePos))); } else { return eyePos; } } @Redirect( - method = "pickCurves()V", - at = @At( - value = "INVOKE", - target = "Lcom/simibubi/create/foundation/utility/RaycastHelper;getTraceTarget(Lnet/minecraft/world/entity/player/Player;DLnet/minecraft/world/phys/Vec3;)Lnet/minecraft/world/phys/Vec3;" - ) + method = "pickCurves", + at = @At( + value = "INVOKE", + target = "Lcom/simibubi/create/foundation/utility/RaycastHelper;getTraceTarget(Lnet/minecraft/world/entity/player/Player;DLnet/minecraft/world/phys/Vec3;)Lnet/minecraft/world/phys/Vec3;" + ) ) private static Vec3 redirectedTarget(final Player playerIn, final double range, final Vec3 origin) { - if (isShip) { - return new Vec3(shipBlockPos.getX(), shipBlockPos.getY(), shipBlockPos.getZ()); + if (valkyrienskies$toShip) { + return VectorConversionsMCKt.toMinecraft( + valkyrienskies$ship.getWorldToShip().transformPosition(VectorConversionsMCKt.toJOML( + RaycastHelper.getTraceTarget(playerIn, range, valkyrienskies$originalOrigin)))); } else { return RaycastHelper.getTraceTarget(playerIn, range, origin); } diff --git a/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/client/trackOutlines/MixinBigOutlines.java b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/client/trackOutlines/MixinBigOutlines.java new file mode 100644 index 000000000..94ffa3406 --- /dev/null +++ b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/client/trackOutlines/MixinBigOutlines.java @@ -0,0 +1,92 @@ +package org.valkyrienskies.mod.mixin.mod_compat.create.client.trackOutlines; + +import com.simibubi.create.foundation.block.BigOutlines; +import com.simibubi.create.foundation.utility.RaycastHelper; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.HitResult.Type; +import net.minecraft.world.phys.Vec3; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +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.spongepowered.asm.mixin.injection.callback.LocalCapture; +import org.valkyrienskies.core.api.ships.Ship; +import org.valkyrienskies.mod.common.VSGameUtilsKt; +import org.valkyrienskies.mod.common.util.VectorConversionsMCKt; + +@Mixin(BigOutlines.class) +public class MixinBigOutlines { + @Unique + private static boolean valkyrienskies$toShip = false; + + @Unique + private static Ship valkyrienskies$ship; + @Unique + private static Vec3 valkyrienskies$originalOrigin; + + @Inject( + method = "pick", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/client/player/LocalPlayer;getEyePosition(F)Lnet/minecraft/world/phys/Vec3;" + ), locals = LocalCapture.CAPTURE_FAILHARD + ) + private static void stuff(final CallbackInfo ci, final Minecraft mc) { + if (mc.hitResult != null && mc.level != null && mc.player != null && mc.hitResult.getType() == Type.BLOCK) { + valkyrienskies$toShip = false; + final boolean playerOnShip = VSGameUtilsKt.isBlockInShipyard(mc.level, mc.player.getOnPos()); + final boolean hitResultOnShip = + VSGameUtilsKt.isBlockInShipyard(mc.level, ((BlockHitResult) mc.hitResult).getBlockPos()); + if (playerOnShip && !hitResultOnShip) { + valkyrienskies$ship = VSGameUtilsKt.getShipManagingPos(mc.level, mc.player.getOnPos()); + //if blockstate is air then transform to ship + valkyrienskies$toShip = mc.level.getBlockState(BlockPos.containing(mc.hitResult.location)).isAir(); + } else if (hitResultOnShip) { + valkyrienskies$toShip = true; + valkyrienskies$ship = + VSGameUtilsKt.getShipManagingPos(mc.level, ((BlockHitResult) mc.hitResult).getBlockPos()); + } + } + } + + @Redirect( + method = "pick", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/client/player/LocalPlayer;getEyePosition(F)Lnet/minecraft/world/phys/Vec3;" + ) + ) + private static Vec3 redirectedOrigin(final LocalPlayer instance, final float v) { + final Vec3 eyePos = instance.getEyePosition(v); + if (valkyrienskies$toShip) { + valkyrienskies$originalOrigin = eyePos; + return VectorConversionsMCKt.toMinecraft( + valkyrienskies$ship.getWorldToShip().transformPosition(VectorConversionsMCKt.toJOML(eyePos))); + } else { + return eyePos; + } + } + + @Redirect( + method = "pick", + at = @At( + value = "INVOKE", + target = "Lcom/simibubi/create/foundation/utility/RaycastHelper;getTraceTarget(Lnet/minecraft/world/entity/player/Player;DLnet/minecraft/world/phys/Vec3;)Lnet/minecraft/world/phys/Vec3;" + ) + ) + private static Vec3 redirectedTarget(final Player playerIn, final double range, final Vec3 origin) { + if (valkyrienskies$toShip) { + return VectorConversionsMCKt.toMinecraft( + valkyrienskies$ship.getWorldToShip().transformPosition(VectorConversionsMCKt.toJOML( + RaycastHelper.getTraceTarget(playerIn, range, valkyrienskies$originalOrigin)))); + } else { + return RaycastHelper.getTraceTarget(playerIn, range, origin); + } + } +} diff --git a/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/client/trackOutlines/MixinTrackBlockOutline.java b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/client/trackOutlines/MixinTrackBlockOutline.java new file mode 100644 index 000000000..1b8fbad96 --- /dev/null +++ b/common/src/main/java/org/valkyrienskies/mod/mixin/mod_compat/create/client/trackOutlines/MixinTrackBlockOutline.java @@ -0,0 +1,134 @@ +package org.valkyrienskies.mod.mixin.mod_compat.create.client.trackOutlines; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.simibubi.create.content.trains.track.TrackBlockOutline; +import com.simibubi.create.content.trains.track.TrackBlockOutline.BezierPointSelection; +import net.minecraft.client.Camera; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.LevelRenderer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.HitResult; +import net.minecraft.world.phys.Vec3; +import org.joml.Quaterniond; +import org.joml.Vector3d; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.ModifyArg; +import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; +import org.valkyrienskies.core.api.ships.Ship; +import org.valkyrienskies.core.impl.game.ships.ShipObjectClient; +import org.valkyrienskies.mod.common.VSClientGameUtils; +import org.valkyrienskies.mod.common.VSGameUtilsKt; +import org.valkyrienskies.mod.common.util.VectorConversionsMCKt; + +@Mixin(TrackBlockOutline.class) +public class MixinTrackBlockOutline { + @Unique + private static Vec3 valkyrienskies$cameraVec3; + @Unique + private static Vec3 valkyrienskies$vec; + @Unique + private static Vec3 valkyrienskies$angles; + + @Inject(method = "drawCurveSelection", + at = @At(value = "INVOKE", + target = "Lcom/simibubi/create/content/trains/track/TrackBlockOutline$BezierPointSelection;angles()Lnet/minecraft/world/phys/Vec3;"), + locals = LocalCapture.CAPTURE_FAILHARD) + private static void harvestDrawCurveSelection(final PoseStack ms, final MultiBufferSource buffer, final Vec3 camera, + final CallbackInfo ci, final Minecraft mc, + final BezierPointSelection result, final VertexConsumer vb, final Vec3 vec) { + valkyrienskies$cameraVec3 = camera; + valkyrienskies$vec = result.vec(); + valkyrienskies$angles = result.angles(); + } + @ModifyArg(method = "drawCurveSelection", + at = @At(value = "INVOKE", + target = "Lcom/simibubi/create/content/trains/track/TrackBlockOutline;renderShape(Lnet/minecraft/world/phys/shapes/VoxelShape;Lcom/mojang/blaze3d/vertex/PoseStack;Lcom/mojang/blaze3d/vertex/VertexConsumer;Ljava/lang/Boolean;)V"), + index = 1) + private static PoseStack redirectTransformStackTranslate(final PoseStack ms) { + + final Level level = Minecraft.getInstance().level; + if (level != null && valkyrienskies$vec != null) { + final ShipObjectClient ship; + if ((ship = (ShipObjectClient) VSGameUtilsKt.getShipManagingPos(level, valkyrienskies$vec)) != null) { + final Quaterniond rotation = new Quaterniond().identity(); + final Quaterniond yawQuat = new Quaterniond().rotateY(valkyrienskies$angles.y); + final Quaterniond pitchQuat = new Quaterniond().rotateX(valkyrienskies$angles.x); + + yawQuat.mul(pitchQuat, rotation); + ship.getRenderTransform().getShipToWorldRotation().mul(rotation, rotation); + + final Vector3d worldVec = ship.getRenderTransform().getShipToWorld() + .transformPosition( + new Vector3d(valkyrienskies$vec.x, valkyrienskies$vec.y + .125, valkyrienskies$vec.z), + new Vector3d()); + + ms.popPose(); + ms.pushPose(); + ms.translate(worldVec.x - valkyrienskies$cameraVec3.x, + worldVec.y - valkyrienskies$cameraVec3.y, + worldVec.z - valkyrienskies$cameraVec3.z); + ms.mulPose(VectorConversionsMCKt.toFloat(rotation)); + ms.translate(-.5, -.125f, -.5); + } + } + return ms; + } + + @Unique + private static Camera valkyrienskies$info; + @Unique + private static BlockHitResult valkyrienskies$hitResult; + + @ModifyArg(method = "drawCustomBlockSelection", at = @At(value = "INVOKE", + target = "Lnet/minecraft/world/level/border/WorldBorder;isWithinBounds(Lnet/minecraft/core/BlockPos;)Z")) + private static BlockPos modIsWithinBounds(final BlockPos blockPos) { + final Level level = Minecraft.getInstance().level; + if (level != null) { + final Ship ship; + if ((ship = VSGameUtilsKt.getShipManagingPos(level, blockPos)) != null) { + return BlockPos.containing(VectorConversionsMCKt.toMinecraft(ship.getShipToWorld() + .transformPosition(VectorConversionsMCKt.toJOMLD(blockPos)))); + } + } + return blockPos; + } + + @Inject(method = "drawCustomBlockSelection", + at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/vertex/PoseStack;translate(DDD)V")) + private static void harvest(final LevelRenderer context, final Camera info, final HitResult hitResult, + final float partialTicks, + final PoseStack ms, final MultiBufferSource buffers, final CallbackInfoReturnable cir) { + valkyrienskies$info = info; + valkyrienskies$hitResult = (BlockHitResult) hitResult; + } + + @Redirect(method = "drawCustomBlockSelection", + at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/vertex/PoseStack;translate(DDD)V")) + private static void redirectTranslate(final PoseStack instance, final double d, final double e, final double f) { + final Level level = Minecraft.getInstance().level; + if (level != null) { + final ShipObjectClient ship; + if ((ship = (ShipObjectClient) VSGameUtilsKt.getShipManagingPos(level, + valkyrienskies$hitResult.getBlockPos())) != null) { + final Vec3 camPos = valkyrienskies$info.getPosition(); + VSClientGameUtils.transformRenderWithShip(ship.getRenderTransform(), instance, + valkyrienskies$hitResult.getBlockPos(), + camPos.x, camPos.y, camPos.z); + } else { + instance.translate(d, e, f); + } + } else { + instance.translate(d, e, f); + } + } +} diff --git a/common/src/main/resources/valkyrienskies-common.mixins.json b/common/src/main/resources/valkyrienskies-common.mixins.json index 3a6c4a24a..4d7c28650 100644 --- a/common/src/main/resources/valkyrienskies-common.mixins.json +++ b/common/src/main/resources/valkyrienskies-common.mixins.json @@ -159,6 +159,8 @@ "mod_compat.create.client.MixinTileEntityRenderHelper", "mod_compat.create.client.MixinTrackBlockOutline", "mod_compat.create.client.MixinTrainRelocator", + "mod_compat.create.client.trackOutlines.MixinBigOutlines", + "mod_compat.create.client.trackOutlines.MixinTrackBlockOutline", "mod_compat.create.client.MixinValueBox", "mod_compat.flywheel.InstancingEngineAccessor", "mod_compat.flywheel.MixinBlockEntityInstanceManager",