本帖最后由 奥杜因阿卡托什 于 2023-5-11 04:51 编辑
根据去年11月和@fadehe332111的讨论,当时把基本原理想通了,现在把实用化的箭雨——在投射物落地处的上方召唤出一堆箭矢垂直落下,造成范围攻击(其实比较难打中人,因为骑砍人物建模的垂直投影面积格外地小)——这个特效的物品触发器代码放出来。
当时他面临的问题主要是,命中后召唤出来的箭矢依然会再次触发这个效果,导致箭雨落个不停。为了解决这个问题,需要引入一个全局变量(进阶一点的话,可以用slot)来使箭雨结束。这个全局变量的引入由发射该投射物的武器——弓、弩、步枪、手枪——完成,物品触发器的PY代码如下:
- (ti_on_weapon_attack, [
- (store_trigger_param_1, ":agent_no"),
- (agent_get_troop_id, ":troop_no", ":agent_no"),
- (eq, ":troop_no", "trp_player"),
- (assign, "$arrow_rain", 10),
- ]),
复制代码 魔球里则是
- (store_trigger_param_1,":var_0"),
- (agent_get_troop_id,":var_1",":var_0"),
- (eq,":var_1","trp_player"),
- (assign,"$arrow_rain",10),
复制代码 其中"$arrow_rain"这个全局变量设置的是10,意思是一波会落下十根箭雨,要改多改少的话就在这里了。
然后是第二个物品触发器,写在投射物后面:
- (ti_on_missile_hit, [
- (store_trigger_param_1, ":agent_no"),
- (gt, "$arrow_rain", 0),
- (agent_get_troop_id, ":troop_no", ":agent_no"),
- (eq, ":troop_no", "trp_player"),
- (copy_position, pos10, pos1),
- (position_move_z, pos10, 300, 0),
- (agent_get_wielded_item, ":weapon_no", ":agent_no", 0),
- (try_for_range, ":count_no", 0, "$arrow_rain"),
- (le, ":count_no", "$arrow_rain"),
- (copy_position, pos11, pos10),
- (store_random_in_range, ":ran_x", -50, 50),
- (store_random_in_range, ":ran_y", -50, 50),
- (position_move_x, pos11, ":ran_x", 0),
- (position_move_y, pos11, ":ran_y", 0),
- (add_missile, ":agent_no", pos11, 100, ":weapon_no", 0, "itm_arrows", 0),
- (try_end),
- (assign, "$arrow_rain", 0),
- ]),
复制代码 魔球里则是
- (store_trigger_param_1,":var_0"),
- (gt,"$arrow_rain",0),
- (agent_get_troop_id,":var_1",":var_0"),
- (eq,":var_1","trp_player"),
- (copy_position,pos10,pos1),
- (position_move_z,pos10,300,0),
- (1726,":var_2",":var_0",0),
- (try_for_range,":var_3",0,"$arrow_rain"),
- (neg|gt,":var_3","$arrow_rain"),
- (copy_position,pos11,pos10),
- (store_random_in_range,":var_4",-50,50),
- (store_random_in_range,":var_5",-50,50),
- (position_move_x,pos11,":var_4",0),
- (position_move_y,pos11,":var_5",0),
- (1829,":var_0",11,100,":var_2",0,"itm_arrows",0),
- (try_end),
- (assign,"$arrow_rain",0),
复制代码 效果是在以落点为中心的1平方米范围内随机落箭,落下的箭数就是前面那个“10”决定的。"itm_arrows"记得改成这个投射物的ID,这个决定的是落下的会是什么玩意。另外发现个有意思的事情,如果用的投射物和发射器不搭(比如弩发射箭),伤害会极高,直接冲到500点的封顶伤害。
这是弓弩火枪这四种发射器+投射物的远程武器的改法,至于投掷武器这种发射器就是投射物的玩意,把两个触发器写在同一个物品下就行。PY和TXT我试过写两个都是可行,但魔球好像不支持一个物品由两个触发器,这个就自己想办法吧。
最后还有最重要的一个问题,是个在实际测试中发现的意外情况——物品触发器无法启用全局变量。这里的启用不是指给已有的全局变量赋值,这个自然是可以的,而是把在其他任何地方都没出现过的全局变量定义出来,这个不行。"$arrow_rain"就是这个致命的全局变量,它的第一次出现是在物品触发器里,结果便是编译时会一边显示它没有被使用一边显示使用了未定义的它,进游戏也没有效果。因此为了解决这个,需要在别的地方给它定义出来。对MS党来说这个很简单,往script_game_start里加一行就行了,但对魔球党和TXT浅尝辄止党则没那么友好了。
当然,既然我把这个贴子发出来了,终归还是有谁都能用的解决办法的,把这个加在某个触发器里就行。我看魔球0号“未知”触发器就挺适合的,在那仅有一句的触发条件后加上
- (assign,"$arrow_rain",0),
复制代码 就行了。这个触发器开局0.1秒后才会启动,效果是弹出玩家开局时那个“你现在在大地图上”云云的教程框,所以开局打那个强盗时可能无法触发这个效果,看到教程框后才有。
效果差不多如图,就像上面说的,打人类,即使打那种扎堆的步兵,也没见过有一次杀超过三个的。但是打站立不动、被堵在步兵里的骑兵很管用,可能是因为马的垂直投影很大的缘故,基本上能全吃。在反大型这块尤其给力,骑龙被打中了也是一招秒。
因为只是简单写了写,所以这个触发器只能给玩家用的。如果想改成任何单位都能用,把触发器里限制给玩家的语句去掉,把全局变量的判定换成agent slot来进行就行。不过这个就有点复杂了,用魔球比较难实现,在此不再赘述。
|