触发器2

此功能自 BeamNG.tech 和 .drive 版本 0.14.0 开始支持。

触发器2(Triggers2) 是对 触发器 部分的改进。结合 triggerEventLinks2 和 actionsEnabled 部分,它能让触发器与输入动作之间形成更加自然的关联。这些部分可以根据车辆所装备的部件,在 UI 上显示或隐藏相应的操作。

交互映射(Interaction maps)

触发器2 需要一个 动作映射表 或交互映射表才能工作。交互映射表可以定义在以 *.interaction.json 结尾的文件中。该文件的格式与 input_actions.json 相同,并且可以替代该文件。与其关联的键盘和手柄输入映射在更名后依然可用。为了模组开发目的,可以存在多个 *.interaction.json 文件。此外,在车辆公共文件夹中还存在一个共享的交互映射表,其中包含了一些通用的交互动作,例如车门锁扣。以下为交互映射文件的示例:

{
    "fileversion": 2,
    "actions": {
        //此处的内容与 input_actions.json 文件中的内容相同
        "sleeper_door_R":      {"order":   50.1, "onDown":"controller.getControllerSafe('sleeperDoorRCoupler').toggleGroup()", "title": "vehicle.interaction.sleeperDoorR.toggle.title", "desc": "vehicle.interaction.sleeperDoorR.toggle.desc" },, 
        "sleeper_door_L":      {"order":   50.2, "onDown":"controller.getControllerSafe('sleeperDoorLCoupler').toggleGroup()", "title": "vehicle.interaction.sleeperDoorL.toggle.title", "desc": "vehicle.interaction.sleeperDoorL.toggle.desc" },
    }
}

触发器2 部分参数

注意:“label”参数已被移除。

必要参数

string
type
唯一标识该触发器。对于整个车辆来说,必须唯一
number
type
坐标系的参考节点
number
type
坐标系中的 X 轴节点
number
type
坐标系中的 Y 轴节点
string
type
触发器的类型

有效取值:

  • box(盒子)
  • sphere(球体)
dictionary 或 number
type
{“x”:1, “y”:1, “z”:1}(box),1(sphere)
default
Box 类型时为三维坐标的尺寸,Sphere 类型时为半径

Box 类型示例数值:

{"x":0.25, "y":0.05, "z":0.08}

球体类型示例数值:

0.25
dictionary
type
{“x”:0, “y”:0, “z”:0}
default
欧拉角旋转(度)

使用内置欧拉 -X -Z -Y 旋转系统,旋转中心为定义位置的盒子的角。

示例数值:

{"x":0, "y":0, "z":0}
dictionary
type
{“x”:0, “y”:0, “z”:0}
default
欧拉角旋转(度)
用于动画等。目前未启用。
dictionary
type
{“x”:0, “y”:0, “z”:0}
default
局部坐标系下的平移
用于动画等。目前未启用。
dictionary
type
{“x”:0, “y”:0, “z”:0}
default
局部坐标系下的初始平移

使用内禀欧拉 -X -Z -Y 旋转系统,旋转中心为定义位置的盒子的角。

示例数值:

{"x":0.2, "y":0.26, "z":-0.05}

可选参数

string
type
当该变形组被激活时,将禁用此触发器
array
type
以分数表示的 RGBA 数值,用于指定触发器的颜色

示例值:

"color": [0, 0, 1, 0.4]

TriggerEventLinks2 部分参数说明

注意:本部分已不再引用事件(event),trigger2 不支持事件。参数 “triggerInput” 与之前的 “action” 参数含义相同。

必要参数

string
type
triggers2 部分中触发器的 ID
string
type
用于触发事件的输入名称

常用值有:

  • action0 = 鼠标左键
  • action1 = Shift + 鼠标左键
  • action2 = 鼠标中键
string
type
要触发的 actionmap/interaction map 动作名称

如果不带前缀使用,将在车辆自身目录或公共目录下以 *.interaction.json 结尾的文件中查找。

可用原版交互列表
  • Openables
