找回密码
 点一下
查看: 2702|回复: 25

关于生命值事件的诡异(测试,那个bug的录像和保存都上传了。找人测试)

[复制链接]
发表于 2010-6-21 22:35:31 | 显示全部楼层 |阅读模式
现在已经确定(经本人测试,我原本的那个触发会导致以下问题)这样的,当指定单位生命值降低为或小于原来的50%,动作为增加技能‘战鼓’给触发单位,我用J写的,可以临时创建一个触发,触发事件是当触发单位(这里的触发单位就是那个加了技能的单位)生命大于50%的时候,动作为删除技能‘战鼓’对触发单位(这个触发单位是临时触发的触发单位),然后破坏掉这个临时触发。
这样运行游戏的时候自己把单位砍掉一半血,单位就立刻有了‘战鼓’技能,然后去补血,生命大于50%的时候技能就被删除掉了,这样看似目的已经达到了,但是一波怪刷了下来,我的几个单位打着打着打完了,许多都半血一下,都有了‘战鼓’这个技能,但是回到血池补血的时候有部分单位仍然拥有‘战鼓’技能,多番尝试均找不到原因,望jass高手教教小弟
猪头君给的触发不会出现上述问题,但是退出的时候或者正在进行游戏的时候试过弹错,但是也不是十分肯定,因为那时用了技能,所以请人测试,看看猪头君给的触发会不会导致弹错)把下面猪头君的触发方案2(方案2的顶部函数忘了返回false,要自己加上,不然报错)复制上去然后测试看看有问题是否还在。。。。。。。由于是rp问题,自己一个人测试还不太好。。。。。最好测试原来的图是否有我上述的现象,我没有说谎,的确存在。。。。。如果没了就算我rp不好了。。。

紫川.rar

1.72 MB, 下载次数: 3

发表于 2010-6-21 22:41:46 | 显示全部楼层
你可以把触发贴出来看下
回复

使用道具 举报

 楼主| 发表于 2010-6-21 23:26:07 | 显示全部楼层
function knightattackdown takes nothing returns boolean
call UnitRemoveAbility(GetTriggerUnit(),'Aakb')//删除技能‘战鼓’
call DestroyTrigger(GetTriggeringTrigger())//破坏临时的触发器
return false
endfunction
function knightattackup takes nothing returns boolean
local trigger trg=CreateTrigger()这里新创建触发,就是每个单位血少于50%的时候就加‘战鼓’技能,并且建立触发
call TriggerRegisterUnitLifeEvent(trg,GetTriggerUnit(), GREATER_THAN,GetUnitState(GetTriggerUnit(),UNIT_STATE_MAX_LIFE)*0.5)//为触发建立了生命大于50%的事件。
call TriggerAddCondition(trg,Condition(function knightattackdown))//事件的动作(条件)
call UnitAddAbility(GetTriggerUnit(),'Aakb')
return false
endfunction

function xiuziyin takes nothing returns boolean//这个是某个技能引发的触发,只运行一遍就删除了这个触发
local unit me=GetTriggerUnit()
local trigger trg=GetTriggeringTrigger()
local unit knight
local integer i=0
local real life
local trigger trglife
loop
exitwhen i>5
set knight =CreateUnit(GetOwningPlayer(me),'hkni',GetUnitX(me),GetUnitY(me),0)
set trglife=CreateTrigger()
call TriggerRegisterUnitLifeEvent(trglife,knight,LESS_THAN_OR_EQUAL, GetUnitState(knight,UNIT_STATE_MAX_LIFE)*0.5)//*这里给刚刚创建的骑士注册生命值小于或等于50%的事件。
call TriggerAddCondition(trglife,Condition(function knightattackup))//这里是触发动作,加技能‘战鼓’
set i=i+1
endloop
set me=null
set knight=null
call DestroyTrigger(trg)
set trg=null
return false
endfunction

[s:166]

----------- 帖子于 23:16 更新 --------- 之前内容发布于 22:53 ------------

哎,特殊状况了,纳闷……

----------- 帖子于 23:26 更新 --------- 之前内容发布于 23:16 ------------

版主如果qq好友没有爆满的话可以加我q吗?我做的地图已经到了最关键的时候,我经常有非常诡异的问题,我学jass也一个多月了,不会问些很无聊的问题的。qq:1023530273。我不是叫你收徒,我知道每个人都不喜欢收徒……我也知道不大可能得来个免费顾问……也知道可能会一秒内爆满当然,也可以选择无视这段玩意,能解决我这个问提重要。。。
回复

