Mit der GetVehicleIdx Funktion aus Post #8. Die kannst du ja auch zu GetVehicleSlot umbenennen.
Beim Kauf musst du entsprechend prüfen, bei welchem slot die vehicleid 0 ist, sprich welcher leer ist.
Beiträge von Jeffry
-
-
Der Code muss so aussehen:
if(listitem == 1)
{
for(new slot=0;slot<MAX_PLAYER_VEHS;slot++)
{
if(PrivatCarInfo[slot][playerid][pfStored] == 1)
{
format(string, sizeof(string), "%s{FFFF00}%i. {FFFFFF}Fahrzeug %i\n", string, slot, PrivatCarInfo[slot][playerid][pfModel]);
}
}
if(!strlen(string)) ShowPlayerDialog(playerid, DIALOG_GARAGE3, DIALOG_STYLE_MSGBOX, "{FFFF00}Garagenmenü", "{FFFFFF}Du hast zurzeit kein {FFFF00}Fahrzeug {FFFFFF} in deiner Garage.", "Okay", "");
else ShowPlayerDialog(playerid, DIALOG_GARAGE2, DIALOG_STYLE_LIST, "{FFFF00}Fahrzeuge", string, "Rausholen", "Zurück");
}Außerdem lagerst du beim Ein- und Auslagern immer alle slots ein bzw. aus.
Da musst du noch eine Abfrage einbauen, für welchen Slot das gemacht werden muss. -
Wie sieht dein Code zum Kauf und Abstellen eines Fahrzeugs jetzt aus?
-
Das ist nicht die Funktion, das ist die Nutzung.
Du müsstest irgendwo einen stock (etc) dazu haben, wie bei "IsVehicleAZug" zum Beispiel, das du oben gepostet hast. -
Das hier hast du vergessen:
Wie sieht deine GetVehicleDriver Funktion aus, kannst du diese bitte mal posten?
-
Ja, da die "1000" in deinem Fall für die playerid steht.
Dort trägst du am besten "MAX_PLAYERS" ein, das ist besser, da 1000 nicht notwendig sein wird.
Danach fehlt dann die zweite Dimension der maximal möglichen Fahrzeuge (5). Erst dann darf das enum kommen.#define MAX_MOEGLICHE_AUTOS 5
new PrivatCarInfo[MAX_PLAYERS][MAX_MOEGLICHE_AUTOS][carEnum];Die Erweiterung von 2 auf 3 Dimensionen zieht damit nach sich, dass alles angepasst werden muss, was mit PrivatCarInfo zu tun hat, da alles um die eine Dimension erweitert werden muss.
Das geht leider nicht anders. -
Dann musst du in der a_samp.inc bei "OnPlayerEditAttachedObject" die "modelid" zu "e_modelid" ändern.
-
So einfach geht das nicht.
Die hinzuzufügende Dimension ist das MAX_MOEGLICHE_AUTOS.Und danach müssen alle Codes wie folgt angepasst werden:
DestroyVehicle(PrivatCarInfo[playerid][pf_IDx]);
zu:
new idx = GetVehicleIdx(playerid, GetPlayerVehicleID(playerid));
DestroyVehicle(PrivatCarInfo[playerid][idx][pf_IDx]);Dazu musst du eine Funktion erstellen, um über die ID des Fahrzeugs den Index herauszufinden.
stock GetVehicleIdx(playerid, vehicleid)
{
for(new i; i < MAX_MOEGLICHE_AUTOS; i++)
{
if(PrivatCarInfo[playerid][i][pf_IDx] == vehicleid) return i;
}
return -1;
}Und wie gesagt, es müssen alle Codes entsprechend angepasst werden.
Das kann von Funktion zu Funktion anders aussehen, da musst du alle Fälle einzeln prüfen und anpassen. In 5 Minuten ist das nicht gemacht. -
Das System ist auf nur ein Fahrzeug ausgelegt.
Um mehrere Fahrzeuge zu speichern, benötigt "PrivatCarInfo" eine weitere Dimension, sprich:
new PrivatCarInfo[MAX_PLAYERS][MAX_MOEGLICHE_AUTOS][enumName];
Die zweite ist neu.Dafür muss dann das ganze PrivatCarInfo-System angepasst werden.
-
Wie speicherst du die Fahrzeuge in die Variable (mehrere)?
So wie es aktuell aussieht, kannst du nämlich nur eines speichern. -
Ja, das ist die aktuelle, das passt.
Tritt der Fehler auch auf, wenn du es mit dem Standard-PAWN Editor pawno.exe öffnest und deinen Code kompilierst? -
Setzt du sI[playerid][pLoggedIn] bei OnPlayerConnect bzw. OnPlayerDisconnect zurück?
Wenn nicht, mache das.
sI[playerid][pLoggedIn] = 0; -
Welche SA-MP Version nutzt du?
-
Du musst den String immer wieder "mitnehmen":
if(listitem == 1)
{
if(PrivatCarInfo[playerid][pfStored] == 1)
{
for(new i; i < 5; i++)
{
format(string, sizeof(string), "%s{FFFF00}%i. {FFFFFF}Fahrzeug %i\n", string, i, PrivatCarInfo[playerid][pfModel][i]); //Ich habe das [i] hinzugefügt, ich nehme an das ist ein Array.
}
ShowPlayerDialog(playerid, DIALOG_GARAGE2, DIALOG_STYLE_LIST, "{FFFF00}Fahrzeuge", string, "Rausholen", "Zurück");
}
else
{
ShowPlayerDialog(playerid, DIALOG_GARAGE3, DIALOG_STYLE_MSGBOX, "{FFFF00}Garagenmenü", "{FFFFFF}Du hast zurzeit kein {FFFF00}Fahrzeug {FFFFFF} in deiner Garage.", "Okay", "");
}
} -
Wie sieht deine GetVehicleDriver Funktion aus, kannst du diese bitte mal posten?
Wie erstellst du den Zug und die Wagons?
-
Bitte auf keinen Fall einen SELECT * ohne Bedingung auf die komplette Tabelle machen, das ist komplett am Sinn vorbei und überhaupt nicht performant! Wenn in der Datenbank 50.000 registrierte Spieler stehen, dann werden alle 50.000 Datensätze an den Server gesendet, das macht keinen Sinn.
Um nur die Anzahl der Datensätze zu erhalten, reicht es, wie Douq auch schon sagte, einen SELECT COUNT zu machen, damit bekommt man genau einen Datensatz mit einem Wert zurück, anstatt die komplette Tabelle.
-
COMMAND:orten(playerid,params[])
{
if(ImTutorial[playerid] != 0)return SendClientMessage(playerid,SAMP_ROT,""ACCINFO"Du hast keine erlaubnis diesen Befehl benutzen zu drüfen.");
if(GetPVarInt(playerid,"Eingeloggt") == 0)return SendClientMessage(playerid,SAMP_WEISS,""ACCINFO"Du bist nicht eingeloggt!");
if(Spieler[playerid][pAWAYFROMKEYBOARD] == 1)return SendClientMessage(playerid,SAMP_WEISS,"Du bist im AFK-Modus und kannst somit keine Befehle nutzen."),SendClientMessage(playerid,SAMP_WEISS,""#HTML_BLAU"Verwendung:"#HTML_WEISS" /back");
if(Spieler[playerid][pInPrison] == 1)return SendClientMessage(playerid,SAMP_WEISS,"Du bist im Prison.");
if(Spieler[playerid][pFriedhof] == 1)return SendClientMessage(playerid,SAMP_WEISS,"Du bist nicht in der Lage zu schrieben.");
if(Spieler[playerid][pDeath] == 1)return SendClientMessage(playerid,SAMP_WEISS,"Du bist verletzt.");
if(Spieler[playerid][pJailed] != 0)return SendClientMessage(playerid,SAMP_WEISS,"Du bist im Gefängnis.");
if(Spieler[playerid][pTazerd] == 1)return SendClientMessage(playerid,SAMP_WEISS,"Du bist K.O/getazert.");
if(Spieler[playerid][pCuffed] == 1)return SendClientMessage(playerid,SAMP_WEISS,"Du bist gefesselt.");
new pID,ortungsstring[128],Float:x,Float:y,Float:z;
if(isPlayerInFrakt(playerid,1) || isPlayerInFrakt(playerid,6) || isPlayerInFrakt(playerid,2) || isPlayerInFrakt(playerid,16))
{
if(Spieler[playerid][pOrtungsgeraet] == 0)return SendClientMessage(playerid,SAMP_WEISS,"Kein Ortungsgerät dabei.");
if(sscanf(params,"i",pID))return SendClientMessage(playerid,SAMP_WEISS,""#HTML_BLAU"Benutze:"#HTML_WEISS"/orten [playerid]");
format(ortungsstring,sizeof(ortungsstring),"Du versuchst %s (ID:%i) zu orten...",SpielerName(pID),pID);
SendClientMessage(playerid,SAMP_WEISS,ortungsstring);
if(Spieler[pID][pHandy] == 0)return SendClientMessage(playerid,SAMP_WEISS,"Nicht ortbar.");
if(Spieler[pID][pHandystate] == 0)return SendClientMessage(playerid,SAMP_WEISS,"Nicht ortbar.");
if(Spieler[pID][pDeath] == 1)return SendClientMessage(playerid,SAMP_WEISS,"Nicht ortbar.");
if(Spieler[pID][pFriedhof] == 1)return SendClientMessage(playerid,SAMP_WEISS,"Nicht ortbar.");
format(ortungsstring,sizeof(ortungsstring),"Du hast %s (ID:%i) geortet. Nutze '/delcheck' um den Checkpoint zu entfernen.",SpielerName(pID),pID);
SendClientMessage(playerid,GRUEN,ortungsstring);
KillTimer(SpielerOrtenTimer[playerid]);
GetPlayerPos(pID,x,y,z);
SetPlayerCheckpoint(playerid,x,y,z,3);
Spieler[playerid][pOrtenVehORPlayer] = 1;//1 playerid 2 veh 3 service accept
Spieler[playerid][pOrtenVehIDplayerid] = pID;
SpielerOrtenTimer[playerid] = SetTimerEx("SpielerOderFahrzeugOrten",1000,1,"iii",playerid,pID,1);
Spieler[playerid][pIsearch] = 1;
return 1;
}
return SendClientMessage(playerid,SAMP_WEISS,""ACCINFO"Du bist nicht in der jeweiligen Fraktion.");
} -
Versuche es so:
new driver = GetVehicleDriver(vehicleid);
zu:
new driver = GetVehicleDriver(GetPlayerVehicleID(playerid)); -
Wie sieht dein Code jetzt aus?
-
Vor der Ticket-Abfrage:
new driver = GetVehicleDriver(vehicleid);
if(!IsPlayerConnected(driver))
{
new Float:x, Float:y, Float:z;
GetPlayerPos(playerid,x,y,z);
SetPlayerPos(playerid,x+2,y+2,z+2);
Spieler[playerid][pTicket] = false;
return SCM(playerid,GELB, "Du musst auf den Lockführer warten!");
}