找回密码
 点一下
查看: 3425|回复: 58

JASS中一未知BUG(传说中由RPWT引发的BUG)

  [复制链接]
发表于 2008-1-21 00:05:15 | 显示全部楼层 |阅读模式
今天发布电子书,征集书中的BUG;随后有朋友给我消息,说Return Bug+GameCache的应用(一)中,老狼的代码加入图中会导致崩溃,于是,我看了下这段代码:

[codes=jass]
function H2I takes handle h returns integer
    return h
    return 0

endfunction

function I2TC takes integer i returns triggercondition
    return i
    return null
endfunction

function I2TG takes integer i returns trigger
    return i
    return null
endfunction

function DestroyTriggerAllById takes integer t returns nothing   
         call TriggerRemoveCondition(I2TG(t),I2TC(GetStoredInteger (udg_GC,I2S(t),"TriggerCondition")))
         call DestroyTrigger(I2TG(t))
         call FlushStoredMission(udg_GC,I2S(t))
endfunction

function DestroyTriggerAll takes trigger trg returns nothing
         call TriggerRemoveCondition(trg,I2TC(GetStoredInteger(udg_GC,I2S(H2I(trg)),"TriggerCondition")))
         call DestroyTrigger(trg)
         call FlushStoredMission(udg_GC,I2S(H2I(trg)))
endfunction
//========================================================
function RegisterUnitAmortCond takes nothing returns nothing
            call SetUnitInvulnerable(GetTriggerUnit(), true)
            call DestroyTriggerAll(GetTriggeringTrigger())
endfunction

function RegisterUnitAmortEvent takes unit witchUnit returns nothing
         local trigger trg = CreateTrigger()
         call TriggerRegisterUnitStateEvent(trg, witchUnit, UNIT_STATE_LIFE, LESS_THAN_OR_EQUAL, 50)
         call StoreInteger(udg_GC,I2S(H2I(trg)),"TriggerCondition",H2I (TriggerAddCondition(trg,Condition(function RegisterUnitAmortCond))))
         set trg = null
endfunction[/codes]

这段代码横看竖看都没问题,于是我把它加进地图,果然,弹出来了.于是我暂时把代码中的条件换成了动作
[codes=jass]
function H2I takes handle h returns integer
    return h
    return 0

endfunction

function I2TA takes integer i returns triggeraction
    return i
    return null
endfunction

function I2TG takes integer i returns trigger
    return i
    return null
endfunction

function DestroyTriggerAllById takes integer t returns nothing   
         call TriggerRemoveAction(I2TG(t),I2TA(GetStoredInteger (udg_GC,I2S(t),"Triggeraction")))
         call DestroyTrigger(I2TG(t))
         call FlushStoredMission(udg_GC,I2S(t))
endfunction

function DestroyTriggerAll takes trigger trg returns nothing
         call TriggerRemoveAction(trg,I2TA(GetStoredInteger(udg_GC,I2S(H2I(trg)),"Triggeraction")))
         call DestroyTrigger(trg)
         call FlushStoredMission(udg_GC,I2S(H2I(trg)))
endfunction
//========================================================
function RegisterUnitAmortAction takes nothing returns nothing
            call SetUnitInvulnerable(GetTriggerUnit(), true)
            call DestroyTriggerAll(GetTriggeringTrigger())
endfunction

function RegisterUnitAmortEvent takes unit witchUnit returns nothing
         local trigger trg = CreateTrigger()
         call TriggerRegisterUnitStateEvent(trg, witchUnit, UNIT_STATE_LIFE, LESS_THAN_OR_EQUAL, 50)
         call StoreInteger(udg_GC,I2S(H2I(trg)),"Triggeraction",H2I (TriggerAddAction(trg,function RegisterUnitAmortAction)))
         set trg = null
endfunction[/codes]

运行下,没有问题;因此朋友交给我的任务完成了.不过为何用动作没有问题,而用条件会弹出游戏呢.经过尝试,发现个非常有趣的BUG,大家看这行代码

[codes=jass]
function H2I takes handle h returns integer
    return h
    return 0

endfunction

function I2TC takes integer i returns triggercondition
    return i
    return null
endfunction

function I2TG takes integer i returns trigger
    return i
    return null
endfunction



function DestroyTriggerAllById takes integer t returns nothing   
         call TriggerRemoveCondition(I2TG(t),I2TC(GetStoredInteger (udg_GC,I2S(t),"TriggerCondition")))
         call DestroyTrigger(I2TG(t))
         call FlushStoredMission(udg_GC,I2S(t))