使用道具 举报

发表于 2010-6-21 23:26:52 | 显示全部楼层
-.-  看错了

看起来是没什么问题
回复

使用道具 举报

 楼主| 发表于 2010-6-22 00:09:01 | 显示全部楼层
你们看,加了技能‘战鼓’的话就一定是注册了单位生命大于百分之50后删除技能的事件,单位为什么有的单位居然没有把技能删除呢,这就说明了加了技能后出发没有被注册,但是我在单位加技能之前就注册了,诡异,十分诡异。

----------- 帖子于 00:09 更新 --------- 之前内容发布于 00:06 ------------

大神小神们都来看看啦,走过路过千万别错过,看看出了什么问题那。。。。。
回复

使用道具 举报

发表于 2010-6-22 00:18:16 | 显示全部楼层
你把删除“战鼓”技能的条件改成55%看看
回复

使用道具 举报

 楼主| 发表于 2010-6-22 01:50:23 | 显示全部楼层
楼上的方法用了,不行,逻辑上不合理,实际上也是不行,我也考虑过是不是技能加了两次的问题,但是结果是即使技能加了两次,删除的时候删除一次就可以了,但是技能加两次的情况就只有把删除‘战鼓’技能的生命调到50以上。但是回到我的问题,即使使用了你的方法有的骑士扣血后加满了,‘战鼓’技能仍然没有删除。而且这个触发可能会在游戏退出后弹出‘FATAl
ERROR’。。。
回复

使用道具 举报

发表于 2010-6-22 13:23:18 | 显示全部楼层
嗯,按情况来说的话就是:即使添加了多次也会一次删除。

我想调高的目地就是看看是否是在注册触发前血量就已经回到的50%以上,那么既然不是这样的情况,你是否可以试试用计时器来做呢,配合单位组的话每1秒计算一下血量应该是没有问题的。
回复

使用道具 举报

 楼主| 发表于 2010-6-22 16:01:17 | 显示全部楼层
每秒啊。。。。这样不好。。。。。对游戏负荷会增加,肯定比不上用触发。。。话说我上面的Trigger貌似完全没逻辑上的问题。。。但是。。。。
回复

使用道具 举报

发表于 2010-6-22 16:15:27 | 显示全部楼层
显然这个是每XX时间来的好,因为如果直接注册生命事件,生命最大值改变的话你的触发临界值是不会变的
回复

使用道具 举报

发表于 2010-6-22 17:00:41 | 显示全部楼层
关于对游戏的负担,这个绝对不重,完全没有问题,你可以试一试。

关于这个bug呢,请你把存在bug的图给上传个吧,我试着排查下。

----------- 帖子于 17:00 更新 --------- 之前内容发布于 16:45 ------------

不然的话试下这样吧,因为单位的生命值变化事件只会在生命越过限定值的时候触发,那么你试试在创建单位的时候把添加和删除技能的触发都给做出来试试看效果是如何的。
回复

使用道具 举报

 楼主| 发表于 2010-6-22 21:35:29 | 显示全部楼层
进里面选择紫川秀这个英雄然后召唤出骑士每一百秒会有兵刷过来,记住召唤出来的骑士别让他们死了,多点让骑士扣一半血,加了技能后,回到血泉加血,然后打着打着,就会出现一些骑士在加血后不会删除那个‘战鼓’技能。地图修改了点点,由于没有加密,所以删了绝大部分的东西,希望ls别见怪。。。。
最后就是,召唤的骑士别再召唤了,因为再召唤出来的骑士虽然和原来的血一样,但其实是新的了。还有这个无法删除技能是经过几波怪后才出现的。。怪太强的话就一开始就把基地打爆掉,他们就不会来了,于是你想扣血的话直接冲上去上面刷兵的地方,然后回来血池加血就可以了,这个bug是偶然的所以要耐心


额。我还要回复版主,只要我不改变骑士的生命最大值就可以了。。。

紫川.rar

445 KB, 下载次数: 15

回复

使用道具 举报

发表于 2010-6-22 21:47:22 | 显示全部楼层
附件:  紫川.rar (445 K) 下载次数:0


0.0 紫川 好熟悉
回复

使用道具 举报

发表于 2010-6-22 22:04:24 | 显示全部楼层
好像是一本小说
回复

使用道具 举报

发表于 2010-6-22 22:11:48 | 显示全部楼层
老猪的小说,经过了8年的长坑后终于完本……
阿秀啊……我要洗月刀喵
回复

使用道具 举报

