开启左侧

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

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

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

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

×
本帖最后由 Hobbytimeblank 于 2025-1-18 18:08 编辑 8 R* P! K- U% `" p3 S5 d
! O; U0 H. [% ]* |# V) [4 t2 d

3 A! Q& K4 a: u3 i/ G( L由于ANTE1.0.0版本修改的内容过多,该代码只能在0.5.4版本生效,新版本请勿使用
: m1 |: p2 f  v, V. C4 ]3 w& e* r$ C7 s5 F1 A
; p8 R) ?) `* m. c2 X  W9 G7 O+ c

6 z6 p& B# M5 s0 Z我前几天基于@Harlotte的ANTE模组写了我此生第一份
成功的.js代码; \% U% `/ y+ q( U. |3 A. f# d1 T$ C
实现的功能就是使用(A)NTE的装饰物件制作了可自定义材质的45度站台(其实其他的模型理论上也可以,是同一个原理)& \  k' G3 f/ L" E8 d
仅供参考!仅供参考!请勿直接完全照搬!
) H; r! F4 |( U& Y* [* ?7 v
  1. //加载模型
    % o6 p$ `4 Z$ U3 Y% ]
  2. //这里我使用了两个模型,第一个负责上下表面,第二个模型负责侧面; F1 _$ Q4 C. f
  3. let rawModel = ModelManager.loadRawModel(Resources.manager(), Resources.id("mtrsteamloco:models/platform_tall.obj"), null);& [) S# R, z9 n4 a
  4. let rawModel_side = ModelManager.loadRawModel(Resources.manager(), Resources.id("mtrsteamloco:models/platform_tall_side.obj"), null);
    - C1 H2 E8 u1 |8 Y" B
  5. //翻转 V 坐标
    8 L" |3 h& F+ ?2 o% P
  6. rawModel.applyUVMirror(false, true);
    " O/ h" a; n0 m5 ]0 A/ b
  7. rawModel_side.applyUVMirror(false, true);- h! G0 n/ E1 x
  8. 8 A5 K! H' {+ |8 u; l: e
  9. //设置初始纹理,其中tex是站台的底部和顶部。tex_side是站台的侧面(四面共用纹理)) _1 O. N, v* g! E; i1 v
  10. let tex = "mtrsteamloco:models/platform_45.png";
    / P6 n+ o3 y8 x
  11. let tex_side = "mtrsteamloco:models/platform_45_side.png";- A1 z- @/ L% p
  12. function create(ctx, state, entity){4 e; v. A; L; Y0 f& f/ y
  13.     state.platform_side = new DynamicModelHolder();
    $ p0 x$ ~1 W+ W* A& s' e% n
  14.     state.platform_side.uploadLater(rawModel_side);
    & A  k" G4 E6 U* `
  15.     state.platform = new DynamicModelHolder();
    " \# p0 A: j) B; Y
  16.     state.platform.uploadLater(rawModel);' l$ E$ i" W0 r
  17. ! K# C& `9 U  B3 u
  18.     //如果这个装饰物件是刚刚被放出来的,那么将其初始化,为其放入默认的方块数据) I: D- Y+ ?0 i1 t$ s
  19.     if(entity.data.get("texture")==null && entity.data.get("texture_side")==null){* u( K4 E" M" [) g3 a# P
  20.     state.tex=tex;
    + f4 O8 {. ^3 R# l( I9 {8 H
  21.     state.tex_side=tex_side;, T6 S* I( l; a/ Y  V( [# X; X
  22.     entity.data.put("texture", tex);
      z- @$ m$ C+ M) K# z
  23.     entity.data.put("texture_side", tex_side);
    , N. k5 I, H# l! e0 }$ Y1 x
  24.     }7 ?  ]( O& B8 V7 U( O
  25. }
    ' [. H! g4 a( i( m
  26. function render(ctx, state, entity){1 k7 u7 N! V: j# E% D& K
  27.     //获得DynamicModelHolder中的模型
    4 z6 T) M/ R3 p) k" U; F0 d
  28.     if(state.platform_side.getUploadedModel()!= null){8 R: _3 z% I+ q
  29.     plsModel = state.platform_side.getUploadedModel();}
    6 l6 J# O. D! s" e" i& a" v
  30.     if(state.platform.getUploadedModel()!= null){5 E) w: L1 g: f+ w9 t( d5 s0 ~! o: ^
  31.     plModel = state.platform.getUploadedModel();}7 q1 [: `0 }- @/ M9 Y8 v* v
  32. & ~3 M% U& w% ^1 G% f) b2 o8 M# @
  33.     //检测方块数据是否发生改变,如果改变则修改方块的纹理
    7 ^7 Z$ C, M! Q. a( i) O/ b/ g* ^
  34.     //要求用户自行填写资源位置,这也意味着你可以加载任何位置包括原版、资源包、模组内的任何图片作为站台的纹理  Y  O- W/ X% R( w
  35.     file = String(entity.data.get("texture"));7 e2 u* t' N7 C+ A% r! b# x  s% }
  36.     file_side = String(entity.data.get("texture_side"));
    , V' J. ^# E# a4 c: v6 D, d% p, B. I
  37.     if (file != state.tex){
    ; S7 Q, ~( c/ I! Z# ^
  38.         state.tex=file;
    ( d8 @/ Q; @3 Q: z8 r, \  T/ e
  39.         plModel.replaceAllTexture(Resources.id(state.tex));
    & U" W* u* l- r6 B8 p2 {& L# N( T8 G  f
  40.         }5 \. o: v' z4 {  {
  41.     if (file_side != state.tex_side){
    6 b1 U+ K# h$ J( ^( u
  42.         state.tex_side=file_side;
    2 ~! T! m3 f# C0 Z4 F- R8 Q8 F9 |9 a
  43.         plsModel.replaceAllTexture(Resources.id(state.tex_side));5 x! S# R' d. k
  44.         }
    5 s# T0 }8 [: O3 I* J1 O: o
  45. 3 a' [8 J+ g3 x0 o7 u
  46.     //绘制模型# m9 z# F! o/ f
  47.     ctx.drawModel(plsModel, null);
    5 {. Q3 v1 n0 `8 ^, h
  48.     ctx.drawModel(plModel, null);
    $ @& U8 R7 I, m( B
  49. }
    & b; j, Y  o" ]9 B8 H6 l
  50. //当模型离开渲染距离时,关闭它以释放内存
    . e& r* h% J1 ^9 j1 i
  51. function dispose(ctx, state, entity){. W5 ]. ?" _' S% u* Q" o
  52.     state.platform.close();
    ) C& `! ^0 ~$ p' g
  53.     state.platform_side.close();}
    2 I4 t3 _. R3 x& J0 z% U: m
  54. # ^$ J; l7 ~) @* T/ d
  55. /*常用方块ID列表, b* Y) [+ P; S9 {% F0 d
  56. 默认顶部:mtrsteamloco:models/platform_45.png& m& M5 O3 \/ q2 p
  57. 默认侧边:mtrsteamloco:models/platform_45_side.png
    : I) R4 W8 c6 O% U, C# D3 ~
  58. 石头:minecraft:textures/block/stone.png
    % m4 O( ~2 v1 x
  59. 木板:minecraft:textures/block/oak_planks.png
    4 }0 O* u; G7 P  r! P
  60. 黑曜石:minecraft:textures/block/obsidian.png5 _: r& v3 U) s- T7 c- s
  61. 玻璃:minecraft:textures/block/glass.png
    6 f3 [& a; j- R
  62. */4 D# Z7 j" R/ P+ r
复制代码

+ B( K" ^7 }9 s, c4 j9 ?& O, w1 K" E3 f' [. M0 L' L! N. r& e
放到游戏中大概是这个样子:
默认纹理下的站台
被修改成磨制花岗岩纹理的站台
可以通过修改装饰物件方块键值对来修改纹理。
- ?9 @# E4 \# B) |! j9 C1 n6 z3 Q! L3 B8 r; g% e! l: s# k! b

# p0 i" f% |. U8 J目前该内容仍然在测试,感谢各位程序员们提出优化性能、功能方面的合理意见8 ~2 R$ Z0 X4 p
最后的最后 提前一个小时祝大家2025年新年快乐!
+ q) F, M: @8 o8 [& O  ]
5 ^* T2 U' b5 u& c% T" T
- d& c* O: a1 A5 H' ]" b
/ N3 e0 o( C$ u# O2 [
7 K# l8 [3 J1 r3 ~
你是更怀念那几台机器,怀念那两个多月的时间,还是怀念当时与你一起合作的人?
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* S- |3 r, a7 `
有点意思!

3 ?4 k8 |+ G: P+ m但是你那个当做站台好像即使√上了也没法使列车开门& w2 g. V) d8 k
你是更怀念那几台机器,怀念那两个多月的时间,还是怀念当时与你一起合作的人?
Harlotte 作者认证 2025-1-2 06:32:17
Hobbytimeblank 发表于 2025-1-1 09:357 W  B7 ]1 x0 @& `3 ^
但是你那个当做站台好像即使√上了也没法使列车开门
+ H/ X1 G( ?. `' B  b0 l
?不应该啊 我这里测试好使着呢 嘶
有事加我QQ: 3435494979
楼主 Hobbytimeblank 作者认证 2025-1-2 19:25:08
Harlotte 发表于 2025-1-2 06:32
& F9 w- j$ q( e, [% v?不应该啊 我这里测试好使着呢 嘶
; X0 b! ]% \/ @8 z' `6 @6 @
当然我们建筑党有自己的解决方法:在装饰物件下面放一层原版站台
你是更怀念那几台机器,怀念那两个多月的时间,还是怀念当时与你一起合作的人?
Harlotte 作者认证 2025-1-3 21:40:20
Hobbytimeblank 发表于 2025-1-2 19:25
5 t4 [+ R7 G% `8 y, R3 }( d  z当然我们建筑党有自己的解决方法:在装饰物件下面放一层原版站台
; ]5 i# S4 e1 M+ i6 G
是当时代码写错了 遍历错了 已经修好了
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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