骑马与砍杀中文站论坛

 找回密码
 注册(Register!)

QQ登录

只需一步,快速开始

搜索
购买CDKEY 衣谷三国
查看: 229|回复: 4

[功能与代码] 穿过兵堆移动

[复制链接]

18

主题

231

回帖

120

积分

见习骑士

Rank: 3

UID
1404850
第纳尔
875
精华
0
互助
9
荣誉
0
贡献
0
魅力
14
注册时间
2013-6-9
鲜花(46) 鸡蛋(0)
发表于 3 天前 | 显示全部楼层 |阅读模式
战团版本1.174

* 为 下蹲键 增加一个新功能:可在玩家 步行时 慢步穿过拥挤的友方单位与中立单位。
- 遇到人员拥挤的情况,按住 下蹲键 与 前进键 即可穿过人群(提供最低移动距离)。无法穿过敌人与墙体。
- 如果不慎跳跃时被人群顶住无法行动,按住 下蹲键 但不要按 前进键 即可逐渐滑落(自由落体时同样会加速下落)。
…… 慢步穿越的速度不享受移动速度加成,为 平面时 0敏捷 0跑动 常态行走的速度 * 0.45 。

* 该段代码需放在 mst 里 0.00 秒持续触发(每帧触发)。或者放到 prnst 里持续触发。


  1. (try_begin),
  2.     (game_key_clicked, gk_crouch),                # 初次按下 下蹲键 初始化帧时记录
  3.     (reset_mission_timer_c),
  4. (else_try),
  5.     (game_key_is_down, gk_crouch),                # 后续按住 下蹲键 开始启用慢步推行
  6.     (store_mission_timer_c_msec, ":frame_time"),   # 记录逐帧时长(60帧 17ms;120帧 9ms)
  7.     (reset_mission_timer_c),
  8.    
  9.     (get_player_agent_no, ":player"),             # 确保玩家存在
  10.     (ge, ":player", 0),
  11.     (neg|main_hero_fallen),
  12.    
  13.     (agent_get_horse, ":horse", ":player"),       # 只有步行时才能借道
  14.     (eq, ":horse", -1),
  15.    
  16.     (set_fixed_point_multiplier, 1000),         # 单位 mm
  17.     (agent_get_position, pos1, ":player"),
  18.    
  19.     (agent_get_speed, pos2, ":player"),
  20.     (position_get_y, ":speed_y", pos2),
  21.     (position_get_x, ":speed_x", pos2),
  22.     (assign, ":movement_y", 0),                   # 位移距离
  23.     (assign, ":movement_x", 0),
  24.    
  25.     '''---------------------------------------------------------------------
  26.      * BUG:agent_get_speed 对于被阻挡的情况,
  27.         只有 向前方向 的速度是 实际速度,
  28.         其它方向 的速度都是未被阻挡时的 常态速度 。
  29.         
  30.         为了避免此功能会产生移动加速的效果,
  31.         判断标准仅取 向前方向 的速度,若低于阈值,则视为被阻挡,开始位移。
  32.         
  33.         位移速度 = (常态平面最低速度 * 0.9 - 实际速度)/ 2
  34.         
  35.      * 备注:常态平面最低速度 是在 0敏捷0跑动 平地地形 情况下测试而得(每点敏捷+0.5%)
  36.         实际会因地形坡度而无法达到该速度。
  37.     ---------------------------------------------------------------------'''
  38.     (try_begin),
  39.         (game_key_is_down, gk_move_forward),            # 向前 375 cm/s
  40.         (neg|game_key_is_down, gk_move_backward),
  41.         (neg|game_key_is_down, gk_move_right),
  42.         (neg|game_key_is_down, gk_move_left),
  43.         (try_begin),
  44.             (ge, ":speed_y", 0),
  45.             (store_sub, ":movement_y", 3375, ":speed_y"),
  46.             (val_max, ":movement_y", 0),
  47.             (val_div, ":movement_y", 2),
  48.         (try_end),
  49.     (else_try),
  50.         (game_key_is_down, gk_move_forward),            # 前&右 225 215 cm/s
  51.         (neg|game_key_is_down, gk_move_backward),
  52.         (game_key_is_down, gk_move_right),
  53.         (neg|game_key_is_down, gk_move_left),
  54.         (try_begin),
  55.             (ge, ":speed_y", 0),
  56.             (store_sub, ":movement_y", 2240, ":speed_y"),
  57.             (val_max, ":movement_y", 0),
  58.             (val_div, ":movement_y", 2),
  59.         (try_end),
  60.         (try_begin),
  61.             (gt, ":movement_y", 0),
  62.             (store_div, ":movement_x", ":movement_y", 2),
  63.         (try_end),
  64.     (else_try),
  65.         (game_key_is_down, gk_move_forward),            # 前&左 225 -215 cm/s
  66.         (neg|game_key_is_down, gk_move_backward),
  67.         (neg|game_key_is_down, gk_move_right),
  68.         (game_key_is_down, gk_move_left),
  69.         (try_begin),
  70.             (ge, ":speed_y", 0),
  71.             (store_sub, ":movement_y", 2240, ":speed_y"),
  72.             (val_max, ":movement_y", 0),
  73.             (val_div, ":movement_y", 2),
  74.         (try_end),
  75.         (try_begin),
  76.             (gt, ":movement_y", 0),
  77.             (store_div, ":movement_x", ":movement_y", -2),
  78.         (try_end),
  79.     (try_end),
  80.    
  81.     '''---------------------------------------------------------------------
  82.         60帧率下,常态平面最低速度 起步约为 20cm/s,加速度约为 25cm/s/帧 。
  83.         60帧率下,即便每帧提供的位移只有 2cm ,也会感觉出些许提速效果。
  84.     ---------------------------------------------------------------------'''
  85.     (try_begin),                                    # 转为帧时距离
  86.         (gt, ":movement_y", 0),
  87.         (val_mul, ":movement_y", ":frame_time"),
  88.         (val_div, ":movement_y", 1000),
  89.         (val_max, ":movement_y", 1),
  90.     (try_end),
  91.     (try_begin),
  92.         (gt, ":movement_x", 0),
  93.         (val_mul, ":movement_x", ":frame_time"),
  94.         (val_div, ":movement_x", 1000),
  95.         (val_max, ":movement_x", 1),
  96.     (else_try),
  97.         (neg|ge, ":movement_x", 0),
  98.         (val_mul, ":movement_x", ":frame_time"),
  99.         (val_div, ":movement_x", 1000),
  100.         (val_min, ":movement_x", -1),
  101.     (try_end),
  102.    
  103.     (try_begin),
  104.         (gt, ":movement_y", 0),                        # 玩家穿越兵堆
  105.         
  106.         (assign, ":break", 5),                            # 若前方是墙体,则不能借道,避免横向穿模
  107.         (copy_position, pos2, pos1),
  108.         (position_move_z, pos2, 90),
  109.         (position_rotate_z, pos2, -135, 0),
  110.         (try_for_range, ":truns", 0, ":break"),
  111.             (position_rotate_z, pos2, 45, 0),
  112.             (cast_ray, ":scene_id", pos3, pos2, 430),
  113.             (assign, ":break", 0),
  114.         (try_end),
  115.         
  116.         (eq, ":break", 5),                                # 若与敌人过于贴近,则不能借道
  117.         (agent_get_team, ":player_team", ":player"),
  118.         (try_for_agents, ":agent"),
  119.             (eq, ":break", 5),
  120.             (neg|eq, ":agent", ":player"),
  121.             (agent_is_alive, ":agent"),
  122.             (agent_is_human, ":agent"),
  123.             (agent_get_team, ":agent_team", ":agent"),
  124.             (teams_are_enemies, ":agent_team", ":player_team"),
  125.             (agent_get_position, pos2, ":agent"),
  126.             (get_distance_between_positions, ":distance", pos2, pos1),
  127.             (neg|gt, ":distance", 72),
  128.             (assign, ":break", 0),
  129.         (try_end),
  130.         
  131.         (eq, ":break", 5),                                # 预设位移点的位置
  132.         (init_position, pos2),
  133.         (position_set_y, pos2, ":movement_y"),
  134.         (position_set_x, pos2, ":movement_x"),
  135.         (position_transform_position_to_parent, pos3, pos1, pos2),
  136.         (position_move_z, pos3, 17),
  137.         (position_set_z_to_ground_level, pos3),
  138.         
  139.         (position_get_z, ":player_level", pos1),          # 如 攻城战 拥有的复杂地形,多一重检测,避免纵向穿模
  140.         (position_get_z, ":new_level", pos3),
  141.         (val_sub, ":new_level", ":player_level"),
  142.         (val_abs, ":new_level"),
  143.         (neg|ge, ":new_level", 300),
  144.         
  145.         (agent_set_position, ":player", pos3),            # 当前帧会在 计算完单位的位置与运动状态 之后再执行脚本
  146.     (else_try),
  147.         (eq, ":movement_y", 0),                        # 玩家因跳跃动作被卡在兵堆上面无法动弹
  148.         (copy_position, pos2, pos1),
  149.         (position_get_z, ":player_level", pos1),
  150.         
  151.         (position_set_z_to_ground_level, pos1),
  152.         (position_get_z, ":new_level", pos1),
  153.         (store_sub, ":movement_y", ":player_level", ":new_level"),
  154.         
  155.         (gt, ":movement_y", 50),
  156.         (position_move_z, pos2, 5),
  157.         (position_rotate_x, pos2, -90, 0),
  158.         (try_begin),
  159.             (cast_ray, ":scene_id", pos3, pos2, 60),
  160.             (ge, ":scene_id", 0),                        # 一些有碰撞的场景道具不会被纳入 ground level 的考量
  161.         (else_try),
  162.             (val_div, ":frame_time", 2),
  163.             (val_sub, ":player_level", ":frame_time"),
  164.             (val_max, ":player_level", ":new_level"),
  165.             (position_set_z, pos1, ":player_level"),
  166.             
  167.             (agent_set_no_dynamics, ":player", 1),
  168.             (agent_set_position, ":player", pos1),
  169.             (agent_set_no_dynamics, ":player", 0),
  170.         (try_end),
  171.     (try_end),
  172. (try_end),