操作
事件
操作
door_L
事件
controller.getControllerSafe(‘door_L_coupler’).toggleGroup()
操作
door_R
事件
controller.getControllerSafe(‘door_R_coupler’).toggleGroup()
操作
door_FL
事件
controller.getControllerSafe(‘door_FL_coupler’).toggleGroup()
操作
door_FR
事件
controller.getControllerSafe(‘door_FR_coupler’).toggleGroup()
操作
door_RL
事件
controller.getControllerSafe(‘door_RL_coupler’).toggleGroup()
操作
door_RR
事件
controller.getControllerSafe(‘door_RR_coupler’).toggleGroup()
操作
door_RL_half
事件
controller.getControllerSafe(‘door_RL_coupler’).toggleGroupConditional({{ ‘door_FL_coupler’,‘attached’,‘vehicle.advancedCouplerControl.openFrontDoorFirst’}})
操作
door_RR_half
事件
controller.getControllerSafe(‘door_RR_coupler’).toggleGroupConditional({{ ‘door_FR_coupler’,‘attached’,‘vehicle.advancedCouplerControl.openFrontDoorFirst’}})
操作
door_rear
事件
controller.getControllerSafe(‘rearDoorCoupler’).toggleGroup()
操作
barndoor_L
事件
controller.getControllerSafe(‘barndoor_L_coupler’).toggleGroupConditional({{ ‘barndoor_R_coupler’,‘attached’,‘vehicle.advancedCouplerControl.openOtherSideFirst’}})
操作
barndoor_L_alt
事件
controller.getControllerSafe(‘barndoor_L_coupler’).toggleGroup()
操作
barndoor_RR
事件
controller.getControllerSafe(‘barndoor_RR_coupler’).toggleGroup()
操作
barndoor_RL
事件
controller.getControllerSafe(‘barndoor_RL_coupler’).toggleGroupConditional({{ ‘barndoor_RR_coupler’,‘attached’,‘vehicle.advancedCouplerControl.openOtherSideFirst’}})
操作
barndoor_R
事件
controller.getControllerSafe(‘barndoor_R_coupler’).toggleGroup()
操作
sidedoor
事件
controller.getControllerSafe(‘sidedoor_coupler’).toggleGroup()
操作
sidedoor_F
事件
controller.getControllerSafe(‘sidedoor_F_coupler’).toggleGroup()
操作
sidedoor_R
事件
controller.getControllerSafe(‘sidedoor_R_coupler’).toggleGroupConditional({{ ‘sidedoor_F_coupler’,‘attached’,‘vehicle.advancedCouplerControl.openOtherSideFirst’}})
操作
hoodCatch
事件
controller.getControllerSafe(‘hoodCatchCoupler’).toggleGroupConditional({{ ‘hoodLatchCoupler’,‘attached’,‘vehicle.advancedCouplerControl.releaseHoodFirstInterior’}})
操作
hoodRelease
事件
controller.getControllerSafe(‘hoodLatchCoupler’).toggleGroup()
操作
toggle_cargodoorRL
事件
controller.getControllerSafe(‘cargoDoorRLCoupler’).toggleGroup()
操作
toggle_cargodoorRR
事件
controller.getControllerSafe(‘cargoDoorRRCoupler’).toggleGroup()
操作
tailgate
事件
controller.getControllerSafe(’tailgateCoupler’).toggleGroup()
操作
tailgate_lower
事件
controller.getControllerSafe(’tailgateCoupler’).toggleGroupConditional({{ ’tailgateCouplerUpper’,‘attached’,‘vehicle.advancedCouplerControl.openUpperPartFirst’},{‘spareholderCoupler’,‘attached’,‘vehicle.advancedCouplerControl.openSpareHolderFirst’}})
操作
tailgate_upper
事件
controller.getControllerSafe(’tailgateCouplerUpper’).toggleGroup()
操作
tailgate_lower_alt
事件
controller.getControllerSafe(’tailgateCoupler’).toggleGroupConditional({{ ‘spareholderCoupler’,‘attached’,‘vehicle.advancedCouplerControl.openSpareHolderFirst’}})
操作
tailgate_upper_alt
事件
controller.getControllerSafe(’tailgateCouplerUpper’).toggleGroupConditional({{ ’tailgateCoupler’,‘attached’,‘vehicle.advancedCouplerControl.openLowerPartFirst’}})
操作
tailgateCatch
事件
controller.getControllerSafe(’tailgateCatchCoupler’).toggleGroupConditional({{ ’tailgateLatchCoupler’,‘attached’,‘vehicle.advancedCouplerControl.releaseTailgateFirstInterior’}})
操作
tailgateRelease
事件
controller.getControllerSafe(’tailgateLatchCoupler’).toggleGroup()
操作
trunk
事件
controller.getControllerSafe(’trunkCoupler’).toggleGroup()
操作
hatch
事件
controller.getControllerSafe(‘hatchCoupler’).toggleGroup()
操作
decklid
事件
controller.getControllerSafe(‘decklidCoupler’).toggleGroup()
操作
spareholder
事件
controller.getControllerSafe(‘spareholderCoupler’).toggleGroup()
操作
folding_step
事件
controller.getControllerSafe(‘step_coupler’).toggleGroup()
操作
roofbox
事件
controller.getControllerSafe(‘roofboxCoupler’).toggleGroup()
操作
lid_B
事件
controller.getControllerSafe(’lidBCoupler’).toggleGroup()
操作
lid_F
事件
controller.getControllerSafe(’lidFCoupler’).toggleGroup()
操作
lid_R
事件
controller.getControllerSafe(’lidRCoupler’).toggleGroup()
操作
lid_B2
事件
controller.getControllerSafe(’lidB2Coupler’).toggleGroup()
操作
lid_F2
事件
controller.getControllerSafe(’lidF2Coupler’).toggleGroup()
操作
lid_R2
事件
controller.getControllerSafe(’lidR2Coupler’).toggleGroup()
操作
porta_potty_door
事件
controller.getControllerSafe(‘portaPottyDoorCoupler’).toggleGroupConditional({{ ‘portaPottyLockCoupler’,‘attached’,‘vehicle.advancedCouplerControl.portaPotty’}})
操作
porta_potty_lock
事件
controller.getControllerSafe(‘portaPottyLockCoupler’).toggleGroup()
  • 警用部件
