Minecraft(我的世界)中文论坛

标题: [Custom Npcs]自定义人物mod教程贴 -- 脚本和命令

作者: @@Leo    时间: 2016-12-24 15:09
标题: [Custom Npcs]自定义人物mod教程贴 -- 脚本和命令
本帖最后由 @@Leo 于 2018-8-25 21:33 编辑

Custom Npcs 教程

命令与脚本
哈哈,各位伙伴大家好,我Leo回来啦!
到了最蛋疼的命令与脚本部分我就不知道拖了多久了(众人:半年了才**回来)
声明一下:好多好多来自z25096708


指令
为了避免指令冲突, 全部指令都以/noppes开头. 对于大多数的自动完成的东西, 你可以轻松地使用TAB键完成.命令参数中, <>为必填项, []则为可选项. 命令默认不加/




脚本
这个是最难啃的一块,没有编程基础的勿入


没啦没啦没啦
我的脚本代码也都是半会不会呢~~~
希望有大神来帮帮我。
某大佬的教程贴
假如你们有问题不会的可以来问我,让我积累一点exp
当然假如你很急的话,去问平凡的行者吧~


外国人视频:https://www.youtube.com/user/MrToady2000/videos
外国人聊天频道:https://discord.gg/0qZ6X3cHl8Pupttr

END

引索:


作者: @@Leo    时间: 2016-12-24 15:35
二楼备用
@z25096708

作者: Yihc    时间: 2016-12-24 16:07
先前排,赞个楼主,我一直想知道脚本怎么搞
作者: 117779284    时间: 2016-12-24 16:10
然而来几个实例 这帖子就火了·
作者: Zombie_Zombie    时间: 2016-12-24 16:12
谢谢了,
作者: @@Leo    时间: 2016-12-24 17:04
Yihc 发表于 2016-12-24 16:07
先前排,赞个楼主,我一直想知道脚本怎么搞

老版主大人好
话说一开始我只是不知道脚本输入哪里而已
不过那个加载脚本具体怎么用我还是不会QAQ
作者: 。—。    时间: 2016-12-25 01:46
所以楼主酷爱回来把帖子里那些不明的div align span啥啥的编辑掉!
作者: 平凡的行者    时间: 2016-12-25 02:54
话说关于Player的监听是不是还没办法用..?
自己有查过,关于用在Player的监听,要写在拿脚本魔杖对空右键后出来的介面内

但是随便写了一些代码进去后发现什么都没发生...就算是用了目前1.11beta版的也是无效....

这让我很困扰阿...这样主动监控玩家的行为就做不到了....
而且余下可用的监听函数内貌似没有可调用到计分板的物件....真不方便
作者: 平凡的行者    时间: 2016-12-25 15:40
117779284 发表于 2016-12-24 16:10
然而来几个实例 这帖子就火了·

不如先给点想法如何?
看看有没有想要NPC做到的事?
然后我试试用脚本写出来?
作者: 117779284    时间: 2016-12-26 01:15
平凡的行者 发表于 2016-12-25 15:40
不如先给点想法如何?
看看有没有想要NPC做到的事?
然后我试试用脚本写出来? ...

一个简单的实例。
监听NPC死亡。发出一段自定义指令
监听NPC重生,发出一段自定义
作者: 平凡的行者    时间: 2016-12-26 03:06
117779284 发表于 2016-12-26 01:15
一个简单的实例。
监听NPC死亡。发出一段自定义指令
监听NPC重生,发出一段自定义 ...

1.10.2版:

将图中的/say换成其他指令即可
想要执行多条指令就放多条event.npc.executeCommand()

1.7.10版:


同上

由于测试时发现npc重生时,初始化的区块会执行两次
所以将Init区的脚本设定给死亡后重生专用,使用了暂存数据做判断。
只有当某个暂存数据存在时才执行中间的代码,而这个数据则意味着NPC不久前有死亡过
不过要注意的是:当NPC从服务器的记忆体中卸载时,暂存数据就会消失。想要永久保存某个数据的话就使用StoredData




作者: 117779284    时间: 2016-12-26 05:55
平凡的行者 发表于 2016-12-26 03:06
1.10.2版:

将图中的/say换成其他指令即可

呃·被击杀执行指令 这个貌似不行啊。
没有任何提示和响应·
npc.executeCommand("/say 1");
npc.setTempDate("killed".true);
作者: 平凡的行者    时间: 2016-12-26 17:19
本帖最后由 平凡的行者 于 2016-12-26 17:35 编辑
117779284 发表于 2016-12-26 05:55
呃·被击杀执行指令 这个貌似不行啊。
没有任何提示和响应·
npc.executeCommand("/say 1");

