Eins vorweg:
Hier wird in die Datenbank eingegriffen!
BACKUPS SIND PFLICHT!
Weder ich, noch Native-Network sind für eure Fehler verantwortlich!
Einbau auf EIGENE GEFAHR
Dieses Tutorial sorgt dafür, dass ihr euren Schaden am Auto, sowie die Tankfüllung in der Datenbank speichert.
ES IST NUR AUF "LANDVEHICLE" anwendbar.
Helicopter / Flugzeuge / Boote sind unbetroffen.
Diese nutzen andere Hitpoints
Mir selber waren nur Autos wichtig!
Schritt eins:
Die Datenbank muss erweitert werden:
ALTER TABLE `vehicles`
ADD `fuelstand` float(20,5) NOT NULL DEFAULT '1.00000',
ADD `HitBody` float(20,5) NOT NULL,
ADD `HitEngine` float(20,5) NOT NULL,
ADD `HitFuel` float(20,5) NOT NULL,
ADD `HitLFWheel` float(20,5) NOT NULL,
ADD `HitRFWheel` float(20,5) NOT NULL,
ADD `HitLF2Wheel` float(20,5) NOT NULL,
ADD `HitRF2Wheel` float(20,5) NOT NULL,
ADD `HitLMWheel` float(20,5) NOT NULL,
ADD `HitRMWheel` float(20,5) NOT NULL,
ADD `HitLBWheel` float(20,5) NOT NULL,
ADD `HitRBWheel` float(20,5) NOT NULL
AFTER `inventory`;
Alles anzeigen
Schritt zwei:
ACHTUNG! - FUNKTIONIERT NUR, WENN DIESE DATEIEN NOCH NICHT ANGEPASST WURDEN!
Solltet ihr diese Dateien schon bearbeitet haben, schaut euch die Querys an.
Im Grunde ist es alles was ich mit den *********************************** markiert habe.
Öffne life_server\Functions\System\fn_getVehicles.sqf und ersetzt den Inhalt mit diesem
Spoiler anzeigen
/*
File: fn_getVehicles.sqf
Author: Bryan "Tonic" Boardwine
Description:
Sends a request to query the database information and returns vehicles.
*/
private["_pid","_side","_type","_unit","_ret","_tickTime","_queryResult","_vFuel","_vHitBody","_vHitEngine","_vHitFuel","_vHitLFWheel","_vHitRFWheel","_vHitLF2Wheel","_vHitRF2Wheel","_vHitLMWheel","_vHitRMWheel","_vHitLBWheel","_vHitRBWheel"];
_pid = [_this,0,"",[""]] call BIS_fnc_param;
_side = [_this,1,sideUnknown,[west]] call BIS_fnc_param;
_type = [_this,2,"",[""]] call BIS_fnc_param;
_unit = [_this,3,ObjNull,[ObjNull]] call BIS_fnc_param;
//Error checks
if(_pid == "" OR _side == sideUnknown OR _type == "" OR isNull _unit) exitWith
{
if(!isNull _unit) then
{
[[[]],"life_fnc_impoundMenu",(owner _unit),false] spawn life_fnc_MP;
};
};
_unit = owner _unit;
_side = switch(_side) do
{
case west:{"cop"};
case civilian: {"civ"};
case independent: {"med"};
default {"Error"};
};
if(_side == "Error") exitWith {
[[[]],"life_fnc_impoundMenu",(owner _unit),false] spawn life_fnc_MP;
};
/*
**************************
* DATENBANK
* ORIGINAL QUERY
* _query = format["SELECT id, side, classname, type, pid, alive, active, plate, color FROM vehicles WHERE pid='%1' AND alive='1' AND active='0' AND side='%2' AND type='%3'",_pid,_side,_type];
**************************
*/
_query = format[
"SELECT
id,
side,
classname,
type,
pid,
alive,
active,
plate,
color,
fuelstand,
HitBody,
HitEngine,
HitFuel,
HitLFWheel,
HitRFWheel,
HitLF2Wheel,
HitRF2Wheel,
HitLMWheel,
HitRMWheel,
HitLBWheel,
HitRBWheel
FROM vehicles
WHERE pid='%1' AND alive='1' AND active='0' AND side='%2' AND type='%3'",
_pid,
_side,
_type
];
waitUntil{sleep (random 0.3); !DB_Async_Active};
_tickTime = diag_tickTime;
_queryResult = [_query,2,true] call DB_fnc_asyncCall;
diag_log "------------- Client Query Request -------------";
diag_log format["QUERY: %1",_query];
diag_log format["Time to complete: %1 (in seconds)",(diag_tickTime - _tickTime)];
diag_log format["Result: %1",_queryResult];
diag_log "------------------------------------------------";
if(typeName _queryResult == "STRING") exitWith {
[[[]],"life_fnc_impoundMenu",(owner _unit),false] spawn life_fnc_MP;
};
[[_queryResult],"life_fnc_impoundMenu",_unit,false] spawn life_fnc_MP;
Alles anzeigen
Öffne life_server\Functions\System\fn_vehicleStore.sqf und ersetzt den Inhalt mit diesem
Spoiler anzeigen
/*
File: fn_vehicleStore.sqf
Author: Bryan "Tonic" Boardwine
Description:
Stores the vehicle in the 'Garage'
*/
private["_vehicle","_impound","_vInfo","_vInfo","_plate","_uid","_query","_sql","_unit","_vFuel","_vHitBody","_vHitEngine","_vHitFuel","_vHitLFWheel","_vHitRFWheel","_vHitLF2Wheel","_vHitRF2Wheel","_vHitLMWheel","_vHitRMWheel","_vHitLBWheel","_vHitRBWheel"];
_vehicle = [_this,0,ObjNull,[ObjNull]] call BIS_fnc_param;
_impound = [_this,1,false,[true]] call BIS_fnc_param;
_unit = [_this,2,ObjNull,[ObjNull]] call BIS_fnc_param;
if(isNull _vehicle OR isNull _unit) exitWith {life_impound_inuse = false; (owner _unit) publicVariableClient "life_impound_inuse";life_garage_store = false;(owner _unit) publicVariableClient "life_garage_store";}; //Bad data passed.
_vInfo = _vehicle getVariable["dbInfo",[]];
if(count _vInfo > 0) then
{
_plate = _vInfo select 1;
_uid = _vInfo select 0;
};
/*
**************************
* SPRIT
**************************
*/
_vFuel = fuel _vehicle;
/*
**************************
* DAMAGE ZUWEISUNG
**************************
*/
if (_vehicle isKindOf "LandVehicle") then
{
_vHitBody = _vehicle getHitPointDamage "HitBody";
_vHitEngine = _vehicle getHitPointDamage "HitEngine";
_vHitFuel = _vehicle getHitPointDamage "HitFuel";
_vHitLFWheel = _vehicle getHitPointDamage "HitLFWheel";
_vHitRFWheel = _vehicle getHitPointDamage "HitRFWheel";
_vHitLF2Wheel = _vehicle getHitPointDamage "HitLF2Wheel";
_vHitRF2Wheel = _vehicle getHitPointDamage "HitRF2Wheel";
_vHitLMWheel = _vehicle getHitPointDamage "HitLMWheel";
_vHitRMWheel = _vehicle getHitPointDamage "HitRMWheel";
_vHitLBWheel = _vehicle getHitPointDamage "HitLBWheel";
_vHitRBWheel = _vehicle getHitPointDamage "HitRBWheel";
}else{
_vHitBody = 0;
_vHitEngine = 0;
_vHitFuel = 0;
_vHitLFWheel = 0;
_vHitRFWheel = 0;
_vHitLF2Wheel = 0;
_vHitRF2Wheel = 0;
_vHitLMWheel = 0;
_vHitRMWheel = 0;
_vHitLBWheel = 0;
_vHitRBWheel = 0;
};
if(_impound) then
{
if(count _vInfo == 0) then
{
life_impound_inuse = false;
(owner _unit) publicVariableClient "life_impound_inuse";
if(!isNil "_vehicle" && {!isNull _vehicle}) then {
deleteVehicle _vehicle;
};
}
else
{
/*
**************************
* DATENBANK EINTRAG
* ORIGINAL QUERY
* _query = format["UPDATE vehicles SET active='0' WHERE pid='%1' AND plate='%2'",_uid,_plate];
**************************
*/
_query = format[
"UPDATE vehicles SET
active='0',
fuelstand='%3',
HitBody='%4',
HitEngine='%5',
HitFuel='%6',
HitLFWheel='%7',
HitRFWheel='%8',
HitLF2Wheel='%9',
HitRF2Wheel='%10',
HitLMWheel='%11',
HitRMWheel='%12',
HitLBWheel='%13',
HitRBWheel='%14'
WHERE pid='%1' AND plate='%2'",
_uid,
_plate,
_vFuel,
_vHitBody,
_vHitEngine,
_vHitFuel,
_vHitLFWheel,
_vHitRFWheel,
_vHitLF2Wheel,
_vHitRF2Wheel,
_vHitLMWheel,
_vHitRMWheel,
_vHitLBWheel,
_vHitRBWheel
];
waitUntil {!DB_Async_Active};
_thread = [_query,1] call DB_fnc_asyncCall;
//waitUntil {scriptDone _thread};
if(!isNil "_vehicle" && {!isNull _vehicle}) then {
deleteVehicle _vehicle;
};
life_impound_inuse = false;
(owner _unit) publicVariableClient "life_impound_inuse";
};
}
else
{
if(count _vInfo == 0) exitWith
{
[[1,(localize "STR_Garage_Store_NotPersistent")],"life_fnc_broadcast",(owner _unit),false] spawn life_fnc_MP;
life_garage_store = false;
(owner _unit) publicVariableClient "life_garage_store";
};
if(_uid != getPlayerUID _unit) exitWith
{
[[1,(localize "STR_Garage_Store_NoOwnership")],"life_fnc_broadcast",(owner _unit),false] spawn life_fnc_MP;
life_garage_store = false;
(owner _unit) publicVariableClient "life_garage_store";
};
/*
**************************
* DATENBANK EINTRAG
* ORIGINAL QUERY
* _query = format["UPDATE vehicles SET active='0' WHERE pid='%1' AND plate='%2'",_uid,_plate];
**************************
*/
_query = format[
"UPDATE vehicles SET
active='0',
fuelstand='%3',
HitBody='%4',
HitEngine='%5',
HitFuel='%6',
HitLFWheel='%7',
HitRFWheel='%8',
HitLF2Wheel='%9',
HitRF2Wheel='%10',
HitLMWheel='%11',
HitRMWheel='%12',
HitLBWheel='%13',
HitRBWheel='%14'
WHERE pid='%1' AND plate='%2'",
_uid,
_plate,
_vFuel,
_vHitBody,
_vHitEngine,
_vHitFuel,
_vHitLFWheel,
_vHitRFWheel,
_vHitLF2Wheel,
_vHitRF2Wheel,
_vHitLMWheel,
_vHitRMWheel,
_vHitLBWheel,
_vHitRBWheel
];
waitUntil {!DB_Async_Active};
_thread = [_query,1] call DB_fnc_asyncCall;
//waitUntil {scriptDone _thread};
if(!isNil "_vehicle" && {!isNull _vehicle}) then {
deleteVehicle _vehicle;
};
life_garage_store = false;
(owner _unit) publicVariableClient "life_garage_store";
[[1,(localize "STR_Garage_Store_Success")],"life_fnc_broadcast",(owner _unit),false] spawn life_fnc_MP;
};
Alles anzeigen
Öffne life_server\Functions\System\fn_spawnVehicle.sqf und ersetzt den Inhalt mit diesem
Spoiler anzeigen
/*
File: fn_spawnVehicle.sqf
Author: Bryan "Tonic" Boardwine
Description:
Sends the query request to the database, if an array is returned then it creates
the vehicle if it's not in use or dead.
*/
private["_vid","_sp","_pid","_query","_sql","_vehicle","_nearVehicles","_name","_side","_tickTime","_dir","_vFuel","_vHitBody","_vHitEngine","_vHitFuel","_vHitLFWheel","_vHitRFWheel","_vHitLF2Wheel","_vHitRF2Wheel","_vHitLMWheel","_vHitRMWheel","_vHitLBWheel","_vHitRBWheel"];
_vid = [_this,0,-1,[0]] call BIS_fnc_param;
_pid = [_this,1,"",[""]] call BIS_fnc_param;
_sp = [_this,2,[],[[],""]] call BIS_fnc_param;
_unit = [_this,3,ObjNull,[ObjNull]] call BIS_fnc_param;
_price = [_this,4,0,[0]] call BIS_fnc_param;
_dir = [_this,5,0,[0]] call BIS_fnc_param;
_unit_return = _unit;
_name = name _unit;
_side = side _unit;
_unit = owner _unit;
if(_vid == -1 OR _pid == "") exitWith {};
if(_vid in serv_sv_use) exitWith {};
serv_sv_use pushBack _vid;
/*
**************************
* ORIGINAL QUERY
* _query = format["SELECT id, side, classname, type, pid, alive, active, plate, color FROM vehicles WHERE id='%1' AND pid='%2'",_vid,_pid];
**************************
*/
_query = format["SELECT id, side, classname, type, pid, alive, active, plate, color, fuelstand, HitBody, HitEngine, HitFuel, HitLFWheel, HitRFWheel, HitLF2Wheel, HitRF2Wheel, HitLMWheel, HitRMWheel, HitLBWheel,HitRBWheel FROM vehicles WHERE id='%1' AND pid='%2'",_vid,_pid];
waitUntil{sleep (random 0.3); !DB_Async_Active};
_tickTime = diag_tickTime;
_queryResult = [_query,2] call DB_fnc_asyncCall;
diag_log "------------- Client Query Request -------------";
diag_log format["QUERY: %1",_query];
diag_log format["Time to complete: %1 (in seconds)",(diag_tickTime - _tickTime)];
diag_log format["Result: %1",_queryResult];
diag_log "------------------------------------------------";
if(typeName _queryResult == "STRING") exitWith {};
_vInfo = _queryResult;
if(isNil "_vInfo") exitWith {serv_sv_use = serv_sv_use - [_vid];};
if(count _vInfo == 0) exitWith {serv_sv_use = serv_sv_use - [_vid];};
if((_vInfo select 5) == 0) exitWith
{
serv_sv_use = serv_sv_use - [_vid];
[[1,format[(localize "STR_Garage_SQLError_Destroyed"),_vInfo select 2]],"life_fnc_broadcast",_unit,false] spawn life_fnc_MP;
};
if((_vInfo select 6) == 1) exitWith
{
serv_sv_use = serv_sv_use - [_vid];
[[1,format[(localize "STR_Garage_SQLError_Active"),_vInfo select 2]],"life_fnc_broadcast",_unit,false] spawn life_fnc_MP;
};
if(typeName _sp != "STRING") then {
_nearVehicles = nearestObjects[_sp,["Car","Air","Ship"],10];
} else {
_nearVehicles = [];
};
if(count _nearVehicles > 0) exitWith
{
serv_sv_use = serv_sv_use - [_vid];
[[_price,_unit_return],"life_fnc_garageRefund",_unit,false] spawn life_fnc_MP;
[[1,(localize "STR_Garage_SpawnPointError")],"life_fnc_broadcast",_unit,false] spawn life_fnc_MP;
};
_query = format["UPDATE vehicles SET active='1' WHERE pid='%1' AND id='%2'",_pid,_vid];
waitUntil {!DB_Async_Active};
[_query,false] spawn DB_fnc_asyncCall;
if(typeName _sp == "STRING") then {
_vehicle = createVehicle[(_vInfo select 2),[0,0,999],[],0,"NONE"];
waitUntil {!isNil "_vehicle" && {!isNull _vehicle}};
_vehicle allowDamage false;
_hs = nearestObjects[getMarkerPos _sp,["Land_Hospital_side2_F"],50] select 0;
_vehicle setPosATL (_hs modelToWorld [-0.4,-4,12.65]);
sleep 0.6;
} else {
_vehicle = createVehicle [(_vInfo select 2),_sp,[],0,"NONE"];
waitUntil {!isNil "_vehicle" && {!isNull _vehicle}};
_vehicle allowDamage false;
_vehicle setPos _sp;
_vehicle setVectorUp (surfaceNormal _sp);
_vehicle setDir _dir;
};
_vehicle allowDamage true;
/*
**************************
* TANK FÜLLUNG
**************************
*/
_vehicle setFuel (_vInfo select 9);
/*
**************************
* DAMAGE ZUWEISUNG
**************************
*/
_vHitBody = (_vInfo select 10);
_vHitEngine = (_vInfo select 11);
_vHitFuel = (_vInfo select 12);
_vHitLFWheel = (_vInfo select 13);
_vHitRFWheel = (_vInfo select 14);
_vHitLF2Wheel = (_vInfo select 15);
_vHitRF2Wheel = (_vInfo select 16);
_vHitLMWheel = (_vInfo select 17);
_vHitRMWheel = (_vInfo select 18);
_vHitLBWheel = (_vInfo select 19);
_vHitRBWheel = (_vInfo select 20);
/*
***********************************
* DAMAGE ZUWEISUNG
* NUR BEI FAHRZEUGEN
* FLUGZEUGE / BOOTE / HUBSCHRAUBER
* SIND NICHT INBEGRIFFEN!!
* DEREN DAMAGEPOINTS SIND ANDERS!
***********************************
*/
if (_vehicle isKindOf "LandVehicle") then
{
_vehicle setHitPointDamage ["HitBody",_vHitBody];
_vehicle setHitPointDamage ["HitEngine",_vHitEngine];
_vehicle setHitPointDamage ["HitFuel",_vHitFuel];
_vehicle setHitPointDamage ["HitLFWheel",_vHitLFWheel];
_vehicle setHitPointDamage ["HitRFWheel",_vHitRFWheel];
_vehicle setHitPointDamage ["HitLF2Wheel",_vHitLF2Wheel];
_vehicle setHitPointDamage ["HitRF2Wheel",_vHitRF2Wheel];
_vehicle setHitPointDamage ["HitLMWheel",_vHitLMWheel];
_vehicle setHitPointDamage ["HitRMWheel",_vHitRMWheel];
_vehicle setHitPointDamage ["HitLBWheel",_vHitLBWheel];
_vehicle setHitPointDamage ["HitRBWheel",_vHitRBWheel];
};
//Send keys over the network.
[[_vehicle],"life_fnc_addVehicle2Chain",_unit,false] spawn life_fnc_MP;
[_pid,_side,_vehicle,1] call TON_fnc_keyManagement;
_vehicle lock 2;
//Reskin the vehicle
[[_vehicle,_vInfo select 8],"life_fnc_colorVehicle",nil,false] spawn life_fnc_MP;
_vehicle setVariable["vehicle_info_owners",[[_pid,_name]],true];
_vehicle setVariable["dbInfo",[(_vInfo select 4),_vInfo select 7]];
//_vehicle addEventHandler["Killed","_this spawn TON_fnc_vehicleDead"]; //Obsolete function?
[_vehicle] call life_fnc_clearVehicleAmmo;
//Sets of animations
if((_vInfo select 1) == "civ" && (_vInfo select 2) == "B_Heli_Light_01_F" && _vInfo select 8 != 13) then
{
[[_vehicle,"civ_littlebird",true],"life_fnc_vehicleAnimate",_unit,false] spawn life_fnc_MP;
};
if((_vInfo select 1) == "cop" && (_vInfo select 2) in ["C_Offroad_01_F","B_MRAP_01_F","C_SUV_01_F"]) then
{
[[_vehicle,"cop_offroad",true],"life_fnc_vehicleAnimate",_unit,false] spawn life_fnc_MP;
};
if((_vInfo select 1) == "med" && (_vInfo select 2) == "C_Offroad_01_F") then
{
[[_vehicle,"med_offroad",true],"life_fnc_vehicleAnimate",_unit,false] spawn life_fnc_MP;
};
[[1,"Your vehicle is ready!"],"life_fnc_broadcast",_unit,false] spawn life_fnc_MP;
serv_sv_use = serv_sv_use - [_vid];
Alles anzeigen