骑马与砍杀中文站论坛

 找回密码
 注册(Register!)

QQ登录

只需一步,快速开始

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

[功能与代码] 使用场景道具辅助飞行学习笔记(二)-空战与攻城

[复制链接]

16

主题

107

回帖

197

积分

见习骑士

Rank: 3

UID
3304622
第纳尔
690
精华
0
互助
26
荣誉
3
贡献
0
魅力
158
注册时间
2021-12-28
鲜花(31) 鸡蛋(0)
发表于 2023-8-28 22:52:20 | 显示全部楼层 |阅读模式
本帖最后由 杰喵喵 于 2023-8-29 08:33 编辑

一、效果概述与展示
1.按Y按键腾空进入飞行状态,飞行状态下贴近地面自动退出飞行;
2.飞行状态下,人的飞行操作与原来一样,视角对着天空前进升高飞行高度,对着地面前进降低飞行高度。骑马飞行情况下,非骑射状态下视角对着天空前进升高飞行高度,对着地面降低飞行高度;骑射状态下不改变飞行高度,其余操作与地面控制一样。
3.目前还不会编写AI,使用游戏自带AI加状态机与数据校正,具体细节看代码吧,骑射使用了君悦的AI,完整代码请看附件。

效果展示:
https://www.bilibili.com/video/BV1C14y1C7QU/

特别鸣谢:nimoadna(《大冒险家》)的指导与解答。

二、关键概念
1.Position rotation
  # Position rotation determines just that - rotation around corresponding
  # world axis. So rotation around Z axis means rotation around vertical axis,
  # in other words - turning right and left. Rotation around X and Y axis will
  # tilt the position forward/backwards and right/left respectively.


简单来说,agent的Position默认Y轴是前进后,X轴左右移动,Z轴上下移动,Position rotation就是沿着这些轴旋转。

2.场景道具销毁
似乎没有绝对消除的办法,我这里使用场景隐身与关闭物理来解决。 (prop_instance_enable_physics,":borad",0),#关闭碰撞体 (scene_prop_set_visibility,":borad",0),  #关闭显示
3.使用与下次飞行位置的Z轴-1垂直点,通过  position_set_z_to_ground_level 来用于是否接触地面判断。因为玩家始终在托板上面,使用玩家位置点来position_get_distance_to_ground_level 始终大于等于0。具体实现看下面程序。

3.position_get_distance_to_terrain,pos对地形的距离负数表示在地形之下,正数在地形之上。

4.城墙或者其他场景上降落使用
(cast_ray, <destination>, <hit_position_register>, <ray_position_register>, [<ray_length_fixed_point>]),
强制转换一条长度为[<ray_length_fixed_point>]的射线,从<ray_position_register>开始,并将最近的命中位置存储到<hit_position_register>中(如果没有命中则失败)。如果body hit是一个prop实例,它的id将被存储到<destination>中。  
简单来说就是将agent的位置点往下移动,绕X轴旋转 90度,然后发射判断线,如果有碰撞到非踏板的其他场景单位,则取消飞行。

5.退出飞行直接将踏板埋在底下。



三、代码
slot_agent_fly 飞行状态标志位
slot_agent_fly_borad 存储飞行道具的ID
my_prop_set_visibility 为常数0


玩家部分:

使用场景道具辅助飞行学习笔记
https://bbs.mountblade.com.cn/thread-2100606-1-1.html
(出处: 骑马与砍杀中文站论坛)

