Script de réparations véhicules par ingénieur

Pour les Masochistes Éditeurs de missions
Répondre
Avatar du membre
=[TTK]= Yourry
Grand Scriptou
Grand Scriptou
Âge : 36
Messages : 1634
Enregistré le : mer. 17 mars 2010, 16:39
Localisation : Dans le reblochon !

Script de réparations véhicules par ingénieur

Message par =[TTK]= Yourry »

Voici un truc qui peut être utile à d'autre:


Les scripts sont issus des missions "Dominations" de Xeno.
J'ai donc pas écrit entièrement les scripts. L'auteur d'origine est Xeno.

L'ensemble des scripts permet au joueur de réparer et remettre de l'essence dans un véhicule (air+terre). En fonction des dégâts la réparation est plus ou moins longue. Le joueurs peut "analyser" le véhicule pour connaitre les dégâts de celui-ci et estimé le temps de réparation nécessaire.
Durant les réparations, il peut annuler l'action si besoin.

Par défaut (tel que sont les scripts ci-dessous) tout le monde peut exécuter le script.
=> Si l'on souhaite limité l'utilisation il faut éditer le script "mecano.sqf" à l'endroit indiqué.


Pour la pratique:

A mettre dans l'init:
"init.sqf"

Code : Tout sélectionner

//Pour le script de réparation:
    x_sfunc = compile (preprocessFileLineNumbers "liste_vehicule.sqf");
//Script pour la réparation des véhicules par les pilotes:
    execVM"scripts\mecano\mecano.sqf"    
 

Les scripts sont a copier et renommer dans le dossier de votre mission:

"liste_vehicule.sqf"

Code : Tout sélectionner

//Fait par =[TTK]= Yourry
/*
Script réecrit sur la base des scripts des missions "domination"
Auteur d'origine: Xeno
*/

//Fonction qui permet de définir le type de véhicule
    x_sfunc = {
        private ["_objs"];
        if ((vehicle player) == player)then{_objs = nearestObjects [player,["LandVehicle","Air"],5];if (count _objs > 0) then {d_objectID2 = _objs select 0;if (alive d_objectID2) then {if(damage d_objectID2 > 0.05 || fuel d_objectID2<1)then{true}else{false}}else{false}}}else{false};
    }; 

"mecano.sqf":

Code : Tout sélectionner

//Fait par =[TTK]= Yourry
/*
Script réecrit sur la base des scripts des missions "domination"
Auteur d'origine: Xeno

Pour info sur les typeOf

*/

//Cette faculté de réparation n'est possible que pour: "USMC_Soldier" si les "//" sont enlevés devant le "if" et "};"
//On peut donc changer en fonction des personnages


//if( player isKindOf "USMC_Soldier") then {      /*si on enlève les deux "//" on active notre "if" et bien penser à enlever ceux d'en bas aussi alors*/ 
    //Déclencheur qui ajoute l'action au joueurs
    _trigger = createTrigger["EmptyDetector" ,position player];
    _trigger setTriggerArea [0, 0, 0, true];
    _trigger setTriggerActivation ["NONE", "PRESENT", true];
    _trigger setTriggerStatements["call x_sfunc", "actionID6 = player addAction [""<t color='#FFD800'>Analyser le véhicule</t>"", 'scripts\mecano\analyses.sqf',[],-1,false];actionID2 = player addAction [""<t color='#FF1000'>Reparer/Essence</t>"", 'scripts\mecano\reparations.sqf',[],-1,false]", "player removeAction actionID6;player removeAction actionID2"];
//};  /*si on enlève les deux "//" on active notre "if" 
 
"reparations.sqf"

Code : Tout sélectionner

// by Xeno
//Réecrit par =[TTK]= Yourry
private ["_aid","_caller","_coef","_damage","_damage_ok","_damage_val","_fuel","_fuel_ok","_fuel_val","_rep_count","_breaked_out","_rep_action","_type_name"];

_caller = _this select 1;
_aid = _this select 2;

//Fonction
    XfGetDisplayName = {
        private ["_obj_name", "_obj_kind", "_cfg"];
        _obj_name = _this select 0;_obj_kind = _this select 1;
        _cfg = switch (_obj_kind) do {case 0: {"CfgVehicles"};case 1: {"CfgWeapons"};case 2: {"CfgMagazines"};};
        getText (configFile >> _cfg >> _obj_name >> "displayName")
    };

    XfGlobalChat = {x_global_chat_logic globalChat _this};

//Supprime l'action
    _caller removeAction _aid;
//On s'assure qu on est bien local    
    if (!(local _caller)) exitWith {};

//Coefficients    
    _rep_count = switch (true) do {
        case (d_objectID2 isKindOf "Air"): {0.1};
        case (d_objectID2 isKindOf "Tank"): {0.2};
        default {0.3};
    };

//Définition des variables    
    _fuel = fuel d_objectID2;
    _damage = damage d_objectID2;
    _damage_val = (_damage / _rep_count);
    _fuel_val = ((1 - _fuel) / _rep_count);
    _coef = switch (true) do {
        case (_fuel_val > _damage_val): {_fuel_val};
        default {_damage_val};
    };
    _coef = ceil _coef;
    _coef_x2 = _coef *2;

