骑马与砍杀中文站论坛

 找回密码
 注册(Register!)

QQ登录

只需一步,快速开始

搜索
购买霸主CDKEY 购买战帆CDKEY
查看: 660|回复: 4

[功能与代码] OSP战团 火焰伤害烧伤灼伤开源代码 瓮海

[复制链接]

11

主题

66

回帖

43

积分

扈从

Rank: 2Rank: 2

UID
3319238
第纳尔
733
精华
0
互助
2
荣誉
1
贡献
10
魅力
231
注册时间
2022-1-28
鲜花(20) 鸡蛋(0)
发表于 2026-7-18 18:11:43 | 显示全部楼层 |阅读模式
本帖最后由 殇垣 于 2026-7-30 14:45 编辑

自己琢磨的代码,(谢众群友指点)不知对否,望高人不吝赐教。
我还设想过,如果碰到火,即使出火后身上还会有烧着的掉血机制及身上火焰的粒子效果,
以及是否要泡水才能灭火的机制,但那太复杂也使得游戏太难了。
目前这个代码是离开火点,即身上火灭,且不持续不蔓延传染。不然兵会死太多了。

放在战场触发器 mt 里
      module_mission_templates.py




##火焰伤害 #烧伤        指导人:king of killyouready    阳光肥宅    数据流动agent_force_rethink
flame_damage =(1, 0, 1,  #shaoshang     1秒开始计时,等待1秒,0秒后重触
   [   #(eq, "$fire_damage", 1), #全局变量开关
       (assign, ":num_fire", 0),
    (scene_prop_get_num_instances, ":num_fire", "spr_village_fire_big"),  # 获取道具数量  大火焰
    (val_add, ":num_fire", 1),  # 加法 +1
    (gt, ":num_fire",0),],  # 获取数量  大火焰 若有
   [#解释: scene_prop_get_instance 用于获取特定编号单个实例,而 try_for_prop_instances 会遍历所有该类实例,两者功能重复,不能同时混用。

      (try_for_prop_instances,":var_fire_instance","spr_village_fire_big"), ##方案2 外层循环:遍历所有spr_village_fire_big实例
       (prop_instance_get_position, pos25, ":var_fire_instance"),  #检索场景中 获取火焰位置
                   # 获取火焰位置坐标用于距离计算

       (get_player_agent_no, ":player_agent"),                   # 获取演员位置
       (try_for_agents, ":victim_agents"),#内层二次循环:遍历所有存活agent(包括玩家) 读取大火附近的agent
         (agent_is_alive, ":victim_agents"),#跳过非存活agent
         (agent_is_active,":victim_agents"),
         (agent_get_position, pos26, ":victim_agents"),  #获取agent位置
         (get_distance_between_positions, ":hor_distance", pos25, pos26),  ##判断人和火距离 计算水平距离(2D平面距离,忽略高度差) 米


         (position_get_z, reg23, pos25),      # 大火高度
         (position_get_z, reg24, pos26),      # 演员高度  获取agent当前高度位置
         (store_sub, ":height_diff",reg1,reg0),  # 高度差 = agent高度 - 火焰高度

         (val_abs, ":height_diff"),  # 取绝对值,无论正负 考虑上下范围
         (lt, ":height_diff", 150),  # 高度差在150厘米(1.5米)以内

         # 计算3D球形距离  三维距离平方
                   (store_mul, ":hor_dist_sq", ":hor_distance", ":hor_distance"),  # 水平距离的平方
                   (store_mul, ":height_diff_sq", ":height_diff", ":height_diff"),  # 高度差的平方
                   (store_add, ":3d_dist_sq", ":hor_dist_sq", ":height_diff_sq"),  # 三维距离的平方

         (try_begin),# ----球形范围伤害判定 ----
         (lt, ":3d_dist_sq", 90000),  # 距离关系的半径球形范围判定区域 300² = 90000  半径三米的球形距离
            # ---- 扣血逻辑 ----
            (store_agent_hit_points, ":cur_agent_hp", ":victim_agents", 1),#获取当前血量
            (val_sub, ":cur_agent_hp", 2),  # 扣除稍许血量或固定点数     ##遂 施加伤害  减少1点血量(不播放受击动画,避免卡顿)


            (try_begin),# 应用伤害
            (gt, ":cur_agent_hp", 2),  # 确保不会扣到负数以下  # 扣血逻辑 2,正常扣血
            (agent_set_hit_points, ":victim_agents",":cur_agent_hp", 2), #给演员 施加伤害 造成伤害

                (try_begin),#喊声控制
                   (get_player_agent_no, ":player_agent"),
                   (agent_get_position, pos17, ":player_agent"),  # 获得玩家位置
                   (get_distance_between_positions, ":distance_to_player", pos17, pos26),  # 判断和玩家距离
                   (le, ":distance_to_player", 3000),  # 距离在玩家 30米内 太远了不重要 节省音源性能
                   (agent_is_human, ":victim_agents"),  # 人类
                   (agent_get_troop_id, ":troop_id", ":victim_agents"),# 播放受伤音效(可选)
                   (troop_get_type, ":gender_is_female", ":troop_id"),  # 性别gender
                   (try_begin),
                   (eq, ":gender_is_female", tf_female),  # 女性
                   (agent_play_sound, ":victim_agents", "snd_woman_hit"),  # 女性叫
                   (else_try),
                   (eq, ":gender_is_female", tf_girl),  # 女孩
                   (agent_play_sound, ":victim_agents", "snd_girl_hit"),  # 女孩叫
                   (else_try),
                   (eq, ":gender_is_female", tf_boy),  ##男孩
                   (agent_play_sound, ":victim_agents", "snd_boy_hit"),  # 男孩叫
                   (else_try),  # others
                   (neq, ":gender_is_female", tf_titan),#排除泰坦怪
                   (neq, ":gender_is_female", tf_undead),#排除不死族
                   (agent_play_sound, ":victim_agents", "snd_man_hit"),  # 男性叫 male be hit
                   (try_end),
                (try_end),#喊声控制

                   (copy_position, pos27, pos26),
                   (position_move_y, pos27, 20),#演员位置高度上移额外点位
                   (particle_system_burst, "psys_cooking_fire_1", pos27, 100),  # 粒子效果 炊火  # 100 as power.力度
                   (particle_system_burst, "psys_torch_smoke", pos27, 30),      # 粒子烟雾效果

                   (try_begin),# 玩家烧伤提示与红眼特效 -----
                    (eq, ":victim_agents", ":player_agent"),
                    (agent_is_alive, ":player_agent"),  # 活着
                    (display_message, "@you be burned by flame!", 0xFFFF401F),  #玩家受伤提示 你 被 火 焰 灼 伤 !   红色
                    (assign, "$g_eyesblood", 1),  # 则触发红眼血屏 CCCCC  (这是每秒重复循环播放的
                    (play_sound_at_position, "snd_fire_big", pos27, 0),
                    (agent_play_sound, ":player_agent", "snd_man_breath_hard"),  # 喘息声 男
                   (try_end),#玩家提示结束

                   (try_begin),  # ====== AI避火撤退 ======这条思路已经摸到引擎的天花板了。
                   (neq, ":victim_agents", ":player_agent"),#非玩家
                   (gt, ":cur_agent_hp", 2),  # 还活着
                   (agent_slot_eq, ":victim_agents", slot_agent_is_running_away, 0),
                   (agent_clear_scripted_mode, ":victim_agents"),  # 清除AI的脚本化行为,恢复自由行动
                   (agent_force_rethink, ":victim_agents"),# agent强制_重新考虑
                   (agent_set_slot, ":victim_agents", slot_agent_is_running_away, 1),
                   (try_end),  # ====== AI撤离战场 ======

        (else_try),#血量过低(le, ":cur_agent_hp", 2),扣血后死亡  #击杀
                   (try_begin),
                    (eq, ":victim_agents", ":player_agent"),# 玩家死亡提示
                    (display_message, "@You were fainted by the fire!", 0xFFFF401F),  # 你 被 烧 晕 了 !   红色
                    (play_sound_at_position,"snd_fire_loop",pos25),# CCCCCCC 播放声音 在POS地点 火
                   (try_end),  #击杀

                   (set_show_messages, 0),  # MOTO prevent "agent killed self" messages  防止代理自杀消息
                   (agent_deliver_damage_to_agent, ":victim_agents", ":victim_agents"),  # 直接击杀 强制死亡 # 自己伤害自己
                   (set_show_messages, 1),

                   (try_end),  # 扣血处理结束  #击杀

        (try_end),#范围判断 结束

      (try_end),#内层try_for_agents循环结束

     (try_end),# 结束外层 火焰道具实例 循环    slot_agent_burn_escape_time= 318 #逃离火焰 (具体数字根据你的MOD安排)
])






