|
|
还没有账号?赶快去注册吧!
您需要 登录 才可以下载或查看,没有账号?立即注册
×
本帖最后由 Hobbytimeblank 于 2025-1-18 18:08 编辑
# k5 ]4 N( ]/ S
5 f( T* F4 l# g# }+ B9 d0 c* Q v' u; {
由于ANTE1.0.0版本修改的内容过多,该代码只能在0.5.4版本生效,新版本请勿使用
_9 K# k, j% E0 O; G) S- h% T. v: ?; c' D
' J$ }# Y$ G# L: o8 m4 N1 X' d
! p% Q- y8 D5 X: d, I! N9 ]我前几天基于@Harlotte的ANTE模组写了我此生第一份成功的.js代码
1 t9 z% w2 @* D( |& @实现的功能就是使用(A)NTE的装饰物件制作了可自定义材质的45度站台(其实其他的模型理论上也可以,是同一个原理)
- Z7 S' ?6 f1 |; I# n- G% }8 `* _仅供参考!仅供参考!请勿直接完全照搬!
& _3 A' t' F2 D3 l- //加载模型
5 K/ e7 W$ d! ] - //这里我使用了两个模型,第一个负责上下表面,第二个模型负责侧面1 X. k/ p1 I, `/ @1 F
- let rawModel = ModelManager.loadRawModel(Resources.manager(), Resources.id("mtrsteamloco:models/platform_tall.obj"), null);
$ o d! j, f' f( V - let rawModel_side = ModelManager.loadRawModel(Resources.manager(), Resources.id("mtrsteamloco:models/platform_tall_side.obj"), null);& i' E& h# L' h* v- N
- //翻转 V 坐标, G0 E3 ~3 h; _* w& ~. L9 H
- rawModel.applyUVMirror(false, true);
4 }8 c3 K( i% V- ?2 q - rawModel_side.applyUVMirror(false, true);
2 P: H( i- i1 ?4 D
( `& f4 k8 x1 _" s$ U- //设置初始纹理,其中tex是站台的底部和顶部。tex_side是站台的侧面(四面共用纹理)
% E2 E9 b: e0 {/ _! Y) P, @, i - let tex = "mtrsteamloco:models/platform_45.png";
0 T; w5 ~# E w& \6 K - let tex_side = "mtrsteamloco:models/platform_45_side.png";6 v+ s! y' z0 l7 ~
- function create(ctx, state, entity){
! C0 ^+ F( Y! _. }+ q - state.platform_side = new DynamicModelHolder();1 @/ u9 c+ U; r2 f; z, c
- state.platform_side.uploadLater(rawModel_side);
, G4 m9 Q1 ?2 _5 j3 G! r% P" Q( Q - state.platform = new DynamicModelHolder();
) g/ w4 w1 K4 d' d7 V/ Y* h - state.platform.uploadLater(rawModel);/ ^+ I( J+ Z( e% p0 U
- 4 F/ q/ ^& \9 g- I- d0 V8 D
- //如果这个装饰物件是刚刚被放出来的,那么将其初始化,为其放入默认的方块数据
2 _) n6 x* M' S+ z; W, y; C: V - if(entity.data.get("texture")==null && entity.data.get("texture_side")==null){
$ g3 O" L& m6 P; @* p - state.tex=tex;
" r; O5 `' T' C - state.tex_side=tex_side;
9 Z* c" C3 Q! U9 T1 y8 ` - entity.data.put("texture", tex);
' o, O2 n, K$ o! K7 K7 t7 ` - entity.data.put("texture_side", tex_side);
: M9 S: g6 Y) e2 { - }
5 a- J3 ^1 s7 l+ o. S6 \ - }
, i5 \" l$ Z5 _1 k; F - function render(ctx, state, entity){
; z9 e0 g/ d$ c; w, S - //获得DynamicModelHolder中的模型. z n6 Y0 `! l& C
- if(state.platform_side.getUploadedModel()!= null){
3 | o) J& v6 V - plsModel = state.platform_side.getUploadedModel();}
' j8 m q/ ?& s7 n - if(state.platform.getUploadedModel()!= null){
4 x. [3 K* G8 U2 V( y# X - plModel = state.platform.getUploadedModel();}
( H) G: \% c3 J' p$ s2 e* W - - z+ t: S6 n3 c7 K3 P Z- F) \
- //检测方块数据是否发生改变,如果改变则修改方块的纹理
+ R. Q* A9 [" D. ?% k. _ - //要求用户自行填写资源位置,这也意味着你可以加载任何位置包括原版、资源包、模组内的任何图片作为站台的纹理
_* j. F: ~( \ - file = String(entity.data.get("texture"));
3 N: C. E1 g2 y9 c0 y/ s* g( L: A - file_side = String(entity.data.get("texture_side"));* f2 W0 ]. ~8 N/ s, I1 A
- if (file != state.tex){& Q4 d( o* {; A: B' i% m5 D( `) `
- state.tex=file;
( s$ j( c! _& L o, y |1 m9 b - plModel.replaceAllTexture(Resources.id(state.tex));3 k1 d: I; {/ w
- }( Q4 g+ C7 Y0 f' u
- if (file_side != state.tex_side){% @. Q. ~, v7 L1 u3 n9 |
- state.tex_side=file_side;
6 I( [- ]# p, l6 y; h - plsModel.replaceAllTexture(Resources.id(state.tex_side));
4 o1 l* H! V: E. u: H - }, E% F* j2 I( v6 K; }
- 0 i' T9 i+ C: \2 s6 K( R F
- //绘制模型7 z8 g- V& ~8 e: w {: K+ y
- ctx.drawModel(plsModel, null);; F' @3 o6 F6 k, }% T
- ctx.drawModel(plModel, null);
0 Z" M/ I' ]: H$ K. z - }( G7 L$ Z. S. V6 ~4 w
- //当模型离开渲染距离时,关闭它以释放内存
) P9 W8 L7 W8 t1 X3 B - function dispose(ctx, state, entity){
. V2 W6 ^" r- D% o - state.platform.close();9 x9 x. a y: o% _2 I6 U! d. ^
- state.platform_side.close();}
. {* v+ S- g" {* @1 m1 I
! ?! m4 s7 w7 r6 g- /*常用方块ID列表
) a# A$ q; {3 l) Z8 s2 J - 默认顶部:mtrsteamloco:models/platform_45.png
* t" y! g A2 G - 默认侧边:mtrsteamloco:models/platform_45_side.png
) `! Q5 C0 [1 H, v0 v3 f - 石头:minecraft:textures/block/stone.png
& _- @& j: q( y - 木板:minecraft:textures/block/oak_planks.png
0 c% A( W. T. k$ K$ F3 H$ a1 A - 黑曜石:minecraft:textures/block/obsidian.png
4 A8 x6 Y" x) x+ b) ^ - 玻璃:minecraft:textures/block/glass.png6 M4 r' j+ J/ p) |! `9 h s
- */- ^% \, O- W5 @8 M
复制代码
7 R: Q, k. F5 s; @- g; R9 t, g/ S5 e( v0 q$ O" | T
放到游戏中大概是这个样子:  |  | 默认纹理下的站台 | 被修改成磨制花岗岩纹理的站台 | 可以通过修改装饰物件方块键值对来修改纹理。- G& I; Q1 ]; o: L, D$ _* B1 s
* I& M: l5 }) G6 t
. d# S& K2 T6 d) P9 ^' j7 p
目前该内容仍然在测试,感谢各位程序员们提出优化性能、功能方面的合理意见
# r- T# o* q1 }4 M% Q4 b% p最后的最后 提前一个小时祝大家2025年新年快乐!$ N0 k% s& Q5 l* i
. f# y o1 y$ W; F: a% W5 L4 G; `, ~$ z' w
5 x- ? T! [- ~/ R/ Y6 r
- a! D8 }4 D0 N, j- Q7 A+ h- m |
|