骑马与砍杀中文站论坛

 找回密码
 注册(Register!)

QQ登录

只需一步,快速开始

搜索
购买CDKEY 小黑盒加速器
查看: 853|回复: 2

[功能与代码] 简易的炮兵,使用场景道具

[复制链接]

13

主题

86

回帖

145

积分

见习骑士

Rank: 3

UID
3304622
第纳尔
595
精华
0
互助
19
荣誉
2
贡献
0
魅力
123
注册时间
2021-12-28
鲜花(26) 鸡蛋(0)
发表于 2024-2-16 15:08:15 | 显示全部楼层 |阅读模式
本帖最后由 杰喵喵 于 2024-2-20 11:30 编辑

简易的炮兵,使用场景道具:

参考了九章大佬的投石机做的:
【战团】简易的简单投石机 - MOD制作技术区 - 骑马与砍杀中文站论坛 - Powered by Discuz! (mountblade.com.cn)

测试效果视频:
https://www.bilibili.com/video/B ... id_from=333.999.0.0
直接上代码:
1.mt部分:
  1. ##攻城武器部分
  2. common_siege_weapon = (0, 0, 1,
  3. [
  4. (key_is_down|this_or_next,key_n),
  5. (key_clicked,key_n),
  6. ],
  7. [

  8.     (get_player_agent_no, ":player_agent"),
  9.     (agent_is_alive, ":player_agent"),
  10.     (agent_get_team,":team",":player_agent"),
  11.     (init_position,pos40),
  12.     (agent_get_position,pos40,":player_agent"),
  13.     (set_spawn_position, pos40),
  14.     (spawn_scene_prop,"spr_war_machinery_huopao_gear"),
  15.     (assign,":sprop_instance",reg0),
  16.     (scene_prop_set_team, ":sprop_instance", ":team"),
  17.     (scene_prop_get_team, ":scene_prop_team", ":sprop_instance"),

  18.     (position_move_x, pos40, -150),
  19.     (set_spawn_position,pos40),
  20.     (spawn_agent,"trp_swadian_sergeant"),#刷新兵种
  21.    
  22.     (agent_force_rethink, reg0),#强制重新思考
  23.     (agent_ai_set_aggressiveness, reg0, 2500),#攻击性
  24.     (agent_set_slot, reg0, slot_agent_courage_score, 12000),#战场勇气
  25.    
  26.     (assign,":agent_a",reg0),
  27.     (agent_set_team,":agent_a",":scene_prop_team"),
  28.     (scene_prop_set_slot,":sprop_instance",scene_prop_in_use_for_agent,":agent_a"),
  29.     (agent_set_speed_modifier, ":agent_a", 100),
  30.     (agent_set_position,":agent_a",pos40),
  31.    
  32.     (prop_instance_get_position, pos45, ":sprop_instance"),
  33.     (prop_instance_animate_to_position,":sprop_instance",pos45,100),
  34.    
  35. ]
  36. )