拒绝任何潘德相关mod及其改版使用
署名为:瓮海
可以在添加战斗场景中应用,




flame_damage,# 烧伤



一般添加在攻城场景,或其它场景后面。

castle_attack_walls_belfry

castle_attack_walls_ladder


quick_battle_battle

quick_battle_siege

等等,用得着且有village_fire_big的地方。













419

主题

2276

回帖

844

积分

骑士

Rank: 4Rank: 4

UID
215455
第纳尔
5615
精华
0
互助
7
荣誉
0
贡献
0
魅力
7
注册时间
2010-3-19

战团正版勋章维京征服正版勋章汉匈决战正版勋章

鲜花(202) 鸡蛋(44)
发表于 2026-7-19 18:39:56 | 显示全部楼层
可以用火焰坐标为圆心,球形范围内都会灼烧。
  
3d坐标之间的计算公式是sqrtf((x1-x2)平方+(y1-y2)平方+(z1-z2)平方),sqrtf是求平方根。
lz不会这个不知道吧。
一字电剑科普传人

2

主题

1

回帖

1

积分

平民

Rank: 1

UID
3835499
第纳尔
0
精华
0
互助
0
荣誉
0
贡献
0
魅力
0
注册时间
2025-12-27
鲜花(0) 鸡蛋(0)
发表于 2026-7-19 19:04:42 来自手机 | 显示全部楼层
骑砍官方社区注册被ban了咋办,我想去发东西来自: iPhone客户端