发表于 2010-6-22 22:14:24 | 显示全部楼层
资料 上说是2010年出版
回复

使用道具 举报

发表于 2010-6-22 22:47:47 | 显示全部楼层
[codes=jass]function knightattackdown takes nothing returns boolean
    call UnitRemoveAbility(GetTriggerUnit(),'Aakb')
    //call DestroyTrigger(GetTriggeringTrigger())
    return false
endfunction
function knightattackup takes nothing returns boolean
    //local trigger trg=CreateTrigger()
    //call TriggerRegisterUnitLifeEvent(trg,GetTriggerUnit(), GREATER_THAN,GetUnitState(GetTriggerUnit(),UNIT_STATE_MAX_LIFE)*0.52)
    //call TriggerAddCondition(trg,Condition(function knightattackdown))
    call UnitAddAbility(GetTriggerUnit(),'Aakb')
    //call SaveTriggerHandle(udg_HT[2],GetHandleId(GetTriggerUnit()),StringHash("trg"),trg)
    return false
endfunction
function Trig_knight_Condition takes nothing returns boolean
    if GetSpellAbilityId()=='A00F' then
        return true
    else
        return false
    endif
endfunction
function xiuziyin takes nothing returns boolean
    local unit me=GetTriggerUnit()
    local trigger trg=GetTriggeringTrigger()
    local unit knight
    local integer i=0
    local real life
    local trigger trglife
    local integer a=LoadInteger(udg_HT[2],GetHandleId(udg_company),StringHash("knightlifeboolean"))
    loop
        exitwhen i>5
        set knight =CreateUnit(GetOwningPlayer(me),'hkni',GetUnitX(me),GetUnitY(me),0)
        set trglife=CreateTrigger()
        call TriggerRegisterUnitLifeEvent(trglife,knight,LESS_THAN_OR_EQUAL, GetUnitState(knight,UNIT_STATE_MAX_LIFE)*0.5)
        call TriggerAddCondition(trglife,Condition(function knightattackup))
        call SaveTriggerHandle(udg_HT[2],GetHandleId(knight),StringHash("trglifeup"),trglife)
        set trglife=CreateTrigger()
        call TriggerRegisterUnitLifeEvent(trglife,knight,GREATER_THAN, GetUnitState(knight,UNIT_STATE_MAX_LIFE)*0.5)
        call TriggerAddCondition(trglife,Condition(function knightattackdown))
        call SaveTriggerHandle(udg_HT[2],GetHandleId(knight),StringHash("trglifedown"),trglife)
        call AddSpecialEffect("Abilities\\\\Spells\\\\Orc\\\\FeralSpirit\\\\feralspiritdone.mdl",GetUnitX(knight),GetUnitY(knight))
        call SaveUnitHandle(udg_HT[2],StringHash("knight"+I2S(i)),StringHash("knight"),knight)
        if a!=0 then
            set life=LoadReal(udg_HT[2],StringHash("knightlife"+I2S(i)),StringHash("knight"))
            call FlushChildHashtable(udg_HT[2],StringHash("knightlife"+I2S(i)))
            call DisplayTimedTextToForce(udg_players,2,R2S(life))
            if life==0 then
                set life=1
            endif
            call SetUnitLifePercentBJ(knight,life)
        endif
        set i=i+1
    endloop
    set a=1
    call SaveInteger(udg_HT[2],GetHandleId(udg_company),StringHash("knightlifeboolean"),a)
    set me=null
    set knight=null
    call DestroyTrigger(trg)
    set trg=null
    return false
endfunction

