|
还没有账号?赶快去注册吧!
您需要 登录 才可以下载或查看,没有账号?立即注册
×
本帖最后由 Hobbytimeblank 于 2025-1-18 18:08 编辑 9 r/ A$ \* x7 H8 d
3 ~7 K! Z0 l) J& [& J3 X- H l/ u* n. c( q$ Z
由于ANTE1.0.0版本修改的内容过多,该代码只能在0.5.4版本生效,新版本请勿使用
6 {+ @3 |+ B" a: ^# a9 S! M7 x' ~6 w& z' _
7 t: q( R7 n( i K9 [9 x L
7 e* E: Y: @+ a0 v) j我前几天基于@Harlotte的ANTE模组写了我此生第一份成功的.js代码
/ L9 \/ ]8 ^& s1 Y. v7 L, ^" w& a实现的功能就是使用(A)NTE的装饰物件制作了可自定义材质的45度站台(其实其他的模型理论上也可以,是同一个原理)
7 a7 @+ d/ L- R; [0 \仅供参考!仅供参考!请勿直接完全照搬!
) k3 G1 U2 h G+ Z# l( o% ~- //加载模型
( h9 @' Q, g0 y/ a: f0 y9 d2 T, y - //这里我使用了两个模型,第一个负责上下表面,第二个模型负责侧面. y. |6 K: k' w0 a
- let rawModel = ModelManager.loadRawModel(Resources.manager(), Resources.id("mtrsteamloco:models/platform_tall.obj"), null);
- O/ K" E& t) t5 _ - let rawModel_side = ModelManager.loadRawModel(Resources.manager(), Resources.id("mtrsteamloco:models/platform_tall_side.obj"), null);, r; {, y* d' k% [3 Y
- //翻转 V 坐标
J* f, \" a8 }. T) R+ P- z - rawModel.applyUVMirror(false, true);
( a+ }$ O# a X# p - rawModel_side.applyUVMirror(false, true);7 E9 K- l5 i V {9 W1 w
7 U% G% O) k+ S7 U9 H6 w% U' |- //设置初始纹理,其中tex是站台的底部和顶部。tex_side是站台的侧面(四面共用纹理)* S$ b+ l8 Z* X# M3 B# g
- let tex = "mtrsteamloco:models/platform_45.png";
' @% v5 F/ z3 w' F" o% o - let tex_side = "mtrsteamloco:models/platform_45_side.png";
& p3 @0 Y S# k7 K: J# \3 m5 f4 s - function create(ctx, state, entity){
* ]) ~2 A; `' T' d - state.platform_side = new DynamicModelHolder(); V& K* r; E E$ \9 ~4 Q6 S
- state.platform_side.uploadLater(rawModel_side);3 Y% F" S% |# S: e
- state.platform = new DynamicModelHolder();
. a' T3 X6 A8 A( x( g - state.platform.uploadLater(rawModel);8 H. |+ j" y9 b/ ^' b
- ( N7 s" x/ W5 }2 h
- //如果这个装饰物件是刚刚被放出来的,那么将其初始化,为其放入默认的方块数据
@" \4 G$ @4 @- z7 O. _, Y6 Q - if(entity.data.get("texture")==null && entity.data.get("texture_side")==null){' Q0 A5 v- K% X I4 R, K
- state.tex=tex;
! r) r* y1 F6 t9 n - state.tex_side=tex_side;
S7 j/ H' a- J* s6 H' F$ A$ J - entity.data.put("texture", tex);
0 G/ `5 X8 b4 O- C, m - entity.data.put("texture_side", tex_side);
, B' H4 p1 _8 g' C6 w- k L - }
2 ^& l) m2 P3 |% z6 `8 X4 P0 D4 d - }5 f: c" ]: l" g4 d
- function render(ctx, state, entity){+ ~! Y% M5 f5 m) H0 O
- //获得DynamicModelHolder中的模型
) N3 @9 [7 f8 Q' w, D - if(state.platform_side.getUploadedModel()!= null){2 X. G6 b& i. ~; u6 a
- plsModel = state.platform_side.getUploadedModel();}
; k: v) S1 t8 ?( [; n8 |3 y8 H - if(state.platform.getUploadedModel()!= null){
* _, q$ l1 a" a) B6 o+ @2 z) T - plModel = state.platform.getUploadedModel();}
' O) k1 j- q M3 b3 C; E6 @+ x
, f6 Z8 e2 M Q: u& b; h. I- //检测方块数据是否发生改变,如果改变则修改方块的纹理
$ |: q) z5 b" V7 B+ N5 ] - //要求用户自行填写资源位置,这也意味着你可以加载任何位置包括原版、资源包、模组内的任何图片作为站台的纹理
5 ]+ Q' W$ u" b - file = String(entity.data.get("texture"));
2 c( s! D1 H6 a3 M4 u - file_side = String(entity.data.get("texture_side"));
' W$ B& A5 E0 H: z3 z; o: i: R5 G1 w - if (file != state.tex){
' h% v! [2 k7 ]3 B/ S - state.tex=file;
9 u9 P; v4 V( o - plModel.replaceAllTexture(Resources.id(state.tex));4 x. I7 q5 d% o0 M/ |0 c+ o
- }# i# g% `1 B% `+ _
- if (file_side != state.tex_side){
f9 x% E; M2 P8 A, G" ^ - state.tex_side=file_side;
6 y0 X4 p+ s1 @# k% S: ]$ a - plsModel.replaceAllTexture(Resources.id(state.tex_side));
7 I$ |3 c' T# N5 e x% F4 k - }+ S+ N( L$ W1 u/ n
, y1 N/ `% S: F7 i; c- //绘制模型
* ?1 I$ _6 _$ G* T2 e5 _% A - ctx.drawModel(plsModel, null);9 z( _6 W4 C9 x( O! M
- ctx.drawModel(plModel, null);1 B4 R" G: r- u9 u- _9 u6 m
- }
; {2 y/ Z. _& w7 x# W- U8 U - //当模型离开渲染距离时,关闭它以释放内存
# u/ `0 x- b# {/ m7 d2 p% u - function dispose(ctx, state, entity){
& q! L- y: I1 k* K - state.platform.close();
* K' b' y% J3 i3 \+ H - state.platform_side.close();}, y7 o( K5 Q2 f' y
- 5 V% }. \: Z2 z4 e
- /*常用方块ID列表
' ^" P8 @& i$ ^" p/ o. _/ _+ y5 B - 默认顶部:mtrsteamloco:models/platform_45.png0 |0 C( }2 z/ V2 D# i$ a) U
- 默认侧边:mtrsteamloco:models/platform_45_side.png
# V6 }' R3 q$ K( i6 T! } - 石头:minecraft:textures/block/stone.png4 E" J, D( `3 m
- 木板:minecraft:textures/block/oak_planks.png7 U$ c0 f7 h4 l! W' _2 ?8 v
- 黑曜石:minecraft:textures/block/obsidian.png
; V7 l7 f% ^3 O \6 R8 S - 玻璃:minecraft:textures/block/glass.png% \. k( D, J$ F* ^7 H7 R
- */
0 ?- D; [" L1 H! o/ H: Z
复制代码
2 f! r& m0 J* M- a+ I }
3 J$ ^' L) \7 R, ]* P放到游戏中大概是这个样子:  |  | 默认纹理下的站台 | 被修改成磨制花岗岩纹理的站台 | 可以通过修改装饰物件方块键值对来修改纹理。
# o, ]0 F3 g& ]/ m& L
2 n: @8 j, W, X$ Q1 _+ e" \; P3 O4 \5 f
目前该内容仍然在测试,感谢各位程序员们提出优化性能、功能方面的合理意见
" r6 P/ u( x6 F1 i; t4 ~最后的最后 提前一个小时祝大家2025年新年快乐!' z6 ?; {8 u* B M, ], U* _
4 R0 M2 x9 j6 @
0 F+ S" T5 o/ h, i' k/ k) U* k9 r
0 E; t: f9 P+ C. j4 S: Z' f0 |( h3 J; i4 m/ q% j# m) x" j
|
|