11

主题

66

回帖

43

积分

扈从

Rank: 2Rank: 2

UID
3319238
第纳尔
733
精华
0
互助
2
荣誉
1
贡献
10
魅力
231
注册时间
2022-1-28
鲜花(20) 鸡蛋(0)
 楼主| 发表于 2026-7-20 18:46:02 | 显示全部楼层
本帖最后由 殇垣 于 2026-7-20 18:47 编辑
xiaojuzixxx 发表于 2026-7-19 18:39
可以用火焰坐标为圆心,球形范围内都会灼烧。
  
3d坐标之间的计算公式是sqrtf((x1-x2)平方+(y1-y2)平 ...

这里用sqrtf应该怎么写? Lav_operations里没搜到sqrtf啊,话说一半的

419

主题

2276

回帖

844

积分

骑士

Rank: 4Rank: 4

UID
215455
第纳尔
5615
精华
0
互助
7
荣誉
0
贡献
0
魅力
7
注册时间
2010-3-19

战团正版勋章维京征服正版勋章汉匈决战正版勋章

鲜花(202) 鸡蛋(44)
发表于 2026-7-20 22:28:40 | 显示全部楼层
殇垣 发表于 2026-7-20 18:46
这里用sqrtf应该怎么写? Lav_operations里没搜到sqrtf啊,话说一半的

https://mbcommands.fandom.com/wiki/Operations
搜索store_sqrt
   然后呢,sqrt不用也可以,还可以少算一步。
一字电剑科普传人
您需要登录后才可以回帖 登录 | 注册(Register!)

本版积分规则

Archiver|手机版|小黑屋|骑马与砍杀中文站

GMT+8, 2026-9-20 05:35 , Processed in 0.109285 second(s), 23 queries , Gzip On, MemCached On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表