Files
Samuele Lorefice 9e023649ac initial files
2025-05-24 16:17:33 +02:00

209 lines
7.4 KiB
Plaintext

/*
File: fn_getSaveData.sqf
Author: KP Liberation Dev Team - https://github.com/KillahPotatoes
Date: 2020-03-29
Last Update: 2020-08-25
License: MIT License - http://www.opensource.org/licenses/MIT
Description:
Gather current session data for saving.
Parameter(s):
NONE
Returns:
Save data [ARRAY]
*/
private _objectsToSave = [];
private _resourceStorages = [];
private _aiGroups = [];
private _allObjects = [];
private _allStorages = [];
private _allMines = [];
private _allCrates = [];
// Get all blufor groups
private _allBlueGroups = allGroups select {
(side _x == GRLIB_side_friendly) && // Only blufor groups
{isNull objectParent (leader _x)} && // Make sure it's an infantry group
{!(((units _x) select {alive _x}) isEqualTo [])} // At least one unit has to be alive
};
// Fetch all objects and AI groups near each FOB
private ["_fobPos", "_fobObjects", "_grpUnits", "_fobMines"];
{
_fobPos = _x;
_fobObjects = (_fobPos nearObjects (GRLIB_fob_range * 1.2)) select {
((toLower (typeof _x)) in KPLIB_classnamesToSave) && // Exclude classnames which are not in the presets
{alive _x} && // Exclude dead or broken objects
{getObjectType _x >= 8} && // Exclude preplaced terrain objects
{speed _x < 5} && // Exclude moving objects (like civilians driving through)
{isNull attachedTo _x} && // Exclude attachTo'd objects
{((getpos _x) select 2) < 10} && // Exclude hovering helicopters and the like
{!(_x getVariable ["KP_liberation_edenObject", false])} && // Exclude all objects placed via editor in mission.sqm
{!(_x getVariable ["KP_liberation_preplaced", false])} && // Exclude preplaced (e.g. little birds from carrier)
{!((toLower (typeOf _x)) in KPLIB_crates)} // Exclude storage crates (those are handled separately)
};
_allObjects = _allObjects + (_fobObjects select {!((toLower (typeOf _x)) in KPLIB_storageBuildings)});
_allStorages = _allStorages + (_fobObjects select {(_x getVariable ["KP_liberation_storage_type",-1]) == 0});
// Process all groups near this FOB
{
// Get only living AI units of the group by excluding possible POWs currently in the player group
_grpUnits = (units _x) select {!(isPlayer _x) && (alive _x) && !((typeOf _x) in KPLIB_o_inf_classes) && !((typeOf _x) in militia_squad)};
// Add to save array
_aiGroups pushBack [getPosATL (leader _x), (_grpUnits apply {typeOf _x})];
} forEach (_allBlueGroups select {(_fobPos distance2D (leader _x)) < (GRLIB_fob_range * 1.2)});
// Save all mines around FOB
_fobMines = allMines inAreaArray [_fobPos, GRLIB_fob_range * 1.2, GRLIB_fob_range * 1.2];
_allMines append (_fobMines apply {[
getPosWorld _x,
[vectorDirVisual _x, vectorUpVisual _x],
typeOf _x,
_x mineDetectedBy GRLIB_side_friendly
]});
} forEach GRLIB_all_fobs;
// Save all fetched objects
private ["_savedPos", "_savedVecDir", "_savedVecUp", "_class", "_hasCrew"];
{
// Position data
_savedPos = getPosWorld _x;
_savedVecDir = vectorDirVisual _x;
_savedVecUp = vectorUpVisual _x;
_class = typeOf _x;
_hasCrew = false;
// Determine if vehicle is crewed
if ((toLower _class) in KPLIB_b_allVeh_classes) then {
if (({!isPlayer _x} count (crew _x) ) > 0) then {
_hasCrew = true;
};
};
// Only save player side, seized or captured objects
if (
(!(_class in civilian_vehicles) || {_x getVariable ["KPLIB_seized", false]}) &&
(!((toLower _class) in KPLIB_o_allVeh_classes) || {_x getVariable ["KPLIB_captured", false]})
) then {
_objectsToSave pushBack [_class, _savedPos, _savedVecDir, _savedVecUp, _hasCrew];
};
} forEach _allObjects;
// Save all storages and resources
private ["_supplyValue", "_ammoValue", "_fuelValue"];
{
// Position data
_savedPos = getPosWorld _x;
_savedVecDir = vectorDirVisual _x;
_savedVecUp = vectorUpVisual _x;
_class = typeOf _x;
// Resource variables
_supplyValue = 0;
_ammoValue = 0;
_fuelValue = 0;
// Sum all stored resources of current storage
{
switch ((typeOf _x)) do {
case KP_liberation_supply_crate: {_supplyValue = _supplyValue + (_x getVariable ["KP_liberation_crate_value",0]);};
case KP_liberation_ammo_crate: {_ammoValue = _ammoValue + (_x getVariable ["KP_liberation_crate_value",0]);};
case KP_liberation_fuel_crate: {_fuelValue = _fuelValue + (_x getVariable ["KP_liberation_crate_value",0]);};
default {[format ["Invalid object (%1) at storage area", (typeOf _x)], "ERROR"] call KPLIB_fnc_log;};
};
} forEach (attachedObjects _x);
// Add to saving with corresponding resource values
_resourceStorages pushBack [_class, _savedPos, _savedVecDir, _savedVecUp, _supplyValue, _ammoValue, _fuelValue];
} forEach _allStorages;
// Save crates at blufor sectors which spawn crates on activation
{
_allCrates append (
((nearestObjects [markerPos _x, KPLIB_crates, GRLIB_capture_size]) select {isNull attachedTo _x}) apply {
[typeOf _x, _x getVariable ["KP_liberation_crate_value", 0], getPosATL _x]
}
);
} forEach (blufor_sectors select {_x in sectors_factory || _x in sectors_capture});
// Pack all stats in one array
private _stats = [
stats_ammo_produced,
stats_ammo_spent,
stats_blufor_soldiers_killed,
stats_blufor_soldiers_recruited,
stats_blufor_teamkills,
stats_blufor_vehicles_built,
stats_blufor_vehicles_killed,
stats_civilian_buildings_destroyed,
stats_civilian_vehicles_killed,
stats_civilian_vehicles_killed_by_players,
stats_civilian_vehicles_seized,
stats_civilians_healed,
stats_civilians_killed,
stats_civilians_killed_by_players,
stats_fobs_built,
stats_fobs_lost,
stats_fuel_produced,
stats_fuel_spent,
stats_hostile_battlegroups,
stats_ieds_detonated,
stats_opfor_killed_by_players,
stats_opfor_soldiers_killed,
stats_opfor_vehicles_killed,
stats_opfor_vehicles_killed_by_players,
stats_player_deaths,
stats_playtime,
stats_prisoners_captured,
stats_readiness_earned,
stats_reinforcements_called,
stats_resistance_killed,
stats_resistance_teamkills,
stats_resistance_teamkills_by_players,
stats_secondary_objectives,
stats_sectors_liberated,
stats_sectors_lost,
stats_spartan_respawns,
stats_supplies_produced,
stats_supplies_spent,
stats_vehicles_recycled
];
// Pack the weights in one array
private _weights = [
infantry_weight,
armor_weight,
air_weight
];
// Pack the save data in the save array
[
kp_liberation_version,
date,
_objectsToSave,
_resourceStorages,
_stats,
_weights,
_aiGroups,
blufor_sectors,
combat_readiness,
GRLIB_all_fobs,
GRLIB_permissions,
GRLIB_vehicle_to_military_base_links,
KP_liberation_civ_rep,
KP_liberation_clearances,
KP_liberation_guerilla_strength,
KP_liberation_logistics,
KP_liberation_production,
KP_liberation_production_markers,
resources_intel,
_allMines,
_allCrates,
KPLIB_sectorTowers
] // return