操作
事件
操作
toggle_beacon
事件
    electrics.set_lightbar_signal(electrics.values.lightbar == 0 and 1 or 0)
操作
toggle_lightbar
事件
  electrics.set_lightbar_signal(electrics.values.lightbar == 0 and 1 or 0)
操作
toggle_siren
事件
     electrics.set_lightbar_signal(electrics.values.lightbar == 2 and 1 or 2)
操作
toggle_lightbar_siren
事件
electrics.set_lightbar_signal(electrics.values.lightbar == 0 and 2 or 0)
操作
lightbar_setmode_1
事件
for _, v in pairs(controller.getControllersByType(’lightbar’)) do v.setModeIndex(1) end
操作
lightbar_setmode_2
事件
for _, v in pairs(controller.getControllersByType(’lightbar’)) do v.setModeIndex(2) end
操作
lightbar_setmode_3
事件
for _, v in pairs(controller.getControllersByType(’lightbar’)) do v.setModeIndex(3) end
操作
lightbar_setmode_4
事件
for _, v in pairs(controller.getControllersByType(’lightbar’)) do v.setModeIndex(4) end
操作
toggle_lightbar_mode
事件
for _ ,v in pairs(controller.getControllersByType(’lightbar’)) do v.toggleMode() end
  • 半挂卡车与拖车
操作
事件
操作
fifthwheelDecouple
事件
controller.getControllerSafe(‘fifthwheel’).detachFifthwheel()
操作
pintleHitchToggle
事件
beamstate.toggleCouplers(‘pintle’, true, false, false)
操作
feet_up
事件
controller.getControllerSafe(’trailerFeet’).moveFeet(-VALUE)
操作
feet_down
事件
controller.getControllerSafe(’trailerFeet’).moveFeet(VALUE)
操作
toggle_jack
事件
electrics.values.feet = 1 - (electrics.values.feet or 0)
  • Lowrider 液压
