Français Restriction de farm suivant le nombre de policier de connecté

Yuri Zoko

Leader
Membre du personnel
31/3/20
462
77
62
1 300
Salut !

Dans ce tutoriel je vais vous apprendre comment restreindre un farm suivant le nombre de policier connecté.

Ce tutoriel sera composer de 3 sections :

  1. - Restriction à la récolte
  2. - Restriction au traitement
  3. - Restriction à la revente

Ces 3 sections sont totalement indépendante, c'est à dire que vous pouvez seulement installer 1 seule ou toutes les sections.


Commençons les choses sérieuses :

Restriction à la récolte

Ouvrir le fichier Config_Gather.hpp dans le dossier config et y ajouter la class suivante tout en bas du fichier à l’avant dernière ligne au dessus du dernier
Code:
};

Code:
 class Illegals {
};

Ajoutez vos ressources illégales dans cette class :
Code:
 class Illegals {
     class cannabis {
         amount = 3;
         zones[] = { "weed_1" };
         item = "";
         zoneSize = 30;
         copRequired = 2; // Nombre de policier connecter pour pouvoir récolter
     };
     class heroin_unprocessed {
         amount = 3;
         zones[] = { "heroin_1" };
         item = "";
         zoneSize = 30;
         copRequired = 0;
     };
     class cocaine_unprocessed {
         amount = 3;
         zones[] = { "cocaine_1" };
         item = "";
         zoneSize = 30;
         copRequired = 3;
     };
};

N’oubliez pas de supprimer les ressources illégales présentes de base dans votre mission

Créez un nouveau fichier
dans votre dossier core/actions et nommez le fn_illegalGather.sqf puis ajoutez dedans :
Code:
#include "..\..\script_macros.hpp"
/*
    Author: Yuri Zoko
    Teamspeak 3: ts.the-programmer.com
    Web site: www.the-programmer.com

    Terms of use:
      - This file is forbidden unless you have permission from the author. If you have this file without permission to use it please do not use it and do not share it.
      - If you have permission to use this file, you can use it on your server however it is strictly forbidden to share it.
      - Out of respect for the author please do not delete this information.

*/
private ["_maxGather","_resource","_amount","_maxGather","_requiredItem","_numbercop"];
if (life_action_inUse) exitWith {};
if !(isNull objectParent player) exitWith {};
if (player getVariable "restrained") exitWith {hint localize "STR_NOTF_isrestrained";};
if (player getVariable "playerSurrender") exitWith {hint localize "STR_NOTF_surrender";};

life_action_inUse = true;
_zone = "";
_requiredItem = "";
_exit = false;

_resourceCfg = missionConfigFile >> "CfgGather" >> "Illegals";
for "_i" from 0 to count(_resourceCfg)-1 do {

    _curConfig = _resourceCfg select _i;
    _resource = configName _curConfig;
    _maxGather = getNumber(_curConfig >> "amount");
    _zoneSize = getNumber(_curConfig >> "zoneSize");
    _resourceZones = getArray(_curConfig >> "zones");
    _requiredItem = getText(_curConfig >> "item");
    _numbercop = getNumber(_curConfig >> "copRequired");
    {
        if ((player distance (getMarkerPos _x)) < _zoneSize) exitWith {_zone = _x;};
    } forEach _resourceZones;

    if (_zone != "") exitWith {};
};

if (_zone isEqualTo "") exitWith {life_action_inUse = false;};

if (_requiredItem != "") then {
    _valItem = missionNamespace getVariable "life_inv_" + _requiredItem;

    if (_valItem < 1) exitWith {
        switch (_requiredItem) do {
         //Messages here
        };
        life_action_inUse = false;
        _exit = true;
    };
};

if ((west countSide playableUnits) < _numbercop) exitWith {hint "Il n'y a pas assez de policier pour pouvoir récolter cette ressource !"};

if (_exit) exitWith {life_action_inUse = false;};

