Written By CorsairCat
Email to contactus@corsaircat.com if you have question
Specail Thanks to @Nero
这是一份开发独立舱内航电的文档(非官方)
这份东西不是翻译稿,全部是基于我对代码和mod的理解
当前版本0.3.0,暂时还没写完
遵循 CC BY-NC-SA 4.0 协议
写这份东西是因为我发现中文版本的mod制作说明存在缺失,同时我对于国内的mod制作环境感到失望。
这份东西算是一个给后来的DCS World mod开发者的小礼物。
首先请各位在看这份之前对于mod有基本的理解(会套官方的航电,比如FC3)。所以在这里我不会讨论包含建模和如何套壳,如何改SFM气动的话题。这里我主要会讲如何制作一个脱离官方模组的完全独立的航电系统(具体可以参考社区的A4-E模组)。
注意:很多SDK是不对非第三方开发的,作为mod开发者,只能使用DCS的Lua脚本引擎提供的很有限的功能。但就目前已知的基本上可以实现绝大多数航电控制。但是注意以下两个内容为完全无法控制:无线电通信和闭路光学观瞄
首先加载时候是走entry.lua文件,其中注意下面这行
make_flyable('YourPlaneName', current_mod_path..'/Cockpit/Scripts/', FM, current_mod_path..'/comm.lua')
其中包含四个参数,第一个是飞机名称,第二个是座舱的加载文件夹,第三个是默认调用的飞行模拟模型,最后一个是基础的通信模型
MainPanel = {"ccMainPanel",LockOn_Options.script_path.."mainpanel_init.lua"}
creators = {} creators[devices.ELECTRIC_SYSTEM] ={"avSimpleElectricSystem",LockOn_Options.script_path.."Systems/electric_system.lua"}
indicators = {} indicators[#indicators + 1] = {"ccIndicator", LockOn_Options.script_path.."MFD/Indicator/init.lua",nil,{{"main_screen_center","main_screen_down","main_screen_right"}}}
shape_name = "Cockpit-EDM-File-Name" is_EDM = true new_model_format = true
Canopy = CreateGauge() Canopy.arg_number = 1 Canopy.input = {0,1} Canopy.output = {0,1} Canopy.parameter_name = "Canopy_Anima"
注意,所有动画都需要arg based animation 支持,此处不做详细论述
特别注意,由于内外有两份座舱,外部模型中的arg114动画为使外部舱内消失
set_aircraft_draw_argument_value(9, ROLL_STATE)
get_aircraft_draw_argument_value(9)
第一个参数为动画arg号,第二个值为设置到的状态
Canopy = CreateGauge("parameter") Canopy.arg_number = 1 Canopy.input = {0,1} Canopy.output = {0,1} Canopy.parameter_name = "Canopy"
a = get_param_handle("LandingGearLevel")
a:set(value) a:get()
-- 获取脚本本身设备 local Device = GetSelf() -- 刷新函数间隔设置 local update_time_step = 0.02 make_default_activity(update_time_step) function post_initialize() --默认初始化函数 end Device:listen_command(KeyCommand) function SetCommand(command,value) --对listen_command的处理函数 end function update() --内置刷新函数 end
local birth = LockOn_Options.init_conditions.birth_place if birth=="GROUND_HOT" then --地面热车 elseif birth=="AIR_HOT" then --空中出生 elseif birth=="GROUND_COLD" then --地面冷舱 end
注意,这部分内容来源于一个较早的mod样例
local Device = GetSelf() Device:Device_Function()
左发发电机(单引擎请只启用这个) AC_Generator_1_on(true/false) 右发发电机 AC_Generator_2_on(true/false) 电池组(推荐启用) DC_Battery_on(true/false)
交流总线
get_AC_Bus_1_voltage() -- 左发运转正常且启用左发电机时返回115
get_AC_Bus_2_voltage() -- 右发运转正常且启用右发电机时返回115
直流总线
get_DC_Bus_1_voltage() -- 左发总线有115或电池开关打开时返回28
get_DC_Bus_2_voltage() -- 右发总线有115或电池开关打开时返回28
| 指令名称 | 指令编号 |
|---|---|
| iCommandPowerOnOff | 315 |
| iCommandGroundPowerDC | 704 |
| iCommandGroundPowerDC_Cover | 705 |
| iCommandPowerBattery1 | 706 |
| iCommandPowerBattery1_Cover | 707 |
| iCommandPowerBattery2 | 708 |
| iCommandPowerBattery2_Cover | 709 |
| iCommandGroundPowerAC | 710 |
| iCommandPowerGeneratorLeft | 711 |
| iCommandPowerGeneratorRight | 712 |
| iCommandElectricalPowerInverter | 713 |
| iCommandAPUGeneratorPower | 1071 |
| iCommandBatteryPower | 1073 |
| iCommandElectricalPowerInverterSTBY | 1074 |
| iCommandElectricalPowerInverterOFF | 1075 |
| iCommandElectricalPowerInverterTEST | 1076 |
dispatch_action(nil, iCommandNum, value)来发送原生指令
| 函数 | 作用 |
|---|---|
| drop_chaff() | 抛洒箔条 |
| drop_flare() | 抛洒红外干扰弹 |
| emergency_jettison() | 紧急抛离(效果未验证) |
| emergency_jettison_rack() | 紧急抛离挂架(效果未验证) |
| get_chaff_count() | 获取箔条数量 |
| get_ECM_status() | 获取ECM干扰器状态(未实验) |
| get_flare_count() | 获取干扰弹数量 |
| get_station_info() | 获取挂架信息(返回为一张表) |
| get_target_range() | 获取目标距离 |
| get_target_span() | 获取目标宽度 |
| get_weapon_count() | 获取挂架上武器数量(部分武器为单挂架多个) |
| launch_station() | 发射武器(需要先选中挂架) |
| select_station() | 选中挂架() |
| set_ECM_status() | 设置ECM干扰器状态 |
| set_target_range() | 设置目标距离 |
| set_target_span() | 设置目标宽度 |
-- 获取锁定状态 -- 是否锁定 local ir_missile_lock_status = get_param_handle("WS_IR_MISSILE_LOCK") -- 锁定的目标的高程和方向 local ir_missile_target_az = get_param_handle("WS_IR_MISSILE_TARGET_AZIMUTH") local ir_missile_target_el = get_param_handle("WS_IR_MISSILE_TARGET_ELEVATION") -- 设置搜索方向 -- 方位角 local ir_missile_desire_az = get_param_handle("WS_IR_MISSILE_SEEKER_DESIRED_AZIMUTH") -- 高程 local ir_missile_desire_el = get_param_handle("WS_IR_MISSILE_SEEKER_DESIRED_ELEVATION")