找回密码
 注册
搜索
查看: 4492|回复: 30

快过年了,放点福利出来,说一说克制模块的优化!

[复制链接]
门派:明教
发表于 2019-1-31 22:21:09 | 显示全部楼层 |阅读模式
最近对克制模块做了不小的改动,有一些心得跟大家分享一下!

由于克制模块跟job,skill,diemenglou,fpk都有很大关系,而且我自己的pk机器人已经成体系了,如果单独放出克制模块,恐怕大家都难以嫁接,所以干脆把所有知识点拆开,一个个说。

大家看明白一个,就照搬一个,这样也不会影响大家的使用。

好了,下面开始讲课!

评分

1

查看全部评分

门派:明教
 楼主| 发表于 2019-1-31 22:38:18 | 显示全部楼层
1. 先说说多人混战情况下,如何识别伙伴武功,或者说不将无关npc的武功识别为目标敌人的武功。

杠头开花突然一剑点向东门度恭的头部,虽一剑却暗藏无数后着,东门度恭手足无措,不知如何是好!
东门度恭使用武功【独孤九剑】,武功属性:妙
杠头开花的劲道太弱,几乎无法对东门度恭造成伤害!
结果几乎没有对东门度恭造成任何伤害。
( 东门度恭似乎受了点轻伤,不过光从外表看不大出来。 )

这个是我在做护镖机器人时,加入了克制模块,伙伴“杠头开花”对敌人“东门度恭”出招,用的是独孤九剑,却被识别成了敌人东门度恭在用独孤九剑。

原因是——
function kezhiwugongStart()

create_trigger_t('afight1'..i,'^(> )*(\\D*)'..npc_name..'(\\D*)'..'!$','','kezhiwugongcheck'..i)

上边函数在用afight1..i触发器抓带有npc_name名字的句子,抓到之后,用kezhiwugongcheck..i函数处理。

抓到之后,分为前半句和后半句——

(\\D*)'..npc_name..'(\\D*)-- 第一个(\\D*)代表前半句,第二个(\\D*)代表后半句,中间用npc名字做分割。
---------------

然后——
        if w[2]~=nil then
                if string.find(w[2],"你") then
                        --print("----------检测到自己出招-----------")
                        return
                end
                tmpdes=tmpdes..w[2]
        end

w[2]里包含了前半句,如果里边有“你”这个字眼,说明是自己出招。

例如:你一招【大鹏展翅】打得npc像稻草一样飞出去。--这句话就不做判断了,因为有“你”字出现了。
门派:明教
 楼主| 发表于 2019-1-31 22:44:26 | 显示全部楼层
                tmpdes=tmpdes..w[2]
        end
        if w[3]~=nil then
                tmpdes=tmpdes.."|"..w[3]
        end

如果没有“你”字出现,但是这个触发器里抓到了带有npc名字的语句,那么就判断这有可能是npc出招,所以将前半截w[2]|w[3]合并在一起,成为一个字符串,然后传递给变量temdes中。

以后再对武功识别进行判断,也就是对temdes进行操作了!

所以分析到了这里,我们要明确几件事——

第一,现有的克制模块,是对包含npc名字的语句做抓取的,没有npc名字出现的语句不抓取。
第二,w[2]是以npc名字做分割的前半截语句,w[3]是后半截语句。
第三,如果在w[2]里发现“你”,说明是自己出招,不做判断。
第四,tempdes里,包含了w[2]|w[3],合并在一起的内容。

好了,有了以上概念后,我们就可以开始操作了!
门派:明教
 楼主| 发表于 2019-1-31 22:54:18 | 显示全部楼层
        if w[2]~=nil then
                if not string.find(w[2],"你") and string.find(w[3],"的")==1 then
                        --print("----------检测npc出招-----------")
                        return
                end
        end

这个就是识别其它npc对目标敌人的攻击,不做判断!

为啥这么简单呢?且听我一一道来。。。

if w[2]~=nil then--这起的作用是,w[2]不为空,意味着敌人的名字不是出现在句首,也就是说一定是有什么人在对他做动作,而敌人名字在句首,则说明很可能是敌人出招了!

例如——

杠头开花突然一剑点向东门度恭头部,虽一剑却暗藏无数后着,东门度恭手足无措,不知如何是好!

这是杠头开花打东门度恭,

if not string.find(w[2],"你")--前半截没有发现“你”字样出现。

and string.find(w[3],"的")==1--这个有点儿学问,并且在后半截发现了“的”字样,而且它的位置是1.

啥意思呢?就是说这个“的”紧挨着敌人的名字,

东门度恭的头部
东门度恭的后背
东门度恭的脚跟
东门度恭的屁股
……

大家能想象出来了吧?这是有人在揍目标敌人,管它是谁在揍,反正不是我,乐得看热闹就好了!

所以符合这些条件的语句,不做判断,跳过执行!
门派:明教
 楼主| 发表于 2019-1-31 23:02:36 | 显示全部楼层
