Autor: PapaBear's
Edit by AmaZiinG
Infos: Die Weiterverbreitung in anderen Foren untersage ich (eine Erlaubnis ist bei mir einzuholen).
Wichtig: Macht bitte macht ein Backup davor !
Die Schritte: 10. und 7. könnten Fehlerhaft sein !!!!!!
Mission:
1. Geht in die Functions.h und schreibt unter class Functions da
2. tragt unter class Config das ein:
2. Schreibt folgendes in eure Masterhandler.h ein:
3. Stringable.xml fügt ihr ganz unten das ein:
<Package name="Life_Prof">
<Key ID="STR_Prof_Oil">
<Original>Oil Proficiency</Original>
<English>Oil Proficiency</English>
<German>Öl Können</German>
</Key>
<Key ID="STR_Prof_Sand">
<Original>Sand Proficiency</Original>
<English>Sand Proficiency</English>
<German>Sand Können</German>
</Key>
<Key ID="STR_Prof_Rock">
<Original>Rock Proficiency</Original>
<English>Rock Proficiency</English>
<German>Rock Können</German>
</Key>
<Key ID="STR_Prof_Salt">
<Original>Salt Proficiency</Original>
<English>Salt Proficiency</English>
<German>Öl Können</German>
</Key>
<Key ID="STR_Prof_Canabis">
<Original>Cannabis Proficiency</Original>
<English>Cannabis Proficiency</English>
<German>Öl Können</German>
</Key>
<Key ID="STR_Prof_Heroin">
<Original>Heroin Proficiency</Original>
<English>Heroin Proficiency</English>
<German>Öl Können</German>
</Key>
<Key ID="STR_Prof_Cocain">
<Original>Cocaine Proficiency</Original>
<English>Cocaine Proficiency</English>
<German>Öl Können</German>
</Key>
<Key ID="STR_Prof_Diamond">
<Original>Diamond Proficiency</Original>
<English>Diamond Proficiency</English>
<German>Öl Können</German>
</Key>
<Key ID="STR_Prof_Iron">
<Original>Iron Proficiency</Original>
<English>Iron Proficiency</English>
<German>Öl Können</German>
</Key>
<Key ID="STR_Prof_Copper">
<Original>Copper Proficiency</Original>
<English>Copper Proficiency</English>
<German>Öl Können</German>
</Key>
<Key ID="STR_Prof_Fruit">
<Original>Fruit Proficiency</Original>
<English>Fruit Proficiency</English>
<German>Öl Können</German>
</Key>
</Package>
Alles anzeigen
4.In der Player_inv.hpp fügt ihr ganz unten das ein:
class ProfButton : life_RscButtonMenu {
text = "Proficiency";
colorBackground[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.3843])", "(profilenamespace getvariable ['GUI_BCG_RGB_G',0.7019])", "(profilenamespace getvariable ['GUI_BCG_RGB_B',0.8862])", 0.5};
onButtonClick = "[] call life_fnc_profSetup;";
x = 0.11;
y = 0.70;
w = (5.75 / 40);
h = (1 / 25);
};
5. In der Config_Licenses.hpp fügt ihr folgende Lizenzen hinzu:
class Licenses {
//Processing Licenses
class Oil_Prof {
variable = "Oil_Prof";
displayName = "STR_Prof_Oil";
price = 10000;
illegal = false;
side = "civ";
};
class Iron_Prof {
variable = "Iron_Prof";
displayName = "STR_Prof_Iron";
price = 35000;
illegal = false;
side = "civ";
};
class Copper_Prof {
variable = "Copper_Prof";
displayName = "STR_Prof_Copper";
price = 12000;
illegal = false;
side = "civ";
};
class Heroin_Prof {
variable = "Heroin_Prof";
displayName = "STR_Prof_Rock";
price = 14500;
illegal = false;
side = "civ";
};
class Canabis_Prof {
variable = "Canabis_Prof";
displayName = "STR_Prof_Canabis";
price = 9500;
illegal = false;
side = "civ";
};
class Cocain_Prof {
variable = "Cocain_Prof";
displayName = "STR_Prof_Cocain";
price = 8000;
illegal = false;
side = "civ";
};
class Fruit_Prof {
variable = "Fruit_Prof";
displayName = "STR_Prof_Fruit";
price = 6500;
illegal = false;
side = "civ";
};
class Diamond_Prof {
variable = "Diamond_Prof";
displayName = "STR_Prof_Diamond";
price = 15000;
illegal = false;
side = "civ";
};
class Rock_Prof {
variable = "Rock_Prof";
displayName = "STR_Prof_Rock";
price = 15000;
illegal = false;
side = "civ";
};
class Sand_Prof {
variable = "Sand_Prof";
displayName = "STR_Prof_Sand";
price = 15000;
illegal = false;
side = "civ";
};
};
Alles anzeigen
6. Ersetzt die fn_updateRequest durch das:
#include "..\..\script_macros.hpp"
/*
File: fn_updateRequest.sqf
Author: Tonic
Description:
Passes ALL player information to the server to save player data to the database.
Edit by AmaZiinG for the level system
P.S. - Don't be a faggot like i know some of you all will be.
*/
private["_packet","_array","_flag","_alive","_position"];
_packet = [getPlayerUID player,(profileName),playerSide,CASH,BANK];
_array = [];
_alive = alive player;
_position = getPosATL player;
_flag = switch (playerSide) do {case west: {"cop"}; case civilian: {"civ"}; case independent: {"med"};};
{
_varName = LICENSE_VARNAME(configName _x,_flag);
_array pushBack [_varName,LICENSE_VALUE(configName _x,_flag)];
} forEach (format["getText(_x >> 'side') isEqualTo '%1'",_flag] configClasses (missionConfigFile >> "Licenses"));
_packet pushBack _array;
[] call life_fnc_saveGear;
_packet pushBack life_gear;
_profs = []; //LevelSystem
{
if(_x select 1 == _flag) then
{
_data = missionNamespace getVariable (_x select 0);
_profs pushBack [_x select 0,_data select 0,_data select 1];
};
} foreach life_prof;
_packet pushBack _profs;//Level SYstem Ende
_array = [];
_array pushBack life_hunger;
_array pushBack life_thirst;
_array pushBack (damage player);
_packet pushBack _array;
switch (playerSide) do {
case civilian: {
_packet pushBack life_is_arrested;
_packet pushBack _alive;
_packet pushBack _position;
};
};
if (life_HC_isActive) then {
_packet remoteExecCall ["HC_fnc_updateRequest",HC_Life];
} else {
_packet remoteExecCall ["DB_fnc_updateRequest",RSERV];
};
Alles anzeigen
7. Ersetzt eure Fn_processaction.sqf durch das:
#include "..\..\script_macros.hpp"
/*
File: fn_processAction.sqf
Author: Bryan "Tonic" Boardwine
Modified : NiiRoZz
Description:
Master handling for processing an item.
NiiRoZz : Added multiprocess
*/
private["_vendor","_type","_itemInfo","_oldItem","_newItemWeight","_newItem","_oldItemWeight","_cost","_upp","_hasLicense","_itemName","_oldVal","_ui","_progress","_pgText","_cP","_materialsRequired","_materialsGiven","_noLicenseCost","_text","_filter","_totalConversions","_minimumConversions"];
_vendor = [_this,0,ObjNull,[ObjNull]] call BIS_fnc_param;
_type = [_this,3,"",[""]] call BIS_fnc_param;
//Error check
if (isNull _vendor || _type isEqualTo "" || (player distance _vendor > 10)) exitWith {};
life_action_inUse = true;//Lock out other actions during processing.
if (isClass (missionConfigFile >> "ProcessAction" >> _type)) then {
_filter = false;
_materialsRequired = M_CONFIG(getArray,"ProcessAction",_type,"MaterialsReq");
_materialsGiven = M_CONFIG(getArray,"ProcessAction",_type,"MaterialsGive");
_noLicenseCost = M_CONFIG(getNumber,"ProcessAction",_type,"NoLicenseCost");
_text = M_CONFIG(getText,"ProcessAction",_type,"Text");
} else {_filter = true;};
if (_filter) exitWith {life_action_inUse = false;};
_itemInfo = [_materialsRequired,_materialsGiven,_noLicenseCost,(localize format["%1",_text])];
if (count _itemInfo isEqualTo 0) exitWith {life_action_inUse = false;};
//Setup vars.
_oldItem = _itemInfo select 0;
_newItem = _itemInfo select 1;
_cost = _itemInfo select 2;
_upp = _itemInfo select 3;
_exit = false;
if (count _oldItem isEqualTo 0) exitWith {life_action_inUse = false;};
_totalConversions = [];
{
_var = ITEM_VALUE(_x select 0);
if (_var isEqualTo 0) exitWith {_exit = true;};
if (_var < (_x select 1)) exitWith {_exit = true;};
_totalConversions pushBack (floor (_var/(_x select 1)));
} forEach _oldItem;
if (_exit) exitWith {life_is_processing = false; hint localize "STR_NOTF_NotEnoughItemProcess"; life_action_inUse = false;};
if (_vendor in [mari_processor,coke_processor,heroin_processor]) then {
_hasLicense = true;
} else {
_hasLicense = LICENSE_VALUE(_type,"civ");
};
_cost = _cost * (count _oldItem);
_minimumConversions = _totalConversions call BIS_fnc_lowestNum;
_oldItemWeight = 0;
{
_weight = ([_x select 0] call life_fnc_itemWeight) * (_x select 1);
_oldItemWeight = _oldItemWeight + _weight;
} count _oldItem;
_newItemWeight = 0;
{
_weight = ([_x select 0] call life_fnc_itemWeight) * (_x select 1);
_newItemWeight = _newItemWeight + _weight;
} count _newItem;
_exit = false;
if (_newItemWeight > _oldItemWeight) then {
_netChange = _newItemWeight - _oldItemWeight;
_freeSpace = life_maxWeight - life_carryWeight;
if (_freeSpace < _netChange) exitWith {_exit = true;};
_minimumConversions = floor(_freeSpace / _netChange);
};
if (_exit) exitWith {hint localize "STR_Process_Weight"; life_is_processing = false; life_action_inUse = false;};
//Setup our progress bar.
disableSerialization;
5 cutRsc ["life_progress","PLAIN"];
_ui = uiNamespace getVariable "life_progress";
_progress = _ui displayCtrl 38201;
_pgText = _ui displayCtrl 38202;
_pgText ctrlSetText format["%2 (1%1)...","%",_upp];
_progress progressSetPosition 0.01;
_cP = 0.01;
life_is_processing = true;
if (_hasLicense) then {
for "_i" from 0 to 1 step 0 do {
sleep 0.28;
_time = 0.3;
_cP = _cP + 0.01;
_profName = [_type] call life_fnc_profType;
_data = missionNamespace getVariable "_profName";
if( _profName != "" ) then
{
switch ( _data select 0 ) do
{
case 1: { _time = 0.4; _cpUp = 0.01; };
case 2: { _time = 0.35; _cpUp = 0.01; };
case 3: { _time = 0.3; _cpUp = 0.01; };
case 4: { _time = 0.25; _cpUp = 0.01; };
case 5: { _time = 0.2; _cpUp = 0.01; };
case 6: { _time = 0.2; _cpUp = 0.02; };
case 7: { _time = 0.2; _cpUp = 0.03; };
case 8: { _time = 0.2; _cpUp = 0.04; };
case 9: { _time = 0.15; _cpUp = 0.05; };
case 10: { _time = 0.1; _cpUp = 0.07; };
};
};
while{true} do
{
_progress progressSetPosition _cP;
_pgText ctrlSetText format["%3 (%1%2)...",round(_cP * 100),"%",_upp];
if (_cP >= 1) exitWith {};
if (player distance _vendor > 10) exitWith {};
};
if (player distance _vendor > 10) exitWith {hint localize "STR_Process_Stay"; 5 cutText ["","PLAIN"]; life_is_processing = false; life_action_inUse = false;};
{
[false,(_x select 0),((_x select 1)*(_minimumConversions))] call life_fnc_handleInv;
} count _oldItem;
{
[true,(_x select 0),((_x select 1)*(_minimumConversions))] call life_fnc_handleInv;
} count _newItem;
5 cutText ["","PLAIN"];
if (_minimumConversions isEqualTo (_totalConversions call BIS_fnc_lowestNum)) then {hint localize "STR_NOTF_ItemProcess";} else {hint localize "STR_Process_Partial";};
if( _profName != "" ) then
{
[_profName,40] call life_fnc_addExp;
};
life_is_processing = false; life_action_inUse = false;
} else {
if (CASH < _cost) exitWith {hint format[localize "STR_Process_License",[_cost] call life_fnc_numberText]; 5 cutText ["","PLAIN"]; life_is_processing = false; life_action_inUse = false;};
for "_i" from 0 to 1 step 0 do {
sleep 0.9;
_time = 0.9;
_cpUp = 0.01;
_profName = [_type] call life_fnc_profType;
_data = missionNamespace getVariable "_profName";
if( _profName != "" ) then
{
switch ( _data select 0) do
{
case 1: { _time = 0.9; _cpUp = 0.01; };
case 2: { _time = 0.8; _cpUp = 0.01; };
case 3: { _time = 0.7; _cpUp = 0.01; };
case 4: { _time = 0.6; _cpUp = 0.01; };
case 5: { _time = 0.5; _cpUp = 0.01; };
case 6: { _time = 0.4; _cpUp = 0.01; };
case 7: { _time = 0.3; _cpUp = 0.01; };
case 8: { _time = 0.2; _cpUp = 0.01; };
case 9: { _time = 0.2; _cpUp = 0.02; };
case 10: { _time = 0.2; _cpUp = 0.03; };
};
};
_cP = _cP + _cpUp;
_progress progressSetPosition _cP;
_pgText ctrlSetText format["%3 (%1%2)...",round(_cP * 100),"%",_upp];
if (_cP >= 1) exitWith {};
if (player distance _vendor > 10) exitWith {};
};
if (player distance _vendor > 10) exitWith {hint localize "STR_Process_Stay"; 5 cutText ["","PLAIN"]; life_is_processing = false; life_action_inUse = false;};
if (CASH < _cost) exitWith {hint format[localize "STR_Process_License",[_cost] call life_fnc_numberText]; 5 cutText ["","PLAIN"]; life_is_processing = false; life_action_inUse = false;};
{
[false,(_x select 0),((_x select 1)*(_minimumConversions))] call life_fnc_handleInv;
} count _oldItem;
{
[true,(_x select 0),((_x select 1)*(_minimumConversions))] call life_fnc_handleInv;
} count _newItem;
5 cutText ["","PLAIN"];
if (_minimumConversions isEqualTo (_totalConversions call BIS_fnc_lowestNum)) then {hint localize "STR_NOTF_ItemProcess";} else {hint localize "STR_Process_Partial";};
CASH = CASH - _cost;
if( _profName != "" ) then
{
[_profName,40] call life_fnc_addExp;
};
life_is_processing = false; life_action_inUse = false;
};
Alles anzeigen
8. Ersetzt die fn_gather.sqf durch das:
#include "..\..\script_macros.hpp"
/*
File: fn_gather.sqf
Author: Devilfloh
Edit by AmaZiinG for the level system
P.S. - Don't be a faggot like i know some of you all will be.
Description:
Main functionality for gathering.
*/
private["_maxGather","_resource","_amount","_maxGather","_requiredItem"];
if (life_action_inUse) exitWith {};
while {true} do {
if ((vehicle player) != player) exitWith {};
if (life_interrupted) exitWith {life_interrupted = false;};
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 = "";
_time = 0;
_profName = [_gather] call life_fnc_profType; //Level System
_zoneSize = (getNumber(missionConfigFile >> "CfgGather" >> "zoneSize"));
_exit = false;
_resourceCfg = missionConfigFile >> "CfgGather" >> "Resources";
if( _profName != "" ) then
{
_data = missionNamespace getVariable (_profName);
_time = ( 3 - (0.25 * (_data select 0)));
};
for "_i" from 0 to count(_resourceCfg)-1 do {
_curConfig = _resourceCfg select _i;
_resource = configName _curConfig;
_maxGather = getNumber(_curConfig >> "amount");
_resourceZones = getArray(_curConfig >> "zones");
_requiredItem = getText(_curConfig >> "item");
{
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 (_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 say3D "mining";};
default {player say3D "harvest";};
};
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"];
if( _profName != "" ) then //Level System
{ //Level System
[_profName,25] call life_fnc_addExp; //Level System
};
};
[] call life_fnc_hudUpdate;
sleep 1;
};
life_action_inUse = false;
/*
replace from life_action_inuse = true down
life_action_inUse = true;
_time = 0;
_profName = [_gather] call life_fnc_profType;
if( _profName != "" ) then
{
_data = missionNamespace getVariable (_profName);
_time = ( 3 - (0.25 * (_data select 0)));
};
for "_i" from 0 to 2 do
{
player playMove "AinvPercMstpSnonWnonDnon_Putdown_AmovPercMstpSnonWnonDnon";
waitUntil{animationState player != "AinvPercMstpSnonWnonDnon_Putdown_AmovPercMstpSnonWnonDnon";};
sleep _time;
};
if(([true,_gather,_diff] call life_fnc_handleInv)) then
{
_itemName = [([_gather,0] call life_fnc_varHandle)] call life_fnc_varToStr;
titleText[format[localize "STR_NOTF_Gather_Success",_itemName,_diff],"PLAIN"];
if( _profName != "" ) then
{
[_profName,25] call life_fnc_addExp;
};
};
life_action_inUse = false;
/*
Alles anzeigen
9. Ersetzt eure fn_requestRecived.sqf:
#include "..\..\script_macros.hpp"
/*
File: fn_requestReceived.sqf
Author: Bryan "Tonic" Boardwine
Edit by AmaZiinG for the level system
P.S. - Don't be a faggot like i know some of you all will be.
Description:
Called by the server saying that we have a response so let's
sort through the information, validate it and if all valid
set the client up.
*/
private["_array"];
life_session_tries = life_session_tries + 1;
if (life_session_completed) exitWith {}; //Why did this get executed when the client already initialized?
if (life_session_tries > 3) exitWith {cutText[localize "STR_Session_Error","BLACK FADED"]; 0 cutFadeOut 999999999;};
0 cutText [localize "STR_Session_Received","BLACK FADED"];
0 cutFadeOut 9999999;
//Error handling and junk..
if (isNil "_this") exitWith {[] call SOCK_fnc_insertPlayerInfo;};
if (_this isEqualType "") exitWith {[] call SOCK_fnc_insertPlayerInfo;};
if (count _this isEqualTo 0) exitWith {[] call SOCK_fnc_insertPlayerInfo;};
if ((_this select 0) isEqualTo "Error") exitWith {[] call SOCK_fnc_insertPlayerInfo;};
if (!(getPlayerUID player isEqualTo (_this select 0))) exitWith {[] call SOCK_fnc_dataQuery;};
//Lets make sure some vars are not set before hand.. If they are get rid of them, hopefully the engine purges past variables but meh who cares.
if (!isServer && (!isNil "life_adminlevel" || !isNil "life_coplevel" || !isNil "life_donorlevel")) exitWith {
[profileName,getPlayerUID player,"VariablesAlreadySet"] remoteExecCall ["SPY_fnc_cookieJar",RSERV];
[profileName,format["Variables set before client initialization...\nlife_adminlevel: %1\nlife_coplevel: %2\nlife_donorlevel: %3",life_adminlevel,life_coplevel,life_donorlevel]] remoteExecCall ["SPY_fnc_notifyAdmins",RCLIENT];
sleep 0.9;
failMission "SpyGlass";
};
//Parse basic player information.
CASH = parseNumber (_this select 2);
BANK = parseNumber (_this select 3);
CONST(life_adminlevel,parseNumber (_this select 4));
if (LIFE_SETTINGS(getNumber,"donor_level") isEqualTo 1) then {
CONST(life_donorlevel,parseNumber (_this select 5));
} else {
CONST(life_donorlevel,0);
};
//Loop through licenses
if (count (_this select 6) > 0) then {
{missionNamespace setVariable [(_x select 0),(_x select 1)];} forEach (_this select 6);
};
life_gear = _this select 8;
[true] call life_fnc_loadGear;
if(count (_this select 9) > 0) then {
{
missionNamespace setVariable [(_x select 0),[parseNumber (_x select 1), parseNumber (_x select 2)]];
} foreach (_this select 9);
};
//Parse side specific information.
switch (playerSide) do {
case west: {
CONST(life_coplevel, parseNumber(_this select 7));
CONST(life_medicLevel,0);
life_blacklisted = _this select 9;
if (LIFE_SETTINGS(getNumber,"save_playerStats") isEqualTo 1) then {
life_hunger = ((_this select 10) select 0);
life_thirst = ((_this select 10) select 1);
player setDamage ((_this select 10) select 2);
};
};
case civilian: {
life_is_arrested = _this select 7;
CONST(life_coplevel, 0);
CONST(life_medicLevel, 0);
life_houses = _this select 13;
if (LIFE_SETTINGS(getNumber,"save_playerStats") isEqualTo 1) then {
life_hunger = ((_this select 9) select 0);
life_thirst = ((_this select 9) select 1);
player setDamage ((_this select 9) select 2);
};
//Position
if (LIFE_SETTINGS(getNumber,"save_civilian_position") isEqualTo 1) then {
life_is_alive = _this select 10;
life_civ_position = _this select 11;
if (life_is_alive) then {
if (count life_civ_position != 3) then {diag_log format["[requestReceived] Bad position received. Data: %1",life_civ_position];life_is_alive =false;};
if (life_civ_position distance (getMarkerPos "respawn_civilian") < 300) then {life_is_alive = false;};
};
};
{
_house = nearestObject [(call compile format["%1",(_x select 0)]), "House"];
life_vehicles pushBack _house;
} forEach life_houses;
life_gangData = _this select 14;
if (!(count life_gangData isEqualTo 0)) then {
[] spawn life_fnc_initGang;
};
[] spawn life_fnc_initHouses;
};
case independent: {
CONST(life_medicLevel, parseNumber(_this select 7));
CONST(life_coplevel,0);
if (LIFE_SETTINGS(getNumber,"save_playerStats") isEqualTo 1) then {
life_hunger = ((_this select 9) select 0);
life_thirst = ((_this select 9) select 1);
player setDamage ((_this select 9) select 2);
};
};
};
if (count (_this select 15) > 0) then {
{life_vehicles pushBack _x;} forEach (_this select 15);
};
life_session_completed = true;
Alles anzeigen
10. In der configuration.sqf sucht nach:
missionNamespace setVariable [LICENSE_VARNAME(_varName,_sideFlag),false];
} forEach ("true" configClasses (missionConfigFile >> "Licenses"));
schreibt darüber folgendes:
life_prof =
[
["Oil_Prof","civ"],
["Iron_Prof","civ"],
["Copper_Prof","civ"],
["Heroin_Prof","civ"],
["Canabis_Prof","civ"],
["Cocain_Prof","civ"],
["Salt_Prof","civ"],
["Fruit_Prof","civ"],
["Diamond_Prof","civ"],
["Rock_Prof","civ"],
["Sand_Prof","civ"]
];
Alles anzeigen
11. Die Prof.hpp einfach in den Dialog Ordner:
Prof.zip
12. Die Fn_addexp.sqf und Fn_profSetUp.sqf in den Funktion Ordner:
Fn_profSetUp.zip
13. Die Fn_profType.sqf in den core/config Ordner:
Fn_profType.zip