/** * 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 . */ #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