开启左侧

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

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

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

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

×
本帖最后由 Hobbytimeblank 于 2025-1-18 18:08 编辑 9 s& T5 Y3 z2 g/ j. V% e; |. w7 M
# z. b7 x% O5 b$ O7 O- B: U& h/ {
+ g& t2 l! P9 a; E
由于ANTE1.0.0版本修改的内容过多,该代码只能在0.5.4版本生效,新版本请勿使用3 y. [$ }2 g9 a- `

5 j! u0 C, @8 c  d  y+ c0 P( Q, i1 C  ?# K' _. ]6 E
0 t9 {" l3 }1 [! x- j  N  T/ n
我前几天基于@Harlotte的ANTE模组写了我此生第一份
成功的.js代码7 }7 ~: ^1 x9 P- T0 t
实现的功能就是使用(A)NTE的装饰物件制作了可自定义材质的45度站台(其实其他的模型理论上也可以,是同一个原理)5 R  ?' p3 f/ ~3 J
仅供参考!仅供参考!请勿直接完全照搬!
# ^3 d, g9 g& Y$ P; w' `0 F# e% L3 W
  1. //加载模型
    8 E' h; B0 U7 C, Y3 |: I
  2. //这里我使用了两个模型,第一个负责上下表面,第二个模型负责侧面9 g2 t6 H$ g8 E: D
  3. let rawModel = ModelManager.loadRawModel(Resources.manager(), Resources.id("mtrsteamloco:models/platform_tall.obj"), null);' {3 U' e  S  o4 r
  4. let rawModel_side = ModelManager.loadRawModel(Resources.manager(), Resources.id("mtrsteamloco:models/platform_tall_side.obj"), null);
    4 y# g5 A, h. h% \
  5. //翻转 V 坐标" Q- b) J& [/ ]% N
  6. rawModel.applyUVMirror(false, true);
    $ B) X( O: O. ]! m+ v
  7. rawModel_side.applyUVMirror(false, true);, i$ t( K6 y! u" O4 x! `+ \. z

  8. ) j9 [7 C5 m% g: N3 l# E
  9. //设置初始纹理,其中tex是站台的底部和顶部。tex_side是站台的侧面(四面共用纹理)% E& ]. N- M" j" _6 v
  10. let tex = "mtrsteamloco:models/platform_45.png";
    6 M: S7 _8 c3 w. o
  11. let tex_side = "mtrsteamloco:models/platform_45_side.png";
    9 I3 a) f. C0 i  X
  12. function create(ctx, state, entity){& y" ^. L2 R( A: ~! w
  13.     state.platform_side = new DynamicModelHolder();
    ; @6 D5 o, U& m
  14.     state.platform_side.uploadLater(rawModel_side);, y; j1 T* U% X9 J8 Y& M! m+ @# B5 m
  15.     state.platform = new DynamicModelHolder();; C/ _! N7 ~; N8 r$ G3 E
  16.     state.platform.uploadLater(rawModel);
    # I- }: d! k3 @3 y, N) r5 p+ p
  17. # ^) `/ ?' O. r8 x. w
  18.     //如果这个装饰物件是刚刚被放出来的,那么将其初始化,为其放入默认的方块数据9 w5 @* p1 e7 P: v3 o) [
  19.     if(entity.data.get("texture")==null && entity.data.get("texture_side")==null){
    5 b0 _4 v" {7 C' [, @7 V$ W( b
  20.     state.tex=tex;% y' _7 {3 u8 _4 Q) W5 \
  21.     state.tex_side=tex_side;
    ; z; l5 T) P1 J0 I/ l
  22.     entity.data.put("texture", tex);' G4 O$ i$ W3 J4 D) y1 m
  23.     entity.data.put("texture_side", tex_side);
    # ?5 j4 ~3 e. D* f5 M1 @+ H* Z& _5 \
  24.     }
    7 h# C* Y% k1 C& E; C0 k# H9 X
  25. }% ?2 W) ~% s3 V+ _0 z5 s+ M
  26. function render(ctx, state, entity){8 n- {: @# P! y6 o- F1 v
  27.     //获得DynamicModelHolder中的模型. `. O0 Q2 Z" M) f
  28.     if(state.platform_side.getUploadedModel()!= null){2 G, O: o$ R% p/ Z. d# T% k# O3 P
  29.     plsModel = state.platform_side.getUploadedModel();}
    * B9 V7 ]: Z, K* Y
  30.     if(state.platform.getUploadedModel()!= null){& o( g4 i7 O$ Y0 ~
  31.     plModel = state.platform.getUploadedModel();}6 X2 G$ e1 ~" M8 j2 f
  32. # j- s" w' t1 t6 z4 v
  33.     //检测方块数据是否发生改变,如果改变则修改方块的纹理3 x6 D7 Q4 R% F/ t( ^! s  Y
  34.     //要求用户自行填写资源位置,这也意味着你可以加载任何位置包括原版、资源包、模组内的任何图片作为站台的纹理
    & e" V! C! B! M0 g
  35.     file = String(entity.data.get("texture"));
    " `7 U0 F2 z6 W- [$ `
  36.     file_side = String(entity.data.get("texture_side"));
    , p' v2 G# E3 V0 y( Q* o1 c
  37.     if (file != state.tex){3 w# n$ C  a# E4 e" z2 ~' T0 q
  38.         state.tex=file;
    9 [8 J0 _! ]7 \( y
  39.         plModel.replaceAllTexture(Resources.id(state.tex));; v  c/ q7 p% {
  40.         }
    " Y! R( y: u6 \; w
  41.     if (file_side != state.tex_side){
    6 l5 d( \" e) \' S9 V5 W
  42.         state.tex_side=file_side;
    5 p+ a& q2 K3 O. |2 @# B: h* E) b; z
  43.         plsModel.replaceAllTexture(Resources.id(state.tex_side));1 ?+ `# B3 n0 p  Y% i7 V0 k6 }
  44.         }
    . }5 j! f# c7 J1 b9 K

  45. 2 e# T4 `  B: M+ V
  46.     //绘制模型
    $ F% Q; R7 W% C. v- H
  47.     ctx.drawModel(plsModel, null);8 q* m+ a: h: ^7 }
  48.     ctx.drawModel(plModel, null);- |: q4 s; L. @$ T: Z4 p( y
  49. }' A- d# f& ?: Z$ H
  50. //当模型离开渲染距离时,关闭它以释放内存
    3 W0 T. P" c1 E- C- x
  51. function dispose(ctx, state, entity){+ P9 p$ b$ ~5 m% Z1 n
  52.     state.platform.close();
    % e7 `  N0 R+ _9 W" i5 ~( Y! I( ]
  53.     state.platform_side.close();}) r7 y% B/ `4 \/ Q( |3 G' S

  54. ' }# u/ W: x& [; X/ e' J
  55. /*常用方块ID列表
    9 o# `; E3 y; V: i4 P  v
  56. 默认顶部:mtrsteamloco:models/platform_45.png
    " v, {. n8 c* W* l2 P
  57. 默认侧边:mtrsteamloco:models/platform_45_side.png
    5 y% v" A% R  [& Z6 ]
  58. 石头:minecraft:textures/block/stone.png0 V/ F" e' N. u% s! @
  59. 木板:minecraft:textures/block/oak_planks.png" O2 E* V* O. M) T( Q+ |
  60. 黑曜石:minecraft:textures/block/obsidian.png- R. W3 k- M% k9 F$ r  k
  61. 玻璃:minecraft:textures/block/glass.png  C1 |" V; D* p
  62. */
    " ~4 @* _' ?/ f, e' q3 M
复制代码

8 b7 O/ s8 O5 B3 U; s5 w! L# K, q+ P% z2 N
放到游戏中大概是这个样子:
默认纹理下的站台
被修改成磨制花岗岩纹理的站台
可以通过修改装饰物件方块键值对来修改纹理。1 {! R: C' f! f* _2 p4 M/ b
5 C) h% x4 M( R: y
# w) q$ X/ h, j# ~  A) K4 F
目前该内容仍然在测试,感谢各位程序员们提出优化性能、功能方面的合理意见+ [" |9 h' g& l+ x# y
最后的最后 提前一个小时祝大家2025年新年快乐!( q4 Q, w/ t7 H- V; M+ h! c
3 q# N' ~9 |5 j) x

9 a/ h& P3 m5 [% e9 J
+ M  ^" ]  X4 h/ ]: R& F) u% X$ o4 x, H8 }2 O# I' t
你是更怀念那几台机器,怀念那两个多月的时间,还是怀念当时与你一起合作的人?
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- `  _  I: u' E* U
有点意思!

% Z7 z, I/ i4 u8 O但是你那个当做站台好像即使√上了也没法使列车开门: V6 I& T* q# T( m: n
你是更怀念那几台机器,怀念那两个多月的时间,还是怀念当时与你一起合作的人?
Harlotte 作者认证 2025-1-2 06:32:17
Hobbytimeblank 发表于 2025-1-1 09:35
1 Q; O5 ]2 {# V5 v0 g8 V但是你那个当做站台好像即使√上了也没法使列车开门

/ p$ M: I4 C- R' h0 n?不应该啊 我这里测试好使着呢 嘶
有事加我QQ: 3435494979
楼主 Hobbytimeblank 作者认证 2025-1-2 19:25:08
Harlotte 发表于 2025-1-2 06:32
' d4 s9 ]/ g8 K' z?不应该啊 我这里测试好使着呢 嘶

6 X; M& p9 L, @0 v7 w6 f) K  R0 G当然我们建筑党有自己的解决方法:在装饰物件下面放一层原版站台
你是更怀念那几台机器,怀念那两个多月的时间,还是怀念当时与你一起合作的人?
Harlotte 作者认证 2025-1-3 21:40:20
Hobbytimeblank 发表于 2025-1-2 19:25; X& w8 C3 `  K& x
当然我们建筑党有自己的解决方法:在装饰物件下面放一层原版站台
5 V& H5 _) E! G7 l; ?2 S" X7 `
是当时代码写错了 遍历错了 已经修好了
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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