Detecting damage in aircraft mod - ED Forums
 


Notices

Reply
 
Thread Tools Display Modes
Old 08-23-2016, 07:16 AM   #1
gyrovague
3rd Party Developer
 
gyrovague's Avatar
 
Join Date: Apr 2016
Posts: 125
Default Detecting damage in aircraft mod

I'm hoping somebody here can point me in the right direction. I want to be able to detect damage to various parts of an SFM/SSM aircraft in Lua.

The main aircraft definition file has entries such as:
Code:
    --damage , index meaning see in  Scripts\Aircrafts\_Common\Damage.lua
    Damage = {
                [0] = {critical_damage = 5, args = {82}}, -- 0 - nose center
                [3] = {critical_damage = 10, args = {65}}, -- 3 - cockpit
and
Code:
    DamageParts = 
    {  
        [1] = "plane_damage_wing_R", -- Right Wing
        [2] = "plane_damage_wing_L", -- Left Wing
and
Code:
    Failures = {
        { id = 'autopilot', label = _('AUTOPILOT'), enable = false, hh = 0, mm = 0, mmint = 1, prob = 100 },
        { id = 'engine',  label = _('ENGINE'),     enable = false, hh = 0, mm = 0, mmint = 1, prob = 100 },
Damage and DamageParts seem to define the anim args and 3D models that are activated on various system damage (I've also trawled the Scripts\Aircrafts\_Common\Damage.lua file for further clues with no success). Failures seems to show up in mission editor and flight logs in game (though I don't know how to make those failures associated with any code either).

All the aircraft systems are implemented as simple avLuaDevice entries, e.g.
Code:
creators = {}
creators[devices.AVIONICS] = {"avLuaDevice", LockOn_Options.script_path.."Systems/avionics.lua"}
creators[devices.RADARWARN] = {"avLuaDevice", LockOn_Options.script_path.."Systems/radarwarn.lua"}
creators[devices.ENGINE] = {"avLuaDevice", LockOn_Options.script_path.."Systems/engine.lua"}
creators[devices.GUNSIGHT] = {"avLuaDevice", LockOn_Options.script_path.."Systems/gunsight.lua"}
My question is: how can I detect/query damage (or failures) to parts of the aircraft from within those avLuaDevice systems Lua code? I've noticed (from checking key/value pairs of the avLuaDevice object, and looking at DCS dll files) that there is a function named SetDamage, but I'm unsure whether it is a callback (like SetCommand and update) or whether an API meant to be called by our code. I've tried just implementing a SetDamage function with a print_message_to_user, but it never gets triggered (even when the aircraft is just a flying ball of fire after being shot to bits), so it doesn't seem to be a callback (unless something more needs to be done to register the system somehow).

If I can detect or query damage to specific parts of the plane somehow, I can start to emulate damage to the various systems in the code, e.g. have some electrical or hydraulics failures, radar altimeter failures, etc. etc.

Any pointers in the right direction would be greatly appreciated!
gyrovague is offline   Reply With Quote
Old 08-23-2016, 03:16 PM   #2
BR=55=Sevas
Senior Member
 
BR=55=Sevas's Avatar
 
Join Date: Apr 2008
Location: Севастополь
Posts: 1,742
Default

Try to use "get_aircraft_draw_argument" or something like that.
Look for in dcs mod structure thread exact function name.
I suppose it will work, but only when plane part completly gone from model.
Medium values of damage probably impossible get without sdk...
BR=55=Sevas is offline   Reply With Quote
Old 11-03-2016, 03:38 PM   #3
gyrovague
3rd Party Developer
 
gyrovague's Avatar
 
Join Date: Apr 2016
Posts: 125
Default

Some parts of wHumanCustomPhysicsAPI.h maybe give some tiny clues/insight:

Code:
// damages and failures
// void ed_fm_on_planned_failure(const char * ) callback when preplaneed failure triggered from mission 
typedef void (*PFN_ON_PLANNED_FAILURE) (const char *);
If we can get the corresponding Lua callback, then we could get the mission editor failures too. Basically just a callback with a string value (from the Failures entry in the aircraft definition) which the code must interpret as it wants to.

Code:
// void ed_fm_on_damage(int Element, double element_integrity_factor) callback when damage occurs for airframe element 
typedef void (*PFN_ON_DAMAGE) (int Element, double element_integrity_factor);
I initially thought (see my first post above) that SetDamage in the Lua is maybe a callback similar to SetCommand.. it may well still be (like ed_fm_on_damage callback), but perhaps needs to be registered somehow (similar to how one needs to do listen_command prior to getting SetCommand callbacks).

Code:
//inform DCS about internal simulation event, like structure damage , failure , or effect

struct ed_fm_simulation_event 
{
	unsigned     event_type;
	char         event_message[512];    // optional 
	float 		 event_params [16]; // type specific data  , like coordinates , scales etc 
};

// bool ed_fm_pop_simulation_event(ed_fm_simulation_event & out)  called on each sim step 
/*
	ed_fm_simulation_event event;
	while (ed_fm_pop_simulation_event(event))
	{
		do some with event data;
	}
*/
typedef bool (*PFN_FM_POP_SIMULATION_EVENT) (ed_fm_simulation_event & out);
// event type declaration
enum ed_fm_simulation_event_type
{
	ED_FM_EVENT_INVALID = 0,
	ED_FM_EVENT_FAILURE,
	ED_FM_EVENT_STRUCTURE_DAMAGE,
	ED_FM_EVENT_FIRE,
};


Code:
/*
ED_FM_EVENT_FAILURE 

event_message  - failure id , like "autopilot" or "r-engine"
event_params   - not used for failure


ED_FM_EVENT_STRUCTURE_DAMAGE

event_message - not used 
event_params[0]  damage element number like in ed_fm_on_damage 
event_params[1]  integrity factor      like in ed_fm_on_damage 


ED_FM_EVENT_FIRE
event_message - not used , but you can send something like "engine fire" or "left wing tank fire"
event_params[0] fire control handle, index used to control change of effect in time 

event_params[1] 
event_params[2] 
event_params[3]  x , y ,z  coordinates of fire origin in aircraft body space
 
event_params[4] 
event_params[5] 
event_params[6]  x , y ,z  components of orientation of emitter direction

event_params[7]  emitted particles speed 

event_params[8]  scale of fire , if scale will less or equal to zero , fire with this index will be stopped 



*/

There seems to be a listen_event Lua function, which maybe works similar to the listen_command function used for getting all clickable cockpit commands... Perhaps one can then somehow receive events similar to the C API above.
gyrovague is offline   Reply With Quote
Reply

Tags
aircraft, damage, lua, mod, module

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump

All times are GMT. The time now is 06:26 PM. vBulletin Skin by ForumMonkeys. Powered by vBulletin®.
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.