343 lines
16 KiB
Plaintext
343 lines
16 KiB
Plaintext
/**
|
|
* Script principal qui initialise le système de logistique
|
|
*
|
|
* Copyright (C) 2014 Team ~R3F~
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#include "R3F_LOG_ENABLE.h"
|
|
|
|
#ifdef R3F_LOG_enable
|
|
/* DEBUT import config */
|
|
|
|
// Initialise les listes vides avant que le config.sqf les concatène
|
|
R3F_LOG_CFG_can_tow = [];
|
|
R3F_LOG_CFG_can_be_towed = [];
|
|
R3F_LOG_CFG_can_lift = [];
|
|
R3F_LOG_CFG_can_be_lifted = [];
|
|
R3F_LOG_CFG_can_transport_cargo = [];
|
|
R3F_LOG_CFG_can_be_transported_cargo = [];
|
|
R3F_LOG_CFG_can_be_moved_by_player = [];
|
|
|
|
// Initialise les listes vides de config_creation_factory.sqf
|
|
R3F_LOG_CFG_CF_whitelist_full_categories = [];
|
|
R3F_LOG_CFG_CF_whitelist_medium_categories = [];
|
|
R3F_LOG_CFG_CF_whitelist_light_categories = [];
|
|
R3F_LOG_CFG_CF_blacklist_categories = [];
|
|
|
|
#include "config.sqf"
|
|
#include "config_creation_factory.sqf"
|
|
|
|
// Chargement du fichier de langage
|
|
call compile preprocessFile format ["R3F_LOG\%1_strings_lang.sqf", R3F_LOG_CFG_language];
|
|
|
|
/*
|
|
* On inverse l'ordre de toutes les listes de noms de classes pour donner
|
|
* la priorité aux classes spécifiques sur les classes génériques
|
|
*/
|
|
reverse R3F_LOG_CFG_can_tow;
|
|
reverse R3F_LOG_CFG_can_be_towed;
|
|
reverse R3F_LOG_CFG_can_lift;
|
|
reverse R3F_LOG_CFG_can_be_lifted;
|
|
reverse R3F_LOG_CFG_can_transport_cargo;
|
|
reverse R3F_LOG_CFG_can_be_transported_cargo;
|
|
reverse R3F_LOG_CFG_can_be_moved_by_player;
|
|
|
|
// On passe tous les noms de classes en minuscules
|
|
{R3F_LOG_CFG_can_tow set [_forEachIndex, toLower _x];} forEach R3F_LOG_CFG_can_tow;
|
|
{R3F_LOG_CFG_can_be_towed set [_forEachIndex, toLower _x];} forEach R3F_LOG_CFG_can_be_towed;
|
|
{R3F_LOG_CFG_can_lift set [_forEachIndex, toLower _x];} forEach R3F_LOG_CFG_can_lift;
|
|
{R3F_LOG_CFG_can_be_lifted set [_forEachIndex, toLower _x];} forEach R3F_LOG_CFG_can_be_lifted;
|
|
{R3F_LOG_CFG_can_transport_cargo select _forEachIndex set [0, toLower (_x select 0)];} forEach R3F_LOG_CFG_can_transport_cargo;
|
|
{R3F_LOG_CFG_can_be_transported_cargo select _forEachIndex set [0, toLower (_x select 0)];} forEach R3F_LOG_CFG_can_be_transported_cargo;
|
|
{R3F_LOG_CFG_can_be_moved_by_player set [_forEachIndex, toLower _x];} forEach R3F_LOG_CFG_can_be_moved_by_player;
|
|
|
|
// On construit la liste des classes des transporteurs dans les quantités associées (pour les nearestObjects, count isKindOf, ...)
|
|
R3F_LOG_classes_transporteurs = [];
|
|
{
|
|
R3F_LOG_classes_transporteurs pushBack (_x select 0);
|
|
} forEach R3F_LOG_CFG_can_transport_cargo;
|
|
|
|
// On construit la liste des classes des transportables dans les quantités associées (pour les nearestObjects, count isKindOf, ...)
|
|
R3F_LOG_classes_objets_transportables = [];
|
|
{
|
|
R3F_LOG_classes_objets_transportables pushBack (_x select 0);
|
|
} forEach R3F_LOG_CFG_can_be_transported_cargo;
|
|
|
|
// Union des tableaux de types d'objets servant dans un isKindOf
|
|
R3F_LOG_objets_depl_heli_remorq_transp = [];
|
|
{
|
|
if !(_x in R3F_LOG_objets_depl_heli_remorq_transp) then
|
|
{
|
|
R3F_LOG_objets_depl_heli_remorq_transp pushBack _x;
|
|
};
|
|
} forEach (R3F_LOG_CFG_can_be_moved_by_player + R3F_LOG_CFG_can_be_lifted + R3F_LOG_CFG_can_be_towed + R3F_LOG_classes_objets_transportables);
|
|
|
|
// Gestion compatibilité fichier de config 3.0 => 3.1 (définition de valeurs par défaut)
|
|
if (isNil "R3F_LOG_CFG_lock_objects_mode") then {R3F_LOG_CFG_lock_objects_mode = "side";};
|
|
if (isNil "R3F_LOG_CFG_unlock_objects_timer") then {R3F_LOG_CFG_unlock_objects_timer = 30;};
|
|
if (isNil "R3F_LOG_CFG_CF_sell_back_bargain_rate") then {R3F_LOG_CFG_CF_sell_back_bargain_rate = 0.75;};
|
|
if (isNil "R3F_LOG_CFG_CF_creation_cost_factor") then {R3F_LOG_CFG_CF_creation_cost_factor = [];};
|
|
|
|
/* FIN import config */
|
|
|
|
if (isServer) then
|
|
{
|
|
// On crée le point d'attache qui servira aux attachTo pour les objets à charger virtuellement dans les véhicules
|
|
R3F_LOG_PUBVAR_point_attache = "Land_HelipadEmpty_F" createVehicle [0,0,0];
|
|
R3F_LOG_PUBVAR_point_attache setPosASL [0,0,0];
|
|
R3F_LOG_PUBVAR_point_attache setVectorDirAndUp [[0,1,0], [0,0,1]];
|
|
|
|
// Partage du point d'attache avec tous les joueurs
|
|
publicVariable "R3F_LOG_PUBVAR_point_attache";
|
|
|
|
/** Liste des objets à ne pas perdre dans un vehicule/cargo détruit */
|
|
R3F_LOG_liste_objets_a_proteger = [];
|
|
|
|
/* Protège les objets présents dans R3F_LOG_liste_objets_a_proteger */
|
|
execVM "R3F_LOG\surveiller_objets_a_proteger.sqf";
|
|
};
|
|
|
|
/**
|
|
* Suite à une PVEH, exécute une commande en fonction de la localité de l'argument
|
|
* @param 0 l'argument sur lequel exécuter la commande
|
|
* @param 1 la commande à exécuter (chaîne de caractères)
|
|
* @param 2 les éventuels paramètres de la commande (optionnel)
|
|
* @note il faut passer par la fonction R3F_LOG_FNCT_exec_commande_MP
|
|
*/
|
|
R3F_LOG_FNCT_PVEH_commande_MP =
|
|
{
|
|
private ["_argument", "_commande", "_parametre"];
|
|
_argument = _this select 1 select 0;
|
|
_commande = _this select 1 select 1;
|
|
_parametre = if (count (_this select 1) == 3) then {_this select 1 select 2} else {0};
|
|
|
|
// Commandes à argument global et effet local
|
|
switch (_commande) do
|
|
{
|
|
// Aucune pour l'instant
|
|
// ex : case "switchMove": {_argument switchMove _parametre;};
|
|
};
|
|
|
|
// Commandes à argument local et effet global
|
|
if (local _argument) then
|
|
{
|
|
switch (_commande) do
|
|
{
|
|
case "setDir": {_argument setDir _parametre;};
|
|
case "setVelocity": {_argument setVelocity _parametre;};
|
|
case "detachSetVelocity": {detach _argument; _argument setVelocity _parametre;};
|
|
};
|
|
};
|
|
|
|
// Commandes à faire uniquement sur le serveur
|
|
if (isServer) then
|
|
{
|
|
if (_commande == "setOwnerTo") then
|
|
{
|
|
_argument setOwner (owner _parametre);
|
|
};
|
|
};
|
|
};
|
|
"R3F_LOG_PV_commande_MP" addPublicVariableEventHandler R3F_LOG_FNCT_PVEH_commande_MP;
|
|
|
|
/**
|
|
* Ordonne l'exécution d'une commande quelque soit la localité de l'argument ou de l'effet
|
|
* @param 0 l'argument sur lequel exécuter la commande
|
|
* @param 1 la commande à exécuter (chaîne de caractères)
|
|
* @param 2 les éventuels paramètres de la commande (optionnel)
|
|
* @usage [_objet, "setDir", 160] call R3F_LOG_FNCT_exec_commande_MP
|
|
*/
|
|
R3F_LOG_FNCT_exec_commande_MP =
|
|
{
|
|
R3F_LOG_PV_commande_MP = _this;
|
|
publicVariable "R3F_LOG_PV_commande_MP";
|
|
["R3F_LOG_PV_commande_MP", R3F_LOG_PV_commande_MP] spawn R3F_LOG_FNCT_PVEH_commande_MP;
|
|
};
|
|
|
|
/** Pseudo-mutex permettant de n'exécuter qu'un script de manipulation d'objet à la fois (true : vérouillé) */
|
|
R3F_LOG_mutex_local_verrou = false;
|
|
|
|
call compile preprocessFile "R3F_LOG\fonctions_generales\lib_geometrie_3D.sqf";
|
|
|
|
// Indices du tableau des fonctionnalités retourné par R3F_LOG_FNCT_determiner_fonctionnalites_logistique
|
|
R3F_LOG_IDX_can_be_depl_heli_remorq_transp = 0;
|
|
R3F_LOG_IDX_can_be_moved_by_player = 1;
|
|
R3F_LOG_IDX_can_lift = 2;
|
|
R3F_LOG_IDX_can_be_lifted = 3;
|
|
R3F_LOG_IDX_can_tow = 4;
|
|
R3F_LOG_IDX_can_be_towed = 5;
|
|
R3F_LOG_IDX_can_transport_cargo = 6;
|
|
R3F_LOG_IDX_can_transport_cargo_cout = 7;
|
|
R3F_LOG_IDX_can_be_transported_cargo = 8;
|
|
R3F_LOG_IDX_can_be_transported_cargo_cout = 9;
|
|
R3F_LOG_CST_zero_log = [false, false, false, false, false, false, false, 0, false, 0];
|
|
|
|
R3F_LOG_FNCT_determiner_fonctionnalites_logistique = compile preprocessFile "R3F_LOG\fonctions_generales\determiner_fonctionnalites_logistique.sqf";
|
|
|
|
R3F_LOG_FNCT_calculer_chargement_vehicule = compile preprocessFile "R3F_LOG\transporteur\calculer_chargement_vehicule.sqf";
|
|
R3F_LOG_FNCT_transporteur_charger_auto = compile preprocessFile "R3F_LOG\transporteur\charger_auto.sqf";
|
|
|
|
// Un serveur dédié n'en a pas besoin
|
|
if !(isDedicated) then
|
|
{
|
|
// Le client attend que le serveur ai créé et publié la référence de l'objet servant de point d'attache
|
|
waitUntil {!isNil "R3F_LOG_PUBVAR_point_attache"};
|
|
|
|
/** Indique quel objet le joueur est en train de déplacer, objNull si aucun */
|
|
R3F_LOG_joueur_deplace_objet = objNull;
|
|
|
|
/** Objet actuellement sélectionner pour être chargé/remorqué */
|
|
R3F_LOG_objet_selectionne = objNull;
|
|
|
|
/** Tableau contenant toutes les usines créées */
|
|
R3F_LOG_CF_liste_usines = [];
|
|
|
|
call compile preprocessFile "R3F_LOG\fonctions_generales\lib_visualisation_objet.sqf";
|
|
|
|
R3F_LOG_FNCT_objet_relacher = compile preprocessFile "R3F_LOG\objet_deplacable\relacher.sqf";
|
|
R3F_LOG_FNCT_objet_deplacer = compile preprocessFile "R3F_LOG\objet_deplacable\deplacer.sqf";
|
|
|
|
R3F_LOG_FNCT_heliporteur_heliporter = compile preprocessFile "R3F_LOG\heliporteur\heliporter.sqf";
|
|
R3F_LOG_FNCT_heliporteur_larguer = compile preprocessFile "R3F_LOG\heliporteur\larguer.sqf";
|
|
R3F_LOG_FNCT_heliporteur_init = compile preprocessFile "R3F_LOG\heliporteur\heliporteur_init.sqf";
|
|
|
|
R3F_LOG_FNCT_remorqueur_detacher = compile preprocessFile "R3F_LOG\remorqueur\detacher.sqf";
|
|
R3F_LOG_FNCT_remorqueur_remorquer_deplace = compile preprocessFile "R3F_LOG\remorqueur\remorquer_deplace.sqf";
|
|
R3F_LOG_FNCT_remorqueur_remorquer_direct = compile preprocessFile "R3F_LOG\remorqueur\remorquer_direct.sqf";
|
|
R3F_LOG_FNCT_remorqueur_init = compile preprocessFile "R3F_LOG\remorqueur\remorqueur_init.sqf";
|
|
|
|
R3F_LOG_FNCT_transporteur_charger_deplace = compile preprocessFile "R3F_LOG\transporteur\charger_deplace.sqf";
|
|
R3F_LOG_FNCT_transporteur_charger_selection = compile preprocessFile "R3F_LOG\transporteur\charger_selection.sqf";
|
|
R3F_LOG_FNCT_transporteur_decharger = compile preprocessFile "R3F_LOG\transporteur\decharger.sqf";
|
|
R3F_LOG_FNCT_transporteur_selectionner_objet = compile preprocessFile "R3F_LOG\transporteur\selectionner_objet.sqf";
|
|
R3F_LOG_FNCT_transporteur_voir_contenu_vehicule = compile preprocessFile "R3F_LOG\transporteur\voir_contenu_vehicule.sqf";
|
|
R3F_LOG_FNCT_transporteur_init = compile preprocessFile "R3F_LOG\transporteur\transporteur_init.sqf";
|
|
|
|
R3F_LOG_FNCT_usine_remplir_liste_objets = compile preprocessFile "R3F_LOG\usine_creation\remplir_liste_objets.sqf";
|
|
R3F_LOG_FNCT_usine_creer_objet = compile preprocessFile "R3F_LOG\usine_creation\creer_objet.sqf";
|
|
R3F_LOG_FNCT_usine_ouvrir_usine = compile preprocessFile "R3F_LOG\usine_creation\ouvrir_usine.sqf";
|
|
R3F_LOG_FNCT_usine_init = compile preprocessFile "R3F_LOG\usine_creation\usine_init.sqf";
|
|
R3F_LOG_FNCT_usine_revendre_deplace = compile preprocessFile "R3F_LOG\usine_creation\revendre_deplace.sqf";
|
|
R3F_LOG_FNCT_usine_revendre_selection = compile preprocessFile "R3F_LOG\usine_creation\revendre_selection.sqf";
|
|
R3F_LOG_FNCT_usine_revendre_direct = compile preprocessFile "R3F_LOG\usine_creation\revendre_direct.sqf";
|
|
R3F_LOG_FNCT_recuperer_liste_cfgVehicles_par_categories = compile preprocessFile "R3F_LOG\usine_creation\recuperer_liste_cfgVehicles_par_categories.sqf";
|
|
R3F_LOG_FNCT_determiner_cout_creation = compile preprocessFile "R3F_LOG\usine_creation\determiner_cout_creation.sqf";
|
|
|
|
R3F_LOG_FNCT_objet_init = compile preprocessFile "R3F_LOG\objet_commun\objet_init.sqf";
|
|
R3F_LOG_FNCT_objet_est_verrouille = compile preprocessFile "R3F_LOG\objet_commun\objet_est_verrouille.sqf";
|
|
R3F_LOG_FNCT_deverrouiller_objet = compile preprocessFile "R3F_LOG\objet_commun\deverrouiller_objet.sqf";
|
|
R3F_LOG_FNCT_definir_proprietaire_verrou = compile preprocessFile "R3F_LOG\objet_commun\definir_proprietaire_verrou.sqf";
|
|
|
|
R3F_LOG_FNCT_formater_fonctionnalites_logistique = compile preprocessFile "R3F_LOG\fonctions_generales\formater_fonctionnalites_logistique.sqf";
|
|
R3F_LOG_FNCT_formater_nombre_entier_milliers = compile preprocessFile "R3F_LOG\fonctions_generales\formater_nombre_entier_milliers.sqf";
|
|
|
|
// Liste des variables activant ou non les actions de menu
|
|
R3F_LOG_action_charger_deplace_valide = false;
|
|
R3F_LOG_action_charger_selection_valide = false;
|
|
R3F_LOG_action_contenu_vehicule_valide = false;
|
|
|
|
R3F_LOG_action_remorquer_deplace_valide = false;
|
|
|
|
R3F_LOG_action_heliporter_valide = false;
|
|
R3F_LOG_action_heliport_larguer_valide = false;
|
|
|
|
R3F_LOG_action_deplacer_objet_valide = false;
|
|
R3F_LOG_action_remorquer_direct_valide = false;
|
|
R3F_LOG_action_detacher_valide = false;
|
|
R3F_LOG_action_selectionner_objet_charge_valide = false;
|
|
|
|
R3F_LOG_action_ouvrir_usine_valide = false;
|
|
R3F_LOG_action_revendre_usine_direct_valide = false;
|
|
R3F_LOG_action_revendre_usine_deplace_valide = false;
|
|
R3F_LOG_action_revendre_usine_selection_valide = false;
|
|
|
|
R3F_LOG_action_deverrouiller_valide = false;
|
|
|
|
/** Sur ordre (publicVariable), révéler la présence d'un objet au joueur (accélérer le retour des addActions) */
|
|
R3F_LOG_FNCT_PUBVAR_reveler_au_joueur =
|
|
{
|
|
private ["_objet"];
|
|
_objet = _this select 1;
|
|
|
|
if (alive player) then
|
|
{
|
|
player reveal _objet;
|
|
};
|
|
};
|
|
"R3F_LOG_PUBVAR_reveler_au_joueur" addPublicVariableEventHandler R3F_LOG_FNCT_PUBVAR_reveler_au_joueur;
|
|
|
|
/** Event handler GetIn : ne pas monter dans un véhicule qui est en cours de transport */
|
|
R3F_LOG_FNCT_EH_GetIn =
|
|
{
|
|
if (local (_this select 2)) then
|
|
{
|
|
_this spawn
|
|
{
|
|
sleep 0.1;
|
|
if ((!(isNull (_this select 0 getVariable "R3F_LOG_est_deplace_par")) && (alive (_this select 0 getVariable "R3F_LOG_est_deplace_par")) && (isPlayer (_this select 0 getVariable "R3F_LOG_est_deplace_par"))) || !(isNull (_this select 0 getVariable "R3F_LOG_est_transporte_par"))) then
|
|
{
|
|
(_this select 2) action ["GetOut", _this select 0];
|
|
(_this select 2) action ["Eject", _this select 0];
|
|
if (player == _this select 2) then {hintC format [STR_R3F_LOG_objet_en_cours_transport, getText (configFile >> "CfgVehicles" >> (typeOf (_this select 0)) >> "displayName")];};
|
|
};
|
|
};
|
|
};
|
|
};
|
|
|
|
// Actions à faire quand le joueur est apparu
|
|
0 spawn
|
|
{
|
|
waitUntil {!isNull player};
|
|
|
|
// Ajout d'un event handler "WeaponDisassembled" pour gérer le cas où une arme est démontée alors qu'elle est en cours de transport
|
|
player addEventHandler ["WeaponDisassembled",
|
|
{
|
|
private ["_objet"];
|
|
|
|
// Récupération de l'arme démontée avec cursorTarget au lieu de _this (http://feedback.arma3.com/view.php?id=18090)
|
|
_objet = cursorTarget;
|
|
|
|
if (!isNull _objet && {!isNull (_objet getVariable ["R3F_LOG_est_deplace_par", objNull])}) then
|
|
{
|
|
_objet setVariable ["R3F_LOG_est_deplace_par", objNull, true];
|
|
};
|
|
}];
|
|
};
|
|
|
|
/** Variable publique passer à true pour informer le script surveiller_nouveaux_objets.sqf de la création d'un objet */
|
|
R3F_LOG_PUBVAR_nouvel_objet_a_initialiser = false;
|
|
|
|
/* Vérification permanente des conditions donnant accès aux addAction */
|
|
execVM "R3F_LOG\surveiller_conditions_actions_menu.sqf";
|
|
|
|
/* Auto-détection permanente des objets sur le jeu */
|
|
execVM "R3F_LOG\surveiller_nouveaux_objets.sqf";
|
|
|
|
/*
|
|
* Système assurant la protection contre les blessures lors du déplacement d'objets
|
|
* On choisit de ne pas faire tourner le système sur un serveur dédié par économie de ressources.
|
|
* Seuls les joueurs et les IA commandées par les joueurs (locales) seront protégés.
|
|
* Les IA n'étant pas commandées par un joueur ne seront pas protégées, ce qui est un moindre mal.
|
|
*/
|
|
execVM "R3F_LOG\systeme_protection_blessures.sqf";
|
|
};
|
|
|
|
R3F_LOG_active = true;
|
|
#else
|
|
// Pour les actions du PC d'arti
|
|
R3F_LOG_joueur_deplace_objet = objNull;
|
|
R3F_LOG_active = false;
|
|
#endif |