本帖最后由 skpsk自己家 于 2019-8-6 09:30 编辑

或许NPC的脚本在国内有点小众吧……
你如果是一个RPG服腐竹(服务器还加了拔刀and自定义NPC)
是否因为NPC被拔刀之类的逆天武器连上天而烦恼呢
或许没有

需要用到的东西:


这个帖子能让你NPC怎么样:


第一步:配置环境①
如果你之前给服务器和本地添加了nashorn.jar 可以跳过
(其实其他脚本语言一样可行但是需要修改一些东西 因为API是不变的 但是语**有变化)

找到你安装的java
然后打开
X:xxxx\jre-xxxx\lib\ext
里面会有一个nashorn.jar
请和装mod一样 把他塞到mods文件夹

如果有服务端 请把服务端mod也装上nashorn.jar

第二步:配置环境②
打开你的游戏
找到你要修改的NPC 拿出脚本魔杖 对他右键
看“语言”是不是ECMAScript
把“开启”设为是


第三步:了解代码


  1. var getItem=null;
  2. var getType=null;
  3. try{
  4. getItem=event.getSource().getHeldItem().getName()
  5. getType=event.getType()
  6. }
  7. catch(err){}//上面的都不用改

  8. for(var i=0;i<1;i++){
  9. switch(i){
  10. case 0:
  11. if((getItem+"").indexOf("slashblade")!=-1)event.setCancelled(true)
  12. case 1:
  13. if(getType=="directMagic")event.setCancelled(true)
  14. if(getType=="directMagic")event.setDamage(0)
  15. }
  16. }
  17. //npc.say("item:"getItem)
  18. //npc.say("type:"getType)
复制代码

                                    这是一串非常简单易懂的代码(我也写不出NB的好吧)
目前已经是预设好免疫拔刀和幻影剑伤害了
现在我们来说说怎么改
首先 我们认识两个变量:

getItem和getType
getItem就是玩家攻击时手里拿的武器
(除非他切换武器的速度比你电脑计算速度还快 否则就是攻击所使用的物品)
getType就是伤害类型(也不知道怎么解释)

然后 我们要配置更多的禁用
下面这段是调试用的代码
//npc.say("item:"+getItem)
//npc.say("type:"+getType)
它是被注释过的
                    我们怎么让他运行呢 把前面的”//“删掉就可以了(加上去又不能运行了)
npc.say("item:"+getItem)
npc.say("type:"+getType)
删掉以后,我们攻击他时 就会反顾数据给我们
item就是物品的注册名
                                          type就是伤害类型(玩家 药水 幻影剑 爆炸 掉落等)
那我们要怎么禁止物品或者伤害类型呢
  1. for(var i=0;i<1;i++){
  2. switch(i){
  3. case 0:
  4. if((getItem+"").indexOf("slashblade")!=-1)event.setCancelled(true)
  5. case 1:
  6. if(getType=="directMagic")event.setCancelled(true)
  7. if(getType=="directMagic")event.setDamage(0)
  8. }
  9. }
复制代码
重要的事先说:
如上代码
i<1
这里的”1“就是你要禁止的物品数量(从0开始)


对没有编程基础的同学有点难解释
还是举例子吧
比如我用钻石剑打了NPC一下
返回的是
item:minecraft:diamond_sword
type:player

minecraft:diamond_sword就是钻石剑的注册名
player就代表是type是玩家伤害
那我们可以改写下代码
  1. for(var i=0;i<2/*这里改成了2*/;i++){
  2. switch(i){
  3. case 0:
  4. if((getItem+"").indexOf("slashblade")!=-1)event.setCancelled(true)
  5. case 1:
  6. if(getType=="directMagic")event.setCancelled(true)
  7. if(getType=="directMagic")event.setDamage(0)
  8. case 2:
  9. if((getItem()+"")).indexOf("minecraft:diamond_sword")!=-1)event.setCancelled(true)
复制代码
也就是 i小于的数量一定要比有的case大或者等于
如 我有0~100个case 但是我i<1000也可以
但是 如果我有0~100个case 但是我i<1就不可以了

其实也不一定把注册名写完 选一段他独有的就可以
比如
minecraft:diamond_sword可以写成diamond_sword甚至d_sword
建议全部写完

type也是差不多的道理(type不能像item取一段 必须写完)
  1. for(var i=0;i<3/*这里改成了3*/;i++){
  2. switch(i){
  3. case 0:
  4. if((getItem+"").indexOf("slashblade")!=-1)event.setCancelled(true)
  5. case 1:
  6. if(getType=="directMagic")event.setCancelled(true)
  7. if(getType=="directMagic")event.setDamage(0)//这串代码不用管一般情况下用不上
  8. case 2:
  9. if((getItem()+"")).indexOf("minecraft:diamond_sword")!=-1)event.setCancelled(true)
  10. case = 3:
  11. if(getType=="player")event.setCancelled(true)
  12. }
  13. }
复制代码
一些注意事项:

1.“player”这样子 一定要加“”不能写成player
2.如果你不是很懂编程 千万别动{}括号 尽管有 也别手贱吧
3.有什么问题 可以回帖问我
4.本代码目前仅支持1.7.10的自定义NPCmod 更高版本过几天会写一下 弄在下面
(其实只是语法的不同 思路还是这个样子 甚至API都差不多)
5.我第一次发这种贴如果发错版了 那就发错了吧
6.我可能表达得不是很好 所以不懂就问吧……