forbid server to update local skin layers

This commit is contained in:
Bixilon 2022-12-14 16:52:37 +01:00
parent aa9533712f
commit 789e8834e3
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
5 changed files with 48 additions and 56 deletions

View File

@ -14,6 +14,8 @@
package de.bixilon.minosoft.config.profile.profiles.connection.skin package de.bixilon.minosoft.config.profile.profiles.connection.skin
import com.fasterxml.jackson.annotation.JsonIgnore import com.fasterxml.jackson.annotation.JsonIgnore
import de.bixilon.kutil.observer.DataObserver.Companion.observe
import de.bixilon.kutil.observer.set.SetObserver.Companion.observedSet
import de.bixilon.minosoft.config.profile.delegate.primitive.BooleanDelegate import de.bixilon.minosoft.config.profile.delegate.primitive.BooleanDelegate
import de.bixilon.minosoft.config.profile.profiles.connection.ConnectionProfile import de.bixilon.minosoft.config.profile.profiles.connection.ConnectionProfile
import de.bixilon.minosoft.data.entities.entities.player.SkinParts import de.bixilon.minosoft.data.entities.entities.player.SkinParts
@ -62,30 +64,24 @@ class SkinC(profile: ConnectionProfile) {
var hat by BooleanDelegate(profile, true) var hat by BooleanDelegate(profile, true)
@get:JsonIgnore val skinParts: Array<SkinParts> @get:JsonIgnore val parts: MutableSet<SkinParts> by observedSet(mutableSetOf())
get() {
val parts: MutableSet<SkinParts> = mutableSetOf() private fun updateParts(part: SkinParts, add: Boolean) {
if (cape) { if (add) {
parts += SkinParts.CAPE parts += part
} } else {
if (jacket) { parts -= part
parts += SkinParts.JACKET
}
if (leftSleeve) {
parts += SkinParts.LEFT_SLEEVE
}
if (rightSleeve) {
parts += SkinParts.RIGHT_SLEEVE
}
if (leftPants) {
parts += SkinParts.LEFT_PANTS
}
if (rightPants) {
parts += SkinParts.RIGHT_PANTS
}
if (hat) {
parts += SkinParts.HAT
}
return parts.toTypedArray()
} }
}
init {
this::cape.observe(this, true) { updateParts(SkinParts.CAPE, it) }
this::jacket.observe(this, true) { updateParts(SkinParts.JACKET, it) }
this::leftSleeve.observe(this, true) { updateParts(SkinParts.LEFT_SLEEVE, it) }
this::rightSleeve.observe(this, true) { updateParts(SkinParts.RIGHT_SLEEVE, it) }
this::leftPants.observe(this, true) { updateParts(SkinParts.LEFT_PANTS, it) }
this::rightPants.observe(this, true) { updateParts(SkinParts.RIGHT_PANTS, it) }
this::hat.observe(this, true) { updateParts(SkinParts.HAT, it) }
}
} }

View File