忘了说,NPC默认是禁用脚本的
需要允许NPC使用脚本,写下的脚本才会被执行,如图:


Enabled要设置为Yes,脚本才会启动
另外我示范的代码是javascript(ECMAScript),语言设置(Language)要调到ECMAScript才会执行成功
如果Language那边没东西,照楼主说的把档案丢到mods里即可

另外你的语法第二行打错了,不是Date而是Data,点号换成逗号:
应该是npc.setTempData("killed",true);

作者: Yihc    时间: 2016-12-31 11:02
@@Leo 发表于 2016-12-24 17:04
老版主大人好
话说一开始我只是不知道脚本输入哪里而已
不过那个加载脚本具体怎么用我还是不会QAQ ...

哈哈,没关系 加油~~
作者: @@Leo    时间: 2017-1-1 12:29
平凡的行者 发表于 2016-12-26 17:19
忘了说,NPC默认是禁用脚本的
需要允许NPC使用脚本,写下的脚本才会被执行,如图:

请问我可以 把内容贴上去呢?还是把这层的链接贴上去呢?
作者: 平凡的行者    时间: 2017-1-1 14:25
@@Leo 发表于 2017-1-1 12:29
请问我可以 把内容贴上去呢?还是把这层的链接贴上去呢?

都可以,看你怎么做比较方便
作者: 优妹酱    时间: 2017-1-3 02:47
可以设置某个NPC死亡或者重生时全服公告吗
作者: 15940478485    时间: 2017-1-3 09:18
优妹酱 发表于 2017-1-3 02:47
可以设置某个NPC死亡或者重生时全服公告吗

加个QQ好友呗
作者: 平凡的行者    时间: 2017-1-3 11:01
优妹酱 发表于 2017-1-3 02:47
可以设置某个NPC死亡或者重生时全服公告吗

可以
如果要以命令做全服公告的话,可以使用/say命令
这样的话你要求的效果就可以用11楼的做法,监听死亡或重生时发出一段命令

作者: 1579546165    时间: 2017-1-16 13:57
提示: 作者被禁止或删除 内容自动屏蔽
作者: Yihc    时间: 2017-2-8 12:54
平凡的行者 发表于 2017-1-1 14:25
都可以,看你怎么做比较方便

请问一下怎么让NPC一创建就朝指定坐标走去?
作者: 平凡的行者    时间: 2017-2-8 14:28
Yihc 发表于 2017-2-8 12:54
请问一下怎么让NPC一创建就朝指定坐标走去?

额...有点不明白为何要这样做
一开始直接把NPC创建在指定座标就好了阿?..
作者: Yihc    时间: 2017-2-8 14:42
平凡的行者 发表于 2017-2-8 14:28
额...有点不明白为何要这样做
一开始直接把NPC创建在指定座标就好了阿?..

其实我是想让他们进攻某个地方,死了以后复活然后再进攻,但是如果用路径设置的话太多NPC了。。哈哈
作者: TeLunsu936    时间: 2017-2-8 14:59
本帖最后由 TeLunsu936 于 2017-2-8 15:15 编辑

有了这个插件就不用那个3d立体投影了 2333

2次编辑 :

这是mod?!!??

作者: 平凡的行者    时间: 2017-2-8 15:13
本帖最后由 平凡的行者 于 2017-2-8 15:37 编辑
Yihc 发表于 2017-2-8 14:42
其实我是想让他们进攻某个地方,死了以后复活然后再进攻,但是如果用路径设置的话太多NPC了。。哈哈 ...

给NPC调用navigateTo()方法,可以令NPC朝某个座标点走去
这可以让NPC自动搜索路径后走过去:

npc.navigateTo(x座标,y座标,z座标,移动速度);//将NPC以指定速度导引到指定座标
移动速度默认是0.7,你可以设置任何你想要的数字

不过实际使用上,为了确保导引有效,我是建议将这个写在Update的监听项内

另外,你NPC的进攻路线如果有多条的话,可以设置几个不同的中途点让NPC走
一方面可以让不同NPC走不同的路线,增加防守的难度
一方面也避免NPC不按照你预期的路线进攻
或是用另一个方法:给NPC设置攻击目标:npc.setAttackTarget()
这样NPC也会自己跑过去攻击目标

不过不管用哪个方法都要注意:一旦NPC开始攻击其他目标的话,导引就会失效(例如受到攻击而反击)
所以你如果要求NPC一边移动一边攻击,代码就要写多一点




