95 lines
2.5 KiB
Go
95 lines
2.5 KiB
Go
//go:build gl
|
||
|
||
// 实体可视映射:实体类型 → 贴图键/身高/动物模型(渲染.md §5.3)。
|
||
package main
|
||
|
||
import (
|
||
"mc/internal/entity"
|
||
"mc/internal/item"
|
||
"mc/internal/render"
|
||
)
|
||
|
||
// entitySkinKeys 实体皮肤候选(temperate 优先,回退短名)。
|
||
var entitySkinKeys = []string{
|
||
"entity/player/wide/steve",
|
||
"entity/steve",
|
||
"entity/zombie/zombie",
|
||
"entity/villager/villager",
|
||
"entity/cow/cow_temperate",
|
||
"entity/cow/cow",
|
||
"entity/pig/pig_temperate",
|
||
"entity/pig/pig",
|
||
"entity/sheep/sheep_temperate",
|
||
"entity/sheep/sheep",
|
||
"entity/sheep/sheep_fur",
|
||
"entity/sheep/sheep_wool",
|
||
"entity/chicken/chicken_temperate",
|
||
"entity/chicken/chicken",
|
||
}
|
||
|
||
// requiredEntitySkinGroups 必选皮肤候选组:组内任一键命中即可;全缺才品红占位。
|
||
var requiredEntitySkinGroups = [][]string{
|
||
{"entity/zombie/zombie"},
|
||
{"entity/villager/villager"},
|
||
{"entity/cow/cow_temperate", "entity/cow/cow"},
|
||
{"entity/pig/pig_temperate", "entity/pig/pig"},
|
||
{"entity/sheep/sheep_temperate", "entity/sheep/sheep"},
|
||
{"entity/chicken/chicken_temperate", "entity/chicken/chicken"},
|
||
}
|
||
|
||
func firstUV(r *render.Renderer, keys ...string) ([4]float32, bool) {
|
||
for _, k := range keys {
|
||
if uv, ok := r.EntityUV(k); ok {
|
||
return uv, true
|
||
}
|
||
}
|
||
return [4]float32{}, false
|
||
}
|
||
|
||
// entityVisual 返回实体的贴图键与身高(米)。
|
||
// 动物额外返回外观变体(0 牛 / 1 猪 / 2 羊 / 3 鸡)。
|
||
func entityVisual(e *entity.Entity, items *item.Registry) (key string, height float32, variant int) {
|
||
switch e.Kind {
|
||
case entity.KindZombie:
|
||
return "entity/zombie/zombie", 1.95, -1
|
||
case entity.KindVillager:
|
||
return "entity/villager/villager", 1.95, -1
|
||
case entity.KindAnimal:
|
||
switch entity.AnimalSpecies(e) {
|
||
case 0:
|
||
return "entity/cow/cow_temperate", 1.4, 0
|
||
case 1:
|
||
return "entity/pig/pig_temperate", 0.9, 1
|
||
case 2:
|
||
return "entity/sheep/sheep", 1.3, 2
|
||
default:
|
||
return "entity/chicken/chicken_temperate", 0.7, 3
|
||
}
|
||
case entity.KindItemDrop:
|
||
d, ok := e.Data.(*entity.Drop)
|
||
if !ok || items == nil {
|
||
return "", 0, -1
|
||
}
|
||
def, ok := items.Get(d.Item)
|
||
if !ok {
|
||
return "", 0, -1
|
||
}
|
||
return def.Texture, 0.45, -1
|
||
default:
|
||
return "", 0, -1
|
||
}
|
||
}
|
||
|
||
func animalSkinKeys(variant int) []string {
|
||
switch variant {
|
||
case 0:
|
||
return []string{"entity/cow/cow_temperate", "entity/cow/cow"}
|
||
case 1:
|
||
return []string{"entity/pig/pig_temperate", "entity/pig/pig"}
|
||
case 2:
|
||
return []string{"entity/sheep/sheep_temperate", "entity/sheep/sheep"}
|
||
default:
|
||
return []string{"entity/chicken/chicken_temperate", "entity/chicken/chicken"}
|
||
}
|
||
}
|