复制代码
2.场景道具部分
  1. #不设置血量和碰撞体减少难度  
  2. ("war_machinery_huopao_gear",sokf_moveable,"huopao_gear","0",
  3. [
  4.    (ti_on_scene_prop_init,
  5.     [
  6.       (store_trigger_param_1, ":sprop_instance"),
  7.       (scene_prop_set_slot, ":sprop_instance", scene_prop_effect_done,0),
  8.       (scene_prop_set_slot, ":sprop_instance", scene_prop_ammo_count,20),
  9.     ]),
  10.    

  11.    (ti_on_scene_prop_animation_finished,
  12.     [
  13.       
  14.       (store_trigger_param_1, ":sprop_instance"),
  15.       (scene_prop_get_slot, ":ctrl_agent", ":sprop_instance", scene_prop_in_use_for_agent),
  16.       (gt,":ctrl_agent",0),
  17.       (agent_is_alive, ":ctrl_agent"),
  18.       (agent_is_human, ":ctrl_agent"),
  19.       
  20.       (agent_get_team,":agent_team",":ctrl_agent"),
  21.       (agent_get_division, ":agent_division", ":ctrl_agent"),
  22.       (team_get_movement_order, ":movement_order", ":agent_team", ":agent_division"),
  23.       
  24.       #剩余弹药处理,一但弹药为零就不会进入这里
  25.       (assign, ":run_go", 1),
  26.       (scene_prop_get_slot, ":ammo_count", ":sprop_instance", scene_prop_ammo_count),
  27.       (try_begin),
  28.             (lt, ":ammo_count",1),
  29.             (agent_clear_scripted_mode,":ctrl_agent"),
  30.             (assign, ":run_go", 0),
  31.             #隐身处理
  32.             (scene_prop_get_visibility, ":flag_visibility", ":sprop_instance"),
  33.             (try_begin),
  34.                 (ge, ":flag_visibility",1),
  35.                 (scene_prop_set_visibility, ":sprop_instance", 0),
  36.             (try_end),
  37.       (try_end),
  38.       (eq, ":run_go", 1),
  39.       
  40.       #ctrl_agent 与火炮距离计算
  41.       (assign,":distance_instance",300),
  42.       (try_begin),
  43.           (agent_get_position,pos52,":ctrl_agent"),
  44.           (prop_instance_get_position,pos53,":sprop_instance"),   
  45.           (get_distance_between_positions,":distance_instance", pos52,pos53),
  46.       (try_end),
  47.       
  48.       #敌人接近计算
  49.       (assign,":cached_enemie",0),#没有敌人接近
  50.       (agent_ai_get_num_cached_enemies, ":num", ":ctrl_agent"),
  51.       (try_begin),
  52.           (ge,":num",1),
  53.           (agent_ai_get_cached_enemy, ":enemies", ":ctrl_agent", 0),
  54.           (agent_is_alive,":enemies"),
  55.           (agent_get_position,pos52,":enemies"),
  56.           (agent_get_position,pos53,":ctrl_agent"),
  57.           (get_distance_between_positions,":distance_enemy", pos52,pos53),
  58.           (le,":distance_enemy",300),
  59.           (assign,":cached_enemie",1),#有敌人接近
  60.       (try_end),
  61.       
  62.       
  63.      #ctrl_agent 战斗状态是否会丢下火炮
  64.       (assign,":drop_the_gun",0),
  65.       (try_begin),
  66.          (agent_slot_eq, ":ctrl_agent", slot_agent_is_running_away, 1),#逃跑 #且命令不是撤退,掉下火,炮
  67.          (neg|eq,":movement_order",mordr_retreat),
  68.          (assign,":drop_the_gun",1),
  69.       (else_try),
  70.          (eq,":cached_enemie",1),#有敌人接近
  71.          (assign,":drop_the_gun",1),
  72.       (try_end),
  73.       
  74.       #射击条件计算 ctrl_agent的大腿l位置可以看到target的头部
  75.       (assign, ":shoot", 0),
  76.       (try_begin),
  77.             (agent_ai_get_look_target, ":target", ":ctrl_agent"),
  78.             (gt, ":target", -1),
  79.             (agent_is_alive,":target"),
  80.             (agent_get_bone_position, pos52, ":target", 9,1),#头部
  81.             (agent_get_bone_position, pos53, ":ctrl_agent", 1,1),#大腿l位置
  82.             (position_has_line_of_sight_to_position, pos53, pos52),
  83.             (get_distance_between_positions,":distance_enemy",pos53,pos52),
  84.             (is_between,":distance_enemy", 300,25000),
  85.             (val_add, ":shoot", 1),
  86.       (try_end),
  87.      
  88.       (try_begin),#火炮允许射击 需要敌人不接近且满足射击条件
  89.            (eq,":drop_the_gun",0),
  90.            (eq,":cached_enemie",0),
  91.            (ge, ":shoot", 1),
  92.            
  93.            (agent_set_speed_modifier,":ctrl_agent",50),
  94.            #强制设定ctrl_agent 看向 target 的头部
  95.            (agent_get_bone_position, pos52, ":target", 9,1),
  96.            (agent_set_look_target_position,":ctrl_agent",pos52),
  97.            (prop_instance_get_position,pos35,":sprop_instance"),   
  98.            (agent_get_look_position, pos36, ":ctrl_agent"),
  99.            (position_move_y,pos35,200,0),
  100.            (position_move_y,pos36,200,0),
  101.            (position_get_rotation_around_z, ":agent_look_around_z", pos36),
  102.            (position_get_rotation_around_z, ":sprop_instance_around_z", pos35),
  103.            (store_sub,":sub_value",":agent_look_around_z",":sprop_instance_around_z"),
  104.            (assign,":sub_value_a",":sub_value"),
  105.            (val_abs,":sub_value_a"),

  106.            #火炮跟随ctrl_agent视角计算
  107.            (assign,":rotate_z",0),
  108.            (try_begin),
  109.                 (ge,":sub_value_a",3),
  110.                 (store_div,":rotate_z",":sub_value_a",3),
  111.                 (val_max,":rotate_z",3),
  112.                 (try_begin),
  113.                     (gt,":sub_value",0),
  114.                     (val_mul,":rotate_z",1),
  115.                 (else_try),
  116.                     (lt,":sub_value",0),
  117.                     (val_mul,":rotate_z",-1),
  118.                 (try_end),
  119.            (try_end),
  120.            
  121.            (try_begin),#火炮移动瞄准目标
  122.                 (neg|eq,":rotate_z",0),
  123.                 (prop_instance_get_position,pos45,":sprop_instance"),   
  124.                 (position_rotate_z,pos45,":rotate_z"),
  125.                 (position_set_z_to_ground_level,pos45),
  126.                 (prop_instance_animate_to_position,":sprop_instance",pos45,10),
  127.                 (position_move_x, pos45, -150),
  128.                 (position_copy_rotation,pos45,pos36),
  129.                 #(agent_set_position,":ctrl_agent",pos45),快速移动 ctrl_agent
  130.                 (agent_set_scripted_destination,":ctrl_agent",pos45),
  131.            (else_try),#火炮开炮
  132.                 (prop_instance_get_position,pos45,":sprop_instance"),
  133.                 (position_set_z_to_ground_level,pos45),               
  134.                 (prop_instance_animate_to_position,":sprop_instance",pos45,1),
  135.                 (position_move_x, pos45, -150),
  136.                 (agent_set_scripted_destination,":ctrl_agent",pos45),
  137.                
  138.                 (scene_prop_get_slot, ":effect_done", ":sprop_instance", scene_prop_effect_done),
  139.                 #发射时间间隔设置
  140.                 (assign,":cunt_done",300),
  141.                 (try_begin),
  142.                     (lt,":effect_done",":cunt_done"),
  143.                     (val_add,":effect_done",1),
  144.                     (scene_prop_set_slot,":sprop_instance",scene_prop_effect_done,":effect_done"),
  145.                 (try_end),
  146.                 (ge,":effect_done",":cunt_done"),
  147.                 (scene_prop_set_slot,":sprop_instance",scene_prop_effect_done,0),
  148.                 (prop_instance_get_position, pos45, ":sprop_instance"),
  149.                 (position_move_y,pos45,200,0),
  150.                 (position_move_z,pos45,100,0),
  151.                 (position_copy_rotation,pos45,pos36),
  152.                 (store_random_in_range, ":var_15", -2, 2),
  153.                 (store_random_in_range, ":var_16", -2, 2),
  154.                 (call_script,"script_cf_fire_round_ai_c",":distance_enemy"),
  155.                 (assign, ":rotate_x_floating", reg30),
  156.                 (val_div, ":rotate_x_floating", 10),
  157.                 (set_fixed_point_multiplier, 10),
  158.                 (convert_to_fixed_point, ":rotate_x_floating"),
  159.                 (set_fixed_point_multiplier, 10),
  160.                 (position_rotate_x_floating, pos45, ":var_16"),
  161.                 (position_rotate_z_floating, pos45, ":var_15"),
  162.                 (position_rotate_x_floating, pos45, ":rotate_x_floating"),
  163.                 (set_fixed_point_multiplier, 1),
  164.                 (set_fixed_point_multiplier, 1),
  165.                 (store_random_in_range, ":var_16", 56, 66),   
  166.                 (convert_to_fixed_point, ":var_16"),  
  167.                 (add_missile, ":ctrl_agent", pos45, ":var_16", "itm_gun_barrel", 0, "itm_artillery_ammunition", 0),
  168.                 (particle_system_burst, "psys_pistol_smoke_big", pos45,25),
  169.                 (play_sound_at_position,"snd_gun_barrel_fire",pos45,0),
  170.                 (val_sub,":ammo_count",1),
  171.                 (scene_prop_set_slot, ":sprop_instance", scene_prop_ammo_count,":ammo_count"),
  172.             (try_end),
  173.        (else_try),#非战斗中ctrl_agent 远离了火炮归位,回来拉火炮
  174.             (eq,":drop_the_gun",0),
  175.             (ge,":distance_instance",300),
  176.             (prop_instance_get_position,pos45,":sprop_instance"),
  177.             (position_set_z_to_ground_level,pos45),               
  178.             (prop_instance_animate_to_position,":sprop_instance",pos45,1),
  179.             (position_move_x, pos45, -150),
  180.             (agent_set_scripted_destination,":ctrl_agent",pos45),  
  181.             (agent_set_speed_modifier,":ctrl_agent",100),
  182.        (else_try),#非战斗中ctrl_agent 自由移动火炮跟随
  183.             (eq,":drop_the_gun",0),
  184.             (agent_clear_scripted_mode,":ctrl_agent"),
  185.             (init_position,pos50),
  186.             (agent_get_position,pos50,":ctrl_agent"),
  187.             (position_move_x,pos50,150),
  188.             (position_move_y,pos50,-150),
  189.             (position_set_z_to_ground_level,pos50),
  190.             (prop_instance_animate_to_position,":sprop_instance",pos50,25),
  191.             (agent_set_speed_modifier,":ctrl_agent",50),
  192.        (else_try),#ctrl_agent 战斗或者逃跑,火炮丢在原地方
  193.             (eq,":drop_the_gun",1),
  194.             (prop_instance_get_position,pos45,":sprop_instance"),
  195.             (position_set_z_to_ground_level,pos45),            
  196.             (prop_instance_animate_to_position,":sprop_instance",pos45,1),
  197.             (agent_set_speed_modifier,":ctrl_agent",100),
  198.        (try_end),

  199.       
  200.       
  201.     ]),

  202. ]),   