作者: Yihc    时间: 2017-2-8 18:11
平凡的行者 发表于 2017-2-8 15:13
给NPC调用navigateTo()方法,可以令NPC朝某个座标点走去
这可以让NPC自动搜索路径后走过去:

我试过navigateTo()但不知道为什么他不动。。好尴尬,我再试试看,谢谢你!
作者: chcbclv    时间: 2017-2-9 18:15
好奇
作者: Heer_Kaisair    时间: 2017-2-10 11:16
嗯。。希望可以脚本再讲多一点儿
api里面还有跟npc本身无关的希望也能讲讲
作者: @@Leo    时间: 2017-2-10 11:24
小黑的手臂 发表于 2017-2-10 11:16
嗯。。希望可以脚本再讲多一点儿
api里面还有跟npc本身无关的希望也能讲讲 ...

这个是话,只要围观楼上大神:平凡的行者 就可以了
作者: a1016746326    时间: 2017-2-13 10:16
本帖最后由 a1016746326 于 2017-2-13 10:23 编辑
平凡的行者 发表于 2016-12-26 03:06
1.10.2版:

将图中的/say换成其他指令即可

大大你好,我现在已经知道如何让npc在死亡时执行一段指令了,但是不知道如何给指令设置对象。
比如1.7.10服务器里面,/lightning xxx ,可以雷击叫做xxx的玩家,
我现在想让npc死亡的时候雷击一下击杀者,并全服通告,脚本是
npc.excuteCommand("/lightning xxx");
npc.excuteCommand("/say xxx击杀了NPC,被NPC临死之前雷击报复");
但是我并不知道,xxx在脚本中该如何表示。
另外想问一下,脚本方块执行的指令是命令方块的指令,还是服务器后台的指令呢。
作者: 平凡的行者    时间: 2017-2-13 20:53
本帖最后由 平凡的行者 于 2017-2-13 20:56 编辑
a1016746326 发表于 2017-2-13 10:16
大大你好,我现在已经知道如何让npc在死亡时执行一段指令了,但是不知道如何给指令设置对象。
比如1.7.10 ...
先放上与实作功能有相关API:
http://www.kodevelopment.nl/cust ... iptEventKilled.html
http://www.kodevelopment.nl/cust ... riptLivingBase.html
http://www.kodevelopment.nl/cust ... d/ScriptPlayer.html

在Killed监听项中,可以使用event变数取得NPC被杀死时的事件信息
对这个变数调用getSource()方法后,即可取得杀死这个NPC的生物的信息(如果NPC是死于凋零或火烧之类,而不是被生物杀死的,那么这个方法会传回null)

如果NPC死时的雷击只希望针对玩家反击的话,那么需要写个条件来确认getSource()传回的物件是不是null,以及是不是代表玩家
可以对getSource()传回的物件调用getType()来确定是不是玩家(是的话会传回1)

确定了后可以调用getName()来取得玩家的名子,并将这个名子和命令片段合并成完整的命令后执行,如下:



/lightning命令应该是ess插件提供的吧?...为了测试,我在这边就替换成world.thunderStrike()来制造雷击。
实际执行时可以把该行换成npc.executeCommand("/lightning "+pName);


另外你说的脚本方块如果是指这个:(1.7.10里并没有,我拿1.10.2的图)



这个是NPCmod里新增,可用脚本语言编写脚本的脚本方块
用法类似给NPC编写脚本。


如果是另一个mod的东西的话...恩那个mod我没碰过,不过照版上帖子说明,估计是执行命令方块的命令吧。

作者: a1016746326    时间: 2017-2-14 20:30
平凡的行者 发表于 2017-2-13 20:53
先放上与实作功能有相关API:
http://www.kodevelopment.nl/customnpcs/api/1.7.10/noppes/npcs/scripted/S ...

好的,懂了。十分感谢。
作者: 20010918aaa    时间: 2017-3-7 20:34
非常感谢楼主,命令也是找了很久的
(至少解决了很多问题)
作者: 84791177qq    时间: 2017-3-12 22:15
平凡的行者 发表于 2017-2-13 20:53
先放上与实作功能有相关API:
http://www.kodevelopment.nl/customnpcs/api/1.7.10/noppes/npcs/scripted/S ...

怎么设置全世界的玩家在线每1分钟就加一块钱
世界在指定过多少时间执行一段指令
作者: 平凡的行者    时间: 2017-3-13 20:29
84791177qq 发表于 2017-3-12 22:15
怎么设置全世界的玩家在线每1分钟就加一块钱
世界在指定过多少时间执行一段指令 ...

