开启左侧

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

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

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

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

×
本帖最后由 Hobbytimeblank 于 2025-1-18 18:08 编辑 4 a7 a' O/ j$ r) |( C: |# y
( G, T; w  Z: r# a' F: v, g

9 c9 b" O9 V0 [0 U由于ANTE1.0.0版本修改的内容过多,该代码只能在0.5.4版本生效,新版本请勿使用
. W7 \; c! u4 c9 q% k6 `$ k8 u  z+ Z8 @# p
' n5 L: w6 g7 ^, i- \
4 f0 G4 V& [/ U
我前几天基于@Harlotte的ANTE模组写了我此生第一份
成功的.js代码
' P* _" i; s5 H* [! V$ \6 n( {实现的功能就是使用(A)NTE的装饰物件制作了可自定义材质的45度站台(其实其他的模型理论上也可以,是同一个原理)$ C# m. b, p: Y9 j1 _: n; |
仅供参考!仅供参考!请勿直接完全照搬!5 ?7 ?* C* V. f$ |7 ?& ~
  1. //加载模型
    0 N9 L6 L. r- x. r, R7 c
  2. //这里我使用了两个模型,第一个负责上下表面,第二个模型负责侧面8 E. F# Z$ a* Z
  3. let rawModel = ModelManager.loadRawModel(Resources.manager(), Resources.id("mtrsteamloco:models/platform_tall.obj"), null);
    ' t$ T3 s  [- |* r; Q0 d
  4. let rawModel_side = ModelManager.loadRawModel(Resources.manager(), Resources.id("mtrsteamloco:models/platform_tall_side.obj"), null);& j4 ?  E3 g% q: a
  5. //翻转 V 坐标9 C' A" j8 X- t& p/ @
  6. rawModel.applyUVMirror(false, true);
    # s. h1 F) W) ]3 f
  7. rawModel_side.applyUVMirror(false, true);
    1 u3 I% V# g! R" F1 j) o5 e( R; Y2 g

  8. . q: l% q* a2 T: M5 S
  9. //设置初始纹理,其中tex是站台的底部和顶部。tex_side是站台的侧面(四面共用纹理), v4 Q0 R) d$ Y8 j
  10. let tex = "mtrsteamloco:models/platform_45.png";
    ) Z9 v. }! Q. G$ v, R2 u, H
  11. let tex_side = "mtrsteamloco:models/platform_45_side.png";
    4 ^  |, e! V0 X. Y
  12. function create(ctx, state, entity){
    ( ?6 L+ [! ]2 G# M  A
  13.     state.platform_side = new DynamicModelHolder();
    # i& l- G4 `% w8 M, B
  14.     state.platform_side.uploadLater(rawModel_side);
    . ^7 o6 O  }* `. l  I
  15.     state.platform = new DynamicModelHolder();
    % o4 m; c4 j$ l  U
  16.     state.platform.uploadLater(rawModel);
    2 _9 M& Z3 }4 D7 ^+ k9 Y

  17. 8 f! ~) I/ k5 S7 \) z" }& i% v
  18.     //如果这个装饰物件是刚刚被放出来的,那么将其初始化,为其放入默认的方块数据
    ; M2 O& R7 P0 W( q
  19.     if(entity.data.get("texture")==null && entity.data.get("texture_side")==null){
    ) H* p. ^3 A- T3 X% f7 `! F
  20.     state.tex=tex;+ I  }" a8 g0 X6 ^( R" x- [+ l
  21.     state.tex_side=tex_side;% w# I9 Z' V/ S" z6 \1 v, P0 |( }
  22.     entity.data.put("texture", tex);0 X" i# q5 _1 I8 {
  23.     entity.data.put("texture_side", tex_side);
    ( T8 q7 @" `" X
  24.     }
    2 B5 r6 D4 g6 z  q. v  j
  25. }
    " v4 R' W- U& n- ?' S" P
  26. function render(ctx, state, entity){. x" ~1 d4 B1 t( t( {+ {% n
  27.     //获得DynamicModelHolder中的模型
    8 Q% h4 D0 j1 g1 f/ H+ g
  28.     if(state.platform_side.getUploadedModel()!= null){2 E0 A2 ]/ x5 Z" Q
  29.     plsModel = state.platform_side.getUploadedModel();}
    1 i' E4 [3 s( V3 t% T2 V
  30.     if(state.platform.getUploadedModel()!= null){$ X% a$ ]! x, L( ?# R6 l- |% Z
  31.     plModel = state.platform.getUploadedModel();}
    # M% u' {8 t& ?% o$ ]+ R" U

  32. / X) w- {/ c) r
  33.     //检测方块数据是否发生改变,如果改变则修改方块的纹理
    ) G9 s: ^5 \2 u; t) |6 ]( C
  34.     //要求用户自行填写资源位置,这也意味着你可以加载任何位置包括原版、资源包、模组内的任何图片作为站台的纹理/ A; H+ e2 Y. C: _; o
  35.     file = String(entity.data.get("texture"));% G0 v3 U! {! p& K& q( |3 N
  36.     file_side = String(entity.data.get("texture_side"));
    * E+ L! z5 X8 I) d
  37.     if (file != state.tex){& _5 S7 ^' _. f
  38.         state.tex=file;$ r- E9 Y6 F2 b! D
  39.         plModel.replaceAllTexture(Resources.id(state.tex));
    2 X$ R3 ?5 _4 E% d) R
  40.         }! a$ d& S( A: i1 x7 G0 B2 k
  41.     if (file_side != state.tex_side){
    / o+ J1 P6 {* W$ R
  42.         state.tex_side=file_side;' e6 Y, p1 x' @$ d6 K/ _) }
  43.         plsModel.replaceAllTexture(Resources.id(state.tex_side));' e+ i  T: s* {* p" G* K: P
  44.         }5 z3 u; _% \! i. g: b* k: K! P, s. ~* a
  45. # K0 @8 |1 T' G" R/ L/ l& V
  46.     //绘制模型& H3 z: l2 n0 m) G; s1 Z: N8 ~
  47.     ctx.drawModel(plsModel, null);7 Y- u! Y* ]0 U3 n! ?2 m) ^4 Z8 A
  48.     ctx.drawModel(plModel, null);4 w9 u' H! }" g7 K
  49. }
    / S8 i' f$ V# k0 z
  50. //当模型离开渲染距离时,关闭它以释放内存
    5 y! Q% I! f5 N) i) K
  51. function dispose(ctx, state, entity){* `9 G: Y" H4 c* d' \. ^$ }
  52.     state.platform.close();
    , d; Q( F( Y8 n$ P& m9 w# d0 V, j
  53.     state.platform_side.close();}8 L& Y  P1 ~+ @; p* g0 H# ]
  54. / ^* E- ~0 `+ t% L$ ]/ L
  55. /*常用方块ID列表
    * `, y% {$ S" Q! m
  56. 默认顶部:mtrsteamloco:models/platform_45.png
    & |& j/ @/ x; o6 s4 m9 O
  57. 默认侧边:mtrsteamloco:models/platform_45_side.png
    0 U1 ~- J# I* F6 z& m  b
  58. 石头:minecraft:textures/block/stone.png! @5 o+ |' e  T) S8 I
  59. 木板:minecraft:textures/block/oak_planks.png
    * _) t% E' k9 ~) @- p" r! D
  60. 黑曜石:minecraft:textures/block/obsidian.png
    6 h' u2 C! n/ v# M8 B( Z
  61. 玻璃:minecraft:textures/block/glass.png
    " S/ k( ~4 P4 c
  62. */
    9 c& M. x" O& c% K
