骑马与砍杀中文站论坛

 找回密码
 注册(Register!)

QQ登录

只需一步,快速开始

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

[功能与代码] 【战团】简易的简单投石机

[复制链接]

26

主题

804

回帖

399

积分

骑士

民间工匠

Rank: 4Rank: 4

UID
1115705
第纳尔
4062
精华
0
互助
26
荣誉
2
贡献
0
魅力
30
注册时间
2012-12-13
鲜花(235) 鸡蛋(10)
发表于 2023-9-23 23:06:27 | 显示全部楼层 |阅读模式
本帖最后由 a1550887802 于 2023-9-24 08:52 编辑

先说好,这个是个很简单的玩意,是为了简易添加的可以在攻城战使用的投石机,这里只有代码可供展示,没有任何酷炫的视觉效果,模型使用的是战团模型的修改版,音效使用的是战团自带的音效,没有使用新增的slot。虽然可以增加其他内容以设置为玩家也可以操作的,但是我也只做了ai的部分

没有额外的延伸内容,譬如控制ai开火或者停止,可以移动的逻辑,被破坏的情况,因为我也没时间做那么多,如果你有时间看我的垃圾代码还对此很感兴趣,那么可以尝试继续修改下去

注释很少,代码很乱,不要说我是个菜逼或者完全没有好习惯的编写者,我知道但是我懒得搞那么标准
演示视频在这里
https://www.bilibili.com/video/BV1jj411C7Y2/


废话不多说,直接上代码


########################module_mission_templates的部分#############################
只触发一次,在场景里遍历攻守双方的投石机标识,这些标识是仅仅在编制模式下显示的场景道具(scene_props)
  1. (0, 0, ti_once, [],
  2.   [
  3.       (try_for_prop_instances, ":origin_no","spr_zz_zz_z_defender_catapult_test_a_marker"),
  4.             (scene_prop_set_team, ":origin_no", 0),
  5.             (prop_instance_get_position,pos30,":origin_no"),
  6.             (set_spawn_position, pos30),
  7.             (spawn_scene_prop,"spr_zz_zz_z_catapult_test_a_code_only"),
  8.             (assign,":scene_prop_e",reg0),
  9.             (scene_prop_set_slot,":scene_prop_e",scene_prop_slots_end, ":origin_no"),
  10.       (try_end),
  11.       
  12.       (try_for_prop_instances, ":origin_no","spr_zz_zz_z_attacker_catapult_test_a_marker"),
  13.             (scene_prop_set_team, ":origin_no", 1),
  14.             (prop_instance_get_position,pos30,":origin_no"),
  15.             (set_spawn_position, pos30),
  16.             (spawn_scene_prop,"spr_zz_zz_z_catapult_test_a_code_only"),
  17.             (assign,":scene_prop_e",reg0),
  18.             (scene_prop_set_slot,":scene_prop_e",scene_prop_slots_end, ":origin_no"),
  19.       (try_end),


  20.       
  21.     ]),
复制代码

用于标注攻守双方的的场景道具,使用了sokf_invisible这个标签,该标签可以让使用此标签的场景道具只在编辑模式中显示
  1. ###############################################
  2. ###############################################sokf_invisible
  3. ("zz_zz_z_defender_catapult_test_a_marker",sokf_invisible,"defender_catapult_test_a",0, [
  4. (ti_on_scene_prop_init,
  5.     [
  6.       (store_trigger_param_1, ":sprop_instance"),
  7.          (scene_prop_set_slot,":sprop_instance",scene_prop_slots_end,10000),
  8.    
  9.     ]),
  10. ]),
  11. ##################################################
  12. ###############################################sokf_invisible
  13. ("zz_zz_z_attacker_catapult_test_a_marker",sokf_invisible,"attacker_catapult_test_a",0, [
  14. (ti_on_scene_prop_init,
  15.     [
  16.       (store_trigger_param_1, ":sprop_instance"),
  17.          (scene_prop_set_slot,":sprop_instance",scene_prop_slots_end,10000),
  18.    
  19.     ]),
  20. ]),
  21. ##################################################
复制代码
投石机和投石机的组件部分,这里利用了两个属于场景道具的触发条件,ti_on_scene_prop_init和ti_on_scene_prop_animation_finished


