脚本也能这么写
前情提要:此Mod 现名ANTE (Aphrodite's Nemo's Transit Expansion) 即由 我(Aphrodite) 进行后续更新的NTE 请勿与NTE混为一谈,切忌找zbx问关于ANTE的新特性。
这两天为装饰物件添加了对右击响应的支持。
同时我改良了DrawCall系列的继承关系,为自定义DrawCall内容提供了支持。
为了能不受限于在render函数中添加绘制调用,我为装饰物件和列车的上下文添加了drawCalls(Map<Object, DrawCall>),现在可以在任何时间任何线程添加、修改、删除绘制调用。
下面是一段示例代码,实现了在右击装饰物件时(不是用刷子)时在玩家头部生成一个始终面向摄像机并向上匀速运动的面的效果。
importPackage(java.nio);
let model = ModelManager.loadRawModel(Resources.manager(), Resources.idr("face.obj"), null);// 法线 -z
model = ModelManager.uploadVertArrays(model);
function create(ctx, state, entity) {
state.num = 0;
}
function beClicked(ctx, state, entity, player) {// player: WapperedEntity 包装了 Entity(Player) 为js提供一些基本的方法和属性
let p = player.getPosition();
p.add(0, 1.5, 0);// 假定头在脚底往上1.5m
ctx.setDebugInfo("Clicked on ", "shift: " + player.isShiftKeyDown(), "look angle: " + player.getLookAngle(), "from: " + p,"time: " + Date.now(), p);
let ti = Date.now();
// DrawCall为一个接口 仅有一个commit方法
let call = new DrawCall({commit: (drawScheduler, basePose, worldPose, light) => {// 差不多是这样的 包含commit方法的对象 -> 转换为DrawCall对象
try {
let pose = worldPose.copy();
pose.translate(p);
pose.translate(0, (Date.now() - ti) / 1000 * 0.4, 0);
let buf = FloatBuffer.allocate(16);
pose.store(buf);
buf.put(0, 1);
buf.put(1, 0);
buf.put(2, 0);
buf.put(3, 0);
buf.put(4, 0);
buf.put(5, 1);
buf.put(6, 0);
buf.put(7, 0);
buf.put(8, 0);
buf.put(9, 0);
buf.put(10, 1);
buf.put(11, 0);
pose.load(buf);// 清空旋转信息 始终面向摄像机
drawScheduler.enqueue(model, pose, light);
} catch (e) {
ctx.setDebugInfo("Error", e.toString());
}
}});
ctx.drawCalls.put(state.num, call);
// 亦可以直接使用 ctx.drawCalls.put(state.num, (drawScheduler, basePose, worldPose, light) => {...});
// 即 function -> lambda表达式(java) -> DrawCall对象
state.num++;
}
请注意 beClicked 只会在当前客户端执行一次 若需要多端同步请将数据保存在 entity.data 中(
大佬!干得漂亮!新年快乐!
页:
[1]