其他agent部分:
module_mission_templates
  1. #自己写的垃圾飞行AI,专门只是用近战步兵并且遭遇战专用 lead_charge
  2. common_agent_flying_lead_charge =  (0, 0, 0, [],
  3. [
  4.       #设置pos单位量尺为cm  
  5.     (set_fixed_point_multiplier, 100),
  6.    
  7.     (try_for_agents, ":agent_no"),
  8.         (agent_is_non_player,":agent_no"),
  9.         (agent_is_human, ":agent_no"),  ##是人
  10.         (agent_is_alive, ":agent_no"),  ##存活的
  11.         (neg|agent_is_wounded,":agent_no"),##非击晕的
  12.         (agent_get_troop_id,":troop_id",":agent_no"),
  13.         (agent_get_horse,":horse", ":agent_no"),
  14.         (agent_get_team,":agent_team",":agent_no"),
  15.         (agent_get_division, ":agent_division", ":agent_no"),
  16.         (team_get_movement_order, ":movement_order", ":agent_team", ":agent_division"),
  17.         
  18.         (assign,":agent_use_range",0),
  19.         (try_begin),
  20.             (call_script, "script_cf_agent_use_range_weapon",":agent_no"),
  21.             (assign,":agent_use_range",1),
  22.         (try_end),
  23.         
  24.         (assign,":agent_can_fly",0),
  25.         (try_begin),
  26.            (gt,":horse",-1),
  27.            (agent_get_item_id,":item_id",":horse"),
  28.            (eq,":item_id","itm_courser_fly"),
  29.            (assign,":agent_can_fly",1),
  30.         (else_try),
  31.            (this_or_next|eq,":troop_id","trp_nord_champion_fly"),#需要设定的单位
  32.            (eq,":troop_id","trp_swadian_sharpshooter_fly"),
  33.            (assign,":agent_can_fly",1),
  34.         (try_end),

  35.         (eq,":agent_can_fly",1),
  36.         (agent_get_slot,":borad",":agent_no",slot_agent_fly_borad),
  37.         (agent_ai_get_move_target,":target_agent",":agent_no"),
  38.       
  39.         (assign,":distance_target",5000),
  40.         (try_begin),
  41.             (gt,":target_agent",-1),
  42.             (init_position,pos20),
  43.             (agent_get_position, pos20, ":agent_no"),
  44.             (init_position,pos21),
  45.             (agent_get_position, pos21, ":target_agent"),
  46.             (position_get_distance_to_terrain,":terrain_agent_no",pos20),
  47.             (position_get_distance_to_terrain,":terrain_target_agent",pos21),
  48.             (position_set_z,pos20,0),
  49.             (position_set_z,pos21,0),
  50.             (get_distance_between_positions,":distance_target",pos20,pos21),
  51.             
  52.         (try_end),

  53.         (assign,":distance_target_judgment",200),
  54.         (assign,":terrain_judgment",100),
  55.         (try_begin),
  56.             (gt,":horse",-1),
  57.             (init_position,pos20),
  58.             (agent_get_speed,pos20,":horse"),
  59.             (assign,":var_0",":horse"),
  60.             (assign,":distance_target_judgment",1500),
  61.             (assign,":terrain_judgment",50),
  62.         (else_try),
  63.             (init_position,pos20),
  64.             (agent_get_speed,pos20,":agent_no"),
  65.             (assign,":var_0",":agent_no"),
  66.             (assign,":distance_target_judgment",200),
  67.             (assign,":terrain_judgment",100),
  68.         (try_end),

  69.         (try_begin),#开始产生床
  70.             (agent_slot_eq,":agent_no",slot_agent_fly,0),
  71.             (agent_get_slot,":borad",":agent_no",slot_agent_fly_borad),
  72.             (le,":borad",0),
  73.             (init_position,pos10),
  74.             (agent_get_position, pos10, ":agent_no"),
  75.             
  76.             (try_begin),
  77.                 (eq,"$g_battle_in_storm_a_city",0),
  78.                 (position_move_z,pos10,1000),
  79.             (else_try),
  80.                 (position_move_z,pos10,2000),      
  81.             (try_end),            
  82.             #产生床
  83.             (set_spawn_position, pos10),
  84.             (try_begin),
  85.                 (gt,":horse",-1),
  86.                 (spawn_scene_prop, "spr_bed_a_new"),
  87.             (else_try),
  88.                 (spawn_scene_prop, "spr_pillow_a_new"),
  89.             (try_end),
  90.             (assign,":borad",reg0),
  91.             (agent_set_slot,":agent_no",slot_agent_fly_borad,":borad"),
  92.             (prop_instance_enable_physics,":borad",1),#碰撞体
  93.             (scene_prop_set_visibility,":borad",my_prop_set_visibility),  #显示
  94.             #给马设定飞行托板仅仅是为了马死亡的时候将托板埋于地下,控制飞行的时候不需要
  95.             (try_begin),
  96.                 (gt,":horse",-1),
  97.                 (agent_set_slot,":horse",slot_agent_fly_borad,":borad"),
  98.             (try_end),
  99.             
  100.             (agent_set_slot,":agent_no",slot_agent_fly,1),
  101.             (agent_set_position, ":var_0", pos10),
  102.         (else_try),#正常飞行
  103.             (agent_slot_eq,":agent_no",slot_agent_fly,1),
  104.             
  105.             (agent_get_slot,":borad",":agent_no",slot_agent_fly_borad),
  106.             (gt,":borad",0),
  107.             (prop_instance_enable_physics,":borad",1),#碰撞体
  108.             
  109.             (assign,":y_move",0),
  110.             (assign,":x_move",0),
  111.             (assign,":z_move",0),
  112.             
  113.             (position_get_y,":y_speed",pos20),
  114.             (position_get_x,":x_speed",pos20),
  115.             (prop_instance_get_position, pos20, ":borad"),
  116.             (prop_instance_get_position, pos22, ":borad"),
  117.             (init_position,pos21),
  118.             (agent_get_look_position, pos21, ":agent_no"),

  119.             (try_begin),
  120.                 (gt,":horse",-1),
  121.                 (position_get_rotation_around_x,":rotation_x",pos21),
  122.                
  123.                 (val_div,":y_speed",70),
  124.                 (assign,":y_move",":y_speed"),
  125.                 (val_div,":x_speed",70),
  126.                 (assign,":x_move",":x_speed"),
  127.                
  128.                 (agent_get_animation,":animation",":horse",1),
  129.                 (try_begin),
  130.                     (eq|this_or_next,":animation","anim_horse_turn_right"),
  131.                     (eq,":animation","anim_horse_turn_right_head"),
  132.                     (position_rotate_z, pos20, -1),  
  133.                 (else_try),
  134.                     (eq|this_or_next,":animation","anim_horse_turn_left"),
  135.                     (eq,":animation","anim_horse_turn_left_head"),
  136.                     (position_rotate_z, pos20, 1),  
  137.                 (try_end),
  138.                
  139.                 #Z轴限制保护防止,角度过大出问题
  140.                 (assign,":forced_descent",0),
  141.                 (try_begin),
  142.                     (is_between,":rotation_x",1,91),#鼠标移动玩家视角向上 对着天空
  143.                     (store_div,":value", ":rotation_x",9),
  144.                     (val_add,":value",1),
  145.                     (store_div,":z_move",":y_speed",20),
  146.                     (val_mul,":z_move",":value"),   

  147.                     (try_begin),
  148.                         (ge,":terrain_target_agent",":terrain_agent_no"),
  149.                         (val_add,":z_move",4),
  150.                     (try_end),
  151.                 (else_try),
  152.                     (is_between,":rotation_x",270,360),#鼠标移动玩家视角向下 对着地面
  153.                     (neq,":movement_order",mordr_hold),
  154.                     (store_sub,":value", 360,":rotation_x"),
  155.                     (store_div,":value", ":value",9),
  156.                     (val_add,":value",4),
  157.                     (val_mul,":value",-1),
  158.                     (store_div,":z_move",":y_speed",20),
  159.                     (val_mul,":z_move",":value"),
  160.   
  161.                     (gt,":target_agent",-1),
  162.                     (call_script,"script_cf_agent_is_no_fly",":target_agent"),
  163.                     (try_begin),
  164.                         (ge,":terrain_target_agent",":terrain_agent_no"),
  165.                         (val_mul,":z_move",-1),
  166.                         (val_add,":z_move",4),
  167.                     (else_try),
  168.                         #检查是否为远程单位,远程单位不下降飞行高度
  169.                         (eq,":agent_use_range",1),
  170.                         (assign,":z_move",0),
  171.                     (else_try),
  172.                         (lt,":distance_target",":distance_target_judgment"),
  173.                         (val_add,":z_move",-4),
  174.                         (assign,":forced_descent",1),
  175.                     (try_end),
  176.                 (else_try),
  177.                     (eq,":rotation_x",0),
  178.                     (gt,":y_move",0),
  179.                     (assign,":z_move",0),
  180.                     (gt,":target_agent",-1),
  181.                     (call_script,"script_cf_agent_is_no_fly",":target_agent"),
  182.                   
  183.                     (try_begin),
  184.                         (ge,":terrain_target_agent",":terrain_agent_no"),
  185.                         (val_add,":z_move",4),
  186.                     (else_try),
  187.                         (eq,":agent_use_range",0),#不使用远程武器
  188.                         (lt,":distance_target",":distance_target_judgment"),
  189.                         (val_add,":z_move",-4),
  190.                         (assign,":forced_descent",1),
  191.                     (try_end),
  192.                   
  193.                 (try_end),
  194.                  
  195.                  #防止使用武器的时候Z轴上下移动,保证骑射水平移动
  196.                 (try_begin),
  197.                     (eq,":forced_descent",0),
  198.                     (agent_get_attack_action, ":attack_action", ":agent_no"),#Retrieves agent's current attack action. Possible values: free = 0, readying_attack = 1, releasing_attack = 2, completing_attack_after_hit = 3, attack_parried = 4, reloading = 5, after_release = 6, cancelling_attack = 7.
  199.                     (agent_get_defend_action, ":defend_action", ":agent_no"),#Retrieves agent's current defend action. Possible values: free = 0, parrying = 1, blocking = 2.
  200.                     (neq|this_or_next, ":attack_action",0),
  201.                     (neq, ":defend_action",0),
  202.                     (assign,":z_move",0),
  203.                  (try_end),

  204.             (else_try),
  205.                 (position_copy_rotation,pos20,pos21),
  206.                 (position_get_rotation_around_x,":rotation_x",pos21),
  207.                 (val_div,":y_speed",20),
  208.                 (assign,":y_move",":y_speed"),
  209.                 (val_div,":x_speed",20),
  210.                 (assign,":x_move",":x_speed"),
  211.                
  212.                 #Z轴限制保护防止,角度过大出问题
  213.                 (try_begin),
  214.                     (is_between,":rotation_x",1,91),#鼠标移动玩家视角向上 对着天空
  215.                     (try_begin),
  216.                         (gt,":rotation_x",45),
  217.                         (store_sub,":angle_x",":rotation_x",45),
  218.                         (val_mul,":angle_x",-1),
  219.                         (position_rotate_x,pos20,":angle_x"),
  220.                         (assign,":z_move",0),
  221.                     (try_end),         
  222.                 (else_try),
  223.                     (is_between,":rotation_x",270,360),#鼠标移动玩家视角向下 对着地面
  224.                     (try_begin),
  225.                         (lt,":rotation_x",315),
  226.                         (store_sub,":angle_x",315,":rotation_x"),
  227.                         (position_rotate_x,pos20,":angle_x"),
  228.                         (assign,":z_move",-1),
  229.                         (gt,":target_agent",-1),
  230.                         (call_script,"script_cf_agent_is_no_fly",":target_agent"),
  231.                         (lt,":distance_target",":distance_target_judgment"),
  232.                         (assign,":z_move",-3),
  233.                     (try_end),
  234.                 (else_try),
  235.                     (gt,":y_move",0),
  236.                     (eq,":rotation_x",0),
  237.                     (assign,":z_move",0),
  238.                     (gt,":target_agent",-1),
  239.                     (call_script,"script_cf_agent_is_no_fly",":target_agent"),
  240.                     (ge,":terrain_target_agent",":terrain_agent_no"),
  241.                     (val_add,":z_move",4),
  242.                 (try_end),
  243.             (try_end),
  244.             
  245.             (position_move_y, pos20, ":y_move"),
  246.             (position_move_x, pos20, ":x_move"),
  247.             (position_move_z, pos20, ":z_move"),
  248.             
  249.             #获得地图最大限制
  250.             (init_position,pos26),
  251.             (init_position,pos27),
  252.             (get_scene_boundaries, pos26, pos27),#左下角和右上角的点,方向朝上
  253.             (position_get_x, ":lower_left_corner_x", pos26),
  254.             (position_get_y, ":lower_left_corner_y", pos26),
  255.             (position_get_x, ":upper_right_corner_x", pos27),
  256.             (position_get_y, ":upper_right_corner_y", pos27),         
  257.             (val_add,":lower_left_corner_x",300),
  258.             (val_add,":lower_left_corner_y",300),
  259.             (val_sub,":upper_right_corner_x",300),
  260.             (val_sub,":upper_right_corner_y",300),
  261.    
  262.             (position_get_distance_to_terrain,":terrain",pos20),
  263.             (position_get_x,":pos_x",pos20),
  264.             (position_get_y,":pos_y",pos20),
  265.             #确保玩家在地图限制范围内移动,,判断障碍点玩家之间拥有视野
  266.             (try_begin),#正常飞行
  267.                 (le|this_or_next,":pos_x",":lower_left_corner_x"),
  268.                 (le,":pos_y",":lower_left_corner_y"),
  269.                
  270.                 (try_begin),
  271.                     (agent_slot_eq|this_or_next, ":agent_no", slot_agent_is_running_away, 1),#逃跑
  272.                     (eq,":movement_order",mordr_retreat),
  273.                     (agent_fade_out,":agent_no"),
  274.                     (position_set_z,pos20,-500),
  275.                     (prop_instance_set_position, ":borad", pos20),
  276.                 (else_try),
  277.                     (copy_position,pos20,pos22),
  278.                     (agent_force_rethink,":agent_no"),
  279.                     (position_move_y,pos22,-500),
  280.                     (position_rotate_z, pos22, 100),
  281.                     (agent_set_scripted_destination, ":agent_no", pos22, 1),
  282.                 (try_end),
  283.                
  284.             (else_try),
  285.                 (ge|this_or_next,":pos_x",":upper_right_corner_x"),
  286.                 (ge,":pos_y",":upper_right_corner_y"),
  287.                
  288.                 (try_begin),
  289.                     (agent_slot_eq|this_or_next, ":agent_no", slot_agent_is_running_away, 1),#逃跑
  290.                     (eq,":movement_order",mordr_retreat),
  291.                     (agent_fade_out,":agent_no"),
  292.                     (position_set_z,pos20,-500),
  293.                     (prop_instance_set_position, ":borad", pos20),
  294.                 (else_try),
  295.                     (copy_position,pos20,pos22),
  296.                     (agent_force_rethink,":agent_no"),
  297.                     (position_move_y,pos22,-500),
  298.                     (position_rotate_z, pos22, 100),
  299.                     (agent_set_scripted_destination, ":agent_no", pos22, 1),
  300.                 (try_end),
  301.                
  302.             (else_try), #主要针对野战情况下,退出飞行模式
  303.                 (le, ":terrain", ":terrain_judgment"),            
  304.                 (agent_set_slot,":agent_no",slot_agent_fly,2),  
  305.                 (prop_instance_enable_physics,":borad",0),#关闭碰撞体
  306.             (else_try),
  307.                 (init_position,pos23),
  308.                 (init_position,pos28),
  309.                 (agent_get_position,pos23,":var_0"),
  310.                 (position_move_z,pos23,-20),
  311.                 (position_rotate_x,pos23,90),
  312.                 #(cast_ray, <destination>, <hit_position_register>, <ray_position_register>, [<ray_length_fixed_point>]),
  313.                 #强制转换一条长度为[<ray_length_fixed_point>]的射线,从<ray_position_register>开始,并将最近的命中位置存储到<hit_position_register>中(如果没有命中则失败)。如果body hit是一个prop实例,它的id将被存储到<destination>中。   
  314.                 (cast_ray,":prop_id",pos28,pos23,20),
  315.                 (gt,":prop_id",-1),
  316.                 (prop_instance_get_scene_prop_kind,":prop_kind",":prop_id"),
  317.                 (neq,":prop_kind","spr_bed_a_new"),
  318.                 (neq,":prop_kind","spr_pillow_a_new"),
  319.                 (position_copy_rotation,pos28,pos20),
  320.                 (copy_position,pos20,pos28),
  321.                 (prop_instance_enable_physics,":borad",0),#关闭碰撞体
  322.                 (agent_set_slot,":agent_no",slot_agent_fly,2),#退出飞行                        
  323.             (try_end),
  324.             
  325.             #设置障碍判断pos25
  326.             (init_position,pos25),
  327.             (copy_position,pos25,pos20),
  328.             (try_begin),
  329.                 (gt,":horse",-1),
  330.                 (position_move_z, pos25, 300),
  331.                 (position_move_y, pos25, 200),
  332.             (else_try),
  333.                 (position_move_z, pos25, 150),
  334.                 (position_move_y, pos25, 100),
  335.             (try_end),
  336.             
  337.             (try_begin),
  338.                 (neg|agent_is_in_line_of_sight,":agent_no",pos25),
  339.                 (position_move_z, pos20, 5),
  340.                 (position_rotate_z,pos20,1),
  341.                 #(agent_force_rethink, ":agent_no"),
  342.             (try_end),
  343.             
  344.             (prop_instance_set_position, ":borad", pos20),
  345.             (prop_instance_get_position, pos20, ":borad"),#场景物的坐标,实时获取
  346.             (agent_set_position, ":var_0", pos20),
  347.               
  348.             (try_begin),
  349.                 (agent_slot_eq,":agent_no",slot_agent_fly,2),
  350.                 (position_set_z,pos20,-500),
  351.                 (prop_instance_set_position, ":borad", pos20),
  352.             (try_end),
  353.             
  354.         (else_try),#非飞行状态
  355.             (agent_slot_eq,":agent_no",slot_agent_fly,2),
  356.             (agent_get_slot,":borad",":agent_no",slot_agent_fly_borad),
  357.             (gt,":borad",0),
  358.             (gt,":target_agent",-1),
  359.             (eq,":movement_order",mordr_charge),

  360.             (init_position,pos20),
  361.             (agent_get_position, pos20, ":agent_no"),  
  362.             (try_begin),
  363.               (gt,":horse",-1),
  364.               (assign,":var_0",":horse"),
  365.               (position_move_z,pos20,50),
  366.               (assign,":distance_target_judgment",2000),
  367.             (else_try),
  368.               (assign,":var_0",":agent_no"),
  369.               (position_move_z,pos20,35),
  370.               (assign,":distance_target_judgment",1000),
  371.             (try_end),
  372.             
  373.             (assign,":agent_restart_fly",0),
  374.             (try_begin),
  375.                 (call_script,"script_cf_agent_is_fly",":target_agent"),
  376.                 (assign,":agent_restart_fly",1),
  377.             (else_try),
  378.                 (call_script,"script_cf_agent_is_no_fly",":target_agent"),
  379.                 (gt,":distance_target",":distance_target_judgment"),
  380.                 (assign,":agent_restart_fly",1),
  381.             (try_end),
  382.             
  383.             (eq,":agent_restart_fly",1),
  384.             #限制角度保护 X Y 轴rotation
  385.             (position_get_rotation_around_x, ":rotation_x", pos20),
  386.             (position_get_rotation_around_y, ":rotation_y", pos20),
  387.                
  388.             (try_begin),
  389.                 (gt,":rotation_x",0),
  390.                 (store_sub,":angle_x",":rotation_x",0),
  391.                 (val_mul,":angle_x",-1),
  392.                 (position_rotate_x,pos20,":angle_x"),
  393.             (else_try),
  394.                 (lt,":rotation_x",360),
  395.                 (store_sub,":angle_x",360,":rotation_x"),
  396.                 (position_rotate_x,pos20,":angle_x"),
  397.             (try_end),
  398.                
  399.            (try_begin),
  400.                 (gt,":rotation_y",0),
  401.                 (store_sub,":angle_y",":rotation_y",0),
  402.                 (val_mul,":angle_y",-1),
  403.                 (position_rotate_y,pos20,":angle_y"),
  404.             (else_try),
  405.                 (lt,":rotation_y",360),
  406.                 (store_sub,":angle_y",360,":rotation_y"),
  407.                 (position_rotate_y,pos20,":angle_y"),
  408.             (try_end),
  409.                
  410.             (prop_instance_enable_physics,":borad",1),#碰撞体
  411.             (prop_instance_set_position, ":borad", pos20),
  412.             (prop_instance_get_position, pos20, ":borad"),
  413.             (agent_set_position, ":var_0", pos20),
  414.             (agent_set_slot,":agent_no",slot_agent_fly,3),
  415.             (position_get_distance_to_terrain,":terrain",pos20),
  416.             (agent_set_slot,":agent_no",slot_agent_terrain,":terrain"),
  417.         (else_try),#起飞状态
  418.             (agent_slot_eq,":agent_no",slot_agent_fly,3),
  419.             (agent_get_slot,":borad",":agent_no",slot_agent_fly_borad),
  420.             (gt,":borad",0),
  421.             (prop_instance_enable_physics,":borad",1),#碰撞体
  422.             (prop_instance_get_position, pos20, ":borad"),#场景物的坐标,实时获取
  423.             (position_get_distance_to_terrain,":terrain",pos20),
  424.             (agent_get_slot,":terrain_judgment",":agent_no",slot_agent_terrain),
  425.             (val_add,":terrain_judgment",500),
  426.             
  427.             (try_begin),
  428.               (gt,":horse",-1),
  429.               (assign,":var_0",":horse"),
  430.             (else_try),
  431.               (assign,":var_0",":agent_no"),
  432.             (try_end),
  433.             
  434.             (try_begin),
  435.                 (le, ":terrain",":terrain_judgment"),
  436.                 (position_move_z,pos20,5),   
  437.                 (prop_instance_set_position, ":borad", pos20),
  438.                 (prop_instance_get_position, pos20, ":borad"),
  439.                 (agent_set_position, ":var_0", pos20),
  440.             (else_try),
  441.                 (agent_set_slot,":agent_no",slot_agent_fly,1),
  442.             (try_end),
  443.             
  444.         (try_end),   
  445.     (try_end),
  446. ]
  447. )
