Warum ist "i" nicht definiert?
Weil du es playerid genannt hast? ![]()
Müsstest es dann schon i nennen, da du ja keine playerid übergibst ![]()
Warum ist "i" nicht definiert?
Weil du es playerid genannt hast? ![]()
Müsstest es dann schon i nennen, da du ja keine playerid übergibst ![]()
Naja das Funktioniert in dem Fall leider auch nicht, da sonst alle Website-Benutzer gleichzeitig
auf dem Server sein müssten ![]()
Hab das jetzt aber hinbekommen mit einer einzigen Funktion
Verstehe aber nicht warum man das nicht "wollen" wollte ![]()
Achsoo sehe erst jetzt, dass sich der Name nicht auf den Spielernamen bezieht, okay.
Verstehe aber nicht warum man das nicht "wollen" wollte
Weil der Server in dieser Zeit nichts machen kann und auf das Ergebnis von der Datenbank warten muss.
stock GetUserIDByName(const name[])
{
new Cache:reports,query[128];
mysql_format(mysqlconnect, query, sizeof(query), "SELECT `userID` FROM `user` WHERE `username` = '%e' LIMIT 1", name);
reports = mysql_query(mysqlconnect, query, true);
new count = cache_num_rows();
if(!count) return 0;
new userID;
cache_get_value_name_int(0, "userID", userID);
return userID;
}
Alles anzeigen
Nutze bei Strings zudem IMMER %e, sonst wäre eine SQL-Injection möglich.
Bekomme bei dieser Funktion folgenden Fehler: error 079: inconsistent return types (array & non-array)
Den string zu formatieren bringt auch nichts
Wenn der Gruppenname gefunden wurde, wird dieser zurückgegeben, als String.
Wenn nicht, wird 0 zurückgegeben. Entweder oder, aber nicht beides.
Btw gibst du den Gruppennamen zurück, statt die ID.
Auf die Verwendung der Schleife gehe ich jetzt mal nicht ein.
Ja nur kriege ich dann den Fehler
warning 209: function "GetGroupIDByName" should return a value
Wenn ich das return 0 am Ende entferne
Dann lass es da stehen und return einen String "Nicht gefunden", o.ä.
Weiterhin stellt sich mir die Frage, warum du den Gruppennamen zurück gibst, wenn du diesen doch als Paramter der Funktion übergibst, damit du die ID erhältst?
Stimmt, da hatte ich wohl einen Denkfehler, danke für den Anstoß.
So ich stehe momentan vor folgender Schwierigkeit da ich mich mit #emit etc. nicht auskenne.
Ich will ein Script bisschen aufarbeiten indem ich das 2 sprachig mache.
Ich habe da alles vollgeklatscht mit SendClientMessageEx.
SendClientMessageEx(playerid, color, form[], {Float, _}: ...) {
#pragma unused form
static
tmp[145]
;
new
t1 = playerid,
t2 = color
;
const
n4 = -4,
n16 = -16,
size = sizeof tmp
;
#emit stack 28
#emit push.c size
#emit push.c tmp
#emit stack n4
#emit sysreq.c format
#emit stack n16
return (t1 == -1 ? (SendClientMessageToAll(t2, tmp)) : (SendClientMessage(t1, t2, tmp)) );
}
Alles anzeigen
Dann habe ich folgendes gefunden aus dem Multilanguage Tutorial.
stock SendMessage(playerid, colour, Language1[], Language2[]) {
switch( player_Language[playerid] ) {
case 0: { SendClientMessage(playerid, colour, Language1); }
case 1: { SendClientMessage(playerid, colour, Language2); }
}
return true;
}
Wie kann ich beides kombinieren, so dass ich z.B. ein SendMessageEx habe, mit dem ich dann Daten sowohl in den Text von Sprache 1 als auch Sprache 2 packen kann? Kann da jemand was bauen?
z.B. sowas SendMessageEx(i, COLOR_WHITE, "%d joined the server","%d ha entrado al servidor",playerid); bzw, am besten das ganze noch fuer 3 Sprachen.
wie kann ich das Auto respawnen in dem ich grade sitze.
also mit /respawncar bsp.
bzw, am besten das ganze noch fuer 3 Sprachen.
Du kannst dafür ein Makro nutzen ![]()
Habe mal eins Geschrieben, exakt für 3 Sprachen:
#define SendMessageEx(%0,%1,%2,%3,%4,%5) format(string,sizeof(string),(player_Language[%0]==0)?(%2):(player_Language[%0]==1)?(%3):(%4),%5),SendClientMessage(%0,%1,string)
//Kannst die Sprachen so definieren
enum
{
LANGUAGE_A,
LANGUAGE_B,
LANGUAGE_C
};
//Dann mal ein Beispiel:
player_Language[playerid] = LANGUAGE_A;
new string[128];
SendMessageEx(playerid,-1,"A: %d","B: %d","C: %d",5);
//Output:
//A: 5
Alles anzeigen
Bei LANGUAGE_B würde eben B: 5 ausgegeben werden und bei LANGUAGE_C eben C: 5 ![]()
Absolut genial, ich danke dir
Das klappt prima.
Guten Abend,
ich habe mal eine Frage, ich möchte gerne das er einen Random Skin aus meiner Liste erhält, meine Liste schaut wie folgt aus:
#define MAX_SKIN_DATA 20
enum e_SkinData{
skinID,
skinGender,
skinFraktion
}
new 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}
};
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.
Mit freundlichen Grüßen,
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! ![]()
Welchen Kommandoprozessor koennt ihr als den besten empfehlen? ![]()
Welchen Kommandoprozessor koennt ihr als den besten empfehlen?
Ist schon cute: https://forum.sa-mp.com/showthread.php?t=608474
Ich bevorzuge y_command- aber auch nur, weil ich die YSI Libary nutze
Was ist pawnCMD ?
Steht doch in dem Link von Kaliber...
https://forum.sa-mp.com/showthread.php?t=608474