粘兽
@@Leo 发表于 2018-2-21 20:03
emm跟执行普通指令一样executeCommand()不可以么?
至于选取点……那么就要深究WE指令了,加油 ...

不行的 不可以两条//

平凡的行者
粘兽sama 发表于 2018-2-21 20:54
不行的 不可以两条//

之前我在42楼有回覆说可以使用CBWrapper插件
至少我之前1.7.2版本的服务器是这么做的

不过站内好像没有这款插件的介绍
你要不要去下面这个连结看看?
https://dev.bukkit.org/projects/cbwrapper

fankieqiu
粘兽sama 发表于 2018-2-21 20:54
不行的 不可以两条//

如果命令里不用"//",而是弄成"/"+"/"这样,可以吗?

fankieqiu
本帖最后由 fankieqiu 于 2018-2-22 18:35 编辑

请教一下大佬们两个问题。
第一,我想做一个在和npc对话时,玩家选不同选项执行不同的命令,请问怎么做?譬如if玩家在id多少的对话里选项选1,就执行什么,选2又执行什么这样,然后还能getsoruce到对话的玩家
第二,可不可以用脚本引出对话框?譬如玩家选项选1,然后执行脚本,随机弹出对话框A或者B这样?
好吧,其实我是想用npc脚本做个赛马的游戏

我想说一下思路

首先和一个赌马的npc对话,然后4个选项,分别是ABCD吧,然后选了自己想选的,npc没收你的票
然后执行脚本,在跑马场召唤ABCD4个马,然后他们向着4个并排的目标点跑,中间一直随机改变他们的速度
然后npc检测这4个目标点,哪个目标点最快检测到有实体,就输出一个结果
然后如果这个结果和玩家选的结果一样,就奖励,不然就没奖励

可是有几个问题

首先怎样可以在选完选项之后执行脚本
还有输出结果之后,怎样检测他和玩家选的选项一不一样
还有奖励的方式,我也不是很确定怎样给奖励

给到正确的人我觉得有点难
还有怎样在跑马的过程中不接受其他人投注


平凡的行者
fankieqiu 发表于 2018-2-22 16:00
请教一下大佬们两个问题。
第一,我想做一个在和npc对话时,玩家选不同选项执行不同的命令,请问怎么做?譬 ...

关于第一点:
npc的对话选项本身就可以设置执行哪条命令
你在[对话框选项]的设定页面中编辑每一个选项时,应该会有一个[选项类型]的项目可以选
那个项目可以被设置为[命令方块],这表示当你在对话中选了这个选项,将会执行你在这里预先设定好的命令

第二点,刚刚研究后得到的结果是可以的
有两种方法:
第一种比较简单,就是使用npc的命令:
/noppes dialog show <player> <dialog> <name>
这条命令执行后,玩家<player>会立刻看到编号为<dialog>的对话。对话中NPC的名子将显示为<name>
但是这条命令有个小缺点:对话页面的左下角不会出现NPC的模型,因为该命令并非真的去抓一个实际存在的NPC来跟玩家对话,而是创立一个虚拟的NPC和玩家对话

所以后来我去看了一下这条命令的源码,找到了NPC的对话是如何被调出来
只要执行NoppesUtilServer类中的静态方法openDialog()即可:

var dialogs = Java.type("noppes.npcs.controllers.DialogController").instance.dialogs;
Java.type("noppes.npcs.NoppesUtilServer").openDialog(player.getMCEntity(),npc.getMCEntity(),dialogs.get(1));
第一条是取得全部的npc对话
第二条是调用openDialog直接让玩家看到对话
上面这个例子会让玩家看到编号为1的对话,左下角的NPC模型会是玩家右键点击的NPC(如果你这两行代码是放在interact监听项里的话)

fankieqiu
本帖最后由 fankieqiu 于 2018-2-22 18:50 编辑
平凡的行者 发表于 2018-2-22 18:36
关于第一点:
npc的对话选项本身就可以设置执行哪条命令
你在[对话框选项]的设定页面中编辑每一个选项时 ...

谢谢大神。我说的选项执行命令,不是说游戏的指令呢,是指不同的脚本。请看我后面的补充,我想达到的效果是这样,譬如玩家选了选项1,然后就储存起来,然后最后赛马出来的结果就是1,检测一下和玩家的选项一样,就得到奖励这样。

