|
2011年7月15日更新:目前SC2版本1.3.5
列举一下我目前收集到的编辑器中已知但尚未修复的bug。这些bug我都已经提交给玻璃渣了。不过我在这也发一份让大家可以预防这些问题。
触发器和Galaxy:[/table]
设置单位训练进度的函数UnitSetProgressComplete(),当将进度设为100%时会出现问题
这个函数用来设置单位的训练\建造\装填进度,不过直接将进度设为100%会出现许多问题:
1]如果训练技能是像zerg幼虫一样,训练后会杀死原单位的,直接将进度设为100%会导致游戏崩溃。
2]在其余情况下,将进度设为100%会返还这次训练所消耗的所有资源。相当于不用花钱就能造兵。
对话框控件中的“面板(Panel)”控件
当对话框中存在面板控件,且面板控件中包含其余控件时,直接销毁对话框会导致游戏崩溃。
临时解决方法:先销毁对话框中所有控件再销毁对话框。这个bug其实以前就存在并被修复过,但是现在又出现。
EventPlayerEffectUsedUnitOwner()函数的参数问题
[codes=galaxy]native int EventPlayerEffectUsedUnitOwner (int inLocation);[/codes]
EventPlayerEffectUsedUnitOwner()函数函数的inLocation参数理论上可以有8种选择:
[codes=galaxy]
const int c_effectPlayerOrigin = 0;
const int c_effectPlayerCreator = 1;
const int c_effectPlayerCaster = 2;
const int c_effectPlayerOuter = 3;
const int c_effectPlayerSource = 4;
const int c_effectPlayerTarget = 5;
const int c_effectPlayerNeutral = 6;
const int c_effectPlayerHostile = 7;
[/codes]
但这函数实际上只接受0-4这5个值。当传递其余值时会提示参数越界:
Parameter out of bounds in 'EventPlayerEffectUsedUnitOwner' (value: 6, min: 0, max: 4)
EventPlayerEffectUsedAmountFixed()函数返回的最大值为128
[codes=galaxy]native fixed EventPlayerEffectUsedAmountFixed (int inAmount, bool total);[/codes]
EventPlayerEffectUsedAmountFixed()这个函数无法返回任何大于128的值,这意味着这个函数所取得的伤害量治疗量都无法超过128。
临时解决方案:EventPlayerEffectUsedAmountInt()没有这一限制,但是它只能返回整数值。
TerrainShowRegion()函数无视负区域
[codes=galaxy]native void TerrainShowRegion (region inArea, bool inShow);[/codes]
这个函数用来显示\隐藏指定区域内的地形,但它会忽略其中的负区域。
使用CameraInfoSetValue()函数设置镜头对象的Yaw值的问题
[codes=galaxy]native void CameraInfoSetValue (camerainfo c, int type, fixed value);[/codes]
使用CameraInfoSetValue()函数无法将镜头对象的旋转角Yaw(c_cameraValueYaw)设为0-90度以外的任何值。另外CameraInfoSetValue()函数和CameraInfoGetValue()函数对Yaw值的标准不统一——两者相差90度。
·人口变更(supply change)事件
玩家属性变更事件中的的人口变更(supply change)事件,其获得的人口变更数量一直不准,比如你在运输船里塞6个步兵。运输船暴掉后它返回你说只变化了1个单位的人口。所以要记录人口变更的话直接用函数来获得当前总人口然后计算差值好了。直接用函数获取人口变更数量反而会不准。
·UnitGetAttachmentPoint() 函数无效
[codes=galaxy]native point UnitGetAttachmentPoint (unit inUnit, string attachmen);[/codes]
这个函数理论上应该是返回指定单位的指定附着位点的坐标。问题就是它永远返回null。这个函数毫无作用。可能是编辑器开发后期出于想要强制同步galaxy脚本的决定而故意废了它?毕竟附着位点的坐标肯定是不同步的。
·PathingModify()函数无效
[codes=galaxy]native void PathingModify (region inArea, int inType, bool inAdd);[/codes]
这个函数理应可以修改指定区域的通行路径,但毫无作用。这可能是由于SC2开发中途修改过通行路径系统。而这个函数没有跟着更新。如果可以修复的话,对制作随机迷宫可是超方便的。
·UnitInventoryMove()函数运作不正常
[codes=galaxy]native void UnitInventoryMove (unit inItem, int inContainer, int inSlot);[/codes]
这个函数是用来移动英雄身上的物品到指定格子的。它存在GUI版。不过其实它有一个致命问题:如果你某个包包的格子排列不规则,那么它就会出问题。
这里指的不规则是说格子不是一个挨一个的排列。比如模仿WOW角色装备栏的时候,每一行的两个格子的间距就会很大。这时候。是用这个函数会有一个很好笑的bug。
比方说你做了个包包,每行2个格子。2个格子距离空了3格。这时候galaxy会认为你每行有5个格子而不是2个。如果你的包包有4行,也就是实际格子数总共8格的话。你无法用这个函数把物品移动到第二行第1格以后的任何格子。因为Galaxy认为第二行第一格是总计第六个格子,第二行第二格是总计第10个格子,超过了总数8。所以这个函数干脆就不作响应了。
·使用非法的对话框模板来创建元素会导致游戏崩溃
ActorScopeGetText() & ActorGetText() 函数毫无作用
这两个函数理应输出指定演算体或者演算体域的内容,如果有效果的话对Actor学习绝对超有帮助。但是估计玻璃渣突然不想让玩家接触到太多核心内容免得游戏容易被破解吧。
另注:实际上actor中几乎所有dump消息全部没效果。如.("AnimDumpDB", "RefDump", "RefTableDump", "TextureDump" and "TextureDumpDB".) 等等消息。不过1.3.0以后至少把Print消息修正成能用了,这个消息超有用的。做得好,玻璃渣!
·UnitBehaviorHasFlag()函数运作不正常
native bool UnitBehaviorHasFlag (string inBehavior, int inCategory);
这个函数用来返回指定行为是否拥有指定的flag。也有GUI触发器版。这个函数的inCategory参数理论上有11种选择可以填。
[codes=galaxy]
// Behavior categories
const int c_unitBehaviorFlagPermanent = 0;
const int c_unitBehaviorFlagRestorable = 1;
const int c_unitBehaviorFlagTemporary = 2;
// Behavior buff flags
const int c_unitBehaviorFlagChanneled = 3;
const int c_unitBehaviorFlagChanneling = 4;
const int c_unitBehaviorFlagCountdown = 5;
const int c_unitBehaviorFlagExtend = 6;
const int c_unitBehaviorFlagDisableBuilding = 7;
const int c_unitBehaviorFlagRemoveDamageResponseExhausted = 8;
const int c_unitBehaviorFlagRefreshStack = 9;
// Behavior info flags
const int c_unitBehaviorFlagHidden = 10;
// Behavior count
const int c_unitBehaviorCountAll = -1;
[/codes]
但是实际上这inCategory参数只能接受0和1。也就是说你只能用这个函数判断“永久”和“可恢复”两种分类。几乎毫无意义。
不过反正我们CatalogFieldValueGet()函数,随便想查什么都能查到。所以这个函数其实是不需要的。只是大家如果要用到这个函数的话我就提一下。判断行为是否有flag的时候直接用CatalogFieldValueGet()来查表吧。不要用UnitBehaviorHasFlag()
·VisEnable()函数运作不正常(也就是GUI里环境类动作里的“启用/禁用可见性”的动作)这个函数和war3的那个看上去差不多,可以选择启用/禁用黑色遮罩和启用/禁用战争迷雾。
问题在于你禁用黑色遮罩毫无用处,而你禁用战争迷雾的话,就连战争迷雾和黑色遮罩全部一起禁用掉了。好在禁用黑色遮罩和禁用战争迷雾通常是一起用的,所以一般看不出问题来。实际上这里存在一个小bug。
·使用触发器创建演算体域(也就是使用函数ActorScopeCreate() )必定会抛出错误
当你使用ActorScopeCreate()函数时必定会抛出一个错误:
Trigger Error in 'xxx': Could not create actor scope
某某某触发器错误:无法创建演算体域
尽管如此,实际上域却创建成功了。所以这个提示是可以无视的,不是什么大问题。只是比较烦人。我们可以直接在地图设置里关闭脚本错误信息,不过玻璃渣最好还是修正下这个问题。
·使用触发器发送"Create"消息来创建演算体后,新建的演算体的系统引用::Creator不会被自动设为其创建者
这个问题很奇怪,比方说你用数据编辑器来设置演算体事件,然后对某个演算体A发送"Create B"消息,那么被这个消息创建的演算体B的系统引用::Creator将会被自动设为创建它的演算体,也就是A。
但是如果你直接用触发器的发送消息函数来对A发送"Create B",B是创建出来了,但是它的::Creator却不指向任何演算体。
所以有点让人莫名,用数据编辑器发送消息和用触发器发送消息理应没有区别才对。不过解决方案也很简单,你可以手动帮它设置。
·当试图对ActorRegionSend()的条件参数传递演算体事件时,将会导致游戏崩溃
如果你使用ActorRegionSend()对一个区域发送演算体消息,而你往它的条件参数term发送一个事件而非条件的话,比如把"UnitBirth.Marine" 事件作为条件发过去,那么就会崩溃。
当然严格来说不算bug,那个参数本来就只能接受条件,你发事件过去必然会出错,不过sc2里直接令游戏崩溃的例子比较少,所以我就列举一下,大家好避免这个问题。
·“设置单位属性”动作里的“设置单位奖励(XP)”没有实际作用
当我们试图使用设置单位属性动作来修改它们的XP奖励,比如把杀掉某个SCV的经验奖励改成300(默认是10)。然后你用获取单位奖励动作来查询这个SCV的时候发现它的XP奖励真的改成300了。
可是如果你让一个敌对英雄来杀了它,那么该英雄获得的XP依旧是10。所以这个东西没有实际作用。
·对战-对所有玩家使用默认对战设置(Melee - Set default melee options for all players)动作将导致地图上所有英雄无法获取经验值
这是1.2.0的老问题了,目前还未修正。不过有很多解决方法就是了。这个动作本身也不是不可替代的。你可以改用“对指定玩家设置默认对战设置”之类的动作。
数据编辑器和游戏机制
现在你可以在数据编辑器中创建非默认的抽象类模板
类型CAbil这样的抽样类,理应不能用作任何非默认模板,现在最近几个版本的数据编辑器却允许你这样做。但问题是这样创建出来的技能如果加在单位身上会令单位完全陷入bug。命令面板空掉,并无法响应任何命令。应该是游戏内的限制出错了。
CItemEffect类的使用次数设置问题
当使用CItemEffect类来制作物品时,如果最大使用次数和初始使用次数不一致,那么进入游戏后会发现物品的使用次数会变成只能用一次。
触发器设置已使用次数的问题
所有用触发器设置已使用次数的函数,第一次设置时,可以将使用次数设为任意值——甚至可以是负数,但是第二次使用以后,已使用次数就会被限制在0到最大使用次数之间。
只要技能的剩余计数大于0,那么不论设定它每次使用需要消耗多少使用计数,技能都可以被使用至少一次
也就是说,你的技能就算只剩下0.1的使用计数,也至少还可以用一次。就算你把每次使用所需的计数设得比它大也没用。
当在技能计数恢复时间内使用技能会令技能计数恢复时间永久性增加
如果你的技能每1秒钟恢复1点计数,那么在这个恢复期间内再次使用这个技能会令今后每点计数的恢复时间增加为2秒。之后若再重复做这样的事情会令恢复时间变为4秒,以此类推,不断倍增。
反正技能计数系统全是bug,需要彻底重做过。
武器升级的问题
以一个只能对地的武器为例,如果我们制作一个科技升级修改该武器允许攻击的目标,让它可以攻击空中。结果升级后会导致武器可以攻击但无法造成任何伤害……使用CatalogFieldValueSet()来修改武器结果也一样。
临时解决办法:只有替换武器。
·Buff行为里的“抑制转身(SuppressTurning) ”flag会同时抑制单位的移动能力
如果你钩上了buff里的“抑制转身(SuppressTurning) ”,那么被套上这个buff的单位在失去转身能力的同时也会失去移动能力。就算这个单位本身可以不转身就移动。
然而你如果是用触发器来抑制转身就会很正常,只要单位没有“移动前必须转身”这个flag就可以动。
·CValidatorLocationCrossCliff类验证器会使游戏直接崩溃这个已经在1.3.3中得到了修复。
CValidatorLocationCrossCliff这个类是1.2.0中新增的验证器,用来验证两点之间是否存在悬崖。1.2.0里三个最主要的新增功能是新增悬崖验证器、开放文本框控件、开放自定义UI。但是这三个大功能全部都存在bug。好在后两个的bug在1.3.0里都得到了解决。就剩下这个悬崖验证器。
你把这个验证器放到某些效果里,会导致游戏直接崩溃,比如你试图让灵能风暴劈不到隔开一座悬崖的单位的话,你进游戏刚选中HT,游戏就直接崩溃掉了。很糟糕。
·1.3.x版中部分默认贴图失效。
从1.3.0开始,游戏的部分默认贴图纹理就失效了,比如1.3.0以前原本当你的种族为zerg时,英雄头像的边框图片会自动使用Terran的,因为不存在Zerg英雄的边框贴图,而Terran是默认,所以会自动使用Terran的资源。但是1.3.0后部分的默认设置失效了。Zerg英雄的头像找不到边框贴图,会直接显示成蓝色方块。
·当生命护甲值为负数,但身上仍有护盾时受到伤害,单位的生命会绕过护盾受到直接伤害
编辑器自身问题
地形对象“斜向壕沟(Terrain Object Trench Diagonal)”的模型问题
战役模组中所有的“斜向壕沟(Terrain Object Trench Diagonal)”都存在一个非常严重的问题。当放置在地图上时,壕沟不可见,只能看到一个没有地形的方块空洞。
虽然看上去你可以选中和删除这些壕沟,但是当你保存并重新打开编辑器时,这些壕沟又都回来了。更严重的是,每次当你提高或者降低壕沟周围的地面高度,这些壕沟就会开始不断地自我复制和增殖。最后令你的地图上出现数千个看不见的地形对象,极大地影响你的地图的读取速度。这个问题目前只有通过修改XML来解决。
·在导入管理器模块中察看XML会显示不正确的内容
比如我们新建个地图修改下机枪兵的HP,然后保存。这时候你从导入管理器里看UnitData.xml是正常的。但是如果你关了这地图再开,然后再用导入管理器看UnitData.xml,它里面就会显示一大串乱七八糟的东西。
实际上它显示的是当前地图所依赖的最后一个MOD里的UnitData.xml的内容。这点很土。很容易对初级用户造成误导。大家要看XML的话还是导出来以后再看才行。
·编辑器字符串"EDSTR_WATER_ALTERNATESETTING=Alternate Setting" 本地化问题
这个问题其实只出现在使用方块字的编辑器里(比如繁体中文版、简体中文版、韩文版),是由于本地化不当所导致的。EDSTR_WATER_ALTERNATESETTING这个字符串不应当被本地化。因为它是保存在water.xml里的。而XML不允许使用非字母字符。所以翻译成方块字就会变成乱码,导致XML读取错误,比方说water.xml中这段乱码之后的内容都不会被读取。
而如果你尝试使用触发器来变更水体,甚至会导致你地图都保存不了。因为保存地图时会检验脚本语法,你都把乱码写进去了自然保存不了。
临时解决方案见此帖:
http://bbs.islga.org/read-htm-tid-50515.html
GUI与库函数问题
触发器构造的Set Rotation消息存在问题(Build-in库函数)
在标准库Build-in(Core Mod自带的库)中,触发器包装的Set Rotation消息函数存在问题,实际上这个库函数用了另一个库函数"Convert 3D Rotation To String"来转换旋转坐标参数。但是这个转换函数却把Forward和Up之间的空格写成了逗号,因此触发器版本的Set Rotation消息中,Up部分的三个参数是没用的。
数据编辑器里的系统引用"Host Target"实际值问题
当我们在数据编辑器中选择系统引用Host Target时,实际写进XML的却是::HoverTarget(正确的应该是::HostTarget)。
GUI版的的默认经济(Default Economy)函数的参数列表与其对应的Native函数原型不符
AIDefaultEconomy函数的原型:
[codes=galaxy]native void AIDefaultEconomy (int player, string hall, string gas, string food, string peon, int cap, bool peonMode);[/codes]
但GUI中的参数列表完全是乱七八糟,和原型的参数列表对应不上。
1.3.5中,Modify Player Property(修改玩家属性)动作中的玩家参数只允许输入0
1.3.5中修改玩家属性这个动作里指定玩家号时只能填0。这是一个界面BUG。
临时解决方案:使用自定义脚本。
1.3.5中的新Native:UnitCanAttackTarget()的问题
这个函数用来判断一个单位是否能攻击另一个单位,但是如果被判断的单位有武器但是无法攻击目标单位时,这个函数会执行整整20秒才返回结果! |
|