function Trig_knight_Actions takes nothing returns nothing
    local unit me=GetTriggerUnit()
    local real angle=GetUnitFacing(me)*bj_PI/180
    local unit knight1
    local integer i=0
    local real life
    local integer a=LoadInteger(udg_HT[2],GetHandleId(udg_company),StringHash("knight"))+2
    local trigger trg
    loop
        exitwhen i>5
        set knight1=LoadUnitHandle(udg_HT[2],StringHash("knight"+I2S(i)),StringHash("knight"))
        call FlushChildHashtable(udg_HT[2],StringHash("knight"+I2S(i)))
        if knight1!=null then
            call AddSpecialEffect("Abilities\\\\Spells\\\\Orc\\\\FeralSpirit\\\\feralspiritdone.mdl",GetUnitX(knight1),GetUnitY(knight1))
            set life=GetUnitLifePercent(knight1)
            //call DisplayTimedTextToForce(udg_players,2,I2S(GetHandleId(LoadTriggerHandle(udg_HT[2],GetHandleId(knight1),StringHash("trg")))))
            call SaveReal(udg_HT[2],StringHash("knightlife"+I2S(i)),StringHash("knight"),life)
            //call DestroyTrigger(LoadTriggerHandle(udg_HT[2],GetHandleId(knight1),StringHash("trg")))
            call DestroyTrigger(LoadTriggerHandle(udg_HT[2],GetHandleId(knight1),StringHash("trglifeup")))
            call DestroyTrigger(LoadTriggerHandle(udg_HT[2],GetHandleId(knight1),StringHash("trglifedown")))
            call FlushChildHashtable(udg_HT[2],GetHandleId(knight1))
            call RemoveUnit(knight1)
        endif
        set i=i+1
    endloop
    if ModuloInteger(a,2)==0 then
        set trg=CreateTrigger()
        call TriggerRegisterUnitEvent(trg,me,EVENT_UNIT_SPELL_FINISH)
        call TriggerAddCondition(trg,Condition(function xiuziyin))
    endif
    set a=a+1
    if a==10 then
        set a=2
    endif
    call SaveInteger(udg_HT[2],GetHandleId(udg_company),StringHash("knight"),a)
endfunction

//===========================================================================
function InitTrig_knight takes nothing returns nothing
    set gg_trg_knight = CreateTrigger(  )
    call TriggerRegisterUnitEvent( gg_trg_knight, gg_unit_Hblm_0002, EVENT_UNIT_SPELL_EFFECT )
    call TriggerAddCondition(gg_trg_knight,Condition(function Trig_knight_Condition))
    call TriggerAddAction( gg_trg_knight, function Trig_knight_Actions )
endfunction[/codes]
以上为方案1,2个触发在一开始就注册,最后一起删除
回复

使用道具 举报

发表于 2010-6-22 22:59:27 | 显示全部楼层
[codes=jass]function knightattackuphelper takes nothing returns boolean
    call ExecuteFunc("knightattackup")
endfunction
function knightattackdown takes nothing returns boolean
    local trigger trg=CreateTrigger()
    call TriggerRegisterUnitLifeEvent(trg,GetTriggerUnit(), LESS_THAN_OR_EQUAL,GetUnitState(GetTriggerUnit(),UNIT_STATE_MAX_LIFE)*0.52)
    call TriggerAddCondition(trg,Condition(function knightattackuphelper))
    call UnitRemoveAbility(GetTriggerUnit(),'Aakb')
    call DestroyTrigger(GetTriggeringTrigger())
    call SaveTriggerHandle(udg_HT[2],GetHandleId(GetTriggerUnit()),StringHash("trglife"),trg)
    set trg = null
    return false
endfunction
function knightattackup takes nothing returns boolean
    local trigger trg=CreateTrigger()
    call TriggerRegisterUnitLifeEvent(trg,GetTriggerUnit(), GREATER_THAN,GetUnitState(GetTriggerUnit(),UNIT_STATE_MAX_LIFE)*0.52)
    call TriggerAddCondition(trg,Condition(function knightattackdown))
    call UnitAddAbility(GetTriggerUnit(),'Aakb')
    call DestroyTrigger(GetTriggeringTrigger())
    call SaveTriggerHandle(udg_HT[2],GetHandleId(GetTriggerUnit()),StringHash("trglife"),trg)
    set trg = null
    return false
endfunction
function Trig_knight_Condition takes nothing returns boolean
    if GetSpellAbilityId()=='A00F' then
        return true
    else
        return false
    endif