ti_on_scene_prop_init是在场景道具初始化时的触发,可以在这个时刻进行一些特殊的操作
ti_on_scene_prop_animation_finished,这个会检测场景道具在动作结束时进行一些操作


那么,如果在ti_on_scene_prop_init的时候进行了prop_instance_animate_to_position,在场景道具的动作结束时,就会触发ti_on_scene_prop_animation_finished这个条件,也就是说会触发这个条件所控制的触发器,如果在ti_on_scene_prop_animation_finished里又进行prop_instance_animate_to_position,再次等到结束结束,这样就会再次触发ti_on_scene_prop_animation_finished。这种利用了prop_instance_animate_to_position和ti_on_scene_prop_animation_finished两个条件进行的循环,就会一直循环触发下去。除非在代码中设定了不再继续执行动作的内容,否则这个循环不会停止。
  1. ##################################################投石机的基座,控制投石机的射击方向,还有整个射击流程的控制
  2. ("zz_zz_z_catapult_test_a_code_only",sokf_moveable|spr_hit_points(180),"catapult_test_a","bo_catapult_test_a",
  3. [
  4. (ti_on_scene_prop_init,
  5.     [
  6.       (store_trigger_param_1, ":sprop_instance"),


  7.       (prop_instance_get_position, pos45, ":sprop_instance"),
  8.       (prop_instance_animate_to_position,":sprop_instance",pos45,500),
  9.       (scene_prop_set_cur_hit_points, ":sprop_instance", 600),
  10.        (init_position,pos50),
  11.       (position_move_z, pos50, -50000),
  12.       (set_spawn_position, pos50),
  13.       (spawn_scene_prop,"spr_zz_zz_z_simple_catapult_test_b"),#生成投石机的弹射臂
  14.       (assign,":scene_prop_c",reg0),
  15.       (scene_prop_set_slot,":scene_prop_c",scene_prop_slots_end,":sprop_instance"),
  16.     ]),
  17.    (ti_on_scene_prop_animation_finished,
  18.     [
  19.    
  20.       (store_trigger_param_1, ":sprop_instance"),
  21.          (assign, ":l_distance",60),
  22.          (assign, ":around_z_max",300),
  23.      
  24.     (assign, ":shoot", 0),
  25.       

  26.         (scene_prop_get_slot, ":scene_prop_slots_end", ":sprop_instance", scene_prop_slots_end),
  27.         (scene_prop_get_slot, ":cc", ":sprop_instance", scene_prop_smoke_effect_done),
  28.         

  29.       (scene_prop_get_team, ":sprop_instance_team", ":scene_prop_slots_end"),
  30.       
  31.       
  32.       
  33.        (prop_instance_get_position,pos30,":scene_prop_slots_end"),
  34.             
  35.        (copy_position,pos45,pos30),
  36.       
  37.        (prop_instance_animate_to_position,":sprop_instance",pos45,500),
  38.       

  39.         (scene_prop_get_slot, ":cc", ":sprop_instance", scene_prop_smoke_effect_done),
  40.         (scene_prop_get_hit_points, ":sprop_instance_ammo", ":sprop_instance"),
  41.      (try_begin),
  42.         (neq, ":cc", 1),
  43.         (assign, ":close", 0),
  44.         (get_player_agent_no, ":player_agent"),
  45.    
  46.        (try_for_agents,":cur_agent"),#设置投石机的操作者
  47.             (neq, ":cur_agent", ":player_agent"),
  48.             (neq, ":close", 1),
  49.             (agent_is_alive, ":cur_agent"),
  50.             (agent_is_human, ":cur_agent"),
  51.             (agent_get_team, ":agent_team", ":cur_agent"),
  52.             (eq, ":agent_team", ":sprop_instance_team"),
  53.                         
  54.             (agent_get_slot, ":arena_team_set", ":cur_agent", slot_agent_arena_team_set),
  55.             (neq, ":arena_team_set", 1),
  56.             

  57.                 (try_for_range,":no",0,5),#这里会把投石机控制者的武器都拆下来,别问我为什么不用切换装备的操作,问就是为了省事
  58.                         (agent_get_item_slot, ":cur_weapon", ":cur_agent", ":no"),
  59.                         (gt,":cur_weapon",0),
  60.                        (agent_unequip_item, ":cur_agent", ":cur_weapon"),
  61.                 (try_end),


  62.             (scene_prop_set_slot,":sprop_instance",scene_prop_ccoop_item_drop_start,":cur_agent"),
  63.             (scene_prop_set_slot,":sprop_instance",scene_prop_smoke_effect_done,1),
  64.             (agent_set_slot,":cur_agent",slot_agent_arena_team_set , 1),
  65.             
  66.             (assign, ":close", 1),
  67.             (prop_instance_get_position, pos45, ":sprop_instance"),

  68.         (position_move_x, pos45, -180),
  69.                 (agent_set_speed_modifier, ":cur_agent", 1),
  70.                 (agent_set_position,":cur_agent",pos45),#
  71.         (agent_set_scripted_destination,":cur_agent",pos45,),#图省事,把操纵者强制固定在投石机的一侧
  72.     (try_end),
  73.       
  74.       
  75.     (try_end),
  76.    
  77.       
  78.         (eq, ":cc", 1),


  79.       (try_begin),
  80.         (scene_prop_get_slot, ":agent_a", ":sprop_instance", scene_prop_ccoop_item_drop_start),
  81.         (agent_is_alive, ":agent_a"),
  82.         (val_add, ":sprop_instance_ammo", 1),
  83.         (scene_prop_set_cur_hit_points, ":sprop_instance", ":sprop_instance_ammo"),
  84.         

  85.                 (assign, ":ctrl_agent", ":agent_a"),

  86.         
  87.             
  88.         
  89.         
  90.         (copy_position,pos55,pos30),
  91.         (agent_get_look_position, pos39, ":ctrl_agent"),#透过操纵者的视角控制投石机,因此其实玩家也可以操作投石机,只要玩家是操作者就行(但是没有写控制开火的那部分)
  92.         (prop_instance_get_position, pos45, ":sprop_instance"),
  93.         (position_get_rotation_around_z, ":around_z_a", pos55),
  94.         (position_get_rotation_around_z, ":around_z_b", pos45),


  95.         
  96.         (position_copy_origin,pos39,pos45),
  97.         (position_move_y,pos45,100,0),
  98.         (position_move_y,pos39,100,0),
  99.         (get_distance_between_positions,":distance_tt",pos45,pos39),
  100.         (store_random_in_range, ":var_animate", 10, 12),
  101.         
  102.             (copy_position,pos55,pos45),
  103.             (position_rotate_z,pos55,-90,),
  104.             
  105.             
  106.             
  107.          
  108.         
  109.             (try_begin),#检测是否可以开火
  110.                 (val_sub,":around_z_a",":around_z_b"),
  111.                 (val_abs,":around_z_a"),
  112.                 (le,":around_z_a", ":around_z_max",),
  113.                 (agent_get_look_position, pos39, ":ctrl_agent"),
  114.                 (position_copy_origin,pos39,pos45),
  115.                 (position_move_y,pos39,100,0),
  116.                 (le,":distance_tt", ":l_distance",),
  117.                 (val_add, ":shoot", 1),
  118.             (else_try),
  119.                 (copy_position,pos39,pos30),
  120.                 (position_move_y,pos39,100,0),
  121.             (try_end),
  122.         
  123.             
  124.                 (try_begin),#转动投石机的方向角
  125.                     (position_is_behind_position,pos39, pos55),
  126.                     (assign,":rotate_z",1),
  127.                 (else_try),
  128.                     (assign,":rotate_z",-1),
  129.                 (try_end),
  130.                
  131.                
  132.             (try_begin),
  133.                 (agent_get_look_position, pos39, ":ctrl_agent"),#
  134.                 (prop_instance_get_position, pos45, ":sprop_instance"),
  135.             
  136.                 (position_get_rotation_around_z, ":around_z_a", pos39),
  137.                 (position_get_rotation_around_z, ":around_z_b", pos45),
  138.                 (val_sub,":around_z_a",":around_z_b"),
  139.                 (val_abs,":around_z_a"),
  140.                 (le,":around_z_a", 3,),
  141.                
  142.                 (assign,":rotate_z",0),
  143.             (try_end),
  144.                
  145.                
  146.                 (prop_instance_get_position, pos45, ":sprop_instance"),
  147.                 (position_copy_origin,pos45,pos30),
  148.                 (position_rotate_z,pos45,":rotate_z",),

  149.                 (prop_instance_animate_to_position,":sprop_instance",pos45,":var_animate"),#进行动作
  150.                

  151.             
  152.          
  153.         (position_move_x, pos45, -260),
  154.         (agent_get_look_position, pos39, ":agent_a"),
  155.         (position_copy_rotation,pos45,pos39),
  156.         (agent_set_position,":agent_a",pos45),#图省事,把操纵者强制固定在投石机的一侧
  157.         
  158.         

  159.       (try_end),
  160.       
  161.       
  162.     ]),

  163. ]),   
  164. #########################
  165. ##################################################投石机的弹射臂,用来执行投石机的投射动画和实际上的投射效果
  166. ("zz_zz_z_simple_catapult_test_b",sokf_moveable|sokf_type_ladder,"catapult_test_b",0,
  167. [
  168. (ti_on_scene_prop_init,
  169.     [
  170.       (store_trigger_param_1, ":sprop_instance"),
  171.       (prop_instance_get_position, pos45, ":sprop_instance"),
  172.       (prop_instance_animate_to_position,":sprop_instance",pos45,10),
  173.       (scene_prop_set_slot,":sprop_instance",scene_prop_smoke_effect_done,0),
  174.       
  175.       (init_position,pos50),
  176.       (position_move_z, pos50, -50000),
  177.       (set_spawn_position, pos50),
  178.       (spawn_scene_prop,"spr_zz_zz_z_simple_catapult_shell_a_test"),#把石头弹生成出来
  179.       (assign,":scene_prop_c",reg0),
  180.       (scene_prop_set_slot,":scene_prop_c",scene_prop_slots_end,":sprop_instance"),
  181.     ]),
  182.    (ti_on_scene_prop_animation_finished,
  183.     [
  184.       (store_trigger_param_1, ":sprop_instance"),
  185.       (assign, ":l_distance",60),

  186.       (scene_prop_get_slot, ":scene_prop_slots_end", ":sprop_instance", scene_prop_slots_end),
  187.       (scene_prop_get_slot, ":cc", ":sprop_instance", scene_prop_smoke_effect_done),#用来控制整个流程的
  188.         
  189.         (prop_instance_get_position,pos40,":scene_prop_slots_end"),


  190.       (try_begin),
  191.         (store_mul,":rotate_z",":cc",1),
  192.         (position_rotate_x,pos40,":rotate_z",),
  193.         (le, ":cc", 80),
  194.         (val_add,":cc",1),
  195.       (try_end),
  196.       

  197.       (try_begin),
  198.         (ge, ":cc", 80),
  199.         (assign, ":shoot", 0),#投射条件检测
  200.         
  201.         (scene_prop_get_slot, ":agent_a", ":scene_prop_slots_end", scene_prop_ccoop_item_drop_start),
  202.         (agent_is_alive, ":agent_a"),
  203.         (scene_prop_get_hit_points, ":sprop_instance_ammo", ":scene_prop_slots_end"),
  204.         
  205.         (agent_get_look_position, pos39, ":agent_a"),#
  206.         (prop_instance_get_position, pos45, ":scene_prop_slots_end"),
  207.         
  208.         (position_copy_origin,pos39,pos45),
  209.         (position_move_y,pos45,100,0),
  210.         (position_move_y,pos39,100,0),
  211.         (get_distance_between_positions,":distance_tt",pos45,pos39),
  212.         
  213.         (try_begin),#检测是否可以开火
  214.                 (agent_get_look_position, pos39, ":agent_a"),#
  215.                 (prop_instance_get_position, pos45, ":scene_prop_slots_end"),
  216.             
  217.                 (position_get_rotation_around_z, ":around_z_a", pos39),
  218.                 (position_get_rotation_around_z, ":around_z_b", pos45),
  219.                 (val_sub,":around_z_a",":around_z_b"),
  220.                 (val_abs,":around_z_a"),
  221.                 (le,":around_z_a", 30,),
  222.                 (le,":distance_tt", ":l_distance",),
  223.                
  224.                
  225.                 (val_add, ":shoot", 1),
  226.         (try_end),
  227.         
  228.         
  229.         (try_begin),#检测控制者的目标在射程内
  230.                 (agent_ai_get_look_target, ":target", ":agent_a"),
  231.                 (neq, ":target", -1),
  232.                 (agent_get_position,pos52,":target"),
  233.                 (agent_get_position,pos53,":agent_a"),
  234.                 (get_distance_between_positions,":distance",pos52,pos53),
  235.                 (is_between,":distance", 3000,97000),
  236.                 (agent_get_look_position, pos39, ":agent_a"),#
  237.                 (val_add, ":shoot", 1),
  238.         (try_end),
  239.         
  240.         

  241.         (ge, ":shoot", 2),#如果投射条件允许
  242.         (ge, ":sprop_instance_ammo", 300),#如果已经装填完成
  243.         (position_move_y,pos45,150,0),
  244.         (position_move_z,pos45,450,0),
  245.         (position_copy_rotation,pos45,pos39),
  246.         (play_sound_at_position, "snd_pistol_shot", pos45, 0),#放个音效

  247.         

  248.         
  249.        (try_for_range,":aa",0,1),#循环执行,没错,这里可以设置复数弹药,因为我之前闲得慌想看天女散花
  250.                         (neq, ":aa", 999),
  251.             (store_random_in_range, ":var_15", -6, 7),
  252.             (store_random_in_range, ":var_16", -2, 3),
  253.             (assign, ":var_distance_d", ":distance"),#用来计算投射弹速的
  254.             (assign, ":var_distance_e", ":distance"),#用来计算投射弹速的
  255.             
  256.             (try_begin),
  257.                 (ge, ":distance", 9000),
  258.                 (val_sub, ":var_distance_e", 100000),
  259.                 (val_mul, ":var_distance_e", -1),
  260.                 (val_div, ":var_distance_e", 1000),
  261.                 (val_mul, ":var_distance_e", -1),
  262.                 (val_add, ":var_distance_e", 480),
  263.                 (val_div, ":var_distance_d", ":var_distance_e"),
  264.             (else_try),
  265.                 (val_sub, ":var_distance_e", 100000),
  266.                 (val_mul, ":var_distance_e", -1),
  267.                 (val_div, ":var_distance_e", 1000),
  268.                 (val_mul, ":var_distance_e", -1),
  269.                 (val_add, ":var_distance_e", 380),
  270.                 (val_div, ":var_distance_d", ":var_distance_e"),
  271.             (try_end),
  272.             
  273.             (position_rotate_x, pos45, 45, ),#为了方便,所以在默认在理想的投射角度时把石头扔出去了
  274.                 (set_fixed_point_multiplier, 10),
  275.                 (position_rotate_x_floating, pos45, ":var_16"),
  276.                 (position_rotate_z_floating, pos45, ":var_15"),

  277.                 (set_fixed_point_multiplier, 1),
  278.                         (set_fixed_point_multiplier, 1),
  279.                         (store_random_in_range, ":var_16", -2, 3),#加点随机影响
  280.             (val_add, ":var_distance_d", ":var_16"),
  281.             (convert_to_fixed_point, ":var_16"),
  282.             (add_missile, ":agent_a", pos45, ":var_distance_d", "itm_50mm_he_shell", 0, "itm_50mm_he_shell", 0),#把一枚五十毫米高爆炮弹扔到敌人头上,问我就是省事,也可以换成你喜欢的投射道具

  283.             (store_random_in_range, ":var_points", 150, 210),
  284.             (scene_prop_set_cur_hit_points, ":scene_prop_slots_end", ":var_points"),
  285.         (try_end),
  286.         

  287.         (assign, ":cc", 0),#重置流程
  288.       (try_end),
  289.       
  290.         (prop_instance_animate_to_position,":sprop_instance",pos40,10),
  291.         (scene_prop_set_slot,":sprop_instance",scene_prop_smoke_effect_done,":cc"),#如果是射过了,那就重新开始装填
  292.       
  293.     ]),

  294. ]),   
  295. ###############################################投石机的石头弹,会在投石机装填待发的时候现实在投石机的弹射臂的投射框内,投射后隐藏
  296. ("zz_zz_z_simple_catapult_shell_a_test",sokf_moveable,"simple_catapult_shell_a_test",0,
  297. [
  298. (ti_on_scene_prop_init,
  299.     [
  300.       (store_trigger_param_1, ":sprop_instance"),
  301.       (prop_instance_get_position, pos45, ":sprop_instance"),
  302.       (prop_instance_animate_to_position,":sprop_instance",pos45,10),
  303.       (scene_prop_set_slot,":sprop_instance",scene_prop_smoke_effect_done,0),
  304.     ]),
  305.    (ti_on_scene_prop_animation_finished,
  306.     [
  307.       (store_trigger_param_1, ":sprop_instance"),
  308.       

  309.       (scene_prop_get_slot, ":scene_prop_slots_end", ":sprop_instance", scene_prop_slots_end),
  310.       (scene_prop_get_slot, ":cc", ":scene_prop_slots_end", scene_prop_smoke_effect_done),
  311.       (prop_instance_get_position,pos40,":scene_prop_slots_end"),
  312.       (prop_instance_animate_to_position,":sprop_instance",pos40,1),

  313.       (try_begin),
  314.         (ge, ":cc", 80),#如果装好了,就显示
  315.         (scene_prop_set_visibility, ":sprop_instance", 1),
  316.       (else_try),
  317.         (scene_prop_set_visibility, ":sprop_instance", 0),#没装好就不显示
  318.       (try_end),
  319.       
  320.         
  321.       
  322.     ]),

  323. ]),   
  324. ###############################################