Action
onDown
onUp
Action
hydraulics_jump_full
onDown
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsPosition({‘full’},1,15)
onUp
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsBleed({‘full’},0.9)
Action
hydraulics_jump_front
onDown
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsPosition({‘frontAxle’},1,15)
onUp
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsBleed({‘frontAxle’},1)
Action
hydraulics_jump_rear
onDown
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsPosition({‘rearAxle’},1,15)
onUp
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsBleed({‘rearAxle’},1)
Action
hydraulics_jump_left
onDown
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsPosition({’leftSide’},1,15)
onUp
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsBleed({’leftSide’},1)
Action
hydraulics_jump_right
onDown
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsPosition({‘rightSide’},1,15)
onUp
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsBleed({‘rightSide’},1)
Action
hydraulics_lower_full
onDown
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsBleed({‘full’},0.1)
onUp
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsBleed({‘full’},0)
Action
hydraulics_raise_full
onDown
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsMomentaryIncrease({‘full’},true,1)
onUp
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsMomentaryIncrease({‘full’},false,1)
Action
hydraulics_lower_front
onDown
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsBleed({‘frontAxle’},0.1)
onUp
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsBleed({‘frontAxle’},0)
Action
hydraulics_lower_rear
onDown
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsBleed({‘rearAxle’},0.1)
onUp
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsBleed({‘rearAxle’},0)
Action
hydraulics_lower_FL
onDown
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsBleed({‘frontLeft’},0.1)
onUp
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsBleed({‘frontLeft’},0)
Action
hydraulics_lower_FR
onDown
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsBleed({‘frontRight’},0.1)
onUp
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsBleed({‘frontRight’},0)
Action
hydraulics_lower_RL
onDown
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsBleed({‘rearLeft’},0.1)
onUp
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsBleed({‘rearLeft’},0)
Action
hydraulics_lower_RR
onDown
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsBleed({‘rearRight’},0.1)
onUp
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsBleed({‘rearRight’},0)
Action
hydraulics_raise_front
onDown
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsMomentaryIncrease({‘frontAxle’},true,1)
onUp
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsMomentaryIncrease({‘frontAxle’},false,1)
Action
hydraulics_raise_rear
onDown
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsMomentaryIncrease({‘rearAxle’},true,1)
onUp
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsMomentaryIncrease({‘rearAxle’},false,1)
Action
hydraulics_raise_FL
onDown
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsMomentaryIncrease({‘frontLeft’},true,1)
onUp
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsMomentaryIncrease({‘frontLeft’},false,1)
Action
hydraulics_raise_FR
onDown
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsMomentaryIncrease({‘frontRight’},true,1)
onUp
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsMomentaryIncrease({‘frontRight’},false,1)
Action
hydraulics_raise_RL
onDown
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsMomentaryIncrease({‘rearLeft’},true,1)
onUp
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsMomentaryIncrease({‘rearLeft’},false,1)
Action
hydraulics_raise_RR
onDown
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsMomentaryIncrease({‘rearRight’},true,1)
onUp
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsMomentaryIncrease({‘rearRight’},false,1)
  • 集装箱联锁器
操作
事件
操作
container_attach_h_bot
事件
beamstate.toggleCouplers(‘cp1_h’, true)
操作
container_attach_h_top
事件
beamstate.toggleCouplers(‘cp2_h’, true)
操作
container_attach_v_top
事件
beamstate.toggleCouplers(‘cp_v’, true)
  • JATO(火箭加速器)
操作
事件
操作
jato
事件
electrics.values.jatoInput = 1 - (electrics.values.jatoInput or 0)

当操作名称前添加 “common:” 前缀时,将会在 VehicleCommonActionMap 中查找该操作。你可以在 lua\ge\extensions\core\input\actions\vehicle.json 中查看可用的操作。

可选参数

boolean
type
false
default
如果设置为true,则传递给 *.interaction.json 中关联事件的 VALUE 会乘以 -1

ActionsEnabled(激活动作)

在 *.interaction.json 文件中的动作(Actions),与自定义动作映射(custom action maps)类似,默认是禁用的(这意味着屏幕右上角不会显示其对应按键的提示,但当按下该按键时代码依然会被执行)。你可以通过 JBeam 文件中为使用这些动作的车辆部件添加 ActionsEnabled 部分,来启用对应的动作。它仅接收一个参数,即需要启用的动作ID。示例如下:

"actionsEnabled": [
    ["id"],
    ["door_FR"],
],

这一特性在车辆有大量可用动作,且根据所选部件只有其中一部分可用时尤其有用,比如带有多种后期改装变体和内部控制的半挂卡车。

