1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
package moe.nea.firmament.features.texturepack
import com.google.gson.JsonObject
import com.mojang.serialization.MapCodec
import com.mojang.serialization.codecs.RecordCodecBuilder
import net.minecraft.client.renderer.item.ItemModelResolver
import net.minecraft.client.renderer.item.ItemStackRenderState
import net.minecraft.client.renderer.item.BlockModelWrapper
import net.minecraft.client.renderer.item.ItemModel
import net.minecraft.client.renderer.item.ItemModels
import net.minecraft.client.resources.model.ResolvableModel
import net.minecraft.client.multiplayer.ClientLevel
import net.minecraft.world.entity.LivingEntity
import net.minecraft.world.item.ItemDisplayContext
import net.minecraft.world.item.ItemStack
import net.minecraft.world.entity.ItemOwner
import net.minecraft.resources.ResourceLocation
object HeadModelChooser {
val IS_CHOOSING_HEAD_MODEL = ThreadLocal.withInitial { false }
interface HasExplicitHeadModelMarker {
fun markExplicitHead_Firmament()
fun isExplicitHeadModel_Firmament(): Boolean
companion object{
@JvmStatic
fun cast(state: ItemStackRenderState) = state as HasExplicitHeadModelMarker
}
}
data class Baked(val head: ItemModel, val regular: ItemModel) : ItemModel {
override fun update(
state: ItemStackRenderState,
stack: ItemStack?,
resolver: ItemModelResolver?,
displayContext: ItemDisplayContext,
world: ClientLevel?,
heldItemContext: ItemOwner?,
seed: Int
) {
val instance =
if (IS_CHOOSING_HEAD_MODEL.get()) {
HasExplicitHeadModelMarker.cast(state).markExplicitHead_Firmament()
head
} else {
regular
}
instance.update(state, stack, resolver, displayContext, world, heldItemContext, seed)
}
}
data class Unbaked(
val head: ItemModel.Unbaked,
val regular: ItemModel.Unbaked,
) : ItemModel.Unbaked {
override fun type(): MapCodec<out ItemModel.Unbaked> {
return CODEC
}
override fun bake(context: ItemModel.BakingContext): ItemModel {
return Baked(
head.bake(context),
regular.bake(context)
)
}
override fun resolveDependencies(resolver: ResolvableModel.Resolver) {
head.resolveDependencies(resolver)
regular.resolveDependencies(resolver)
}
companion object {
@JvmStatic
fun fromLegacyJson(jsonObject: JsonObject, unbakedModel: ItemModel.Unbaked): ItemModel.Unbaked {
val model = jsonObject["firmament:head_model"] ?: return unbakedModel
val modelUrl = model.asJsonPrimitive.asString
val headModel = BlockModelWrapper.Unbaked(ResourceLocation.parse(modelUrl), listOf())
return Unbaked(headModel, unbakedModel)
}
val CODEC = RecordCodecBuilder.mapCodec {
it.group(
ItemModels.CODEC.fieldOf("head")
.forGetter(Unbaked::head),
ItemModels.CODEC.fieldOf("regular")
.forGetter(Unbaked::regular),
).apply(it, ::Unbaked)
}
}
}
}
|