本帖最后由 平凡的行者 于 2017-8-28 01:31 编辑
关于实体类型的返回值的意义可以参考这个页面:
1.7.10: http://www.kodevelopment.nl/cust ... onstant-values.html
1.10.2: http://www.kodevelopment.nl/cust ... onstant-values.html
里面也包含了其他常量的意义(例如每种职业的返回值)
另外关于你的第二个问题:你可以使用getMainhandItem()方法来取得玩家的主手道具(副手道具则是使用getOffhandItem())
因为1.9版以后增加了副手这个栏位给玩家以及其他生物,所以对手持道具的描述变为了主手或副手道具。这个方法是在IEntityLivingBase这个介面里的,而IPlayer这个介面继承了它。
x1006495528 发表于 2017-8-27 21:40
大佬请问 这个 玩家 type 值从哪里看的 玩家返回1 那么其他生物呢 查了下文档 硬是没找到 ...
关于实体类型的返回值的意义可以参考这个页面:
1.7.10: http://www.kodevelopment.nl/cust ... onstant-values.html
1.10.2: http://www.kodevelopment.nl/cust ... onstant-values.html
里面也包含了其他常量的意义(例如每种职业的返回值)
另外关于你的第二个问题:你可以使用getMainhandItem()方法来取得玩家的主手道具(副手道具则是使用getOffhandItem())
因为1.9版以后增加了副手这个栏位给玩家以及其他生物,所以对手持道具的描述变为了主手或副手道具。这个方法是在IEntityLivingBase这个介面里的,而IPlayer这个介面继承了它。
平凡的行者 发表于 2016-12-25 15:40
不如先给点想法如何?
看看有没有想要NPC做到的事?
然后我试试用脚本写出来? ...
您好大神。有件事想请教你。以前有想过做自动按照路径移动的马,然后玩家右键它就能骑上它。可是用只知道大概是用npc.setRider(player),具体怎么写不是很清楚,可以请帮帮忙吗?
本帖最后由 x1006495528 于 2017-8-28 20:01 编辑
感谢回答 在1.7.10 ScriptLivingBase 类中 并没有找到 getMainhandItem这个函数 只有
复制代码另外问下
我想让NPC 只使用一次这个技能 但是NPC每受到一次伤害 就运行这段代码 不能保存变量的数值 这有办法解决吗
平凡的行者 发表于 2017-8-28 01:29
关于实体类型的返回值的意义可以参考这个页面:
1.7.10: http://www.kodevelopment.nl/cust ... onstant ...
感谢回答 在1.7.10 ScriptLivingBase 类中 并没有找到 getMainhandItem这个函数 只有
swingHand()这个函数 |
- var num=0;
- var t = event.getSource();
- if(num == 0){
- if(t && t.getType() == 1){
- npc.executeCommand("/say §c技能1");
- }
- num+1;
- }
我想让NPC 只使用一次这个技能 但是NPC每受到一次伤害 就运行这段代码 不能保存变量的数值 这有办法解决吗
本帖最后由 平凡的行者 于 2017-8-29 03:19 编辑
1.7.10版的话,可以这样写:
Interact监控项内:
复制代码
然后按照路径走的话,使用路径魔杖设置路径就可以了
不过我不确定,如果骑乘的玩家断线的话,会不会连带马也一起消失...
fankieqiu 发表于 2017-8-28 10:57
您好大神。有件事想请教你。以前有想过做自动按照路径移动的马,然后玩家右键它就能骑上它。可是用只知道 ...
1.7.10版的话,可以这样写:
Interact监控项内:
- if(!npc.getRider()){
- npc.setRider(player);
- }
- else{
- player.sendMessage("这匹马已被骑乘")
- }
然后按照路径走的话,使用路径魔杖设置路径就可以了
不过我不确定,如果骑乘的玩家断线的话,会不会连带马也一起消失...
本帖最后由 平凡的行者 于 2017-8-29 03:21 编辑
1.7.10版的话,要使用getHeldItem()这个函数
另外,你想保存变量的话,可以给NPC纪录数据
有分两种:StoredData和TempData
StoredData储存的数据会以NBT标签的形式记录在NPC内。除非NPC被删除,透过脚本删除或是透过其他编辑方式删除该NBT标签,否则数据都会一直保存。
TempData的则是记录在服务器的内存。如果NPC被服务器卸载(例如玩家离开了NPC所在的区域,导致那个区块被从内存卸载后保存),那么纪录的TempData的就会消失。
依你的情况应该使用TempData储存就好了,所以你可以改成这样:
复制代码
x1006495528 发表于 2017-8-28 19:42
感谢回答 在1.7.10 ScriptLivingBase 类中 并没有找到 getMainhandItem这个函数 只有另外问下
我想让NPC ...
1.7.10版的话,要使用getHeldItem()这个函数
另外,你想保存变量的话,可以给NPC纪录数据
有分两种:StoredData和TempData
StoredData储存的数据会以NBT标签的形式记录在NPC内。除非NPC被删除,透过脚本删除或是透过其他编辑方式删除该NBT标签,否则数据都会一直保存。
TempData的则是记录在服务器的内存。如果NPC被服务器卸载(例如玩家离开了NPC所在的区域,导致那个区块被从内存卸载后保存),那么纪录的TempData的就会消失。
依你的情况应该使用TempData储存就好了,所以你可以改成这样:
- var t = event.getSource();
- if(npc.hasTempData("skillActivated")){
- if(t && t.getType() == 1){
- npc.executeCommand("/say §c技能1");
- }
- npc.setTempData("skillActivated",true);
- }
平凡的行者 发表于 2017-8-29 03:19
1.7.10版的话,要使用getHeldItem()这个函数
另外,你想保存变量的话,可以给NPC纪录数据
那NPC能否获取范围内所有的实体呢 例如 NPC受到伤害后 该技能不再只针对攻击者释放 而是规定范围内所有玩家
x1006495528 发表于 2017-8-29 16:37
那NPC能否获取范围内所有的实体呢 例如 NPC受到伤害后 该技能不再只针对攻击者释放 而是规定范围内所有玩 ...
可以。
你可以使用getSurroundingEntities函数
這個函數有兩個版本:
getSurroundingEntities(int range)
getSurroundingEntities(int range,int type)
前者会获取指定范围内的所有实体,包括掉落物或是箭什么的都会获取
后者可以指定只获取哪一类型的实体。
要使用哪种函数,取决于你传入几个变量来决定。
大佬 如果我想改变NPC远程攻击的弹射物
该怎么填
setProjectileItem(ScriptItemStack item)
z1643452507 发表于 2017-9-1 08:17
大佬 如果我想改变NPC远程攻击的弹射物
该怎么填
首先你要先产生出一个代表某个物品的ScriptItemStack物件
例如你想把弹射物换成石头,那么首先你可以这样写:
- var proj = world.createItem("minecraft:stone", 0, 1)
之后再用npc的setProjectileItem()方法设置弹射物就可以了
完整代码如下:
- var proj = world.createItem("minecraft:stone", 0, 1)
- npc.setProjectileItem(proj)
或是也可以这样写:
- npc.setProjectileItem(world.createItem("minecraft:stone", 0, 1))
平凡的行者 发表于 2017-9-1 13:01
首先你要先产生出一个代表某个物品的ScriptItemStack物件
例如你想把弹射物换成石头,那么首先你可以这样 ...
大佬66666
平凡的行者 发表于 2017-9-1 13:01
首先你要先产生出一个代表某个物品的ScriptItemStack物件
例如你想把弹射物换成石头,那么首先你可以这样 ...
请问下,怎么使NPC的tick冷却可以更长一点?默认是1秒,但是我想通过函数改为每10秒输出一次/say 233 这个指令,不知道行不行?[1.10.2]
平凡的行者 发表于 2017-9-1 13:01
首先你要先产生出一个代表某个物品的ScriptItemStack物件
例如你想把弹射物换成石头,那么首先你可以这样 ...
请问大佬,getAllServerPlayers()这个怎么用。
比如我想让某个单位被击杀后,全服玩家获得buff
流离人 发表于 2017-9-10 06:41
请问大佬,getAllServerPlayers()这个怎么用。
比如我想让某个单位被击杀后,全服玩家获得buff ...
这个不用这么麻烦吧...直接在NPC死亡那一栏接一个激活命令方块的指令
然后用命令方块@a所有玩家就行了
大佬,1.7.10脚本能改变NPC的模型吗,找不到API呀..
z1643452507 发表于 2017-9-13 00:07
这个不用这么麻烦吧...直接在NPC死亡那一栏接一个激活命令方块的指令
然后用命令方块@a所有玩家就行了 ...
服务器用不了@a。。。。
流离人 发表于 2017-9-13 20:10
服务器用不了@a。。。。
var a = world.getAllServerPlayers();
npc.executeCommand("/give a 258 1");
每执行一次,检测到的服务器玩家就会获得一个ID258的物品..
不过这条指令不知道支不支持多个玩家...
毕竟我的破服务器也只有我一个人在线,23333
不过感觉不大妥....你还是去问问大佬吧..
我也是跟行者大佬学的半桶水...
你还是问问行者大佬吧..