2.对护镖中伙伴出招的识别!

        if job.name=='hubiao' and (string.find(w[2],tostring(partner)) or string.find(w[2],tostring(zbt_name)) or string.find(w[2],"镖师")) then
                return
        end

就需要这么一句就行了,如果是护镖任务,并且前半截语句发现partner的名字,发现zbt_name(总镖头的名字),发现“镖师”,说明这是我方友军在出招,这样的语句不做判断,直接返回。

如果是pk的话,碰到对手正在做任务,正和npc打得火热,那么我们用抓“的”字眼的方式,也不会对npc向pker出招的语句做判断。

原理清楚了,操作其实很简单!
门派:明教
 楼主| 发表于 2019-1-31 23:06:17 | 显示全部楼层
3.对pk状态下,玉箫剑法属性的识别!

这个有点儿复杂,用箫为险,用剑为妙,分为两种情况——

1.对手的武器是灵器或者神器,可以变形的。
2.对手拿了两把武器,一把是箫,一把是剑,不时切换的。

应对如下——

  if job.name == 'pk' then
    if string.find(w[3],"箫形") then
       flag.yuxiao=true
           flag.ushape=true
    end
        if string.find(w[3],"剑形") then
       flag.yuxiao=false
           flag.ushape=true
    end
        if flag.ushape==false then
           if string.find(w[3],"箫向") or
          string.find(w[3],"箫斜") or
          string.find(w[3],"箫轻") or
          string.find(w[3],"箫虚") or
          string.find(w[3],"箫蓦") then
                  flag.yuxiao=true
           end
           if string.find(w[3],"剑向") or
          string.find(w[3],"剑斜") or
          string.find(w[3],"剑轻") or
          string.find(w[3],"剑虚") or
          string.find(w[3],"剑蓦") then
                  flag.yuxiao=false
           end
        end
  end
门派:明教
 楼主| 发表于 2019-1-31 23:10:39 | 显示全部楼层
然后,

function kezhiwugongValue(kzValue,i,kezhiwugongName)
        local tflag=true
    if flag.yuxiao and kezhiwugongName=='玉箫剑法' then kzValue='险' end

如果flag.yuxiao为true,说明或者化形为玉箫,或者使用了箫形武器,第二个条件是武功识别为“玉箫剑法”,只要满足这两个条件就强制设为“险”属性,其余则为“妙”属性。
门派:古墓派
发表于 2019-1-31 23:11:05 | 显示全部楼层
护镖的话,npc打同伙的时候怎么能识别npc武功呢?
门派:明教
 楼主| 发表于 2019-1-31 23:17:21 | 显示全部楼层
joyce@tj 发表于 2019-1-31 23:11
护镖的话,npc打同伙的时候怎么能识别npc武功呢?

npc打谁不重要,只要他出招就会识别!

http://www.sjever.net/bbs/forum.php?mod=viewthread&tid=222002

我看了一下这个护镖测试的log,npc敌人打伙伴的语句没有显示,显示的只是npc打你,以及同伴打npc的出招。

而所有出招都是!叹号结尾的句式,所以只要是有npc敌人名字,并且!叹号结尾的句式,统统都会抓取下来,一个都不会错过的。
门派:明教
 楼主| 发表于 2019-1-31 23:23:49 | 显示全部楼层
4.对五虎断门刀和空明拳的识别!

现有的五虎断门刀和空明拳在pk状态下都是quest武功,这就意味着它不是真正的“正”属性和“空”属性,如果因为对手用了五虎和空明拳pfm,我们的克制模块跟着来回变招,那势必手忙脚乱,影响合气的积攒。

应对其实也很简单——

function kezhiwugongValue(kzValue,i,kezhiwugongName)
        local tflag=true
    if flag.yuxiao==true and kezhiwugongName=='玉箫剑法' then kzValue='险' end
                if npc_kezhi==kzValue then
                   kflag=2
                   if flag.busy then
                          flag.busy=false
                          print('忙状态,再激发!')
                   else
              tflag=false
                      print('敌不变,我不变!')
                   end
                end
        if tflag then
                if kezhiwugongName~='五虎断门刀' then
                   if (job.name=='diemenglou' or job.name=='pk') and kezhiwugongName=='空明拳' then
              print('假空属性,不变招!')
                   else       
                      table.remove(npc_kezhi,i,kzValue)
                      table.insert(npc_kezhi,i,kzValue)                          
                      kezhiwugongsuccess(kzValue,kezhi_order[kzValue],i)
                   end
                end
        end
    --if npc_wugong~=kezhiwugongName then       
            table.remove(npc_wugong,i,kezhiwugongName)
            table.insert(npc_wugong,i,kezhiwugongName)
                --print("npc_wugong="..npc_wugong)
        --end
        ColourNote ("red","blue",npc_name.."使用武功【"..kezhiwugongName.."】,武功属性:"..kzValue)
end

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|书剑永恒MUD ( 闽ICP备14012032号|闽公网安备 35050202000162号 )

GMT+8, 2025-6-8 23:56 , Processed in 0.032433 second(s), 28 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表