- UID
- 26174
- UCC
-
- 声望
-
- 好评
-
- 贡献
-
- 最后登录
- 1970-1-1
|
本帖最后由 gqqnb 于 2013-8-28 17:01 编辑
我觉得用自问自答的方式比较能让别人搜到。(CCAV:他的目的是炒作自己)
命令飞船“攻击”一个特定敌人,会总是处于后手!“攻击所有敌人”的船总是比“攻击”(特定敌人)的船先开火!
具体现象是这样的。比如用脚本创建两艘M1猛禽,使用相同的装备,一个是xenon的,一个是我的。xenon的猛禽创建好后就处于“攻击所有敌人”的状态。我命令我的猛禽“攻击”xenon猛禽,炮塔指令是导弹防御。xenon猛禽的G光子炮在6点几千米时就开火了,我的猛禽还没有。一直等到xenon光子炮打中我的猛禽了,我的猛禽才开火。
原因在于!fight.attack.object和!turret.missiledefense.std。
下了“攻击”指令后,执行!fight.attack.object。
- $dist = get distance between [THIS] and $victim
- if $dist > $followdist1 + 200
- $ret = [THIS]->follow $victim with precision $followdist m : timeout=60000 ms
- if $ret != {FLRET_TARGETREACHED}
- = wait randomly from 10 to 20 ms
- continue
- end
- end
-
- [THIS]->set attack target to $victim
复制代码 如果飞船跟目标船只的距离大于我船大小+敌船大小+4000+100+300(对于猛禽来说,大小是1079。所以猛禽攻击猛禽,这个值是6558m),则继续跟踪。G光子炮的射程是6.63km,这个时候本来应该要开火了,但脚本还让船继续跟。
当飞船跟到目标船只,即距离为对方飞船大小时,设置attack target。对于猛禽来说,大小是1079,但实测中距离为3到5千米会算跟到,是follow with precision 的问题。
然后看导弹防御,玩家的导弹防御脚本是!turret.missiledefense.std(电脑的是.adv,区别是adv的会自动换武器)。
- $victim = [THIS]->find nearest missile aiming to me
-
- if not $victim
- $victim = [THIS]->get attacker
- if $victim
- skip if [THIS]->is $victim in firing range of turret $turretid
- $victim = null
- end
-
- if not $victim
- $victim = [THIS]->get attack target
-
- if [this] -> is in same sector as [playership]
- if $victim
- $dist= get distance between [this] and $victim
- write to log file 2 append= [true] printf: fmt= 'Distance=%s, %s get attack target %s', $dist , [this], $victim,null,null
- end
- end
-
- if $victim
- skip if [THIS]->is $victim in firing range of turret $turretid
- $victim = null
- end
- end
-
- if not $victim
- $cmd = [THIS]->get command
- if $cmd == {COMMAND_KILL_ENEMIES_RANGE} OR $cmd == {COMMAND_KILL_ENEMIES_AND_LAND} OR $cmd == {COMMAND_KILL_ENEMIES}
- $victim = [THIS]->find enemy in firing range of turret $turretid
- end
- end
- end
复制代码 导弹防御先看有没有攻击自己的导弹,有没有人攻击自己(get attacker),然后看自己在攻击谁(get attack target)。所以,当时使用“攻击”指令时,两船正在相遇,没有攻击自己的人。然后飞船飞到3到5千米时,!fight.attack.object才设攻击目标,!turret.missiledefense.std才会开火。
那么,为什么xenon猛禽在6千米时就能开火呢?因为每艘船创建出来之后都有“默认动作”,M1的默认动作是“攻击所有敌人”。看!turret.missiledefense.std的代码片段的最后部分,如果飞船正在执行的是“攻击所有敌人”,那么炮台自动寻找敌人。所以在6千米时,尽管xenon猛禽自己还不知要攻击谁(没有attack target),它的炮台却开始攻击我的猛禽。
经查看,其他的炮塔指令也是一样,不会在“攻击”时早点开火。
这两个脚本都是默认脚本,我也不知道怎么改好。反正结论就是“攻击所有敌人”总是比“攻击”先开火!
在光子炮大战中,“攻击”者由于后发劣势,在第一回合就会被干掉三分之二的盾。
|
|