还有额外有个问题,npc有办法做出破甲这样的攻击吗?就是检测玩家身上穿的物品,然后统计他们的护甲值,然后攻击伤害加上这个护甲值总和...
攻击修改容易,检测身上装备(而非背包)我就不会了,还有统计护甲值,脚本能做到这么强大吗?

平凡的行者
本帖最后由 平凡的行者 于 2018-2-23 20:04 编辑
fankieqiu 发表于 2018-2-22 18:41
谢谢大神。我说的选项执行命令,不是说游戏的指令呢,是指不同的脚本。请看我后面的补充,我想达到的效果 ...

恩......大概了解了
关于第一点,你可以把脚本写在dialog监听项内,而这个监听项中有一个变数可以使用:dialog
这个变数代表的是当前玩家看到的对话ID

所以我自己的方法是:给这个NPC设置4个选项,每一个选项都会连到不同的对话
脚本中藉由判断玩家目前看到哪个对话来得知玩家选了哪个选项
然后dialog项内这样写:
if(dialog >= 10 && dialog <= 13){
player.setStoredData("horse_racing_choice",dialog);
}

由于我新建的4个选项后的对话ID分别是10,11,12,13,所以我就先判断是不是这四个对话的其中一个再执行脚本
然后使用setStoredData来记录玩家选了哪个对话ID,记录起来,等赛马结果出来后再比对是否选中

然后如果你想在赛马途中阻止玩家选择马匹,可以利用阵营点数来控制对话
藉由给对话的[可用的选项]添加阵营点数的判断条件,然后在脚本里操作阵营点数就可以达到控制对话选项的效果
你可以另外创立一个阵营专门给对话判断
然后使用player.getFactionPoints(int faction)和player.addFactionPoints(int faction,int points)来取值或增加(注意:是增加,增加的点数可为负数)该阵营的点数
这个做法有点类似计分板的操作

然后关于输出赛马的结果,我建议可以用NPC魔杖制作马匹,让马自行判断自己是否为第一个到达终点的
结果存在世界的storedData中(使用world.setStoredData()存入),然后NPC就检查这项storedData是否有结果
有的话就可以开始发奖励。


然后关于第二点:
NPC的攻击设定中没有破甲设定,但是利用脚本做到破甲攻击是可行的
不过我是建议不要去计算护甲值,这样写起来麻烦
所以我自己会直接创立一个新的攻击事件取代

刚刚稍微对照了一下DamageSource的函式功能后写了个脚本
近战伤害的话可以在attack监听项中这样写:
if(!event.isRange()){
event.setCancelled(true);

var clsDSnpc = Java.type("noppes.npcs.NpcDamageSource");
var testDS = new clsDSnpc("mob",npc.getMCEntity());
testDS.func_76348_h();

event.getTarget().getMCEntity().func_70097_a(testDS,event.getDamage());
}


第一行是判断NPC该次攻击是否为近战攻击
第二行是取消原本的攻击事件
三四五行是另外创立一个新的伤害源,并且将该伤害源设定为可穿甲
第六行是对NPC的攻击目标施加该伤害,伤害值指定为全国**该次攻击的伤害


远程伤害的破甲效果暂时没研究



fankieqiu
平凡的行者 发表于 2018-2-23 20:02
恩......大概了解了
关于第一点,你可以把脚本写在dialog监听项内,而这个监听项中有一个变数可以使用:di ...

谢谢大神,前面的有点复杂...我要等比较多的空余时间慢慢看
关于第二个问题,我看了你的思路,我才发现是我自己想多了
我想到一个更简单的方法,就是检测攻击的target,然后getHealth,再setHealth为原生命值-npc伤害值
有时候真的会想多了哎

平凡的行者
fankieqiu 发表于 2018-2-23 20:49
谢谢大神,前面的有点复杂...我要等比较多的空余时间慢慢看
关于第二个问题,我看了你的思路,我才发现是 ...

是可以这样做,但是我不是很建议这样做,因为比较容易出BUG
因为你这样做并没有透过攻击事件杀死玩家
例如当玩家因直接削减血量而死,死亡讯息会出现「XXX已死亡」而不是「XXX被NPC杀死了」

不过绕过攻击事件直接削减血量是可以避免触发任何伤害防御能力

