开启左侧

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

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

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

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

×
本帖最后由 Hobbytimeblank 于 2025-1-18 18:08 编辑 : W( m/ T4 d$ F, I) r8 c

- V( T5 H1 @" g# C' _( o" ?. t* a. n8 m( \& R( S% n% _7 o6 z/ I! |
由于ANTE1.0.0版本修改的内容过多,该代码只能在0.5.4版本生效,新版本请勿使用
4 q9 S- \2 L% A6 i
$ s+ K3 Z" ~  z5 b
  I$ T3 S, z7 O& G$ ~

9 x1 b3 A( r% e4 {我前几天基于@Harlotte的ANTE模组写了我此生第一份
成功的.js代码
$ _8 p- X( g! R. v9 a) \7 ]实现的功能就是使用(A)NTE的装饰物件制作了可自定义材质的45度站台(其实其他的模型理论上也可以,是同一个原理)  ]2 F& C- z) X- g. z
仅供参考!仅供参考!请勿直接完全照搬!
* Q6 x& ], q# a
  1. //加载模型
    # w# U7 q# F9 J, u8 }( g
  2. //这里我使用了两个模型,第一个负责上下表面,第二个模型负责侧面
    5 S8 G: E7 J9 s1 F0 t. u
  3. let rawModel = ModelManager.loadRawModel(Resources.manager(), Resources.id("mtrsteamloco:models/platform_tall.obj"), null);
    8 h6 h8 g( }2 h! |5 A" m
  4. let rawModel_side = ModelManager.loadRawModel(Resources.manager(), Resources.id("mtrsteamloco:models/platform_tall_side.obj"), null);
    / m7 V1 t" j) A: }" m
  5. //翻转 V 坐标
    & t8 Y4 C" O- y1 @( g. b
  6. rawModel.applyUVMirror(false, true);) M/ h; C% J+ R) D6 j9 i3 E
  7. rawModel_side.applyUVMirror(false, true);
    . V% \. m$ _  }) W- P

  8. 0 w/ H- a* h: I; N5 h" ~/ P
  9. //设置初始纹理,其中tex是站台的底部和顶部。tex_side是站台的侧面(四面共用纹理)
    ' K4 R$ R+ }. r1 C3 f8 x
  10. let tex = "mtrsteamloco:models/platform_45.png";
    - F1 d$ z7 v  t* L; {
  11. let tex_side = "mtrsteamloco:models/platform_45_side.png";
    5 Z1 K/ o0 O& N2 q5 g
  12. function create(ctx, state, entity){
    + G7 v( W5 d6 o* b' e
  13.     state.platform_side = new DynamicModelHolder();+ s8 W) l$ s, m/ w6 K4 ]: _
  14.     state.platform_side.uploadLater(rawModel_side);% N7 Q. f  y% ?
  15.     state.platform = new DynamicModelHolder();: B9 S' G! ?5 d3 B4 c
  16.     state.platform.uploadLater(rawModel);
    3 {0 L2 z4 u+ E: V

  17. ( d& H7 x! E- z9 i9 t5 l
  18.     //如果这个装饰物件是刚刚被放出来的,那么将其初始化,为其放入默认的方块数据
    " @9 C! o7 x3 j2 A
  19.     if(entity.data.get("texture")==null && entity.data.get("texture_side")==null){
    : A( L3 J. l& n5 o; _! e( U$ w
  20.     state.tex=tex;! B& n/ z$ w" ]' c1 H6 Z8 X
  21.     state.tex_side=tex_side;
    ; ]: ^# i+ J+ C+ d& [) a
  22.     entity.data.put("texture", tex);5 I1 Z  D! ]9 a
  23.     entity.data.put("texture_side", tex_side);
    9 W' ?. x3 s( K7 S& C
  24.     }
    - {/ u4 X; }4 ^/ c& e& h. N) r6 `
  25. }' q5 D% @: @) Z/ O9 H
  26. function render(ctx, state, entity){( H! T5 r  x) O# ~5 @; t
  27.     //获得DynamicModelHolder中的模型
    ) F+ \9 V, Y0 ]& T$ O" w% q
  28.     if(state.platform_side.getUploadedModel()!= null){
      O: e; x1 b2 U: X! y( v( D3 ~8 h  C& [
  29.     plsModel = state.platform_side.getUploadedModel();}
    7 ]4 @/ F1 P) O6 D2 a
  30.     if(state.platform.getUploadedModel()!= null){
    ) E7 O3 G/ k" R, M
  31.     plModel = state.platform.getUploadedModel();}
    # c/ t4 W6 s# N8 N3 j- B- V9 ]
  32. $ Z5 ^8 i# q6 Y9 Y( w& w5 _' v
  33.     //检测方块数据是否发生改变,如果改变则修改方块的纹理
    ) ]3 m5 I9 o4 g) p0 b
  34.     //要求用户自行填写资源位置,这也意味着你可以加载任何位置包括原版、资源包、模组内的任何图片作为站台的纹理/ Y0 s6 a# \  z
  35.     file = String(entity.data.get("texture"));
    * T. T: j4 h! f7 I( h7 A
  36.     file_side = String(entity.data.get("texture_side"));4 I. [$ I5 [9 y( |6 N+ c
  37.     if (file != state.tex){
    , j& p* o4 q* M% ^" Y3 e. u
  38.         state.tex=file;4 |6 d5 s3 [" [+ |1 p9 t
  39.         plModel.replaceAllTexture(Resources.id(state.tex));
    . g. p. B  I+ g5 d- b3 {* b+ t* G/ E: ^
  40.         }$ \4 `7 L8 j* k4 B3 h' \. P/ X5 H
  41.     if (file_side != state.tex_side){6 y4 x" O' D. F4 a  ~8 I2 A
  42.         state.tex_side=file_side;
    % f; y; i) R7 u$ q  P
  43.         plsModel.replaceAllTexture(Resources.id(state.tex_side));
    + O5 d, }& n+ D( M2 {
  44.         }
    ! R6 n+ K' r& R9 d& j7 ?/ K
  45. ' \( n, i8 k' l* G' E% ]
  46.     //绘制模型0 ~0 ~' m$ C( k  B
  47.     ctx.drawModel(plsModel, null);, |* h! s; D2 g1 R: A
  48.     ctx.drawModel(plModel, null);9 P7 |7 W! s9 o& G
  49. }
    1 w7 Q5 y/ o& Z
  50. //当模型离开渲染距离时,关闭它以释放内存9 i; B" P5 B# I0 J
  51. function dispose(ctx, state, entity){
    6 C/ \# ?- e* r: I
  52.     state.platform.close();
    / F: b; ]1 a0 b4 Q1 a: D4 s
  53.     state.platform_side.close();}
    9 U5 _) k1 J0 T/ W7 C3 v

  54. , v$ q' x$ \9 F0 _/ G1 U3 @
  55. /*常用方块ID列表  }& ~0 ?# ?( y" P( `& Y" \" i
  56. 默认顶部:mtrsteamloco:models/platform_45.png7 G. o" T+ k9 j8 m
  57. 默认侧边:mtrsteamloco:models/platform_45_side.png" H4 l5 R$ w$ S
  58. 石头:minecraft:textures/block/stone.png
    " l1 p$ i6 G# r" b3 y" F7 a2 V2 X( ?
  59. 木板:minecraft:textures/block/oak_planks.png
    0 V* k0 H* C" ]. P4 k
  60. 黑曜石:minecraft:textures/block/obsidian.png
    * L0 p* U( W; I* o
  61. 玻璃:minecraft:textures/block/glass.png7 E% j$ b8 e) C; ?: g8 [( f7 W$ a
  62. */
    $ Q) k0 _3 b$ Q  O* U5 i
