R3F_Logistics/R3F_LOG/transporteur/decharger.sqf
2018-02-18 22:40:31 -07:00

142 lines
5.3 KiB
Plaintext

/**
* Décharger un objet d'un transporteur - appelé deuis l'interface listant le contenu du transporteur
*
* Copyright (C) 2014 Team ~R3F~
*
* This program is free software under the terms of the GNU General Public License version 3.
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
if (R3F_LOG_mutex_local_verrou) then
{
hintC STR_R3F_LOG_mutex_action_en_cours;
}
else
{
R3F_LOG_mutex_local_verrou = true;
#include "dlg_constantes.h"
private ["_transporteur", "_objets_charges", "_type_objet_a_decharger", "_objet_a_decharger", "_action_confirmee", "_est_deplacable"];
_transporteur = uiNamespace getVariable "R3F_LOG_dlg_CV_transporteur";
_objets_charges = _transporteur getVariable ["R3F_LOG_objets_charges", []];
if (lbCurSel R3F_LOG_IDC_dlg_CV_liste_contenu == -1) exitWith {R3F_LOG_mutex_local_verrou = false;};
_type_objet_a_decharger = lbData [R3F_LOG_IDC_dlg_CV_liste_contenu, lbCurSel R3F_LOG_IDC_dlg_CV_liste_contenu];
_est_deplacable = ([_type_objet_a_decharger] call R3F_LOG_FNCT_determiner_fonctionnalites_logistique) select R3F_LOG_IDX_can_be_moved_by_player;
if (!(_type_objet_a_decharger isKindOf "AllVehicles") && !_est_deplacable) then
{
_action_confirmee = [STR_R3F_LOG_action_decharger_deplacable_exceptionnel, "Warning", true, true] call BIS_fnc_GUImessage;
}
else
{
_action_confirmee = true;
};
if (_action_confirmee) then
{
closeDialog 0;
// Recherche d'un objet du type demandé
_objet_a_decharger = objNull;
{
if (typeOf _x == _type_objet_a_decharger) exitWith
{
_objet_a_decharger = _x;
};
} forEach _objets_charges;
if !(isNull _objet_a_decharger) then
{
[_objet_a_decharger, player] call R3F_LOG_FNCT_definir_proprietaire_verrou;
// On mémorise sur le réseau le nouveau contenu du transporteur (càd avec cet objet en moins)
_objets_charges = _transporteur getVariable ["R3F_LOG_objets_charges", []];
_objets_charges = _objets_charges - [_objet_a_decharger];
_transporteur setVariable ["R3F_LOG_objets_charges", _objets_charges, true];
_objet_a_decharger setVariable ["R3F_LOG_est_transporte_par", objNull, true];
// Prise en compte de l'objet dans l'environnement du joueur (accélérer le retour des addActions)
_objet_a_decharger spawn
{
sleep 4;
R3F_LOG_PUBVAR_reveler_au_joueur = _this;
publicVariable "R3F_LOG_PUBVAR_reveler_au_joueur";
["R3F_LOG_PUBVAR_reveler_au_joueur", R3F_LOG_PUBVAR_reveler_au_joueur] spawn R3F_LOG_FNCT_PUBVAR_reveler_au_joueur;
};
if (!(_objet_a_decharger isKindOf "AllVehicles") || _est_deplacable) then
{
R3F_LOG_mutex_local_verrou = false;
[_objet_a_decharger, player, 0, true] spawn R3F_LOG_FNCT_objet_deplacer;
}
else
{
private ["_bbox_dim", "_pos_degagee", "_rayon"];
systemChat STR_R3F_LOG_action_decharger_en_cours;
_bbox_dim = (vectorMagnitude (boundingBoxReal _objet_a_decharger select 0)) max (vectorMagnitude (boundingBoxReal _objet_a_decharger select 1));
sleep 1;
// Recherche d'une position dégagée (on augmente progressivement le rayon jusqu'à trouver une position)
for [{_rayon = 5 max (2*_bbox_dim); _pos_degagee = [];}, {count _pos_degagee == 0 && _rayon <= 30 + (8*_bbox_dim)}, {_rayon = _rayon + 10 + (2*_bbox_dim)}] do
{
_pos_degagee = [
_bbox_dim,
_transporteur modelToWorld [0, if (_transporteur isKindOf "AllVehicles") then {(boundingBoxReal _transporteur select 0 select 1) - 2 - 0.3*_rayon} else {0}, 0],
_rayon,
100 min (5 + _rayon^1.2)
] call R3F_LOG_FNCT_3D_tirer_position_degagee_sol;
};
if (count _pos_degagee > 0) then
{
detach _objet_a_decharger;
_objet_a_decharger setPos _pos_degagee;
_objet_a_decharger setVectorDirAndUp [[-cos getDir _transporteur, sin getDir _transporteur, 0] vectorCrossProduct surfaceNormal _pos_degagee, surfaceNormal _pos_degagee];
_objet_a_decharger setVelocity [0, 0, 0];
sleep 0.4; // Car la nouvelle position n'est pas prise en compte instantannément
// Si l'objet a été créé assez loin, on indique sa position relative
if (_objet_a_decharger distance _transporteur > 40) then
{
systemChat format [STR_R3F_LOG_action_decharger_fait + " (%2)",
getText (configFile >> "CfgVehicles" >> (typeOf _objet_a_decharger) >> "displayName"),
format ["%1m %2deg", round (_objet_a_decharger distance _transporteur), round ([_transporteur, _objet_a_decharger] call BIS_fnc_dirTo)]
];
}
else
{
systemChat format [STR_R3F_LOG_action_decharger_fait, getText (configFile >> "CfgVehicles" >> (typeOf _objet_a_decharger) >> "displayName")];
};
R3F_LOG_mutex_local_verrou = false;
}
// Si échec recherche position dégagée, on décharge l'objet comme un déplaçable
else
{
systemChat "WARNING : no free position found.";
R3F_LOG_mutex_local_verrou = false;
[_objet_a_decharger, player, 0, true] spawn R3F_LOG_FNCT_objet_deplacer;
};
};
}
else
{
hintC STR_R3F_LOG_action_decharger_deja_fait;
R3F_LOG_mutex_local_verrou = false;
};
}
else
{
R3F_LOG_mutex_local_verrou = false;
};
};