From fa9981204b95bb07f55e5b983aba3ed9e8bf3273 Mon Sep 17 00:00:00 2001 From: Moritz Zwerger Date: Sun, 9 Jun 2024 23:20:39 +0200 Subject: [PATCH] entity flags: fix class cast exception Flags are mostly in the protocol a byte, but we will just work with ints. Fine. But observers are registered on ints, but the actual type is a byte, hence it crashes. --- .../bixilon/minosoft/data/entities/data/EntityDataField.kt | 7 +++++-- .../de/bixilon/minosoft/data/entities/entities/Entity.kt | 3 ++- .../minosoft/data/entities/entities/LivingEntity.kt | 5 +++-- .../java/de/bixilon/minosoft/data/entities/entities/Mob.kt | 5 +++-- .../entities/entities/decoration/armorstand/ArmorStand.kt | 5 +++-- .../minosoft/data/entities/entities/player/PlayerEntity.kt | 4 ++-- 6 files changed, 18 insertions(+), 11 deletions(-) diff --git a/src/main/java/de/bixilon/minosoft/data/entities/data/EntityDataField.kt b/src/main/java/de/bixilon/minosoft/data/entities/data/EntityDataField.kt index f44c682d2..25fcf758f 100644 --- a/src/main/java/de/bixilon/minosoft/data/entities/data/EntityDataField.kt +++ b/src/main/java/de/bixilon/minosoft/data/entities/data/EntityDataField.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2020-2022 Moritz Zwerger + * Copyright (C) 2020-2024 Moritz Zwerger * * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. * @@ -13,4 +13,7 @@ package de.bixilon.minosoft.data.entities.data -class EntityDataField(vararg val names: String) +class EntityDataField(vararg val names: String) { + + override fun toString() = names.contentToString() +} diff --git a/src/main/java/de/bixilon/minosoft/data/entities/entities/Entity.kt b/src/main/java/de/bixilon/minosoft/data/entities/entities/Entity.kt index 6df8ae5da..6e29d75d5 100644 --- a/src/main/java/de/bixilon/minosoft/data/entities/entities/Entity.kt +++ b/src/main/java/de/bixilon/minosoft/data/entities/entities/Entity.kt @@ -19,6 +19,7 @@ import de.bixilon.kutil.bit.BitByte.isBitMask import de.bixilon.kutil.cast.CastUtil.unsafeCast import de.bixilon.kutil.cast.CastUtil.unsafeNull import de.bixilon.kutil.primitive.BooleanUtil.toBoolean +import de.bixilon.kutil.primitive.IntUtil.toInt import de.bixilon.kutil.reflection.ReflectionUtil.field import de.bixilon.kutil.reflection.ReflectionUtil.getFieldOrNull import de.bixilon.kutil.time.TimeUtil.millis @@ -52,7 +53,7 @@ abstract class Entity( private var initialPosition: Vec3d, private var initialRotation: EntityRotation, ) : Initializable, EntityAttachable { - private var flags: Int by data(FLAGS_DATA, 0x00) + private var flags: Int by data(FLAGS_DATA, 0x00) { it.toInt() } protected val random = Random() val id: Int? get() = connection.world.entities.getId(this) diff --git a/src/main/java/de/bixilon/minosoft/data/entities/entities/LivingEntity.kt b/src/main/java/de/bixilon/minosoft/data/entities/entities/LivingEntity.kt index 26fd5f94c..bfbca90e0 100644 --- a/src/main/java/de/bixilon/minosoft/data/entities/entities/LivingEntity.kt +++ b/src/main/java/de/bixilon/minosoft/data/entities/entities/LivingEntity.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2020-2023 Moritz Zwerger + * Copyright (C) 2020-2024 Moritz Zwerger * * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. * @@ -17,6 +17,7 @@ import de.bixilon.kotlinglm.vec3.Vec3i import de.bixilon.kutil.bit.BitByte.isBitMask import de.bixilon.kutil.cast.CastUtil.nullCast import de.bixilon.kutil.cast.CastUtil.unsafeCast +import de.bixilon.kutil.primitive.IntUtil.toInt import de.bixilon.minosoft.data.container.equipment.EntityEquipment import de.bixilon.minosoft.data.entities.EntityRotation import de.bixilon.minosoft.data.entities.Poses @@ -50,7 +51,7 @@ abstract class LivingEntity(connection: PlayConnection, entityType: EntityType, override val canRaycast: Boolean get() = super.canRaycast && health > 0.0 override val name: ChatComponent? get() = super.name - private var flags by data(FLAGS_DATA, 0x00) + private var flags by data(FLAGS_DATA, 0x00) { it.toInt() } private fun getLivingEntityFlag(bitMask: Int): Boolean { return flags.isBitMask(bitMask) } diff --git a/src/main/java/de/bixilon/minosoft/data/entities/entities/Mob.kt b/src/main/java/de/bixilon/minosoft/data/entities/entities/Mob.kt index c20d4ed5c..16661a061 100644 --- a/src/main/java/de/bixilon/minosoft/data/entities/entities/Mob.kt +++ b/src/main/java/de/bixilon/minosoft/data/entities/entities/Mob.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2020-2023 Moritz Zwerger + * Copyright (C) 2020-2024 Moritz Zwerger * * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. * @@ -14,6 +14,7 @@ package de.bixilon.minosoft.data.entities.entities import de.bixilon.kotlinglm.vec3.Vec3d import de.bixilon.kutil.bit.BitByte.isBitMask +import de.bixilon.kutil.primitive.IntUtil.toInt import de.bixilon.minosoft.data.entities.EntityRotation import de.bixilon.minosoft.data.entities.data.EntityData import de.bixilon.minosoft.data.entities.data.EntityDataField @@ -21,7 +22,7 @@ import de.bixilon.minosoft.data.registries.entities.EntityType import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection abstract class Mob(connection: PlayConnection, entityType: EntityType, data: EntityData, position: Vec3d, rotation: EntityRotation) : LivingEntity(connection, entityType, data, position, rotation) { - private var flags by data(FLAGS_DATA, 0x00) + private var flags by data(FLAGS_DATA, 0x00) { it.toInt() } private fun getMobFlags(bitMask: Int): Boolean { return flags.isBitMask(bitMask) 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 92b38be02..330f37157 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 @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2020-2023 Moritz Zwerger + * Copyright (C) 2020-2024 Moritz Zwerger * * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. * @@ -17,6 +17,7 @@ import de.bixilon.kotlinglm.vec3.Vec3 import de.bixilon.kotlinglm.vec3.Vec3d import de.bixilon.kutil.bit.BitByte.isBitMask import de.bixilon.kutil.observer.DataObserver.Companion.observe +import de.bixilon.kutil.primitive.IntUtil.toInt import de.bixilon.minosoft.data.entities.EntityRotation import de.bixilon.minosoft.data.entities.data.EntityData import de.bixilon.minosoft.data.entities.data.EntityDataField @@ -31,7 +32,7 @@ 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 by data(FLAGS_DATA, 0x00) + private var flags: Int by data(FLAGS_DATA, 0x00) { it.toInt() } private fun updateFlags() { this.dimensions = when { diff --git a/src/main/java/de/bixilon/minosoft/data/entities/entities/player/PlayerEntity.kt b/src/main/java/de/bixilon/minosoft/data/entities/entities/player/PlayerEntity.kt index 50a26312f..03f78e673 100644 --- a/src/main/java/de/bixilon/minosoft/data/entities/entities/player/PlayerEntity.kt +++ b/src/main/java/de/bixilon/minosoft/data/entities/entities/player/PlayerEntity.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2020-2023 Moritz Zwerger + * Copyright (C) 2020-2024 Moritz Zwerger * * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. * @@ -110,7 +110,7 @@ abstract class PlayerEntity( data.observe(SKIN_PARTS_DATA) { raw: Any? -> updateSkinParts(raw?.toInt() ?: 0xFF) } } - private var _mainArm by data(MAIN_ARM_DATA, 0x01) + private var _mainArm by data(MAIN_ARM_DATA, 0x01) { it.toInt() } @get:SynchronizedEntityData open val mainArm: Arms