恩...是用哪款金钱插件的?

原则上插件应该都会提供更动玩家金钱的命令吧?
这样只要设置一个计时器(可以用漏斗做)
每1分钟发出一次信号给命令方块就行了吧?...应该不需要用到脚本?

只是要确保服务器开启时,计时器能自动正常运作
所以要把计时器放在地图的重生点附近,保持让它在出生点区块内就可以持续运作
作者: 84791177qq    时间: 2017-3-17 16:58
平凡的行者 发表于 2017-3-13 20:29
恩...是用哪款金钱插件的?

原则上插件应该都会提供更动玩家金钱的命令吧?

money
命令方块怎么执行?
作者: 4333    时间: 2017-3-17 20:33
脚本完全看不懂
作者: 平凡的行者    时间: 2017-3-18 15:58
84791177qq 发表于 2017-3-17 16:58
money
命令方块怎么执行?

如果是ESS自带的金钱功能的话
使用/eco give @a [金额] 就可以给全部玩家指定金额了

不过我有点忘记用@a给出的对象有没有包含其他世界的玩家...这部分要去测试一下
作者: 84791177qq    时间: 2017-3-25 12:11
平凡的行者 发表于 2017-3-18 15:58
如果是ESS自带的金钱功能的话
使用/eco give @a [金额] 就可以给全部玩家指定金额了

可不可以创造个NPC打死他后,某区域的方块消失,然后过多少秒后又放方块
作者: 平凡的行者    时间: 2017-3-27 20:10
84791177qq 发表于 2017-3-25 12:11
可不可以创造个NPC打死他后,某区域的方块消失,然后过多少秒后又放方块 ...

方块消失一段时间后再放方块可以用/fill和/clone命令,配合命令方块和红石做到

至于触发命令方块的方法,可以让NPC死亡时在指定位置放下红石砖触发。这个只要用脚本写一行命令就可以了。
作者: 84791177qq    时间: 2017-3-28 22:03
平凡的行者 发表于 2017-3-27 20:10
方块消失一段时间后再放方块可以用/fill和/clone命令,配合命令方块和红石做到

至于触发命令方块的方法 ...

1.7.10版本没有这些指令
作者: 平凡的行者    时间: 2017-3-31 23:42
84791177qq 发表于 2017-3-28 22:03
1.7.10版本没有这些指令

如果是开服务器的话,试试看用命令方块执行WorldEdit的指令来移动方块

不过WorldEdit的命令不能直接交给命令方块执行
我之前开服时的做法是使用CBWrapper插件让命令方块执行WorldEdit的命令
https://dev.bukkit.org/projects/cbwrapper

试试看用这个做出命令方块阵列后再让npc使用脚本触发。

作者: 84791177qq    时间: 2017-4-1 17:35
平凡的行者 发表于 2017-3-31 23:42
如果是开服务器的话,试试看用命令方块执行WorldEdit的指令来移动方块

不过WorldEdit的命令不能直接交给 ...

额说了,不是1.8的= =
作者: 平凡的行者    时间: 2017-4-1 18:03
本帖最后由 平凡的行者 于 2017-4-1 18:08 编辑
84791177qq 发表于 2017-4-1 17:35
额说了,不是1.8的= =

CBWrapper的插件可以在1.7.10下的服务器用吧
WorldEdit插件也可以在1.7.10用吧?
不用插件帮忙的话就剩下写个回圏来一个一个复制方块这个方法了..

作者: 84791177qq    时间: 2017-4-2 21:14
平凡的行者 发表于 2017-4-1 18:03
CBWrapper的插件可以在1.7.10下的服务器用吧
WorldEdit插件也可以在1.7.10用吧?
不用插件帮忙的话就剩下写 ...

直接这样吧就是打死一个npc放置一个方块延迟几秒有删除那个方块
作者: 优妹酱    时间: 2017-4-4 15:24
可以做全服公告某个人爆了什么极品装备嘛
作者: 平凡的行者    时间: 2017-4-4 23:31
本帖最后由 平凡的行者 于 2017-4-4 23:49 编辑
84791177qq 发表于 2017-4-2 21:14
直接这样吧就是打死一个npc放置一个方块延迟几秒有删除那个方块



如图
把方块放置、延迟、移除全交给命令方块执行(图中是延迟2秒)
只是更动一个方块的话可以用setblock命令
如果要更动的方块不是很多的话也可以用多次setblock命令达到
NPC要做的唯一一件事就是在死亡时触发这个机关(NPC死亡时会在火把的位置放下红石块来触发机关)


