- 好友
- 1
- 在线时间
- 0 小时
- 最后登录
- 2026-9-18
扈从
 
- UID
- 3319238
- 第纳尔
- 733
- 精华
- 0
- 互助
- 2
- 荣誉
- 1
- 贡献
- 10
- 魅力
- 231
- 注册时间
- 2022-1-28
 鲜花( 20)  鸡蛋( 0)
|
本帖最后由 殇垣 于 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的地方。
|
|