骑马与砍杀中文站论坛

 找回密码
 注册(Register!)

QQ登录

只需一步,快速开始

搜索
购买霸主CDKEY 购买战帆CDKEY
查看: 467|回复: 0

[功能与代码] 联邦党人文集之夜幕的技能系统

[复制链接]

7

主题

21

回帖

8

积分

平民

Rank: 1

UID
3683912
第纳尔
14
精华
0
互助
0
荣誉
0
贡献
0
魅力
0
注册时间
2024-8-2
鲜花(2) 鸡蛋(0)
发表于 7 天前 | 显示全部楼层 |阅读模式

使用要求:看得懂ms代码

使用要求:必须对于作者也就是我,致谢,贡献者,Credit等署名

署名为:夜幕

以下为MT模块:

  1. left_hand_burst_activate = ( # 技能触发器:按键触发后生成spr
  2. 0, 0, 0, # 无循环间隔,仅在满足条件的触发时执行
  3.     [(key_clicked, key_z), (neg|main_hero_fallen)], # 按下Z键且主角未倒地时可触发
  4.     [
  5. #夜幕
  6.         (get_player_agent_no, ":player_agent"), # 获取玩家agent编号
  7.         (agent_is_active, ":player_agent"), # 确保玩家agent有效
  8.         (agent_get_wielded_item, ":weapon", ":player_agent", 0), # 获取玩家主手武器
  9.         (ge, ":weapon", 0), # 确保武器有效才能读取slot参数
  10.         (item_get_slot, ":cooldown_msec", ":weapon", slot_item_left_hand_skill_cooldown_msec), # 读取武器绑定的冷却时间(以0.1秒为单位)
  11.         (item_get_slot, ":anim", ":weapon", slot_item_anim), # 读取武器绑定的冷却时间(以0.1秒为单位)

  12.         (item_get_slot, ":duration_msec", ":weapon", slot_item_left_hand_skill_duration_msec), # 读取武器绑定的持续时间(以0.1秒为单位)
  13.         (item_get_slot, ":base_radius", ":weapon", slot_item_left_hand_skill_base_radius), # 读取武器绑定的基础半径(厘米)
  14.         (item_get_slot, ":damage_delay_msec", ":weapon", slot_item_left_hand_skill_damage_delay_msec), # 读取武器绑定的伤害生效延迟(以0.1秒为单位)
  15.         (item_get_slot, ":skill_type", ":weapon", slot_item_skill_type), # 读取武器绑定的伤害生效延迟(以0.1秒为单位)

  16.         (gt, ":duration_msec", 0), # 必须配置持续时间
  17.         (gt, ":base_radius", 0), # 必须配置基础半径
  18.         (ge, ":damage_delay_msec", 0), # 伤害延迟可为0,不能为负数
  19.         (val_mul, ":cooldown_msec", 100), # 将冷却时间从0.1秒单位转换为毫秒(×100)
  20.         (val_mul, ":duration_msec", 100), # 将持续时间从0.1秒单位转换为毫秒(×100)
  21.         (val_mul, ":damage_delay_msec", 100), # 将伤害延迟从0.1秒单位转换为毫秒(×100)
  22.         (gt, ":cooldown_msec", 0), # 转换后冷却必须有效
  23.         (gt, ":duration_msec", 0), # 转换后持续必须有效
  24.         (ge, ":damage_delay_msec", 0), # 转换后伤害延迟可为0,不能为负数
  25.         (store_mission_timer_a_msec, ":cur_time"), # 记录当前时间(毫秒)
  26.         (agent_get_slot, ":next_time", ":player_agent", slot_agent_left_hand_skill_cooldown_time), # 读取冷却结束时间
  27.         (ge, ":cur_time", ":next_time"), # 当前时间必须达到冷却结束时间
  28.         (try_begin), # 如果已有旧的spr则隐藏,避免残留
  29.             (agent_get_slot, ":old_prop", ":player_agent", slot_agent_left_hand_skill_prop), # 取出旧prop实例
  30.             (prop_instance_is_valid, ":old_prop"), # 确保旧prop实例有效
  31.             (scene_prop_set_visibility, ":old_prop", 0), # 隐藏旧prop,避免重复显示
  32.         (try_end), # 旧prop处理结束
  33.         (spawn_scene_prop, ":skill_type"), # 生成新的左手爆发spr实例
  34.         (assign, ":prop_instance", reg0), # 获取新生成的prop实例id
  35.         (scene_prop_set_visibility, ":prop_instance", 1), # 显示新生成的prop
  36.         (agent_set_attached_scene_prop, ":player_agent", ":prop_instance", 0, 19, 1), # 附着prop到左手骨骼(bone 19)
  37.         (agent_set_attached_scene_prop_x, ":player_agent", 8, 0), # 设置prop相对左手的X偏移(厘米)
  38.         (agent_set_attached_scene_prop_y, ":player_agent", 6, 0), # 设置prop相对左手的Y偏移(厘米)
  39.         (agent_set_attached_scene_prop_z, ":player_agent", -4, 0), # 设置prop相对左手的Z偏移(厘米)
  40.         (agent_set_slot, ":player_agent", slot_agent_left_hand_skill_prop, ":prop_instance"), # 记录当前prop实例到玩家槽位
  41.         (agent_set_slot, ":player_agent", slot_agent_left_hand_skill_start_time, ":cur_time"), # 记录技能开始时间
  42.         (store_add, ":damage_time", ":cur_time", ":damage_delay_msec"), # 计算本次技能可开始伤害的时间点
  43.         (agent_set_slot, ":player_agent", slot_agent_left_hand_skill_damage_time, ":damage_time"), # 写入本次技能可开始伤害时间
  44.         (store_add, ":end_time", ":cur_time", ":duration_msec"), # 计算技能结束时间
  45.         (agent_set_slot, ":player_agent", slot_agent_left_hand_skill_end_time, ":end_time"), # 写入技能结束时间
  46.         (store_add, ":cooldown_time", ":cur_time", ":cooldown_msec"), # 计算技能冷却结束时间
  47.         (agent_set_slot, ":player_agent", slot_agent_left_hand_skill_cooldown_time, ":cooldown_time"), # 写入冷却结束时间
  48.         (agent_set_animation, ":player_agent", ":anim", 1), # 播放释放动作动画
  49.         (try_begin),
  50.           (eq,":anim","anim_jianwu"),
  51.         (display_message, "@正 在 使 用 技 能 : 提 利 卡 斯 之 剑^技 能 类 型 : 提 利 卡 斯 系 魔 法", 0xADD8E6),
  52.         (try_end),
  53.     ])#夜幕


  54. left_hand_burst_update = ( # 技能更新器:进行骨骼级碰撞判定并造成伤害
  55. 0.1, 0, 0, # 每0.1秒执行一次,控制判定频率
  56.     [],
  57.     [
  58. #夜幕
  59.         (get_player_agent_no, ":player_agent"), # 获取玩家agent编号
  60.         (agent_is_active, ":player_agent"), # 确保玩家agent有效
  61.         (agent_get_slot, ":prop_instance", ":player_agent", slot_agent_left_hand_skill_prop), # 获取当前prop实例
  62.         (prop_instance_is_valid, ":prop_instance"), # 确保prop实例仍有效
  63.         (agent_get_slot, ":end_time", ":player_agent", slot_agent_left_hand_skill_end_time), # 读取技能结束时间
  64.         (store_mission_timer_a_msec, ":cur_time"), # 获取当前时间(毫秒)
  65.         (try_begin), # 若已到结束时间则清理prop
  66.             (ge, ":cur_time", ":end_time"), # 当前时间超过结束时间
  67.             (scene_prop_set_visibility, ":prop_instance", 0), # 隐藏prop
  68.             (assign, ":invalid", -1), # 用-1表示无效prop
  69.             (agent_set_slot, ":player_agent", slot_agent_left_hand_skill_prop, ":invalid"), # 重置prop槽位
  70.         (else_try), # 未结束则继续进行骨骼级碰撞判定
  71.             (agent_get_wielded_item, ":weapon", ":player_agent", 0), # 获取玩家主手武器
  72.             (ge, ":weapon", 0), # 确保武器有效才能读取slot参数
  73.             (item_get_slot, ":base_radius", ":weapon", slot_item_left_hand_skill_base_radius), # 读取武器绑定的骨骼碰撞半径(厘米)
  74.             (item_get_slot, ":damage_multiplier", ":weapon", slot_item_left_hand_skill_damage_multiplier), # 读取武器绑定的伤害倍率(百分比)
  75.             (gt, ":base_radius", 0), # 基础半径必须有效
  76.             (gt, ":damage_multiplier", 0), # 伤害倍率必须有效
  77.             (agent_get_slot, ":damage_time", ":player_agent", slot_agent_left_hand_skill_damage_time), # 读取本次技能可开始伤害时间
  78.             (ge, ":cur_time", ":damage_time"), # 动作执行达到延迟时间后才允许造成伤害
  79.             (prop_instance_get_position, pos3, ":prop_instance"), # 获取技能spr当前位置,避免使用玩家中心点导致误伤
  80.             (agent_get_team, ":player_team", ":player_agent"), # 获取玩家队伍
  81.             (assign, ":damage", 0), # 初始化伤害值
  82.             (item_get_swing_damage, ":swing", ":weapon"), # 读取挥砍伤害
  83.             (item_get_thrust_damage, ":thrust", ":weapon"), # 读取刺击伤害
  84.             (assign, ":damage", ":swing"), # 默认使用挥砍伤害
  85.             (val_max, ":damage", ":thrust"), # 取挥砍与刺击中较大的作为基础伤害
  86.             (val_mul, ":damage", ":damage_multiplier"), # 基础伤害乘武器绑定倍率(百分比)
  87.             (val_div, ":damage", 100), # 百分比还原,得到最终伤害
  88.             (gt, ":damage", 0), # 最终伤害必须大于0
  89.             (try_for_agents, ":enemy_agent"), # 遍历所有agent寻找敌人
  90.                 (agent_is_alive, ":enemy_agent"), # 目标必须存活
  91.                 (agent_is_human, ":enemy_agent"), # 目标必须为人形
  92.                 (agent_get_team, ":enemy_team", ":enemy_agent"), # 获取目标队伍
  93.                 (teams_are_enemies, ":player_team", ":enemy_team"), # 必须是敌对关系
  94.                 (agent_get_slot, ":last_hit_time", ":enemy_agent", slot_agent_left_hand_skill_last_hit_time), # 读取目标上次被命中的时间
  95.                 (ge, ":cur_time", ":last_hit_time"), # 当前时间必须超过记录时间,避免重复命中
  96.                 (assign, ":hit_bone", 0), # 初始化是否命中骨骼标记
  97.                 (agent_get_bone_position, pos4, ":enemy_agent", 6, 1), # 读取敌人躯干骨骼位置(全局)
  98.                 (get_distance_between_positions, ":d0", pos3, pos4), # 计算技能spr与躯干骨骼距离
  99.                 (try_begin), # 先检测躯干骨骼命中
  100.                     (le, ":d0", ":base_radius"), # 半径内则判定命中
  101.                     (assign, ":hit_bone", 1), # 记录已命中
  102.                 (else_try), # 躯干未命中则继续检测头部
  103.                     (agent_get_bone_position, pos4, ":enemy_agent", 7, 1), # 读取敌人头部骨骼位置(全局)
  104.                     (get_distance_between_positions, ":d1", pos3, pos4), # 计算技能spr与头部骨骼距离
  105.                     (le, ":d1", ":base_radius"), # 半径内则判定命中
  106.                     (assign, ":hit_bone", 1), # 记录已命中
  107.                 (else_try), # 头部未命中则继续检测骨盆
  108.                     (agent_get_bone_position, pos4, ":enemy_agent", 0, 1), # 读取敌人骨盆骨骼位置(全局)
  109.                     (get_distance_between_positions, ":d2", pos3, pos4), # 计算技能spr与骨盆骨骼距离
  110.                     (le, ":d2", ":base_radius"), # 半径内则判定命中
  111.                     (assign, ":hit_bone", 1), # 记录已命中
  112.                 (try_end),
  113.                 (eq, ":hit_bone", 1), # 仅骨骼检测命中时才真正造成伤害
  114.                 (agent_deliver_damage_to_agent, ":player_agent", ":enemy_agent", ":damage", ":weapon"), # 依据武器伤害倍率对敌人造成伤害
  115.                 (agent_play_sound, ":enemy_agent", "snd_metal_hit_high_armor_high_damage"),  # 播放音效

  116.                 (agent_set_slot, ":enemy_agent", slot_agent_left_hand_skill_last_hit_time, ":end_time"), # 记录命中时间为本次技能结束时间,避免多段伤害
  117.             (try_end), # 遍历敌人结束
  118.         (try_end), # 技能结束检查结束
  119.     ])#夜幕
复制代码
以下为一些武器参数
  1. slot_item_left_hand_skill_cooldown_msec = 209  # 技能:绑定到武器上的冷却时间(毫秒)
  2. slot_item_left_hand_skill_duration_msec = 210  # 技能:绑定到武器上的持续时间(毫秒)
  3. slot_item_left_hand_skill_base_radius   = 211  # 技能:绑定到武器上的基础半径(厘米)
  4. slot_item_left_hand_skill_damage_delay_msec = 212  # 技能:绑定到武器上的伤害生效延迟(以0.1秒为单位)
  5. slot_item_left_hand_skill_damage_multiplier = 213 #伤害倍率百分比
  6. slot_item_anim = 214 #动作
  7. slot_item_skill_type = 215 #技能模型
复制代码


您需要登录后才可以回帖 登录 | 注册(Register!)

本版积分规则

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

GMT+8, 2026-2-22 06:29 , Processed in 0.087598 second(s), 18 queries , Gzip On, MemCached On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

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