开启左侧

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

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

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

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

×
本帖最后由 Hobbytimeblank 于 2025-1-18 18:08 编辑 % J  g- d; I2 \, w. j% @

4 C. e, O  q% O' p5 V& @, S
7 U3 W, e* H3 }由于ANTE1.0.0版本修改的内容过多,该代码只能在0.5.4版本生效,新版本请勿使用
* f7 V4 ^# r& w; i) S+ e
& k- `+ w1 k+ H! {+ {% K& u3 a% ]3 P' E& P# O7 V" z' p0 ^3 e% Y3 r6 B

: C% A( q% r9 e: K/ ~9 o我前几天基于@Harlotte的ANTE模组写了我此生第一份
成功的.js代码. P) a0 `0 e' {2 Q) ~2 b
实现的功能就是使用(A)NTE的装饰物件制作了可自定义材质的45度站台(其实其他的模型理论上也可以,是同一个原理)# P# o* I6 [) C; D
仅供参考!仅供参考!请勿直接完全照搬!
  S2 {- o3 h. Y
  1. //加载模型, b1 M5 [) D. r
  2. //这里我使用了两个模型,第一个负责上下表面,第二个模型负责侧面& x. B4 Q; S2 |! \2 p  I6 g9 Q
  3. let rawModel = ModelManager.loadRawModel(Resources.manager(), Resources.id("mtrsteamloco:models/platform_tall.obj"), null);
    : X8 U* J6 C$ J% ?# {( t$ T! ^
  4. let rawModel_side = ModelManager.loadRawModel(Resources.manager(), Resources.id("mtrsteamloco:models/platform_tall_side.obj"), null);& x3 @9 Y* h2 I7 u) s
  5. //翻转 V 坐标+ d$ ?9 h7 A# |9 p
  6. rawModel.applyUVMirror(false, true);
    0 F% v5 G2 P! G  e: Z- c
  7. rawModel_side.applyUVMirror(false, true);
    % D& h3 Q  r1 n' a
  8. 3 Z  e7 q5 r( M5 D8 @
  9. //设置初始纹理,其中tex是站台的底部和顶部。tex_side是站台的侧面(四面共用纹理)* R! v. u* T) N4 ]% W
  10. let tex = "mtrsteamloco:models/platform_45.png";6 `* }2 ^; w; i2 C, b
  11. let tex_side = "mtrsteamloco:models/platform_45_side.png";- D  v! h" M8 h: U
  12. function create(ctx, state, entity){
    : S2 U% i" J8 M9 J  q
  13.     state.platform_side = new DynamicModelHolder();- C6 E3 u6 `% B, D8 V5 P
  14.     state.platform_side.uploadLater(rawModel_side);
      y% z; ]# ?/ X  E7 L4 R
  15.     state.platform = new DynamicModelHolder();3 T8 \7 y/ T: f3 k& ]
  16.     state.platform.uploadLater(rawModel);$ e: B% y: s( a4 ?: z
  17. . N: l( a4 g* p
  18.     //如果这个装饰物件是刚刚被放出来的,那么将其初始化,为其放入默认的方块数据. T0 A/ M4 c3 V; k
  19.     if(entity.data.get("texture")==null && entity.data.get("texture_side")==null){
    * }- T* _$ a1 j+ T  u# T
  20.     state.tex=tex;
    2 P/ S: {5 s: \" U2 B) E
  21.     state.tex_side=tex_side;
    % ~0 p0 M# \4 f
  22.     entity.data.put("texture", tex);& U  K, T3 H& [
  23.     entity.data.put("texture_side", tex_side);+ y9 a2 g8 K2 T2 L7 P
  24.     }4 D9 t- x, ]# t7 r' h, w2 N; O
  25. }
    ( x! X( J$ p. u* `/ y
  26. function render(ctx, state, entity){: F5 A0 Y! ]3 l
  27.     //获得DynamicModelHolder中的模型: ^% T: C. \8 x" g
  28.     if(state.platform_side.getUploadedModel()!= null){5 G7 z  b# Y6 m& C, w! a. U& ^
  29.     plsModel = state.platform_side.getUploadedModel();}- s+ g+ F) v9 f( \/ m
  30.     if(state.platform.getUploadedModel()!= null){" p. P# ?% l- A1 G7 N
  31.     plModel = state.platform.getUploadedModel();}5 C8 z% z& S  h  I& y* X, r

  32. ; J% v8 E9 g$ x  g6 J
  33.     //检测方块数据是否发生改变,如果改变则修改方块的纹理( d, u4 E" K) m9 E* a& t- `: g9 Q  w
  34.     //要求用户自行填写资源位置,这也意味着你可以加载任何位置包括原版、资源包、模组内的任何图片作为站台的纹理
    + p$ D5 Z; G2 q, B: z
  35.     file = String(entity.data.get("texture"));$ E& s) q5 \2 l- ^1 _9 {! j$ r6 P
  36.     file_side = String(entity.data.get("texture_side"));8 Z' A& ?1 p" |' D$ g( L+ r1 v
  37.     if (file != state.tex){/ w& G- d; g4 }
  38.         state.tex=file;* g' `+ @/ n; j& B3 D% h. G5 |
  39.         plModel.replaceAllTexture(Resources.id(state.tex));  M  W5 G& F. G
  40.         }
    & P$ n0 l. o! s
  41.     if (file_side != state.tex_side){
    ! K: m5 S( _2 G9 M( Q; ^: D4 G
  42.         state.tex_side=file_side;+ ?4 o0 P0 j+ L9 i
  43.         plsModel.replaceAllTexture(Resources.id(state.tex_side));
    ; K& V# M( g- A. G4 u# C8 ~5 p; l
  44.         }$ W: |/ @& X  Y4 g3 b7 U! }

  45. # D! M* O# y7 {" r& X
  46.     //绘制模型
    ( ?" A* _2 W) f: S4 ]; [% H
  47.     ctx.drawModel(plsModel, null);# k2 c, ]. y, [6 p! t
  48.     ctx.drawModel(plModel, null);; O, x# o) d6 O9 T+ _& f
  49. }1 N: ~) p0 ~+ H7 ]0 X; \. T# J
  50. //当模型离开渲染距离时,关闭它以释放内存' u( Y1 w6 Y5 g: Z& v1 E5 f
  51. function dispose(ctx, state, entity){5 B2 K$ C7 c  `6 Q. W) s+ S; b
  52.     state.platform.close();5 ~' E) A, ]4 W  P+ g! l
  53.     state.platform_side.close();}9 {/ I6 i( l/ z1 S

  54. $ X6 b7 j* g( U$ Q9 {" }
  55. /*常用方块ID列表3 G5 _1 q8 H! `- T) A
  56. 默认顶部:mtrsteamloco:models/platform_45.png
    5 M  t! z3 L) `9 s2 M5 b
  57. 默认侧边:mtrsteamloco:models/platform_45_side.png, H7 G$ [( S# U) Y6 j" U
  58. 石头:minecraft:textures/block/stone.png
    ( r5 S  m/ f" q, _& K0 ]8 _! w
  59. 木板:minecraft:textures/block/oak_planks.png. k( n2 B7 M! \+ ^$ x/ G$ v
  60. 黑曜石:minecraft:textures/block/obsidian.png
    + r8 {5 h( z$ y4 Z
  61. 玻璃:minecraft:textures/block/glass.png; l' C, W6 E- x) L, c
  62. */
    ; D8 n/ f/ g+ o) ]/ }! _  _1 j
复制代码

* U6 B. `/ }9 b8 L2 ]9 C$ q& ^6 R" A: G) u
放到游戏中大概是这个样子:
默认纹理下的站台
被修改成磨制花岗岩纹理的站台
可以通过修改装饰物件方块键值对来修改纹理。/ P! u7 C. a3 `' l* s
% O5 n5 A0 _* ]; [
2 T7 Q  @2 j  T
目前该内容仍然在测试,感谢各位程序员们提出优化性能、功能方面的合理意见" i) Z+ f3 U8 c2 S
最后的最后 提前一个小时祝大家2025年新年快乐!/ j% b5 `: I: t$ u1 `

2 }" B3 c; K! i. H( w+ C6 o! r2 Y. E

& w2 K0 \! i. e+ N* a  B0 |7 I! M" M' `
# T2 V# n7 F: y+ 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$ q$ k! ?3 ]0 y
有点意思!
+ z7 A% P. o& J3 Q4 I4 O  z% r8 k1 d1 S
但是你那个当做站台好像即使√上了也没法使列车开门
% X; S9 r$ ^3 E* d! U0 u
你是更怀念那几台机器,怀念那两个多月的时间,还是怀念当时与你一起合作的人?
Harlotte 作者认证 2025-1-2 06:32:17
Hobbytimeblank 发表于 2025-1-1 09:35
1 |$ Y1 a$ ~& h但是你那个当做站台好像即使√上了也没法使列车开门

* D, ]0 w3 @! f( q4 G1 g) Z* b?不应该啊 我这里测试好使着呢 嘶
有事加我QQ: 3435494979
楼主 Hobbytimeblank 作者认证 2025-1-2 19:25:08
Harlotte 发表于 2025-1-2 06:32
6 U1 `+ h9 @; X( D5 L! U$ M?不应该啊 我这里测试好使着呢 嘶
3 z) A2 z) z$ _0 |: X/ C' q
当然我们建筑党有自己的解决方法:在装饰物件下面放一层原版站台
你是更怀念那几台机器,怀念那两个多月的时间,还是怀念当时与你一起合作的人?
Harlotte 作者认证 2025-1-3 21:40:20
Hobbytimeblank 发表于 2025-1-2 19:253 }3 j! C$ X: M0 l0 S; G
当然我们建筑党有自己的解决方法:在装饰物件下面放一层原版站台

/ W9 T3 q- {' ^! _8 ^  Y/ P8 F是当时代码写错了 遍历错了 已经修好了
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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