endfunction
function xiuziyin takes nothing returns boolean
    local unit me=GetTriggerUnit()
    local trigger trg=GetTriggeringTrigger()
    local unit knight
    local integer i=0
    local real life
    local trigger trglife
    local integer a=LoadInteger(udg_HT[2],GetHandleId(udg_company),StringHash("knightlifeboolean"))
    loop
        exitwhen i>5
        set knight =CreateUnit(GetOwningPlayer(me),'hkni',GetUnitX(me),GetUnitY(me),0)
        set trglife=CreateTrigger()
        call TriggerRegisterUnitLifeEvent(trglife,knight,LESS_THAN_OR_EQUAL, GetUnitState(knight,UNIT_STATE_MAX_LIFE)*0.5)
        call TriggerAddCondition(trglife,Condition(function knightattackup))
        call SaveTriggerHandle(udg_HT[2],GetHandleId(knight),StringHash("trglife"),trglife)
        call AddSpecialEffect("Abilities\\\\Spells\\\\Orc\\\\FeralSpirit\\\\feralspiritdone.mdl",GetUnitX(knight),GetUnitY(knight))
        call SaveUnitHandle(udg_HT[2],StringHash("knight"+I2S(i)),StringHash("knight"),knight)
        if a!=0 then
            set life=LoadReal(udg_HT[2],StringHash("knightlife"+I2S(i)),StringHash("knight"))
            call FlushChildHashtable(udg_HT[2],StringHash("knightlife"+I2S(i)))
            call DisplayTimedTextToForce(udg_players,2,R2S(life))
            if life==0 then
                set life=1
            endif
            call SetUnitLifePercentBJ(knight,life)
        endif
        set i=i+1
    endloop
    set a=1
    call SaveInteger(udg_HT[2],GetHandleId(udg_company),StringHash("knightlifeboolean"),a)
    set me=null
    set knight=null
    call DestroyTrigger(trg)
    set trg=null
    return false
endfunction

function Trig_knight_Actions takes nothing returns nothing
    local unit me=GetTriggerUnit()
    local real angle=GetUnitFacing(me)*bj_PI/180
    local unit knight1
    local integer i=0
    local real life
    local integer a=LoadInteger(udg_HT[2],GetHandleId(udg_company),StringHash("knight"))+2
    local trigger trg
    loop
        exitwhen i>5
        set knight1=LoadUnitHandle(udg_HT[2],StringHash("knight"+I2S(i)),StringHash("knight"))
        call FlushChildHashtable(udg_HT[2],StringHash("knight"+I2S(i)))
        if knight1!=null then
            call AddSpecialEffect("Abilities\\\\Spells\\\\Orc\\\\FeralSpirit\\\\feralspiritdone.mdl",GetUnitX(knight1),GetUnitY(knight1))
            set life=GetUnitLifePercent(knight1)
            //call DisplayTimedTextToForce(udg_players,2,I2S(GetHandleId(LoadTriggerHandle(udg_HT[2],GetHandleId(knight1),StringHash("trg")))))
            call SaveReal(udg_HT[2],StringHash("knightlife"+I2S(i)),StringHash("knight"),life)
            //call DestroyTrigger(LoadTriggerHandle(udg_HT[2],GetHandleId(knight1),StringHash("trg")))
            call DestroyTrigger(LoadTriggerHandle(udg_HT[2],GetHandleId(knight1),StringHash("trglife")))
            call FlushChildHashtable(udg_HT[2],GetHandleId(knight1))
            call RemoveUnit(knight1)
        endif
        set i=i+1
    endloop
    if ModuloInteger(a,2)==0 then
        set trg=CreateTrigger()
        call TriggerRegisterUnitEvent(trg,me,EVENT_UNIT_SPELL_FINISH)
        call TriggerAddCondition(trg,Condition(function xiuziyin))
    endif
    set a=a+1
    if a==10 then
        set a=2
    endif
    call SaveInteger(udg_HT[2],GetHandleId(udg_company),StringHash("knight"),a)
endfunction

//===========================================================================
function InitTrig_knight takes nothing returns nothing
    set gg_trg_knight = CreateTrigger(  )
    call TriggerRegisterUnitEvent( gg_trg_knight, gg_unit_Hblm_0002, EVENT_UNIT_SPELL_EFFECT )
    call TriggerAddCondition(gg_trg_knight,Condition(function Trig_knight_Condition))
    call TriggerAddAction( gg_trg_knight, function Trig_knight_Actions )
endfunction[/codes]

以上为方案2,触发交替创建
回复

使用道具 举报

发表于 2010-6-23 01:28:40 | 显示全部楼层
啊,我上晚了,猪头君已经测试完毕了么?
回复

使用道具 举报

 楼主| 发表于 2010-6-23 02:13:36 | 显示全部楼层
好华丽,方案一那里为同一个触发添加两个事件两个动作我没试过,也不太懂,第二个交替触发创建是比较华丽,但我那个扣血加技能的触发为什么不能留着呢?非要在血加过50%的时候删掉本触发然后再建立低血50%的触发,然后低血50%的时候又删掉本触发,创建血大于50%的触发,呵呵,我不是说版主写的太复杂,我很感激楼主能帮我修改这么长的玩意(我咋看版主发上来的触发长度吓我一跳),我拿回去看看还有没有这个bug,不过我还想知道我的原来那个触发究竟为什么会这样的bug。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-5-3 01:17 , Processed in 0.460755 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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