Wie muss ich nun mit einer Schleife vorgehen, das er Beachtet welches Geschlecht er ist und welche Fraktion er ist.
Und das er dann natürlich nur den Skin aus meiner Liste Erhält.
Das könntest du so lösen:
stock GetRandomSkin(playerid, gender, fraktion)
{
new counter, str[10];
for(new i; i<sizeof(SkinData); i++)
{
if(SkinData[i][skinGender] != geneder || SkinData[i][skinFraktion] != fraktion) continue;
format(str,sizeof(str),"r!s_%d",counter++),
SetPVarInt(playerid,str,SkinData[i][skinID]);
}
if(!counter) return -1;
format(str,sizeof(str),"r!s_%d",random(counter));
new final_skin = GetPVarInt(playerid,str);
for(new i=counter-1; i!=-1; i--)
{
format(str,sizeof(str),"r!s_%d",i),
DeletePVar(playerid,str);
}
return final_skin;
}
Alles anzeigen
Beispiel Nutzung:
new skin = GetRandomSkin(playerid, gender, fraktion);
if(skin == -1) return -1; //Fehler, weil kein Skin mit diesen Kriterien gefunden!!
SetPlayerSkin(playerid, skin);
Erklärung wie funktioniert der Code?
Also am Anfang werden 2 Variablen erstellt.
counter dient dazu mit zu zählen, wie viele Skins in Frage kämen mit den passenden Kriterien.
str in dieser Variable wird einfach nur der String gespeichert.
Anschließend kommt die Schleife, wo jeder Skin durchgegangen wird und geprüft wird, ob das Geschlecht & die Fraktion dem Skin entsprechen würden.
Dieser wird anschließend in einem PVar gespeichert und der counter natürlich um 1 hochgezählt.
Ist nach der Schleife der counter 0 wissen wir, dass kein Skin gefunden wurde. (also return -1)
Nun wird aus den Skins, die potentiell in Frage kämen einer zufällig ausgewählt. (und zwischengespeichert)
Anschließend werden alle PVars wieder gelöscht, weil brauchen wir ja jetzt nicht mehr.
Und der finale-Skin wird zurückgegeben ![]()
Noch ein Mini Vorschlag:
Nutze stock const anstatt new bei deinen SkinData.
Da das ja quasi keine Variable ist, hier wird nichts mehr verändert (während der Laufzeit), das sind ja alles Konstanten ![]()
Deshalb gebe das so an, dann kann der Compiler das besser im Speicher optimieren.
stock const SkinData[MAX_SKIN_DATA][e_SkinData] = {
{2, 1, 0}, {6, 1, 0}, {7, 1, 0}, {15, 1, 0}, {19, 1, 0}, {21, 1, 0}, {22, 1, 0}, {23, 1, 0}, {26, 1, 0}, {29, 1, 0},
{11, 2, 0}, {12, 2, 0}, {13, 2, 0}, {41, 2, 0}, {54, 2, 0}, {55, 2, 0}, {69, 2, 0}, {90, 2, 0}, {93, 2, 0}, {192, 2, 0}
};
Desweiteren brauchst du theoretisch dieses MAX_SKIN_DATA nicht.
Das verwirrt meiner Meinung nach nur irgendwie xD
Schreibe es einfach so:
stock const SkinData[][e_SkinData] = {
{2, 1, 0}, {6, 1, 0}, {7, 1, 0}, {15, 1, 0}, {19, 1, 0}, {21, 1, 0}, {22, 1, 0}, {23, 1, 0}, {26, 1, 0}, {29, 1, 0},
{11, 2, 0}, {12, 2, 0}, {13, 2, 0}, {41, 2, 0}, {54, 2, 0}, {55, 2, 0}, {69, 2, 0}, {90, 2, 0}, {93, 2, 0}, {192, 2, 0}
};
Und wie viele Elemente jetzt im Array sind, kannst du einfach mit:
sizeof(SkinData) abfragen.
Keine Angst, von der Performanz her macht das keinen Unterschied, da das vom Pre-Compiler auch ersetzt wird durch eine konstante Zahl, wie das Makro ![]()
Hoffe ich hatte dich richtig verstanden und die Antwort hilft dir weiter! ![]()