另外楼上的问题
具体一点是如何呢?玩家捡起某个物品时广播吗?


作者: apple5740    时间: 2017-4-12 15:19
优妹酱 发表于 2017-1-3 02:47
可以设置某个NPC死亡或者重生时全服公告吗

在kill的钩子里写。npc.executeCommand("/say @p 杀了我");  就可以了
作者: apple5740    时间: 2017-4-12 15:33
本帖最后由 apple5740 于 2017-4-16 21:14 编辑
a1016746326 发表于 2017-2-13 10:16
大大你好,我现在已经知道如何让npc在死亡时执行一段指令了,但是不知道如何给指令设置对象。
比如1.7.10 ...

这样表示哦、event.getSource().getName() 关于脚本 有什么不会的可以问我···
作者: apple5740    时间: 2017-4-12 15:36
Yihc 发表于 2017-2-8 12:54
请问一下怎么让NPC一创建就朝指定坐标走去?

用路径法杖
作者: Yihc    时间: 2017-4-12 20:40
apple5740 发表于 2017-4-12 15:36
用路径法杖

嗯嗯谢谢~~
作者: 天之剑心    时间: 2017-5-1 21:19
这是NPCmod吗..............NPCmod没指令啊
作者: Luvian    时间: 2017-6-19 11:58
本帖最后由 Luvian 于 2017-6-19 14:09 编辑
平凡的行者 发表于 2016-12-26 03:06
1.10.2版:

将图中的/say换成其他指令即可


dalao好,想问个问题
代码一模一样,可是为什么一直报第一行的错

版本是1.9.4
--------------------
后来再开了一次莫名其妙地好了
但又有了问题:

event.npc.也报错未定义
看了很久的DOC也没看书个所以,求dalao相助啊


作者: 平凡的行者    时间: 2017-6-20 00:44
Luvian 发表于 2017-6-19 11:58
dalao好,想问个问题
代码一模一样,可是为什么一直报第一行的错

第四行的npc变数并没有在这个函数内宣告
你要取得受伤的npc本身的资讯应该这样写:Event.npc
所以你第四行要改为:
Event.npc.say("damn");
作者: 5997770    时间: 2017-7-14 12:04
“完成一个任务之后,另一个npc对话会变”
求教这种要怎么弄

作者: Luvian    时间: 2017-7-18 08:21
平凡的行者 发表于 2017-6-20 00:44
第四行的npc变数并没有在这个函数内宣告
你要取得受伤的npc本身的资讯应该这样写:Event.npc
所以你第四 ...

好的好的非常感谢!经过摸索后已经大致入门了!
作者: 小心傷    时间: 2017-7-18 14:01
谢谢楼主!!!
作者: Heer_Kaisair    时间: 2017-8-17 11:16
想问一下dalao,我想在某些事件下让npc的左手物品改变。。
但是不知道event.npc.getInventory().setLeftHand()中间的ItemStack怎么填写
当然获取一段itemstack的文本在写上去没什么用QAQ还报错
作者: Heer_Kaisair    时间: 2017-8-26 18:47
小黑的手臂 发表于 2017-8-17 11:16
想问一下dalao,我想在某些事件下让npc的左手物品改变。。
但是不知道event.npc.getInventory().setLeftHan ...

@平凡的行者
作者: Yihc    时间: 2017-8-26 21:27
能不能就是让他隔三差五变个人物模型...
求求大神了...
作者: 平凡的行者    时间: 2017-8-27 00:27
本帖最后由 平凡的行者 于 2017-8-27 00:49 编辑
小黑的手臂 发表于 2017-8-17 11:16
想问一下dalao,我想在某些事件下让npc的左手物品改变。。
但是不知道event.npc.getInventory().setLeftHan ...


抱歉这么晚才回覆

如果只是想改变手持道具,而不管该道具上有什么额外属性的话,
可以使用IWorld下的createItem(String name,int damage,int size)方法

具体写法如下:


  1. var n = event.npc
  2. var w = n.getWorld()
  3. n.getInventory().setLeftHand(w.createItem("minecraft:diamond_sword",0,1))
复制代码


上述代码执行后,NPC的副手就会拿起一把钻石剑

作者: 平凡的行者    时间: 2017-8-27 00:46
Yihc 发表于 2017-8-26 21:27
能不能就是让他隔三差五变个人物模型...
求求大神了...

如果你说的是要改变皮肤的话(例如从某个普通村民的皮肤突然变成一个刺客的皮肤)
这个可以很简单的做到,因为有提供API

