开启左侧

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

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

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

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

×
本帖最后由 Hobbytimeblank 于 2025-1-18 18:08 编辑 * R- [& c4 C0 N$ j
2 J0 o6 v% l6 F& w: t# ~
- l5 t: C4 G0 R, E( B2 Z+ c& n- T
由于ANTE1.0.0版本修改的内容过多,该代码只能在0.5.4版本生效,新版本请勿使用
3 R2 U& n3 b9 i$ E+ R* |3 m7 a1 \

( m  O) {+ x7 N. N/ i* s

) e' Q& i. s5 V我前几天基于@Harlotte的ANTE模组写了我此生第一份
成功的.js代码
( h4 U+ ^3 F7 P) R7 T7 z  b实现的功能就是使用(A)NTE的装饰物件制作了可自定义材质的45度站台(其实其他的模型理论上也可以,是同一个原理)7 N/ H! A2 A' M! P: ?8 O4 K
仅供参考!仅供参考!请勿直接完全照搬!- ~1 F* j. m+ b9 t8 I7 D6 z# x8 C
  1. //加载模型/ c- J; D; S" n, g
  2. //这里我使用了两个模型,第一个负责上下表面,第二个模型负责侧面, n9 f% Z9 l. Q$ J* b0 ~
  3. let rawModel = ModelManager.loadRawModel(Resources.manager(), Resources.id("mtrsteamloco:models/platform_tall.obj"), null);
    ( s- t( Q, B; H6 v! Y! Z
  4. let rawModel_side = ModelManager.loadRawModel(Resources.manager(), Resources.id("mtrsteamloco:models/platform_tall_side.obj"), null);
    , u' N5 a, q( x
  5. //翻转 V 坐标' `7 t- s2 O0 p& {! @( I! F
  6. rawModel.applyUVMirror(false, true);' A, G) |+ }# n; \7 t# ]' Q, X
  7. rawModel_side.applyUVMirror(false, true);
    - F; n$ n+ F, q, E* E% \& [$ _. `
  8. 8 y2 q1 P1 k" Y: C$ ?4 D) Q5 V6 d
  9. //设置初始纹理,其中tex是站台的底部和顶部。tex_side是站台的侧面(四面共用纹理)
    3 `* n2 i, n8 A2 U' n1 E0 c
  10. let tex = "mtrsteamloco:models/platform_45.png";9 T$ N7 `( j9 o
  11. let tex_side = "mtrsteamloco:models/platform_45_side.png";5 S& w  }' i. @+ u" x
  12. function create(ctx, state, entity){' k8 W+ B, y' C$ w0 j! u1 b
  13.     state.platform_side = new DynamicModelHolder();3 P* ]# N0 W& `; |1 |4 K6 V% c6 s
  14.     state.platform_side.uploadLater(rawModel_side);) b1 {  p2 p; Z: h) C9 z
  15.     state.platform = new DynamicModelHolder();
    ; L' i  y) g# ^% h9 D: {( L
  16.     state.platform.uploadLater(rawModel);* p' t0 L! Z, Y% ?

  17. : |) k# j9 G6 f0 f. p
  18.     //如果这个装饰物件是刚刚被放出来的,那么将其初始化,为其放入默认的方块数据* c* G$ d$ M+ R* I
  19.     if(entity.data.get("texture")==null && entity.data.get("texture_side")==null){
    6 V( q' I5 d/ M+ T
  20.     state.tex=tex;4 B# z, C) ]! A: h# T
  21.     state.tex_side=tex_side;; o4 I6 g& w, [. i6 e0 E. d% X
  22.     entity.data.put("texture", tex);
    % E7 i% d: k7 l; j& u  k7 U/ H
  23.     entity.data.put("texture_side", tex_side);
    & M3 ?7 ^. a9 ^# k) o2 p
  24.     }
    6 h) x5 s/ x# x. i
  25. }; G$ F% A4 \3 ?
  26. function render(ctx, state, entity){9 B4 L" M/ q2 [
  27.     //获得DynamicModelHolder中的模型
    & d: K* V# J3 ^
  28.     if(state.platform_side.getUploadedModel()!= null){" \/ g' n! D2 a
  29.     plsModel = state.platform_side.getUploadedModel();}. a7 B+ S' _: i
  30.     if(state.platform.getUploadedModel()!= null){2 J$ F0 X8 F  u
  31.     plModel = state.platform.getUploadedModel();}! @. Y/ X1 Z, r% b) r

  32. ) ~8 R8 I1 h; n9 O# X( y( t
  33.     //检测方块数据是否发生改变,如果改变则修改方块的纹理
    $ X' L: v$ n9 H% x! Z
  34.     //要求用户自行填写资源位置,这也意味着你可以加载任何位置包括原版、资源包、模组内的任何图片作为站台的纹理
    8 q/ G, l! D) e+ T# M/ a
  35.     file = String(entity.data.get("texture"));
    + S. }1 R8 U  u* U1 D% A" [9 F
  36.     file_side = String(entity.data.get("texture_side"));9 M" b0 K  T9 F& `& K2 s  V+ }, S5 f
  37.     if (file != state.tex){
      b. c& P, p8 |" c+ u4 J! f3 I* H( ^
  38.         state.tex=file;% D6 Q0 [; e7 L
  39.         plModel.replaceAllTexture(Resources.id(state.tex));  }/ L" E5 q, X% P, u9 d4 M
  40.         }* ^7 [* ^! ]  \; k
  41.     if (file_side != state.tex_side){1 o7 L; k9 o! Y2 @7 K7 T& S
  42.         state.tex_side=file_side;7 q+ t2 t4 x8 j: A# u% Z
  43.         plsModel.replaceAllTexture(Resources.id(state.tex_side));! _; Y7 n  }( o' k8 Q
  44.         }
    8 V# r8 x* ^; V0 C2 ~) v* ?0 D

  45. ! p% U6 r% D, A! M+ K5 K
  46.     //绘制模型: ~; {  a/ n7 N: ~" L1 P* ^
  47.     ctx.drawModel(plsModel, null);
    ( W% W' @" ^( r/ E
  48.     ctx.drawModel(plModel, null);
    0 B4 n( I5 Q( M% t/ H
  49. }7 Z- K# r; `6 e" i" r2 T9 q* u
  50. //当模型离开渲染距离时,关闭它以释放内存
    " b6 K% a! J. f) I" w
  51. function dispose(ctx, state, entity){
    ; p, _% Q5 z3 J$ u. h3 A- y# P
  52.     state.platform.close();" ^. n0 U8 k9 e- N5 c; M
  53.     state.platform_side.close();}
    7 T4 _4 M+ I: n! k6 |3 g, L/ |
  54. 8 ?) t0 n! Z+ i9 i7 [9 u
  55. /*常用方块ID列表
    6 \& k1 ~5 ~8 H
  56. 默认顶部:mtrsteamloco:models/platform_45.png# W$ e. B. `& G& B' j$ {% c8 M+ K
  57. 默认侧边:mtrsteamloco:models/platform_45_side.png
      X! P7 l9 Q$ _. c
  58. 石头:minecraft:textures/block/stone.png7 t9 B9 q5 {/ p& Y
  59. 木板:minecraft:textures/block/oak_planks.png0 j8 m- v! Z1 I, u) ^
  60. 黑曜石:minecraft:textures/block/obsidian.png- Y3 x7 x; l5 d: v0 T& }9 @
  61. 玻璃:minecraft:textures/block/glass.png, ~* T- @0 j5 p7 i9 n) g
  62. */4 h; x9 s9 w' k2 V2 T# P
复制代码
! J7 Y1 D( j  J( p

& B* x: i  T7 y放到游戏中大概是这个样子:
默认纹理下的站台
被修改成磨制花岗岩纹理的站台
可以通过修改装饰物件方块键值对来修改纹理。& P) U; y9 K9 \/ H- r

% L  S% t: Z& G7 Y) C
! i. Y$ x/ U! _% b. l" v目前该内容仍然在测试,感谢各位程序员们提出优化性能、功能方面的合理意见
# |7 l1 [# |1 F1 T最后的最后 提前一个小时祝大家2025年新年快乐!
6 E3 c, ]( q* F6 Q9 U- {2 M& f. f0 r
, N( W8 ]# _( `6 S3 Z: o

+ G* U& d6 w' P6 f, [
- K: A, G$ t: L
你是更怀念那几台机器,怀念那两个多月的时间,还是怀念当时与你一起合作的人?
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! n# C- P# _* ^+ e4 _* Y8 x
有点意思!

# Q; I. ]) F1 Y6 O6 B# R但是你那个当做站台好像即使√上了也没法使列车开门1 o9 k; `4 p: W7 ~% d
你是更怀念那几台机器,怀念那两个多月的时间,还是怀念当时与你一起合作的人?
Harlotte 作者认证 2025-1-2 06:32:17
Hobbytimeblank 发表于 2025-1-1 09:359 p6 Y# |: f" Q: F" [6 k; m
但是你那个当做站台好像即使√上了也没法使列车开门
$ z5 @/ n7 m) e. U8 a
?不应该啊 我这里测试好使着呢 嘶
有事加我QQ: 3435494979
楼主 Hobbytimeblank 作者认证 2025-1-2 19:25:08
Harlotte 发表于 2025-1-2 06:32; c/ O) A. r6 w9 @6 A  _" i0 s2 |* w
?不应该啊 我这里测试好使着呢 嘶

' Y) C! @  D# B( w! m当然我们建筑党有自己的解决方法:在装饰物件下面放一层原版站台
你是更怀念那几台机器,怀念那两个多月的时间,还是怀念当时与你一起合作的人?
Harlotte 作者认证 2025-1-3 21:40:20
Hobbytimeblank 发表于 2025-1-2 19:25
2 {8 ~7 k( p3 \. U6 K5 ~1 k当然我们建筑党有自己的解决方法:在装饰物件下面放一层原版站台
: D! n  V. G; U1 @( f+ T
是当时代码写错了 遍历错了 已经修好了
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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