复制代码

3.脚步部分,九章大佬的简易瞄准
  1. #九章大佬的投石机代码-开始#

  2. ("cf_fire_round_ai_c",#简易测距c(60弹速,最大射程24000)返回值需要浮点化
  3. [
  4.     (store_script_param, ":var_14", 1),
  5.         (assign,":time",0),
  6.             (try_begin),
  7.                 (le, ":var_14", 3000),
  8.                 (assign,":var_14",0),
  9.                 (assign,":time",0),
  10.             (else_try),
  11.                 (is_between, ":var_14", 3000,4400),
  12.                 (val_div, ":var_14", 150),#1-2
  13.                 (assign,":time",1),
  14.             (else_try),
  15.                 (is_between, ":var_14", 4400,5200),
  16.                 (val_div, ":var_14", 130),#2-3
  17.                 (assign,":time",1),
  18.             (else_try),
  19.                 (is_between, ":var_14", 5200,7000),
  20.                 (val_div, ":var_14", 120),#3-4
  21.                 (assign,":time",1),
  22.             (else_try),
  23.                 (is_between, ":var_14", 7000,11400),
  24.                 (val_div, ":var_14", 104),#4-5
  25.                 #(val_add, ":var_14", -1),
  26.                 (assign,":time",2),
  27.             (else_try),
  28.                (is_between, ":var_14", 11400,14500),
  29.                (val_div, ":var_14", 99),#5-6
  30.                #(val_add, ":var_14", -1),
  31.                (assign,":time",3),
  32.             (else_try),
  33.                (is_between, ":var_14", 14500,17100),
  34.                (val_div, ":var_14", 93),#6-7
  35.                #(val_add, ":var_14", -1),
  36.                (assign,":time",3),
  37.             (else_try),
  38.                (is_between, ":var_14", 17100,18900),
  39.                (val_div, ":var_14", 88),#7-8
  40.                #(val_add, ":var_14", -1),
  41.                (assign,":time",4),
  42.             (else_try),
  43.                (is_between, ":var_14", 18900,20400),
  44.                (val_div, ":var_14", 84),#9-12
  45.                #(val_add, ":var_14", -1),
  46.                (assign,":time",5),
  47.             (else_try),
  48.                (is_between, ":var_14", 20400,21200),
  49.                (val_div, ":var_14", 85),#12-15
  50.                #(val_add, ":var_14", -1),
  51.                (assign,":time",5),
  52.             (else_try),
  53.                (is_between, ":var_14", 21200,21600),
  54.                (val_div, ":var_14", 78),#15-17
  55.                #(val_add, ":var_14", -2),
  56.                (assign,":time",5),
  57.             (else_try),
  58.                (is_between, ":var_14", 21600,22600),
  59.                (val_div, ":var_14", 77),#17-20
  60.                #(val_add, ":var_14", -2),
  61.                (assign,":time",8),
  62.             (else_try),
  63.                (is_between, ":var_14", 22600,23100),
  64.                (val_div, ":var_14", 73),#20-22
  65.                #(val_add, ":var_14", -2),
  66.                (assign,":time",6),
  67.             (else_try),
  68.                (is_between, ":var_14", 23100,23500),
  69.                (val_div, ":var_14", 69),#20-22
  70.                #(val_add, ":var_14", -2),
  71.                (assign,":time",6),
  72.             (else_try),
  73.                (is_between, ":var_14", 23500,24000),
  74.                (val_div, ":var_14", 64),#20-22
  75.                #(val_add, ":var_14", -2),
  76.                (assign,":time",7),
  77.             (else_try),
  78.                (is_between, ":var_14", 24000,99000),
  79.                #(val_div, ":var_14", 64),#20-22
  80.                #(val_add, ":var_14", -2),
  81.                (assign,":var_14",55),
  82.                (assign,":time",8),
  83.             (try_end),

  84.                         (assign,reg30,":var_14"),
  85.             (assign,reg31,":time"),
  86.     #(try_end),

  87. ]),