endfunction

function DestroyTriggerAll takes trigger trg returns nothing
         call TriggerRemoveCondition(trg,I2TC(GetStoredInteger(udg_GC,I2S(H2I(trg)),"TriggerCondition")))
         call DestroyTrigger(trg)
         call FlushStoredMission(udg_GC,I2S(H2I(trg)))
         call BJDebugMsg(I2S(0))
endfunction
//========================================================
function RegisterUnitAmortCond takes nothing returns  nothing                  
            call SetUnitInvulnerable(GetTriggerUnit(), true)
            call DestroyTriggerAll(GetTriggeringTrigger())                  
endfunction

function RegisterUnitAmortEvent takes unit witchUnit returns nothing
         local trigger trg = CreateTrigger()
         call TriggerRegisterUnitStateEvent(trg, witchUnit, UNIT_STATE_LIFE, LESS_THAN_OR_EQUAL, 50)
         call StoreInteger(udg_GC,I2S(H2I(trg)),"TriggerCondition",H2I (TriggerAddCondition(trg,Condition(function RegisterUnitAmortCond))))
         set trg = null
endfunction[/codes]

大家看这段代码有什么不同,无非是加了段call BJDebugMsg(I2S(0)),这个纠错函数,其实就是显示个字符在屏幕上,并不会影响程序运行,但不可思议的事发生了,这段代码加入后,游戏不会弹出了.

或许你还没明白我在说什么,我想说的是,将一个语法上百分百没有错误的代码,加入到地图后百分百会弹出,但加了个百分百没有用的call BJDebugMsg(I2S(0))后,游戏就不会出错.

是不是一个很有趣的BUG~

放上演示,大家不妨试试,去掉代码中的call BJDebugMsg(I2S(0)),就会弹出游戏.

未知BUG.w3x

18 KB, 下载次数: 22

 楼主| 发表于 2008-1-21 00:06:07 | 显示全部楼层
下面是记者对本人的采访,记者简称J,由于我外号叫SB,以下简称B

J:请问YD男,你这个发现有什么重大意义?
B(血泪控诉):我以前做的地图经常弹出,但总找不到原因;不止我,很多朋友都是这样.关于地图为什么会弹出,我们怎么也找不出原因,只要把其归结为RP问题.那么,现在大家看上面老狼的代码,没有错误,可加到地图就是会弹出;而我们加了个完全没用的函数后,程序又奇迹般运行正常了.

J:你的意思是,地图弹出,很可能是war3本身的BUG,而不是WEer的疏忽?
B(气愤):对,为此我还背负很多不白之冤枉;凑巧的是,我刚刚在月协群里说我发现了一个有趣的BUG,还没说是什么,就有下面这段聊记录
BUG.jpg
你说,能不替广大无辜的WEer讨回公道吗!

J:恩,你这发现是很有意义,那么你为何不把这BUG研究透彻,再公布你的发现呢?
B:我向来是很务实的人,不喜欢去钻牛角尖;再说现在很忙,这个BUG留给其他人去研究吧.

J:好的,谢谢YD男,你还有什么要给大家说的吗?
B:有,那个经常拿BUG冤枉我的独来独往,就是我先前发布教程时说的那个特别笨的月协干部!!
回复

使用道具 举报

发表于 2008-1-21 09:44:46 | 显示全部楼层
谢谢everguo大大了...
以后我还是乖乖的用动作来做吧...
回复

使用道具 举报

发表于 2008-1-21 18:37:51 | 显示全部楼层
对此我彻底无语了...
回复

使用道具 举报

 楼主| 发表于 2008-1-21 19:02:09 | 显示全部楼层
将函数放入条件中执行,的确能提高速率,但并不是所有内容都能加入到条件里,比如等待语句

根据hackwaly所说,在条件里使用Get语句里,有时候会失败

不管是什么原因造成这帖中出现的BUG,大家以后不必刻意把函数放条件里

另,希望老狼或其他高手能找出造成这BUG的原因,或许这BUG是造成很多地图弹出的元凶
回复

使用道具 举报

发表于 2008-1-21 19:10:23 | 显示全部楼层
call FlushStoredMission(udg_GC,I2S(H2I(trg)))
             call TriggerRemoveCondition(trg,I2TC(GetStoredInteger(udg_GC,I2S(H2I(trg)),"TriggerCondition")))
             call DestroyTrigger(trg)
            
