Hier ein Tutorial speziell dazu:
http://forum.sa-mp.com/showthread.php?t=581336
Beiträge von Jeffry
-
-
if(strlen(input) < 2 || strlen(input) > 64) return SendClientMessage(playerid,COLOR_GRAD2,"Benutze: /sup [Text] Achtung! Maximale Länge: 64 Zeichen");
"cmd" Bezieht sich nur auf den Befehl, in deinem Fall steht da also "/sup" drin.
-
Wie angesprochen, die neuen "Winterstiefel"


EDIT:
@Der Lümmel
Habe auf Grund der Regeln hier im Smalltalk geantwortet: Smalltalk -
Speichere die Daten in den Spieler-Variablen nach der Eingabe im Dialog und führe den INSERT Befehl von MySQL erst nach dem letzten Dialog aus.
-
ein schniekes Makro:
Das ist es wirklich, war mir so gar nicht bekannt, dass der trotz den 6 angegebenen Parametern alle weiteren im letzten Parameter mitzieht (%5 oben), sodass es auch mit mehreren Platzhaltern geht. Man lernt nie aus.
Allerdings rate ich dazu, das so abzuändern:
#define lformat(%0,%1,%2,%3,%4,%5,%6); \
switch(PlayerInfo[%0][language]) \
{ \
case 0,1: format(%1,%2,%3,%6);\
case 2: format(%1,%2,%4,%6);\
case 3: format(%1,%2,%5,%6);\
}Sonst geht der Code nämlich bei mehrdimensionalen Arrays auf die Bretter.
Nutzung wäre dann:
lformat(playerid, string, sizeof(string), "Welcome %s!", "Willkommen %s!", "Benvenuto %s!", name);
print(string); -
SupcarGrund[playerid] = (result);
zu:
format(SupcarGrund[playerid], 64, result); -
Das war nur als Kommentar für die Abfrage gedacht, damit du weißt, was der Code macht.
"Dann nutze playerid." bezieht sich auf diese Zeile:
pID = playerid;
Du kannst es genau so nutzen. Wenn dich der Kommentar verwirrt, kannst du ihn auch entfernen. -
Nein, da arbeitest du ja über den Cache, und eine explizite Speicherung des Results ist nicht mehr notwendig.
Vom Vorgehen:
mysql_pquery(/*Query und Callback angeben*/);
public deinCallback()
{
//Hier den Cache auslesen
}Oder (nur bedingt nutzen)
mysql_query(/*Query*/);
//Hier direkt den Cache auslesen -
Das kannst du so machen:
ocmd:setpint(playerid,params[])
{
new pID, intID;
if(strlen(params) > 0 && IsNumeric(params)) //Steht nur eine Zahl in den Params? Dann nutze playerid.
{
pID = playerid;
intID = strval(params);
}
else if(sscanf(params,"ui",pID,intID)) return SendClientMessage(playerid, -1,"Benutze: /setpint ID InteriorID");
SetPlayerInterior(pID, intID);
return 1;
}Zusammen mit dieser Funktion:
stock IsNumeric(str[])
{
if(!strlen(str)) return 0;
for(new i = 0, j = strlen(str); i < j; i++) if(str[i] > '9' || str[i] < '0') return 0;
return 1;
} -
if(ReturnPlayerID(name) != INVALID_PLAYER_ID) format(str, sizeof(str), "%s{FFFFFF}%d [%s] - {00FF00}Online\n", str, name, fname);
else format(str, sizeof(str), "%s{FFFFFF}%d [%s] - {FF0000}Offline\n", str, name, fname);
Zu
if(ReturnPlayerID(name) != INVALID_PLAYER_ID) format(str, sizeof(str), "%s{FFFFFF}%s [%s] - {00FF00}Online\n", str, name, fname);
else format(str, sizeof(str), "%s{FFFFFF}%s [%s] - {FF0000}Offline\n", str, name, fname); -
mysql_query("SELECT "#Tabelle_Spieler", Leader FROM Name WHERE Rang = 10;");
zu:
mysql_query("SELECT Name, Leader FROM "#Tabelle_Spieler" WHERE Rang = 10;");Sofern in Spalte "Leader" die ID der Fraktion steht. Ansonsten passe das entsprechend an.
-
Nach dem was du willst, dürfte es so aussehen:
stock LoadHaus()
{
new string[400],idx=0;
for(new i; i<MAX_HAUS; i++)
{
format(string, sizeof(string), "SELECT * FROM haus_tabelle WHERE id = '%d'", i); //"haus_tabelle" bitte anpassen, wie die Tabelle bei dir heißt!!
mysql_query(string);
mysql_store_result();
if(!mysql_num_rows())
{
mysql_free_result();
continue;
}
mysql_fetch_row_format(string, "|"); // Ansonsten werden die Daten in "data" gespeichert
mysql_free_result();
sscanf(string, "p<|>ifffffffiis[24]iiii", // Die Daten werden den Variablen zugewiesen
Haus[i][h_id],
Haus[i][h_posx],
Haus[i][h_posy],
Haus[i][h_posz],
Haus[i][h_intx],
Haus[i][h_inty],
Haus[i][h_intz],
Haus[i][h_inta],
Haus[i][h_vw],
Haus[i][h_int],
Haus[i][h_besitzer],
Haus[i][h_kosten],
Haus[i][h_verkauf],
Haus[i][h_isbiz],
Haus[i][h_hid]);// Jetzt muss noch überprüft werden, ob das Haus ein Biz sein soll oder ein Haus UND ob es zum Verkauf steht
if(Haus[i][h_isbiz] == 1)
{
if(Haus[i][h_verkauf] == 0)
{
Haus[i][h_id] = CreatePickup(1273, 1, Haus[i][h_posx], Haus[i][h_posy], Haus[i][h_posz], 0);
format(string, sizeof string, "Haus: %d\nBesitzer: %s", i, Haus[i][h_besitzer]);
Haus[i][label] = Create3DTextLabel(string, Grün, Haus[i][h_posx], Haus[i][h_posy], Haus[i][h_posz], 15.0, 0);
}
else
{
Haus[i][h_id] = CreatePickup(1273, 1, Haus[i][h_posx], Haus[i][h_posy], Haus[i][h_posz], 0);
format(string, sizeof string, "Haus: %d\nZum Verkauf\nKosten: %d$", i, Haus[i][h_kosten]);
Haus[i][label] = Create3DTextLabel(string, ROT, Haus[i][h_posx], Haus[i][h_posy], Haus[i][h_posz], 15.0, 0);
}
}
else
{
if(Haus[i][h_verkauf] == 0)
{
Haus[i][h_id] = CreatePickup(1239, 1, Haus[i][h_posx], Haus[i][h_posy], Haus[i][h_posz], 0);
format(string, sizeof string, "Biz: %s (%d)\nBesitzer: %s\nKosten: %d$", BizName[Haus[i][h_hid]], i, Haus[i][h_besitzer], Haus[i][h_kosten]);
Haus[i][label] = Create3DTextLabel(string, Grün, Haus[i][h_posx], Haus[i][h_posy], Haus[i][h_posz], 15.0, 0);
}
else
{
Haus[i][h_id] = CreatePickup(1239, 1, Haus[i][h_posx], Haus[i][h_posy], Haus[i][h_posz], 0);
format(string, sizeof string, "Biz: %s (%d)\nZum Verkauf\nKosten: %d$", BizName[Haus[i][h_hid]], i, Haus[i][h_kosten]);
Haus[i][label] = Create3DTextLabel(string, ROT, Haus[i][h_posx], Haus[i][h_posy], Haus[i][h_posz], 15.0, 0);
}
}
idx++;
}
printf("Es wurden %i Häuser geladen",idx);
return 1;
}
Das "haus_tabelle" bitte entsprechend deiner Tabelle anpassen. -
Hast du da auch ein SELECT Query dazu? Wo werden denn die Daten selektiert, die du hier auslesen willst?
Oder hast du das noch gar nicht? -
Darf ich fragen warum? Was willst du damit bezwecken?
Kannst du eventuell mal den Befehl posten in dem das so sein soll, und erklären was gemacht werden soll?
-
Kann man zwar schon machen, das geht aber nur unnötig auf die Ressourcen, du hast die Information ja auch im Array.
-
while(mysql_fetch_row(row, "|"))
Zu
while(mysql_fetch_row(row))Der | ist der default Delimiter und wird bei mysql_fetch_row immer genommen.
-
Nutze anstatt
cache_get_value_index_float
Die Funktion
cache_get_value_name_float -
Ahh, ok!
Dann kannst du es so machen:
if(Haus[i][h_posx] != 0.0 || Haus[i][h_posy] != 0.0 || Haus[i][h_posz] != 0.0) continue;Alternativ füge im enum eine Variable "h_exists" dazu, und setze die beim erstellen des Hauses auf true und beim löschen auf false.
bool:h_exists,
Dann kannst du es so machen:
if(Haus[i][h_exists]) continue; -
Hi, wie kann ich herrausfinden ob die haus id bereits Exisiert und wenn ja wie kann ich diese überspringen?
Warum willst du die existierenden Häuser beim Speichern überspringen?
-
Ändere
if(Parkkralle[newcar] == 1 || PlayerCar[playerid][newcar][Kralle] == 1)
zu:
if(Parkkralle[newcar] == 1)Wenn Parkkralle mit der vehicleid 1 ist, dann sollte das entsprechende PlayerCar ebenfalls auf 1 stehen, daher macht eine doppelte Prüfung keinen Sinn.
Der Fehler tritt auf, weil du mit der vehicleid (newcar) in das Array gehst, welches für die 3 PlayerCars steht (0 bis 2), das geht nicht.