z1643452507 发表于 2017-9-13 20:30
var a = world.getAllServerPlayers();
npc.executeCommand("/give a 258 1");
每执行一次,检测到的服务 ...
这个说不定可以呢。我去试试。
我之前是
var a = world.getAllServerPlayers();
var b = a.getName();
npc.executeCommand("/effect b 1 100");
这么写的、然后不行。控制台也没报错,然后没有给上buff
ps:服务器输入effect @a 1 100 会显示不存在@a这个玩家。。
流离人 发表于 2017-9-13 20:46
这个说不定可以呢。我去试试。
我之前是
var a = world.getAllServerPlayers();

为什么还要var b = a.getName();再读一次...
而且..这两步好像有点奇怪...又不知道哪里奇怪

z1643452507 发表于 2017-9-13 20:50
var a = world.getAllServerPlayers();感觉这个已经读到玩家的名字了...
为什么还要var b = a.ge ...
假如你服务器有 ADC BBD两个玩家...你把他们的名字变量定义成a...下面这条岂不是...
var b = ADC,BBD.getName().....

z1643452507 发表于 2017-9-13 20:50
var a = world.getAllServerPlayers();感觉这个已经读到玩家的名字了...
为什么还要var b = a.ge ...
我之前用getSource()读取了来源之后,要用getName()再读名字。。然后我以为getAllServerPlayer()之后还要读次名字。。。主要是不太清楚getAllServerPlayer()到底咋用
z1643452507 发表于 2017-9-13 20:52
假如你服务器有 ADC BBD两个玩家...你把他们的名字变量定义成a...下面这条岂不是...
var b = ADC,BBD.ge ...
加个好友聊吧
请问一下如何让npc收到攻击时自动攻击最近的玩家(这样可以兼容一些mod武器攻击npc不会引发仇恨[典型:维克的现代战争]) 感谢
20010918aaa 发表于 2017-10-6 12:08
请问一下如何让npc收到攻击时自动攻击最近的玩家(这样可以兼容一些mod武器攻击npc不会引发仇恨[典型:维克 ...
攻击最近的玩家么
可以在damaged的事件调用getSurroundingEntities(int range, int type)
来寻找规定范围内的,然后遍历找到最近的,保存到全局变量里面(具体看前面平凡的行者的例子)
再到target事件setTarget()
range的范围就很麻烦了,太大卡服,太小检测不到
z1643452507 发表于 2017-9-13 00:08
大佬,1.7.10脚本能改变NPC的模型吗,找不到API呀..
可以杀死该npc,生成一个。达到改模型的办法。。。直接改模型没有这个api
流离人 发表于 2017-9-13 20:10
服务器用不了@a。。。。
应该是没有开启命令方块的原因吧。。。
20010918aaa 发表于 2017-10-6 12:08
请问一下如何让npc收到攻击时自动攻击最近的玩家(这样可以兼容一些mod武器攻击npc不会引发仇恨[典型:维克 ...
npc在收到攻击的时候 应该会攻击最近的玩家。。。可以在伤害脚本改变npc的阵营。。。改成敌对的阵营就会攻击了哦
@@Leo 发表于 2017-10-6 15:36
攻击最近的玩家么
可以在damaged的事件调用getSurroundingEntities(int range, int type)
来寻找规定范 ...
感谢,最近尽快尝试
@@Leo 发表于 2017-10-6 15:36
攻击最近的玩家么
可以在damaged的事件调用getSurroundingEntities(int range, int type)
来寻找规定范 ...


平凡的行者 发表于 2017-9-1 13:01
首先你要先产生出一个代表某个物品的ScriptItemStack物件
例如你想把弹射物换成石头,那么首先你可以这样 ...

试过很多代码。控制台都是输出
javax.script.ScriptException: php.java.bridge.http.FCGIConnectException: Could not connect to server
javax.script.ScriptException: php.java.bridge.http.FCGIConnectException: Could not connect to server
@TGL 发表于 2018-1-6 18:46
试过很多代码。控制台都是输出
javax.script.ScriptException: php.java.bridge.http.FCGIConnectExceptio ...
请问您是服务器?
服务器里面也安装了脚本么?
@@Leo 发表于 2018-1-6 18:56
请问您是服务器?
服务器里面也安装了脚本么?
不是服务器
怎么设置机率,例如NPC攻击玩家时 每次有百分之20机率触发一个指令


@TGL 发表于 2018-1-25 16:29
怎么设置机率,例如NPC攻击玩家时 每次有百分之20机率触发一个指令
不用脚本的话,不如直接用指令实现。
每次攻击玩家触发一个命令方块阵列,这个命令方块阵列有20%的机会触发你想要的那个指令,1.8及以上可以直接用@r,1.7.10及以下比较麻烦,可以用怪物掉落物的概率或者刷怪笼随机器
用脚本的话应该有比较方便的办法吧,但是就要学脚本了。。
Deing 发表于 2018-1-27 08:30
不用脚本的话,不如直接用指令实现。
每次攻击玩家触发一个命令方块阵列,这个命令方块阵列有20%的机会触 ...
用脚本怎么弄
还有个问题就是怎么刷新npc,或者让npc自杀也行
对于一个萌新来说真难啊
本帖最后由 fankieqiu 于 2018-1-30 15:08 编辑
请教一下大神们,我是1.7.10d版本,想做一个npc,对10范围内的玩家全体造成雷击伤害
我写的脚本是:
npc.getSurroundingEntities(10, 1);
var n = npc.getName();
npc.executeCommand("/lightning "+n);
没报错也没反应..
求大神指导!
还有如果想要加上额外伤害量的话,应该怎么加?
请教一下大神们,我是1.7.10d版本,想做一个npc,对10范围内的玩家全体造成雷击伤害
我写的脚本是:
npc.getSurroundingEntities(10, 1);
var n = npc.getName();
npc.executeCommand("/lightning "+n);
没报错也没反应..
求大神指导!
还有如果想要加上额外伤害量的话,应该怎么加?
本帖最后由 平凡的行者 于 2018-2-1 15:46 编辑
老实说,善用原版指令里的目标选择器写法就很容易做到了:
你只要这样写:
npc.executeCommand("/lightning @a[r=10]");
npc执行命令时的座标会设定成他自身的位置,所以可以直接取半径10以内的玩家来执行雷击命令
用其他写法也可以,只是就要再多几行,写起来不会比上面这条简单
而你原本的那个写法,n变数取得的名子是npc自身的名子
所以你的指令变成对npc名子的玩家执行雷击
fankieqiu 发表于 2018-1-30 12:09
请教一下大神们,我是1.7.10d版本,想做一个npc,对10范围内的玩家全体造成雷击伤害
我写的脚本是:
npc.get ...
老实说,善用原版指令里的目标选择器写法就很容易做到了:
你只要这样写:
npc.executeCommand("/lightning @a[r=10]");
npc执行命令时的座标会设定成他自身的位置,所以可以直接取半径10以内的玩家来执行雷击命令
用其他写法也可以,只是就要再多几行,写起来不会比上面这条简单
而你原本的那个写法,n变数取得的名子是npc自身的名子
所以你的指令变成对npc名子的玩家执行雷击
本帖最后由 平凡的行者 于 2018-2-1 15:54 编辑
你可以使用Math.random()来做为随机变数的来源
这个函数会传回一个介于0~1之间(包含0)的随机数。
例如你说的20%执行一个指令:
if(Math.random()*5 < 1){
npc.executeCommand("/.....");
}
如果要让npc自动刷新的话,可以执行npc.reset()
这个执行后,就会像你刚拿NPC魔杖编辑完NPC关闭介面的效果一样
但是最好不要在init监听项里执行...很可能会造成无限回圈而崩服的
@TGL 发表于 2018-1-25 16:29
怎么设置机率,例如NPC攻击玩家时 每次有百分之20机率触发一个指令
你可以使用Math.random()来做为随机变数的来源
这个函数会传回一个介于0~1之间(包含0)的随机数。
例如你说的20%执行一个指令:
if(Math.random()*5 < 1){
npc.executeCommand("/.....");
}
如果要让npc自动刷新的话,可以执行npc.reset()
这个执行后,就会像你刚拿NPC魔杖编辑完NPC关闭介面的效果一样
但是最好不要在init监听项里执行...很可能会造成无限回圈而崩服的
平凡的行者 发表于 2018-2-1 15:51
你可以使用Math.random()来做为随机变数的来源
这个函数会传回一个介于0~1之间(包含0)的随机数。
例如你说 ...
感谢大佬
平凡的行者 发表于 2018-2-1 15:44
老实说,善用原版指令里的目标选择器写法就很容易做到了:
你只要这样写:
npc.executeCommand("/lightnin ...
哦,明白了。我对surrounding的用法还不是很熟练。谢谢大神指导。
这两天我又遇到了两个难题,希望大神解答。
第一个就是我想设置每隔一段时间重复执行一段命令,譬如每隔10秒一次/say hi
可是我查了好久,也只查到个setTimeout是延时命令,而且nashon里还没有,要重新定义他。而hook里的更新是每秒一次的,所以请教下大神了。
第二就是有关坐标问题。我在做一个自动生成的时候遇到困难了。我想在npc所在的坐标偏移x+5的地方生成另一个npc。我先是用var x = npc.getX();var y = npc.getY();var z = npc.getZ();
然后无论是用npc.executeCommand("/noppes clone spawn 僵尸军团 1"+(x+5)+","+y+"",+z);
还是用npc.executeCommand("/noppes clone spawn 僵尸军团 1 ~+5,~,~);
还是用world.spawnClone(x+5,y,z,1,僵尸军团);
都没法召唤出偏移的位置,只能召唤在npc的所在坐标
还有关于刚刚打雷那个问题。如果是遇到个没打雷指令的呢?反正就是对范围里的所有检测到的player执行一段指令,而不用其他方法替代,有机会做到吗?
谢谢大神的指导,每次看你的回复都受益匪浅!
fankieqiu 发表于 2018-2-1 20:49
哦,明白了。我对surrounding的用法还不是很熟练。谢谢大神指导。
这两天我又遇到了两个难题,希望大神解 ...
update的脚本是每0.5秒(10tick)执行一次
所以关于每间格一定时间执行一次的命令,只要间格长度是0.5的整数倍的话,我会写在update里让他执行
通常这种脚本我会用world.getTotalTime()来参考,这个函数会回传当前这个世界已经过了多少tick的时间(用getTotalTime取得的话就不会受到doDaylightCycle设成false或是用指令任意更动时间的影响)
以你说的10秒为一次的执行,要简单来写的话我会这样写:
- if(world.getTotalTime()%200 < 10){
- //....
- }
对getTotalTime()取除以200的余数,若小于10则代表距离前一次执行已经过一次10秒周期
如果你这个命令对于第一次执行的时刻有一些要求的话,就要注意一下。
然后关于座标问题,我看你给的写法都是错的
第一条应该是npc.executeCommand("/noppes clone spawn 僵尸军团 1 "+(x + 5)+","+ y +","+ z);
你的1后面少了一个空格,而且z做标前的逗号跑出去了
第二条应该是npc.executeCommand("/noppes clone spawn 僵尸军团 1 ~5,~,~");
相对座标的写法中没有+号
第三条则是world.spawnClone(x+5,y,z,1,"僵尸军团");
最后一个应该放入复制名子的字串,如果没用双引号框起来的话不会被脚本认为是字串
最后关于打雷的问题,如果没有打雷指令的话,有一个函式可以用:
world.thunderStrike(double x, double y, double z);
这个会对该世界下的指定座标雷击,只是不能设定雷击伤害...
看来这个我也就只能边看边吃瓜
平凡的行者 发表于 2018-2-1 22:17
update的脚本是每0.5秒(10tick)执行一次
所以关于每间格一定时间执行一次的命令,只要间格长度是0.5的 ...
大神好强!我试过这个方法真的能行!谢谢了!顺便一提,在相对坐标,譬如setblock, ~5,~,~和~+5,~,~的效果是一样的,可以省略+号
平凡的行者 发表于 2018-2-1 22:17
update的脚本是每0.5秒(10tick)执行一次
所以关于每间格一定时间执行一次的命令,只要间格长度是0.5的 ...
大神您好。我又遇到新问题了。我还是1.7.10d,想做一个脚本,让一个npc检测一个坐标上有没有矿车,如果有矿车,就没反应。如果没有矿车,就放置一个矿车。请问应该如何操作?我试过用getblock,发现出错,估计矿车不属于block,可能是entity。可是又没有get指定坐标的entity的句柄。

本帖最后由 平凡的行者 于 2018-2-5 17:11 编辑
矿车是实体,所以你需要一个能取得实体的函数
有两种方法,第一种是让NPC自身执行getSurroundingEntities(),取得周围实体。取得实体的范围必须包含该矿车
然后逐个捡查取得的每个实体的座标,如果没有在该位置上的矿车就放置一台矿车。
不过这个方法很麻烦又费时,因为如果NPC周围有很多实体的话,检查程序会很久
更糟的情况,如果有很多台矿车,还要一个一个去算他们离该目标点是否够近
所以我查看了一下getSurroundingEntities是怎么写的,另外写了一个方法去判断:
//AxisAlignedBB.func_72330_a: 一个可以生成新的碰撞箱的静态方法
//func_72872_a: getEntitiesWithinAABB
//field_70121_D: boundingBox
function isMinecartExist(x,y,z){
var range = Java.type("net.minecraft.util.AxisAlignedBB").func_72330_a(x-1,y-0.5,z-1,x+1,y+1.5,z+1);
var minecartType = Java.type("net.minecraft.entity.item.EntityMinecartEmpty").class;
return !world.getMCWorld().func_72872_a(minecartType,range).isEmpty();
}npc.say(isMinecartExist(-412.5,3,615.5))
getSurroundingEntities是延展了NPC的碰撞箱去查看有哪些实体包含在碰撞箱内
所以我就仿照它的作法,给他一个特定位置的碰撞箱(长宽高皆为2),并检查是否有矿车(只包含可以乘坐的矿车)包含在碰撞箱内
fankieqiu 发表于 2018-2-5 13:33
大神您好。我又遇到新问题了。我还是1.7.10d,想做一个脚本,让一个npc检测一个坐标上有没有矿车,如果有 ...
矿车是实体,所以你需要一个能取得实体的函数
有两种方法,第一种是让NPC自身执行getSurroundingEntities(),取得周围实体。取得实体的范围必须包含该矿车
然后逐个捡查取得的每个实体的座标,如果没有在该位置上的矿车就放置一台矿车。
不过这个方法很麻烦又费时,因为如果NPC周围有很多实体的话,检查程序会很久
更糟的情况,如果有很多台矿车,还要一个一个去算他们离该目标点是否够近
所以我查看了一下getSurroundingEntities是怎么写的,另外写了一个方法去判断:
//AxisAlignedBB.func_72330_a: 一个可以生成新的碰撞箱的静态方法
//func_72872_a: getEntitiesWithinAABB
//field_70121_D: boundingBox
function isMinecartExist(x,y,z){
var range = Java.type("net.minecraft.util.AxisAlignedBB").func_72330_a(x-1,y-0.5,z-1,x+1,y+1.5,z+1);
var minecartType = Java.type("net.minecraft.entity.item.EntityMinecartEmpty").class;
return !world.getMCWorld().func_72872_a(minecartType,range).isEmpty();
}npc.say(isMinecartExist(-412.5,3,615.5))
getSurroundingEntities是延展了NPC的碰撞箱去查看有哪些实体包含在碰撞箱内
所以我就仿照它的作法,给他一个特定位置的碰撞箱(长宽高皆为2),并检查是否有矿车(只包含可以乘坐的矿车)包含在碰撞箱内
平凡的行者 发表于 2018-2-5 17:06
矿车是实体,所以你需要一个能取得实体的函数
有两种方法,第一种是让NPC自身执行getSurroundingEntities ...
简直神乎其技。已测试,绝对可行。膜拜大神啊,居然能从查回源码getSurroundingEntities的思路入手。不过这个太复杂了。如果不是您给我解释,我真的看不懂