此功能自 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”参数已被移除。
必要参数
Box 类型示例数值:
{"x":0.25, "y":0.05, "z":0.08}
球体类型示例数值:
使用内置欧拉 -X -Z -Y 旋转系统,旋转中心为定义位置的盒子的角。
示例数值:
使用内禀欧拉 -X -Z -Y 旋转系统,旋转中心为定义位置的盒子的角。
示例数值:
{"x":0.2, "y":0.26, "z":-0.05}
可选参数
TriggerEventLinks2 部分参数说明
注意:本部分已不再引用事件(event),trigger2 不支持事件。参数 “triggerInput” 与之前的 “action” 参数含义相同。
必要参数
常用值有:
- action0 = 鼠标左键
- action1 = Shift + 鼠标左键
- action2 = 鼠标中键
如果不带前缀使用,将在车辆自身目录或公共目录下以 *.interaction.json 结尾的文件中查找。
可用原版交互列表
controller.getControllerSafe(‘door_L_coupler’).toggleGroup()
controller.getControllerSafe(‘door_R_coupler’).toggleGroup()
controller.getControllerSafe(‘door_FL_coupler’).toggleGroup()
controller.getControllerSafe(‘door_FR_coupler’).toggleGroup()
controller.getControllerSafe(‘door_RL_coupler’).toggleGroup()
controller.getControllerSafe(‘door_RR_coupler’).toggleGroup()
controller.getControllerSafe(‘door_RL_coupler’).toggleGroupConditional({{ ‘door_FL_coupler’,‘attached’,‘vehicle.advancedCouplerControl.openFrontDoorFirst’}})
controller.getControllerSafe(‘door_RR_coupler’).toggleGroupConditional({{ ‘door_FR_coupler’,‘attached’,‘vehicle.advancedCouplerControl.openFrontDoorFirst’}})
controller.getControllerSafe(‘rearDoorCoupler’).toggleGroup()
controller.getControllerSafe(‘barndoor_L_coupler’).toggleGroupConditional({{ ‘barndoor_R_coupler’,‘attached’,‘vehicle.advancedCouplerControl.openOtherSideFirst’}})
controller.getControllerSafe(‘barndoor_L_coupler’).toggleGroup()
controller.getControllerSafe(‘barndoor_RR_coupler’).toggleGroup()
controller.getControllerSafe(‘barndoor_RL_coupler’).toggleGroupConditional({{ ‘barndoor_RR_coupler’,‘attached’,‘vehicle.advancedCouplerControl.openOtherSideFirst’}})
controller.getControllerSafe(‘barndoor_R_coupler’).toggleGroup()
controller.getControllerSafe(‘sidedoor_coupler’).toggleGroup()
controller.getControllerSafe(‘sidedoor_F_coupler’).toggleGroup()
controller.getControllerSafe(‘sidedoor_R_coupler’).toggleGroupConditional({{ ‘sidedoor_F_coupler’,‘attached’,‘vehicle.advancedCouplerControl.openOtherSideFirst’}})
controller.getControllerSafe(‘hoodCatchCoupler’).toggleGroupConditional({{ ‘hoodLatchCoupler’,‘attached’,‘vehicle.advancedCouplerControl.releaseHoodFirstInterior’}})
controller.getControllerSafe(‘hoodLatchCoupler’).toggleGroup()
controller.getControllerSafe(‘cargoDoorRLCoupler’).toggleGroup()
controller.getControllerSafe(‘cargoDoorRRCoupler’).toggleGroup()
controller.getControllerSafe(’tailgateCoupler’).toggleGroup()
controller.getControllerSafe(’tailgateCoupler’).toggleGroupConditional({{ ’tailgateCouplerUpper’,‘attached’,‘vehicle.advancedCouplerControl.openUpperPartFirst’},{‘spareholderCoupler’,‘attached’,‘vehicle.advancedCouplerControl.openSpareHolderFirst’}})
controller.getControllerSafe(’tailgateCouplerUpper’).toggleGroup()
controller.getControllerSafe(’tailgateCoupler’).toggleGroupConditional({{ ‘spareholderCoupler’,‘attached’,‘vehicle.advancedCouplerControl.openSpareHolderFirst’}})
controller.getControllerSafe(’tailgateCouplerUpper’).toggleGroupConditional({{ ’tailgateCoupler’,‘attached’,‘vehicle.advancedCouplerControl.openLowerPartFirst’}})
controller.getControllerSafe(’tailgateCatchCoupler’).toggleGroupConditional({{ ’tailgateLatchCoupler’,‘attached’,‘vehicle.advancedCouplerControl.releaseTailgateFirstInterior’}})
controller.getControllerSafe(’tailgateLatchCoupler’).toggleGroup()
controller.getControllerSafe(’trunkCoupler’).toggleGroup()
controller.getControllerSafe(‘hatchCoupler’).toggleGroup()
controller.getControllerSafe(‘decklidCoupler’).toggleGroup()
controller.getControllerSafe(‘spareholderCoupler’).toggleGroup()
controller.getControllerSafe(‘step_coupler’).toggleGroup()
controller.getControllerSafe(‘roofboxCoupler’).toggleGroup()
controller.getControllerSafe(’lidBCoupler’).toggleGroup()
controller.getControllerSafe(’lidFCoupler’).toggleGroup()
controller.getControllerSafe(’lidRCoupler’).toggleGroup()
controller.getControllerSafe(’lidB2Coupler’).toggleGroup()
controller.getControllerSafe(’lidF2Coupler’).toggleGroup()
controller.getControllerSafe(’lidR2Coupler’).toggleGroup()
controller.getControllerSafe(‘portaPottyDoorCoupler’).toggleGroupConditional({{ ‘portaPottyLockCoupler’,‘attached’,‘vehicle.advancedCouplerControl.portaPotty’}})
controller.getControllerSafe(‘portaPottyLockCoupler’).toggleGroup()
electrics.set_lightbar_signal(electrics.values.lightbar == 0 and 1 or 0)
electrics.set_lightbar_signal(electrics.values.lightbar == 0 and 1 or 0)
electrics.set_lightbar_signal(electrics.values.lightbar == 2 and 1 or 2)
electrics.set_lightbar_signal(electrics.values.lightbar == 0 and 2 or 0)
for _, v in pairs(controller.getControllersByType(’lightbar’)) do v.setModeIndex(1) end
for _, v in pairs(controller.getControllersByType(’lightbar’)) do v.setModeIndex(2) end
for _, v in pairs(controller.getControllersByType(’lightbar’)) do v.setModeIndex(3) end
for _, v in pairs(controller.getControllersByType(’lightbar’)) do v.setModeIndex(4) end
for _ ,v in pairs(controller.getControllersByType(’lightbar’)) do v.toggleMode() end
controller.getControllerSafe(‘fifthwheel’).detachFifthwheel()
beamstate.toggleCouplers(‘pintle’, true, false, false)
controller.getControllerSafe(’trailerFeet’).moveFeet(-VALUE)
controller.getControllerSafe(’trailerFeet’).moveFeet(VALUE)
electrics.values.feet = 1 - (electrics.values.feet or 0)
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsPosition({‘full’},1,15)
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsBleed({‘full’},0.9)
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsPosition({‘frontAxle’},1,15)
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsBleed({‘frontAxle’},1)
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsPosition({‘rearAxle’},1,15)
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsBleed({‘rearAxle’},1)
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsPosition({’leftSide’},1,15)
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsBleed({’leftSide’},1)
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsPosition({‘rightSide’},1,15)
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsBleed({‘rightSide’},1)
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsBleed({‘full’},0.1)
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsBleed({‘full’},0)
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsMomentaryIncrease({‘full’},true,1)
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsMomentaryIncrease({‘full’},false,1)
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsBleed({‘frontAxle’},0.1)
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsBleed({‘frontAxle’},0)
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsBleed({‘rearAxle’},0.1)
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsBleed({‘rearAxle’},0)
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsBleed({‘frontLeft’},0.1)
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsBleed({‘frontLeft’},0)
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsBleed({‘frontRight’},0.1)
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsBleed({‘frontRight’},0)
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsBleed({‘rearLeft’},0.1)
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsBleed({‘rearLeft’},0)
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsBleed({‘rearRight’},0.1)
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsBleed({‘rearRight’},0)
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsMomentaryIncrease({‘frontAxle’},true,1)
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsMomentaryIncrease({‘frontAxle’},false,1)
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsMomentaryIncrease({‘rearAxle’},true,1)
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsMomentaryIncrease({‘rearAxle’},false,1)
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsMomentaryIncrease({‘frontLeft’},true,1)
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsMomentaryIncrease({‘frontLeft’},false,1)
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsMomentaryIncrease({‘frontRight’},true,1)
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsMomentaryIncrease({‘frontRight’},false,1)
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsMomentaryIncrease({‘rearLeft’},true,1)
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsMomentaryIncrease({‘rearLeft’},false,1)
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsMomentaryIncrease({‘rearRight’},true,1)
controller.getControllerSafe(‘hydraulicSuspension’).setGroupsMomentaryIncrease({‘rearRight’},false,1)
beamstate.toggleCouplers(‘cp1_h’, true)
beamstate.toggleCouplers(‘cp2_h’, true)
beamstate.toggleCouplers(‘cp_v’, true)
electrics.values.jatoInput = 1 - (electrics.values.jatoInput or 0)
当操作名称前添加 “common:” 前缀时,将会在 VehicleCommonActionMap
中查找该操作。你可以在 lua\ge\extensions\core\input\actions\vehicle.json 中查看可用的操作。
可选参数
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" },