开启左侧

[现版本作废]伪装45度站台方块代码分享

[复制链接]
Hobbytimeblank 作者认证 2024-12-31 22:57:26

还没有账号?赶快去注册吧!

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本帖最后由 Hobbytimeblank 于 2025-1-18 18:08 编辑 / q0 ^+ B& `, t0 [+ R
) J8 S  ^3 |( u% N+ [# ^( ^

# |5 o; s* d. R* ?由于ANTE1.0.0版本修改的内容过多,该代码只能在0.5.4版本生效,新版本请勿使用
  m! p1 V" N. }/ C' |! r7 n1 W0 h. s' {% J

( E7 Y2 @' e9 R' u1 M
6 J5 b. d! l# Y. L" I9 D2 G
我前几天基于@Harlotte的ANTE模组写了我此生第一份
成功的.js代码2 J( @8 F( I. e+ Q) p  r9 ~
实现的功能就是使用(A)NTE的装饰物件制作了可自定义材质的45度站台(其实其他的模型理论上也可以,是同一个原理)
1 t2 i0 V! o* H4 X4 {仅供参考!仅供参考!请勿直接完全照搬!, H- V# w4 B7 {9 W
  1. //加载模型
    2 L( I7 C3 D8 U+ B
  2. //这里我使用了两个模型,第一个负责上下表面,第二个模型负责侧面
    % X2 O8 m# d- m3 l
  3. let rawModel = ModelManager.loadRawModel(Resources.manager(), Resources.id("mtrsteamloco:models/platform_tall.obj"), null);# M$ J2 f- c$ W
  4. let rawModel_side = ModelManager.loadRawModel(Resources.manager(), Resources.id("mtrsteamloco:models/platform_tall_side.obj"), null);4 Y% Q# @  f$ R; q
  5. //翻转 V 坐标$ ~; Q6 h1 c% m+ Y
  6. rawModel.applyUVMirror(false, true);
      `& u$ j8 H% _! S" B4 p0 g
  7. rawModel_side.applyUVMirror(false, true);
    : M: P% I( x0 e) V3 `! a
  8. $ `4 L& t  t! k5 B  l: _
  9. //设置初始纹理,其中tex是站台的底部和顶部。tex_side是站台的侧面(四面共用纹理). w  R/ ~, \" I& u, L$ o; o
  10. let tex = "mtrsteamloco:models/platform_45.png";
    4 O: R) R* p8 O: U! a4 m; W. x7 i
  11. let tex_side = "mtrsteamloco:models/platform_45_side.png";
    2 }- t; M# p; b
  12. function create(ctx, state, entity){9 W8 p1 |3 x5 J) W8 V0 W
  13.     state.platform_side = new DynamicModelHolder();$ b+ ]" O& p- I5 C  N
  14.     state.platform_side.uploadLater(rawModel_side);
    + @: z, [' R5 e
  15.     state.platform = new DynamicModelHolder();
    - l1 `8 ?- N9 U' s+ i- W
  16.     state.platform.uploadLater(rawModel);: G5 d, _0 V+ a- Y& O) ]
  17.   s% ?1 l3 u$ F! O+ h1 Q1 Q
  18.     //如果这个装饰物件是刚刚被放出来的,那么将其初始化,为其放入默认的方块数据
    8 \6 r7 o. S+ |4 x
  19.     if(entity.data.get("texture")==null && entity.data.get("texture_side")==null){1 k: a, x1 X! J4 X* F
  20.     state.tex=tex;
    / W" d$ e- }" k
  21.     state.tex_side=tex_side;5 n" u% H$ i/ k' R+ P% V
  22.     entity.data.put("texture", tex);- X6 N' G3 t2 S; H
  23.     entity.data.put("texture_side", tex_side);
    4 G4 F: `* ?& D; |% _- }1 z2 |
  24.     }7 W+ S2 b4 t' }  K
  25. }2 K7 ?( C  Y2 f0 |& Z- `$ ?0 v
  26. function render(ctx, state, entity){
    0 n4 |1 ^& l( i9 C$ w0 _7 z
  27.     //获得DynamicModelHolder中的模型
    9 I+ {& E1 X8 q1 Z: _& K0 a
  28.     if(state.platform_side.getUploadedModel()!= null){" R: k' D9 w3 X
  29.     plsModel = state.platform_side.getUploadedModel();}
    " d. x9 }/ x! k, X8 ~: \
  30.     if(state.platform.getUploadedModel()!= null){
    9 w6 X' W# N5 B4 J) y! I
  31.     plModel = state.platform.getUploadedModel();}
    3 H1 C9 \0 o, y; U+ w) H4 W) X  ]
  32.   j  F# G( f6 M, I0 Z3 ^& o
  33.     //检测方块数据是否发生改变,如果改变则修改方块的纹理: v# x, ]* Q# p+ c, n
  34.     //要求用户自行填写资源位置,这也意味着你可以加载任何位置包括原版、资源包、模组内的任何图片作为站台的纹理# X8 F2 \3 X4 n  ^$ E4 W6 |' _
  35.     file = String(entity.data.get("texture"));' m9 d, B) D) f' t% G) M8 P
  36.     file_side = String(entity.data.get("texture_side"));
    & |6 p4 |3 [3 g) w  w
  37.     if (file != state.tex){+ {4 Z8 x% R5 r% Q1 j$ E
  38.         state.tex=file;
    9 n% o3 n: |6 u( r8 x
  39.         plModel.replaceAllTexture(Resources.id(state.tex));% J& D) l9 W! ~' {
  40.         }. G0 b8 q1 M/ [4 \% d; K
  41.     if (file_side != state.tex_side){" v# d# Q- m4 n3 |9 j& M" S$ E
  42.         state.tex_side=file_side;. I$ y$ Q/ x$ J, g" M+ e
  43.         plsModel.replaceAllTexture(Resources.id(state.tex_side));
    . O, i2 b5 i5 h: h7 k5 \7 w
  44.         }: e9 d% X/ P; v+ v

  45. 0 O% J  T, m. `5 Y0 V
  46.     //绘制模型8 `. Q( x, D9 n4 L: P7 m
  47.     ctx.drawModel(plsModel, null);
    ; ?: K% C& ?. o) }5 m. a2 @
  48.     ctx.drawModel(plModel, null);1 f3 f( \, b( C; h0 M
  49. }8 Q; s9 p0 {, B5 X8 j
  50. //当模型离开渲染距离时,关闭它以释放内存( q  k# X* J: M9 y! E0 {5 l
  51. function dispose(ctx, state, entity){
    " y9 N) N& \& ^" n5 o. y. @: J1 S
  52.     state.platform.close();% w- `; _5 l  A, |7 j
  53.     state.platform_side.close();}
    6 i/ h. F  x/ ^+ W

  54. / v+ @: y% o/ M- p# M2 V: h/ c
  55. /*常用方块ID列表+ S/ q) W- e6 X# b( u
  56. 默认顶部:mtrsteamloco:models/platform_45.png% m, x& i! q/ h; L1 S7 q7 `
  57. 默认侧边:mtrsteamloco:models/platform_45_side.png% u: Z( M: z, Y* C, {. O) e
  58. 石头:minecraft:textures/block/stone.png
      B; E4 ]% U+ X7 a
  59. 木板:minecraft:textures/block/oak_planks.png
    * `7 l, h, T" ~- j7 O% X7 S
  60. 黑曜石:minecraft:textures/block/obsidian.png% t7 Z* z& m, M4 C# B- |/ x
  61. 玻璃:minecraft:textures/block/glass.png2 K+ C0 T+ r7 b' P
  62. */
    9 U4 Y# @8 s2 B
复制代码

1 E0 g3 }3 @2 U! J" V- V- p: _( \& J! e- q/ i4 A: r8 V- a
放到游戏中大概是这个样子:
默认纹理下的站台
被修改成磨制花岗岩纹理的站台
可以通过修改装饰物件方块键值对来修改纹理。( c+ _0 q8 n6 L
3 s5 q1 f, k$ X

  M. c$ z9 Q6 ]1 _目前该内容仍然在测试,感谢各位程序员们提出优化性能、功能方面的合理意见. X1 d; j1 l  Z) p/ e0 r% I
最后的最后 提前一个小时祝大家2025年新年快乐!) [1 ?: D5 m: ~' T9 j6 U% Z* P0 X

$ U1 S0 b' I) S% i, n
, k; k  j# Y; N$ B# `9 d& `# g2 p

# |5 k- y7 y( ^3 C# o0 o1 a
你是更怀念那几台机器,怀念那两个多月的时间,还是怀念当时与你一起合作的人?
Harlotte 作者认证 2025-1-1 09:26:31
有点意思!

评分

参与人数 1人气 +1 收起 理由
Hobbytimeblank + 1 高呼666!

查看全部评分

有事加我QQ: 3435494979
楼主 Hobbytimeblank 作者认证 2025-1-1 09:35:40
Harlotte 发表于 2025-1-1 09:26, f7 e8 h% x, e0 L0 y+ u- y
有点意思!

) r1 K: y; @, @( P% q6 \但是你那个当做站台好像即使√上了也没法使列车开门
( K; {4 {( A( x7 X
你是更怀念那几台机器,怀念那两个多月的时间,还是怀念当时与你一起合作的人?
Harlotte 作者认证 2025-1-2 06:32:17
Hobbytimeblank 发表于 2025-1-1 09:35: h" v* N3 s8 a7 Z- V
但是你那个当做站台好像即使√上了也没法使列车开门

( s* Q' J7 [1 J8 F# C  F?不应该啊 我这里测试好使着呢 嘶
有事加我QQ: 3435494979
楼主 Hobbytimeblank 作者认证 2025-1-2 19:25:08
Harlotte 发表于 2025-1-2 06:32
9 t- |+ K2 X$ w  B, i?不应该啊 我这里测试好使着呢 嘶

# n, ^9 G- H  r# W2 P0 S& u; l9 x- N8 ]当然我们建筑党有自己的解决方法:在装饰物件下面放一层原版站台
你是更怀念那几台机器,怀念那两个多月的时间,还是怀念当时与你一起合作的人?
Harlotte 作者认证 2025-1-3 21:40:20
Hobbytimeblank 发表于 2025-1-2 19:25
4 k8 P% i6 ~# P5 R8 _当然我们建筑党有自己的解决方法:在装饰物件下面放一层原版站台
% N$ v6 ~- c! u: G
是当时代码写错了 遍历错了 已经修好了
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表