骑马与砍杀中文站论坛

标题: 【OSP】简化的火箭弹系统 [打印本页]

作者: DSFSAEFE    时间: 2022-8-24 10:25
标题: 【OSP】简化的火箭弹系统
本帖最后由 DSFSAEFE 于 2022-8-28 16:04 编辑

8/28更新音效的代码

参考 https://bbs.mountblade.com.cn/thread-2025358-1-3.html 写了一个简化的火箭弹系统,主要思想是用别的触发器代替场景触发器,为了简单起见(其实是因为我不会写)没有控制火箭弹的运动轨迹的代码
我是用战团原版改的,用了拿破仑的声音和粒子效果

[spoiler=module_constants.py]加上几个slot
scene_prop_slot_y_speed
scene_prop_slot_x_speed
scene_prop_slot_attack_agent
[/spoiler]

[spoiler=module_items.py]
加一个物品触发器(最好加到远程武器上),在攻击时刷一个火箭,让火箭动一下
(ti_on_weapon_attack,[
        (play_sound, "snd_rocket_launch"),
        (store_trigger_param_1, ":attacker_agent"),
        (set_spawn_position,pos1),
        (spawn_scene_prop, "spr_mm_rocket_code_only"),
        (assign,":sprop_instance",reg0),        (position_move_y, pos1, 500, 0),
        (prop_instance_animate_to_position, ":sprop_instance", pos1, 50),
        (scene_prop_set_slot,":sprop_instance", scene_prop_slot_attack_agent, ":attacker_agent"),
        (scene_prop_set_slot,":sprop_instance", scene_prop_slot_y_speed, 500),
   ])
[/spoiler]

[spoiler=module_scene_props.py]
"rocket" 和 "bo_rocket" 改成火箭的模型和碰撞
第一个触发器里放火箭的粒子效果、音效,以及刷出火箭之后执行一次的代码
第二个触发器里放控制轨迹的代码和火箭落地后执行的代码
("mm_rocket_code_only" ,sokf_moveable,"rocket","bo_rocket" , [
   (ti_on_scene_prop_init,
    [
      (store_trigger_param_1, ":sprop_instance"),
      (prop_instance_add_particle_system, ":sprop_instance", "psys_rocket_smoke", 25),      (prop_instance_play_sound, ":sprop_instance", "snd_rocket_fly", sf_looping),
    ]),
   (ti_on_scene_prop_animation_finished,
    [
      (store_trigger_param_1, ":sprop_instance"),
      (prop_instance_get_position,pos30,":sprop_instance"),
      (try_begin),
        (position_get_distance_to_terrain,":distance",pos30),
        (this_or_next|lt,":distance",10),
        (cast_ray,":obstacle",pos31,pos30,350),
        (scene_prop_set_visibility,":sprop_instance", 0),
        (scene_prop_get_slot,":attacker_agent",":sprop_instance", scene_prop_slot_attack_agent),
        (copy_position,pos1,pos30),
        (prop_instance_stop_sound, ":sprop_instance"),
        (call_script,"script_explode", ":attacker_agent", 100, 500),
      (else_try),
        (scene_prop_get_slot,":y_speed",":sprop_instance", scene_prop_slot_y_speed),
        (scene_prop_get_slot,":x_speed",":sprop_instance", scene_prop_slot_x_speed),
        (position_move_y,pos30,":y_speed",0),
        (position_move_x,pos30,":x_speed",0),

        (val_add,":x_speed",10),
        (scene_prop_set_slot,":sprop_instance", scene_prop_slot_y_speed,":y_speed"),
        (scene_prop_set_slot,":sprop_instance", scene_prop_slot_x_speed,":x_speed"),

        (prop_instance_animate_to_position,":sprop_instance",pos30,50),
      (try_end),
    ]),
]),
刷出火箭之后要先让火箭动一下,这样才能触发第二个触发器,不知道有没有更简单的方法
[/spoiler]

[spoiler=module_scripts.py]
爆炸的代码
  #script_explode
  # INPUT: explode_position(pos1), attacker_agent, damage, explode_radius
  # OUTPUT: none
  ("explode",
   [
      (store_script_param, ":attacker_agent", 1),
      (store_script_param, ":damage", 2),
      (store_script_param, ":explode_radius", 3),
      (store_div,":smokes",":explode_radius", 2),
      (play_sound_at_position, "snd_explode", pos1),
      (particle_system_burst, "psys_explode_smoke", pos1, ":smokes"),
      (try_for_agents, ":attacked_agent"),        (try_begin),
          (agent_get_position, pos2, ":attacked_agent"),
          (get_distance_between_positions, ":distance", pos1, pos2),
          (lt, ":distance", ":explode_radius"),
          (agent_deliver_damage_to_agent, ":attacker_agent", ":attacked_agent", ":damage"),
          (particle_system_burst, "psys_game_blood_2", pos2, 50),
        (try_end),
      (try_end),
   ]),
[/spoiler]

