Kurze Frage noch anbei, möchte hier den inputtext zwischen speichern, wie mache ich das? (Ist ein Name)
ATMPlayer[playerid][64]
[SAMMELTHREAD] Kleine Scripting Fragen
- Rafelder
- Unerledigt
Dein Problem konnte durch einen User gelöst werden? Bedank dich bei ihm indem du seinen Beitrag als Hilfreich markierst sowie einen Daumen oben dalässt
Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!
Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
-
-
Wie wird der Name denn übergeben?
Oder willste den Spielernamen speichern?
Theoretisch einfach mit:
format(ATMPlayer[playerid], sizeof(ATMPlayer[]), inputtext);Für Zwischenspeicherung eigenen sich aber auch gut PVars, da man diese nach temporärer Nutzung wieder löschen kann
-
Danke, perfekt.
Sollte dementsprechend so sein, jedoch werden ATM's nur manchmal gelöscht und ich kriege öfters eine Warnung, dass ich nicht in der Nähe bin. Letztendlich funktioniert dann auch derjenige ATM nicht mehr..
CMD:delete(playerid, params[])
{
new str[32];
if(sscanf(params, "s[32]", str))return SendClientMessage(playerid, COLOR_GREY, "Verwendung: /delete [ATM]");
if(strcmp(str, "ATM", true) == 0)
{
for(new i=0;i<MAX_ATM;i++)
{
if(IsPlayerInRangeOfPoint(playerid, 1.5, ATMInfo[i][aPos][0], ATMInfo[i][aPos][1], ATMInfo[i][aPos][2]))
{
ATMInfo[i][aPos][0] = 0.0;
ATMInfo[i][aPos][1] = 0.0;
ATMInfo[i][aPos][2] = 0.0;
ATMInfo[i][aPos][3] = 0.0;
ATMInfo[i][aPos][4] = 0.0;
ATMInfo[i][aPos][5] = 0.0;
DestroyDynamicObject(ATMInfo[i][aObject]);
DestroyDynamic3DTextLabel(ATMInfo[i][aLabel]);
ATMInfo[i][aLabel] = Text3D: INVALID_3DTEXT_ID;new query[128];
mysql_format(MySQLConnection, query, sizeof(query), "DELETE FROM `server_atm` WHERE `ID` = '%d' LIMIT 1", i);
mysql_query(MySQLConnection, query);
}
}
return SendClientMessage(playerid, COLOR_GREY, "Du befindest dich nicht in der Nähe eines Bankautomaten.");
}
return 1;
} -
Pack unter Zeile 24 mal ein return 1;
-
Ebenso danke. Was mir komisch erscheint ist, ich erstelle beispielweise 3 ATM's In-Game.
Diese werden in die Datenbank eingetragen und lediglich 1 funktioniert davon.Ich weiß nicht woran es liegt. Ich versuche Sie zu löschen, lediglich der funktionierende lässt sich löschen. Object alles wird entfernt, aber aus der Datenbank wird der ATM eben nicht entfernt.
Erstellen/Löschen:
CMD:create(playerid, params[])
{
new str[32];
if(sscanf(params, "s[32]", str))return SendClientMessage(playerid, COLOR_GREY, "Verwendung: /create [ATM]");
if(strcmp(str, "ATM", true) == 0)
{
new id = GetFreeATM();
if(id == -1) return SendClientMessage(playerid, COLOR_GREY, "Der Server hat die maximale Anzahl an Bankautomaten erreicht. ("#MAX_ATM"/"#MAX_ATM")");
new Float:Pos[3], Object;
GetPlayerPos(playerid, Pos[0], Pos[1], Pos[2]);
GetXYInFrontOfPlayer(playerid, Pos[0], Pos[1], 3.0);
Object = CreateDynamicObject(19526, Pos[0], Pos[1], Pos[2], 0.0, 0.0, 0.0, -1, -1);
EditDynamicObject(playerid, Object);
ATMEdit[playerid] = true;
}
return 1;
}CMD:delete(playerid, params[])
{
new str[32];
if(sscanf(params, "s[32]", str))return SendClientMessage(playerid, COLOR_GREY, "Verwendung: /delete [ATM]");
if(strcmp(str, "ATM", true) == 0)
{
for(new i=0;i<MAX_ATM;i++)
{
if(IsPlayerInRangeOfPoint(playerid, 3.0, ATMInfo[i][aPos][0], ATMInfo[i][aPos][1], ATMInfo[i][aPos][2]))
{
ATMInfo[i][aPos][0] = 0.0;
ATMInfo[i][aPos][1] = 0.0;
ATMInfo[i][aPos][2] = 0.0;
ATMInfo[i][aPos][3] = 0.0;
ATMInfo[i][aPos][4] = 0.0;
ATMInfo[i][aPos][5] = 0.0;
DestroyDynamicObject(ATMInfo[i][aObject]);
DestroyDynamic3DTextLabel(ATMInfo[i][aLabel]);
ATMInfo[i][aLabel] = Text3D: INVALID_3DTEXT_ID;new query[128];
mysql_format(MySQLConnection, query, sizeof(query), "DELETE FROM `server_atm` WHERE `ID` = '%d' LIMIT 1", i);
mysql_query(MySQLConnection, query);
return 1;
}
}
return SendClientMessage(playerid, COLOR_GREY, "Du befindest dich nicht in der Nähe eines Bankautomaten.");
}
return 1;
}
stock GetFreeATM()
{
new szQuery[64], rows;
for(new id = 0; id < MAX_ATM; id++)
{
mysql_format(MySQLConnection,szQuery,sizeof(szQuery),"SELECT * FROM `server_atm` WHERE `ID` = '%d'", id);
mysql_query(MySQLConnection,szQuery);
cache_get_row_count(rows);
if(rows == 0) return id;
}
return -1;
} -
GetFreeATM()
Das funktioniert nicht so
Du musst die cache Funktion in einem Callback verwenden und nicht direkt darunter.
Ansonsten ist diese immer 0 und deshalb funktioniert nur der 1. ATM, da der den index 0 hat
-
Erklärung für blöde bitte. - Uhrzeit..
-
Schau hier nochmal rein: http://forum.sa-mp.com/showthread.php?t=337810
du musst forward und public nutzen für die cache Funktionen
-
Hab mir das ganze mal angeschaut, verstehe es leider echt nicht.. Ist meine erste Arbeit mit dieser Art von Systemen..
-
Kleines Beispiel
Codemysql_format(handle, query, sizeof(query), "SELECT * FROM Accounts WHERE Name = '%e' AND password = MD5('%e')", pInfo[playerid][pName], inputtext); mysql_pquery(handle, query, "OnUserLogin", "d", playerid); //Du kannst nicht hier das Cache_.... verwenden da dann immer 0 herraus kommt
Code
Alles anzeigenSondern hier ( wie Kaliber sagt ein anderer Callback als da wo den Mysql Befehl ausführst ) public OnUserLogin(playerid) { new rows; cache_get_row_count(rows); if(rows == 0) { ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "{FFFFFF}Anmeldung", "{FFFFFF}Bitte logge Dich ein:\n{FF0000}Falsches Passwort!", "{FFFFFF}Ok", "{FFFFFF}Abbrechen"); } else { cache_get_value_name_int(0, "ID", pInfo[playerid][p_id]); cache_get_value_name_int(0, "Skin", pInfo[playerid][pSkin]);
-
-
Tue ich doch bei mir gar nicht?
CMD:create(playerid, params[])
{
new str[32];
if(sscanf(params, "s[32]", str))return SendClientMessage(playerid, COLOR_GREY, "Verwendung: /create [ATM]");
if(strcmp(str, "ATM", true) == 0)
{
new id = GetFreeATM();
if(id == -1) return SendClientMessage(playerid, COLOR_GREY, "Der Server hat die maximale Anzahl an Bankautomaten erreicht. ("#MAX_ATM"/"#MAX_ATM")");
new Float:Pos[3], Object;
GetPlayerPos(playerid, Pos[0], Pos[1], Pos[2]);
GetXYInFrontOfPlayer(playerid, Pos[0], Pos[1], 3.0);
Object = CreateDynamicObject(19526, Pos[0], Pos[1], Pos[2], 0.0, 0.0, 0.0, -1, -1);
EditDynamicObject(playerid, Object);
ATMEdit[playerid] = true;
}
return 1;
} -
-
Passt perfekt. Entschuldige mich, wenn ich dir am Anfang nicht folgen konnte. Habe das mit der Objekt Variable erst gerade gesehen.
Ein einziges Problem stellt sich mir noch.
Ich habe ein System, welches einen Spieler ermöglicht, Überweisungen auszuführen, während der Spieler offline ist.
Das ganze funktioniert auch halb, ich überweise beispielweise den Spieler Finn Geld und es funktioniert, nehme ich einen anderen Spieler in der Datenbank bekomme ich die Meldung, dass der Account nicht gefunden wurde.
public Server_ATMTranslate(playerid)
{
new rows = cache_num_rows();
if(rows)
{
new ID, LastMoney, query[128], PIN;
cache_get_value_name_int(0, "ID", ID);
cache_get_value_name_int(0, "Bank", LastMoney);
cache_get_value_name_int(0, "PIN", PIN);
if(PIN == 0)
{
strdel(DialogString, 0, sizeof(DialogString));
format(DialogString, sizeof(DialogString),""HTML_SERVER1"Fehler:"HTML_SERVER2" Der angegebene Spieler hat noch kein Konto bei der Bank of SA\n\n"HTML_SERVER2"Willkommen bei der "HTML_SERVER1"Bank of SA"HTML_SERVER2",\n"HTML_SERVER2"bitte gebe nun den gewünschten Spieler an, welchen du ("HTML_SERVER1"$%d"HTML_SERVER2") überweisen möchtest.\n\n", ATMAmount[playerid]);
strcat(DialogString, ""HTML_SERVER1"Info: "HTML_SERVER2"Bitte gebe nun in das untere Feld den Namen ein, hierbei ist es irrelevant ob er online oder offline ist.");
ShowPlayerDialog(playerid, DIALOG_ATMTRANSLATEPLAYER, DIALOG_STYLE_INPUT, ""#HTML_SERVER1""#SERVER_NAME" "HTML_SERVER2"- Bankautomat (Geld überweisen)", DialogString, "Bestätigen", "Zurück");
return 1;
}
PlayerInfo[playerid][pBank] -= ATMAmount[playerid];
LastMoney += ATMAmount[playerid];
mysql_format(MySQLConnection, query, sizeof(query), "UPDATE `server_accounts` SET `Bank` = '%d' WHERE `ID` = '%d' LIMIT 1", LastMoney, ID);
mysql_query(MySQLConnection, query);
strdel(DialogString, 0, sizeof(DialogString));
format(DialogString, sizeof(DialogString),""HTML_SERVER2"Willkommen bei der "HTML_SERVER1"Bank of SA"HTML_SERVER2",\n"HTML_SERVER2"du hast dem offline Spieler "HTML_SERVER1"%s "HTML_SERVER2"erfolgreich ("HTML_SERVER1"$%d"HTML_SERVER2") auf sein Bankkonto überwiesen.\n\n"HTML_SERVER1"Info: "HTML_SERVER2"Diese Transaktion ist nun ebenfalls in deiner Transaktionsübersicht vorhanden.", ATMPlayer[playerid] , ATMAmount[playerid]);
ShowPlayerDialog(playerid, DIALOG_ATMTRANSLATEFINISH, DIALOG_STYLE_MSGBOX, ""#HTML_SERVER1""#SERVER_NAME" "HTML_SERVER2"- Bankautomat (Geld überweisen)", DialogString, "Schließen", "");
new query1[512], timestring[256], Day, Month, Year, Hour, Minute, Second;
getdate(Year, Month, Day);
gettime(Hour, Minute, Second);
format(timestring, sizeof(timestring),"%02d.%02d.%d - %02d:%02d:%02d", Day, Month, Year, Hour, Minute, Second);
mysql_format(MySQLConnection, query1, sizeof(query1),"INSERT INTO `server_atmlog`(`Absender`, `Empfänger`, `Zeit`, `Betrag`) VALUES ('%e', '%e', '%s', '%d')", PlayerInfo[playerid][pName], ATMPlayer[playerid], timestring, ATMAmount[playerid]);
mysql_query(MySQLConnection, query1);
}
else
{
strdel(DialogString, 0, sizeof(DialogString));
format(DialogString, sizeof(DialogString),""HTML_SERVER1"Fehler:"HTML_SERVER2" Der angegebene Spieler existiert nicht in der Datenbank\n\n"HTML_SERVER2"Willkommen bei der "HTML_SERVER1"Bank of SA"HTML_SERVER2",\n"HTML_SERVER2"bitte gebe nun den gewünschten Spieler an, welchen du ("HTML_SERVER1"$%d"HTML_SERVER2") überweisen möchtest.\n\n"HTML_SERVER1"Info: "HTML_SERVER2"Bitte gebe nun in das untere Feld den Namen ein, hierbei ist es irrelevant ob er online oder offline ist.", ATMAmount[playerid]);
ShowPlayerDialog(playerid, DIALOG_ATMTRANSLATEPLAYER, DIALOG_STYLE_INPUT, ""#HTML_SERVER1""#SERVER_NAME" "HTML_SERVER2"- Bankautomat (Geld überweisen)", DialogString, "Bestätigen", "Zurück");
return 1;
}
return 1;
}
format(ATMPlayer[playerid], sizeof(ATMPlayer[]), inputtext);
new query[128];
mysql_format(MySQLConnection, query, sizeof(query), "SELECT * FROM server_accounts WHERE Name = '%e' LIMIT 1", inputtext);
mysql_pquery(MySQLConnection, query, "Server_ATMTranslate", "d", playerid); -
dass der Account nicht gefunden wurde.
Nur als Info, du kannst auch direkt inputtext im mysql_format verwenden, musst es da nicht in eine Variable packen
Zu dem Fehler, printe dir doch mal dein Query und dann schau in PHPMyAdmin nach, lass das query laufen und schau, was er dir da ausgibt.
Wahrscheinlich existiert der Spielername dann wirklich nicht
-
Achso, okay danke.
Der query scheint richtig zu laufen
/e:
Es kommt immer nur (befördert), obwohl ich ihm einen niedrigeren Rang setze?
CMD:makeadmin(playerid, params[])
{
new playerID, Rang, string[256];
//if(PlayerInfo[playerid][pAdmin] < 6)return SendClientMessage(playerid, COLOR_GREY, ERROR_ADMIN);
if(sscanf(params, "ui", playerID, Rang))return SendClientMessage(playerid, COLOR_GREY, "Verwendung: /makeadmin [SpielerID/Teilname] [Rang]");
if(Rang < 0 || Rang > 6)return SendClientMessage(playerid, COLOR_GREY, "Verwendung: /makeadmin [SpielerID/Teilname] [Rang (0-6)]");
if(!IsPlayerConnected(playerID))return SendClientMessage(playerid, COLOR_GREY, ERROR_OFFLINE);
if(!PlayerInfo[playerID][pLogin])return SendClientMessage(playerid, COLOR_GREY, ERROR_LOGIN);
if(Rang < PlayerInfo[playerID][pAdmin])
{
PlayerInfo[playerID][pAdmin] = Rang;
if(Rang == 0)
{
format(string, sizeof(string),"AdminCMD: %s %s hat dich aus dem Team geworfen", GetPlayerAdminName(playerid), PlayerInfo[playerid][pName]);
SendClientMessage(playerID, COLOR_LIGHTBLUE, string);
format(string, sizeof(string),"AdminCMD: Du hast %s aus dem Team geworfen", PlayerInfo[playerID][pName]);
SendClientMessage(playerid, COLOR_LIGHTBLUE, string);
}
else
{
format(string, sizeof(string),"AdminCMD: %s %s hat dich zum Team-Rang %s degradiert", GetPlayerAdminName(playerid), PlayerInfo[playerid][pName], GetPlayerAdminName(playerID));
SendClientMessage(playerID, COLOR_LIGHTBLUE, string);
format(string, sizeof(string),"AdminCMD: Du hast %s zum Team-Rang %s degradiert", PlayerInfo[playerID][pName], GetPlayerAdminName(playerID));
SendClientMessage(playerid, COLOR_LIGHTBLUE, string);
}
}
else
{
format(string, sizeof(string),"AdminCMD: %s %s hat dich zum Team-Rang %s befördert", GetPlayerAdminName(playerid), PlayerInfo[playerid][pName], GetPlayerAdminName(playerID));
SendClientMessage(playerID, COLOR_LIGHTBLUE, string);
format(string, sizeof(string),"AdminCMD: Du hast %s zum Team-Rang %s befördert", PlayerInfo[playerID][pName], GetPlayerAdminName(playerID));
SendClientMessage(playerid, COLOR_LIGHTBLUE, string);
}
return 1;
} -
if(Rang < PlayerInfo[playerID][pAdmin])
Die Abfrage ist ja auch falsch rum.
if(PlayerInfo[playerID][pAdmin] > Rang)
So muss es heißen, da der AdminRang ja größer sein muss, als der Neue Rang, damit man degradiert werden kann
-
Beitrag von FamouZz_ ()
Dieser Beitrag wurde vom Autor gelöscht (). -
Dann Debugge mal deinen Code
Printe dir die einzelnen Variablen über den if-Statements mal und schau was da so rauskommt
-
Hey ich wollte mal wissen ob es iwas zu wissen gibt beiDynamischen Objecten die man ans Fahrzeug Attacht weil so Funktioniert es
CodeHolzfb[i][holzfb_hID] = CreateObject(1463,0,0,-1000,0,0,0,100); AttachObjectToVehicle(Holzfb[i][holzfb_hID], Holzf[playerid][holzf_carid], 0.000000,-1.710000,0.280000,0.000000,0.000000,0.000000);
Aber so nicht ? -
Aber so nicht ?
Das liegt an dem Create
Um es kurz zu machen, mach die 100); hinten weg, bei dem einen ist es die DrawDistance und bei DynamicObject ist das die worldid