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