本帖最后由 vegetto 于 2024-2-19 17:45 编辑
主要应用于我的骑马与砍杀篮球足球mod里(https://bbs.mountblade.com.cn/forum.php?mod=viewthread&tid=2099079),效果是球场随机出现若干铁丝门、木头柱子在随机位置升降(不同障碍物时段错开非同时),对场上的人的活动自由进行干扰,但未设置伤害。
以下简写,本人非MSmod,var变量表示,仅一块触发器,放于MT文件,特定战场MT中新增一处0,0,0 触发条件的触发器。
(set_fixed_point_multiplier, 100),
(get_player_agent_no, ":var_0"),
(agent_get_position, pos1, ":var_0"),
(copy_position, pos2, pos1),
(position_move_z, pos2, -10000),
(scene_prop_get_instance, ":var_1", "spr_sp13", 0), #这个sp13物体是相当于我篮球足球场地的中场圆形划线的圆点,因为在场地的中心,用来判断机关障碍物体出现的范围比较方便。
(prop_instance_get_position, pos3, ":var_1"),
(copy_position, pos5, pos3),
(position_move_z, pos5, -1000),
(position_get_z, ":var_2", pos3),
(position_get_z, ":var_3", pos5),
# (try_begin),
#。。。。。。。。。。。。。
# (assign, "$kindbar", 0),
# (try_end), #以上带#蓝色字体省略,作用是因为某某某条件,初始化设置$kindbar的值,对应下面对应的障碍物类型,本mod这一处写到了tispawn去初始化的,故这里省略未提及。如果只有一个障碍物,可以去掉省略号,无条件设一下$kindbar的值
(try_begin),
(eq, "$kindbar", 0),
(assign, "$namebar", "spr_gratecn"), #spr_laddercn是铁丝门模型的场景物
(else_try),
(eq, "$kindbar", 1),
(assign, "$namebar", "spr_laddercn"), #spr_laddercn是梯子模型的场景物
(else_try),
(eq, "$kindbar", 2),
(assign, "$namebar", "spr_treecn1"), # 根据其他地方初始化条件判断$kindbar确定障碍物,比如spr_treecn1是一个木头桩子,存在$namebar变量中,下面可以继续else,或者有成百上千障碍物可以按顺序注册sceneprop py,然后变量值和prop序号值对应,更方便一点
(try_end),
(scene_prop_get_num_instances, ":var_4", "$namebar"),
(try_begin),
(neg|ge, ":var_4", 9),
(set_spawn_position, pos2),
(spawn_scene_prop, "$namebar"),
(scene_prop_set_slot, reg0, 100, ":var_4"),
(try_end), #上面的意思是特定障碍物$namebar要刷出9个就停止刷
(ge, ":var_4", 9),
(try_for_range, ":var_5", 0, ":var_4"),
(scene_prop_get_instance, ":var_6", "$namebar", ":var_5"), #以上2句循环这9个全部的障碍物$namebar
(try_begin),
(scene_prop_slot_eq, ":var_6", 101, 0),
(store_random_in_range, ":var_7", -180, 180),
(store_random_in_range, ":var_8", 0, 2500),
(scene_prop_set_slot, ":var_6", 102, ":var_7"),
(scene_prop_set_slot, ":var_6", 103, ":var_8"),
(scene_prop_set_slot, ":var_6", 101, 1),
(else_try), #这段else_try以上部分就是prop101号slot在值为0时,存储障碍物根据sp13中场中心位置随机出现的距离范围0-2500和随机角度-180-180度(分别存在propslot102、103号内),但是不进行位置设置。
(scene_prop_slot_eq, ":var_6", 101, 1),
(scene_prop_set_slot, ":var_6", 101, 2),
(else_try), #这段else_try以上部分因为我是0,0,0触发,如果try prop高频触发器中prop101号数据不过渡一个1,整体所有其他功能的运算复杂引擎负担重后就容易会和下一个else try串数据。
(scene_prop_slot_eq, ":var_6", 101, 2),
(scene_prop_get_slot, ":var_9", ":var_6", 102),
(scene_prop_get_slot, ":var_10", ":var_6", 103),
(position_rotate_z, pos3, ":var_9"),
(position_move_y, pos3, ":var_10"),
(position_move_z, pos3, -1000),
(prop_instance_set_position, ":var_6", pos3),
(scene_prop_set_slot, ":var_6", 101, 3),
(else_try), #这段else_try以上部分就是prop101号slot在值为2时,根据前面储存的以sp13中场中心位置的距离范围和随机角度值,进行位置初始设置,以sp13平齐的球场位置下移1000长度到地下。
(scene_prop_slot_eq, ":var_6", 101, 3),
(scene_prop_set_slot, ":var_6", 101, 4),
(else_try), #这段else_try以上部分因为我是0,0,0触发,如果try prop高频触发器中prop101号数据不过渡一个1,整体所有其他功能的运算复杂引擎负担重后就容易会和下一个else try串数据。
(scene_prop_slot_eq, ":var_6", 101, 4),
(prop_instance_get_position, pos4, ":var_6"),
(position_get_z, ":var_11", pos4),
(try_begin),
(ge, ":var_11", ":var_2"),
(scene_prop_set_slot, ":var_6", 101, 5),
(else_try),
(position_move_z, pos4, 50),
(prop_instance_animate_to_position, ":var_6", 4, 5),
(try_end),
(else_try), #这段else_try以上部分就是prop101号slot在值为4时,判断障碍物上升的运动过程,:var_11是障碍物的z坐标,var_2是sp13也就是球场中场线位置z坐标(篮球场平坦,代表整个场地地面z坐标)也就是说障碍物没从地下-1000位置把底盘升出场地,就会一直上升
(scene_prop_slot_eq, ":var_6", 101, 5),
(prop_instance_get_position, pos4, ":var_6"),
(position_get_z, ":var_11", pos4),
(try_begin),
(ge, ":var_11", ":var_3"),
(position_move_z, pos4, -50),
(prop_instance_animate_to_position, ":var_6", 4, 5),
(else_try),
(scene_prop_set_slot, ":var_6", 101, 6),
(try_end),
(else_try), #这段else_try以上部分就是prop101号slot在值为5时,判断障碍物下降的运动过程,:var_11是障碍物的z坐标,:var_3看我开头处理好的,也就是根据sp13球场中场线中心位置下降1000的位置的z坐标,也就是说和我障碍物随机移动藏于地下的初位置Z坐标相等
(scene_prop_slot_eq, ":var_6", 101, 6),
(scene_prop_set_slot, ":var_6", 101, 0), #这段以上部分prop101号slot值从下降过程的6归0,重置这个过程,循环往复。
(try_end),
(try_end),
本触发器结束
-----------------------------------
此外在sceneprop文件自行注册spr_gratecn等场景物id以及全局量等等。
|