entity object data: item frame rotation, falling block state, projectile owner

This commit is contained in:
Bixilon 2021-06-06 23:40:17 +02:00 committed by Lukas
parent 5871e553f5
commit 08099c981d
7 changed files with 36 additions and 6 deletions

View File

@ -157,7 +157,7 @@ object DefaultEntityFactories : DefaultFactory<EntityFactory<out Entity>>(
ZombiePigman,
ZombifiedPiglin,
RemotePlayerEntity,
FishingHook,
FishingBobber,
GlowSquid,
EvokerFangs,
) {

View File

@ -320,6 +320,8 @@ abstract class Entity(
return maxLevel
}
open fun setObjectData(data: Int) {}
companion object {
private const val HITBOX_MARGIN = 1e-5f

View File

@ -12,6 +12,7 @@
*/
package de.bixilon.minosoft.data.entities.entities.decoration
import de.bixilon.minosoft.data.Directions
import de.bixilon.minosoft.data.entities.EntityMetaDataFields
import de.bixilon.minosoft.data.entities.EntityRotation
import de.bixilon.minosoft.data.entities.entities.EntityMetaDataFunction
@ -32,6 +33,14 @@ open class ItemFrame(connection: PlayConnection, entityType: EntityType, positio
val itemRotation: Int
get() = entityMetaData.sets.getInt(EntityMetaDataFields.ITEM_FRAME_ROTATION)
@get:EntityMetaDataFunction(name = "Owner")
var facing: Directions = Directions.NORTH
override fun setObjectData(data: Int) {
facing = Directions[data]
}
companion object : EntityFactory<ItemFrame> {
override val RESOURCE_LOCATION: ResourceLocation = ResourceLocation("item_frame")

View File

@ -17,6 +17,7 @@ import de.bixilon.minosoft.data.entities.EntityRotation
import de.bixilon.minosoft.data.entities.entities.Entity
import de.bixilon.minosoft.data.entities.entities.EntityMetaDataFunction
import de.bixilon.minosoft.data.mappings.ResourceLocation
import de.bixilon.minosoft.data.mappings.blocks.BlockState
import de.bixilon.minosoft.data.mappings.entities.EntityFactory
import de.bixilon.minosoft.data.mappings.entities.EntityType
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
@ -24,11 +25,19 @@ import glm_.vec3.Vec3d
import glm_.vec3.Vec3i
class FallingBlock(connection: PlayConnection, entityType: EntityType, position: Vec3d, rotation: EntityRotation) : Entity(connection, entityType, position, rotation) {
@get:EntityMetaDataFunction(name = "Block state")
var blockState: BlockState? = null
@get:EntityMetaDataFunction(name = "Spawn position")
val spawnPosition: Vec3i?
get() = entityMetaData.sets.getBlockPosition(EntityMetaDataFields.FALLING_BLOCK_SPAWN_POSITION)
override fun setObjectData(data: Int) {
blockState = connection.registries.getBlockState(data)
}
companion object : EntityFactory<FallingBlock> {
override val RESOURCE_LOCATION: ResourceLocation = ResourceLocation("falling_block")

View File

@ -21,7 +21,7 @@ import de.bixilon.minosoft.data.mappings.entities.EntityType
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
import glm_.vec3.Vec3d
class FishingHook(connection: PlayConnection, entityType: EntityType, position: Vec3d, rotation: EntityRotation) : Projectile(connection, entityType, position, rotation) {
class FishingBobber(connection: PlayConnection, entityType: EntityType, position: Vec3d, rotation: EntityRotation) : Projectile(connection, entityType, position, rotation) {
@get:EntityMetaDataFunction(name = "Hooked entity id")
val hookedEntityId: Int
@ -32,11 +32,11 @@ class FishingHook(connection: PlayConnection, entityType: EntityType, position:
get() = entityMetaData.sets.getBoolean(EntityMetaDataFields.FISHING_HOOK_CATCHABLE)
companion object : EntityFactory<FishingHook> {
companion object : EntityFactory<FishingBobber> {
override val RESOURCE_LOCATION: ResourceLocation = ResourceLocation("fishing_bobber")
override fun build(connection: PlayConnection, entityType: EntityType, position: Vec3d, rotation: EntityRotation): FishingHook {
return FishingHook(connection, entityType, position, rotation)
override fun build(connection: PlayConnection, entityType: EntityType, position: Vec3d, rotation: EntityRotation): FishingBobber {
return FishingBobber(connection, entityType, position, rotation)
}
}
}

View File

@ -14,8 +14,17 @@ package de.bixilon.minosoft.data.entities.entities.projectile
import de.bixilon.minosoft.data.entities.EntityRotation
import de.bixilon.minosoft.data.entities.entities.Entity
import de.bixilon.minosoft.data.entities.entities.EntityMetaDataFunction
import de.bixilon.minosoft.data.mappings.entities.EntityType
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
import glm_.vec3.Vec3d
abstract class Projectile(connection: PlayConnection, entityType: EntityType, position: Vec3d, rotation: EntityRotation) : Entity(connection, entityType, position, rotation)
abstract class Projectile(connection: PlayConnection, entityType: EntityType, position: Vec3d, rotation: EntityRotation) : Entity(connection, entityType, position, rotation) {
@get:EntityMetaDataFunction(name = "Owner")
var owner: Entity? = null
override fun setObjectData(data: Int) {
owner = connection.world.entities[data]
}
}

View File

@ -60,6 +60,7 @@ class EntityObjectSpawnS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket() {
} else {
buffer.connection.registries.entityTypeRegistry[type].build(buffer.connection, position, rotation, null, buffer.versionId)!!
}
entity.setObjectData(data)
}
override fun handle(connection: PlayConnection) {