Nur mal so am rande, der aktuallisiert den Kontostand aber nicht. Wenn du das brauchst, musste das regelmässig aktuallisieren zum beispiel über das Paycheck script
Beiträge von moeck
-
-
So ich habe fertig. Jetzt funzt alles und man unter keinen Umständen mehr Häuser doppelt kaufen. Ich poste mal meine Lösung. Ist wahrscheinlich nicht die eleganteste aber da ich mittlerweile gefühlt 2 Tage nur damit verbracht habe bin ich zufrieden
Code: fn_houseMenu.sqf//Erweiterung um false _Btn1 buttonSetAction "[life_pInact_curTarget,false] spawn life_fnc_buyHouse;";
mehr oder weniger Änderungen in der fn_buyHouse.sqfC: fn_buyHouse.sqf
Alles anzeigen#include <macro.h> /* Author: Bryan "Tonic" Boardwine modified by moeck Description: Buys the house? */ private["_house","_uid","_unit","_action","_houseCfg","_check"]; _house = [_this,0,ObjNull,[ObjNull]] call BIS_fnc_param; _check = [_this,1,false,[true]] call BIS_fnc_param; _unit = player; _uid = getPlayerUID player; if(isNull _house) exitWith {}; if(!(_house isKindOf "House_F")) exitWith {}; if((_house getVariable["house_owned",false])) exitWith {hint "Dieses Haus ist bereits verkauft!"}; if(!isNil {(_house getVariable "house_sold")}) exitWith {hint localize "STR_House_Sell_Process"}; if(!license_civ_home) exitWith {hint localize "STR_House_License"}; if(count life_houses >= (__GETC__(life_houseLimit))) exitWith {hint format[localize "STR_House_Max_House",__GETC__(life_houseLimit)]}; closeDialog 0; _houseCfg = [(typeOf _house)] call life_fnc_houseConfig; if(count _houseCfg == 0) exitWith {}; if !(_check) then { _action = [ format[localize "STR_House_BuyMSG", [(_houseCfg select 0)] call life_fnc_numberText, (_houseCfg select 1)],localize "STR_House_Purchase",localize "STR_Global_Buy",localize "STR_Global_Cancel" ] call BIS_fnc_guiMessage; } else {_action = true;}; if(life_atm5cash < (_houseCfg select 0)) exitWith {hint localize "STR_House_NotEnough"}; if(_action) then { //[[_uid,_house],"TON_fnc_addHouse",false,false] spawn life_fnc_MP; if !(_check) exitWith{[[_unit,_house],"TON_fnc_addHouse",false,false] spawn life_fnc_MP;}; _house setVariable["house_owner",[_uid,profileName],true]; _house setVariable["locked",true,true]; _house setVariable["Trunk",[[],0],true]; _house setVariable["containers",[],true]; _house setVariable["uid",round(random 99999),true]; life_atm5cash = life_atm5cash - (_houseCfg select 0); life_2vehicles pushBack _house; life_houses pushBack [str(getPosATL _house),[]]; hint "Dein Haus wird im Grundbuch eingetragen... Bitte warten..."; //Anti CB Log _marker = createMarkerLocal [format["house_%1",(_house getVariable "uid")],getPosATL _house]; _houseName = getText(configFile >> "CfgVehicles" >> (typeOf _house) >> "displayName"); _marker setMarkerTextLocal _houseName; _marker setMarkerColorLocal "ColorBlue"; _marker setMarkerTypeLocal "loc_Lighthouse"; _numOfDoors = getNumber(configFile >> "CfgVehicles" >> (typeOf _house) >> "numberOfDoors"); for "_i" from 1 to _numOfDoors do { _house setVariable[format["bis_disabled_Door_%1",_i],1,true]; [] call SOCK_fnc_syncData; //Anti CB Log sleep 5; //Anti CB Log hint "Dein Haus ist nun angemeldet..."; //Anti CB Log }; };
und zu guter letzt fn_addHouse.sqf im life_server
C: fn_addHouse.sqf
Alles anzeigen/* Author: Bryan "Tonic" Boardwine modified by moeck Description: Blah */ private["_house","_uid","_unit","_housePos","_query","_owned"]; _unit = [_this,0,ObjNull,[ObjNull]] call BIS_fnc_param; _uid = getPlayerUID _unit; _house = [_this,1,ObjNull,[ObjNull]] call BIS_fnc_param; if(isNull _house OR _uid == "") exitWith {}; _housePos = getPosATL _house; waitUntil{!DB_Async_Active}; _query = format["SELECT id,pid,pos,inventory,containers,owned FROM houses WHERE pos='%1'",_housePos]; _queryResult = [_query,2] call DB_fnc_asyncCall; //dialog{"Query %1" _queryResult}; if (count _queryResult == 0) then { _owned = 0; } else { _owned = (_queryResult select 5); }; if (_owned == 1) then { _house setVariable["house_id",(_queryResult select 0),true]; _house setVariable["pid",(_queryResult select 1),true]; _house setVariable["pos",(_queryResult select 2),true]; _house setVariable["house_owned",true,true]; [[_house,true],"life_fnc_buyHouse",_unit,false] spawn life_fnc_MP; exit; } else { _query = format["INSERT INTO houses (pid, pos, inventory, containers, owned) VALUES('%1', '%2', '""[[],0]""', '""[]""', '1')",_uid,_housePos]; diag_log format["Query: %1",_query]; waitUntil{!DB_Async_Active}; [_query,1] call DB_fnc_asyncCall; sleep 0.3; waitUntil{!DB_Async_Active}; _query = format["SELECT id,pid,pos,inventory,containers,owned FROM houses WHERE pos='%1' AND pid='%2' AND owned='1'",_housePos,_uid]; _queryResult = [_query,2] call DB_fnc_asyncCall; //systemChat format["House ID assigned: %1",_queryResult select 0]; _house setVariable["pid",(_queryResult select 1),true]; _house setVariable["pos",(_queryResult select 2),true]; _house setVariable["house_id",(_queryResult select 0),true]; _house setVariable["house_owned",false,true]; [[_house,true],"life_fnc_buyHouse",_unit,false] spawn life_fnc_MP; };
@blackfisch: eventuell kannst Du mir mal was per PN zu der Lücke schreiben. Danke.
in diesem Sinne angehme Nachtruhe.
Gruß,
moeck -
Hi,
so meinen Tests sind schon wieder ein Stück weiter und mittlerweile funktioniert auch das Einfügen in die DB.
Allerdings gibt es noch ein kleineres Problem mit dem Funktionsaufruf am Client.
ich bin mir noch nicht sicher was anstelle des ? rein muss damit es wieder an den richtigen client geht. Sobald ich true eingebe bekommen die Meldungen alle Spieler
-
Hi,
so also die fn_addHouse funktioniert jetzt.
C: fn_addHouse.sqf
Alles anzeigen/* Author: Bryan "Tonic" Boardwine modified by moeck Description: Blah */ private["_house","_uid","_housePos","_query","_owned"]; _uid = [_this,0,"",[""]] call BIS_fnc_param; _house = [_this,1,ObjNull,[ObjNull]] call BIS_fnc_param; if(isNull _house OR _uid == "") exitWith {}; _housePos = getPosATL _house; waitUntil{!DB_Async_Active}; _query = format["SELECT id,pid,pos,inventory,containers,owned FROM houses WHERE pos='%1'",_housePos]; _queryResult = [_query,2] call DB_fnc_asyncCall; //dialog{"Query %1" _queryResult}; if (count _queryResult == 0) then { _owned = 0; } else { _owned = (_queryResult select 5); }; if (_owned == 1) then { _house setVariable["house_id",(_queryResult select 0),true]; _house setVariable["pid",(_queryResult select 1),true]; _house setVariable["pos",(_queryResult select 2),true]; _house setVariable["house_owned",true,true]; [[_house,_uid],"life_fnc_buyHouse",false,false] spawn life_fnc_MP; exit; } else { _query = format["INSERT INTO houses (pid, pos, inventory, containers, owned) VALUES('%1', '%2', '""[[],0]""', '""[]""', '1')",_uid,_housePos]; diag_log format["Query: %1",_query]; waitUntil{!DB_Async_Active}; [_query,1] call DB_fnc_asyncCall; }; sleep 0.3; waitUntil{!DB_Async_Active}; _query = format["SELECT id FROM houses WHERE pos='%1' AND pid='%2' AND owned='1'",_housePos,_uid]; _queryResult = [_query,2] call DB_fnc_asyncCall; //systemChat format["House ID assigned: %1",_queryResult select 0]; _house setVariable["house_id",(_queryResult select 0),true];
aber ich habe noch einen Denkfehler in der fn_buyHouse.C: fn_buyHouse
Alles anzeigen#include <macro.h> /* Author: Bryan "Tonic" Boardwine Description: Buys the house? */ private["_house","_uid","_action","_houseCfg"]; _house = [_this,0,ObjNull,[ObjNull]] call BIS_fnc_param; _uid = getPlayerUID player; hint format ["Haus owned %1",(_house getVariable["house_owned",false])]; if(isNull _house) exitWith {}; if(!(_house isKindOf "House_F")) exitWith {}; if((_house getVariable["house_owned",false])) exitWith {hint "Dieses Haus ist bereits verkauft!"}; if(!isNil {(_house getVariable "house_sold")}) exitWith {hint localize "STR_House_Sell_Process"}; if(!license_civ_home) exitWith {hint localize "STR_House_License"}; if(count life_houses >= (__GETC__(life_houseLimit))) exitWith {hint format[localize "STR_House_Max_House",__GETC__(life_houseLimit)]}; closeDialog 0; _houseCfg = [(typeOf _house)] call life_fnc_houseConfig; if(count _houseCfg == 0) exitWith {}; _action = [ format[localize "STR_House_BuyMSG", [(_houseCfg select 0)] call life_fnc_numberText, (_houseCfg select 1)],localize "STR_House_Purchase",localize "STR_Global_Buy",localize "STR_Global_Cancel" ] call BIS_fnc_guiMessage; if(life_atm5cash < (_houseCfg select 0)) exitWith {hint localize "STR_House_NotEnough"}; if(_action) then { [[_uid,_house],"TON_fnc_addHouse",false,false] spawn life_fnc_MP; _house setVariable["house_owner",[_uid,profileName],true]; _house setVariable["locked",true,true]; _house setVariable["Trunk",[[],0],true]; _house setVariable["containers",[],true]; _house setVariable["uid",round(random 99999),true]; life_atm5cash = life_atm5cash - (_houseCfg select 0); life_2vehicles pushBack _house; life_houses pushBack [str(getPosATL _house),[]]; hint "Dein Haus wird im Grundbuch eingetragen... Bitte warten..."; //Anti CB Log _marker = createMarkerLocal [format["house_%1",(_house getVariable "uid")],getPosATL _house]; _houseName = getText(configFile >> "CfgVehicles" >> (typeOf _house) >> "displayName"); _marker setMarkerTextLocal _houseName; _marker setMarkerColorLocal "ColorBlue"; _marker setMarkerTypeLocal "loc_Lighthouse"; _numOfDoors = getNumber(configFile >> "CfgVehicles" >> (typeOf _house) >> "numberOfDoors"); for "_i" from 1 to _numOfDoors do { _house setVariable[format["bis_disabled_Door_%1",_i],1,true]; [] call SOCK_fnc_syncData; //Anti CB Log sleep 5; //Anti CB Log hint "Dein Haus ist nun angemeldet..."; //Anti CB Log }; };
wenn ich die Funktion addHouse aufrufe wartet das script nicht oder? sondern macht einfach weiter
-
alles klar werde es gleich testen
-
-
ja das ist alles korrekt ich muss es halt zum client zurückbringen. wie gesagt sollte eigentlich so funktionieren wie oben gepostet. Da ich momentan aber noch bei der Arbeit rumhänge kann ich es leider nicht testen. Wenn es funktioniert kann man das ja in den Standard überführen, da es auch in der 4.4. noch nicht drin ist.
-
Ich habe mir eben noch mal gedanken gemacht und bin da auch über den ersten Post SanDiego gestolpert. Theoretisch müsste es reichen den folgenden Code die fn_addHouse.sqf so zu modifizieren.
C: fn_addHouse.sqf
Alles anzeigen/* Author: Bryan "Tonic" Boardwine modified by moeck Description: Blah */ private["_house","_uid","_housePos","_query","_owned"]; _uid = [_this,0,"",[""]] call BIS_fnc_param; _house = [_this,1,ObjNull,[ObjNull]] call BIS_fnc_param; if(isNull _house OR _uid == "") exitWith {}; _housePos = getPosATL _house; waitUntil{!DB_Async_Active}; _query = format["SELECT * FROM houses WHERE pos='%1'",_housePos]; _queryResult = [_query,1] call DB_fnc_asyncCall; _owned = _queryResult select 5; if (_owned == 1) exitWith { _house setVariable["house_id",(_queryResult select 0),true]; _house setVariable["pid",(_queryResult select 1),true]; _house setVariable["pos",(_queryResult select 2),true]; _house setVariable["house_owned",(_queryResult select 5),true]; [[_house,_uid],"life_fnc_buyHouse",false,false] spawn life_fnc_MP; } else { _query = format["INSERT INTO houses (pid, pos, inventory, containers, owned) VALUES('%1', '%2', '""[[],0]""', '""[]""', '1')",_uid,_housePos]; diag_log format["Query: %1",_query]; waitUntil{!DB_Async_Active}; [_query,1] call DB_fnc_asyncCall; }; sleep 0.3; waitUntil{!DB_Async_Active}; _query = format["SELECT id FROM houses WHERE pos='%1' AND pid='%2' AND owned='1'",_housePos,_uid]; _queryResult = [_query,2] call DB_fnc_asyncCall; //systemChat format["House ID assigned: %1",_queryResult select 0]; _house setVariable["house_id",(_queryResult select 0),true];
Die Funktion wird ja von der fn_buyHouse aufgerufen und anschliessend rufe ich ja die buyHouse Funktionen mit den gefunden Haus wieder auf. Solange ich jetzt nicht einem grundsätzlichen Denkfehler unterliege sollte das funktionieren.
Ich werde das heute Abend mal testen und melde mich wieder.
Gruß,
moeck -
also die SQL Abfrage ist auf jeden Fall korrekt, da bin ich mir zu 100% sicher. Was das angeht habe ich schon ein "wenig" erfahrung. Es geht halt nur darum, dass die Daten an die richtige Funktion zurückgeliefert werden.
Es mag sein, dass die 4.4er benutzerfreundlicher ist, allerdings müssten man alles was bisher für den Server entwickelt wurde portieren und das macht momentan wahrscheinlich mehr arbeit als die vorhanden Bugs zu suchen und zu fixen.
Wie gesagt ich habe auch schon in der 4.4er das eine oder andere gesehen was suboptimal gelöst ist.
-
Moin,
ja genau das ist ja auch mein Plan ;-). Falls Du dir mal die Zeilen 14 -17 anschaust in der addHouse habe ich die Prüfung entsprechend eingebaut. Ich bin mir momentan nur nicht sicher ob das mit dem Rückgabewerte an die buyHouse so funktioniert oder nicht. Da ich erst vor knapp 4 Wochen mit dem Thema angefangen habe, muss ich halt ab und an noch nachfragen.
In der Regel komme ich schon ganz gut damit zu recht und habe auf unserem Server auch schon das eine oder andere gebaut. Zum Beispiel einen kleinen Schutz gegen Speedklicker am ATM. Leider gibt es momentan bei uns nur 2 Neulinge inkl. mir als Scripter.
Wenn ich mir den Code der 3.1.4.8 anschaue gibt es auf jeden Fall noch eine Menge zu tun um einige Bereiche entsprechend zu verbessern bzw. mal aufzuräumen.
Ich habe mir gestern spasses halber mal die 4.4. angeschaut aber gerade beim Housing habe ich ähnliche Schwachstellen gesehen.
Danke schon mal für die Hilfe.
Gruß,
moeck -
Moin,
ja trotzdem gibt es immer mal wieder Probleme, ich bin mir zwar nicht 100%ig sicher aber er scheint die infos nicht aus der DB zu holen sondern vom Client. Ich hatte gestern testweise einfach mal den Button im HouseMenu immer aktiviert und das Script hat das Haus immer in der DB gespeichert. Daher war die Intension, dass ich das nochmal vor dem Speichern gegen die DB prüfe. Siehst du hier noch Potenzial oder bin ich auf dem Holzweg?
Gruß,
moeck -
Moin,
ich hätte da mal eine kleines Thema zum frühen Morgen. Wir haben auf unserem Server ab und an das Problem, dass Häuser doppelt verkauft werden und dies ist natürlich für alle Beteiligten nicht so schön. Vorallem da nicht sicher ist welches Inventar gerade geladen wird. Daher habe ich mir mal die Funktionen angeschaut und bin darauf gestossen, dass es leider keinerlei Sicherheits Mechanismen in den Scripten gibt. Heisst wenn aus irgendeinem Gund der Haus kaufen Button aktiv ist, kann ich ohne weiteres das Haus für mich beanspruchen.
Da ich noch nicht so lange scripte, wollte ich Euch fragen ob ihr Euch die 2 Scripte mal anschaut und mir gegebenfalls einen Hinweis gebt. Ich bin mir nämlich nicht ganz sicher ob das mit dem Rückgabewert so richtig ist.
C: \core\housing\fn_buyHouse.sqf
Alles anzeigen#include <macro.h> /* Author: Bryan "Tonic" Boardwine modified by moeck Description: Buys the house? */ private["_house","_uid","_action","_houseCfg",_"owned"]; _house = [_this,0,ObjNull,[ObjNull]] call BIS_fnc_param; _uid = getPlayerUID player; if(isNull _house) exitWith {}; if(!(_house isKindOf "House_F")) exitWith {}; if((_house getVariable["house_owned",false])) exitWith {hint "This house is already owned even though you shouldn't be seeing this hint..."}; if(!isNil {(_house getVariable "house_sold")}) exitWith {hint localize "STR_House_Sell_Process"}; if(!license_civ_home) exitWith {hint localize "STR_House_License"}; if(count life_houses >= (__GETC__(life_houseLimit))) exitWith {hint format[localize "STR_House_Max_House",__GETC__(life_houseLimit)]}; closeDialog 0; _houseCfg = [(typeOf _house)] call life_fnc_houseConfig; if(count _houseCfg == 0) exitWith {}; _action = [ format[localize "STR_House_BuyMSG", [(_houseCfg select 0)] call life_fnc_numberText, (_houseCfg select 1)],localize "STR_House_Purchase",localize "STR_Global_Buy",localize "STR_Global_Cancel" ] call BIS_fnc_guiMessage; if(life_atm5cash < (_houseCfg select 0)) exitWith {hint localize "STR_House_NotEnough"}; if(_action) then { [[_uid,_house],"TON_fnc_addHouse",false,false] spawn life_fnc_MP; _owned = (_house getVariable "owned"); if (_owned != 1) then { _house setVariable["house_owner",[_uid,profileName],true]; _house setVariable["locked",true,true]; _house setVariable["Trunk",[[],0],true]; _house setVariable["containers",[],true]; _house setVariable["uid",round(random 99999),true]; life_atm5cash = life_atm5cash - (_houseCfg select 0); life_2vehicles pushBack _house; life_houses pushBack [str(getPosATL _house),[]]; hint "Dein Haus wird im Grundbuch eingetragen... Bitte warten..."; //Anti CB Log _marker = createMarkerLocal [format["house_%1",(_house getVariable "uid")],getPosATL _house]; _houseName = getText(configFile >> "CfgVehicles" >> (typeOf _house) >> "displayName"); _marker setMarkerTextLocal _houseName; _marker setMarkerColorLocal "ColorBlue"; _marker setMarkerTypeLocal "loc_Lighthouse"; _numOfDoors = getNumber(configFile >> "CfgVehicles" >> (typeOf _house) >> "numberOfDoors"); for "_i" from 1 to _numOfDoors do { _house setVariable[format["bis_disabled_Door_%1",_i],1,true]; [] call SOCK_fnc_syncData; //Anti CB Log sleep 5; //Anti CB Log hint "Dein Haus ist nun angemeldet..."; //Anti CB Log }; } else { hint "Sorry aber das Haus gehört bereits jemand anderem!" }; };
und hier die 2. Datei (Funktion)C: lifeserver\Functions\Housing\fn_addHouse.sqf
Alles anzeigen/* Author: Bryan "Tonic" Boardwine modified by moeck Description: Blah */ private["_house","_uid","_housePos","_query","_owned"]; _uid = [_this,0,"",[""]] call BIS_fnc_param; _house = [_this,1,ObjNull,[ObjNull]] call BIS_fnc_param; if(isNull _house OR _uid == "") exitWith {}; _housePos = getPosATL _house; waitUntil{!DB_Async_Active}; _query = format["SELECT * FROM houses WHERE pos='%1'",_housePos]; _queryResult = [_query,1] call DB_fnc_asyncCall; _owned = _queryResult select 5; if (_owned == 1) then { _house setVariable["house_id",(_queryResult select 0),true]; _house setVariable["pid",(_queryResult select 1),true]; _house setVariable["pos",(_queryResult select 2),true]; _house setVariable["owned",(_queryResult select 5),true]; [[_house],"life_fnc_buyHouse",false,false] spawn life_fnc_MP; exit; } else { _query = format["INSERT INTO houses (pid, pos, inventory, containers, owned) VALUES('%1', '%2', '""[[],0]""', '""[]""', '1')",_uid,_housePos]; diag_log format["Query: %1",_query]; waitUntil{!DB_Async_Active}; [_query,1] call DB_fnc_asyncCall; }; sleep 0.3; waitUntil{!DB_Async_Active}; _query = format["SELECT id FROM houses WHERE pos='%1' AND pid='%2' AND owned='1'",_housePos,_uid]; _queryResult = [_query,2] call DB_fnc_asyncCall; //systemChat format["House ID assigned: %1",_queryResult select 0]; _house setVariable["house_id",(_queryResult select 0),true];
Schon mal vielen Dank im Voraus.
Gruß,
moeck -
ok, dann gehe bitte wie folgt vor.
1. melde mich mit deinem User an mit dem du den Server starten möchtest. Am besten nicht mit "root"
2. schau dir mal das script von b4v4r!4n_str!k3r an. Das kannst du eventuell sogar so übernehmen.oder sprich ein Restartscript (ich hab meins mal hochgeladen: armalife.sh und im armalife.txt Dateianhang angehängt) mit crontab an.
Für jemanden, der nicht so gerne selbst herumbastelt ist ein Restartsystem bzw. NTECHIT die einfachere Lösung.3. führe auf der shell den befehl "crontab -e" aus und dort fügst du den folgenden Code ein
Code0 */6 * * * bash /"pfad zu deinem arma"/arma3server restart > /dev/null 2>&1 #Restart aller 6 h */10 * * * * bash /"pfad zu deinem arma"/arma3server restart start > /dev/null 2>&1 #Prüfung ob Arma noch läuft alle 10 min
anschliessend die Datei speichern und fertig. Ich gehe mal davon aus, dass Du noch nicht ganz soviel Erfahrung mit Linux hast.
Gruß,
moeck -
Hast Du auf deinem Server die Rechte Cronjobs anzulegen?
-
Achja hier ist übrigens das TUT dafür Medic TUT
-
Moin,
ich bin gerade dabei eine Verwahrstelle zubauen. Von Grundsatz her ist die auch schon fast fertig bzw. habe ich auch schon eine genau Vorstellung was ich änden muss. Jetzt war der Wunsch unserer Cops, dass man auf den "Ausparkpreis" eventuell fällige Strafen mit draufschlägt. Leider ist mir noch nicht ganz klar wie ich an die Werte aus der WantedListe herankomme. Hat zufällig schon jemand so etwas ähnliches umgesetzt?
Gruß,
moeck -
Wie startest du denn deinen Server?
Unsere cronjobs sehen so aus (Pfade sind abgeändert)
Code0 6 * * * bash /arma3server restart > /dev/null 2>&1 0 0 * * * bash /arma3server restart > /dev/null 2>&1 0 12 * * * bash /arma3server restart > /dev/null 2>&1 0 18 * * * bash /arma3server restart > /dev/null 2>&1 */10 * * * * bash /arma3server start > /dev/null 2>&1
Die ersten vier sind alle 6 Stunden restart, der unterste prüft alle 10 Minuten ob der Server wirklich gestartet ist. Das > /dev/null 2>&1 löscht den Output des Cronjobs, sodass er nicht via mail geschickt wird.
im übrigen kann man das in eine zeile packen wenn man das möchte.
Code0 */6 * * * bash /arma3server restart > /dev/null 2>&1 #Restart aller 6 h */10 * * * * bash /arma3server start > /dev/null 2>&1 #Prüfung ob Arma noch läuft alle 10 min
sorry aber ich mag nun mal kurze shell befehle
-
Code
if(playerSide == independent) then { _Btn5 ctrlSetText localize "STR_vInAct_PullOut"; _Btn5 buttonSetAction "[life_vInact_curTarget] spawn life_fnc_pulloutAction;"; //if(count crew _curTarget == 0) then {_Btn5 ctrlEnable false;}; _Btn4 ctrlSetText "Abschleppen"; _Btn4 buttonSetAction "[life_vInact_curTarget] spawn life_fnc_impoundAction;"; };
-
Moin,
musst Du dir mal core\vehicle\fn_vInteractionMenu.sqf anschauen. Bei Fragen gern melden
-
nur gut dass ich nix mit autos am hut habe. man mags kaum glauben aber es soll auch ganz normale anwendungen da geben. außer wer sagt den, dass ich bei dem einem arbeite misslelauncher