在prop.scd下的props\DefaultWreckage\DefaultWreckage_prop.bp里面找到BlockPath=false,嗯嗯嗯,大家应该知道怎么改了吧,先备份先备份。。。然后试试。。。现在太晚了。。。今天太阳出来以后我再来试试。
不过改后可能会出些问题。。。因为有的工程单位回收残骸时会出现开到残骸里面的现象(尤其是大型建筑的残骸),所以可能会导致无法回收的bug,所以希望各位如果可以的话,也一起尝试下,看看有没有bug。
[ 本帖最后由 honeyfox 于 2007-9-7 01:51 编辑 ]
突然想起来了,为了避免直接修改scd文件导致以后更新包可能产生问题,打算专门写一个小的Hook,:lol 这个应该问题不大,到时候想开就开,想关就关:victory: 。。。严重幻想中。。。
:loveliness: hook成功的话发上来看看吧!
:‘( :’(
失败鸟~~~~~~
发现里面的Wreckage还需要SizeX,SizeY,SizeZ,但是这样的话还要去改Wreckage.lua,里面还要添加代码来跟踪残骸的三维尺寸~~~不过好像即使我手动让所有建筑的尺寸都在一个比较大的值。。。还是没什么反应。。。:L 难道又要去GPGNet问了。。。?
网上查了下,结果那帮子外国人说。。。说。。。I don’t see the point in having wreckages block units from passing over them。。。郁闷。。。而且貌似要改的地方还不只这点地方。。。好像和Wreckage.lua,Unit.lua都有点关系。。。那里还有个主意,打算把所有的Wreckage都当作建筑物处理,也许可以达到想要的效果,但是这个工作量。。。
看来得先分析Unit和普通建筑之间的Collide检测问题,然后看看能不能移植过来。。。额。。。后天居然要开学了。。。:Q 没时间了。。。
最新测试结果。。。喜忧参半。。。
将props.scd里面的DefaultWreckage的Blueprint里面的Category增加了一个"Land",结果。。。除了有死亡动画的单位(像MonkeyLord,银河巨人这类)死后保留完整残骸(带原部队归属的颜色)但不影响单位经过/建筑在此处建造外,其他直接爆炸死亡的单位/建筑(包括几乎所有的建筑)在爆炸之后。。。维持原样,单位/建筑的颜色也没有变黑色的残骸状,但是确实已经没有这个单位/建筑了。。。部队这时候的确不能穿过该“残骸”而必须绕过,因为这些东西实际上不能算残骸。。。但是正因为这样。。。在矿上面造好一个汲取器后,一旦被摧毁,。。。就会出现矿上出现一个无法回收、无法被摧毁的汲取器残骸,准确的说。。。这个矿点废了。。。(如果摧毁该矿点的武器威力很高,有可能出现瞬间将残骸炸碎的现象,我没有认证过,测试时为了方便只用了Ctrl+K)
继续到GPGNet上去找。。。不行的话再发贴问。。。
[ 本帖最后由 honeyfox 于 2007-9-7 17:32 编辑 ]
这个大好,只不过担心一旦残骸能够挡路,原本就不堪负担的cpu需要进行更多的寻路运算:L
即使如此还是强烈期待lz成功,残骸不挡路看着就不舒服:lol
:L 个人对Wreckage兴趣不大,不过对lua很有兴趣~
honeyfox能不能看看那个最新的FF_SAM是否管用?我用起来一直不行,原因不明…… 自己修改成这句以后就成功了~
local targetlist = aiBrain:GetUnitsAroundPoint( categories.AIR, position, 30, 'Enemy' )
还没看到什么是FF_SAM,不过从名字和你的代码里面的TargetList,猜测是控制SAM分散火力,同时攻击多个目标,是不是这样的?
Edit:看来我猜错了。。。不过实际效果却是有些相似的,都是为了更大的利用SAM的火力。。。而不让它为了一个已经有足够火力消灭的还未爆炸的飞机还拼命放导弹。。。
[ 本帖最后由 honeyfox 于 2007-9-7 21:58 编辑 ]
额。。。找到你的文件了,看了下。。。貌似是Eni错误的使用了这个函数。。。他/她把函数里的参数顺序搞错了。。。:L 。。。不知道哪里可以查所有/大多数的函数的参数列表和解释。不过为什么要改为30?本来不是40吗?平衡性?
Edit:我刚才又参考了一下原来就有的Lua.scd里面AIUtilities.lua里面的代码,找到这样一行:
local units = aiBrain:GetUnitsAroundPoint( category, checkPos, gridSize, ‘Ally’ )
由此可见,该函数的格式应该是 GetUnitsAroundPoint(目标类别,中心位置,搜索范围,搜索目标的所属),估计还有Neutral这类。。。或者可能有All,这个可以参考英文版Supcom里面Skirmish里平民选项的英文,估计是对应的。
[ 本帖最后由 honeyfox 于 2007-9-7 22:54 编辑 ]
试了最新的九月版本,他把整个hook到projectile和weapon里了~ 现在只要在武器上加入“advancedTracking = true”就可以重新锁定空中单位。
我之前是按照源文件里其他的aiBrain:GetUnitsAroundPoint的例子修改的顺序…… 他在最新版本里也把顺序改过来了~
edit: 上传了一个修改版的。我把目标改成“敌方可选择单位”,理论上应该不止对空了,可实际测试却并非如想像般,Viper有时会重新瞄准新单位,但大部分时间可能由于mod会计算攻击力与敌人血量而选不按要求办事…… 猴王在水下也是不会retarget~ 帮我看看?
[ 本帖最后由 零星 于 2007-9-7 23:56 编辑 ]
FF_SAM.zip (2.38 KB)
问题可能是因为那个函数返回的单位列表是按照一定顺序的,我有些怀疑是Position的Z,当然也可能是其他原因。而代码总是使用列表中的第一个,(甚至不考虑是不是水下、空中还是地面)就会导致MKL的鱼雷无法去攻击一个陆地或空中目标。
所以可能要判断目标的状态(空中、地面、水中/水底)和武器的类型是否匹配。
不知道有无这样的函数,如果有,那么判断,是则以该单位为目标,否则对列表下一项判断,如果直到最后还是没匹配目标就selfDestruct。
老样子,等今天太阳出来后我再来看代码,手机上没法看。(手机打这些东西好累)
3251-3260 的列表:http://supcom.wikia.com/wiki/LUADOC_1.1.3251
我在想不知道如何能引用上一个目标的category作为重新锁定的目标的categories……
这里:local targetlist = aiBrain:GetUnitsAroundPoint( categories.AIR, position, self.range, ‘ENEMY’ )
是引用self.range=self.DamageData.TrackingRadius
如果把local targetlist = aiBrain:GetUnitsAroundPoint( categories.AIR, position, self.range, ‘ENEMY’ )
改成local targetlist = aiBrain:GetUnitsAroundPoint( categories.target.cate, position, self.range, ‘ENEMY’ )
在这之前加上target.cate=×××行不?
[ 本帖最后由 零星 于 2007-9-8 03:48 编辑 ]
可能没有Category.Target.Cate这种写法。。。也许上面先写Target.Cate=Category.AIR,然后下面再用Get…(Target.Cate,…,…,…)就可以了。
Target可能只是一个副本,如果是,那么修改它的Category应该不会产生任何问题。。。问题是如果那不是副本,或者说修改它就是直接修改了那个单位的Category的话。。。不确保不会出问题。
我的想法是,先找到targetlist[1],用Target:GetPosition()获得敌方目标的坐标,然后分析GetSurfaceHeight(x,y)返回的Z和GetTerrainHeight(x,y)返回的Z(估计就是地图的水面高度和地面高度)和敌方目标的实际位置的Z,应该就可以判断是否是水面/水下/陆地上/天空中的目标了,不过这样的话可能需要对每一类武器,包括对地面和海面目标有效(一般的武器,包括炮弹,导弹,炸弹,不过炮弹和炸弹不用制导。。。所以排除它们,只剩下导弹了)、对海面和海下目标有效(鱼雷)、对地面和空中目标有效(好像这类武器SupCom里面不多见。。。)、仅对空中目标有效(拦截机用的机炮,对空导弹) 这五种)分别编程,其实工作量还可以。。。不过能不能从Position里面分离出x,y,z这个我这只Lua脚本语言的菜鸟就不知道了,应该可以,估计是Position[1]?或者是{}?
Edit: PS:有些提到的函数不在AIBrain类别内,有些是里面的。
[ 本帖最后由 honeyfox 于 2007-9-8 08:54 编辑 ]
嗯还有。。。零星你看到过这样的代码伐?
LOG … “…"
我记得上次哪里看到过一次,估计可以在游戏进程中输出调试信息到那个调试窗口里,这样的话调试起来会方便些,尤其是要判断弹头的x,y,z和一个单位x,y,z之类的。
总觉得你用高度坐标之后选择武器的方法似乎有点繁琐…… 我想应该有办法直接确定某单位在特定时间内的属性吧?(LAYER_Air ,LAYER_Land,LAYER_Orbit,LAYER_Seabed,LAYER_Sub,LAYER_Water,)
看过LOG,我想类似这样的东西应该是你所需要的:LOG("Adding wreckage information to ", bp.Description)、LOG("Updating WreckageLayers for ", bp.Description)
你要自称“Lua脚本语言的菜鸟”的话我可是能确定我连“菜鸟”都算不上~ 完全是摸着石头过河照葫芦画瓢……
你头像下面那段“QAI”是怎么加进去的呀?
[ 本帖最后由 零星 于 2007-9-8 13:56 编辑 ]
:victory: 在控制面板 - 编辑个人资料 里面改 头衔 就可以拉。
其实我也类似照葫芦画瓢的阶段啦,就是最多会一点结构语句。。。
:victory: 找到这个啦,也许可以方便的使用:GetCurrentLayer(self),还找到个GetHealth(self)等等东西,都是从你给我的那个LUA参考资料里翻出来的。 
应该可以用target:GetCurrentLayer(target)来获得target目前的Layer。很好很强大:loveliness:
不过不知道具体语句是用target:GetCurrentLayer(target)还是target:GetCurrentLayer(self)。。。这里的self到底指target还是那个导弹。。。
:lol 对!就是他!!
最后的问题很好…… :L 不知道self究竟指啥~ 我猜是target……