复制代码



评分

参与人数 1第纳尔 +20 互助 +2 魅力 +4 收起 理由
agjib + 20 + 2 + 4 您的帖子很有价值!

查看全部评分

鲜花鸡蛋

千里难行  在2024-1-21 00:39  送朵鲜花  并说:我非常同意你的观点,送朵鲜花鼓励一下
咸鱼圣代  在2023-9-25 03:53  送朵鲜花  并说:我非常同意你的观点,送朵鲜花鼓励一下
半世尘埃  在2023-9-24 01:39  送朵鲜花  并说:我非常同意你的观点,送朵鲜花鼓励一下

31

主题

915

回帖

2414

积分

子爵[版主]

Rank: 7Rank: 7Rank: 7

UID
2755938
第纳尔
6208
精华
11
互助
12
荣誉
97
贡献
85
魅力
242
注册时间
2016-7-5

骑砍中文站APP会员勋章

鲜花(236) 鸡蛋(0)
发表于 2023-9-23 23:14:09 | 显示全部楼层
666高爆弹满天飞

23

主题

339

回帖

299

积分

见习骑士

Rank: 3

UID
3189500
第纳尔
2709
精华
0
互助
26
荣誉
6
贡献
20
魅力
437
注册时间
2020-6-13
鲜花(68) 鸡蛋(0)
发表于 2023-9-24 01:32:22 来自手机 | 显示全部楼层
很实用的文章,让我学到了很多~~来自: Android客户端

43

主题

1165

回帖

442

积分

骑士

Rank: 4Rank: 4

UID
3065189
第纳尔
675
精华
0
互助
16
荣誉
0
贡献
2
魅力
11
注册时间
2019-3-28

骑士美德之英勇勋章[杰出会员活跃勋章]

QQ
鲜花(108) 鸡蛋(0)
发表于 2023-9-24 01:39:57 | 显示全部楼层
赞!!!!!!!!!!!!!!!!这个能好好学习一番
忠 誠 勇 毅 ,心 系 社 會

0

主题

59

回帖

18

积分

随仆

Rank: 1

UID
3346943
第纳尔
519
精华
0
互助
0
荣誉
0
贡献
0
魅力
0
注册时间
2022-4-8
鲜花(2) 鸡蛋(0)
发表于 2023-9-28 12:30:56 来自手机 | 显示全部楼层
大佬威武来自: Android客户端
您需要登录后才可以回帖 登录 | 注册(Register!)

本版积分规则

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

GMT+8, 2024-12-27 12:47 , Processed in 0.116999 second(s), 27 queries , Gzip On, MemCached On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

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