|
General bugs
http://www.wc3campaigns.net/showthread.php?t=80693
漏写endif和endlopp导致崩溃
对于没有结尾的loop或者if,WE有可能在存盘时崩溃。
出现该情况时(或者WE因为别的原因崩溃),你可以这样来挽救:在地图的目录下找到一个名为<地图名>的临时目录,在里面找到脚本,然后导入到别的地图之中。注意:对
于某些需要地图自动产生的全局变量,这样做本身同样存在问题。
我还是建议使用JassCraft。
无效整数导致存盘时崩溃
无效的整数值,比如原始代码,有可能在WE存盘时导致崩溃。'ÆØpo'就是一个会导致崩溃的例子,'Æ'和'Ø'也同样是不能接受的(兔子:难道有人会在触发里使用这么古怪的代码?)。
调用文件名时使用了单斜线,会在存盘时导致崩溃
无论什么时候,在字符串中使用\\而不是\,单\是用于控制的。程序在使用字符串时会把其中一个\删除。
函数被指定需要返回某值,却没有返回
以上行为会导致存盘时崩溃。
错误被移到下一行
WE有时不能检测一些bugs,也因此其分析器可能会把bug的位置报告低了一行。对这个问题没有解决方案,它只是告诉你编写错误,以及错误的位置,对WE来说,这不是一个
bug,你必须检查错误报告的上一行。这个bug通常在你写错endfunction时发生。
字符串字符数限制
单个字符串的字符数超过860个会造成崩溃。要解决这个问题,使用字符串相连吧。
The return bug
一个著名的,很有用的bug。WE分析器只检查一个函数的最后一个返回值类型是否正确,你可以用此bug来转换对象类型,比如,一个handle转换成一个整数,很传奇的,函数
:
function H2I takes handle h returns integer
return h
return 0
endfunction
这个bug应该说是一种幸运多于是一个bug,因为你可以用它将某些类型存储在其他变量里,给予你很多自由。
[b]”使用return bug时把变量设置成null”-bug
在极少数情况下,设置一个变量(多数是计时器),而这个变量又被你连同return bug一起使用,会产生问题。它看起来像是重设了某对象的handle id。
解决此问题有很多方案:
不要把变量设置成null。这是最容易的方案,但会造成(轻微)内存泄漏。
另建一个函数用于输入这个计时器(或者造成该问题的其他类型)。此时你可以把null值传递给那个函数,也可以在这个函数中将变量作为参数使用,而不需要把它设置成
null。比如:
function X2 takes timer t returns nothing
call DoSomethingWith(t)
call DoSomethingElseWith(t)
endfunction
function X takes nothing returns nothing
call X2(GetExpiredTimer())
endfunction
...
call TimerStart(yourTimer, duration, periodic, function X)
...
最后,你可以使用全局变量来临时储存这个对象。
除非你的脚本里有这个问题,否则我建议你不需要太关心这个bug。
变量使用相同名字会互相覆盖
这个bug很讨厌,你很容易就会碰到。比如,一个参数使用了某名字,然后一个本地变量使用相同的名字。最后声明的变量,也就是本地那个,将会成为唯一可以正确调用的。
这会令你的脚本完全乱套,如果你不清楚这个问题的话。
然而,该bug也可令GUI变得可使用多实例(对于某个级别来说)
某些使用特定系统的用户,自定义脚本有限制
对某些操作系统,自定义脚本是有限制的。如Windows 98和ME,或者其他版本。
解决方法是,另外建立一个触发来放自定义脚本。有个工具能做到这点,也因此你可以用一个地方来存放很多触发。
First Trigger Adder
Windows XP Service Pack 2 vs. Windows XP 没有 SP2
是的,这是真实的,而且可能是最无聊的bug了。
很多东西在这两种系统上显得不一样。我们没有很好的解释。更糟糕的是有时两种系统上的游戏还会导致不同步。
单个%会在地图保存时从自定义脚本移除
这只会发生在自定义脚本区域。解决方案是,使用两个连续的%%,而不是一个。
声音第一次无法播放
在Jass里,某个声音的第一次播部出来。实际上第一次它被“载入”,第二次才正常播放。
Native 相关 bugs
IsUnitType boolexpr bug
IsUnitType(whichUnit, whichUnitType)当单独用在boolexpr时会产生bug,不会返回true或false。
游戏缓存限制
游戏缓存有256个限制。当你有256个缓存存在 campaigns.w3v文件中时,会令你的地图出现问题。
Destroyed 计时器仍然会过期(Expired)
如果在expiration函数以外的函数去destroy计时器,它仍然会过期。解决方法是,在destroy之前,先停下它(PauseTimer)。
SetUnitX 和 SetUnitY 崩溃
如果坐标在地图之外(bj_mapInitialPlayableArea),地图会崩溃。解决方法是别这么干。
在可玩地图区域之外创建单位,导致崩溃
同上。
RestoreUnit 忽略类型保护
该native会忽略返回对象的类型,因此会产生错误(兔子:如不同的两个对象同时附加到同一个对象上时,如果使用了相同的文本标签,那么即使两个附加对象的类型完全不
同,这个native也不会区分,从而导致崩溃。)
GroupEnumUnitsInRectCounted 和 GroupEnumUnitsInRangeCounted
当单位很多的时候,这两个native会出现不正常行为。
在ForForce中调用 ForForce导致问题
比如:
function X3 takes nothing returns nothing
call BJDebugMsg("2")
endfunction
function X2 takes nothing returns nothing
call BJDebugMsg("1")
call ForForce(udg_f, function X3)
call BJDebugMsg("3")
endfunction
function X1 takes nothing returns nothing
call ForceAddPlayer(udg_f, Player(0))
call ForceAddPlayer(udg_f, Player(1))
call ForForce(udg_f, function X2)
endfunction
正确应该显示 1, 2, 2, 3, 1, 2, 2, 3, 但结果却是 1, 2, 2, 3, 2.
GetExpiredTimer()崩溃
有时当没有到期计时器的时候,调用到期计时器会导致讨厌的崩溃。
如果“一个单位死了”事件调用一个触发“开火”,然后触发调用了 GetExpiredTimer(),如果死了的单位属于计算机用户,此时会发生崩溃。相反如果属于玩家,就不会发
生崩溃。 |
|