kann man bestimmt einbauen, allerdings müsste man sich das mal genauer anschauen
Beiträge von moeck
-
-
hmpf, problem ist ich habe keine 5.0 bzw 4.4. zum testen sondern schreibe das für die tuts immer um. ich schaue morgen nochmal nach. oder schaue mal bei dir wie die requestreceive aufgerufen wird
-
es könnte dieser eintrag sein ![BO]_MRAP_0[12]_(hmg_)?F
-
das ist ein faktor _itemFactorOfGroup der wiederum hier verwendet wird _NEWPRICE = _curItemOldPrice-(_itemAmountSold*(_curItemOldPrice/2000)*_itemFactorOfGroup); anscheined kann man damit bestimmen wie stark der Preis pro Gruppe schwanken soll.
Also verät mir das gerade heruntergeladene Script das so
-
So update gemacht, übrigens fehlte die erste Zeile also das include
aber hier auch nochmal die geänderte Datei
inklusive dem umbau auf remoteExec
C: fn_receiveDealer.sqf
Alles anzeigen#include "..\..\script_macros.hpp" /* File: fn_receiveDealer.sqf Author: moeck (Lost of Paradise) Description: Get the answer from the dealer */ params [ ["_sellers",[],[[]]] ,["_shop","",[""]] ]; if( _sellers isEqualTo []) exitWith {hint localize "STR_Cop_DealerQuestion"}; //No data. life_action_inUse = true; _crimes = LIFE_SETTINGS(getArray,"crimes"); _names = ""; { _val = 0; if ((_x select 2) > 150000) then { _val = round((_x select 2) / 16); } else { _val = ["483",_crimes] call TON_fnc_index; _val = ((_crimes select _val) select 1); if (_val isEqualType "") then { _val = parseNumber _val; }; }; [(_x select 0),(_x select 1),"483",_val] remoteExecCall ["life_fnc_wantedAdd",RSERV]; _names = _names + format ["%1<br/>",(_x select 1)]; true } count _sellers; hint parseText format [(localize "STR_Cop_DealerMSG")+ "<br/><br/>%1",_names]; [2,_shop,player,0] remoteExec ["DB_fnc_shops",RSERV]; life_action_inUse = false;
-
ups, da habe ich noch so nen life_fnc_MP vergessen
ändere das dann
-
BeFreezy klar geht es auch mit einer Variablen, daher hatte ich ja geschrieben dass lizenz oder coplevel 2 von mehreren Möglichkeiten sind. Man kann auch den Kontostand oder Waffe oder oder nehmen
ganz nach dem eigenen geschmack
-
zu viele
über 5,1k
-
so als tipp über lizenz oder coplevel wären 2 von mehreren möglichkeiten
-
#Update: nun durchgetestet und funktionsfähig
-
so und welches Fahrzeug hast du eingefügt?
-
Lad Dir mal die common.hpp und newsStation.hpp aus dem Framework runter.
-
Moin,
ja kann funktionieren nur gibt es die Herausforderung, die passenden Leute zu finden. Leider gibt es zum Beispiel gute Scripter nicht wie Sand am Meer. Die meisten Scripter, die nicht nur per Copy & Paste arbeiten haben in der Regel schon ein Projekt oder sind mittlerweile nicht mehr im Arma Umfeld aktiv. Klar kann man alles lernen und vor 1,5 Jahren war ich selbst noch ein Neuling im Scripten, aber ich denke das ist eher die Ausnahme.
Des Weiteren gibt es mittlerweile eine relativ starke Konkurenz im Umfeld Altis Life mit den GTA Mod und aktuell sehe ich halt einfach relativ viele Leute Richtung GTA abwandern, da man dort einfach von Haus aus mehr Möglichkeiten hat und das Ganze nicht so militärisch angehaucht ist.
Es käme halt auf einen Versuch an sofern es Projekt gibt, die sich auf so ein Experiment einlassen.
Gruß,
moeck
-
Dann solltest du mal in deinen BEFiltern schauen ob da etwas gelistet ist
. Vermutlich in der attachto.txt
-
So je nachdem welche Variante Du nutzen möchtest musst Du halten den Aufruf gestalten. In meinem Beispiel würde das wie folgt aussehen
Erstelle im Ordner core\functions\ die Datei fn_skinChange.sqf mit folgendem Inhalt
C: fn_skinChange.sqf
Alles anzeigen/* Skinwechsel Author: moeck Description: Changes Skin of a special unit. */ private _skin = 0; if (playerside isEqualTo west) then { if (isNil (player getVariable ["special"]) exitWith { player setVariable ["special",0,true]; [] call life_fnc_playerSkins; }; _skin = (player getVariable ["special",0,[0]]); if (_skin isEqualto 0) exitWith { player setVariable ["special",1,true]; [] call life_fnc_playerSkins; }; if (_skin isEqualto 1) exitWith { player setVariable ["special",0,true]; [] call life_fnc_playerSkins; }; };
füge dann noch in der Functions.hpp class skinChange {}; unter functions ein.
In die Init des Schildes muss dann noch der Aufruf
Codethis addAction["Umziehen",life_fnc_skinChange,"",0,false,false,"",'playerSide isEqualTo west'];
Achtung, du musst auch noch eine entsprechende Anpassung in der fn_playerSkins.sqf machen, damit der Skin geladen wird.
Gruß,
moeck
-
Moin,
da wir random Drogendealer nutzen und auch weitere illegale Shops auf der Insel haben, wollten wir eine Möglichkeit schaffen, diese von den Cops prüfen zu lassen. Da mir persönlich die Implementierung im Standard Framework nicht gefallen hat, habe ich das Ganze jetzt mal an unsere Bedürfnisse angepasst.
Wenn man jetzt was beim Drogendealer verkauft landet das in der Datenbank und die Cops können das dann auch entsprechend abfragen. Des Weiteren kann man relativ einfach weitere Shops in das System einbinden ohne dass man hier viel ändern muss.
Bevor wir loslegen, gilt wie immer, daß ihr das Tutorial gern benutzen allerdings nicht in anderen Foren oder Plattformen veröffentlich dürft.
1. Anlegen einer neuen Tabelle
SQLCREATE TABLE IF NOT EXISTS `shops` ( `uid` int(6) NOT NULL AUTO_INCREMENT, `name` varchar(32) NOT NULL, `pid` varchar(17) NOT NULL, `shop` varchar(17) NOT NULL, `value` int(100) NOT NULL DEFAULT '0', PRIMARY KEY (`uid`), KEY `pid` (`pid`), KEY `shop` (`shop`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 AUTO_INCREMENT=12 ;
2. Änderungen in der Mission
2.1. fn_virt_sell.sqf
Hier sucht ihr Euch folgenden Eintrag raus.
C
Alles anzeigenf (life_shop_type isEqualTo "drugdealer") then { private ["_array","_ind","_val"]; _array = life_shop_npc getVariable ["sellers",[]]; _ind = [getPlayerUID player,_array] call TON_fnc_index; if (!(_ind isEqualTo -1)) then { _val = ((_array select _ind) select 2); _val = _val + _price; _array set[_ind,[getPlayerUID player,profileName,_val]]; life_shop_npc setVariable ["sellers",_array,true]; } else { _array pushBack [getPlayerUID player,profileName,_price]; life_shop_npc setVariable ["sellers",_array,true]; }; };
Diesen ersetzt ihr wie folgt
Codeif(life_shop_type in ["drugdealer"]) then { private _shop = if (life_shop_type isEqualTo "drugdealer") then {(vehicleVarName life_shop_npc)} else {_type}; [1,_shop,player,_price] remoteExec ["DB_fnc_shops",RSERV]; };
Sollte ihr weitere Shops einbinden wollen, einfach das Array ["drugdealer"] um den entsprechenden Eintrag erweitern.
2.2. fn_questionDealer.sqf
Die komplette Datei ersetzt ihr durch die folgende.
C: fn_questionDealer.sqf
Alles anzeigen#include "..\..\script_macros.hpp" /* File: fn_questionDealer.sqf Author: Bryan "Tonic" Boardwine modified by moeck Description: Questions the drug dealer and sets the sellers wanted. */ params [ "" ,"" ,"" ,["_shop","",[""]] ]; if (_shop isEqualTo "") exitWith {}; [0,_shop,player,0] remoteExec ["DB_fnc_shops",RSERV];
2.3. fn_receiveDealer.sqf
Ihr legt eine neue Datei namens fn_receiveDealer.sqf
Code
Alles anzeigen#include "..\..\script_macros.hpp" /* File: fn_receiveDealer.sqf Author: moeck (Lost of Paradise) Description: Get the answer from the dealer */ params [ ["_sellers",[],[[]]] ,["_shop","",[""]] ]; if( _sellers isEqualTo []) exitWith {hint localize "STR_Cop_DealerQuestion"}; //No data. life_action_inUse = true; _crimes = LIFE_SETTINGS(getArray,"crimes"); _names = ""; { _val = 0; if ((_x select 3) > 150000) then { _val = round((_x select 3) / 16); } else { _val = ["483",_crimes] call TON_fnc_index; _val = ((_crimes select _val) select 1); if (_val isEqualType "") then { _val = parseNumber _val; }; }; [(_x select 0),(_x select 1),"483",_val] remoteExecCall ["life_fnc_wantedAdd",RSERV]; _names = _names + format ["%1<br/>",(_x select 1)]; true } count _sellers; hint parseText format [(localize "STR_Cop_DealerMSG")+ "<br/><br/>%1",_names]; [2,_shop,player,0] remoteExec ["DB_fnc_shops",RSERV]; life_action_inUse = false;
2.4. Init des NPCs / Object des Dealers
In der Init des Drogendealers muss folgende Anpassung gemacht werden.
Codethis addAction[localize "STR_MAR_Question_Dealer",life_fnc_questionDealer,"",0,false,false,"",' isNull objectParent player && player distance _target < 5 && playerSide isEqualTo west && !life_action_inUse'];
den Eintrag ersetzt ihr mit diesem hier
Codethis addAction[localize "STR_MAR_Question_Dealer",life_fnc_questionDealer,"Dealer_1",0,false,false,"",' isNull objectParent player && player distance _target < 5 && playerSide isEqualTo west && !life_action_inUse'];
Achtung ihr müsst natürlich schauen um welchen Dealer es sich handelt und den Wert entsprechend anpassen. Also dann für die anderen Dealer halt "Dealer_2" oder "Dealer_3" verwenden! Oder falls es um einen anderen Shop geht halt das Gewünscht Item (z.B. turtle_soup)
2.5. Anpassung CfgRemoteExec.hpp
Ihr müsst natürlich die Nutzung der neuen Funktion noch erlauben. Fügt in die CfgRemoteExec.hpp folgendes ein
2.6. Anpassungen Functions.hpp
In der class Copmuss die neue Funktion noch definiert werden
Code
Alles anzeigenclass Cop { file = "core\cop"; class bountyReceive {}; class containerInvSearch {}; class copInteractionMenu {}; class copLights {}; class copLoadout {}; class copMarkers {}; class copSearch {}; class copSiren {}; class doorAnimate {}; class fedCamDisplay {}; class licenseCheck {}; class licensesRead {}; class questionDealer {}; class radar {}; class repairDoor {}; class restrain {}; class searchClient {}; class seizeClient {}; class sirenLights {}; class spikeStripEffect {}; class ticketGive {}; class ticketPaid {}; class ticketPay {}; class ticketPrompt {}; class vehInvSearch {}; class wantedGrab {}; class receiveDealer {}; };
So das wars auch schon in der Mission
3. Änderungen life_server
3.1. config.cpp
Hier sucht ihr Euch den Eintrag MySQL_Database raus und fügt unten class shops {}; ein. Das sieht dann ungefähr so aus.
Code
Alles anzeigenclass MySQL_Database { tag = "DB"; class MySQL { file = "\life_server\Functions\MySQL"; class numberSafe {}; class mresArray {}; class queryRequest{}; class asyncCall{}; class insertRequest{}; class updateRequest{}; class mresToArray {}; class insertVehicle {}; class bool {}; class mresString {}; class updatePartial {}; class shops {}; }; };
3.2. fn_shops.sqf
Ihr geht in den Ordner \life_server\Functions\MySQL und erstellt dort die Datei fn_shops.sqf mit folgendem Inhalt
C: fn_shops.sqf
Alles anzeigen/* File: fn_shops Author: moeck handle the shops if actions are stored to the DB modes: 0: just get the info from DB 1: add or update an existing record 2: delete shop entries */ params [ ["_mode",0,[0]] ,["_shop","",[""]] ,["_unit",objNull,[objNull]] ,["_value",0,[0]] ]; //Stop bad data being passed. if (_shop isEqualTo "") exitWith {diag_log "Fehler fn_shops, es fehlt der shop!"}; private _uid = getPlayerUID _unit; private _name = name _unit; private _query = ""; private _queryResult = []; //_value = [_value] call DB_fnc_numberSafe; //Check shop entries if (_mode isEqualTo 0) exitWith { _query = format ["select pid, name, shop, value from shops where shop = '%1'", _shop]; _queryResult = [_query,2,true] call DB_fnc_asyncCall; [_queryResult,_shop] remoteExec ["life_fnc_receiveDealer",_unit]; }; //Add or update a record if (_mode isEqualTo 1) exitWith { if ( _unit isEqualTo objNull || _value isEqualTo 0) exitWith {diag_log "Fehler fn_shops, es fehlen unit oder value ist 0!"}; _query = format ["select pid, name, shop, value from shops where shop = '%1' and pid = '%2'", _shop,_uid]; _queryResult = [_query,2] call DB_fnc_asyncCall; if (_queryResult isEqualTo []) then { _query = format ["insert into shops (pid, name, shop, value) Values ('%1', '%2', '%3', '%4')", _uid ,_name ,_shop ,_value ]; [_query,1] call DB_fnc_asyncCall; } else { _oldvalue = (_queryResult select 3); _value = _oldvalue + _value; _query = format ["update shops set `value` = '%1' where pid = '%2' and shop = '%3'", _value ,_uid ,_shop ]; [_query,1] call DB_fnc_asyncCall; }; }; //Delete records for a shop if (_mode isEqualTo 2) exitWith { _query = format ["delete from shops where shop = '%1'",_shop]; [_query,1] call DB_fnc_asyncCall; };
3.3. Änderung init.sqf
In der life_server\init.sqf sucht ihr Euch folgenden Eintrag heraus
Code[] spawn { for "_i" from 0 to 1 step 0 do { uiSleep (30 * 60); { _x setVariable ["sellers",[],true]; } forEach [Dealer_1,Dealer_2,Dealer_3]; }; };
und ersetzt diesen durch das
Code
Alles anzeigen//Remove old dealer entries { [2,_x,objNull,0] call DB_fnc_shops; true } count ["Dealer_1","Dealer_2","Dealer_3"]; //clear every 30 minutes the dealer list [] spawn { for "_i" from 0 to 1 step 0 do { uiSleep (30 * 60); { [2,_x,objNull,0] call DB_fnc_shops; true } count ["Dealer_1","Dealer_2","Dealer_3"]; }; };
Falls ihr wie oben weitere Shops hinzugefügt habt müsst ihr das Array wieder entsprechend erweitern mit dem gewünschten Shop bzw. Item (z.B. turtle_soup).
Damit wären wir dann auch schon wieder fertig.
Viel Spaß damit.
Gruß,
moeck
-
-
also blackfisch warum das den nicht
.
-
Moin,
habe es gestern leider nicht mehr geschafft
zu antworten. Nach meiner bisherigen Erfahrung kann das nur gelingen, wenn man sich mit den "richtigen" Leuten zusammenschließt. Heißt die Chemie zwischen den Beteiligten muss passen, sonst kann man das direkt wieder beerdigen. Des Weiteren müssen alle Beteiligten über ein gewisse geistige Reife verfügen und auch in der Lage sein Kompromisse einzugehen. So da das noch nicht reicht müssen sich auch die Beteiligten darüber einig sein ob es ein modded oder vanilla Projekt wird
.
Nur so als Beispiel blackfisch und ich würdsen uns wahrscheinlich nicht einig werden was das Thema modded oder vanilla angeht
. blackfisch zieht nun mal modded Server vor und ich bevorzuge nun mal vanilla.
Grundsätzlich spricht nix gegen jüngere Projektmitglieder aber, wenn da 2 Generationen auf einander prallen birgt das doch einiges an Konfliktpotenzial. Des Weiteren ist darauf zu achten, dass der Kreis der "Entscheider" nicht zu groß wird. In meinem vorherigen Projekt war es so, dass alle Teammitglieder über Verbesserungsideen und Weiterentwicklungen abgestimmt haben. Dies führt zu fast 3 Jahren stillstand, weil immer irgendjemand etwas gegen eine Veränderung hatte. Erst durch eine neue Projektleitung und einen brauchbaren Scripter ("hust") konnte man dann neue Sachen umsetzen bzw. Dinge verändern.
Gruß,
moeck
-
oder man versucht es so
Code
Alles anzeigen#include "..\..\script_macros.hpp" /* File: Skin System Author: Julian modified by moeck Description: Switch Vehicle Skins by Clicking */ private _vehicle = life_vInact_curTarget; private _type = typeOf _vehicle; private _textures = M_CONFIG(getArray,"LifeCfgVehicles",_type,"textures"); { if ([_x] call life_fnc_levelCheck) then { for "_i" from 0 to (count(_x select 2)-1) step 1 do { _vehicle setObjectTextureGlobal [_i, ((_x select 2) select _i)]; }; true } count _textures;
Edit: ein then vergessen
copy und paste ist keine gute idee
Gruß,
moeck