|
|
还没有账号?赶快去注册吧!
您需要 登录 才可以下载或查看,没有账号?立即注册
×
本帖最后由 Hobbytimeblank 于 2025-1-18 18:08 编辑 " V$ R0 }( A: E; t3 g. L( ~: \- n! Q
; Q0 X5 W! x/ @1 D4 \ p( Y9 L8 F
( E* h9 a/ A. \; {) y; Q2 o6 E3 X
由于ANTE1.0.0版本修改的内容过多,该代码只能在0.5.4版本生效,新版本请勿使用
0 h ` |+ m6 D6 a7 Y( ~/ j9 }+ s" {' M2 W* C; z
4 p" y8 `' v& }: w2 M+ B3 S! q0 _, |# U9 @6 T
我前几天基于@Harlotte的ANTE模组写了我此生第一份成功的.js代码
, y3 ?# a% r/ }5 B实现的功能就是使用(A)NTE的装饰物件制作了可自定义材质的45度站台(其实其他的模型理论上也可以,是同一个原理)
5 Z8 I" I1 k! D8 B: P \; W1 U仅供参考!仅供参考!请勿直接完全照搬!5 e0 B6 Q* ]8 T% d! U! d1 L
- //加载模型! A, n7 Q, k; {; S& t; ^% y
- //这里我使用了两个模型,第一个负责上下表面,第二个模型负责侧面
; X* G; x: c8 ]/ H$ ? - let rawModel = ModelManager.loadRawModel(Resources.manager(), Resources.id("mtrsteamloco:models/platform_tall.obj"), null);
. l! t- P3 D# y5 a3 H# ^ - let rawModel_side = ModelManager.loadRawModel(Resources.manager(), Resources.id("mtrsteamloco:models/platform_tall_side.obj"), null);
t( m6 y9 R8 h s: k1 w; o8 b, V, c/ j - //翻转 V 坐标5 K( K! V) n" w7 c% k" Y
- rawModel.applyUVMirror(false, true);
7 q( f7 z- w' q% G% A; X - rawModel_side.applyUVMirror(false, true);
7 \) `& V. G8 a* L: }
) z; R$ q( @% c0 M- //设置初始纹理,其中tex是站台的底部和顶部。tex_side是站台的侧面(四面共用纹理)! p8 z6 m3 B8 v' h( h! b
- let tex = "mtrsteamloco:models/platform_45.png"; W7 C" W9 N! y& c# m. F
- let tex_side = "mtrsteamloco:models/platform_45_side.png";, ~& c/ `. x' e+ L' x) J# P
- function create(ctx, state, entity){
. c. x9 j9 J, \! X) a - state.platform_side = new DynamicModelHolder();, h& g# T8 M7 J& I; x5 S& ~& N, x
- state.platform_side.uploadLater(rawModel_side);# |0 B& p8 p G& I) v' \
- state.platform = new DynamicModelHolder();
6 O8 w9 S) b$ J" h$ R - state.platform.uploadLater(rawModel);
/ F) R+ y5 @$ j a& t - $ Y- a L: G6 i, W w _7 S
- //如果这个装饰物件是刚刚被放出来的,那么将其初始化,为其放入默认的方块数据
/ P" p, z+ a0 i d) \ - if(entity.data.get("texture")==null && entity.data.get("texture_side")==null){
% u% ~* @6 \9 Z5 A% ?5 _ - state.tex=tex;3 |+ J4 H: L' n
- state.tex_side=tex_side;/ i9 V3 y9 y6 V7 O8 ^ X& C0 \) l) h
- entity.data.put("texture", tex);+ a! {! W7 J9 X0 y' C/ D
- entity.data.put("texture_side", tex_side);
4 A, P2 l+ L! c5 E0 f D - }
* C! L- J/ y" | - }
. @* M7 R) ^' P" _& P3 f - function render(ctx, state, entity){1 i6 [) ]/ h! Q. ]- L& n
- //获得DynamicModelHolder中的模型
w( Q. w& ?7 n) J! l - if(state.platform_side.getUploadedModel()!= null){
. f# A# O( }8 `& M0 [2 N - plsModel = state.platform_side.getUploadedModel();}% q, p! o8 d% ]1 n
- if(state.platform.getUploadedModel()!= null){3 Z5 z$ w: {3 K o. z( R5 D
- plModel = state.platform.getUploadedModel();}
7 F0 X! h2 v0 p! [! K1 I( t( B - 8 u# y# T8 P+ O$ y8 V9 U: P
- //检测方块数据是否发生改变,如果改变则修改方块的纹理4 C9 x/ [; @& f' \8 c
- //要求用户自行填写资源位置,这也意味着你可以加载任何位置包括原版、资源包、模组内的任何图片作为站台的纹理0 J M7 l3 Q# v- ?* j! e1 c+ b+ i
- file = String(entity.data.get("texture"));
1 ]0 m0 Q/ `% f4 u0 A0 p - file_side = String(entity.data.get("texture_side"));
9 m! y0 f$ l" z% i - if (file != state.tex){$ p# K; A7 ?! G! Y/ X; e
- state.tex=file;5 @1 O9 W+ @( Z" C7 g
- plModel.replaceAllTexture(Resources.id(state.tex));
; [) m" c8 N5 m - }
1 T s! G) G9 C7 `) ]$ j: [* @ _* a9 k - if (file_side != state.tex_side){# b! i) t! \0 A1 o' ^
- state.tex_side=file_side;
% N6 @8 D7 ]7 ~# q2 ~/ G/ w0 p - plsModel.replaceAllTexture(Resources.id(state.tex_side));
$ k" @, ^) V1 w" c4 @ - }) r3 j* C, w7 q9 l+ k z
- * n; O5 P5 L' w+ I. ]
- //绘制模型* b: U; ~2 I' a3 `7 e& W
- ctx.drawModel(plsModel, null);9 x2 f0 Z4 g9 m! c: p
- ctx.drawModel(plModel, null);
3 @+ ~ s' v' ~& [& G/ h. l - }, b4 j% d' }, b
- //当模型离开渲染距离时,关闭它以释放内存
_6 S: _$ f, p. O6 F' T - function dispose(ctx, state, entity){
) C: m: c0 c! w) N - state.platform.close();# |, j1 A+ l: b- H
- state.platform_side.close();}! W; f! {" T5 k: {% N7 [
) w/ T" s) @5 [! n& X- /*常用方块ID列表
5 l$ P( C) d3 Z3 O" F - 默认顶部:mtrsteamloco:models/platform_45.png
0 ^# `5 [# u% R9 I" X$ Q - 默认侧边:mtrsteamloco:models/platform_45_side.png
; a7 E+ |/ J/ ~/ R# S - 石头:minecraft:textures/block/stone.png
) N; z0 d' |% b/ y: T1 [ - 木板:minecraft:textures/block/oak_planks.png
7 A8 C9 K6 R% `2 v, S. T" _ - 黑曜石:minecraft:textures/block/obsidian.png# O8 I2 M+ A4 x( r* R; t9 v
- 玻璃:minecraft:textures/block/glass.png
8 A. t8 @4 d l0 J. H. P j W& I - */0 V0 k$ E) [, L4 b, Q' Z/ Z
复制代码 " o3 J! h8 B0 ?
) d$ H) ?( J& v2 K
放到游戏中大概是这个样子:  |  | 默认纹理下的站台 | 被修改成磨制花岗岩纹理的站台 | 可以通过修改装饰物件方块键值对来修改纹理。
8 t$ f4 S ?, J. ^% Z& b
7 B" Y6 Q6 p7 U2 D" q7 c- A$ J5 q" C- |; t. @+ {
目前该内容仍然在测试,感谢各位程序员们提出优化性能、功能方面的合理意见
3 ?8 u/ s) F7 k; T& L最后的最后 提前一个小时祝大家2025年新年快乐!
! L/ @. S5 h5 q) f g7 _* Z* V& w8 P X7 R5 F; K3 G
( j- B! c$ o3 `, y; a8 [7 G: V+ S0 }/ s( m
. Y3 x2 ~/ C0 v( _& i H |
|