Nachdem ich nun mal alle Versionen durchgeschaut habe und immernoch auf ein Update von MS warte, dachte ich mir, mach ich doch einfach mal ein kleines Tutorial wie ihr eine Massenproduktion auf dem Server erreicht.
VORWORT: Wer hier c&p macht und Fehler einbaut, ist selber Schuld und wird nie was aus sich oder seinem Server machen wenn er nicht lernwillig ist.
Desweiteren Untersage ich es dieses TUT an weiteren Communities/Servern/Foren zu verteilen ohne Einwilligung von mir!
Was ist dass überhaupt?
-Damit können eure User beim einmaligen drücken der Interaktionstaste, solange Farmen bis ihr Inventar voll ist.
Leider habe ich das ganze noch getestet und muss gestehen, ich werde es auch derzeit nicht können. Da es aber auf meinem alten Server sehr gut lief und die anderen Versionen nicht wirklich viel an Änderungen besitzen, sollte es auf jeder Version laufen.
Das alles findet in den beiden Dateien statt: gather.sqf und pickaxeUser.sqf
Version 3.1.x
Spoiler anzeigen
Fangen wir mit der gather.sqf an:
Dies ist der Code um den es sich dreht
if(vehicle player != player) exitWith {};
_diff = [_gather,_val,life_carryWeight,life_maxWeight] call life_fnc_calWeightDiff;
if(_diff == 0) exitWith {hint localize "STR_NOTF_InvFull"};
life_action_inUse = true;
for "_i" from 0 to 2 do
{
player playMove "AinvPercMstpSnonWnonDnon_Putdown_AmovPercMstpSnonWnonDnon";
waitUntil{animationState player != "AinvPercMstpSnonWnonDnon_Putdown_AmovPercMstpSnonWnonDnon";};
sleep 2.5;
};
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"];
};
Alles anzeigen
Mit diesen Zeilen wird die Animation gesetzt sowie geprüft ob das Inventar noch Platz hat und danach das Item in die Hand gedrückt.
Was wir nun tun, ist relativ einfach.
Zunächst setzen wir dieses Stück in eine Schleife
/* Author Shinji */
while {true} do {
if(vehicle player != player) exitWith {};
...
...
...
};
life_action_inUse = false; // Über dieser Variable muss die Schleife enden!
Nun fügen wir noch eine Abfrage hinzu sodass der Spieler wieder abbrechen kann wenn er sich bewegt.
/* Author Shinji */
while {true} do {
if(vehicle player != player) exitWith {};
if (life_interrupted) exitwith {}; // Damit ist diese hier gemeint :)
...
...
...
};
life_action_inUse = false; // Über dieser Variable muss die Schleife enden!
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Das wars schon für die gather. Gehen wir nun zur fn_pickaxeUse.sqf über
Wieder finden wir folgenden Code vor:
Diesen werden wir wieder in eine Schleife setzen
/* Author: Shinji */
while {true} do {
if(vehicle player != player) exitWith {hint localize "STR_ISTR_Pick_MineVeh";};
...
...
...
};
life_action_inUse = false; // als referenz das die Schleife hier drüber endet
Nun bauen wir wieder die kleine Abfrage ein
/* Author: Shinji */
while {true} do {
if(vehicle player != player) exitWith {hint localize "STR_ISTR_Pick_MineVeh";};
if (life_interrupted) exitwith {life_interrupted = false;}; // die Abfrage
...
...
...
Und nun ist die 3.1.x schon Massenproduktionstauglich ziemlich einfach oder?
Version 4.0
Spoiler anzeigen
Die fn_gather.sqf
Der code den wir weder finden:
_diff = [SEL(_gather,0),SEL(_gather,1),life_carryWeight,life_maxWeight] call life_fnc_calWeightDiff;
if(EQUAL(_diff,0)) exitWith {hint localize "STR_NOTF_InvFull"};
life_action_gathering = true;
for "_i" from 0 to 2 do {
player playMove "AinvPercMstpSnonWnonDnon_Putdown_AmovPercMstpSnonWnonDnon";
waitUntil{animationState player != "AinvPercMstpSnonWnonDnon_Putdown_AmovPercMstpSnonWnonDnon";};
sleep 2.5;
};
if(([true,SEL(_gather,0),_diff] call life_fnc_handleInv)) then {
_itemName = M_CONFIG(getText,"VirtualItems",SEL(_gather,0),"displayName");
titleText[format[localize "STR_NOTF_Gather_Success",(localize _itemName),_diff],"PLAIN"];
};
life_action_gathering = false;
Alles anzeigen
Daraus erstellen wir nun eine Schleife:
/* Author Shinji */
while {true} do {
if(vehicle player != player) exitWith {};
...
...
...
};
life_action_gathering = false; // dient wieder als referenz wo die Schleife enden soll
Nun setzen wir eine Abfrage ob der Spieler sich bewegt hat oder ähnliches angestellt hat damit die Schleife durchbrochen wird.
/* Author Shinji */
while {true} do {
if(vehicle player != player) exitWith {};
if (life_interrupted) exitwith {life_interrupted = false;}; // diese Abfrage :)
...
...
...
};
life_action_gathering = false; // dient wieder als referenz wo die Schleife enden soll
Alles anzeigen
Schon läuft die Schleife im Dauerzustand bis das Inventar voll ist oder der Spieler den Vorgang abbricht.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Kommen wir also schon zu fn_pickaxeUse.sqf;
Ähnlich wie oben zu sehen bekommen wir einen Code zu sehen:
if(vehicle player != player) exitWith {hint localize "STR_ISTR_Pick_MineVeh";};
_diff = [SEL(_mine,0),SEL(_mine,1),life_carryWeight,life_maxWeight] call life_fnc_calWeightDiff;
if(EQUAL(_diff,0)) exitWith {hint localize "STR_NOTF_InvFull"};
life_action_inUse = true;
for "_i" from 0 to 2 do {
player playMove "AinvPercMstpSnonWnonDnon_Putdown_AmovPercMstpSnonWnonDnon";
waitUntil{animationState player != "AinvPercMstpSnonWnonDnon_Putdown_AmovPercMstpSnonWnonDnon";};
sleep 2.5;
};
if(([true,SEL(_mine,0),_diff] call life_fnc_handleInv)) then {
_itemName = M_CONFIG(getText,"VirtualItems",SEL(_mine,0),"displayName");
titleText[format[localize "STR_ISTR_Pick_Success",(localize _itemName),_diff],"PLAIN"];
};
life_action_inUse = false;
Alles anzeigen
Sollte dieser Code nicht dem euren gleichen, habe ich mich in der Version verschaut /* Code ist aus einer 4.4 sollte jedoch derselbe Code sein. */
Aus diesem code machen wieder eine Schleife:
/* Author Shinji */
while {true} do {
if(vehicle player != player) exitWith {hint localize "STR_ISTR_Pick_MineVeh";};
...
...
...
};
life_action_inUse = false; // denkt daran die Schleife über diesem Code zu beenden!
Nun folgt der kleine Abbruch Code damit der Spieler den Vorgang selbstständig abbrechen kann.
/* Author Shinji */
while {true} do {
if(vehicle player != player) exitWith {hint localize "STR_ISTR_Pick_MineVeh";};
if(life_interrupted) exitWith {life_interrupted = false;};
...
...
...
};
life_action_inUse = false; // Achtung! Ende der Schleife über dieser Variable
Und fertig Dauerschleife Aktiv so lange Inventar nicht voll und der Spieler nicht abbricht.
Version 4. + ?
Spoiler anzeigen
Da sich der Code von der 3.1.x kaum geändert hat kann hier in der Theorie Der Spoiler der 4.0 genutzt werden, falls jemand auf Nummer sicher gehen will kommt hier das Stück für die 4. +? (4)
Wir nehmen uns wieder die fn_gather.sqf vor und finden folgendes:
if(vehicle player != player) exitWith {};
_diff = [SEL(_gather,0),SEL(_gather,1),life_carryWeight,life_maxWeight] call life_fnc_calWeightDiff;
if(EQUAL(_diff,0)) exitWith {hint localize "STR_NOTF_InvFull"};
life_action_inUse = true;
for "_i" from 0 to 2 do {
player playMove "AinvPercMstpSnonWnonDnon_Putdown_AmovPercMstpSnonWnonDnon";
waitUntil{animationState player != "AinvPercMstpSnonWnonDnon_Putdown_AmovPercMstpSnonWnonDnon";};
sleep 2.5;
};
if(([true,SEL(_gather,0),_diff] call life_fnc_handleInv)) then {
_itemName = M_CONFIG(getText,"VirtualItems",SEL(_gather,0),"displayName");
titleText[format[localize "STR_NOTF_Gather_Success",(localize _itemName),_diff],"PLAIN"];
};
life_action_inUse = false;
Alles anzeigen
Das ganze Stück wird in eine Schleife gepackt :
/* Author Shinji */
while{true} do {
if(vehicle player != player) exitWith {};
...
...
...
};
life_action_inUse = false; // dient als Referenz, Schleife endet über dieser Variable
Nun noch eine Abfrage damit der Spieler selber abbrechen kann wann er möchte.
/* Author Shinji */
while{true} do {
if(vehicle player != player) exitWith {};
if(life_interrupted) exitWith {life_interrupted = false;}; // Diese Zeile ist damit gemeint
...
...
...
};
life_action_inUse = false; // dient als Referenz, Schleife endet über dieser Variable
Schon ist die Gather fertig kommen wir nun also zur fn_pickaxeUse.sqf;
Wir finden wieder folgenden Code:
if(vehicle player != player) exitWith {hint localize "STR_ISTR_Pick_MineVeh";};
_diff = [SEL(_mine,0),SEL(_mine,1),life_carryWeight,life_maxWeight] call life_fnc_calWeightDiff;
if(EQUAL(_diff,0)) exitWith {hint localize "STR_NOTF_InvFull"};
life_action_inUse = true;
for "_i" from 0 to 2 do {
player playMove "AinvPercMstpSnonWnonDnon_Putdown_AmovPercMstpSnonWnonDnon";
waitUntil{animationState player != "AinvPercMstpSnonWnonDnon_Putdown_AmovPercMstpSnonWnonDnon";};
sleep 2.5;
};
if(([true,SEL(_mine,0),_diff] call life_fnc_handleInv)) then {
_itemName = M_CONFIG(getText,"VirtualItems",SEL(_mine,0),"displayName");
titleText[format[localize "STR_ISTR_Pick_Success",(localize _itemName),_diff],"PLAIN"];
};
life_action_inUse = false;
Alles anzeigen
Setzen das ganze wieder in eine Schleife
/* Author Shinji */
while {true} do {
if(vehicle player != player) exitWith {hint localize "STR_ISTR_Pick_MineVeh";};
...
...
...
};
life_action_inUse = false; // Über dieser Variable endet die Schleife!
Natürlich fehlt jetzt die Abfrage ob der Spieler abgebrochen hat oder es wünscht:
/* Author Shinji */
while {true} do {
if(vehicle player != player) exitWith {hint localize "STR_ISTR_Pick_MineVeh";};
if(life_interrupted) exitWith {life_interrupted = false;}; // Damit ist die Zeile hier gemeint
...
...
...
};
life_action_inUse = false; // Über dieser Variable endet die Schleife!
Alles anzeigen
Fertig
So Damit denke ich, habe ich einigen Servern gezeigt das man selbst mit wenig Aufwand und nur ein paar Zeilen viel verändern kann.
Ich möchte hier bitte noch anmerken das ich hiervon lediglich die 4.0 getestet habe! Sollten Fehler entstehen oder Schleifen weiterlaufen wo sie es nicht sollten, entschuldige ich mich und bereit einen Hotfix direkt ins Tut ein.
~ Shinji