trigger_catapult
trigger_catapult
是一个笔刷实体,可在Template:传送门2、Template:军团要塞2 和 Template:盖瑞模组中使用。

- The {{{game}}} parameter is inconsistent with the name defined by the {{传送门2}} template.
- The {{{game1}}} parameter is inconsistent with the name defined by the {{军团要塞2}} template.
- The {{{game2}}} parameter is inconsistent with the name defined by the {{盖瑞模组}} template.
If a parameter is consistent but you're still seeing this warning, it may be an issue with the template itself. Please discuss it on the template's talk page.
在 Alien Swarm: Reactive Drop中也有名为
trigger_catapult
的实体,但它似乎是功能不同的另一个实体。
该实体用于将玩家或其他物体弹射到空中。 它能够设置实体的飞行方向或目标,考虑其当前速度,并且(对玩家而言)能抑制其控制,这使其成为控制飞行轨迹和落点的强大工具。
通常用于空中信仰板 来实现一种不一定需要玩家使用传送门的抛射 效果。
配置
弹射方向由键值Launch target|弹射目标或Launch direction|弹射方向决定。如果设置了前者,后者将被忽略。除此之外,地图制作者可以设定实体被弹射所需满足的最小/最大速度和方向条件。

弹射目标
// 模拟带弹射目标的trigger_catapult的Squirrel函数
// trigger_catapult(被弹射实体句柄, 目标向量, 速度)
::trigger_catapult <- function(ent, target, speed=450)
{
local g = 600 // sv_gravity
local d = target - ent.GetOrigin() // 从起点到目标的向量
local t = d.Length() / speed // 飞行所需时间(秒)
local vz = d.z / t + 0.5 * g * t // 所需的初始z轴速度
local v = Vector(d.x / t, d.y / t, vz) // v.Length()是阈值基准
ent.SetVelocity(v)
}
最简单的配置是创建或找到一个实体(如info_target 或其他任何实体),将其原点放置在玩家或物体应该飞向的位置,并在trigger_catapult的Launch target|弹射目标键值中指定该实体的名称。
设置完成后,两个速度键值将决定飞行高度,通常更高的速度会使弹射轨迹更平缓,而更低的速度会使轨迹更陡峭。实际弹射速度也会根据触碰trigger_catapult的位置略有不同(因为不能平等对待每个弹射位置)。如果被弹射物体在弹射后受到重力以外的力影响,将会错过目标。
如果设置了Launch target|弹射目标且符合条件的物体触碰到trigger_catapult,游戏会通过两者初始距离除以相应速度键值来计算物体到达目标所需时间(这就是为什么当速度恰好为0时游戏会崩溃):时间 = 距离 / 速度。基于这个时间,游戏会按照右侧代码所示将物体射向精确计算的方向,使其正好在计算时间内到达目标。游戏想要射击实体的速度是最终阈值检查的基准值,详见下文。总之,这就是为什么设置非常低的速度会导致极高的向上弹射速度——因为低速度意味着物体需要更长时间才能到达目标。
弹射方向
也可以留空Launch target|弹射目标而设置Launch direction|弹射方向。在这种情况下,速度键值真正代表物体将被弹射的速度,除非Launch direction|弹射方向键值设为Up|向上(精确为-90 0 0),此时弹射速度会是设定值的1.5倍(这与Use Exact Velocity|使用精确速度键值无关)。要在Up|向上(-90 0 0)情况下达到起始高度h的最大高度,请将速度设为sqrt(h) * 23.1。
一般来说,如果实体以speed单位/秒的速度和pitch角度(0到-90,0表示水平,-90表示垂直向上)被弹射,则被弹射物体将在t = speed * sin(-pitch) / sv_gravity秒后到达最高点,该点比弹射点高t2 * sv_gravity / 2单位,并在x-y平面上偏移t * speed * cos(pitch)单位。
速度阈值
如果Use Threshold Check|使用阈值检查设为Yes|是,此trigger_catapult只会在实体速度至少为speed * (1 - lowerThreshold)单位/秒且至多为speed * (1 + upperThreshold)单位/秒时弹射该实体,其中speed是游戏想要射击实体的速度。如果没有设置Launch target|弹射目标,它等于相应的速度键值,否则是游戏计算的值,见上方代码。
如果Use Absolute Threshold Check|使用绝对阈值检查设为Yes|是,阈值键值代表实际速度而非百分比。
此外,Entry Angle Tolerance|进入角度容差可用于限制实体速度必须指向的方向才能被弹射。如果设为x,则只有当实体进入速度与从弹射位置到目标的向量之间的夹角不超过cos-1(x)时才会被弹射,其中x = 0表示最多偏离90°,x = -1表示总是弹射(最多偏离180°),参见点积 。
抑制玩家控制
Air Control Supression Time|空中控制抑制时间可用于防止玩家通过侧移偏离预期的弹射轨迹。它会在弹射后固定时间内禁用玩家的空中控制。即使玩家已经着陆,此效果也不会结束,因此地图制作者可能需要通过游戏内测量(如使用host_timescale 和printl(Time()) )来精确设置这个持续时间。
为了获得可预测的弹射轨迹,这有助于消除一个干扰因素,但还需要考虑其他因素,例如传送门漏斗效应 、静态障碍物、其他不可预测的飞行物体、trigger_push 、枪火、sv_maxvelocity (默认为3500单位/秒)等。
测试
如果编译地图后对配置不满意,无需重新编译即可测试不同配置:在游戏中使用ent_fire <trigger_catapult名称> addoutput "<键值> <值>"更改trigger_catapult的键值。如果没有名称,使用trigger_catapult作为名称以定位所有此类实体。通过ent_fire所做的所有更改在地图更换或重新加载时都会被丢弃。
在游戏中,可以使用命令1 、trigger_catapult 和trigger_catapult 查看预测的弹射轨迹。将developer设为≥1还会在控制台打印关于正在进行的阈值检查的调试信息。
键值
- Player Speed (playerSpeed) <玩家速度 >
- float
- Physics Object Speed (physicsSpeed) <物理对象速度 >
- float
- Use Threshold Check (useThresholdCheck) <使用阈值检查 >
- boolean
- Entry Angle Tolerance (entryAngleTolerance) <进入角度容差 >
- float
- Use Exact Velocity (useExactVelocity) <使用精确速度 >
- boolean
- Exact Solution Method (exactVelocityChoiceType) <精确解方法 >
- choices
- 0 : 最佳
- 1 : 解一
- 2 : 解二
- Lower Threshold (lowerThreshold) <下限阈值 >
- float
- Upper Threshold (upperThreshold) <上限阈值 >
- float
- Launch direction (launchDirection) <弹射方向 >
- angle
- Launch target (launchTarget) <弹射目标 >
- target_destination
- Only check velocity (onlyVelocityCheck) <仅检查速度 >
- boolean
- Apply angular impulse (applyAngularImpulse) <应用角冲量 >
- boolean
- Air Control Supression Time (AirCtrlSupressionTime) <空中控制抑制时间 >
- float
|
标志
|
输入
|
输出
- OnCatapulted
- 当物体已被弹射或本应被弹射时触发(如果onlyVelocityCheck设为Yes
|