@ -82,22 +82,19 @@ abstract class PlayerEntity(
val skinParts: MutableSet<SkinParts> by observedSet(mutableSetOf()) val skinParts: MutableSet<SkinParts> by observedSet(mutableSetOf())
init { protected open fun updateSkinParts(flags: Int) {
data.observe(SKIN_PARTS_DATA) { raw: Any? -> for (part in SkinParts.VALUES) {
if (raw == null) { if (!flags.isBitMask(part.bitmask)) {
skinParts.clear() skinParts -= part
return@observe
}
val flags = raw.toInt()
for (part in SkinParts.VALUES) {
if (!flags.isBitMask(part.bitmask)) {
skinParts -= part
}
skinParts += part
} }
skinParts += part
} }
} }
init {
data.observe(SKIN_PARTS_DATA) { raw: Any? -> updateSkinParts(raw?.toInt() ?: 0) }
}
@get:SynchronizedEntityData @get:SynchronizedEntityData
open val mainArm: Arms open val mainArm: Arms
get() = if (data.get(MAIN_ARM_DATA, 0x00.toByte()).toInt() == 0x01) Arms.RIGHT else Arms.LEFT get() = if (data.get(MAIN_ARM_DATA, 0x00.toByte()).toInt() == 0x01) Arms.RIGHT else Arms.LEFT

View File

@ -30,6 +30,7 @@ import de.bixilon.kutil.collections.map.bi.SynchronizedBiMap
import de.bixilon.kutil.math.interpolation.DoubleInterpolation.interpolateLinear import de.bixilon.kutil.math.interpolation.DoubleInterpolation.interpolateLinear
import de.bixilon.kutil.observer.DataObserver.Companion.observe import de.bixilon.kutil.observer.DataObserver.Companion.observe
import de.bixilon.kutil.observer.DataObserver.Companion.observed import de.bixilon.kutil.observer.DataObserver.Companion.observed
import de.bixilon.kutil.observer.set.SetObserver.Companion.observeSet
import de.bixilon.kutil.primitive.BooleanUtil.decide import de.bixilon.kutil.primitive.BooleanUtil.decide
import de.bixilon.kutil.time.TimeUtil.millis import de.bixilon.kutil.time.TimeUtil.millis
import de.bixilon.minosoft.data.Axes import de.bixilon.minosoft.data.Axes
@ -105,6 +106,7 @@ class LocalPlayerEntity(
equipment.remove(EquipmentSlots.MAIN_HAND) equipment.remove(EquipmentSlots.MAIN_HAND)
equipment[EquipmentSlots.MAIN_HAND] = inventory.getHotbarSlot(it) ?: return@observe equipment[EquipmentSlots.MAIN_HAND] = inventory.getHotbarSlot(it) ?: return@observe
} }
connection.profiles.connection.skin::parts.observeSet(this, true) { skinParts += it.adds; skinParts -= it.removes }
} }
var openedContainer: Container? = null var openedContainer: Container? = null
@ -593,6 +595,9 @@ class LocalPlayerEntity(
override val pushableByFluids: Boolean override val pushableByFluids: Boolean
get() = !baseAbilities.isFlying get() = !baseAbilities.isFlying
override fun updateSkinParts(flags: Int) = Unit
override fun tick() { override fun tick() {
if (connection.world[positionInfo.blockPosition.chunkPosition] == null) { if (connection.world[positionInfo.blockPosition.chunkPosition] == null) {
// chunk not loaded, so we don't tick? // chunk not loaded, so we don't tick?

View File

@ -56,6 +56,7 @@ class ArmOverlay(private val renderWindow: RenderWindow) : Overlay {
private fun poll() { private fun poll() {
val model = renderWindow.connection.player.model.nullCast<PlayerModel>() val model = renderWindow.connection.player.model.nullCast<PlayerModel>()
val skin = model?.skin val skin = model?.skin
// TODO: check skin parts
if (this.model == model && this.skin == skin) { if (this.model == model && this.skin == skin) {
return return
} }

View File

@ -44,15 +44,6 @@ class ClientSettingsManager(
profile::mainArm.observe(this) { sendClientSettings() } profile::mainArm.observe(this) { sendClientSettings() }
profile::playerListing.observe(this) { sendClientSettings() } profile::playerListing.observe(this) { sendClientSettings() }
val skin = profile.skin
skin::cape.observe(this) { sendClientSettings() }
skin::jacket.observe(this) { sendClientSettings() }
skin::leftSleeve.observe(this) { sendClientSettings() }
skin::rightSleeve.observe(this) { sendClientSettings() }
skin::leftPants.observe(this) { sendClientSettings() }
skin::rightPants.observe(this) { sendClientSettings() }
skin::hat.observe(this) { sendClientSettings() }
profile::language.observe(this) { sendLanguage() } profile::language.observe(this) { sendLanguage() }
connection.profiles.eros.general::language.observe(this) { sendLanguage() } connection.profiles.eros.general::language.observe(this) { sendLanguage() }
} }
@ -72,15 +63,17 @@ class ClientSettingsManager(
if (connection.network.state != ProtocolStates.PLAY) { if (connection.network.state != ProtocolStates.PLAY) {
return return
} }
connection.sendPacket(SettingsC2SP( connection.sendPacket(
locale = language, SettingsC2SP(
chatColors = connection.profiles.gui.chat.chatColors, locale = language,
viewDistance = connection.profiles.block.viewDistance, chatColors = connection.profiles.gui.chat.chatColors,
chatMode = connection.profiles.gui.chat.chatMode, viewDistance = connection.profiles.block.viewDistance,
skinParts = profile.skin.skinParts, chatMode = connection.profiles.gui.chat.chatMode,
mainArm = profile.mainArm, skinParts = profile.skin.parts.toTypedArray(),
disableTextFiltering = !connection.profiles.gui.chat.textFiltering, mainArm = profile.mainArm,
allowListing = profile.playerListing, disableTextFiltering = !connection.profiles.gui.chat.textFiltering,
)) allowListing = profile.playerListing,
)
)
} }
} }