diff options
Diffstat (limited to 'src/main/kotlin/gui/entity/ModifyPlayerSkin.kt')
| -rw-r--r-- | src/main/kotlin/gui/entity/ModifyPlayerSkin.kt | 84 |
1 files changed, 47 insertions, 37 deletions
diff --git a/src/main/kotlin/gui/entity/ModifyPlayerSkin.kt b/src/main/kotlin/gui/entity/ModifyPlayerSkin.kt index 28f0070..0b393bb 100644 --- a/src/main/kotlin/gui/entity/ModifyPlayerSkin.kt +++ b/src/main/kotlin/gui/entity/ModifyPlayerSkin.kt @@ -1,47 +1,57 @@ - package moe.nea.firmament.gui.entity import com.google.gson.JsonObject import com.google.gson.JsonPrimitive import kotlin.experimental.and import kotlin.experimental.or -import net.minecraft.client.util.SkinTextures -import net.minecraft.entity.LivingEntity -import net.minecraft.entity.player.PlayerEntity -import net.minecraft.entity.player.PlayerModelPart -import net.minecraft.util.Identifier +import net.minecraft.client.entity.ClientAvatarEntity +import net.minecraft.world.entity.LivingEntity +import net.minecraft.world.entity.Avatar +import net.minecraft.world.entity.player.Player +import net.minecraft.world.entity.player.PlayerModelPart +import net.minecraft.world.entity.player.PlayerModelType +import net.minecraft.world.entity.player.PlayerSkin +import net.minecraft.core.ClientAsset +import net.minecraft.resources.ResourceLocation object ModifyPlayerSkin : EntityModifier { - val playerModelPartIndex = PlayerModelPart.entries.associateBy { it.getName() } - override fun apply(entity: LivingEntity, info: JsonObject): LivingEntity { - require(entity is GuiPlayer) - info["cape"]?.let { - entity.capeTexture = Identifier.of(it.asString) - } - info["skin"]?.let { - entity.skinTexture = Identifier.of(it.asString) - } - info["slim"]?.let { - entity.model = if (it.asBoolean) SkinTextures.Model.SLIM else SkinTextures.Model.WIDE - } - info["parts"]?.let { - var trackedData = entity.dataTracker.get(PlayerEntity.PLAYER_MODEL_PARTS) - if (it is JsonPrimitive && it.isBoolean) { - trackedData = (if (it.asBoolean) -1 else 0).toByte() - } else { - val obj = it.asJsonObject - for ((k, v) in obj.entrySet()) { - val part = playerModelPartIndex[k]!! - trackedData = if (v.asBoolean) { - trackedData and (part.bitFlag.inv().toByte()) - } else { - trackedData or (part.bitFlag.toByte()) - } - } - } - entity.dataTracker.set(PlayerEntity.PLAYER_MODEL_PARTS, trackedData) - } - return entity - } + val playerModelPartIndex = PlayerModelPart.entries.associateBy { it.id } + override fun apply(entity: LivingEntity, info: JsonObject): LivingEntity { + require(entity is GuiPlayer) + var capeTexture = entity.skinTextures.cape + var model = entity.skinTextures.model + var bodyTexture = entity.skinTextures.body + fun mkTexAsset(id: ResourceLocation) = ClientAsset.ResourceTexture(id, id) + info["cape"]?.let { + capeTexture = mkTexAsset(ResourceLocation.parse(it.asString)) + } + info["skin"]?.let { + bodyTexture = mkTexAsset(ResourceLocation.parse(it.asString)) + } + info["slim"]?.let { + model = if (it.asBoolean) PlayerModelType.SLIM else PlayerModelType.WIDE + } + info["parts"]?.let { + var trackedData = entity.entityData.get(Avatar.DATA_PLAYER_MODE_CUSTOMISATION) + if (it is JsonPrimitive && it.isBoolean) { + trackedData = (if (it.asBoolean) -1 else 0).toByte() + } else { + val obj = it.asJsonObject + for ((k, v) in obj.entrySet()) { + val part = playerModelPartIndex[k]!! + trackedData = if (v.asBoolean) { + trackedData and (part.mask.inv().toByte()) + } else { + trackedData or (part.mask.toByte()) + } + } + } + entity.entityData.set(Player.DATA_PLAYER_MODE_CUSTOMISATION, trackedData) + } + entity.skinTextures = PlayerSkin( + bodyTexture, capeTexture, null, model, true + ) + return entity + } } |
