开启左侧

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

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

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

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

×
本帖最后由 Hobbytimeblank 于 2025-1-18 18:08 编辑
# k5 ]4 N( ]/ S
5 f( T* F4 l# g# }+ B9 d0 c* Q  v' u; {
由于ANTE1.0.0版本修改的内容过多,该代码只能在0.5.4版本生效,新版本请勿使用
  _9 K# k, j% E0 O; G) S- h% T. v: ?; c' D

' J$ }# Y$ G# L: o8 m4 N1 X' d

! p% Q- y8 D5 X: d, I! N9 ]我前几天基于@Harlotte的ANTE模组写了我此生第一份
成功的.js代码
1 t9 z% w2 @* D( |& @实现的功能就是使用(A)NTE的装饰物件制作了可自定义材质的45度站台(其实其他的模型理论上也可以,是同一个原理)
- Z7 S' ?6 f1 |; I# n- G% }8 `* _仅供参考!仅供参考!请勿直接完全照搬!
& _3 A' t' F2 D3 l
  1. //加载模型
    5 K/ e7 W$ d! ]
  2. //这里我使用了两个模型,第一个负责上下表面,第二个模型负责侧面1 X. k/ p1 I, `/ @1 F
  3. let rawModel = ModelManager.loadRawModel(Resources.manager(), Resources.id("mtrsteamloco:models/platform_tall.obj"), null);
    $ o  d! j, f' f( V
  4. let rawModel_side = ModelManager.loadRawModel(Resources.manager(), Resources.id("mtrsteamloco:models/platform_tall_side.obj"), null);& i' E& h# L' h* v- N
  5. //翻转 V 坐标, G0 E3 ~3 h; _* w& ~. L9 H
  6. rawModel.applyUVMirror(false, true);
    4 }8 c3 K( i% V- ?2 q
  7. rawModel_side.applyUVMirror(false, true);
    2 P: H( i- i1 ?4 D

  8. ( `& f4 k8 x1 _" s$ U
  9. //设置初始纹理,其中tex是站台的底部和顶部。tex_side是站台的侧面(四面共用纹理)
    % E2 E9 b: e0 {/ _! Y) P, @, i
  10. let tex = "mtrsteamloco:models/platform_45.png";
    0 T; w5 ~# E  w& \6 K
  11. let tex_side = "mtrsteamloco:models/platform_45_side.png";6 v+ s! y' z0 l7 ~
  12. function create(ctx, state, entity){
    ! C0 ^+ F( Y! _. }+ q
  13.     state.platform_side = new DynamicModelHolder();1 @/ u9 c+ U; r2 f; z, c
  14.     state.platform_side.uploadLater(rawModel_side);
    , G4 m9 Q1 ?2 _5 j3 G! r% P" Q( Q
  15.     state.platform = new DynamicModelHolder();
    ) g/ w4 w1 K4 d' d7 V/ Y* h
  16.     state.platform.uploadLater(rawModel);/ ^+ I( J+ Z( e% p0 U
  17. 4 F/ q/ ^& \9 g- I- d0 V8 D
  18.     //如果这个装饰物件是刚刚被放出来的,那么将其初始化,为其放入默认的方块数据
    2 _) n6 x* M' S+ z; W, y; C: V
  19.     if(entity.data.get("texture")==null && entity.data.get("texture_side")==null){
    $ g3 O" L& m6 P; @* p
  20.     state.tex=tex;
    " r; O5 `' T' C
  21.     state.tex_side=tex_side;
    9 Z* c" C3 Q! U9 T1 y8 `
  22.     entity.data.put("texture", tex);
    ' o, O2 n, K$ o! K7 K7 t7 `
  23.     entity.data.put("texture_side", tex_side);
    : M9 S: g6 Y) e2 {
  24.     }
    5 a- J3 ^1 s7 l+ o. S6 \
  25. }
    , i5 \" l$ Z5 _1 k; F
  26. function render(ctx, state, entity){
    ; z9 e0 g/ d$ c; w, S
  27.     //获得DynamicModelHolder中的模型. z  n6 Y0 `! l& C
  28.     if(state.platform_side.getUploadedModel()!= null){
    3 |  o) J& v6 V
  29.     plsModel = state.platform_side.getUploadedModel();}
    ' j8 m  q/ ?& s7 n
  30.     if(state.platform.getUploadedModel()!= null){
    4 x. [3 K* G8 U2 V( y# X
  31.     plModel = state.platform.getUploadedModel();}
    ( H) G: \% c3 J' p$ s2 e* W
  32. - z+ t: S6 n3 c7 K3 P  Z- F) \
  33.     //检测方块数据是否发生改变,如果改变则修改方块的纹理
    + R. Q* A9 [" D. ?% k. _
  34.     //要求用户自行填写资源位置,这也意味着你可以加载任何位置包括原版、资源包、模组内的任何图片作为站台的纹理
      _* j. F: ~( \
  35.     file = String(entity.data.get("texture"));
    3 N: C. E1 g2 y9 c0 y/ s* g( L: A
  36.     file_side = String(entity.data.get("texture_side"));* f2 W0 ]. ~8 N/ s, I1 A
  37.     if (file != state.tex){& Q4 d( o* {; A: B' i% m5 D( `) `
  38.         state.tex=file;
    ( s$ j( c! _& L  o, y  |1 m9 b
  39.         plModel.replaceAllTexture(Resources.id(state.tex));3 k1 d: I; {/ w
  40.         }( Q4 g+ C7 Y0 f' u
  41.     if (file_side != state.tex_side){% @. Q. ~, v7 L1 u3 n9 |
  42.         state.tex_side=file_side;
    6 I( [- ]# p, l6 y; h
  43.         plsModel.replaceAllTexture(Resources.id(state.tex_side));
    4 o1 l* H! V: E. u: H
  44.         }, E% F* j2 I( v6 K; }
  45. 0 i' T9 i+ C: \2 s6 K( R  F
  46.     //绘制模型7 z8 g- V& ~8 e: w  {: K+ y
  47.     ctx.drawModel(plsModel, null);; F' @3 o6 F6 k, }% T
  48.     ctx.drawModel(plModel, null);
    0 Z" M/ I' ]: H$ K. z
  49. }( G7 L$ Z. S. V6 ~4 w
  50. //当模型离开渲染距离时,关闭它以释放内存
    ) P9 W8 L7 W8 t1 X3 B
  51. function dispose(ctx, state, entity){
    . V2 W6 ^" r- D% o
  52.     state.platform.close();9 x9 x. a  y: o% _2 I6 U! d. ^
  53.     state.platform_side.close();}
    . {* v+ S- g" {* @1 m1 I

  54. ! ?! m4 s7 w7 r6 g
  55. /*常用方块ID列表
    ) a# A$ q; {3 l) Z8 s2 J
  56. 默认顶部:mtrsteamloco:models/platform_45.png
    * t" y! g  A2 G
  57. 默认侧边:mtrsteamloco:models/platform_45_side.png
    ) `! Q5 C0 [1 H, v0 v3 f
  58. 石头:minecraft:textures/block/stone.png
    & _- @& j: q( y
  59. 木板:minecraft:textures/block/oak_planks.png
    0 c% A( W. T. k$ K$ F3 H$ a1 A
  60. 黑曜石:minecraft:textures/block/obsidian.png
    4 A8 x6 Y" x) x+ b) ^
  61. 玻璃:minecraft:textures/block/glass.png6 M4 r' j+ J/ p) |! `9 h  s
  62. */- ^% \, O- W5 @8 M
复制代码

7 R: Q, k. F5 s; @- g; R9 t, g/ S5 e( v0 q$ O" |  T
放到游戏中大概是这个样子:
默认纹理下的站台
被修改成磨制花岗岩纹理的站台
可以通过修改装饰物件方块键值对来修改纹理。- G& I; Q1 ]; o: L, D$ _* B1 s
* I& M: l5 }) G6 t
. d# S& K2 T6 d) P9 ^' j7 p
目前该内容仍然在测试,感谢各位程序员们提出优化性能、功能方面的合理意见
# r- T# o* q1 }4 M% Q4 b% p最后的最后 提前一个小时祝大家2025年新年快乐!$ N0 k% s& Q5 l* i

. f# y  o1 y$ W; F: a% W5 L4 G; `, ~$ z' w
5 x- ?  T! [- ~/ R/ Y6 r

- a! D8 }4 D0 N, j- Q7 A+ h- 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:266 m# j; r5 r+ A, s
有点意思!
) l# [8 i; g4 T+ U
但是你那个当做站台好像即使√上了也没法使列车开门
$ `* J& ?) t6 q+ G9 n
你是更怀念那几台机器,怀念那两个多月的时间,还是怀念当时与你一起合作的人?
Harlotte 作者认证 2025-1-2 06:32:17
Hobbytimeblank 发表于 2025-1-1 09:35
% n% i( n  r" y* O8 q+ t2 g但是你那个当做站台好像即使√上了也没法使列车开门
% z: g# V( t! @5 b' K; {/ s
?不应该啊 我这里测试好使着呢 嘶
有事加我QQ: 3435494979
楼主 Hobbytimeblank 作者认证 2025-1-2 19:25:08
Harlotte 发表于 2025-1-2 06:32) ^$ e1 n' k; e' J
?不应该啊 我这里测试好使着呢 嘶
# R/ n4 P! K) y
当然我们建筑党有自己的解决方法:在装饰物件下面放一层原版站台
你是更怀念那几台机器,怀念那两个多月的时间,还是怀念当时与你一起合作的人?
Harlotte 作者认证 2025-1-3 21:40:20
Hobbytimeblank 发表于 2025-1-2 19:25' n5 q: C/ d7 m& {  r6 u. X
当然我们建筑党有自己的解决方法:在装饰物件下面放一层原版站台

. H2 d& `% c- \是当时代码写错了 遍历错了 已经修好了
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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