Hallo Breadfish,
ich habe schon öfter mal gelesen das hier einige ein Fraktionsfahrzeug-System suchen und noch mehr Dynamische Systeme suchen.
Ich dachte mir dann das ich euch mal dieses Tutorial mache.
Was benötige ich?
-dini (Grundkenntnisse)
-PAWNO Erfahrung (Grundkenntnisse)
-Das include: ocmd
-Einen Ordner namens:"Fraktionsautos"
(nur zum Testen wenn ihr es testen wollt)-Einen Ordner namens:"SAPD"(für die cars des SAPD's)
Fangen wir mal an:
als erstes definieren wir mal unsere maximalen Fraktionsautos.
#define MAX_FRAKTCARS 20 //Die 20 kann geändert werden auf eure maximalen Fraktionfahrzeuge
So weiter gehts mit dem enum und die news für die Fraktionsfahrzeuge.
new SAPDcar[MAX_FRAKTCARS]; //Für die SAPD Cars
enum Fraktcars{modelid,Float:fposx,Float:fposy,Float:fposz,Float:fposa,Spoiler,Hood,Roof,Sideskirt,Lamps,Nitro,Exhaust,Wheels,Stereo,Hydraulics,FrontBumper,RearBumper,VentRight,VentLeft}
new Fraktautos[MAX_FRAKTCARS][7][Fraktcars]; //Die 7 ist die anzahl der Fraktionen (kann also auch geändert werden)
Ich hoffe das mit dem enum erklärt sich von alleine.
Wenn das bei euch nicht der Fall ist solltet ihr das schnell lernen wenn ihr selber auch Dynamische Systeme machen wollt...
Dann kommt bei OnGameModeInit das hin:
Ich mache es mal wie es bei mir ist für das SAPD
for(new i=0;i<MAX_FRAKTCARS;i++) //Geht alle Zahlen von 0 bis die zahl die bei MAX_FRAKTCARS steht { new Fraktauto[200]; format(Fraktauto,sizeof(Fraktauto),"/Fraktionsautos/SAPD/%d.ini",i); //Solltet ihr wissen ;) if(dini_Exists(Fraktauto)) { Fraktautos[i][1][modelid] = dini_Int(Fraktauto,"modelid"); Fraktautos[i][1][fposx] = dini_Float(Fraktauto,"FPosX"); Fraktautos[i][1][fposy] = dini_Float(Fraktauto,"FPosY"); Fraktautos[i][1][fposz] = dini_Float(Fraktauto,"FPosZ"); Fraktautos[i][1][fposa] = dini_Float(Fraktauto,"FPosA"); Fraktautos[i][1][Spoiler] = dini_Int(Fraktauto,"Spoiler"); Fraktautos[i][1][Hood] = dini_Int(Fraktauto,"Hood"); Fraktautos[i][1][Roof] = dini_Int(Fraktauto,"Roof"); Fraktautos[i][1][Sideskirt] = dini_Int(Fraktauto,"Sideskirt"); Fraktautos[i][1][Lamps] = dini_Int(Fraktauto,"Lamps"); Fraktautos[i][1][Nitro] = dini_Int(Fraktauto,"Nitro"); Fraktautos[i][1][Exhaust] = dini_Int(Fraktauto,"Exhaust"); Fraktautos[i][1][Wheels] = dini_Int(Fraktauto,"Wheels"); Fraktautos[i][1][Stereo] = dini_Int(Fraktauto,"Stereo"); Fraktautos[i][1][Hydraulics] = dini_Int(Fraktauto,"Hydraulics"); Fraktautos[i][1][FrontBumper] = dini_Int(Fraktauto,"FrontBumper"); Fraktautos[i][1][RearBumper] = dini_Int(Fraktauto,"RearBumper"); Fraktautos[i][1][VentRight] = dini_Int(Fraktauto,"VentRight"); Fraktautos[i][1][VentLeft] = dini_Int(Fraktauto,"VentLeft"); SAPDcar[i] = AddStaticVehicleEx(Fraktautos[i][1][modelid],Fraktautos[i][1][fposx],Fraktautos[i][1][fposy],Fraktautos[i][1][fposz],Fraktautos[i][1][fposa],0,1,-1); SetVehicleNumberPlate(SAPDcar[i],"SAPD"); } }
So jetzt hat er das Auto erstellt und die Sachen des enums richtig definiert...
Jetzt muss das alles ja auch noch alle beim runterfahren des Servers gespeichert werden.
Dazu gehen wir unter OnGameModeExit...
Da macht ihr dann folgendes:
for(new i=0;i<MAX_FRAKTCARS;i++) { new Fraktauto[200]; format(Fraktauto,sizeof(Fraktauto),"/Fraktionsautos/SAPD/%d.ini",i); if(dini_Exists(Fraktauto)) { dini_IntSet(Fraktauto,"modelid",Fraktautos[i][1][modelid]); dini_FloatSet(Fraktauto,"FPosX",Fraktautos[i][1][fposx]); dini_FloatSet(Fraktauto,"FPosY",Fraktautos[i][1][fposy]); dini_FloatSet(Fraktauto,"FPosZ",Fraktautos[i][1][fposz]); dini_FloatSet(Fraktauto,"FPosA",Fraktautos[i][1][fposa]); dini_IntSet(Fraktauto,"Spoiler",GetVehicleComponentInSlot(SAPDcar[i],0)); //GetVehicleComponentInSlot bedeutet das er das Tuning des angegebenen Slots heraus findet dini_IntSet(Fraktauto,"Hood",GetVehicleComponentInSlot(SAPDcar[i],1)); dini_IntSet(Fraktauto,"Roof",GetVehicleComponentInSlot(SAPDcar[i],2)); dini_IntSet(Fraktauto,"Sideskirt",GetVehicleComponentInSlot(SAPDcar[i],3)); dini_IntSet(Fraktauto,"Lamps",GetVehicleComponentInSlot(SAPDcar[i],4)); dini_IntSet(Fraktauto,"Nitro",GetVehicleComponentInSlot(SAPDcar[i],5)); dini_IntSet(Fraktauto,"Exhaust",GetVehicleComponentInSlot(SAPDcar[i],6)); dini_IntSet(Fraktauto,"Wheels",GetVehicleComponentInSlot(SAPDcar[i],7)); dini_IntSet(Fraktauto,"Stereo",GetVehicleComponentInSlot(SAPDcar[i],8)); dini_IntSet(Fraktauto,"Hydraulics",GetVehicleComponentInSlot(SAPDcar[i],9)); dini_IntSet(Fraktauto,"FrontBumper",GetVehicleComponentInSlot(SAPDcar[i],10)); dini_IntSet(Fraktauto,"RearBumper",GetVehicleComponentInSlot(SAPDcar[i],11)); dini_IntSet(Fraktauto,"VentRight",GetVehicleComponentInSlot(SAPDcar[i],12)); dini_IntSet(Fraktauto,"VentLeft",GetVehicleComponentInSlot(SAPDcar[i],13)); } }
So jetzt lädt und speichert er das Fahrzeug wenn es existiert...
Das bringt uns aber noch nichts da wir noch keine erstellen können.
Dazu brauchen wir jetzt auch ocmd...
Ihr macht dann mit ocmd folgendes:
ocmd:createfcar(playerid,params[]){ if(isPlayerAnAdmin(playerid,6)) //Müsst ihr nach eurer Adminabfrage machen { new fraktid; new mid; if(sscanf(params,"ii",fraktid,mid)) //Wenn der z.b. nur "/createfcar" eingibt { SendClientMessage(playerid,CMD,"/createfcar [Frakt-ID][Model-ID]"); //Müsst ihr für euren Server ändern SendClientMessage(playerid,BLAU,"Fraktion 1:SAPD"); SendClientMessage(playerid,BLAU,"Fraktion 2:Grove Street"); SendClientMessage(playerid,BLAU,"Fraktion 3:Rollin' Heigths Ballas"); SendClientMessage(playerid,BLAU,"Fraktion 4:Varrios Los Aztecas"); SendClientMessage(playerid,BLAU,"Fraktion 5:Los Santos Vagos"); SendClientMessage(playerid,BLAU,"Fraktion 6:Army"); } else { if(fraktid < 1 || fraktid > 6)return SendClientMessage(playerid,ROT,"Frakt-ID kann nicht über 6 oder unter 1 sein."); if(mid < 400 || mid > 611)return SendClientMessage(playerid,ROT,"Model-ID kann nicht über 611 oder unter 400 sein."); //Da die Vehicles nur von 400-611 gehen CreateFCar(playerid,fraktid,mid); //wird gleich gezeigt was das ist... } } return 1;}
Und noch zum destroyen des Vehicles:
ocmd:desfcar(playerid,params[]){ if(isPlayerAnAdmin(playerid,6)) //Muss angepasst werden { if(IsPlayerInAnyVehicle(playerid)) { new veh=GetPlayerVehicleID(playerid); //Definiert veh als GetPlayerVehicleID new Fraktauto[200]; for(new i=0;i<MAX_FRAKTCARS;i++) { if(veh==SAPDcar[i]) //Wenn der in irgendeinem SAPDcar ist { format(Fraktauto,sizeof(Fraktauto),"/Fraktionsautos/SAPD/%d.ini",i); dini_Remove(Fraktauto); DestroyVehicle(SAPDcar[i]); SendClientMessage(playerid,GELB,"Fraktionsauto erfolgreich gelöscht."); } //Zerstört der das Vehicle und die Veh-Datei } } }}
Jetzt kann das Vehicle erstellt und gelöscht werden.
Nun zeige ich euch noch den stock CreateFCar(playerid,fraktid,mid);
stock CreateFCar(playerid,fraktid,mid){ new Fraktauto[200]; new Float:x,Float:y,Float:z,Float:a; GetPlayerPos(playerid,x,y,z); //Findet die Position für den Spieler heraus damit er weiß wo das auto hin muss GetPlayerFacingAngle(playerid,a); //Da die Blickrichtung auch für das Auto if(fraktid!=0) //Damit es nicht geht als Zivicar { for(new i=0;i<MAX_FRAKTCARS;i++) { if(fraktid==1) { format(Fraktauto,sizeof(Fraktauto),"/Fraktionsautos/SAPD/%d.ini",i); if(!dini_Exists(Fraktauto)) //Wenn die Fahrzeugid noch nicht vergeben ist { dini_Create(Fraktauto); //Er Createt die Datei dini_IntSet(Fraktauto,"modelid",mid); dini_FloatSet(Fraktauto,"FPosX",x); dini_FloatSet(Fraktauto,"FPosY",y); dini_FloatSet(Fraktauto,"FPosZ",z); dini_FloatSet(Fraktauto,"FPosA",a); dini_IntSet(Fraktauto,"Spoiler",0); dini_IntSet(Fraktauto,"Hood",0); dini_IntSet(Fraktauto,"Roof",0); dini_IntSet(Fraktauto,"Sideskirt",0); dini_IntSet(Fraktauto,"Lamps",0); dini_IntSet(Fraktauto,"Nitro",0); dini_IntSet(Fraktauto,"Exhaust",0); dini_IntSet(Fraktauto,"Wheels",0); dini_IntSet(Fraktauto,"Stereo",0); dini_IntSet(Fraktauto,"Hydraulics",0); dini_IntSet(Fraktauto,"FrontBumper",0); dini_IntSet(Fraktauto,"RearBumper",0); dini_IntSet(Fraktauto,"VentRight",0); dini_IntSet(Fraktauto,"VentLeft",0); Fraktautos[i][1][modelid] = dini_Int(Fraktauto,"modelid"); Fraktautos[i][1][fposx] = dini_Float(Fraktauto,"FPosX"); Fraktautos[i][1][fposy] = dini_Float(Fraktauto,"FPosY"); Fraktautos[i][1][fposz] = dini_Float(Fraktauto,"FPosZ"); Fraktautos[i][1][fposa] = dini_Float(Fraktauto,"FPosA"); Fraktautos[i][1][Spoiler] = dini_Int(Fraktauto,"Spoiler"); Fraktautos[i][1][Hood] = dini_Int(Fraktauto,"Hood"); Fraktautos[i][1][Roof] = dini_Int(Fraktauto,"Roof"); Fraktautos[i][1][Sideskirt] = dini_Int(Fraktauto,"Sideskirt"); Fraktautos[i][1][Lamps] = dini_Int(Fraktauto,"Lamps"); Fraktautos[i][1][Nitro] = dini_Int(Fraktauto,"Nitro"); Fraktautos[i][1][Exhaust] = dini_Int(Fraktauto,"Exhaust"); Fraktautos[i][1][Wheels] = dini_Int(Fraktauto,"Wheels"); Fraktautos[i][1][Stereo] = dini_Int(Fraktauto,"Stereo"); Fraktautos[i][1][Hydraulics] = dini_Int(Fraktauto,"Hydraulics"); Fraktautos[i][1][FrontBumper] = dini_Int(Fraktauto,"FrontBumper"); Fraktautos[i][1][RearBumper] = dini_Int(Fraktauto,"RearBumper"); Fraktautos[i][1][VentRight] = dini_Int(Fraktauto,"VentRight"); Fraktautos[i][1][VentLeft] = dini_Int(Fraktauto,"VentLeft"); SAPDcar[i] = CreateVehicle(mid,x,y,z,a,0,1,-1); PutPlayerInVehicle(playerid,SAPDcar[i],0); return 1; } } } } return 1;}
Für Gangs wäre es dann so (Das zeige ich euch nochmal dazu damit ihr wisst wie es aussieht wenn man das Fahrzeug tunen können soll):
else if(fraktid==2) { format(Fraktauto,sizeof(Fraktauto),"/Fraktionsautos/Grove/%d.ini",i); if(!dini_Exists(Fraktauto)) { dini_Create(Fraktauto); dini_IntSet(Fraktauto,"modelid",mid); dini_FloatSet(Fraktauto,"FPosX",x); dini_FloatSet(Fraktauto,"FPosY",y); dini_FloatSet(Fraktauto,"FPosZ",z); dini_FloatSet(Fraktauto,"FPosA",a); dini_IntSet(Fraktauto,"Spoiler",0); dini_IntSet(Fraktauto,"Hood",0); dini_IntSet(Fraktauto,"Roof",0); dini_IntSet(Fraktauto,"Sideskirt",0); dini_IntSet(Fraktauto,"Lamps",0); dini_IntSet(Fraktauto,"Nitro",0); dini_IntSet(Fraktauto,"Exhaust",0); dini_IntSet(Fraktauto,"Wheels",0); dini_IntSet(Fraktauto,"Stereo",0); dini_IntSet(Fraktauto,"Hydraulics",0); dini_IntSet(Fraktauto,"FrontBumper",0); dini_IntSet(Fraktauto,"RearBumper",0); dini_IntSet(Fraktauto,"VentRight",0); dini_IntSet(Fraktauto,"VentLeft",0); Fraktautos[i][2][modelid] = dini_Int(Fraktauto,"modelid"); Fraktautos[i][2][fposx] = dini_Float(Fraktauto,"FPosX"); Fraktautos[i][2][fposy] = dini_Float(Fraktauto,"FPosY"); Fraktautos[i][2][fposz] = dini_Float(Fraktauto,"FPosZ"); Fraktautos[i][2][fposa] = dini_Float(Fraktauto,"FPosA"); Fraktautos[i][2][Spoiler] = dini_Int(Fraktauto,"Spoiler"); Fraktautos[i][2][Hood] = dini_Int(Fraktauto,"Hood"); Fraktautos[i][2][Roof] = dini_Int(Fraktauto,"Roof"); Fraktautos[i][2][Sideskirt] = dini_Int(Fraktauto,"Sideskirt"); Fraktautos[i][2][Lamps] = dini_Int(Fraktauto,"Lamps"); Fraktautos[i][2][Nitro] = dini_Int(Fraktauto,"Nitro"); Fraktautos[i][2][Exhaust] = dini_Int(Fraktauto,"Exhaust"); Fraktautos[i][2][Wheels] = dini_Int(Fraktauto,"Wheels"); Fraktautos[i][2][Stereo] = dini_Int(Fraktauto,"Stereo"); Fraktautos[i][2][Hydraulics] = dini_Int(Fraktauto,"Hydraulics"); Fraktautos[i][2][FrontBumper] = dini_Int(Fraktauto,"FrontBumper"); Fraktautos[i][2][RearBumper] = dini_Int(Fraktauto,"RearBumper"); Fraktautos[i][2][VentRight] = dini_Int(Fraktauto,"VentRight"); Fraktautos[i][2][VentLeft] = dini_Int(Fraktauto,"VentLeft"); GScar[i] = CreateVehicle(mid,x,y,z,a,252,252,-1); PutPlayerInVehicle(playerid,GScar[i],0); AddVehicleComponent(GScar[i],Fraktautos[i][2][Spoiler]); AddVehicleComponent(GScar[i],Fraktautos[i][2][Hood]); AddVehicleComponent(GScar[i],Fraktautos[i][2][Roof]); AddVehicleComponent(GScar[i],Fraktautos[i][2][Sideskirt]); AddVehicleComponent(GScar[i],Fraktautos[i][2][Lamps]); AddVehicleComponent(GScar[i],Fraktautos[i][2][Nitro]); AddVehicleComponent(GScar[i],Fraktautos[i][2][Exhaust]); AddVehicleComponent(GScar[i],Fraktautos[i][2][Wheels]); AddVehicleComponent(GScar[i],Fraktautos[i][2][Stereo]); AddVehicleComponent(GScar[i],Fraktautos[i][2][Hydraulics]); AddVehicleComponent(GScar[i],Fraktautos[i][2][FrontBumper]); AddVehicleComponent(GScar[i],Fraktautos[i][2][RearBumper]); AddVehicleComponent(GScar[i],Fraktautos[i][2][VentRight]); AddVehicleComponent(GScar[i],Fraktautos[i][2][VentLeft]); return 1; } }
Die Befehle sollten euch eigentlich bekannt sein wenn ihr mindestens die Grundkenntnisse von PAWN und dini kennt....
So nun zeige ich euch noch wie man es umparken kann:
if(strcmp(cmdtext,"/fpark",true) == 0 || strcmp(cmdtext,"/fparken",true) == 0) { if(isPlayerLeader(playerid)) { if(IsPlayerInAnyVehicle(playerid)) { new veh=GetPlayerVehicleID(playerid); new Float:x,Float:y,Float:z,Float:a; for(new i=0;i<MAX_FRAKTCARS;i++) { if(isPlayerInFrakt(playerid,1)) { if(veh==SAPDcar[i]) { new Fraktauto[200]; format(Fraktauto,sizeof(Fraktauto),"/Fraktionsautos/SAPD/%d.ini",i); GetVehiclePos(SAPDcar[i],x,y,z); GetVehicleZAngle(SAPDcar[i],a); Fraktautos[i][1][fposx]=x; Fraktautos[i][1][fposy]=y; Fraktautos[i][1][fposz]=z; Fraktautos[i][1][fposa]=a; dini_FloatSet(Fraktauto,"FPosX",Fraktautos[i][1][fposx]); dini_FloatSet(Fraktauto,"FPosY",Fraktautos[i][1][fposy]); dini_FloatSet(Fraktauto,"FPosZ",Fraktautos[i][1][fposz]); dini_FloatSet(Fraktauto,"FPosA",Fraktautos[i][1][fposa]); } } } } } }
Ich hoffe das bei euch alles geklappt hat.
Wenn nicht schreibt mir eure Fehler bitte unter das Thread.
Wenn ihr wollt das ich weitere Tutorials mache dann schreibt mir das bitte auch runter und sagt mir welche ihr haben wollt
Mit freundlichen Grüßen,
PatoD
//edit
Bei allen bei denen Es nicht klappt..
ändert:
if(Fraktautos[i][Spoiler] >= 1000) { AddVehicleComponent(SAPDcar[i],Fraktautos[i][Spoiler]); }
und die anderen in:
if(Fraktautos[i][1][Spoiler] >= 1000) { AddVehicleComponent(SAPDcar[i],Fraktautos[i][Spoiler]); }