如果你要他变成另一个生物的模型的话(例如从一匹马变成一个村民),就稍微困难,
需要研究一下能不能藉由其他方法修改NPC使用的生物模型

作者: Yihc    时间: 2017-8-27 12:38
平凡的行者 发表于 2017-8-27 00:46
如果你说的是要改变皮肤的话(例如从某个普通村民的皮肤突然变成一个刺客的皮肤)
这个可以很简单的做到 ...

哦哦!谢谢大神的解答
作者: 梦里雾里    时间: 2017-8-27 21:40
平凡的行者 发表于 2017-2-13 20:53
先放上与实作功能有相关API:
http://www.kodevelopment.nl/customnpcs/api/1.7.10/noppes/npcs/scripted/S ...

大佬请问 这个 玩家 type 值从哪里看的  玩家返回1  那么其他生物呢  查了下文档 硬是没找到
作者: 梦里雾里    时间: 2017-8-27 22:06
我想请问下dalao 有没有API 能获取 正在攻击的玩家 手上的物品对改物品进行操作 例如玩家用钻石剑攻击 NPC受到伤害后,修改钻石剑的耐久为0  我查了下player的函数  只有个getInventory() 获取背包的方法 返回值是 Returns a IItemStack array size 36 返回个大小为36 ItemStack 数组 意思应该是获取到背包的大小 通过数组下标对背包内的物品进行获取修改  但是物品栏的没有获取到 如何修改物品 也没有相关的API   @平凡的行者
作者: 平凡的行者    时间: 2017-8-28 01:29
本帖最后由 平凡的行者 于 2017-8-28 01:31 编辑
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这个介面继承了它。




作者: fankieqiu    时间: 2017-8-28 10:57
平凡的行者 发表于 2016-12-25 15:40
不如先给点想法如何?
看看有没有想要NPC做到的事?
然后我试试用脚本写出来? ...

您好大神。有件事想请教你。以前有想过做自动按照路径移动的马,然后玩家右键它就能骑上它。可是用只知道大概是用npc.setRider(player),具体怎么写不是很清楚,可以请帮帮忙吗?
作者: 梦里雾里    时间: 2017-8-28 19:42
本帖最后由 x1006495528 于 2017-8-28 20:01 编辑
平凡的行者 发表于 2017-8-28 01:29
关于实体类型的返回值的意义可以参考这个页面:
1.7.10:  http://www.kodevelopment.nl/cust ... onstant ...

感谢回答 在1.7.10  ScriptLivingBase 类中 并没有找到 getMainhandItem这个函数 只有
swingHand()这个函数

  1. var num=0;
  2. var t = event.getSource();
  3. if(num == 0){


  4. if(t && t.getType() == 1){
  5. npc.executeCommand("/say §c技能1");


  6. }
  7. num+1;


  8. }
复制代码
另外问下

我想让NPC 只使用一次这个技能  但是NPC每受到一次伤害 就运行这段代码 不能保存变量的数值 这有办法解决吗
作者: 平凡的行者    时间: 2017-8-29 03:07
本帖最后由 平凡的行者 于 2017-8-29 03:19 编辑
fankieqiu 发表于 2017-8-28 10:57
您好大神。有件事想请教你。以前有想过做自动按照路径移动的马,然后玩家右键它就能骑上它。可是用只知道 ...

1.7.10版的话,可以这样写:

Interact监控项内:
  1. if(!npc.getRider()){
  2. npc.setRider(player);
  3. }
  4. else{
  5. player.sendMessage("这匹马已被骑乘")
  6. }
复制代码


然后按照路径走的话,使用路径魔杖设置路径就可以了
不过我不确定,如果骑乘的玩家断线的话,会不会连带马也一起消失...
作者: 平凡的行者    时间: 2017-8-29 03:19
本帖最后由 平凡的行者 于 2017-8-29 03:21 编辑
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储存就好了,所以你可以改成这样:
  1. var t = event.getSource();
  2. if(npc.hasTempData("skillActivated")){
  3. if(t && t.getType() == 1){
  4. npc.executeCommand("/say §c技能1");
  5. }
  6. npc.setTempData("skillActivated",true);
  7. }
复制代码


作者: 梦里雾里    时间: 2017-8-29 16:37
平凡的行者 发表于 2017-8-29 03:19
1.7.10版的话,要使用getHeldItem()这个函数

另外,你想保存变量的话,可以给NPC纪录数据

