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
CREATE 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.
f (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];
};
};
Alles anzeigen
Diesen ersetzt ihr wie folgt
if(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.
#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];
Alles anzeigen
2.3. fn_receiveDealer.sqf
Ihr legt eine neue Datei namens fn_receiveDealer.sqf
#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;
Alles anzeigen
2.4. Init des NPCs / Object des Dealers
In der Init des Drogendealers muss folgende Anpassung gemacht werden.
this 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
this 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
class 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 {};
};
Alles anzeigen
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.
class 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 {};
};
};
Alles anzeigen
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
/*
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;
};
Alles anzeigen
3.3. Änderung init.sqf
In der life_server\init.sqf sucht ihr Euch folgenden Eintrag heraus
[] 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
//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"];
};
};
Alles anzeigen
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