复制代码



txt代码:
0.000000 0.000000 0.000000  0  140 4 0 73 1 49 2377 0 5 0 72 1 49 2367 1 1224979098644774912 2377 0 1700 1 1224979098644774913 30 2 1224979098644774913 0 2147484654 0 1714 2 1224979098644774914 1224979098644774913 31 2 1224979098644774914 -1 2124 1 1000 1710 2 1 1224979098644774913 1689 2 2 1224979098644774913 727 2 1224979098644774915 2 726 2 1224979098644774916 2 2133 2 1224979098644774917 0 2133 2 1224979098644774918 0 4 0 72 1 0 2147483720 1 1 2147483720 1 3 2147483720 1 2 4 0 30 2 1224979098644774915 0 2121 3 1224979098644774917 3375 1224979098644774915 2111 2 1224979098644774917 0 2108 2 1224979098644774917 2 3 0 5 0 72 1 0 2147483720 1 1 72 1 3 2147483720 1 2 4 0 30 2 1224979098644774915 0 2121 3 1224979098644774917 2240 1224979098644774915 2111 2 1224979098644774917 0 2108 2 1224979098644774917 2 3 0 4 0 32 2 1224979098644774917 0 2123 3 1224979098644774918 1224979098644774917 2 3 0 5 0 72 1 0 2147483720 1 1 2147483720 1 3 72 1 2 4 0 30 2 1224979098644774915 0 2121 3 1224979098644774917 2240 1224979098644774915 2111 2 1224979098644774917 0 2108 2 1224979098644774917 2 3 0 4 0 32 2 1224979098644774917 0 2123 3 1224979098644774918 1224979098644774917 -2 3 0 3 0 4 0 32 2 1224979098644774917 0 2107 2 1224979098644774917 1224979098644774912 2108 2 1224979098644774917 1000 2111 2 1224979098644774917 1 3 0 4 0 32 2 1224979098644774918 0 2107 2 1224979098644774918 1224979098644774912 2108 2 1224979098644774918 1000 2111 2 1224979098644774918 1 5 0 2147483678 2 1224979098644774918 0 2107 2 1224979098644774918 1224979098644774912 2108 2 1224979098644774918 1000 2110 2 1224979098644774918 -1 3 0 4 0 32 2 1224979098644774917 0 2133 2 1224979098644774919 5 700 2 2 1 722 2 2 90 725 3 2 -135 0 6 3 1224979098644774920 0 1224979098644774919 725 3 2 45 0 1900 4 1224979098644774921 3 2 430 2133 2 1224979098644774919 0 3 0 31 2 1224979098644774919 5 1770 2 1224979098644774922 1224979098644774913 12 1 1224979098644774923 31 2 1224979098644774919 5 2147483679 2 1224979098644774923 1224979098644774913 1702 1 1224979098644774923 1704 1 1224979098644774923 1770 2 1224979098644774924 1224979098644774923 1788 2 1224979098644774924 1224979098644774922 1710 2 2 1224979098644774923 710 3 1224979098644774925 2 1 2147483680 2 1224979098644774925 72 2133 2 1224979098644774919 0 3 0 31 2 1224979098644774919 5 701 1 2 730 2 2 1224979098644774917 729 2 2 1224979098644774918 716 3 3 1 2 722 2 3 17 791 1 3 728 2 1224979098644774926 1 728 2 1224979098644774927 3 2106 2 1224979098644774927 1224979098644774926 2113 1 1224979098644774927 2147483678 2 1224979098644774927 300 1711 2 1224979098644774913 3 5 0 31 2 1224979098644774917 0 700 2 2 1 728 2 1224979098644774926 1 791 1 1 728 2 1224979098644774927 1 2121 3 1224979098644774917 1224979098644774926 1224979098644774927 32 2 1224979098644774917 50 722 2 2 5 723 3 2 -90 0 4 0 1900 4 1224979098644774921 3 2 60 30 2 1224979098644774921 0 5 0 2108 2 1224979098644774912 2 2106 2 1224979098644774926 1224979098644774912 2111 2 1224979098644774926 1224979098644774927 731 2 1 1224979098644774926 1762 2 1224979098644774913 1 1711 2 1224979098644774913 1 1762 2 1224979098644774913 0 3 0 3 0 3 0


