From 164040b45bcd7d4bb5c8b17795ee72d61219b0c2 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Thu, 11 Apr 2024 20:36:23 +0700 Subject: [PATCH] SpawnEntityPacket --- .../defs/world/TerrestrialWorldParameters.kt | 2 +- .../kstarbound/network/PacketRegistry.kt | 3 +- .../network/packets/EntityCreatePacket.kt | 25 ++++------- .../packets/serverbound/SpawnEntityPacket.kt | 41 +++++++++++++++++++ .../ru/dbotthepony/kstarbound/world/World.kt | 6 +-- .../world/entities/ItemDropEntity.kt | 7 ++++ .../world/entities/MovementController.kt | 2 +- 7 files changed, 62 insertions(+), 24 deletions(-) create mode 100644 src/main/kotlin/ru/dbotthepony/kstarbound/network/packets/serverbound/SpawnEntityPacket.kt diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/defs/world/TerrestrialWorldParameters.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/defs/world/TerrestrialWorldParameters.kt index 22f124ed..5f27824b 100644 --- a/src/main/kotlin/ru/dbotthepony/kstarbound/defs/world/TerrestrialWorldParameters.kt +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/defs/world/TerrestrialWorldParameters.kt @@ -579,7 +579,7 @@ class TerrestrialWorldParameters : VisitableWorldParameters() { parameters.threatLevel = threadLevel parameters.typeName = typeName parameters.worldSize = params.size - parameters.gravity = Vector2d(y = 10.0) + parameters.gravity = Vector2d(y = random.nextRange(params.gravityRange)) parameters.airless = primaryBiome.value.airless parameters.environmentStatusEffects = primaryBiome.value.statusEffects parameters.overrideTech = params.overrideTech diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/network/PacketRegistry.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/network/PacketRegistry.kt index 73b8f82c..09a21c05 100644 --- a/src/main/kotlin/ru/dbotthepony/kstarbound/network/PacketRegistry.kt +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/network/PacketRegistry.kt @@ -67,6 +67,7 @@ import ru.dbotthepony.kstarbound.network.packets.serverbound.FlyShipPacket import ru.dbotthepony.kstarbound.network.packets.serverbound.ModifyTileListPacket import ru.dbotthepony.kstarbound.network.packets.serverbound.PlayerWarpPacket import ru.dbotthepony.kstarbound.network.packets.serverbound.RequestDropPacket +import ru.dbotthepony.kstarbound.network.packets.serverbound.SpawnEntityPacket import ru.dbotthepony.kstarbound.network.packets.serverbound.WorldClientStateUpdatePacket import ru.dbotthepony.kstarbound.network.packets.serverbound.WorldStartAcknowledgePacket import java.io.BufferedInputStream @@ -460,7 +461,7 @@ class PacketRegistry(val isLegacy: Boolean) { LEGACY.add(::DamageTileGroupPacket) LEGACY.skip("CollectLiquid") LEGACY.add(::RequestDropPacket) - LEGACY.skip("SpawnEntity") + LEGACY.add(::SpawnEntityPacket) LEGACY.skip("ConnectWire") LEGACY.skip("DisconnectAllWires") LEGACY.add(::WorldClientStateUpdatePacket) diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/network/packets/EntityCreatePacket.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/network/packets/EntityCreatePacket.kt index c4ffb34c..e525ec32 100644 --- a/src/main/kotlin/ru/dbotthepony/kstarbound/network/packets/EntityCreatePacket.kt +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/network/packets/EntityCreatePacket.kt @@ -39,29 +39,18 @@ class EntityCreatePacket(val entityType: EntityType, val storeData: ByteArrayLis connection.disconnect("Creating entity with ID $entityID outside of allowed range ${connection.entityIDRange}") } else { val entity = when (entityType) { - EntityType.PLAYER -> { - try { - val player = PlayerEntity(DataInputStream(FastByteArrayInputStream(storeData.elements(), 0, storeData.size)), connection.isLegacy) - player.networkGroup.read(firstNetState, isLegacy = connection.isLegacy) - - val (data) = player.networkGroup.write(isLegacy = true) - player.networkGroup.read(data, isLegacy = true) - player - } catch (err: Throwable) { - LOGGER.error("", err) - null - } - } - + EntityType.PLAYER -> PlayerEntity(DataInputStream(FastByteArrayInputStream(storeData.elements(), 0, storeData.size)), connection.isLegacy) else -> null } - entity?.entityID = entityID - entity?.isRemote = true - entity?.networkGroup?.upstream?.enableInterpolation(0.0) + entity ?: return + entity.networkGroup.read(firstNetState, isLegacy = true) + entity.entityID = entityID + entity.isRemote = true + entity.networkGroup.upstream.enableInterpolation(0.0) connection.enqueue { - entity?.joinWorld(this) + entity.joinWorld(this) } } } diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/network/packets/serverbound/SpawnEntityPacket.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/network/packets/serverbound/SpawnEntityPacket.kt new file mode 100644 index 00000000..9b7f9745 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/network/packets/serverbound/SpawnEntityPacket.kt @@ -0,0 +1,41 @@ +package ru.dbotthepony.kstarbound.network.packets.serverbound + +import it.unimi.dsi.fastutil.bytes.ByteArrayList +import it.unimi.dsi.fastutil.io.FastByteArrayInputStream +import ru.dbotthepony.kommons.io.readByteArray +import ru.dbotthepony.kommons.io.writeByteArray +import ru.dbotthepony.kstarbound.defs.EntityType +import ru.dbotthepony.kstarbound.network.IServerPacket +import ru.dbotthepony.kstarbound.server.ServerConnection +import ru.dbotthepony.kstarbound.world.entities.ItemDropEntity +import java.io.DataInputStream +import java.io.DataOutputStream + +// similar to EntityCreatePacket, except client transfers ownership of entity to server +class SpawnEntityPacket(val entityType: EntityType, val storeData: ByteArrayList, val firstNetState: ByteArrayList,) : IServerPacket { + constructor(stream: DataInputStream, isLegacy: Boolean) : this( + EntityType.entries[stream.readUnsignedByte()], + ByteArrayList.wrap(stream.readByteArray()), + ByteArrayList.wrap(stream.readByteArray()), + ) + + override fun write(stream: DataOutputStream, isLegacy: Boolean) { + stream.writeByte(entityType.ordinal) + stream.writeByteArray(storeData.elements(), 0, storeData.size) + stream.writeByteArray(firstNetState.elements(), 0, firstNetState.size) + } + + override fun play(connection: ServerConnection) { + val entity = when (entityType) { + EntityType.ITEM_DROP -> ItemDropEntity(DataInputStream(FastByteArrayInputStream(storeData.elements(), 0, storeData.size)), connection.isLegacy) + else -> null + } + + entity ?: return + entity.networkGroup.read(firstNetState, isLegacy = connection.isLegacy) + + connection.enqueue { + entity.joinWorld(this) + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/world/World.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/world/World.kt index e0cc2fd0..b9b77cc2 100644 --- a/src/main/kotlin/ru/dbotthepony/kstarbound/world/World.kt +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/world/World.kt @@ -217,7 +217,7 @@ abstract class World, ChunkType : Chunk, ChunkType : Chunk ) } } diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/world/entities/MovementController.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/world/entities/MovementController.kt index 67fdf788..eaa00d86 100644 --- a/src/main/kotlin/ru/dbotthepony/kstarbound/world/entities/MovementController.kt +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/world/entities/MovementController.kt @@ -408,7 +408,7 @@ open class MovementController() { if (!isZeroGravity && stickingDirection == null) { val buoyancy = (movementParameters.liquidBuoyancy ?: 0.0).coerceIn(0.0, 1.0) + liquidPercentage + (movementParameters.airBuoyancy ?: 0.0).coerceIn(0.0, 1.0) * (1.0 - liquidPercentage) val gravity = determineGravity() * (movementParameters.gravityMultiplier ?: 1.0) * (1.0 - buoyancy) - var environmentVelocity = gravity * delta + var environmentVelocity = -gravity * delta if (isOnGround && (movementParameters.slopeSlidingFactor ?: 0.0) != 0.0 && surfaceSlope != Vector2d.ZERO) environmentVelocity += -surfaceSlope * (surfaceSlope.x * surfaceSlope.y) * (movementParameters.slopeSlidingFactor ?: 0.0)