11
2- model_part_stand :
2+ dmodel_part_stand :
33 type : entity
44 debug : false
55 entity_type : armor_stand
@@ -8,25 +8,46 @@ model_part_stand:
88 gravity : false
99 visible : false
1010
11- spawn_model :
11+ dmodels_load_model :
1212 type : task
1313 debug : false
14- definitions : model_name|location
14+ definitions : model_name
1515 script :
16- - define location <[location] .center>
1716 - define yamlid dmodels_<[model_name] >
1817 - define filename data/models/<[model_name] > .dmodel.yml
1918 - if !<server.has_file[<[filename] > ] > :
2019 - debug error "Invalid model <[model_name] > , file does not exist: <[filename] > , cannot load"
2120 - stop
2221 - ~yaml id:<[yamlid] > load:<[filename] >
22+ - define order <yaml[<[yamlid] > ] .read[order] >
2323 - define parts <yaml[<[yamlid] > ] .read[models] >
24- - flag server dmodels_data.model_<[model_name] > :<[parts] >
25- - flag server dmodels_data.animations_<[model_name] > :<yaml[<[yamlid] > ] .read[animations] ||<map> >
24+ - define animations <yaml[<[yamlid] > ] .read[animations] ||<map> >
2625 - yaml unload id:<[yamlid] >
27- - spawn model_part_stand <[location] > save:root
26+ - foreach <[order] > as:id:
27+ - define raw_parts.<[id] > <[parts.<[id] > ] >
28+ - foreach <[animations] > key:name as:anim:
29+ - foreach <[order] > as:id:
30+ - if <[anim.animators] .contains[<[id] > ] > :
31+ - define raw_animators.<[id] > <[anim.animators.<[id] > ] >
32+ - else :
33+ - define raw_animators.<[id] > <map[frames=<list> ] >
34+ - define anim.animators <[raw_animators] >
35+ - define raw_animations.<[name] > <[anim] >
36+ - flag server dmodels_data.model_<[model_name] > :<[raw_parts] >
37+ - flag server dmodels_data.animations_<[model_name] > :<[raw_animations] >
38+
39+ dmodels_spawn_model :
40+ type : task
41+ debug : false
42+ definitions : model_name|location
43+ script :
44+ - if !<server.has_flag[dmodels_data.model_<[model_name] > ] > :
45+ - debug error "[DModels] cannot spawn model <[model_name] > , model not loaded"
46+ - stop
47+ - define location <[location] .center>
48+ - spawn dmodel_part_stand <[location] > save:root
2849 - flag <entry[root] .spawned_entity> dmodel_model_id:<[model_name] >
29- - foreach <[parts ] > key:id as:part:
50+ - foreach <server.flag [dmodels_data.model_ < [model_name] > ] > key:id as:part:
3051 - if <[part.empty] ||false> :
3152 - foreach next
3253 - define rots <[part.rotation] .split[,] .parse[to_radians] >
@@ -35,15 +56,12 @@ spawn_model:
3556 # Supposedly it's 25.6 according to external docs (16 * 1.6), but that also is wrong in my testing.
3657 - define offset <location[<[part.origin] > ] .div[25.6] .rotate_around_y[<util.pi> ] >
3758 - define pose <[rots] .get[1] .mul[-1] > ,<[rots] .get[2] .mul[-1] > ,<[rots] .get[3] >
38- - spawn model_part_stand [equipment=[helmet=<[part.item] > ] ;armor_pose=[head=<[pose] > ]] <[location] .add[<[offset] > ] > save:spawned
59+ - spawn dmodel_part_stand [equipment=[helmet=<[part.item] > ] ;armor_pose=[head=<[pose] > ]] <[location] .add[<[offset] > ] > save:spawned
3960 - flag <entry[spawned] .spawned_entity> dmodel_def_pose:<[pose] >
4061 - flag <entry[spawned] .spawned_entity> dmodel_def_offset:<[offset] >
4162 - flag <entry[spawned] .spawned_entity> dmodel_root:<entry[root] .spawned_entity>
4263 - flag <entry[root] .spawned_entity> dmodel_parts:->:<entry[spawned] .spawned_entity>
4364 - flag <entry[root] .spawned_entity> dmodel_anim_part.<[id] > :->:<entry[spawned] .spawned_entity>
44- - foreach <[parts] > key:id as:part:
45- - foreach <[part.pairs] > as:pair_id:
46- - flag <entry[root] .spawned_entity> dmodel_anim_part.<[id] > :|:<entry[root] .spawned_entity.flag[dmodel_anim_part.<[pair_id] > ] ||<list> >
4765 - determine <entry[root] .spawned_entity>
4866
4967dmodels_correct_to_default_position :
@@ -74,7 +92,8 @@ dmodels_move_to_frame:
7492 debug : false
7593 definitions : root_entity|animation|timespot
7694 script :
77- - define animation_data <server.flag[dmodels_data.animations_<[root_entity] .flag[dmodel_model_id] > .<[animation] > ] ||null>
95+ - define model_data <server.flag[dmodels_data.model_<[root_entity] .flag[dmodel_model_id] > ] >
96+ - define animation_data <server.flag[dmodels_data.animations_<[root_entity] .flag[dmodel_model_id] > .<[animation] > ] >
7897 - if <[timespot] > > <[animation_data.length] > :
7998 - choose <[animation_data.loop] > :
8099 - case loop:
@@ -89,10 +108,8 @@ dmodels_move_to_frame:
89108 - case hold:
90109 - define timespot <[animation_data.length] >
91110 - flag server dmodels_anim_active.<[root_entity] .uuid> :!
111+ - define parentage <map>
92112 - foreach <[animation_data.animators] > key:part_id as:animator:
93- - define ents <[root_entity] .flag[dmodel_anim_part.<[part_id] > ] ||<list> >
94- - if <[ents] .is_empty> :
95- - foreach next
96113 - foreach position|rotation as:channel:
97114 - define relevant_frames <[animator.frames] .filter[get[channel] .equals[<[channel] > ] ] >
98115 - define before_frame <[relevant_frames] .filter[get[time] .is_less_than_or_equal_to[<[timespot] > ] ] .last||null>
@@ -102,35 +119,47 @@ dmodels_move_to_frame:
102119 - if <[after_frame] > == null:
103120 - define after_frame <[before_frame] >
104121 - if <[before_frame] > == null:
105- - foreach next
106- - define time_range <[after_frame.time] .sub[<[before_frame.time] > ] >
107- - if <[time_range] > == 0:
108- - define time_percent 0
122+ - define data 0,0,0
109123 - else :
110- - define time_percent <[timespot] .sub[<[before_frame.time] > ] .div[<[time_range] > ] >
111- - choose <[before_frame.interpolation] > :
112- - case catmullrom:
113- - define before_extra <[relevant_frames] .filter[get[time] .is_less_than[<[before_frame.time] > ] ] .last||null>
114- - if <[before_extra] > == null:
115- - define before_extra <[before_frame] >
116- - define after_extra <[relevant_frames] .filter[get[time] .is_more_than[<[after_frame.time] > ] ] .first||null>
117- - if <[after_extra] > == null:
118- - define after_extra <[after_frame] >
119- - define p0 <[before_extra.data] .as_location>
120- - define p1 <[before_frame.data] .as_location>
121- - define p2 <[after_frame.data] .as_location>
122- - define p3 <[after_extra.data] .as_location>
123- - define data <proc[dmodels_catmullrom_proc] .context[<[p0] > |<[p1] > |<[p2] > |<[p3] > |<[time_percent] > ] >
124- - case linear:
125- - define data <[after_frame.data] .as_location.sub[<[before_frame.data] > ] .mul[<[time_percent] > ] .add[<[before_frame.data] > ] .xyz>
126- - case step:
127- - define data <[before_frame.data] >
128- - foreach <[ents] > as:ent:
124+ - define time_range <[after_frame.time] .sub[<[before_frame.time] > ] >
125+ - if <[time_range] > == 0:
126+ - define time_percent 0
127+ - else :
128+ - define time_percent <[timespot] .sub[<[before_frame.time] > ] .div[<[time_range] > ] >
129+ - choose <[before_frame.interpolation] > :
130+ - case catmullrom:
131+ - define before_extra <[relevant_frames] .filter[get[time] .is_less_than[<[before_frame.time] > ] ] .last||null>
132+ - if <[before_extra] > == null:
133+ - define before_extra <[before_frame] >
134+ - define after_extra <[relevant_frames] .filter[get[time] .is_more_than[<[after_frame.time] > ] ] .first||null>
135+ - if <[after_extra] > == null:
136+ - define after_extra <[after_frame] >
137+ - define p0 <[before_extra.data] .as_location>
138+ - define p1 <[before_frame.data] .as_location>
139+ - define p2 <[after_frame.data] .as_location>
140+ - define p3 <[after_extra.data] .as_location>
141+ - define data <proc[dmodels_catmullrom_proc] .context[<[p0] > |<[p1] > |<[p2] > |<[p3] > |<[time_percent] > ] >
142+ - case linear:
143+ - define data <[after_frame.data] .as_location.sub[<[before_frame.data] > ] .mul[<[time_percent] > ] .add[<[before_frame.data] > ] .xyz>
144+ - case step:
145+ - define data <[before_frame.data] >
146+ - define parent_data 0,0,0
147+ - define parent_id <[model_data.<[part_id] > .parent] >
148+ - while <[parent_id] > != none:
149+ - define new_data <[parentage.<[parent_id] > .<[channel] > ] ||null>
150+ - if <[new_data] > != null:
151+ - define parent_data <[new_data] >
152+ - while stop
153+ - define parent_id <[model_data.<[parent_id] > .parent] >
154+ - define data <[data] .as_location.add[<[parent_data] > ] >
155+ - define parentage.<[part_id] > .<[channel] > :<[data] >
156+ - debug log "<[data] > and <[parent_data] > for <[part_id] > and <[model_data.<[part_id] > .parent] ||0> in <[channel] > "
157+ - foreach <[root_entity] .flag[dmodel_anim_part.<[part_id] > ] ||<list> > as:ent:
129158 - choose <[channel] > :
130159 - case position:
131- - teleport <[ent] > <[root_entity] .location.add[<[ent] .flag[dmodel_def_offset] .add[<[data] .as_location. div[25.6] > ] > ] >
160+ - teleport <[ent] > <[root_entity] .location.add[<[ent] .flag[dmodel_def_offset] .add[<[data] .div[25.6] > ] > ] >
132161 - case rotation:
133- - define radian_rot <[data] .as_location. xyz.split[,] .parse[to_radians] .separated_by[,] >
162+ - define radian_rot <[data] .xyz.split[,] .parse[to_radians] .separated_by[,] >
134163 - adjust <[ent] > armor_pose:[head=<[ent] .flag[dmodel_def_pose] .as_location.add[<[radian_rot] > ] .xyz> ]
135164
136165dmodels_catmullrom_get_t :
0 commit comments