开启左侧

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

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

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

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

×
本帖最后由 Hobbytimeblank 于 2025-1-18 18:08 编辑
' J8 [( }* L/ N/ V" H  D( h8 X4 Z2 v2 |9 R+ Y8 |

! w3 ~1 N+ p$ l2 A由于ANTE1.0.0版本修改的内容过多,该代码只能在0.5.4版本生效,新版本请勿使用: Q+ z; N& q3 ~1 m0 z
' i# i& x0 \7 i5 S& |: Y0 U

5 V4 M: ^: V0 L* h

- m; ]* b: e; W1 w我前几天基于@Harlotte的ANTE模组写了我此生第一份
成功的.js代码# L" ?5 d. }9 X6 `4 }2 z
实现的功能就是使用(A)NTE的装饰物件制作了可自定义材质的45度站台(其实其他的模型理论上也可以,是同一个原理)
: `. P. p0 d# w' U仅供参考!仅供参考!请勿直接完全照搬!
# i8 z* {" w+ t& S  s8 @& q  m; U
  1. //加载模型
    ) y! a5 G6 |; q7 ~' A: I
  2. //这里我使用了两个模型,第一个负责上下表面,第二个模型负责侧面
      |7 u* M% t9 d1 |6 O# V8 S. F
  3. let rawModel = ModelManager.loadRawModel(Resources.manager(), Resources.id("mtrsteamloco:models/platform_tall.obj"), null);8 w- e. m( {6 j
  4. let rawModel_side = ModelManager.loadRawModel(Resources.manager(), Resources.id("mtrsteamloco:models/platform_tall_side.obj"), null);
    * [2 e( |. t8 K4 x
  5. //翻转 V 坐标6 j9 z3 X8 |$ H0 K0 ?( ?% x# N4 o4 @
  6. rawModel.applyUVMirror(false, true);, V7 e. ^$ A9 k- v6 J. o
  7. rawModel_side.applyUVMirror(false, true);
    4 d1 S" p8 o/ g

  8. & c2 l' v9 }: e2 ]
  9. //设置初始纹理,其中tex是站台的底部和顶部。tex_side是站台的侧面(四面共用纹理)0 T; s+ m& l! g: r& i
  10. let tex = "mtrsteamloco:models/platform_45.png";& [- S9 ]* K- z1 ^( Q! y
  11. let tex_side = "mtrsteamloco:models/platform_45_side.png";: u7 Y0 c- ^( i# U8 k
  12. function create(ctx, state, entity){3 [! a2 i7 ]" G) N' x6 e
  13.     state.platform_side = new DynamicModelHolder();
    4 Q: y5 x* B$ Y) u: u9 H
  14.     state.platform_side.uploadLater(rawModel_side);
    8 E; o* U8 P8 W
  15.     state.platform = new DynamicModelHolder();
    4 d. i+ x# @7 }4 ^; L
  16.     state.platform.uploadLater(rawModel);6 |7 T' h7 ~* {; @6 r9 G

  17. ' s/ e* _; c3 x/ x. q( [0 s
  18.     //如果这个装饰物件是刚刚被放出来的,那么将其初始化,为其放入默认的方块数据
    2 o" K% ^6 }( Z" C' G0 W
  19.     if(entity.data.get("texture")==null && entity.data.get("texture_side")==null){
    2 z$ o6 d( j0 [1 z
  20.     state.tex=tex;" }0 S9 b9 Q) L4 _/ L: u
  21.     state.tex_side=tex_side;+ z+ g# R2 Z& A2 {: h: _
  22.     entity.data.put("texture", tex);
    % A/ R7 [9 X" U
  23.     entity.data.put("texture_side", tex_side);
    ; g1 o. B& U1 h6 p" u, U1 X& ^/ m
  24.     }
    7 r/ v. H/ i  k8 ^1 L) t, @) C
  25. }
    ; P# ~& @) D, A1 a9 m
  26. function render(ctx, state, entity){7 Q( a! N" N8 O9 q8 @' a
  27.     //获得DynamicModelHolder中的模型5 \  B" V2 u! o2 R  a/ ~
  28.     if(state.platform_side.getUploadedModel()!= null){" G* ~  P& k/ V$ K9 O- i8 b
  29.     plsModel = state.platform_side.getUploadedModel();}
    6 _+ D3 c+ |4 p9 G
  30.     if(state.platform.getUploadedModel()!= null){
    * v1 F2 _* n4 X0 a
  31.     plModel = state.platform.getUploadedModel();}
    8 g1 L8 K! J8 i) m% E' W

  32. ! ~6 L- n/ m3 I8 e3 T2 X
  33.     //检测方块数据是否发生改变,如果改变则修改方块的纹理
    6 b  q$ `7 v& B! q- R) T5 E
  34.     //要求用户自行填写资源位置,这也意味着你可以加载任何位置包括原版、资源包、模组内的任何图片作为站台的纹理8 E, k5 ?6 \% s5 Q" D6 X
  35.     file = String(entity.data.get("texture"));
    7 d2 J( x9 r+ X: v7 W% y# E
  36.     file_side = String(entity.data.get("texture_side"));
    8 G" p0 n2 U; N7 ?6 w+ u6 V" x
  37.     if (file != state.tex){- j8 B& f# O6 `2 {3 x
  38.         state.tex=file;
    # g3 ~2 I6 Y+ ]! }
  39.         plModel.replaceAllTexture(Resources.id(state.tex));
    % Z/ s$ {6 D# z: y# r$ O
  40.         }6 v5 y. |, n% b8 u* b5 }, y; W
  41.     if (file_side != state.tex_side){
    ; \  K6 H8 U+ }# Z
  42.         state.tex_side=file_side;
    6 q5 {) s! G4 M, x
  43.         plsModel.replaceAllTexture(Resources.id(state.tex_side));1 i" V* k  F8 u, o- k: x* B, h. J
  44.         }
    5 G, N+ z$ j3 O; Q  x. z. U
  45. 0 v/ R. V! E% |7 H* R/ Y
  46.     //绘制模型
    : X$ i; U$ W. `2 ^
  47.     ctx.drawModel(plsModel, null);
    ! I- q, ?. }6 o  @
  48.     ctx.drawModel(plModel, null);
    / R! s9 C8 W7 `& H1 F: [
  49. }
    2 ^6 X0 c- O4 R5 c9 _6 N0 L# L
  50. //当模型离开渲染距离时,关闭它以释放内存6 o- I0 X; g: D+ @+ C+ [
  51. function dispose(ctx, state, entity){3 P- W9 {' u2 d( `
  52.     state.platform.close();9 r* u2 O8 e. y
  53.     state.platform_side.close();}1 E; h2 ^( G# @4 Z1 ], e

  54. $ `- p6 `5 _- Q" A3 y# m
  55. /*常用方块ID列表
    * c/ k. \" I* i4 W- M
  56. 默认顶部:mtrsteamloco:models/platform_45.png7 @# ?" ^1 J# t& ~, s! w% @
  57. 默认侧边:mtrsteamloco:models/platform_45_side.png
    ; w, I, i. U# `7 P2 Q! S4 u! S
  58. 石头:minecraft:textures/block/stone.png" K; ?8 b$ ]! D
  59. 木板:minecraft:textures/block/oak_planks.png
    4 }  j* h7 r' X. r8 g, k
  60. 黑曜石:minecraft:textures/block/obsidian.png
    , G' M& O" s$ v( ], t& [
  61. 玻璃:minecraft:textures/block/glass.png
    " V$ z/ e# q! o% w5 n- d
  62. */
    / J- c2 l: k4 G
复制代码

8 x; w) R( X5 e' X6 L* l3 z8 {, b5 A. G
放到游戏中大概是这个样子:
默认纹理下的站台
被修改成磨制花岗岩纹理的站台
可以通过修改装饰物件方块键值对来修改纹理。$ v" L( @8 \! {8 E% n+ H. U5 w

6 e( v" |0 q! U
+ z2 ^) u; @1 a' R+ h& G& ^% l# f目前该内容仍然在测试,感谢各位程序员们提出优化性能、功能方面的合理意见
7 T  Q8 g( h- A: @+ U- H6 {4 ?( v最后的最后 提前一个小时祝大家2025年新年快乐!( f8 ?" k" v' {  z& j& U

4 s6 m5 c8 e) Y+ D: E
2 U. P: {7 U- `2 ~6 U) U# T  P. Q; e" a' c$ ^

4 e. h* W" ~1 i1 ~; @
你是更怀念那几台机器,怀念那两个多月的时间,还是怀念当时与你一起合作的人?
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:264 a, m/ L, `! N6 t, t- n; b9 d
有点意思!
3 p" u/ ?- b4 L5 O6 K$ k6 `6 `
但是你那个当做站台好像即使√上了也没法使列车开门
# Q- ~9 \) z  i6 |* N
你是更怀念那几台机器,怀念那两个多月的时间,还是怀念当时与你一起合作的人?
Harlotte 作者认证 2025-1-2 06:32:17
Hobbytimeblank 发表于 2025-1-1 09:35
! X5 ]% F" x, G& E但是你那个当做站台好像即使√上了也没法使列车开门
  f7 \* ^; z: C/ n% \
?不应该啊 我这里测试好使着呢 嘶
有事加我QQ: 3435494979
楼主 Hobbytimeblank 作者认证 2025-1-2 19:25:08
Harlotte 发表于 2025-1-2 06:32
9 u# b% E0 }$ S, c?不应该啊 我这里测试好使着呢 嘶
# _, A& x( d$ S
当然我们建筑党有自己的解决方法:在装饰物件下面放一层原版站台
你是更怀念那几台机器,怀念那两个多月的时间,还是怀念当时与你一起合作的人?
Harlotte 作者认证 2025-1-3 21:40:20
Hobbytimeblank 发表于 2025-1-2 19:25, B8 a/ b9 R8 v) U
当然我们建筑党有自己的解决方法:在装饰物件下面放一层原版站台

2 p  L$ c# J6 ~  ^" Q3 r3 i是当时代码写错了 遍历错了 已经修好了
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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