5

主题

3058

回帖

954

积分

骑士

Rank: 4Rank: 4

UID
86936
第纳尔
12705
精华
0
互助
5
荣誉
1
贡献
0
魅力
71
注册时间
2008-8-10

原版正版勋章战团正版勋章元老骑士勋章汉匈决战正版勋章维京征服正版勋章霸主正版勋章

鲜花(65) 鸡蛋(1)
发表于 前天 11:29 | 显示全部楼层
爬攻城梯的时候,会不会把自己的兵挤下去摔死?

34

主题

1009

回帖

2558

积分

子爵[版主]

Rank: 7Rank: 7Rank: 7

UID
2755938
第纳尔
6238
精华
12
互助
13
荣誉
98
贡献
85
魅力
265
注册时间
2016-7-5

骑砍中文站APP会员勋章骑士美德之忠诚勋章[杰出会员精华勋章]骑士美德之英勇勋章[杰出会员活跃勋章]骑士美德之正义勋章[杰出会员荣誉勋章]元老骑士勋章

鲜花(250) 鸡蛋(0)
发表于 前天 14:53 | 显示全部楼层
英勇的苹果 发表于 2025-10-14 11:29
爬攻城梯的时候,会不会把自己的兵挤下去摔死?

这是小范围传送,不会挤别人