那NPC能否获取范围内所有的实体呢 例如 NPC受到伤害后 该技能不再只针对攻击者释放 而是规定范围内所有玩家
作者: 平凡的行者    时间: 2017-8-29 22:23
x1006495528 发表于 2017-8-29 16:37
那NPC能否获取范围内所有的实体呢 例如 NPC受到伤害后 该技能不再只针对攻击者释放 而是规定范围内所有玩 ...

可以。
你可以使用getSurroundingEntities函数

這個函數有兩個版本:
getSurroundingEntities(int range)
getSurroundingEntities(int range,int type)
前者会获取指定范围内的所有实体,包括掉落物或是箭什么的都会获取
后者可以指定只获取哪一类型的实体。

要使用哪种函数,取决于你传入几个变量来决定。

作者: z1643452507    时间: 2017-9-1 08:17

大佬 如果我想改变NPC远程攻击的弹射物
该怎么填

setProjectileItem(ScriptItemStack item)
作者: 平凡的行者    时间: 2017-9-1 13:01
z1643452507 发表于 2017-9-1 08:17
大佬 如果我想改变NPC远程攻击的弹射物
该怎么填

首先你要先产生出一个代表某个物品的ScriptItemStack物件
例如你想把弹射物换成石头,那么首先你可以这样写:
  1. var proj = world.createItem("minecraft:stone", 0, 1)
复制代码

之后再用npc的setProjectileItem()方法设置弹射物就可以了

完整代码如下:
  1. var proj = world.createItem("minecraft:stone", 0, 1)
  2. npc.setProjectileItem(proj)
复制代码

或是也可以这样写:
  1. npc.setProjectileItem(world.createItem("minecraft:stone", 0, 1))
复制代码

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

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

请问下,怎么使NPC的tick冷却可以更长一点?默认是1秒,但是我想通过函数改为每10秒输出一次/say 233 这个指令,不知道行不行?[1.10.2]
作者: 流离人    时间: 2017-9-10 06:41
平凡的行者 发表于 2017-9-1 13:01
首先你要先产生出一个代表某个物品的ScriptItemStack物件
例如你想把弹射物换成石头,那么首先你可以这样 ...

请问大佬,getAllServerPlayers()这个怎么用。
比如我想让某个单位被击杀后,全服玩家获得buff
作者: z1643452507    时间: 2017-9-13 00:07
流离人 发表于 2017-9-10 06:41
请问大佬,getAllServerPlayers()这个怎么用。
比如我想让某个单位被击杀后,全服玩家获得buff ...

这个不用这么麻烦吧...直接在NPC死亡那一栏接一个激活命令方块的指令

然后用命令方块@a所有玩家就行了
作者: z1643452507    时间: 2017-9-13 00:08
大佬,1.7.10脚本能改变NPC的模型吗,找不到API呀..
作者: 流离人    时间: 2017-9-13 20:10
z1643452507 发表于 2017-9-13 00:07
这个不用这么麻烦吧...直接在NPC死亡那一栏接一个激活命令方块的指令

然后用命令方块@a所有玩家就行了 ...

服务器用不了@a。。。。
作者: z1643452507    时间: 2017-9-13 20:12
流离人 发表于 2017-9-13 20:10
服务器用不了@a。。。。

什么版本 连@a都不能用
作者: z1643452507    时间: 2017-9-13 20:30
流离人 发表于 2017-9-13 20:10
服务器用不了@a。。。。

var a = world.getAllServerPlayers();
npc.executeCommand("/give a 258 1");
每执行一次,检测到的服务器玩家就会获得一个ID258的物品..

不过这条指令不知道支不支持多个玩家...

毕竟我的破服务器也只有我一个人在线,23333

不过感觉不大妥....你还是去问问大佬吧..
我也是跟行者大佬学的半桶水...
你还是问问行者大佬吧..
作者: 流离人    时间: 2017-9-13 20:46
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这个玩家。。
作者: z1643452507    时间: 2017-9-13 20:50
流离人 发表于 2017-9-13 20:46
这个说不定可以呢。我去试试。
我之前是
var a = world.getAllServerPlayers();

var a = world.getAllServerPlayers();感觉这个已经读到玩家的名字了...

为什么还要var b = a.getName();再读一次...

而且..这两步好像有点奇怪...又不知道哪里奇怪
作者: z1643452507    时间: 2017-9-13 20:52
z1643452507 发表于 2017-9-13 20:50
var a = world.getAllServerPlayers();感觉这个已经读到玩家的名字了...

为什么还要var b = a.ge ...

假如你服务器有 ADC BBD两个玩家...你把他们的名字变量定义成a...下面这条岂不是...