简易示例

一个用于车门锁的标准 triggers2 设置。它使用了在 common_default.interaction.json 文件中定义的 door_FR 动作。

"triggers2":[
    ["id", "idRef:", "idX:", "idY:", "type", "size", "baseRotation", "rotation", "translation", "baseTranslation"],
    ["door_R", "d3r","d2r","d6r", "box", {"x":0.1, "y":0.03, "z":0.1}, {"x":0, "y":90, "z":0}, {"x":0, "y":0, "z":0}, {"x":0, "y":0, "z":0}, {"x":0.24, "y":0.13, "z":-0.003}],
    ["door_R_int", "d4r","d5r","d1r", "box", {"x":0.1, "y":0.03, "z":0.1}, {"x":-0, "y":0, "z":-0}, {"x":0, "y":0, "z":0}, {"x":0, "y":0, "z":0}, {"x":0.15, "y":-0.2, "z":0.0175}],
],
"triggerEventLinks2":[
    ["triggerId:triggers2", "triggerInput", "inputAction"],
    ["door_R", "action0", "door_FR"],
    ["door_R_int", "action0", "door_FR"],
],
"actionsEnabled": [
    ["id"],
    ["door_FR"],
],

进阶示例

一个更复杂的设置,使用了彩色触发器,VehicleCommonActionMap 中的动作,以及车辆自定义 interaction map 的自定义动作。

"triggers2": [
    ["id", "idRef:", "idX:", "idY:", "type", "size", "baseRotation", "rotation", "translation", "baseTranslation"],
    ["sw_ignition", "dsh","dshr","dsh2", "box", {"x":0.05, "y":0.02, "z":0.02}, {"x":17, "y":-5, "z":8}, {"x":0, "y":0, "z":0}, {"x":0, "y":0, "z":0}, {"x":-0.19, "y":0.155, "z":0.129}, {"deformGroup":"", "color": [0, 0, 1, 0.4]}],
    ["sw_starter", "dsh","dshr","dsh2", "box", {"x":0.05, "y":0.05, "z":0.05}, {"x":17, "y":-5, "z":8}, {"x":0, "y":0, "z":0}, {"x":0, "y":0, "z":0}, {"x":-0.18, "y":0.24, "z":0.094}, {"deformGroup":"", "color": [0, 0, 1, 0.4]}],
    ["trailerAir",  "dsh","dshr","dsh2", "box", {"x":0.07, "y":0.03, "z":0.07}, {"x":8, "y":-8, "z":-24}, {"x":0, "y":0, "z":0}, {"x":0, "y":0, "z":0}, {"x":0.025, "y":0.053, "z":-0.036}, {"deformGroup":"", "color": [0, 0, 1, 0.4]}],
    ["parkingBrake",  "dsh","dshr","dsh2", "box", {"x":-0.07, "y":0.03, "z":0.07}, {"x":8, "y":-8, "z":-24}, {"x":0, "y":0, "z":0}, {"x":0, "y":0, "z":0}, {"x":-0.001, "y":0.057, "z":-0.025}, {"deformGroup":"", "color": [0, 0, 1, 0.4]}],
],
"triggerEventLinks2": [
    ["triggerId:triggers2", "triggerInput", "inputAction"],
    ["sw_ignition", "action0", "common:activateStarterMotor"],
    ["sw_starter", "action0", "common:setIgnitionLevel3Momentary"],
    ["parkingBrake", "action0", "common:parkingbrake"],
    ["trailerAir", "action0", "toggleTrailerAirSupply"],
],
"actionsEnabled": [
    ["id"],
    ["toggleTrailerAirSupply"],
],

对应交互映射(interaction map)中的动作:

"toggleTrailerAirSupply":  {"order":   30.1, "energyStorage.getStorageSafe('mainAirTank'):toggleConsumerPressureCoef()""title": "vehicle.interaction.pneumatics.trailerAirSupply.toggle.title", "desc": "vehicle.interaction.pneumatics.trailerAirSupply.toggle.desc" },
上一次修订: 五月 21, 2026

还有其他问题?

加入我们的 Discord 服务器
Our documentation is currently incomplete and undergoing active development. If you have any questions or feedback, please visit this forum thread.