a15020968400
平凡的行者 发表于 2018-2-11 13:53
脚本中没有可以直接修改移动速度的方法,所以得查源码看看如何修改
不过幸运的是,查完后发现修改起来也 ...

这个是要在哪里修改呀大佬

a15020968400
修改我已经会了,想来问下大佬1.7.10能不能让npc飞起来,或者水面上移动更快些,我想做个可以玩家骑乘的水上npc,然后敲好他的移动路径,玩家就可以等他来了坐上去快速在河道里移动。emmmmmm,起初是想搞个自动移动的魔兽里暴风城的船那样的东西,不过那样的mod都很难找的样子所以才把点子想到了npc上,我改移动过了30之后水上的移速就稳定不变了,但是砸个迅捷还是有效的,所以就算水上的移速改不了也想知道怎么让npc一直获得迅捷buff的办法。

平凡的行者
a15020968400 发表于 2018-3-7 21:21
修改我已经会了,想来问下大佬1.7.10能不能让npc飞起来,或者水面上移动更快些,我想做个可以玩家骑乘的水 ...

1.7.10的NPC没办法设置成飞行,要用其他手段模拟是可以但是不建议,因为操作上困难
想要飞行NPC的话建议使用1.10.2或以上的版本

持续获得药水buff的方法可以在[更新]的监听项中调用npc.addPotionEffect(int effect, int duration, int strength, boolean hideParticles)

例如你要迅捷的效果的话:
npc.addPotionEffect(1,2,0,false)

把这行直接写在[更新]监听项内的话,NPC就会每0.5秒对自己施加2秒迅捷1的效果


2533883141
大佬大佬

纯白剑姬
平凡的行者 发表于 2018-3-8 12:50
1.7.10的NPC没办法设置成飞行,要用其他手段模拟是可以但是不建议,因为操作上困难
想要飞行NPC的话建议使 ...

想请教一下大神几个问题,如能得到指点感激不尽!
首先是服务器npcmod版本是1.7.10d
我想限制服务器红名(杀人)玩家不能和npc打开对话框
具体我是这样在dialog钩子写的 :D

  1. var PF = player.getFactionPoints("3");
  2. npc.say(PF);
  3. if( PF == 1){
  4.     event.setCancelled(true);
  5. }
  6. npc.say(event.isCancelled());
复制代码

问题就在这个setCancelled没有反应
甚至只写event.setCancelled(true);
一样还是能打开对话框...

第二个问题
我想个boss加点技能 比如在血量多少多少的时候召唤一个回血图腾npc
目前我是打算在玩家客户端上传前先用复制魔杖先复制一个图腾npc
然后再让boss战斗过程中触发技能 从玩家的库中召唤出图腾npc来

还有一个想法是先把这些图腾npc摆在boss房外 战斗中执行/noppes npc 图腾 home
重新设置出生点在boss附近 再让它刷新一下(相当于瞬移到boss身边)【不知道可不可行】
当图腾npc死亡时直接删除该npc  问题就是这些拉过来的图腾npc需要手动补充数量.....

所以我想问问能不能像召唤师那样的职业先把图腾npc存在什么地方在调用出来
或者有没有其他更加简单的方法?



最后一个问题
是我想在图腾npc加点粒子效果
所以我把一个带粒子的npc骑在了图腾npc上
发现原来骑着npc就不能用复制魔杖复制了...
所以能带着粒子npc和图腾npc一起召唤到boss身边吗?
或者能让图腾npc自带粒子效果吗?



先感谢大神能看完这么长一段提问!
希望大神能有空提点一下!感谢大神!

纯白剑姬
纯白剑姬 发表于 2018-3-25 23:35
想请教一下大神几个问题,如能得到指点感激不尽!
首先是服务器npcmod版本是1.7.10d
我想限制服务器红名 ...

还有一个题外问题:D
就是 能不能在对话框中打开那种在mc聊天框中点击网址时弹出的链接跳转申请框?
能用npcmod直接把那个申请框调出来吗?
静候佳音

平凡的行者
纯白剑姬 发表于 2018-3-26 00:01
还有一个题外问题:D
就是 能不能在对话框中打开那种在mc聊天框中点击网址时弹出的链接跳转申请框?
能用 ...