[spoiler=module_sounds.py]
这几个文件在拿破仑那里有
("rocket_launch", sf_priority_10 | sf_vol_10, ["rocket_launch.wav"]),
("rocket_fly", sf_priority_10 | sf_vol_10, ["rocket_launch1.wav","rocket_launch2.wav"]),
[/spoiler]

火箭飞行的粒子效果可以直接用 https://bbs.mountblade.com.cn/thread-2025358-1-3.html 这里的,爆炸的音效和粒子效果我没法提供,你们自己找吧
用加上了前面写的物品触发器的武器攻击就可以发射火箭了
大概就这些了,代码的不足之处欢迎各位大佬批评指出


作者: DSFSAEFE    时间: 2022-8-24 10:34
有几个问题想请教一下各位
1. 我试过用prop_instance_intersects_with_prop_instance判断火箭是否碰到其他的prop,但是好像没有效果,请问是不是因为没有把碰撞设置为胶囊?如果是的话,要怎么设置?
2. 用我这个方法刷出的火箭会在原地停一段时间,请问有没有方法能让火箭一刷出来就动?
作者: g2my    时间: 2022-8-24 11:00
DSFSAEFE 发表于 2022-8-24 10:34
有几个问题想请教一下各位
1. 我试过用prop_instance_intersects_with_prop_instance判断火箭是否碰到其他 ...

这个你要问做龙珠魔兽篮球mod的@vegetto,他是场景物体操作方面最专业
作者: DSFSAEFE    时间: 2022-8-24 11:26
2. 用我这个方法刷出的火箭会在原地停一段时间,请问有没有方法能让火箭一刷出来就动?


这个问题被解决了,一会我改一下代码
作者: DSFSAEFE    时间: 2022-8-25 10:48
1. 我试过用prop_instance_intersects_with_prop_instance判断火箭是否碰到其他的prop,但是好像没有效果,请问是不是因为没有把碰撞设置为胶囊?如果是的话,要怎么设置?

我查了一下资料,也做了一些实验,即使把火箭的碰撞设置为胶囊,prop_instance_intersects_with_prop_instance似乎也不能检测manifold类型的碰撞,但是探索mod的鹰视角用prop_instance_intersects_with_prop_instance来检测鹰是否撞墙(源码: https://forums.taleworlds.com/index.php?threads/explorer-source-code-released.379318/page-3#post-9064186 ),撞到manifold也能检测出来
还有我发现 https://bbs.mountblade.com.cn/forum.php?mod=viewthread&tid=339061 这个帖子用position_has_line_of_sight_to_position检测炮弹碰撞,试了一下没成功,position_has_line_of_sight_to_position总是失败
[spoiler=代码]
("mm_rocket_code_only" ,sokf_moveable,"rocket","bo_rocket" , [
   (ti_on_scene_prop_init,
    [
      (store_trigger_param_1, ":sprop_instance"),
      (prop_instance_add_particle_system, ":sprop_instance", "psys_rocket_smoke", 25),
    ]),
   (ti_on_scene_prop_animation_finished,
    [
      (store_trigger_param_1, ":sprop_instance"),
      (prop_instance_get_position,pos30,":sprop_instance"),
      (scene_prop_get_slot,":y_speed",":sprop_instance", scene_prop_slot_y_speed),
      (scene_prop_get_slot,":x_speed",":sprop_instance", scene_prop_slot_x_speed),
      (copy_position,pos1,pos30),
      (position_move_y,pos30,":y_speed",0),
      (position_move_x,pos30,":x_speed",0),
      (try_begin),
        (position_get_distance_to_terrain,":distance",pos30),
        (this_or_next|lt,":distance",10),
        (neg|position_has_line_of_sight_to_position,pos30,pos1),
        (scene_prop_set_visibility,":sprop_instance", 0),
        (scene_prop_get_slot,":attacker_agent",":sprop_instance", scene_prop_slot_attack_agent),
        (call_script,"script_explode", ":attacker_agent", 100, 500),
      (else_try),
        (play_sound_at_position,"snd_rocket_fly",pos1),

        (val_add,":x_speed",10),
        (scene_prop_set_slot,":sprop_instance", scene_prop_slot_y_speed,":y_speed"),
        (scene_prop_set_slot,":sprop_instance", scene_prop_slot_x_speed,":x_speed"),

        (prop_instance_animate_to_position,":sprop_instance",pos30,50),
      (try_end),
    ]),
]),
[/spoiler]
这些东西我是真的弄不明白了,求各位大佬解释


作者: 皮w蛋    时间: 2022-8-25 20:40
本帖最后由 皮w蛋 于 2022-8-25 21:01 编辑
DSFSAEFE 发表于 2022-8-25 10:48
我查了一下资料,也做了一些实验,即使把火箭的碰撞设置为胶囊,prop_instance_intersects_with_prop_ins ...

你可以去看看龙珠mod这人,人物和龟派气功啥的都是prop做的

作者: 42ndUK-CC-Duke    时间: 2022-8-25 20:46
相恨见晚,继续加油!




欢迎光临 骑马与砍杀中文站论坛 (https://bbs.mountblade.com.cn/) Powered by Discuz! X3.4