|
还没有账号?赶快去注册吧!
您需要 登录 才可以下载或查看,没有账号?立即注册
×
本帖最后由 Hobbytimeblank 于 2025-1-18 18:08 编辑
1 |0 e4 i$ H) G7 L+ m/ U, i) t3 Z- C# m) M
6 R+ I0 b' q) u! }& T0 m
由于ANTE1.0.0版本修改的内容过多,该代码只能在0.5.4版本生效,新版本请勿使用
$ G: @% B, p: _2 |) \) h
; v* k: F @2 [3 i8 C. o' s/ ~: y c/ T! a$ h; N7 B7 N, G
* }1 r, x c2 }3 V
我前几天基于@Harlotte的ANTE模组写了我此生第一份成功的.js代码
7 G8 z& @4 M4 l# X$ @ |0 \2 U实现的功能就是使用(A)NTE的装饰物件制作了可自定义材质的45度站台(其实其他的模型理论上也可以,是同一个原理)' R/ y0 ^& C x1 n
仅供参考!仅供参考!请勿直接完全照搬!
* g: E% \" p4 U$ T% }8 x& v/ q- //加载模型, j2 T J9 Z. L% ~
- //这里我使用了两个模型,第一个负责上下表面,第二个模型负责侧面' O; v6 G5 G. M8 s( O
- let rawModel = ModelManager.loadRawModel(Resources.manager(), Resources.id("mtrsteamloco:models/platform_tall.obj"), null);' o! \) J! e! T1 g8 r& a! K3 o( L
- let rawModel_side = ModelManager.loadRawModel(Resources.manager(), Resources.id("mtrsteamloco:models/platform_tall_side.obj"), null);
) }" P* O% q5 a, P" C0 Y2 e - //翻转 V 坐标
9 Z5 Z2 Y! W! c% w$ n; p* Y' b - rawModel.applyUVMirror(false, true);
9 x8 a+ Z0 F- L# m0 V - rawModel_side.applyUVMirror(false, true);
+ `& n3 I: V9 z: ?* t' v, _, |
0 x# Z6 G7 W: a1 O7 Y- //设置初始纹理,其中tex是站台的底部和顶部。tex_side是站台的侧面(四面共用纹理)
2 |8 H" D1 d# I: }9 o; N; _ - let tex = "mtrsteamloco:models/platform_45.png";8 J+ B- [/ U; s- W+ J: ^
- let tex_side = "mtrsteamloco:models/platform_45_side.png";
( j, M& M! S0 o2 j6 S8 L - function create(ctx, state, entity){ N4 f: x1 D/ j* O) {
- state.platform_side = new DynamicModelHolder();/ S" F6 ], U4 B( r) J
- state.platform_side.uploadLater(rawModel_side);6 r4 q; R' ^& q0 L2 f3 W
- state.platform = new DynamicModelHolder();6 W; E/ [5 p& v6 j) g
- state.platform.uploadLater(rawModel);% r1 a( j$ K3 C
& W7 |1 `6 C; N. {! O, L- //如果这个装饰物件是刚刚被放出来的,那么将其初始化,为其放入默认的方块数据
6 u% M. `( B' ~$ T+ O- i - if(entity.data.get("texture")==null && entity.data.get("texture_side")==null){
3 u/ o; M1 C+ y1 t - state.tex=tex;' a6 C* i, q6 g( w' b5 x9 ]! _
- state.tex_side=tex_side;& O9 m" [' T! k V% Q* t6 x |0 I
- entity.data.put("texture", tex);
7 p. Z& _ s8 L* H/ A- V6 {0 t; ? - entity.data.put("texture_side", tex_side);% Z" ?; e, {' r1 P6 s' d. l) N, y4 u
- }# L' K5 _4 U+ D2 D6 X' j( o/ D
- }
- f6 A/ w1 o: \' K - function render(ctx, state, entity){
! \+ e9 G/ X; }& ~$ j/ A. s5 _ - //获得DynamicModelHolder中的模型6 n/ ?" C& u6 l0 c2 @. `4 K
- if(state.platform_side.getUploadedModel()!= null){ E! r' Q A7 I
- plsModel = state.platform_side.getUploadedModel();}
% K3 K5 m5 d0 L3 }* f+ t, T# b - if(state.platform.getUploadedModel()!= null){
' \ o. h3 y8 {& ^ - plModel = state.platform.getUploadedModel();}
: S, F# G$ v) j" [5 e - ! n% E' g3 k6 J+ P
- //检测方块数据是否发生改变,如果改变则修改方块的纹理
! c0 E" z( c' ? - //要求用户自行填写资源位置,这也意味着你可以加载任何位置包括原版、资源包、模组内的任何图片作为站台的纹理
; |: L) I- V- K& r5 z - file = String(entity.data.get("texture"));- f" c8 [: D: _3 {
- file_side = String(entity.data.get("texture_side"));4 z+ c9 I- _) \. B, J# }+ Q; ]. f
- if (file != state.tex){ x4 @9 o: k6 T& ]
- state.tex=file;
( r/ L' B6 \/ N3 R, Y - plModel.replaceAllTexture(Resources.id(state.tex));
5 d% X5 D% t5 s+ S - }
5 c4 u! _* h9 F, H - if (file_side != state.tex_side){
9 W7 \2 J4 d \- Q/ a( v - state.tex_side=file_side;. t1 Y$ l( s5 T3 Z3 N/ P2 f3 F. H
- plsModel.replaceAllTexture(Resources.id(state.tex_side));2 ~; v9 B8 A! ^- \
- }
; P2 ^/ G& h9 k5 {/ E - * a6 f9 N4 V; }
- //绘制模型
8 R2 ` }( t4 m0 Y: G3 K - ctx.drawModel(plsModel, null);# ~5 r& Z# H5 m" E
- ctx.drawModel(plModel, null);( U* B0 S' r* e3 |8 X) @! \
- }
R& a h2 i4 g5 B - //当模型离开渲染距离时,关闭它以释放内存
' u2 M5 T7 B* ?5 N3 _. \- O) j" e* r% ? - function dispose(ctx, state, entity){% E+ P& H9 m% [. F/ x0 ~& x h
- state.platform.close();. @, Y, h8 L. P u
- state.platform_side.close();}: \3 F$ U1 n+ A0 @0 x( X
! |2 Z7 P/ r: l8 F- /*常用方块ID列表* H8 n4 J; z' b+ m. Q
- 默认顶部:mtrsteamloco:models/platform_45.png
/ g" U. ~- E; f# y _ [8 U3 Q - 默认侧边:mtrsteamloco:models/platform_45_side.png
% [- z$ z; Q" ]( k& [* k. p! h - 石头:minecraft:textures/block/stone.png
! I; }4 Y0 n* Y6 F, `0 b - 木板:minecraft:textures/block/oak_planks.png
! S' Q& M' ?8 j$ [! w% C! b - 黑曜石:minecraft:textures/block/obsidian.png
O9 m* k: M6 S8 v0 V - 玻璃:minecraft:textures/block/glass.png) W, w, J- j0 G4 w2 ?/ N
- */
, j$ [6 W6 N' |" K; h
复制代码
' S9 o* _9 Q5 n" S; V3 A2 R0 \
( q1 V4 [! B- ^% W" |放到游戏中大概是这个样子:  |  | 默认纹理下的站台 | 被修改成磨制花岗岩纹理的站台 | 可以通过修改装饰物件方块键值对来修改纹理。
, x. Y* \' [. o, ] ) a7 i$ r& ?, O, U( a( D8 b! S2 ~
' \! @. J' T. ], b& a目前该内容仍然在测试,感谢各位程序员们提出优化性能、功能方面的合理意见
8 @0 Y- j# F( [! C) I5 s- \最后的最后 提前一个小时祝大家2025年新年快乐!5 F# E& |" G+ i
+ e" m3 s2 b& q r( K
3 A$ l2 E$ }4 V6 \$ G {
* u9 a0 j2 v$ P# ^ ?- Y! l# P; C
$ h6 {. x: k p g |
|