关于第一个问题
有一些事件是无法取消的,dialog就是其中一个
我自己的话会用比较迂回一点的作法,就是执行指令强制开启另一个对话
这个对话的内容大概就是告知玩家你无法跟NPC对话之类的。

我自己大概是会这样写:
  1. var PF = player.getFactionPoints("3");
  2. if( PF == 1){
  3.     npc.executeCommand("/noppes dialog show "+player.getName()+" <dialog> "+npc.getName());
  4. }
复制代码
noppes dialog show的命令用法:/noppes dialog show <player> <dialog> <name>
执行后,会立刻给指定玩家看到编号为<dialog>的对话,并且对话中的npc名子会显示为<name>

这样写的效果就是:被禁止跟NPC对话的玩家一打开对话介面后,会先看到NPC的第一个对话,接着立刻被脚本强制看到指定的对话
你可以把这个指定的对话设计成告知玩家你目前无法跟NPC对话之类的功能


关于第二个问题
复制魔杖在存放复制NPC或生物的资料时,是可以选择存放在客户端或伺服端的
存放在客户端的话就会存在使用复制魔杖的那个人的客户端


而脚本中的world物件其实有这个功能:spawnClone(int x, int y, int z, int tab, java.lang.String name)
这个就是从伺服端的资料中复制NPC并招唤在指定座标上。
或者是你也可以使用命令:/noppes clone spawn <name> <tab> [[world:]x,y,z] [newname]
如果让NPC使用world.spawnClone(int x, int y, int z, int tab, java.lang.String name)的话,会在NPC所处的维度下招唤复制体
如果是使用命令的话可以指定要在哪个维度生成(指定维度的话要写该维度的代号,例如下界是-1)

所以你就选择用命令或是world.spawnClone叫出NPC就可以了

最后一个问题的话,我是觉得可以让图腾NPC自己制造粒子
调用world.spawnParticle让图腾在自己的位置生成粒子效果




然后关于点击网址的部分,我建议是用tellraw做
例如这样:npc.executeCommand("/tellraw "+player.getName()+" {text:'mcbbs',clickEvent:{action:'open_url',value:'http://www.mcbbs.net'}}")
这样会在玩家的对话窗内出现一个mcbbs的字样,点击它的话就会询问是否开启http://www.mcbbs.net这个网址


纯白剑姬
平凡的行者 发表于 2018-3-29 16:50
关于第一个问题
有一些事件是无法取消的,dialog就是其中一个
我自己的话会用比较迂回一点的作法,就是执 ...

感谢大神的详细回复!!!
我去慢慢尝试一下!

纯白剑姬
平凡的行者 发表于 2018-3-29 16:50
关于第一个问题
有一些事件是无法取消的,dialog就是其中一个
我自己的话会用比较迂回一点的作法,就是执 ...


关于第一个问题
貌似1.7.10版本的npcmod没有noppes dialog show的命令呢
在1.7.10的git的wiki上也没有该指令 应该是新版本更新的吧OTZ
所以我用了前面调出对话界面的方法
  1. var dialogs = Java.type("noppes.npcs.controllers.DialogController").instance.dialogs;
  2. Java.type("noppes.npcs.NoppesUtilServer").openDialog(player.getMCEntity(),npc.getMCEntity(),dialogs.get(1));
复制代码

才发现在对话框触发事件打开对话框 变成了无限循环了.....
(甚至客户端被刷的崩溃了...)

最后想想 可能是我太钻牛角尖了=-= 老实用对话框条件选项就能解决的问题 为什么我要这么绕呢OTZ

平凡的行者
本帖最后由 平凡的行者 于 2018-3-29 23:27 编辑
纯白剑姬 发表于 2018-3-29 18:39
关于第一个问题
貌似1.7.10版本的npcmod没有noppes dialog show的命令呢
在1.7.10的git的wiki上也没有该 ...

我这边npcmod的版本是CustomNPCs_1.7.10d(19jun17) (不过最新的是29-oct-2017)
是1.7.10的版本
你npcmod的版本会不会是旧的?

纯白剑姬
本帖最后由 纯白剑姬 于 2018-3-30 18:07 编辑
平凡的行者 发表于 2018-3-29 23:26
我这边npcmod的版本是CustomNPCs_1.7.10d(19jun17) (不过最新的是29-oct-2017)
是1.7.10的版本
你npcmod的 ...


