开启左侧

脚本也能这么写

[复制链接]
Harlotte 作者认证 2024-12-31 19:39:29

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

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

×

! o5 R9 W! G) _' i1 ^# p3 J2 D
2 y2 m" w$ u: n, {前情提要:此Mod 现名ANTE (Aphrodite's Nemo's Transit Expansion) 即由 我(Aphrodite) 进行后续更新的NTE 请勿与NTE混为一谈,切忌找zbx问关于ANTE的新特性。
0 a% Z- {8 e6 s6 s5 a0 |8 X7 o9 L5 B8 }% E
这两天为装饰物件添加了对右击响应的支持。
- x5 C0 ^( _: q+ r
* z6 e2 v7 I* Q0 ?7 i3 ^同时我改良了DrawCall系列的继承关系,为自定义DrawCall内容提供了支持。
3 J# U) H1 \- y5 d) [" O+ H& ]" l; r: V5 _' x
为了能不受限于在render函数中添加绘制调用,我为装饰物件和列车的上下文添加了drawCalls(Map<Object, DrawCall>),现在可以在任何时间任何线程添加、修改、删除绘制调用。/ E/ X5 M. V& l( m

9 ]( ~+ n( G2 P  B- {8 a# Y# x7 ]; B下面是一段示例代码,实现了在右击装饰物件时(不是用刷子)时在玩家头部生成一个始终面向摄像机并向上匀速运动的面的效果。
7 K; y9 J" ?. O8 h+ ^
  1. importPackage(java.nio);
    % y. N" v* G* i2 u* v6 o# ]
  2. * d  ^# i( Y7 i6 w+ J. R+ j
  3. let model = ModelManager.loadRawModel(Resources.manager(), Resources.idr("face.obj"), null);// 法线 -z$ r" z1 C  C. X' W2 b+ y: [
  4. model = ModelManager.uploadVertArrays(model);
    + c$ V6 q' C- h0 v8 t

  5. 0 v$ R+ P/ s: J( c$ b! K9 Z# W
  6. function create(ctx, state, entity) {
    % |$ e4 C+ {5 d6 D. x
  7.     state.num = 0;3 T" B: u2 @7 D0 @) h
  8. }
    5 {& U+ p) @# M" y+ p5 `8 K
  9. " N- ^# \) R; L, c. ~1 Z4 l
  10. function beClicked(ctx, state, entity, player) {// player: WapperedEntity 包装了 Entity(Player) 为js提供一些基本的方法和属性
    % N0 Y! [% b1 u; Q4 @
  11.     let p = player.getPosition();. Q# G+ S6 M! Y+ e2 |( L0 l; \' e
  12.     p.add(0, 1.5, 0);// 假定头在脚底往上1.5m
    $ q" ]- t3 c! ^1 w+ S
  13.     ctx.setDebugInfo("Clicked on ", "shift: " + player.isShiftKeyDown(), "look angle: " + player.getLookAngle(), "from: " + p,"time: " + Date.now(), p);$ a# ?8 X! J6 Z
  14.     let ti = Date.now();0 t; F& f. c5 Y6 }& Y+ q" c  D
  15.     // DrawCall为一个接口 仅有一个commit方法
    . @6 s8 f& r' F5 X7 e2 B! F
  16.     let call = new DrawCall({commit: (drawScheduler, basePose, worldPose, light) => {// 差不多是这样的 包含commit方法的对象 -> 转换为DrawCall对象
    7 }/ O7 O9 m0 m- n/ x: Q- U4 B
  17.         try {2 f1 R. G8 r7 ]1 V
  18.             let pose = worldPose.copy();: x( [: R1 x5 L
  19.             pose.translate(p);
    8 O4 W# T0 v' Q/ a% t. S) \  Y7 v
  20.             pose.translate(0, (Date.now() - ti) / 1000 * 0.4, 0);0 g, h! O( j9 z6 G8 k5 |
  21. # [5 b8 l2 a- b
  22.             let buf = FloatBuffer.allocate(16);
    / G6 _% G) X( a% n" E
  23.             pose.store(buf);
    + p' s' c$ w4 \# L( Y" F9 k0 f
  24.             
    - Y  u' J# p1 x( K; R  @
  25.             buf.put(0, 1);
    ' `' E) s: q6 P2 z$ |' u- _' ?
  26.             buf.put(1, 0);+ O# L# F1 L# S0 U# w# V- z) L5 S
  27.             buf.put(2, 0);
    ; M2 C# i9 d* {, U& B
  28.             buf.put(3, 0);- v$ y: }" `4 W7 |0 [( w

  29. ; |: V9 Q% i9 B* L5 m
  30.             buf.put(4, 0);
    2 z6 g  r+ I4 T8 g, H
  31.             buf.put(5, 1);
    * A- G1 @* C" Y" [
  32.             buf.put(6, 0);$ O% d% c, {. Q5 e! [/ H7 @# x
  33.             buf.put(7, 0);
    2 J+ m" T: \; E1 t& G
  34. 8 m- Z  @8 A4 c6 a' C) W5 B
  35.             buf.put(8, 0);
    + W7 K9 I  V0 u. P+ p  ~) }
  36.             buf.put(9, 0);
    9 a* ^% C* n& C  B- n
  37.             buf.put(10, 1);
    / X3 a# ]0 T2 y- W, B, k
  38.             buf.put(11, 0);
    5 D. X+ C: ~( @8 y

  39. ' G1 w, |( _$ r& n
  40.             pose.load(buf);// 清空旋转信息 始终面向摄像机
    1 A" q) A4 r! G9 i( p

  41. 0 }1 v% [9 i2 H2 u" T% H/ s
  42.             drawScheduler.enqueue(model, pose, light);8 y% K7 ]. O& m$ r7 Q. m
  43.         } catch (e) {
    2 L1 w, r# ?5 y& m& p
  44.             ctx.setDebugInfo("Error", e.toString());
    / v4 L3 L! X8 R0 P0 @
  45.         }) W. H: `2 u& \8 }! }
  46.     }});
    : [: l5 K9 p- n% Q8 G5 y
  47.     ctx.drawCalls.put(state.num, call);
    7 N4 [) N- Y1 k  U
  48.     // 亦可以直接使用 ctx.drawCalls.put(state.num, (drawScheduler, basePose, worldPose, light) => {...});
    6 ^2 e- H0 M3 J
  49.     // 即 function -> lambda表达式(java) -> DrawCall对象
    9 _8 q! ~4 I( v
  50.     state.num++;
    % J, g+ B8 Z: X
  51. }
复制代码
. w2 a  u6 Z- N" ^1 m3 v; [
1 O" Q* L# a0 p
请注意 beClicked 只会在当前客户端执行一次 若需要多端同步请将数据保存在 entity.data 中(* J5 ]6 O( i) \. I8 n6 e

2 `8 E% v3 X# T# R7 I# `
有事加我QQ: 3435494979
Hobbytimeblank 作者认证 2024-12-31 22:29:41
大佬!干得漂亮!新年快乐!
你是更怀念那几台机器,怀念那两个多月的时间,还是怀念当时与你一起合作的人?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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