var b = ADC,BBD.getName().....


作者: 流离人    时间: 2017-9-13 20:54
z1643452507 发表于 2017-9-13 20:50
var a = world.getAllServerPlayers();感觉这个已经读到玩家的名字了...

为什么还要var b = a.ge ...

我之前用getSource()读取了来源之后,要用getName()再读名字。。然后我以为getAllServerPlayer()之后还要读次名字。。。主要是不太清楚getAllServerPlayer()到底咋用
作者: 流离人    时间: 2017-9-13 21:02
z1643452507 发表于 2017-9-13 20:52
假如你服务器有 ADC BBD两个玩家...你把他们的名字变量定义成a...下面这条岂不是...

var b = ADC,BBD.ge ...

加个好友聊吧
作者: 20010918aaa    时间: 2017-10-6 12:08
请问一下如何让npc收到攻击时自动攻击最近的玩家(这样可以兼容一些mod武器攻击npc不会引发仇恨[典型:维克的现代战争]) 感谢
作者: @@Leo    时间: 2017-10-6 15:36
20010918aaa 发表于 2017-10-6 12:08
请问一下如何让npc收到攻击时自动攻击最近的玩家(这样可以兼容一些mod武器攻击npc不会引发仇恨[典型:维克 ...

攻击最近的玩家么
可以在damaged的事件调用getSurroundingEntities(int range, int type)
来寻找规定范围内的,然后遍历找到最近的,保存到全局变量里面(具体看前面平凡的行者的例子)
再到target事件setTarget()
range的范围就很麻烦了,太大卡服,太小检测不到
作者: apple5740    时间: 2017-10-7 00:18
z1643452507 发表于 2017-9-13 00:08
大佬,1.7.10脚本能改变NPC的模型吗,找不到API呀..

可以杀死该npc,生成一个。达到改模型的办法。。。直接改模型没有这个api
作者: apple5740    时间: 2017-10-7 00:19
流离人 发表于 2017-9-13 20:10
服务器用不了@a。。。。

应该是没有开启命令方块的原因吧。。。
作者: apple5740    时间: 2017-10-7 00:22
20010918aaa 发表于 2017-10-6 12:08
请问一下如何让npc收到攻击时自动攻击最近的玩家(这样可以兼容一些mod武器攻击npc不会引发仇恨[典型:维克 ...

npc在收到攻击的时候 应该会攻击最近的玩家。。。可以在伤害脚本改变npc的阵营。。。改成敌对的阵营就会攻击了哦
作者: 20010918aaa    时间: 2017-10-7 17:21
@@Leo 发表于 2017-10-6 15:36
攻击最近的玩家么
可以在damaged的事件调用getSurroundingEntities(int range, int type)
来寻找规定范 ...

感谢,最近尽快尝试
作者: A-Kreedz    时间: 2017-11-11 01:31
@@Leo 发表于 2017-10-6 15:36
攻击最近的玩家么
可以在damaged的事件调用getSurroundingEntities(int range, int type)
来寻找规定范 ...

请问楼主这样子怎么解决
作者: A-Kreedz    时间: 2017-11-12 12:41
平凡的行者 发表于 2017-9-1 13:01
首先你要先产生出一个代表某个物品的ScriptItemStack物件
例如你想把弹射物换成石头,那么首先你可以这样 ...

请问巨佬,我想让一个npc使用setRider(ScriptEntity entity) ,但是括号里面的生物应该怎么写?
作者: @TGL    时间: 2018-1-6 18:46
试过很多代码。控制台都是输出
javax.script.ScriptException: php.java.bridge.http.FCGIConnectException: Could not connect to server

作者: @@Leo    时间: 2018-1-6 18:56
@TGL 发表于 2018-1-6 18:46
试过很多代码。控制台都是输出
javax.script.ScriptException: php.java.bridge.http.FCGIConnectExceptio ...

请问您是服务器?
服务器里面也安装了脚本么?
作者: @TGL    时间: 2018-1-6 19:02
@@Leo 发表于 2018-1-6 18:56
请问您是服务器?
服务器里面也安装了脚本么?

不是服务器
作者: @@Leo    时间: 2018-1-6 19:44
@TGL 发表于 2018-1-6 19:02
不是服务器

很迷茫,我反编了一下,发现什么地方都可以抛出这个报错,但是却没有更多的信息可以得知233
或许你可以去外网看一下23
作者: @TGL    时间: 2018-1-25 16:29
怎么设置机率,例如NPC攻击玩家时 每次有百分之20机率触发一个指令