复制代码
7 t2 _  _5 R$ t" [
' S) X0 x2 x3 ?+ m7 Q$ `
放到游戏中大概是这个样子:
默认纹理下的站台
被修改成磨制花岗岩纹理的站台
可以通过修改装饰物件方块键值对来修改纹理。8 ]7 y. T; P) r' o* I6 J7 @* k7 G+ V

) x* {6 Q- D$ s% q7 O# D) d4 v3 G: v
目前该内容仍然在测试,感谢各位程序员们提出优化性能、功能方面的合理意见5 Q5 t% O* O( _6 Y! @9 i; k
最后的最后 提前一个小时祝大家2025年新年快乐!
( c* Z$ n- I- L+ s, n# G0 j2 ?
4 a, z# E/ J5 o9 t9 `# g/ |' e% P2 {" z4 |
  N" S; v' Y- N
  p& G: b7 @+ N
你是更怀念那几台机器,怀念那两个多月的时间,还是怀念当时与你一起合作的人?
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
. d; m) G$ l; B有点意思!

; u3 \0 I+ A4 M) _4 ^% e但是你那个当做站台好像即使√上了也没法使列车开门( k, s3 w) }' P( b9 X' W8 I
你是更怀念那几台机器,怀念那两个多月的时间,还是怀念当时与你一起合作的人?
Harlotte 作者认证 2025-1-2 06:32:17
Hobbytimeblank 发表于 2025-1-1 09:35
3 _, M( k/ K7 M* x9 u# O0 y但是你那个当做站台好像即使√上了也没法使列车开门
0 C1 ^) b5 q+ @* ]" h
?不应该啊 我这里测试好使着呢 嘶
有事加我QQ: 3435494979
楼主 Hobbytimeblank 作者认证 2025-1-2 19:25:08
Harlotte 发表于 2025-1-2 06:326 Z$ \& U$ ^$ d! m0 _% b8 P
?不应该啊 我这里测试好使着呢 嘶
" [# K& `9 e) G# N" m5 V2 j
当然我们建筑党有自己的解决方法:在装饰物件下面放一层原版站台
你是更怀念那几台机器,怀念那两个多月的时间,还是怀念当时与你一起合作的人?
Harlotte 作者认证 2025-1-3 21:40:20
Hobbytimeblank 发表于 2025-1-2 19:25. _% k3 a& ?4 t& L3 H, |
当然我们建筑党有自己的解决方法:在装饰物件下面放一层原版站台

' p# G  z9 I# G! x& d是当时代码写错了 遍历错了 已经修好了
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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