JavaScript Mod:修订间差异

来自像素工厂维基百科-mindustry wiki
→‎new xxx/* functionName:​ ( →‎args:​ ) { →‎code:​ } */
 
(未显示2个用户的12个中间版本)
第3行: 第3行:


类似于[https://nodejs.cn/ node.js],它没有''<code>window</code>,<code>document</code>''等一系列变量
类似于[https://nodejs.cn/ node.js],它没有''<code>window</code>,<code>document</code>''等一系列变量
Rhino并没有完全支持es6的语法


[[https://www.runoob.com/js/js-tutorial.html 菜鸟教程]] | [[https://developer.mozilla.org/zh-CN/docs/Web/javascript MDN]]
[[https://www.runoob.com/js/js-tutorial.html 菜鸟教程]] | [[https://developer.mozilla.org/zh-CN/docs/Web/javascript MDN]]
第10行: 第12行:
一些常用的变量
一些常用的变量


* <code>scriptName</code>: 当前脚本的名称(这会随脚本的变化而变化,建议: <code>'''const''' { scriptName } = '''this''';</code>)
* <code>scriptName</code>: 当前脚本的名称(这会随脚本的变化而变化,建议: <code>'''const''' { scriptName } = '''this''';</code> )
* <code>modName</code>: 当前Mod的名称(这会随mod的变化而变化,建议: <code>'''const''' { modName } = '''this''';</code>)
* <code>modName</code>: 当前Mod的名称(这会随mod的变化而变化,建议: <code>'''const''' { modName } = '''this''';</code> )
* <code>print</code>: 打印日志
* <code>print</code>: 打印日志
* <code>extend</code>: '''js '<nowiki/>'''<code>extend(Base, ..., {})</code>'''<nowiki/>' = java '<nowiki/>'''<code>new Base(...) {}</code>'''<nowiki/>''''
* <code>extend</code>:  
 
=== 关于[https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment 解构赋值] ===
=== 关于[https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment 解构复制] ===
<code>'''cosnt''' { a, b } '''=''' { a: 1, b: 2 };</code>
<code>'''cosnt''' { a, b } '''=''' { a: 1, b: 2 };</code>


=== 特殊语法 ===
=== 特殊语法 ===


====== '''new''' xxx''/* functionName */'' ( ''/* args */'' ) { ''/* code */'' } ======
==== '''new''' F''/* functionName */'' ( ''/* args */'' ) { ''/* code */'' } ====
其实就是<code>xxx''/* functionName */'' '''(''' ''/* args */'' , { ''/* code */'' } ''')'''</code>
其实就是<code>F''/* functionName */'''''(''' ''/* args */'' , { ''/* code */'' } ''')'''</code>


在最后面传了一个对象
在最后面传了一个对象
第30行: 第31行:
  }
  }


===== Getter & Setter =====
==== Getter & Setter ====
你可以使用<code>xxx.class</code>等价于<code>xxx.getClass()</code>
'''Getter''': 你可以使用<code>xxx.class</code>等价于<code>xxx.getClass()</code>


* 注意:<code>Vars.class</code>获取到的是'''Class'''类,如果想要获取对应类对象 可以使用<code>Vars.__javaObject__</code>
* 注意:<code>Vars.class</code>获取到的是'''Class'''类(或者直接报错),如果想要获取对应类对象 可以使用<code>Vars.__javaObject__</code>
'''Setter''': 你可以使用<code>cell.element = xxx</code>,这等价于<code>cell.setElement(xxx)</code>


=== 一些小坑 ===
=== 一些小坑 ===
一个函数接受所有方法,例如:
 
====== 一个函数接受所有方法 ======
  extend(BulletType, {
  extend(BulletType, {
   hit(b, x, y) { print(b); }
   hit(b, x, y) { print(b); }
第43行: 第46行:


所以<code>x</code>,<code>y</code>可能为<code>undefined</code>
所以<code>x</code>,<code>y</code>可能为<code>undefined</code>
===== <code>for ... of ...</code> 不能迭代java的Iterable =====
可以使用下面的代码
定义函数
function *itep(map){
  let iterator = map.iterator()
  // 这里用try是因为hasNext在有的类中是字段
  try { while (true) yield iterator.next() }
  catch(e) {}
}
使用方法
let map = new IntMap()
map.put(11, 3931)
for (let entry of new iter(map)) { // new 不能省
  print(entry)
}
====== Protected方法获取 ======
<pre>
// $p 指 Packages
$p.rhino.NativeJavaObject(
  $p.rhino.ImporterTopLevel(Vars.mods.scripts.context), // 用于刷新缓存
  Core.assets, // 对象
  $p.arc.assets.AssetManager, // 类对象
  true // 是否包含protected
).addAsset // 获得protected
</pre>

2024年10月2日 (三) 18:21的最新版本

Mindustry的JS

Mindustry使用: Rhino

类似于node.js,它没有windowdocument等一系列变量

Rhino并没有完全支持es6的语法

[菜鸟教程] | [MDN]

Mindustry提供了一下全局变量:global.js

一些常用的变量

  • scriptName: 当前脚本的名称(这会随脚本的变化而变化,建议: const { scriptName } = this;
  • modName: 当前Mod的名称(这会随mod的变化而变化,建议: const { modName } = this;
  • print: 打印日志
  • extend:

关于解构赋值

cosnt { a, b } = { a: 1, b: 2 };

特殊语法

new F/* functionName */ ( /* args */ ) { /* code */ }

其实就是F/* functionName */( /* args */ , { /* code */ } )

在最后面传了一个对象

所以你可以:

new extend(Block, "a block") {
  setBars() { print(this.barMap) }
}

Getter & Setter

Getter: 你可以使用xxx.class等价于xxx.getClass()

  • 注意:Vars.class获取到的是Class类(或者直接报错),如果想要获取对应类对象 可以使用Vars.__javaObject__

Setter: 你可以使用cell.element = xxx,这等价于cell.setElement(xxx)

一些小坑

一个函数接受所有方法
extend(BulletType, {
  hit(b, x, y) { print(b); }
}

BulletType#hit(Bullet b)BulletType#hit(Bullet b, float x, float y)都会调用上面的hit方法,

所以xy可能为undefined

for ... of ... 不能迭代java的Iterable

可以使用下面的代码

定义函数

function *itep(map){
  let iterator = map.iterator()
  // 这里用try是因为hasNext在有的类中是字段
  try { while (true) yield iterator.next() }
  catch(e) {}
}

使用方法

let map = new IntMap()
map.put(11, 3931)
for (let entry of new iter(map)) { // new 不能省
  print(entry)
}
Protected方法获取
// $p 指 Packages
$p.rhino.NativeJavaObject(
  $p.rhino.ImporterTopLevel(Vars.mods.scripts.context), // 用于刷新缓存
  Core.assets, // 对象
  $p.arc.assets.AssetManager, // 类对象
  true // 是否包含protected
).addAsset // 获得protected