Skip to content

Commit

Permalink
Api, split queue, config, joints fix
Browse files Browse the repository at this point in the history
  • Loading branch information
ThePlasticPotato committed Dec 27, 2024
1 parent 1a86920 commit a788163
Show file tree
Hide file tree
Showing 28 changed files with 139 additions and 58 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import net.minecraft.core.SectionPos;
import net.minecraft.network.protocol.game.ClientboundSectionBlocksUpdatePacket;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.gen.Accessor;

@Mixin(ClientboundSectionBlocksUpdatePacket.class)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.valkyrienskies.core.api.ships.LoadedServerShip;
import org.valkyrienskies.mod.common.VSGameUtilsKt;
import org.valkyrienskies.mod.common.util.SplitHandler;
import org.valkyrienskies.mod.common.util.SplittingDisablerAttachment;

@Mixin(Contraption.class)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@
import org.valkyrienskies.core.api.ships.properties.IShipActiveChunksSet;
import org.valkyrienskies.core.apigame.GameServer;
import org.valkyrienskies.core.apigame.ShipTeleportData;
import org.valkyrienskies.core.apigame.ships.LoadedServerShipCore;
import org.valkyrienskies.core.apigame.world.IPlayer;
import org.valkyrienskies.core.apigame.world.ServerShipWorldCore;
import org.valkyrienskies.core.apigame.world.VSPipeline;
Expand Down Expand Up @@ -256,7 +257,7 @@ private void handleShipPortals() {
final BlockPos blockPos2 = new BlockPos(shipPos.x() + bbRadius, shipPos.y() + bbRadius, shipPos.z() + bbRadius);
// Only run this code if the chunks between blockPos and blockPos2 are loaded
if (level.hasChunksAt(blockPos, blockPos2)) {
shipObject.decayPortalCoolDown();
((LoadedServerShipCore) shipObject).decayPortalCoolDown();

final BlockPos.MutableBlockPos mutableBlockPos = new BlockPos.MutableBlockPos();
for (int i = blockPos.getX(); i <= blockPos2.getX(); ++i) {
Expand All @@ -266,7 +267,7 @@ private void handleShipPortals() {
final BlockState blockState = level.getBlockState(mutableBlockPos);
if (blockState.getBlock() == Blocks.NETHER_PORTAL) {
// Handle nether portal teleport
if (!shipObject.isOnPortalCoolDown()) {
if (!((LoadedServerShipCore) shipObject).isOnPortalCoolDown()) {
// Move the ship between dimensions
final ServerLevel destLevel = getLevel(level.dimension() == Level.NETHER ? Level.OVERWORLD : Level.NETHER);
// TODO: Do we want portal time?
Expand All @@ -276,7 +277,7 @@ private void handleShipPortals() {
level.getProfiler().pop();
}
}
shipObject.handleInsidePortal();
((LoadedServerShipCore) shipObject).handleInsidePortal();
} else if (blockState.getBlock() == Blocks.END_PORTAL) {
// Handle end portal teleport
final ServerLevel destLevel = level.getServer().getLevel(level.dimension() == Level.END ? Level.OVERWORLD : Level.END);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@
import org.valkyrienskies.core.apigame.world.chunks.TerrainUpdate;
import org.valkyrienskies.mod.common.IShipObjectWorldServerProvider;
import org.valkyrienskies.mod.common.VSGameUtilsKt;
import org.valkyrienskies.mod.common.ValkyrienSkiesMod;
import org.valkyrienskies.mod.common.block.WingBlock;
import org.valkyrienskies.mod.common.util.VSServerLevel;
import org.valkyrienskies.mod.common.util.VectorConversionsMCKt;
Expand Down Expand Up @@ -248,6 +249,10 @@ private void postTick(final BooleanSupplier shouldKeepTicking, final CallbackInf
voxelShapeUpdates
);

if (ValkyrienSkiesMod.getVsCore().getHooks().getEnableSplitting()) {
ValkyrienSkiesMod.splitHandler.tick(ServerLevel.class.cast(this));
}

}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package org.valkyrienskies.mod.mixinducks.mod_compat.bluemap;

import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.level.Level;

public interface WorldDuck {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,18 @@ import net.minecraft.core.BlockPos
import net.minecraft.world.entity.Entity
import net.minecraft.world.level.ChunkPos
import net.minecraft.world.level.Level
import org.valkyrienskies.core.api.VsBeta
import org.valkyrienskies.core.api.attachment.AttachmentRegistration
import org.valkyrienskies.core.api.attachment.AttachmentRegistration.Builder
import org.valkyrienskies.core.api.bodies.properties.BodyTransform.Factory
import org.valkyrienskies.core.api.ships.Ship
import org.valkyrienskies.core.impl.bodies.properties.BodyTransformFactory
import org.valkyrienskies.core.util.events.EventEmitterImpl
import org.valkyrienskies.mod.api.VsApi
import org.valkyrienskies.mod.api.events.PostRenderShipEvent
import org.valkyrienskies.mod.api.events.PreRenderShipEvent
import org.valkyrienskies.mod.api.events.RegisterBlockStateEvent
import org.valkyrienskies.mod.common.ValkyrienSkiesMod
import org.valkyrienskies.mod.common.entity.ShipMountingEntity
import org.valkyrienskies.mod.common.getShipManagingPos
import org.valkyrienskies.mod.compat.clothconfig.VSClothConfig
Expand Down Expand Up @@ -41,4 +47,23 @@ class VsApiImpl : VsApi {
override fun getShipManagingChunk(level: Level?, chunkX: Int, chunkZ: Int): Ship? {
return level?.getShipManagingPos(chunkX, chunkZ)
}

@VsBeta
override val transformFactory: Factory = BodyTransformFactory

override fun <T> newAttachmentRegistrationBuilder(attachmentClass: Class<T>): Builder<T> {
return ValkyrienSkiesMod.vsCore.newAttachmentRegistrationBuilder(attachmentClass)
}

override fun <T> registerAttachment(attachmentClass: Class<T>, registrationBuilder: Builder<T>.() -> Unit) {
ValkyrienSkiesMod.vsCore.registerAttachment(attachmentClass, registrationBuilder)
}

override fun <T> registerAttachment(registration: AttachmentRegistration<T>) {
ValkyrienSkiesMod.vsCore.registerAttachment(registration)
}

override fun registerAttachmentForRemoval(attachmentKey: String) {
ValkyrienSkiesMod.vsCore.registerAttachmentForRemoval(attachmentKey)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -135,8 +135,8 @@ object BlockStateInfo {
newBlockMass
)

if (ValkyrienSkiesMod.vsCore.hooks.enableConnectivity) {
ValkyrienSkiesMod.splitHandler.split(level, x, y, z, prevBlockState, newBlockState)
if (ValkyrienSkiesMod.vsCore.hooks.enableSplitting) {
ValkyrienSkiesMod.splitHandler.queueSplit(level, x, y, z)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,16 +24,17 @@ import org.joml.Vector3ic
import org.joml.primitives.AABBd
import org.joml.primitives.AABBdc
import org.valkyrienskies.core.api.ships.ClientShip
import org.valkyrienskies.core.api.ships.LoadedServerShip
import org.valkyrienskies.core.api.ships.LoadedShip
import org.valkyrienskies.core.api.ships.ServerShip
import org.valkyrienskies.core.api.ships.Ship
import org.valkyrienskies.core.api.util.functions.DoubleTernaryConsumer
import org.valkyrienskies.core.api.world.LevelYRange
import org.valkyrienskies.core.api.world.properties.DimensionId
import org.valkyrienskies.core.apigame.world.IPlayer
import org.valkyrienskies.core.apigame.world.ServerShipWorldCore
import org.valkyrienskies.core.apigame.world.ShipWorldCore
import org.valkyrienskies.core.apigame.world.chunks.TerrainUpdate
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
Expand Down Expand Up @@ -266,7 +267,7 @@ fun ClientLevel?.getShipObjectManagingPos(chunkPos: ChunkPos) =

// ServerWorld
fun ServerLevel?.getShipObjectManagingPos(chunkX: Int, chunkZ: Int) =
getShipObjectManagingPosImpl(this, chunkX, chunkZ) as ShipObjectServer?
getShipObjectManagingPosImpl(this, chunkX, chunkZ) as LoadedServerShip?

fun ServerLevel?.getShipObjectManagingPos(blockPos: Vec3i) =
getShipObjectManagingPos(blockPos.x shr 4, blockPos.z shr 4)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import net.minecraft.world.entity.EntityType
import net.minecraft.world.item.Item
import net.minecraft.world.level.block.Block
import net.minecraft.world.level.block.entity.BlockEntityType
import org.valkyrienskies.core.api.ships.setAttachment
import org.valkyrienskies.core.apigame.VSCore
import org.valkyrienskies.core.apigame.VSCoreClient
import org.valkyrienskies.core.impl.hooks.VSEvents
Expand Down Expand Up @@ -59,6 +58,9 @@ object ValkyrienSkiesMod {

splitHandler = SplitHandler(this.vsCore.hooks.enableBlockEdgeConnectivity, this.vsCore.hooks.enableBlockCornerConnectivity)

vsCore.registerAttachment(GameTickForceApplier::class.java)
vsCore.registerAttachment(SplittingDisablerAttachment::class.java)

VSEvents.ShipLoadEvent.on { event ->
event.ship.setAttachment(GameTickForceApplier())
event.ship.setAttachment(SplittingDisablerAttachment(true))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@ import net.minecraft.world.level.block.state.BlockState
import org.joml.Vector3d
import org.joml.Vector3i
import org.joml.Vector3ic
import org.valkyrienskies.core.api.attachment.getAttachment
import org.valkyrienskies.core.api.ships.ServerShip
import org.valkyrienskies.core.api.ships.Ship
import org.valkyrienskies.core.api.ships.getAttachment
import org.valkyrienskies.core.impl.game.ShipTeleportDataImpl
import org.valkyrienskies.mod.common.BlockStateInfo.onSetBlock
import org.valkyrienskies.mod.common.dimensionId
Expand Down Expand Up @@ -111,7 +111,7 @@ object ShipAssembler {
AssemblyUtil.updateBlock(level,itPos,shipPos,level.getBlockState(shipPos))
}

val shipCenterPos = ((newShip as ServerShip).inertiaData.centerOfMassInShip).add(0.5, 0.5, 0.5, Vector3d())
val shipCenterPos = ((newShip as ServerShip).inertiaData.centerOfMass).add(0.5, 0.5, 0.5, Vector3d())
// This is giga sus, but whatever
val shipPos = Vector3d(shipOGPos).add(0.5, 0.5, 0.5)
if (existingShip != null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,13 @@ import net.minecraft.world.level.block.entity.BlockEntity
import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings
import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate
import org.joml.Vector3d
import org.valkyrienskies.core.api.VsBeta
import org.valkyrienskies.core.api.ships.ServerShip
import org.valkyrienskies.core.api.ships.properties.ShipTransformVelocity
import org.valkyrienskies.core.apigame.ShipTeleportData
import org.valkyrienskies.core.impl.game.ShipTeleportDataImpl
import org.valkyrienskies.core.impl.game.ships.ShipData
import org.valkyrienskies.core.impl.game.ships.ShipDataCommon
import org.valkyrienskies.core.impl.game.ships.ShipTransformImpl
import org.valkyrienskies.core.util.datastructures.DenseBlockPosSet
import org.valkyrienskies.mod.common.dimensionId
Expand All @@ -26,6 +29,7 @@ import org.valkyrienskies.mod.common.util.toMinecraft
import org.valkyrienskies.mod.util.relocateBlock
import org.valkyrienskies.mod.util.updateBlock

@OptIn(VsBeta::class)
@Deprecated("Use [ShipAssembler.assembleToShip] instead")
fun createNewShipWithBlocks(
centerBlock: BlockPos, blocks: DenseBlockPosSet, level: ServerLevel
Expand Down Expand Up @@ -82,11 +86,14 @@ fun createNewShipWithBlocks(
((shipChunkZ shl 4) + (centerBlock.z and 15)).toDouble()
)
// The ship's position has shifted from the center block since we assembled the ship, compensate for that
val centerBlockPosInWorld = ship.inertiaData.centerOfMassInShip.sub(centerInShip, Vector3d())
val centerBlockPosInWorld = ship.inertiaData.centerOfMass.sub(centerInShip, Vector3d())
.add(ship.transform.positionInWorld)
// Put the ship into the compensated position, so that all the assembled blocks stay in the same place
// TODO: AAAAAAAAA THIS IS HORRIBLE how can the API support this?
(ship as ShipData).transform = (ship.transform as ShipTransformImpl).copy(positionInWorld = centerBlockPosInWorld)
// well now it doesnt kekw
//(ship as ShipDataCommon).transform = (ship.transform).withTransformFrom(positionInWorld = centerBlockPosInWorld)

(ship as ShipDataCommon).setFromTransform(ship.transform.copy(position = centerBlockPosInWorld))
level.server.executeIf(
// This condition will return true if all modified chunks have been both loaded AND
// chunk update packets were sent to players
Expand Down Expand Up @@ -128,13 +135,11 @@ fun createNewShipWithStructure(
val centerPos = lowerCorner.toJOMLD().add(diff.x / 2.0, diff.y / 2.0, diff.z / 2.0)

// The ship's position has shifted from the center block since we assembled the ship, compensate for that
val centerBlockPosInWorld = ship.inertiaData.centerOfMassInShip.sub(centerPos, Vector3d())
val centerBlockPosInWorld = ship.inertiaData.centerOfMass.sub(centerPos, Vector3d())
.add(ship.transform.positionInWorld)
// Put the ship into the compensated position, so that all the assembled blocks stay in the same place
// TODO: AAAAAAAAA THIS IS HORRIBLE how can the API support this?
//(ship as ShipData).transform = (ship.transform as ShipTransformImpl).copy(positionInWorld = centerBlockPosInWorld)
level.shipObjectWorld
.teleportShip(ship, ShipTeleportDataImpl(newPos = centerBlockPosInWorld.add(0.0, 0.0, 0.0, Vector3d()), newPosInShip = ship.inertiaData.centerOfMassInShip))
.teleportShip(ship, ShipTeleportDataImpl(newPos = centerBlockPosInWorld.add(0.0, 0.0, 0.0, Vector3d()), newPosInShip = ship.inertiaData.centerOfMass))


for (x in lowerCorner.x..higherCorner.x) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,8 @@ import org.joml.Vector3dc
import org.valkyrienskies.core.apigame.joints.VSJointMaxForceTorque
import org.valkyrienskies.core.apigame.joints.VSJointPose
import org.valkyrienskies.core.apigame.joints.VSRevoluteJoint
import org.valkyrienskies.core.impl.bodies.properties.BodyTransformVelocityImpl
import org.valkyrienskies.core.impl.game.ships.ShipDataCommon
import org.valkyrienskies.core.impl.game.ships.ShipTransformImpl
import org.valkyrienskies.mod.common.ValkyrienSkiesMod
import org.valkyrienskies.mod.common.blockentity.TestHingeBlockEntity
import org.valkyrienskies.mod.common.dimensionId
Expand Down Expand Up @@ -173,22 +173,26 @@ object TestHingeBlock :
// Put the new ship where the old ship is
val newPos = shipThisIsIn.transform.shipToWorld.transformPosition(attachmentLocalPos0, Vector3d())
newPos.sub(shipThisIsIn.transform.shipToWorldRotation.transform(attachmentOffset1, Vector3d()))
val newTransform = ShipTransformImpl(
val newTransform = BodyTransformVelocityImpl(
newPos,
ship.transform.positionInShip,
shipThisIsIn.transform.shipToWorldRotation, // Copy source ship rotation
ship.transform.shipToWorldScaling
ship.transform.shipToWorldScaling,
velocity = shipThisIsIn.velocity,
angularVelocity = shipThisIsIn.angularVelocity
)
// Update the ship transform
(ship as ShipDataCommon).transform = newTransform
} else {
val newPos = Vector3d(attachmentLocalPos0)
newPos.sub(attachmentOffset1)
val newTransform = ShipTransformImpl(
val newTransform = BodyTransformVelocityImpl(
newPos,
ship.transform.positionInShip,
ship.transform.shipToWorldRotation,
ship.transform.shipToWorldScaling
ship.transform.shipToWorldScaling,
velocity = ship.velocity,
angularVelocity = ship.angularVelocity
)
// Update the ship transform
(ship as ShipDataCommon).transform = newTransform
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,16 @@ object VSGameConfig {
description = "Minimum scale of ships"
)
var minScaling = 0.25

@JsonSchema(
description = "Enable splitting in worldspace. (Experimental!)"
)
var enableWorldSplitting = false

@JsonSchema(
description = "The default grace timer for splitting. A split won't occur after a block break at a position until this many ticks have passed. Note that setting this too high may prevent things like explosions from properly launching split ships. (in ticks)"
)
var defaultSplitGraceTimer = 1
}

class Common {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@ import org.valkyrienskies.core.api.physics.blockstates.LiquidState
import org.valkyrienskies.core.api.physics.blockstates.SolidBlockShape
import org.valkyrienskies.core.apigame.physics.blockstates.VsBlockState
import org.valkyrienskies.core.apigame.world.chunks.BlockType
import org.valkyrienskies.core.game.VSBlockType
import org.valkyrienskies.mod.common.BlockStateInfoProvider
import org.valkyrienskies.mod.common.ValkyrienSkiesMod
import org.valkyrienskies.mod.common.hooks.VSGameEvents
Expand All @@ -44,7 +43,7 @@ private data class VSBlockStateInfo(
val mass: Double,
val friction: Double,
val elasticity: Double,
val type: VSBlockType?,
val type: BlockType?,
)

object MassDatapackResolver : BlockStateInfoProvider {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ import net.minecraft.world.entity.LivingEntity
import net.minecraft.world.level.Level
import net.minecraft.world.phys.Vec3
import org.joml.Vector3f
import org.valkyrienskies.core.api.attachment.removeAttachment
import org.valkyrienskies.core.api.ships.LoadedServerShip
import org.valkyrienskies.core.api.ships.setAttachment
import org.valkyrienskies.mod.api.SeatedControllingPlayer
import org.valkyrienskies.mod.common.config.VSKeyBindings
import org.valkyrienskies.mod.common.getShipManagingPos
Expand Down Expand Up @@ -74,7 +74,7 @@ open class ShipMountingEntity(type: EntityType<ShipMountingEntity>, level: Level
override fun remove(removalReason: RemovalReason) {
if (this.isController && !level.isClientSide)
(level.getShipObjectManagingPos(blockPosition()) as LoadedServerShip?)
?.setAttachment<SeatedControllingPlayer>(null)
?.removeAttachment<SeatedControllingPlayer>()
super.remove(removalReason)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,7 @@ open class VSPhysicsEntity(type: EntityType<VSPhysicsEntity>, level: Level) : En
shipId: ShipId, transform: ShipTransform, radius: Double = 0.5, mass: Double = 10000.0
): PhysicsEntityData {
val inertia = 0.4 * mass * radius * radius
// todo: fix physics entities for some reason using ship inertia data??? what?? ruby pls
val inertiaData: ShipInertiaData = ShipInertiaDataImpl(Vector3d(), mass, Matrix3d().scale(inertia))
val collisionShapeData = VSSphereCollisionShapeData(radius)
return PhysicsEntityData(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ object WorldEntityHandler : VSEntityHandler {

val newPosInShipLocal = Vector3d(newPos).sub(ship.transform.positionInWorld)
val shipVelocity = Vector3d(ship.velocity) // ship linear velocity
.add(Vector3d(ship.omega).cross(newPosInShipLocal)) // angular velocity
.add(Vector3d(ship.angularVelocity).cross(newPosInShipLocal)) // angular velocity
.mul(0.05) // Tick velocity

val entityVelocity = ship.transform.shipToWorldRotation.transform(entity.deltaMovement.toJOML())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,10 @@ abstract class CommonHooksImpl : CoreHooksOut {
get() = vsCore.hooks.enableWorldConnectivity
set(value) {}

override var enableSplitting: Boolean
get() = vsCore.hooks.enableSplitting
set(value) {}

override val playState: PlayState
get() {
if (!isPhysicalClient) {
Expand Down
Loading

0 comments on commit a788163

Please sign in to comment.