diff --git a/src/main/java/de/bixilon/minosoft/data/entities/entities/decoration/armorstand/ArmorStand.kt b/src/main/java/de/bixilon/minosoft/data/entities/entities/decoration/armorstand/ArmorStand.kt index 4c423e0f8..4f1e47e56 100644 --- a/src/main/java/de/bixilon/minosoft/data/entities/entities/decoration/armorstand/ArmorStand.kt +++ b/src/main/java/de/bixilon/minosoft/data/entities/entities/decoration/armorstand/ArmorStand.kt @@ -15,6 +15,7 @@ package de.bixilon.minosoft.data.entities.entities.decoration.armorstand import de.bixilon.kotlinglm.vec2.Vec2 import de.bixilon.kotlinglm.vec3.Vec3 import de.bixilon.kotlinglm.vec3.Vec3d +import de.bixilon.kutil.bit.BitByte.isBitMask import de.bixilon.minosoft.data.entities.EntityRotation import de.bixilon.minosoft.data.entities.data.EntityData import de.bixilon.minosoft.data.entities.data.EntityDataField @@ -28,13 +29,31 @@ import de.bixilon.minosoft.data.text.formatting.color.RGBColor import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection class ArmorStand(connection: PlayConnection, entityType: EntityType, data: EntityData, position: Vec3d, rotation: EntityRotation) : LivingEntity(connection, entityType, data, position, rotation) { + private var flags = 0 + + init { + data.observe(FLAGS_DATA) { updateFlags(it ?: 0x00) } + updateFlags(data.get(FLAGS_DATA, 0x00)) + } + + private fun updateFlags(flags: Int) { + this.flags = flags + + this.dimensions = when { + isMarker -> DIMENSIONS_MARKER + isSmall -> DIMENSIONS_SMALL + else -> DIMENSIONS + } + } private fun getArmorStandFlag(bitMask: Int): Boolean { - return data.getBitMask(FLAGS_DATA, bitMask, 0x00) + return flags.isBitMask(bitMask) } override val canRaycast: Boolean get() = super.canRaycast && !isMarker override val hitboxColor: RGBColor? get() = if (isMarker) null else super.hitboxColor + override var dimensions: Vec2 = DIMENSIONS + private set @get:SynchronizedEntityData val isSmall: Boolean @@ -76,12 +95,11 @@ class ArmorStand(connection: PlayConnection, entityType: EntityType, data: Entit val rightLegRotation: Vec3 get() = data.get(RIGHT_LEG_ROTATION_DATA, Vec3(1.0f, 0.0f, 1.0f)) - override val dimensions: Vec2 - get() = when { - isMarker -> DIMENSIONS_MARKER - isSmall -> DIMENSIONS_SMALL - else -> DIMENSIONS - } + + override fun tick() { + if (isMarker && age % 20 != 0) return // tick them really slow to improve performance + super.tick() + } companion object : EntityFactory { diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/instance/TransformInstance.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/instance/TransformInstance.kt index fa3fbe0c5..20268196d 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/instance/TransformInstance.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/instance/TransformInstance.kt @@ -38,7 +38,7 @@ class TransformInstance( fun pack(buffer: FloatBuffer, parent: Mat4, cache: Array) { val temp = cache[this.id] - parent.times(value, temp) + parent.times(value, temp) // TODO: dom't multiply them on the rendering thread val offset = this.id * Mat4.length for (index in 0 until Mat4.length) { diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/texture/skin/vanilla/DefaultSkinProvider.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/texture/skin/vanilla/DefaultSkinProvider.kt index cdbd95b15..3bdedb0cf 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/texture/skin/vanilla/DefaultSkinProvider.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/texture/skin/vanilla/DefaultSkinProvider.kt @@ -41,8 +41,12 @@ class DefaultSkinProvider( private fun load(skin: DefaultSkin) { var loaded = 0 - load(skin.name.skin("slim").texture())?.let { slim[skin.name] = it; loaded++ } - load(skin.name.skin("wide").texture())?.let { wide[skin.name] = it; loaded++ } + load(skin.name.skin("slim").texture())?.apply { slim[skin.name] = this; loaded++ } + val wide = load(skin.name.skin("wide").texture())?.apply { wide[skin.name] = this; loaded++ } + + if (this.fallback == null && wide != null) { + fallback = PlayerSkin(wide, null, SkinModel.WIDE) + } if (loaded > 0) { return diff --git a/src/main/java/de/bixilon/minosoft/terminal/commands/connection/BenchmarkCommand.kt b/src/main/java/de/bixilon/minosoft/terminal/commands/connection/BenchmarkCommand.kt index 516fd0433..6ff9f1500 100644 --- a/src/main/java/de/bixilon/minosoft/terminal/commands/connection/BenchmarkCommand.kt +++ b/src/main/java/de/bixilon/minosoft/terminal/commands/connection/BenchmarkCommand.kt @@ -46,7 +46,7 @@ object BenchmarkCommand : ConnectionCommand { val random = Random() val entities: MutableList = ArrayList(count) - val spread = minOf(cbrt(count.toDouble()), 5.0) + val spread = maxOf(cbrt(count.toDouble()), 5.0) for (id in 0 until count) { val position = offset + Vec3d(random.nextDouble(-spread, spread), random.nextDouble(-spread, spread), random.nextDouble(-spread, spread)) val rotation = EntityRotation(random.nextFloat(-179.0f, 179.0f), random.nextFloat(-89.0f, 89.0f))