_amount = round(random(_maxGather)) + 1;
_diff = [_resource,_amount,life_carryWeight,life_maxWeight] call life_fnc_calWeightDiff;
if (_diff isEqualTo 0) exitWith {
    hint localize "STR_NOTF_InvFull";
    life_action_inUse = false;
};

switch (_requiredItem) do {
    case "pickaxe": {[player,"mining",35,1] remoteExecCall ["life_fnc_say3D",RCLIENT]};
    default {[player,"harvest",35,1] remoteExecCall ["life_fnc_say3D",RCLIENT]};
};

for "_i" from 0 to 4 do {
    player playMoveNow "AinvPercMstpSnonWnonDnon_Putdown_AmovPercMstpSnonWnonDnon";
    waitUntil{animationState player != "AinvPercMstpSnonWnonDnon_Putdown_AmovPercMstpSnonWnonDnon";};
    sleep 0.5;
};

if ([true,_resource,_diff] call life_fnc_handleInv) then {
    _itemName = M_CONFIG(getText,"VirtualItems",_resource,"displayName");
    titleText[format [localize "STR_NOTF_Gather_Success",(localize _itemName),_diff],"PLAIN"];
};

sleep 1;
life_action_inUse = false;

Ouvrez votre fichier Functions.hpp et ajoutez a la fin de la class Actions :
Code:
class illegalGather {};

Ouvrez votre fn_actionKeyHandler.sqf dans le dossier core\functions et en dessous de la ligne (ligne 47 de base)
Code:
case "mine" : { _handle = [] spawn life_fnc_mine };

Ajoutez :

Code:
case "illegal" : { _handle = [] spawn life_fnc_illegalGather };