在官网下载最新版本发现确实有dialog show
可能是服务器的npcmod确实太老了
顺带想问问 如果更新npcmod版本
有可能出什么问题吗?
现在服务器的npc时不时会变成另一个npc
(比如我做了两个npc A和B 时不时B就会变成A了)
npc的位置没有变化 但是所有设置(皮肤、对话、职业)都变成另一个npc的设置了
这难道就是贴主说的这个?


平凡的行者
本帖最后由 平凡的行者 于 2018-3-30 18:33 编辑
纯白剑姬 发表于 2018-3-30 17:44
在官网下载最新版本发现确实有dialog show
可能是服务器的npcmod确实太老了
顺带想问问 如果更新npcmod版 ...

这个我倒不清楚,我自己没遇过这样的事,最近也没什么在碰插件
不过NPC版本更新的情况中,我记得从b到c 版还是从c到d版,这两种状况中有一种会让原本服务器内的NPC全数消失。可能是NPC的实体ID改了之类的吧?
另外,如果不能更换NPC的版本的话,你上面那个呼叫对话框的代码稍微只要加个判断就能用了
  1. if(dialog != 1){
  2. var dialogs = Java.type("noppes.npcs.controllers.DialogController").instance.dialogs;
  3. Java.type("noppes.npcs.NoppesUtilServer").openDialog(player.getMCEntity(),npc.getMCEntity(),dialogs.get(1));
  4. }
复制代码
判断看到的对话框不是要使用脚本开启的对话框才开启

纯白剑姬
平凡的行者 发表于 2018-3-30 18:28
这个我倒不清楚,我自己没遇过这样的事,最近也没什么在碰插件
不过NPC版本更新的情况中,我记得从b到c 版 ...

感谢大神回复;
服务器npcmod也是d版本的 所以升级应该没啥问题吧。
上面的问题是有时重启服务器会造成的 原因未明。
最后想问问大神有没有推/抛投npc的方法?
打算尝试一些野猪/狼 的 冲撞/跳劈等略带位移的技能?
在noppes.npcs.scripted.ScriptNpc一直向父类翻到java.lang.Object都没找到位移的方法...
不知道是我哪里看错眼还是没看明白呢 希望大神指点一下:D

1549023568
请问下为什么安装了引擎之后游戏就闪退了

2004哥哥
作者辛苦了!

@TGL
怎么判断NPC周围是否有玩家

@@Leo
@TGL 发表于 2018-5-24 17:18
怎么判断NPC周围是否有玩家

恩哼,昨天还在学校里学习所以不能回复抱歉
啊**,在该NPC的脚本里面调用npc就是指当前的NPC
  1. npc.getSurroundingEntities(10);
复制代码
获取NPC附近十格内的实体,返回一个实体数组ScriptEntity[]
建议可以多去看看DOC,总会找到的2333
顺带一提,这个方法可以有两个传入
  1. npc.getSurroundingEntities(10,0);
复制代码
取NPC附近十格内的,id为0的实体,返回一个实体数组ScriptEntity[],这样子就不用自己再筛选是不是玩家了,我记得好像玩家是0还是几来着,你可以去试试看

@TGL
@@Leo 发表于 2018-5-26 17:34
恩哼,昨天还在学校里学习所以不能回复抱歉
啊**,在该NPC的脚本里面调用npc就是指当前的NPC
获取NPC附近 ...

请问如何判断返回的ScriptEntity[]中是否存在玩家,返回true或者false

@@Leo
@TGL 发表于 2018-5-27 14:38
请问如何判断返回的ScriptEntity[]中是否存在玩家,返回true或者false

ScriptEntity有一个typeOf(int type)方法可以检测是不是目标类型的实体
至于玩家的type值是多少我就不知道了

582558781
能办到npc累计受到多少次攻击之后tp攻击最多的玩家嘛...
另外,能不能像东方那样子设置npc死亡后换成另一个npc来实现符卡的效果
(三更半夜才发现这个帖子,死)

582558781
本帖最后由 582558781 于 2018-6-10 14:37 编辑

那个npc怎么在玩家身边刷出方块就是一堆石头围着能暂时困住玩家
或者如何通过命令方块来实现。
(1.7.10)