18

主题

231

回帖

120

积分

见习骑士

Rank: 3

UID
1404850
第纳尔
875
精华
0
互助
9
荣誉
0
贡献
0
魅力
14
注册时间
2013-6-9
鲜花(46) 鸡蛋(0)
 楼主| 发表于 前天 20:22 | 显示全部楼层
英勇的苹果 发表于 2025-10-14 11:29
爬攻城梯的时候,会不会把自己的兵挤下去摔死?

基本不会,这个效果不改变士兵的位置与碰撞,模型重叠时士兵依然可以移动(忽略重叠部分),并且不会互相之间排斥。
除非你本身挡在士兵前面,那个士兵就在边缘,转身被你挤下去。这个现象也会发生在纯AI兵堆(即 玩家哪怕不参与,但若人数过多 过于拥挤,士兵之间也是会把其他士兵挤下去,但也不多,1%的样子)。

此外,摔落伤害并不高,也就十几点,摔不死的。

5

主题

3058

回帖

954

积分

骑士

Rank: 4Rank: 4

UID
86936
第纳尔
12705
精华
0
互助
5
荣誉
1
贡献
0
魅力
71
注册时间
2008-8-10

原版正版勋章战团正版勋章元老骑士勋章汉匈决战正版勋章维京征服正版勋章霸主正版勋章

鲜花(65) 鸡蛋(1)
发表于 昨天 14:23 | 显示全部楼层
太棒了,这下不怕攻城上不去了~
您需要登录后才可以回帖 登录 | 注册(Register!)

本版积分规则

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

GMT+8, 2025-10-16 03:58 , Processed in 0.062608 second(s), 22 queries , Gzip On, MemCached On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

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