开启左侧

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

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

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

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

×
本帖最后由 Hobbytimeblank 于 2025-1-18 18:08 编辑 * R( D4 [0 [5 q' \

8 Z* S. q( a& |- c! ?5 c. ~9 L. {- v! ^1 u
由于ANTE1.0.0版本修改的内容过多,该代码只能在0.5.4版本生效,新版本请勿使用& D: k) H% K, k+ v: N0 V

" R: o0 ]2 V$ H8 p9 G2 s
9 d- M4 Q, E6 i, }
$ D' x% g# O  H! \8 ]
我前几天基于@Harlotte的ANTE模组写了我此生第一份
成功的.js代码
! _) U8 F/ F8 y" p. x4 Q实现的功能就是使用(A)NTE的装饰物件制作了可自定义材质的45度站台(其实其他的模型理论上也可以,是同一个原理)* m( B! p; X9 ^
仅供参考!仅供参考!请勿直接完全照搬!
# o. m; p5 H( Q0 d# Q7 y# n
  1. //加载模型
    - o, R5 ]; ?; P, l
  2. //这里我使用了两个模型,第一个负责上下表面,第二个模型负责侧面
    ! ]% a; j% w& {
  3. let rawModel = ModelManager.loadRawModel(Resources.manager(), Resources.id("mtrsteamloco:models/platform_tall.obj"), null);- U. ]# R# T( h" X4 ?
  4. let rawModel_side = ModelManager.loadRawModel(Resources.manager(), Resources.id("mtrsteamloco:models/platform_tall_side.obj"), null);
    ! \' j: J: v& P3 k, H  I
  5. //翻转 V 坐标) l4 h$ i2 g. h6 r/ z
  6. rawModel.applyUVMirror(false, true);5 n& y/ E4 z+ u% K
  7. rawModel_side.applyUVMirror(false, true);
    ) v+ |9 m; x3 p+ V7 z- k6 n+ ~

  8. - U  J& s* P4 y& y2 e! m
  9. //设置初始纹理,其中tex是站台的底部和顶部。tex_side是站台的侧面(四面共用纹理)
    4 k+ Z1 i! {4 `2 Z3 I7 E
  10. let tex = "mtrsteamloco:models/platform_45.png";0 v* k1 t! v( ?: C  u
  11. let tex_side = "mtrsteamloco:models/platform_45_side.png";3 b" Y1 N7 a  m5 K
  12. function create(ctx, state, entity){: k( D& `8 ]4 a, v/ N( n
  13.     state.platform_side = new DynamicModelHolder();
    + U2 ?. ]) C8 z
  14.     state.platform_side.uploadLater(rawModel_side);
    & _9 x0 @4 D: n" J( y
  15.     state.platform = new DynamicModelHolder();9 w1 w$ e% ~7 u
  16.     state.platform.uploadLater(rawModel);  L! |! ~4 s$ U
  17. & }$ T2 Q- _/ i3 z
  18.     //如果这个装饰物件是刚刚被放出来的,那么将其初始化,为其放入默认的方块数据! L2 S8 D1 y1 [* M8 |4 h
  19.     if(entity.data.get("texture")==null && entity.data.get("texture_side")==null){
    8 j8 m5 N# N/ b) m+ R0 ~/ z
  20.     state.tex=tex;
    5 A% v  p% g$ ]2 m8 \/ q
  21.     state.tex_side=tex_side;
    9 S1 g9 \; S! j* X$ M! U$ }
  22.     entity.data.put("texture", tex);1 W4 y* z' u5 ~1 |, u; G+ n0 J
  23.     entity.data.put("texture_side", tex_side);5 o4 m; v5 F$ E4 {) X! z( A1 p/ S
  24.     }
    , L$ o; c; s9 U( p) S) s/ U
  25. }. L9 V: z2 T/ ]0 r6 |
  26. function render(ctx, state, entity){
    9 `. m; z! Q; l+ ~
  27.     //获得DynamicModelHolder中的模型9 B/ }' E+ `0 N, S
  28.     if(state.platform_side.getUploadedModel()!= null){# Z9 j) u! D+ v9 B( S' s
  29.     plsModel = state.platform_side.getUploadedModel();}8 h5 i4 f% ~1 b- j: s
  30.     if(state.platform.getUploadedModel()!= null){3 _6 h9 U% R: @- y3 R- G3 U" F0 M
  31.     plModel = state.platform.getUploadedModel();}
    $ A* ~" {* v8 i5 @* ~: Q, t

  32. + k4 F* b( d. R* m9 O
  33.     //检测方块数据是否发生改变,如果改变则修改方块的纹理/ w/ [8 G1 C% \
  34.     //要求用户自行填写资源位置,这也意味着你可以加载任何位置包括原版、资源包、模组内的任何图片作为站台的纹理  W% w$ m$ I1 B( V
  35.     file = String(entity.data.get("texture"));
    & Y7 P8 }. o5 [0 A
  36.     file_side = String(entity.data.get("texture_side"));1 t( @  ^+ T! w6 M+ a8 k
  37.     if (file != state.tex){! a: P3 ^* P2 w1 q6 `" E9 t; ]
  38.         state.tex=file;
    8 Q1 q4 @0 P3 ]" S1 o+ n* ?
  39.         plModel.replaceAllTexture(Resources.id(state.tex));+ o+ q) o- t5 s+ |( \  w; \' ^+ G
  40.         }
    * C! ~& @  Z; q2 X' \+ h# o& n
  41.     if (file_side != state.tex_side){% k- h) x( k/ X4 [
  42.         state.tex_side=file_side;8 i) ?3 P/ S  \- Y  u$ \
  43.         plsModel.replaceAllTexture(Resources.id(state.tex_side));$ w* a5 p/ n- v
  44.         }
    - R1 @& V+ b- l
  45. 1 w; B4 \9 e* M8 p
  46.     //绘制模型
    . ]8 k7 F0 o& R" S- c
  47.     ctx.drawModel(plsModel, null);
    5 o8 h# c: `% `- B+ T" E. s
  48.     ctx.drawModel(plModel, null);
    5 {* P& S, j9 W4 }; v: ^0 G
  49. }
    . J3 }! L( Y% f9 N0 z9 p
  50. //当模型离开渲染距离时,关闭它以释放内存
    3 f/ t8 ?( H& [& U2 m2 ^4 X
  51. function dispose(ctx, state, entity){4 Z- ^+ ^, f' [8 ]1 l
  52.     state.platform.close();1 U$ F+ `% ]; u' K& a* m% P' P0 v/ B
  53.     state.platform_side.close();}: W) u: [3 |0 l  c8 o
  54. 9 D) D9 V4 O4 i4 o% [( X
  55. /*常用方块ID列表
    0 q9 i2 m" k9 I% l0 L) @5 o
  56. 默认顶部:mtrsteamloco:models/platform_45.png
    ; v# R/ l, m8 l1 D* e* U( Z! H
  57. 默认侧边:mtrsteamloco:models/platform_45_side.png
    8 s  S' d1 a  Z) a* q
  58. 石头:minecraft:textures/block/stone.png: }) I" t8 l" A$ \) R  v
  59. 木板:minecraft:textures/block/oak_planks.png
    6 s4 e" B+ O* E0 F
  60. 黑曜石:minecraft:textures/block/obsidian.png
    & ~* T; d, F4 n. X7 _0 ^, m
  61. 玻璃:minecraft:textures/block/glass.png& Y  H2 Y/ y5 k
  62. */
    4 V# C7 Q' l" ^2 x+ P
复制代码
$ c3 M: I2 X' f/ y. k2 f  }' P
) `( ?/ M4 u& b: r0 }, W
放到游戏中大概是这个样子:
默认纹理下的站台
被修改成磨制花岗岩纹理的站台
可以通过修改装饰物件方块键值对来修改纹理。; ^6 j8 a/ l4 U' v1 G0 u$ i3 D+ N
! @9 d8 a* Y$ [! f* S0 @8 U! I
) U( n3 q4 L4 z
目前该内容仍然在测试,感谢各位程序员们提出优化性能、功能方面的合理意见
- e  k3 J+ e, @7 f最后的最后 提前一个小时祝大家2025年新年快乐!
  {# N$ D1 V; S! N$ W: Y1 O6 k& j0 T8 ]0 }3 z6 y5 t
2 h! Z6 ]- a  x* K. u) U; F$ S
+ }8 A' z  ]- R- x8 V# B
! E7 [6 y' T3 A( e7 h4 o
你是更怀念那几台机器,怀念那两个多月的时间,还是怀念当时与你一起合作的人?
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:263 i+ x# @% F+ J7 m9 h' Q
有点意思!
' ]8 z% Q4 w- W# Y  u
但是你那个当做站台好像即使√上了也没法使列车开门
1 x  r3 A* `' A6 X2 m
你是更怀念那几台机器,怀念那两个多月的时间,还是怀念当时与你一起合作的人?
Harlotte 作者认证 2025-1-2 06:32:17
Hobbytimeblank 发表于 2025-1-1 09:35
/ z; _6 s2 l1 i但是你那个当做站台好像即使√上了也没法使列车开门
; x2 c1 i& l& ?6 {# h
?不应该啊 我这里测试好使着呢 嘶
有事加我QQ: 3435494979
楼主 Hobbytimeblank 作者认证 2025-1-2 19:25:08
Harlotte 发表于 2025-1-2 06:32& S3 C1 O' w! ~" z: w  C$ V
?不应该啊 我这里测试好使着呢 嘶

; X% N9 r# L, B! @当然我们建筑党有自己的解决方法:在装饰物件下面放一层原版站台
你是更怀念那几台机器,怀念那两个多月的时间,还是怀念当时与你一起合作的人?
Harlotte 作者认证 2025-1-3 21:40:20
Hobbytimeblank 发表于 2025-1-2 19:25& a. q; [/ c- T& C! R
当然我们建筑党有自己的解决方法:在装饰物件下面放一层原版站台

0 H# s1 a0 S+ H  @8 |* `是当时代码写错了 遍历错了 已经修好了
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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