aboutsummaryrefslogtreecommitdiff
path: root/src/main/kotlin/gui/entity/ModifyPlayerSkin.kt
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/kotlin/gui/entity/ModifyPlayerSkin.kt')
-rw-r--r--src/main/kotlin/gui/entity/ModifyPlayerSkin.kt47
1 files changed, 47 insertions, 0 deletions
diff --git a/src/main/kotlin/gui/entity/ModifyPlayerSkin.kt b/src/main/kotlin/gui/entity/ModifyPlayerSkin.kt
new file mode 100644
index 0000000..28f0070
--- /dev/null
+++ b/src/main/kotlin/gui/entity/ModifyPlayerSkin.kt
@@ -0,0 +1,47 @@
+
+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
+
+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
+ }
+
+}