星层
@@Leo 发表于 2018-6-2 17:31
ScriptEntity有一个typeOf(int type)方法可以检测是不是目标类型的实体
至于玩家的type值是多少我就不知 ...

玩家的type是plear

cos003
lz,我可以联系你吗?

1549023568
大佬 请问下怎么让npc的攻击附带药水效果【瞬间伤害这样的】

粘兽
1549023568 发表于 2018-6-11 10:10
大佬 请问下怎么让npc的攻击附带药水效果【瞬间伤害这样的】

代码放入攻击(Attack)监听内
  1. event.getTarget().addPotionEffect(7,1,0,1)
复制代码

excit
。。。作为凡人我看不懂

银星sama
一直都不知道怎么弄,谢谢楼主

iverson119
请问一下大神,我想实现这么一个效果。
几个人一起攻击一个npc,在npc死亡的时候,结算时每个人都有是杀死这个npc之人,而不是只有最后一击的才是。
如果这个效果很难实现的话,那换一下思路,凡是攻击过boss的人,在boss死亡之后,都能完成一个任务(就是杀死boss的任务,只不过用指令或者脚本去强制完成)。如果boss脱战之后,攻击过boss的人的记录被重置。

@@Leo
iverson119 发表于 2018-6-23 10:24
请问一下大神,我想实现这么一个效果。
几个人一起攻击一个npc,在npc死亡的时候,结算时每个人都有是杀死 ...

你可以选择用TempData
有这么几个个方法
  1. public java.lang.Object getTempData(java.lang.String key)
  2. public void setTempData(java.lang.String key, java.lang.Object value)
  3. public boolean hasTempData(java.lang.String key)
  4. public void removeTempData(java.lang.String key)
复制代码
不过具体维护起来很繁琐,尤其是攻击的人多的时候判断重复很麻烦

要么就是维护一个容器了
至于脱战……tick里面循环,超过1s都没有攻击目标大概就是脱战了吧

iverson119
本帖最后由 iverson119 于 2018-6-23 18:37 编辑
@@Leo 发表于 2018-6-23 17:11
你可以选择用TempData
有这么几个个方法不过具体维护起来很繁琐,尤其是攻击的人多的时候判断重复很麻烦
...

对啊,如果是A打一下,B打一下,A再打一下,这样会不会记录了2个A?再请问下高手,如果我就希望输出的结果是,伤害过这个npc的玩家,都能完成对应任务ID的任务。这个完成任务我会做,但是怎样输出这个玩家的名单?

@@Leo
iverson119 发表于 2018-6-23 18:35
对啊,如果是A打一下,B打一下,A再打一下,这样会不会记录了2个A?再请问下高手,如果我就希望输出的结果 ...

所以要检查很麻烦啊
你可以从1~n这样子保存
然后保存和读取的时候都要这样子按照引索来

粘兽
本帖最后由 粘兽sama 于 2018-6-27 06:16 编辑

1.12.2如何实现1.7.10"event.setCancelled(true)"的效果,
我没有找到对应的API......




摸索了一会,找到方法了!

123crs
大佬 想请教一下 1.7.10
如何让npc在被杀时发送一条全服都能看到的公告
复活时发送另一条全服都能看到的公告呢?

粘兽
123crs 发表于 2018-7-1 01:10
大佬 想请教一下 1.7.10
如何让npc在被杀时发送一条全服都能看到的公告
复活时发送另一条全服都能看到的公 ...

在'死亡'和'复活'的监听里加一个执行指令的脚本即可。

123crs
粘兽sama 发表于 2018-7-1 05:33
在'死亡'和'复活'的监听里加一个执行指令的脚本即可。

具体应该怎么执行呢 qwq

粘兽
123crs 发表于 2018-7-1 15:32
具体应该怎么执行呢 qwq

执行指令的脚本如下
npc.executeCommand("bc <消息内容>")

@TGL
有方法让NPC死亡后,不掉落物品吗。(用代码实现)
或者让NPC死亡后所在的区块暂停两秒再卸载

111968511
很棒的作品!

凛弦
谢谢版主大人提供的教程

1549023568
请问下怎么给范围内同一个阵营/敌对阵营的npc上药水效果

DJMC
当任务被激活时,或者红石被激活,或者群体对话完成后,A士兵和B士兵去攻击一个农民npc,怎么写啊

第一页 上一页 下一页 最后一页