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, ZombiePigman,
ZombifiedPiglin, ZombifiedPiglin,
RemotePlayerEntity, RemotePlayerEntity,
FishingHook, FishingBobber,
GlowSquid, GlowSquid,
EvokerFangs, EvokerFangs,
) { ) {

View File

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

View File

@ -12,6 +12,7 @@
*/ */
package de.bixilon.minosoft.data.entities.entities.decoration 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.EntityMetaDataFields
import de.bixilon.minosoft.data.entities.EntityRotation import de.bixilon.minosoft.data.entities.EntityRotation
import de.bixilon.minosoft.data.entities.entities.EntityMetaDataFunction import de.bixilon.minosoft.data.entities.entities.EntityMetaDataFunction
@ -32,6 +33,14 @@ open class ItemFrame(connection: PlayConnection, entityType: EntityType, positio
val itemRotation: Int val itemRotation: Int
get() = entityMetaData.sets.getInt(EntityMetaDataFields.ITEM_FRAME_ROTATION) 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> { companion object : EntityFactory<ItemFrame> {
override val RESOURCE_LOCATION: ResourceLocation = ResourceLocation("item_frame") 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.Entity
import de.bixilon.minosoft.data.entities.entities.EntityMetaDataFunction import de.bixilon.minosoft.data.entities.entities.EntityMetaDataFunction
import de.bixilon.minosoft.data.mappings.ResourceLocation 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.EntityFactory
import de.bixilon.minosoft.data.mappings.entities.EntityType import de.bixilon.minosoft.data.mappings.entities.EntityType
import de.bixilon.minosoft.protocol.network.connection.PlayConnection import de.bixilon.minosoft.protocol.network.connection.PlayConnection
@ -24,11 +25,19 @@ import glm_.vec3.Vec3d
import glm_.vec3.Vec3i import glm_.vec3.Vec3i
class FallingBlock(connection: PlayConnection, entityType: EntityType, position: Vec3d, rotation: EntityRotation) : Entity(connection, entityType, position, rotation) { 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") @get:EntityMetaDataFunction(name = "Spawn position")
val spawnPosition: Vec3i? val spawnPosition: Vec3i?
get() = entityMetaData.sets.getBlockPosition(EntityMetaDataFields.FALLING_BLOCK_SPAWN_POSITION) get() = entityMetaData.sets.getBlockPosition(EntityMetaDataFields.FALLING_BLOCK_SPAWN_POSITION)
override fun setObjectData(data: Int) {
blockState = connection.registries.getBlockState(data)
}
companion object : EntityFactory<FallingBlock> { companion object : EntityFactory<FallingBlock> {
override val RESOURCE_LOCATION: ResourceLocation = ResourceLocation("falling_block") 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 de.bixilon.minosoft.protocol.network.connection.PlayConnection
import glm_.vec3.Vec3d 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") @get:EntityMetaDataFunction(name = "Hooked entity id")
val hookedEntityId: Int val hookedEntityId: Int
@ -32,11 +32,11 @@ class FishingHook(connection: PlayConnection, entityType: EntityType, position:
get() = entityMetaData.sets.getBoolean(EntityMetaDataFields.FISHING_HOOK_CATCHABLE) 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 val RESOURCE_LOCATION: ResourceLocation = ResourceLocation("fishing_bobber")
override fun build(connection: PlayConnection, entityType: EntityType, position: Vec3d, rotation: EntityRotation): FishingHook { override fun build(connection: PlayConnection, entityType: EntityType, position: Vec3d, rotation: EntityRotation): FishingBobber {
return FishingHook(connection, entityType, position, rotation) 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.EntityRotation
import de.bixilon.minosoft.data.entities.entities.Entity 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.data.mappings.entities.EntityType
import de.bixilon.minosoft.protocol.network.connection.PlayConnection import de.bixilon.minosoft.protocol.network.connection.PlayConnection
import glm_.vec3.Vec3d 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 { } else {
buffer.connection.registries.entityTypeRegistry[type].build(buffer.connection, position, rotation, null, buffer.versionId)!! buffer.connection.registries.entityTypeRegistry[type].build(buffer.connection, position, rotation, null, buffer.versionId)!!
} }
entity.setObjectData(data)
} }
override fun handle(connection: PlayConnection) { override fun handle(connection: PlayConnection) {