Ouvrez votre fn_whereAmI.sqf dans le dossier core\functions cherchez la ligne suivante :
Code:
if (_zone isEqualTo "") exitWith {

Ajoutez au desssus :

Code:
_resourceCfg = missionConfigFile >> "CfgGather" >> "Illegals";
for "_i" from 0 to count(_resourceCfg)-1 do {
    private ["_curConfig", "_resourceZones", "_requiredItem"];
    _zonei = "";
    _curConfig = _resourceCfg select _i;
    _resourceZones = getArray(_curConfig >> "zones");
    {
        if ((player distance(getMarkerPos _x)) < _zoneSize) exitWith {
        _zonei = _x;
    };
    } forEach _resourceZones;
    if (_zonei != "") exitWith {};
};
if (_zonei != "") exitWith {
    _illegal = "illegal";
    _illegal;
};

Restriction au traitement

Dans votre Config_Process.hpp du dossier config ajoutez la ligne suivante aux ressources souhaitées :
Code:
copRequired = 3;

Mettez le nombre de policier requis pour pouvoir traiter la ressource, comme ceci :

Code:
 class heroin {
     MaterialsReq[] = {{"heroin_unprocessed",1}};
     MaterialsGive[] = {{"heroin_processed",1}};
     Text = "STR_Process_Heroin";
     //ScrollText = "Process Heroin";
     NoLicenseCost = 1;
     copRequired = 3;
};

Dans votre fichier fn_processAction.sqf dans le dossier core\actions modifiez les parties suivantes :

Ligne 11
dans le private, ajoutez après "_text" :
Code:
, "_numbercop"
Résultat attendu :

Code:
private
["_vendor","_type","_itemInfo","_oldItem","_newItemWeight","_newItem","
_oldItemWeight","_cost","_upp","_hasLicense","_itemName","_oldVal","_ui
","_progress","_pgText","_cP","_materialsRequired","_materialsGiven","_
noLicenseCost","_text","_numbercop","_filter","_totalConversions","_min
imumConversions"];

En dessous de la ligne suivante (23 de base) :
Code:
_text = M_CONFIG(getText,"ProcessAction",_type,"Text");
Ajoutez la ligne :
Code:
_numbercop = M_CONFIG(getNumber,"ProcessAction",_type,"copRequired");

En dessous de la ligne suivante (82 de base) :

Code:
if (_exit) exitWith {hint localize "STR_Process_Weight"; life_is_processing =
false; life_action_inUse = false;};
Ajoutez la ligne :
Code:
if ((west countSide playableUnits) < _numbercop) exitWith {hint "Il n'y a pas
assez de policier pour pouvoir récolter cette ressource !"; life_is_processing
= false; life_action_inUse = false;};

Restriction à la revente

Dans votre Config_vItems.hpp du dossier config ajoutez la ligne suivante aux ressources souhaitées :

Code:
copRequired = 3;
Mettez le nombre de policier requis pour pouvoir traiter la ressource, ce qui donnera :

Code:
class heroin_processed {
     variable = "heroinProcessed";
     displayName = "STR_Item_HeroinP";
     weight = 4;
     buyPrice = 3500;
     sellPrice = 2560;
     illegal = true;
     copRequired = 3;
     edible = -1;
     drinkable = -1;
     icon = "icons\ico_heroinProcessed.paa";
};

Dans votre fichier fn_virt_sell.sqf dans le dossier core\shops modifiez les parties suivantes :

Ligne 11 dans le private, ajoutez après "_price" ceci :
Code:
,"_numbercop"

Résultat attendu :
Code:
private ["_type","_index","_price","_numbercop","_amount","_name"];

En dessus de la ligne suivante (13 de base) :
Code:
if (_price isEqualTo -1) exitWith {};
Ajoutez la ligne :
Code:
_numbercop = M_CONFIG(getNumber,"VirtualItems",_type,"copRequired");

En dessous de la ligne (ligne 17 de base) :
Code:
_amount = parseNumber (_amount);
Ajoutez la ligne suivante :
Code:
if ((west countSide playableUnits) < _numbercop) exitWith {hint "Il n'y a pas
assez de policier pour pouvoir vendre cette ressource !"};

A vous de jouer !
 
Dernière édition:
Approuve ! Merci du tutoriel
 
Salut , sur la vente cela ne fonctionne pas, pour le reste sa passe, possible de check, merci en tout cas du partage rapide !
 
Salut !

Dans ce tutoriel je vais vous apprendre comment restreindre un farm suivant le nombre de policier connecté.

Ce tutoriel sera composer de 3 sections :

  1. - Restriction à la récolte
  2. - Restriction au traitement
  3. - Restriction à la revente

Ces 3 sections sont totalement indépendante, c'est à dire que vous pouvez seulement installer 1 seule ou toutes les sections.


Commençons les choses sérieuses :

Restriction à la récolte

Ouvrir le fichier Config_Gather.hpp dans le dossier config et y ajouter la class suivante tout en bas du fichier à l’avant dernière ligne au dessus du dernier
Code:
};

Code:
 class Illegals {
};

Ajoutez vos ressources illégales dans cette class :
Code:
 class Illegals {
     class cannabis {
         amount = 3;
         zones[] = { "weed_1" };
         item = "";
         zoneSize = 30;
         copRequired = 2; // Nombre de policier connecter pour pouvoir récolter
     };
     class heroin_unprocessed {
         amount = 3;
         zones[] = { "heroin_1" };
         item = "";
         zoneSize = 30;
         copRequired = 0;
     };
     class cocaine_unprocessed {
         amount = 3;
         zones[] = { "cocaine_1" };
         item = "";
         zoneSize = 30;
         copRequired = 3;
     };
};

N’oubliez pas de supprimer les ressources illégales présentes de base dans votre mission

Créez un nouveau fichier
dans votre dossier core/actions et nommez le fn_illegalGather.sqf puis ajoutez dedans :
Code:
#include "..\..\script_macros.hpp"
/*
    Author: Yuri Zoko
    Teamspeak 3: ts.the-programmer.com
    Web site: www.the-programmer.com

    Terms of use:
      - This file is forbidden unless you have permission from the author. If you have this file without permission to use it please do not use it and do not share it.
      - If you have permission to use this file, you can use it on your server however it is strictly forbidden to share it.
      - Out of respect for the author please do not delete this information.

*/
private ["_maxGather","_resource","_amount","_maxGather","_requiredItem","_numbercop"];
if (life_action_inUse) exitWith {};
if !(isNull objectParent player) exitWith {};
if (player getVariable "restrained") exitWith {hint localize "STR_NOTF_isrestrained";};
if (player getVariable "playerSurrender") exitWith {hint localize "STR_NOTF_surrender";};

life_action_inUse = true;
_zone = "";
_requiredItem = "";
_exit = false;

_resourceCfg = missionConfigFile >> "CfgGather" >> "Illegals";
for "_i" from 0 to count(_resourceCfg)-1 do {

    _curConfig = _resourceCfg select _i;
    _resource = configName _curConfig;
    _maxGather = getNumber(_curConfig >> "amount");
    _zoneSize = getNumber(_curConfig >> "zoneSize");
    _resourceZones = getArray(_curConfig >> "zones");
    _requiredItem = getText(_curConfig >> "item");
    _numbercop = getNumber(_curConfig >> "copRequired");
    {
        if ((player distance (getMarkerPos _x)) < _zoneSize) exitWith {_zone = _x;};
    } forEach _resourceZones;

    if (_zone != "") exitWith {};
};

if (_zone isEqualTo "") exitWith {life_action_inUse = false;};

if (_requiredItem != "") then {
    _valItem = missionNamespace getVariable "life_inv_" + _requiredItem;

    if (_valItem < 1) exitWith {
        switch (_requiredItem) do {
         //Messages here
        };
        life_action_inUse = false;
        _exit = true;
    };
};

if ((west countSide playableUnits) < _numbercop) exitWith {hint "Il n'y a pas assez de policier pour pouvoir récolter cette ressource !"};

if (_exit) exitWith {life_action_inUse = false;};

_amount = round(random(_maxGather)) + 1;
_diff = [_resource,_amount,life_carryWeight,life_maxWeight] call life_fnc_calWeightDiff;
if (_diff isEqualTo 0) exitWith {
    hint localize "STR_NOTF_InvFull";
    life_action_inUse = false;
};

switch (_requiredItem) do {
    case "pickaxe": {[player,"mining",35,1] remoteExecCall ["life_fnc_say3D",RCLIENT]};
    default {[player,"harvest",35,1] remoteExecCall ["life_fnc_say3D",RCLIENT]};
};

for "_i" from 0 to 4 do {
    player playMoveNow "AinvPercMstpSnonWnonDnon_Putdown_AmovPercMstpSnonWnonDnon";
    waitUntil{animationState player != "AinvPercMstpSnonWnonDnon_Putdown_AmovPercMstpSnonWnonDnon";};
    sleep 0.5;
};

if ([true,_resource,_diff] call life_fnc_handleInv) then {
    _itemName = M_CONFIG(getText,"VirtualItems",_resource,"displayName");
    titleText[format [localize "STR_NOTF_Gather_Success",(localize _itemName),_diff],"PLAIN"];
};

sleep 1;
life_action_inUse = false;

Ouvrez votre fichier Functions.hpp et ajoutez a la fin de la class Actions :
Code:
class illegalGather {};

Ouvrez votre fn_actionKeyHandler.sqf dans le dossier core\functions et en dessous de la ligne (ligne 47 de base)
Code:
case "mine" : { _handle = [] spawn life_fnc_mine };

Ajoutez :

Code:
case "illegal" : { _handle = [] spawn life_fnc_illegalGather };

Ouvrez votre fn_whereAmI.sqf dans le dossier core\functions cherchez la ligne suivante :
Code:
if (_zone isEqualTo "") exitWith {

Ajoutez au desssus :

Code:
_resourceCfg = missionConfigFile >> "CfgGather" >> "Illegals";
for "_i" from 0 to count(_resourceCfg)-1 do {
    private ["_curConfig", "_resourceZones", "_requiredItem"];
    _zonei = "";
    _curConfig = _resourceCfg select _i;
    _resourceZones = getArray(_curConfig >> "zones");
    {
        if ((player distance(getMarkerPos _x)) < _zoneSize) exitWith {
        _zonei = _x;
    };
    } forEach _resourceZones;
    if (_zonei != "") exitWith {};
};
if (_zonei != "") exitWith {
    _illegal = "illegal";
    _illegal;
};

Restriction au traitement

Dans votre Config_Process.hpp du dossier config ajoutez la ligne suivante aux ressources souhaitées :
Code:
copRequired = 3;

Mettez le nombre de policier requis pour pouvoir traiter la ressource, comme ceci :

Code:
 class heroin {
     MaterialsReq[] = {{"heroin_unprocessed",1}};
     MaterialsGive[] = {{"heroin_processed",1}};
     Text = "STR_Process_Heroin";
     //ScrollText = "Process Heroin";
     NoLicenseCost = 1;
     copRequired = 3;
};

Dans votre fichier fn_processAction.sqf dans le dossier core\actions modifiez les parties suivantes :

Ligne 11
dans le private, ajoutez après "_text" :
Code:
, "_numbercop"
Résultat attendu :

Code:
private
["_vendor","_type","_itemInfo","_oldItem","_newItemWeight","_newItem","
_oldItemWeight","_cost","_upp","_hasLicense","_itemName","_oldVal","_ui
","_progress","_pgText","_cP","_materialsRequired","_materialsGiven","_
noLicenseCost","_text","_numbercop","_filter","_totalConversions","_min
imumConversions"];

En dessous de la ligne suivante (23 de base) :
Code:
_text = M_CONFIG(getText,"ProcessAction",_type,"Text");
Ajoutez la ligne :
Code:
_numbercop = M_CONFIG(getNumber,"ProcessAction",_type,"copRequired");

En dessous de la ligne suivante (82 de base) :

Code:
if (_exit) exitWith {hint localize "STR_Process_Weight"; life_is_processing =
false; life_action_inUse = false;};
Ajoutez la ligne :
Code:
if ((west countSide playableUnits) < _numbercop) exitWith {hint "Il n'y a pas
assez de policier pour pouvoir récolter cette ressource !"; life_is_processing
= false; life_action_inUse = false;};

Restriction à la revente

Dans votre Config_vItems.hpp du dossier config ajoutez la ligne suivante aux ressources souhaitées :

Code:
copRequired = 3;
Mettez le nombre de policier requis pour pouvoir traiter la ressource, ce qui donnera :

Code:
class heroin_processed {
     variable = "heroinProcessed";
     displayName = "STR_Item_HeroinP";
     weight = 4;
     buyPrice = 3500;
     sellPrice = 2560;
     illegal = true;
     copRequired = 3;
     edible = -1;
     drinkable = -1;
     icon = "icons\ico_heroinProcessed.paa";
};

Dans votre fichier fn_virt_sell.sqf dans le dossier core\shops modifiez les parties suivantes :

Ligne 11 dans le private, ajoutez après "_price" ceci :
Code:
,"_numbercop"

Résultat attendu :
Code:
private ["_type","_index","_price","_numbercop","_amount","_name"];

En dessus de la ligne suivante (13 de base) :
Code:
if (_price isEqualTo -1) exitWith {};
Ajoutez la ligne :
Code:
_numbercop = M_CONFIG(getNumber,"VirtualItems",_type,"copRequired");

En dessous de la ligne (ligne 17 de base) :
Code:
_amount = parseNumber (_amount);
Ajoutez la ligne suivante :
Code:
if ((west countSide playableUnits) < _numbercop) exitWith {hint "Il n'y a pas
assez de policier pour pouvoir vendre cette ressource !"};

A vous de jouer !
Merci chef, Cependant il me semble qu'il manque quelque truc pour le Champ, je n'est pas test mais en théorie vous avez oublier dans le fn_whereAmI.sqf

[CODE title="Remplacer Ceci"]private ["_zonem", "_zone", "_mine", "_zoneSize", "_resource", "_nothing"];[/CODE]

Par

Code:
private ["_zonem", "_zone", "_zonei", "_illegal", "_mine", "_zoneSize", "_resource", "_nothing"];