楼主把顺序调换一下试试,因为我并没有时间去了解这个地图是怎么运作的。
我个人认为也许H2I之前,因为被destroy了,所以会出现莫明的东西。
当然,这仅仅是个人猜测。
回复

使用道具 举报

 楼主| 发表于 2008-1-21 22:10:18 | 显示全部楼层
这个BUG最神奇的地方在于    在加了条毫无用处的call BJDebugMsg(I2S(0))       就会运行正常

另外    LS的代码存在泄露     在call FlushStoredMission(udg_GC,I2S(H2I(trg))) 后    GetStoredInteger(udg_GC,I2S(H2I(trg)),"TriggerCondition")得到的是空值     因此不能清除触发器条件

而且    如果把条件换成动作    程序也会运行正常     照这样推断     这BUG与条件有关     至于为何加句call BJDebugMsg(I2S(0))      就能解决问题    那就不知道了     

我有图要做   没法去做更多测试    召唤有爱心的闲人

如果能了解其弹出原因   说不定以后会做出这样的技能——“让一个玩家的游戏崩溃”
回复

使用道具 举报

发表于 2008-1-21 22:14:37 | 显示全部楼层
。。。我昨天还因为RP问题……连自己做的模型导入到地图都显示不出……
回复

使用道具 举报

 楼主| 发表于 2008-1-21 22:23:22 | 显示全部楼层
显示不出有啥    做个让游戏崩溃的模型才是真本事
回复

使用道具 举报

发表于 2008-1-21 22:29:28 | 显示全部楼层
那简单……但很下流……
回复

使用道具 举报

发表于 2008-1-21 23:18:14 | 显示全部楼层
hmm。好吧。我只是简单的说明一下这样做。
如果楼主不能理解。那么:

local string trgId = I2S(H2I(trg))
call FlushStoredMission(udg_GC, trgId)
call TriggerRemoveCondition(trg,I2TC(GetStoredInteger(udg_GC, trgId,"TriggerCondition")))
call DestroyTrigger(trg)

当然,如果这样还是不行。表示与此无关。嗯嗯。
回复

使用道具 举报

 楼主| 发表于 2008-1-22 02:57:15 | 显示全部楼层
其实你没看明白我的意思   我是想知道为何加入一个没用的call BJDebugMsg(I2S(0)) 能阻止程序崩溃

要解决这BUG的方法太多了   我只想了解为何会产生这BUG

另外  我说过时间紧  不会去测试这BUG  因此LS如果有想法  自己动下手罢
回复

使用道具 举报

发表于 2008-1-22 11:38:54 | 显示全部楼层
hmm。居然没仔细看。

其实WE中有非常多的问题都是RP。嗯嗯。
回复

使用道具 举报

发表于 2008-1-22 16:09:20 | 显示全部楼层
我喜欢BUG。。越难的我越喜欢 不过LZ的BUG我爱莫能助啊
回复

使用道具 举报

发表于 2008-1-22 17:47:25 | 显示全部楼层
我看不懂. 〔很正常.〕
回复

使用道具 举报

发表于 2008-1-23 08:03:44 | 显示全部楼层
此bug严重打击了偶的积极性,于是完全抹杀了我对WE的羁绊~~
回复

使用道具 举报

发表于 2008-1-23 11:09:15 | 显示全部楼层
嗯嗯。你继续瞌睡吧。。。
回复

使用道具 举报

 楼主| 发表于 2008-1-23 13:38:59 | 显示全部楼层
GA的研究精神哪去了   本以为放上来会引起大家的兴趣而热烈讨论的说

那么   请个E文好的同学发去wc3c吧   那里的人或许能给个答复
回复

使用道具 举报

发表于 2008-1-23 14:06:48 | 显示全部楼层
引用第18楼938于2008-01-23 13:38发表的  :
GA的研究精神哪去了   本以为放上来会引起大家的兴趣而热烈讨论的说

那么   请个E文好的同学发去wc3c吧   那里的人或许能给个答复
你以为是几年前吗
回复

使用道具 举报

发表于 2008-1-23 14:13:51 | 显示全部楼层
楼主,如果每个人都能像您这么有空,每个人吃饭都不用花钱,每个人都能把WAR3的问题解决。
那么BLZ就不用出补丁,不用做游戏了。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-1 19:20 , Processed in 0.148785 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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