复制代码


module_scripts部分
  1.    #检查agent是使用远程武器
  2.    ("cf_agent_use_range_weapon", [
  3.     (store_script_param, ":agent_no", 1),
  4.    
  5.     (gt,":agent_no",-1),
  6.     (agent_get_wielded_item, ":wielded_item", ":agent_no", 0),
  7.     (gt,":wielded_item",0),
  8.     (item_get_type, ":item_weapon_type", ":wielded_item"),
  9.     (eq|this_or_next, ":item_weapon_type",itp_type_bow),
  10.     (eq|this_or_next,":item_weapon_type",itp_type_crossbow),
  11.     (eq|this_or_next,":item_weapon_type",itp_type_thrown),
  12.     (eq|this_or_next,":item_weapon_type",itp_type_pistol),
  13.     (eq,":item_weapon_type",itp_type_musket),
  14.     ]),
  15.    
  16.    
  17.     #检查agent不使用使用远程武器
  18.     ("cf_agent_no_use_range_weapon", [
  19.     (store_script_param, ":agent_no", 1),
  20.    
  21.     (gt,":agent_no",-1),
  22.     (agent_get_wielded_item, ":wielded_item", ":agent_no", 0),
  23.     (gt,":wielded_item",0),
  24.     (item_get_type, ":item_weapon_type", ":wielded_item"),
  25.     (neg, ":item_weapon_type",itp_type_bow),
  26.     (neg,":item_weapon_type",itp_type_crossbow),
  27.     (neg,":item_weapon_type",itp_type_thrown),
  28.     (neg,":item_weapon_type",itp_type_pistol),
  29.     (neg,":item_weapon_type",itp_type_musket),
  30.     ]),
  31.      
  32.    #检查agent是是飞行单位
  33.    ("cf_agent_is_fly", [
  34.     (store_script_param, ":agent_no", 1),
  35.    
  36.     (gt,":agent_no",-1),
  37.     (agent_slot_eq|this_or_next,":agent_no",slot_agent_fly,1),
  38.     (agent_slot_eq,":agent_no",slot_agent_fly,3),
  39.     ]),
  40.    
  41.     #检查agent是不是飞行单位
  42.    ("cf_agent_is_no_fly", [
  43.     (store_script_param, ":agent_no", 1),
  44.    
  45.     (gt,":agent_no",-1),
  46.     (neg|agent_slot_eq,":agent_no",slot_agent_fly,1),
  47.     (neg|agent_slot_eq,":agent_no",slot_agent_fly,3),
  48.     ]),
  49.    
  50.    #agent退出飞行
  51.    ("dead_agent_exit_fly", [
  52.     (store_script_param, ":agent_no", 1),
  53.    
  54.     (try_begin),
  55.         (gt,":agent_no",-1),
  56.         
  57.         (assign,":borad",-1),
  58.         (try_begin),#人
  59.             (agent_is_human,":agent_no"),
  60.             (call_script,"script_cf_agent_is_fly",":agent_no"),
  61.             (agent_get_slot,":borad",":agent_no",slot_agent_fly_borad),
  62.             (agent_set_slot,":agent_no",slot_agent_fly_borad,-1),
  63.             (agent_set_slot,":agent_no",slot_agent_fly,-1),
  64.         (else_try),#马
  65.             (neg|agent_is_human,":agent_no"),
  66.             (agent_get_slot,":borad",":agent_no",slot_agent_fly_borad),
  67.             (agent_set_slot,":agent_no",slot_agent_fly,-1),
  68.         (try_end),
  69.         
  70.         (try_begin),
  71.             (gt,":borad",0),
  72.             (prop_instance_get_position, pos25, ":borad"),
  73.             (position_get_z, ":pos_z", pos25),
  74.             (ge,":pos_z",-100),
  75.             (position_set_z,pos25,-500),
  76.             (prop_instance_set_position, ":borad", pos25),
  77.             (prop_instance_enable_physics,":borad",0),
  78.         (try_end),
  79.         
  80.     (try_end),
  81.     ]),
  82.    
  83.   #产生agent飞行坐骑
  84. ("fly_rider_agent_spawn",
  85. [
  86.   (store_script_param, ":agent_no", 1),

  87.   (try_begin),
  88.          (gt,":agent_no",-1),
  89.          (agent_get_troop_id,":troop_id",":agent_no"),
  90.          (troop_has_item_equipped, ":troop_id", "itm_courser_fly"),
  91.          (agent_get_horse,":cur_horse",":agent_no"),
  92.          (le,":cur_horse",-1),
  93.          (assign,":cur_horse_id","itm_courser_fly"),
  94.          (init_position,pos29),
  95.          (agent_get_position,pos29,":agent_no"),
  96.          (set_show_messages,0),
  97.          (set_spawn_position,pos29),
  98.          (spawn_horse,":cur_horse_id"),
  99.          (agent_get_team, ":team", ":agent_no"),
  100.          (agent_get_division, ":division", ":agent_no"),
  101.          (team_give_order, ":team", ":division", grc_heroes),
  102.          (set_show_messages,1),
  103.     (try_end),
  104.    
  105.   ]
  106.   ),
复制代码







MS.zip

1.41 MB, 下载次数: 40

评分

参与人数 1第纳尔 +20 互助 +1 魅力 +5 收起 理由
幼稚园殺手 + 20 + 1 + 5 文章不错,继续努力!

查看全部评分

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

本版积分规则

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

GMT+8, 2024-11-19 08:34 , Processed in 0.136920 second(s), 23 queries , Gzip On, MemCached On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

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