复制代码

4.常量
  1. #工作计数
  2. scene_prop_effect_done = 33
  3. #弹药计数
  4. scene_prop_ammo_count = 34
复制代码





评分

参与人数 2第纳尔 +40 互助 +2 魅力 +35 收起 理由
幼稚园殺手 + 10 + 1 + 5 您的帖子很有价值!
Aomine Daiki + 30 + 1 + 30 文章不错,继续努力!

查看全部评分

鲜花鸡蛋

幼稚园殺手  在2024-2-18 10:15  送朵鲜花  并说:我非常同意你的观点,送朵鲜花鼓励一下
幼稚园殺手  在2024-2-18 10:15  送朵鲜花  并说:我非常同意你的观点,送朵鲜花鼓励一下
幼稚园殺手  在2024-2-18 10:15  送朵鲜花  并说:我非常同意你的观点,送朵鲜花鼓励一下

32

主题

72

回帖

181

积分

见习骑士

Rank: 3

UID
3199602
第纳尔
1041
精华
0
互助
30
荣誉
0
贡献
1
魅力
203
注册时间
2020-9-4
鲜花(54) 鸡蛋(0)
发表于 2024-2-16 16:10:05 | 显示全部楼层
支持

1

主题

20

回帖

6

积分

平民

Rank: 1

UID
3487461
第纳尔
8
精华
0
互助
0
荣誉
0
贡献
0
魅力
0
注册时间
2023-2-20
鲜花(0) 鸡蛋(0)
发表于 2024-2-18 01:02:01 | 显示全部楼层
支持支持支持
您需要登录后才可以回帖 登录 | 注册(Register!)

本版积分规则

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

GMT+8, 2024-5-18 13:57 , Processed in 0.117180 second(s), 24 queries , Gzip On, MemCached On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

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