//Indications
    hintSilent format ["Véhicule status:\n---------------------\nFuel: %1\nDamage: %2",_fuel, _damage];
    _type_name = [typeOf (d_objectID2),0] call XfGetDisplayName;
    (format ["Réparations et essence %1... Prêt", _type_name]) call XfGlobalChat;
//Définition des variables        
    _damage_ok = false;
    _fuel_ok = false;
    d_cancelrep = false;
    _breaked_out = false;
    _breaked_out2 = false;
//action qui permet de stopper la réparation    
    _rep_action = player addAction["Stopper la tâche","stoprep.sqf"];

//Réparation et essence
for "_wc" from 1 to _coef_x2 do {
    if (!alive player || d_cancelrep) exitWith {player removeAction _rep_action};
    "Still working..." call XfGlobalChat;
    player playMove "AinvPknlMstpSlayWrflDnon_medic";
    sleep 3.0;
    waitUntil {animationState player != "AinvPknlMstpSlayWrflDnon_medic"};
    if (d_cancelrep) exitWith {_breaked_out = true};
    if (vehicle player != player) exitWith {
        _breaked_out2 = true;
        hintSilent "Vous êtes entré dans le véhicule, service annulé";
    };
    if (!_fuel_ok) then {_fuel = _fuel + _rep_count};
    if (!_fuel_ok) then {d_objectID2 setFuel _fuel };
    if (_fuel >= 1 && !_fuel_ok) then {_fuel = 1;_fuel_ok = true};
    if (!_damage_ok) then {_damage = _damage - _rep_count};
    if (!_damage_ok) then {d_objectID2 setDammage _damage};
    if (_damage <= 0.01 && !_damage_ok) then {_damage = 0;_damage_ok = true};    
    hintSilent format ["Véhicule status:\n---------------------\nEssence: %1\nDégâts: %2",_fuel, _damage];
    if(_damage_ok) exitWith{};
};

//Indication si il y a eu un souci
    if (_breaked_out) exitWith {
        "Service annulé..." call XfGlobalChat;
        player removeAction _rep_action;
    };
    if (_breaked_out2) exitWith {};
    d_eng_can_repfuel = false;
//Supprime l'action pour stopper la tâche    
    player removeAction _rep_action;
    if (!alive player) exitWith {player removeAction _rep_action};

(format ["%1 est réparer et avec le plein", _type_name]) call XfGlobalChat;
 
"analyses.sqf"

Code : Tout sélectionner

// by Xeno

private ["_aid","_caller","_coef","_damage","_damage_val","_estimated_time","_fuel","_fuel_val","_rep_count","_this","_type_name"];

_caller = _this select 1;
_aid = _this select 2;

if (!(local _caller)) exitWith {};
_rep_count = 1;

if (d_objectID2 isKindOf "Air") then {
    _rep_count = 0.1;
} else {
    if (d_objectID2 isKindOf "Tank") then {
        _rep_count = 0.2;
    } else {
        _rep_count = 0.3;
    };
};

_fuel = fuel d_objectID2;
_damage = damage d_objectID2;

_damage_val = (_damage / _rep_count);
_fuel_val = ((1 - _fuel) / _rep_count);
_coef = if (_fuel_val == _damage_val) then {
    _damage_val
} else {
    if (_fuel_val > _damage_val) then {
        _fuel_val
    } else {
        _damage_val
    }
};

_coef = ceil _coef;
_coef_x2 = _coef *2;
_estimated_time = _coef_x2 * 3;

XfGetDisplayName = {
    private ["_obj_name", "_obj_kind", "_cfg"];
    _obj_name = _this select 0;_obj_kind = _this select 1;
    _cfg = switch (_obj_kind) do {case 0: {"CfgVehicles"};case 1: {"CfgWeapons"};case 2: {"CfgMagazines"};};
    getText (configFile >> _cfg >> _obj_name >> "displayName")
};

_type_name = [typeOf (d_objectID2),0] call XfGetDisplayName;
hintSilent format ["Vehicule statut: %4\n--------------------------------\nFuel: %1\nDégâts: %2\nRéparation estimmés en: %3 sec",_fuel, _damage,_estimated_time,_type_name]; 
:!: penser bien à prendre celui-ci dessous (c'est lui qui stoppe l'action si le joueur en a besoin):

"stoprep.sqf"

Code : Tout sélectionner

d_cancelrep = true; 
En espérant que cela soit utile à d'autres.

Une mission d'exemple est disponible ci-dessous
Fichiers joints
ingenieur_reparation.Desert_E.zip
Mission d'exemple
(4.94 Kio) Téléchargé 361 fois
Modifié en dernier par =[TTK]= Yourry le mar. 30 août 2011, 19:18, modifié 2 fois.
"Les Boches faisaient "Kamarad". Il aurait fallu commencer par ça des deux côtés, pour éviter les massacres organisés par ceux d'en haut, mais le fusil qu'ils nous avaient collé entre les mains, forcément, il a bien fallu qu'il serve et tout le reste à suivit." dixit Tardi et Verney
Image
L'autre jour, en tirant le rouleau de papier cul, toute la cloison est venue avec. dixit Camille Caz

Mash6
Chouchou
Chouchou
Messages : 15
Enregistré le : lun. 22 août 2011, 17:07

Re: Script de réparations véhicules par ingénieur

Message par Mash6 »

Salut,

Script bien sympathique, bravo !

Répondre