Moin leute,
Bevor ihr fragt, nein das Tutorial ist nicht das gleiche wie das [Tutorial] Paint Shop
Mit diesem Tutorial könnt ihr eure Autos umlackieren lassen in andere Skins (Die wo auf dem Server vorhanden sind für die Autoklasse)
Fangen wir mal an:
MPMissions
1. Geht in euer core Ordner, und erstellt darin ein neuer Ordner namens repaint.
2. Erstellt nun eine neue sqf namens fn_Repaintcolor.sqf und kopiert diese datei in euer repaint Ordner mit folgendem Inhallt:
/*
File: fn_Repaintcolor.sqf
Author: MooN-Gaming
Description: Opens the display to recolor the vehicle
*/
private["_index","_veh","_c_arr","_id","_colorcost","_i","_text"];
if(!isNull (findDisplay 2300)) then {
_index = lbCurSel 2302;
lbClear 2303;
_veh = lbData[2302,_index];
_c_arr = [_veh] call life_fnc_vehicleColorCfg;
_id = switch(playerSide) do {case civilian: {"civ"}; case west:{"cop"}; default {"civ"};};
_colorcost = 100;
for "_i" from 0 to (count _c_arr)-1 do
{
if((_c_arr select _i) select 1 == _id) then
{
_text = [_veh,_i] call life_fnc_vehicleColorStr;
lbAdd[2303,format["%1",_text]];
lbSetValue [2303,(lbSize 2303)-1,_i];
//lbSetData[2303, [_colorcost] call life_fnc_numberText];
};
};
lbSetCurSel [2303,0];
if((lbSize 2303)-1 != -1) then
{
ctrlShow[2303,true];
}
else
{
ctrlShow[2303,false];
};
};
_haha = typeOf _x;
_vehicles lbSetData [(lbSize _vehicles)-1,_haha];
Alles anzeigen
3. Erstellt eine neue sqf namens fn_RepaintVehicle.sqf und kopiert diese datei in euer repaint Ordner mit folgendem Inhallt:
/*
File: fn_RepaintVehicle.sqf
Author: MooN-Gaming
Description: Does the active repaint man....read the title!
*/
private["_index","_veh","_color","_color_index"];
if(!isNull (findDisplay 2300)) then {
_veh = nearestObject [position player, "LandVehicle"];
_color = lbcursel 2303;
_color_index = lbValue[2303,_color];
closeDialog 0;
_baseprice = 20000;
_vehicleData = _veh getVariable["vehicle_info_owners",[]];
_vehOwner = (_vehicleData select 0) select 0;
if(life_cash < _basePrice) exitWith {hint "Du hast keine 20000$ um den Lackierer zu bezahlen."};
if(isNil {_vehicleData}) exitWith {hint "Es gibt keine Infos zu diesem Fahrzeug, es ist entweder gemietet oder gecheated."};
if ((getPlayerUID player) != _vehOwner) exitWith {hint "Du bist nicht der Besitzer des Fahrzeugs das lackiert werden soll."};
life_action_inUse = true;
[player,"spraycan"] call life_fnc_globalSound;
_displayName = getText(configFile >> "CfgVehicles" >> (typeOf _veh) >> "displayName");
_upp = format["Lackiere %1",_displayName];
//Setup our progress bar.
disableSerialization;
5 cutRsc ["life_progress","PLAIN"];
_ui = uiNameSpace getVariable "life_progress";
_progress = _ui displayCtrl 38201;
_pgText = _ui displayCtrl 38202;
_pgText ctrlSetText format["%2 (1%1)...","%",_upp];
_progress progressSetPosition 0.01;
_cP = 0.01;
while{true} do
{
if(animationState player != "AinvPknlMstpSnonWnonDnon_medic_1") then {
[[player,"AinvPknlMstpSnonWnonDnon_medic_1"],"life_fnc_animSync",true,false] spawn life_fnc_MP;
player playMoveNow "AinvPknlMstpSnonWnonDnon_medic_1";
};
sleep 0.29;
_cP = _cP + 0.01;
_progress progressSetPosition _cP;
_pgText ctrlSetText format["%3 (%1%2)...",round(_cP * 100),"%",_upp];
if(_cP >= 1) exitWith {};
if(!alive player) exitWith {};
if(player != vehicle player) exitWith {};
if(life_interrupted) exitWith {};
};
life_action_inUse = false;
5 cutText ["","PLAIN"];
player playActionNow "stop";
if(life_interrupted) exitWith {life_interrupted = false; titleText["Abgebrochen!","PLAIN"]; life_action_inUse = false;};
if(player != vehicle player) exitWith {titleText["Du musst aus dem Fahrzeug aussteigen, um es lackieren zu können!","PLAIN"];};
life_cash = life_cash - _basePrice;
//Send toDB
[[_veh,_color_index],"TON_fnc_vehicleRepaint",false,false] spawn life_fnc_MP;
//Color vehicle locally
[_veh,_color_index] call life_fnc_colorVehicle;
[] call SOCK_fnc_updateRequest; //Sync silently because it's obviously silently..
hint format["Fahrzeug: %1 || Neue Farbe: %2 || Besitzer: %3",_veh,_color_index,_vehicledata];
};
Alles anzeigen
4. Erstellt eine neue sqf namens fn_RepaintMenu.sqf und kopiert diese datei in euer repaint Ordner mit folgendem Inhallt:
/*
File: fn_RepaintMenu.sqf
Author: MooN-Gaming
Description: What could it do bro?!
*/
private["_display","_vehicles","_objects","_color","_haha","_pic","_text"];
createDialog "Life_vehicle_repaint";
disableSerialization;
if(!isNull (findDisplay 2300)) then {
_display = findDisplay 2300;
_vehicles = _display displayCtrl 2302;
_objects = nearestObjects[getPos (_this select 0),["Car","Air","Ship"],8];
//_objects = nearestObject [position player, "LandVehicle"];
_xx = _objects select 0;
//List vehicles
{
if(vehicle player != _x) then {
_color = [(typeOf _xx),(_xx getVariable "Life_VEH_color")] call life_fnc_vehicleColorStr;
_pic = getText(configFile >> "CfgVehicles" >> typeOf _x >> "picture");
_text = format["(%1)",_color];
_haha = typeOf _x;
if(_text == "()") then
{
_text = "";
};
_vehicles lbAdd format ["%1 || %2", getText(configFile >> "cfgVehicles" >> typeOf _x >> "DisplayName"), _text];
_vehicles lbSetPicture [(lbSize _vehicles)-1,_pic];
_vehicles lbSetData [(lbSize _vehicles)-1,_haha];
};
} foreach _objects;
};
Alles anzeigen
5. Erstellt eine neue hpp namens veh_repaint.hpp und kopiert diese datei in euer dialog Ordner mit folgendem Inhallt:
class Life_vehicle_repaint {
idd = 2300;
name= "life_vehrepaint_menu";
movingEnable = false;
enableSimulation = true;
//onLoad = "[] execVM 'core\client\keychain\init.sqf'";
class controlsBackground {
class Life_RscTitleBackground:Life_RscText {
colorBackground[] = {0.4, 0, 0, 0.7};
idc = -1;
x = 0.1;
y = 0.2;
w = 0.8;
h = (1 / 25);
};
class MainBackground:Life_RscText {
colorBackground[] = {0, 0, 0, 0.7};
idc = -1;
x = 0.1;
y = 0.2 + (11 / 250);
w = 0.8;
h = 0.6 - (22 / 250);
};
};
class controls {
class Title : Life_RscTitle {
colorBackground[] = {0, 0, 0, 0};
idc = 2301;
text = "Auto umlackierung";
x = 0.1;
y = 0.2;
w = 0.8;
h = (1 / 25);
};
class VehicleList : Life_RscListBox
{
idc = 2302;
text = "";
sizeEx = 0.035;
colorBackground[] = {0,0,0,0};
onLBSelChanged = "[_this] call life_fnc_Repaintcolor";
x = 0.12; y = 0.26;
w = 0.76; h = 0.4;
};
class ColorList : Life_RscCombo
{
idc = 2303;
x = 0.42; y = 0.68;
w = 0.275; h = 0.03;
};
class CloseButtonKey : Life_RscButtonMenu {
idc = -1;
text = "$STR_Global_Close";
onButtonClick = "closeDialog 0;";
x = -0.06 + (6.25 / 40) + (1 / 250 / (safezoneW / safezoneH));
y = 0.8 - (1 / 25);
w = (6.25 / 40);
h = (1 / 25);
};
class RepaintCar : life_RscButtonMenu {
idc = -1;
text = "Repaint ($20000)";
onButtonClick = "[] spawn life_fnc_RepaintVehicle;";
x = 0.26 + (6.25 / 40) + (1 / 250 / (safezoneW / safezoneH));
y = 0.8 - (1 / 25);
w = (10 / 40);
h = (1 / 25);
};
};
};
Alles anzeigen
6. Geht in eure dialog/MasterHandler.h und fügt folgendes ein:
7. Öffnet eure Functions.h und fügt eine neue class hinzu:
class anstrich
{
file = "core\repaint";
class RepaintMenu;
class Repaintcolor;
class RepaintVehicle;
};
8. Geht in eure Description.ext und fügt einen neuen Sound ein:
class spraycan
{
name = "spraycan";
sound[] = {"\sounds\spraycan.ogg", 1.0, 1};
titles[] = {};
};
life_server
1. Geht in eure config.cpp und sucht nach class MySQL und fügt folgendes darunter:
Sucht weiter nach in Class Systems und fügt das noch ein:
2. Erstellt eine neue sqf namens fn_repaintVehicle.sqf und kopiert diese datei in euer Functions/MySQL Ordner mit folgendem Inhallt:
/*
Author: MooN-Gaming
Thanks to Black lagoon developing
*/
private["_uid","_side","_type","_className","_color","_plate","_query","_sql"];
_uid = [_this,0,"",[""]] call BIS_fnc_param;
_plate = [_this,1,-1,[0]] call BIS_fnc_param;
_color = [_this,2,0,[0]] call BIS_fnc_param;
//Stop bad data being passed.
if(_uid == "" OR _color == -1 OR _plate == -1) exitWith {diag_log "repaintVehicle canceled!";};
_query = format["UPDATE vehicles SET color='%1' WHERE plate='%2' AND pid='%3'",_color, _plate, _uid];
waitUntil {sleep (random 0.3); !DB_Async_Active};
_queryResult = [_query,1] call DB_fnc_asyncCall;
Alles anzeigen
3. Erstellt eine neue sqf namens fn_vehicleRepaint.sqf und kopiert diese datei in euer Functions/Systems Ordner mit folgendem Inhallt:
/*
Author: MooN-Gaming
Thanks to Black lagoon Developing
*/
private["_uid","_type","_classname","_color","_plate","_vInfo"];
_vehicle = [_this,0,ObjNull,[ObjNull]] call BIS_fnc_param;
_color = [_this,1,-1,[0]] call BIS_fnc_param;
//Error checks
if(isNull _vehicle) exitWith {diag_log "Tried to repaint null vehicle. Canceled.";};
if(!alive _vehicle) exitWith {diag_log "Tried to repaint non alive vehicle. Canceled.";};
_vInfo = _vehicle getVariable["dbInfo",[]];
if(count _vInfo == 0) exitWith
{
diag_log "Tried to repaint a non persistent vehicle. Canceled.";
};
_plate = _vInfo select 1;
_uid = _vInfo select 0;
diag_log "Vehicle repainted.";
[_uid,_plate,_color] call DB_fnc_repaintVehicle;
Alles anzeigen
Editor
Zuletzt noch sucht ihr euch ein plätzchen aus, wo ihr gerne diesen Shop haben wollt.
Erstellt einen neuen NPC mit folgendem INIT Befehl:
this allowDamage false; this enableSimulation false; this addAction ["Auto umlackieren", life_fnc_RepaintMenu];
Das war es. Preis für eine Umlackierung kostet 20000.
Kann beliebig geändert werden in der fn_RepaintVehicle.sqf
Vergisst bitte nicht, falls ihr den Preis ändert diesen auch in der life_server anzupassen. Der Knopf zum Shop das man das Auto umlackieren kann darin steht nähmlich der Preis.
!!Wichtig!!
Wenn ihr ein Auto Umlackiert, seht vorerst nur ihr der neue Skin auf eurem Auto. Die anderen sehen alle noch den alten.
Parkt einfach euer auto in die Garage, und hollt es wieder raus, somit sehen dann alle den neuen Skin.
Viel spaß damit.
MfG
Noldy