复制代码

! D# r- e; m) }2 G+ d/ w6 f  N% r
6 p$ n1 B* J! Z' g" X  C" Z放到游戏中大概是这个样子:
默认纹理下的站台
被修改成磨制花岗岩纹理的站台
可以通过修改装饰物件方块键值对来修改纹理。# \2 J1 ^. K7 g# g" }

3 A# L. G+ ?1 u' o+ Z' |0 \1 f6 H% A: k8 ]1 w& d
目前该内容仍然在测试,感谢各位程序员们提出优化性能、功能方面的合理意见
" h4 |2 v8 }& ~1 N: I" l6 b% }* ], p最后的最后 提前一个小时祝大家2025年新年快乐!
* c! {7 G" W( u! N! E% b! Y) Y- i  D
! p# w' f5 i$ q+ @, w
0 |- }5 b" Z) j0 P( F4 a+ }, ~* p! e$ P3 k, p4 Y* H
, c' X* q4 L! b* ?
你是更怀念那几台机器,怀念那两个多月的时间,还是怀念当时与你一起合作的人?
Harlotte 作者认证 2025-1-1 09:26:31
有点意思!

评分

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

查看全部评分

楼主 Hobbytimeblank 作者认证 2025-1-1 09:35:40
Harlotte 发表于 2025-1-1 09:26) \" l# }& c3 _# ^. P
有点意思!

+ w. q! {+ g( H; F1 ~4 u但是你那个当做站台好像即使√上了也没法使列车开门
# e5 M/ g- G% t6 I8 T. [
你是更怀念那几台机器,怀念那两个多月的时间,还是怀念当时与你一起合作的人?
Harlotte 作者认证 2025-1-2 06:32:17
Hobbytimeblank 发表于 2025-1-1 09:35
# n" B& ~1 Q: q+ B: [但是你那个当做站台好像即使√上了也没法使列车开门

- |( t; d2 z( X$ U?不应该啊 我这里测试好使着呢 嘶
楼主 Hobbytimeblank 作者认证 2025-1-2 19:25:08
Harlotte 发表于 2025-1-2 06:32& l/ H8 D6 G7 K
?不应该啊 我这里测试好使着呢 嘶
( U/ ?( A0 V* f
当然我们建筑党有自己的解决方法:在装饰物件下面放一层原版站台
你是更怀念那几台机器,怀念那两个多月的时间,还是怀念当时与你一起合作的人?
Harlotte 作者认证 2025-1-3 21:40:20
Hobbytimeblank 发表于 2025-1-2 19:25
! r& @5 g6 n% a% s" n. x当然我们建筑党有自己的解决方法:在装饰物件下面放一层原版站台
5 D; M+ {2 |+ |4 q9 Y
是当时代码写错了 遍历错了 已经修好了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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