开启左侧

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

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

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

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

×
本帖最后由 Hobbytimeblank 于 2025-1-18 18:08 编辑   y0 N* F& Q& P, k4 ]! ?* i
% d. S8 ?. N; d
4 J. m9 c4 i9 W' K' h
由于ANTE1.0.0版本修改的内容过多,该代码只能在0.5.4版本生效,新版本请勿使用) ?% h# r. Q: R+ w) @8 T

: K6 i; g1 P  g8 F, x
1 G$ a* [% L0 \5 T; ^# T
) o, H( S, |% K- D; r
我前几天基于@Harlotte的ANTE模组写了我此生第一份
成功的.js代码
4 y5 E- c) ~/ {实现的功能就是使用(A)NTE的装饰物件制作了可自定义材质的45度站台(其实其他的模型理论上也可以,是同一个原理)9 U/ y9 V/ f3 N6 j! f# [
仅供参考!仅供参考!请勿直接完全照搬!8 A+ x% m# {) f+ y8 ~
  1. //加载模型0 q- Q) ~2 V+ ^- F. u' v  v3 @
  2. //这里我使用了两个模型,第一个负责上下表面,第二个模型负责侧面
    8 C4 e" O! W8 h# e1 ~
  3. let rawModel = ModelManager.loadRawModel(Resources.manager(), Resources.id("mtrsteamloco:models/platform_tall.obj"), null);6 F6 J* |* H7 S  Z8 P
  4. let rawModel_side = ModelManager.loadRawModel(Resources.manager(), Resources.id("mtrsteamloco:models/platform_tall_side.obj"), null);. j5 S2 h- p( M, N+ {5 \
  5. //翻转 V 坐标: T! F2 {, A  o: G
  6. rawModel.applyUVMirror(false, true);
    2 I9 U7 g+ r9 F" {
  7. rawModel_side.applyUVMirror(false, true);, [8 m& Y5 }4 q/ `

  8.   K: W7 A9 C: e8 h8 w4 L+ X
  9. //设置初始纹理,其中tex是站台的底部和顶部。tex_side是站台的侧面(四面共用纹理)5 X- y& m/ T( c9 B5 V( `
  10. let tex = "mtrsteamloco:models/platform_45.png";! F8 ^2 d# ~, r
  11. let tex_side = "mtrsteamloco:models/platform_45_side.png";( h" e. G% ]! T4 r
  12. function create(ctx, state, entity){. W  n; h* {7 v$ z
  13.     state.platform_side = new DynamicModelHolder();
    1 E- ~# |4 Z/ V+ j1 C
  14.     state.platform_side.uploadLater(rawModel_side);
    5 W5 E9 K; K' o8 K
  15.     state.platform = new DynamicModelHolder();5 Z+ j% ^: S) f6 D9 C' d' |* n5 @
  16.     state.platform.uploadLater(rawModel);
    " C! N# I9 e5 U  g- C$ k* X

  17. + b* G  X3 T4 |
  18.     //如果这个装饰物件是刚刚被放出来的,那么将其初始化,为其放入默认的方块数据; @5 c7 A) Z# x2 }! i
  19.     if(entity.data.get("texture")==null && entity.data.get("texture_side")==null){& P! m/ q# r1 N, i8 l( a4 f
  20.     state.tex=tex;3 g- q+ p" @+ T5 I8 V3 o
  21.     state.tex_side=tex_side;
    & d( C4 v' Q% x: F5 K4 ~
  22.     entity.data.put("texture", tex);
    / L4 o% u1 Y( v9 W  Q8 N
  23.     entity.data.put("texture_side", tex_side);
    6 b/ q2 V3 n% A% Y& m
  24.     }4 H, ^& ~1 N* \/ S4 q; o3 K0 e
  25. }
    5 t  d; R0 t& j- ~2 j3 e- W& \
  26. function render(ctx, state, entity){* w* ]" Z" V8 j8 O
  27.     //获得DynamicModelHolder中的模型7 x2 Z- b1 ^# A5 t. Y& m
  28.     if(state.platform_side.getUploadedModel()!= null){, u& Z. I8 A6 Q3 w5 J
  29.     plsModel = state.platform_side.getUploadedModel();}8 Q. s- N  c/ p3 r# m
  30.     if(state.platform.getUploadedModel()!= null){
    0 c) n- w& H$ q+ B" ^& Q9 f* j: C
  31.     plModel = state.platform.getUploadedModel();}
    ( B, y1 y+ a3 u7 [5 L/ F, }# t

  32. 6 q% ?$ c. N: e8 v9 y( O
  33.     //检测方块数据是否发生改变,如果改变则修改方块的纹理
    3 v; T$ s3 T- t" f
  34.     //要求用户自行填写资源位置,这也意味着你可以加载任何位置包括原版、资源包、模组内的任何图片作为站台的纹理6 J0 W5 b3 s. m
  35.     file = String(entity.data.get("texture"));
    " \+ {6 O0 j% l, H( Y) q
  36.     file_side = String(entity.data.get("texture_side"));
    7 X- J2 ~; I  ]
  37.     if (file != state.tex){
    4 N3 {" {  o4 W5 Q9 Z
  38.         state.tex=file;( q" L0 g' ^, B0 S+ ?, i
  39.         plModel.replaceAllTexture(Resources.id(state.tex));# ~' C; i+ }! c4 I. B+ U6 l
  40.         }4 ?" Q2 O# e8 v; b+ S  }
  41.     if (file_side != state.tex_side){, N, f* q' I' G2 U% t2 f, S
  42.         state.tex_side=file_side;
    % R  j' Y3 g, K# `, r
  43.         plsModel.replaceAllTexture(Resources.id(state.tex_side));" A/ q' y; z* P0 s
  44.         }0 W2 k6 w' n9 ?2 @

  45. & h9 R& a. `5 _4 u1 j7 U1 w' k* c- |
  46.     //绘制模型
    ( D1 I" C: {  @; |/ W) s& x
  47.     ctx.drawModel(plsModel, null);
    ) i, _3 ^1 E  d" O# S$ r. |
  48.     ctx.drawModel(plModel, null);
    2 \8 @  v7 E: ?/ A) }6 u9 W
  49. }, B* H! R6 ?# V$ t( Q7 H
  50. //当模型离开渲染距离时,关闭它以释放内存/ P9 `2 L! d$ @; y2 S7 ~& f/ I
  51. function dispose(ctx, state, entity){7 A7 o& b9 M+ p! L% ^; Z5 n
  52.     state.platform.close();9 ?# U. e6 h" u$ B9 |
  53.     state.platform_side.close();}
    " X, ?3 {0 N  W' A

  54. " b/ L4 {" N- \5 |* |8 b. A
  55. /*常用方块ID列表
    ( ^* b6 }/ g- b9 l) s' ~  s
  56. 默认顶部:mtrsteamloco:models/platform_45.png% X! S$ v0 s8 E1 a( j0 Z
  57. 默认侧边:mtrsteamloco:models/platform_45_side.png4 h4 L7 V0 Z3 W2 `/ g& h
  58. 石头:minecraft:textures/block/stone.png
    ( Y. c3 x/ W' d
  59. 木板:minecraft:textures/block/oak_planks.png7 Z& m/ @" c8 D2 ~- `
  60. 黑曜石:minecraft:textures/block/obsidian.png
      _4 O$ Y. d$ W
  61. 玻璃:minecraft:textures/block/glass.png- x5 w4 q3 J; ]2 v/ f
  62. */
    , h2 X% J5 G3 ]# B
复制代码
; _$ V  X: K! @/ r9 g7 N$ S! r
' _9 ~% T) o" ~5 z$ F7 B8 n3 X
放到游戏中大概是这个样子:
默认纹理下的站台
被修改成磨制花岗岩纹理的站台
可以通过修改装饰物件方块键值对来修改纹理。
" C& v6 C3 J5 T+ O+ D  y* T$ N$ F! b  k9 h2 F

6 S1 I- a9 h$ c# i3 s) A: q目前该内容仍然在测试,感谢各位程序员们提出优化性能、功能方面的合理意见( o- \7 b, Y% M7 D
最后的最后 提前一个小时祝大家2025年新年快乐!
- n1 _" Y/ m& p
) ]7 ]1 _; x+ f7 z2 D7 B) N  _5 e7 a6 [' T% z3 I! ]! j

) N8 {5 Q* C, U! o2 @& N+ `' T$ f1 u0 u" m
你是更怀念那几台机器,怀念那两个多月的时间,还是怀念当时与你一起合作的人?
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
& t: V  r2 x$ D, q$ Z+ q有点意思!
3 s6 p: @8 ^8 T& B8 g$ V6 U( \
但是你那个当做站台好像即使√上了也没法使列车开门
7 g. N* u" ^; s4 {+ f8 z. v
你是更怀念那几台机器,怀念那两个多月的时间,还是怀念当时与你一起合作的人?
Harlotte 作者认证 2025-1-2 06:32:17
Hobbytimeblank 发表于 2025-1-1 09:35
) o- l5 [2 K5 W7 I! x  u# @: X但是你那个当做站台好像即使√上了也没法使列车开门

$ q' K: [# H9 y8 O?不应该啊 我这里测试好使着呢 嘶
有事加我QQ: 3435494979
楼主 Hobbytimeblank 作者认证 2025-1-2 19:25:08
Harlotte 发表于 2025-1-2 06:325 e) w1 P' F" j; U  T- B" j
?不应该啊 我这里测试好使着呢 嘶
1 N" P& I* J5 l
当然我们建筑党有自己的解决方法:在装饰物件下面放一层原版站台
你是更怀念那几台机器,怀念那两个多月的时间,还是怀念当时与你一起合作的人?
Harlotte 作者认证 2025-1-3 21:40:20
Hobbytimeblank 发表于 2025-1-2 19:25
6 C5 f  Y8 X0 T# x当然我们建筑党有自己的解决方法:在装饰物件下面放一层原版站台
" q9 `: y+ H1 s2 x: f% v; [
是当时代码写错了 遍历错了 已经修好了
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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