Kleine Verständnisfrage zu threaded queries: hab ich es richtig verstanden, dass nach dem Gebrauch von mysql_tquery IMMER im zweiten Thread weitergeschrieben wird, sprich, dass nie Code unter mysql_tquery soll?
Beiträge von Manyula
-
-
Okay, gut. Noch etwas: Ich versehe jeden Account mit einer einzigartigen DatabaseID, die ich auf AUTO_INCREMENT gestellt habe. Jetzt hab ich mal ein paar Testaccounts gelöscht, und mir ist aufgefallen, dass er nicht wieder bei 1 ansetzt, sondern intern einfach weiterzählt, wo er aufgehört hat, egal, ob der Account noch existiert oder nicht. Ich hab die ID mal manuell bearbeitet und wieder auf 1 gesetzt, in der Hoffnung, dass er sich immer am zuletzt erstellten Account orientiert, dem ist aber nicht so. Kann man diese interne Variable irgendwie zurücksetzen?
-
Keine Ahnung wie, aber ich hab es irgendwie hingekriegt.
Ich habe ein paar Syntaxfehler ausmerzen, und den Logindialog neu setzen müssen. Jetzt geht das Ganze.
Allerdings hätte ich noch eine Frage. Was bedeutet in der Log "skipping result saving"?
[11:20:26] [DEBUG] mysql_format - connection: 1, len: 128, format: "UPDATE `accounts` SET `Money` = %d, `Score` = %d, `Language` = %d WHERE `DatabaseID` = %d"
[11:20:26] [DEBUG] mysql_tquery - connection: 1, query: "UPDATE `accounts` SET `Money` = 0, `Score` = 0, `Language` = 0 W", callback: "(null)", format: "(null)"
[11:20:26] [DEBUG] CMySQLQuery::Execute[] - starting query execution
[11:20:26] [DEBUG] CMySQLQuery::Execute[] - query was successfully executed within 2.781 milliseconds
[11:20:26] [DEBUG] CMySQLQuery::Execute[] - no callback specified, skipping result saving -
Hallo,
mal wieder ein MySQL Thema! Die Hände in die Höh', yüha!
Spaß beiseite, ich befasse mich momentan mit MySQL und habe meinen Code nun soweit bekommen, dass er ohne Errors kompiliert und eine Verbindung zur Datenbank hergestellt wird.
public OnPlayerConnect(playerid)
{
//MySQL - Login/Register
TogglePlayerSpectating(playerid, true);new
query[128],
pName[MAX_PLAYER_NAME];GetPlayerName(playerid, pName, sizeof(pName));
mysql_format(MySQL, query, sizeof(query), "SELECT `Password`, `DatabaseID` FROM `accounts` WHERE `Name` = '%e' LIMIT 1", pName);
mysql_tquery(MySQL, query, "OnAccountCheck", "i", playerid);
}forward OnAccountCheck(playerid);
public OnAccountCheck(playerid)
{
new
rows,
fields;cache_get_data(rows, fields, MySQL);
if(rows)
{
cache_get_field_content(0, "Password", pInfo[playerid][Password], MySQL, 129);
pInfo[playerid][DatabaseID] = cache_get_field_content_int(0, "DatabaseID");new
n[MAX_PLAYER_NAME],
str[MAX_LANGUAGES][128];format(str[LANGUAGE_DE], sizeof(str[]), "Willkommen, %s!\nEs wurden Accountdaten zu diesem Namen gefunden.\nBitte gib unten das Passwort ein.", n);
format(str[LANGUAGE_EN], sizeof(str[]), "Welcome, %s!\nAccount data has been found for this name.\nPleasy type in the password below.", n);ShowLanguageDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_INPUT, "Login", "Login", str[LANGUAGE_DE], str[LANGUAGE_EN], "OK", "OK", "Verlassen", "Leave");
}
else ShowPlayerDialog(playerid, DIALOG_LANGUAGE, DIALOG_STYLE_LIST, "Sprache | Language", "Deutsch - German\nEnglisch - English.", "OK", "Exit");
return 1;
}Also: Der Spieler connected auf den Server, wobei er erst einmal in den Spectator Modus gesetzt wird, um die Class Selection zu deaktivieren. Danach soll eben überprüft werden, ob es Accountdaten zum Namen des Spielers in der Datenbank gibt, oder nicht. Wenn ja, dann kommt der Login Dialog. Wenn nicht, dann kommt zunächst einmal ein Dialog, in dem der Spieler die Sprache auswählen kann, also Deutsch oder Englisch, und im Anschluss daran der Registrations Dialog.
Alles was jedoch passiert ist, dass der Spieler in den Spectator Modus gesetzt wird, mehr nicht. Was habe ich übersehen?
Bitte gebt bescheid, wenn ihr weiteren Code benötigt.
-
Stimmt, ist mir gerade auch aufgefallen...^^ Danke für die Lösung und Erklärung!
-
Also, für mich sieht es aus, als würde ich mit "string[]" 2x denselben String formatiere. Woher weiß der Compiler denn, ob in der ersten Dimension LANGUAGE_DE (0) oder LANGUAGE_EN (1) steht?
-
Mir ist irgendwie schleierhaft, wieso meine Version nicht geht...
Jetzt unterscheiden sich die strings ja nicht, da beide "string[]" sind, oder? Wie sieht die Geschichte eig bei einem 3D Array aus?
-
Hi!
Der Error befindet sich in Zeile 2.
new string[MAX_LANGUAGES][128];
format(string[LANGUAGE_DE], sizeof(string[LANGUAGE_DE]), ""#C_GREEN_E"»» "#C_GREY_E"»SERVER« "#C_TURQUOISE_E"%s"#C_GREY_E"[ID: %i] ist San Andreas Unleashed beigetreten. ["#C_GOLD_E"%d"#C_GREY_E"/100]", pName, playerid, PlayersOnline); //Fehlerzeile!
format(string[LANGUAGE_EN], sizeof(string[LANGUAGE_EN]), ""#C_GREEN_E"»» "#C_GREY_E"»SERVER« "#C_TURQUOISE_E"%s"#C_GREY_E"[ID: %i] has joined San Andreas Unleashed. ["#C_GOLD_E"%d"#C_GREY_E"/100]", pName, playerid, PlayersOnline);
SendLanguageMessageToAll(C_GREY, string[LANGUAGE_DE], string[LANGUAGE_EN]);error 001: expected token: "]", but found "-integer value-"
warning 215: expression has no effect
error 001: expected token: ";", but found "]"
error 029: invalid expression, assumed zero
fatal error 107: too many error messages on one lineWas mache ich falsch?
-
Objektiv gesehen ist SA:MP alles andere als tot. Subjektiv kann jeder für sich entscheiden, ob es das ist oder nicht, bzw. ob er es noch spielt oder nicht. Und ja, die deutsche Community ist im internationalen Vergleich der Haufen Scheiße, und das nicht nur in SA:MP. Da werden alle Klischees mit der vielen Meckerei vollstens erfüllt.
PS: Leute, bitte... Der Tod = Substantiv, tot = Adjektiv. ._.
-
Eine etwas weiterführende Frage: In welchen zeitlichen Dimensionen bewegen wir uns, wenn wir davon reden, dass der Compiler eine Zeile im Vergleich zu z.B. 10.000 Zeilen parst? Man spricht ja ständig davon möglichst zeilensparend zu scripten - hängt das mit der Zeit für das Parsen zusammen?
-
Alles klar, danke für die Klarstellung!
Dann versteh ich die Aufregung mancher nicht mehr, wenn man mal...
new Float:x;
new Float:y;
new Float:z;
...anstatt...
new Float:pos[3];
schreibt, wenn sich das sowieso nichts nimmt. -
Wie sieht es mit Memory aus?
Eine Variable gegen potentiell hunderte Variablen, die ihren Speicherplatz ja nicht wieder freigeben? -
Hi,
ich hab mich gefragt, ob es einen Unterschied macht ob ich nun alle globalen Variablen "roh" deklariere,...
new GVar1[MAX_PLAYERS];
new bool:GVar2;
new Float:GVar3[3];
new Gvar4;
...oder sie allesamt in einen Enumerator packe?
enum gVars
{
GVar[MAX_PLAYERS],
bool:GVar2,
Float:GVar3[3],
GVar4
}
new GVar[gVars];Danke!
-
Soweit ich weiß wird in der SA:MP ESL auch Whitetiger neben WIRE genutzt. Also kann es doch wohl nicht so schlecht sein. Ich habe sowohl mit v1, als auch mit v2 von Whitetigers AC gute Erfahrungen gemacht.
Edit: Hoppla, hab nicht aufs Datum geschaut, ich Totengräber. D:
-
Ich furz auf den Namen, der ist eh nur Schall und Rauch. Dieses Projekt spricht mich mehr an als das gleichnamige andere. Ich hoffe sehr, dass ihr keine Mühen gewcheut habt den AC so gut wie möglich zu machen. GDM war von Cheatern einfach nur verseucht, das hat mir überhaupt keinen Spaß gemacht.
-
Wo liegt der Unterschied dazu, ob ich die VehicleID vorher in eine Variable speicher oder direkt in der Funktion nochmal aufrufe, wie in diesem Fall?
Und danke, ich hab jetzt mal einen Testlauf gemacht, bis jetzt alles in Butter! -
Wenn der Fehler vorkommt, was musst du machen, bzw. was machst du, damit es wieder geht?
Das ganze tritt nur flüchtig auf. Wenn ich dann einen weiteren Teleport eingebe, ist die Sache, bis zum nächsten Vorfall, wieder gegessen.
Wie bereits gesagt, das Phänomen tritt nur auf, wenn ich mich im Auto teleportiere. Zumindest habe ich noch nie einen solchen Fehler on foot gehabt.EDIT: Ich habe eben nochmals debuggt, und zwar im else if statement. Der Code wird aufgerufen, aber komischerweise wird die Position nicht gesetzt! Ich habe mir auch die Koordinaten nach dem Setzen der Position printen lassen, und angezeigt werdendie in AddTeleport angegebenen Koordinaten.
-
Hallo,
ich habe mit einem ziemlich komischen Problem zu tun, dessen Ursache mir völlig unklar ist und das total willkürlich auftritt. Es passiert beim Teleportieren in einem Auto.
Wenn ich mich im Auto mal teleportiere, dann klappt das in der Regel zu 90%. Allerdings kommt es gelegentlich vor, dass der Teleport nicht durchgeführt wird, sprich: Die Position wird nicht gesetzt, aber das Geld wird abgezogen (siehe ab Zeile 21).Das hier ist die Funktion zum Teleportieren. Das spart mir unter den eigentlichen CMDs Unmengen an Zeilen.
stock AddTeleport(playerid, cmdtext[], Float:PedX, Float:PedY, Float:PedZ, Float:PedA, Float:VehX, Float:VehY, Float:VehZ, Float:VehA, bool:buffer, bool:spawnprotect, worldid = 0, interiorid = 0)
{
if(PlayerActionForbidden(playerid)) return 1;
if(IsPlayerInDownState[playerid]) return SendLanguageMessage(playerid, C_RED, "»WARNUNG« Bitte warte, bis du wieder respawnst.", "»WARNING« Please wait until you respawn.");
if(buffer) if(BufferCMD(playerid)) return 1;
new Float:distance = (GetPlayerDistanceFromPoint(playerid, PedX, PedY, PedZ) / 10);
new intDistance = floatround(distance, floatround_round);
if(GetPlayerMoney(playerid) >= intDistance)
{
if(spawnprotect == true)
{
SavePlayerHPandAP(playerid);
SetSpawnProtection(playerid);
}
if(!IsPlayerInAnyVehicle(playerid))
{
SetPlayerPos(playerid, PedX, PedY, PedZ);
SetPlayerFacingAngle(playerid, PedA);
}
else if(IsPlayerInAnyVehicle(playerid))
{
SetPlayerPos(playerid, PedX, PedY, PedZ);
SetVehiclePos(GetPlayerVehicleID(playerid), VehX, VehY, VehZ);
SetVehicleZAngle(GetPlayerVehicleID(playerid), VehA);
PutPlayerInVehicle(playerid, GetPlayerVehicleID(playerid), 0);
}
GivePlayerMoneyEx(playerid, -intDistance);
SetPlayerVirtualWorld(playerid, worldid);
SetPlayerInterior(playerid, interiorid);
SetCameraBehindPlayer(playerid);
UpdateMSG(playerid, cmdtext);
}
else
{
new stringDE[64],
stringEN[64];
format(stringDE, sizeof(stringDE), "»WARNUNG« Du hast nicht genug Geld! "#C_DARK_RED_E"(%d$)", intDistance);
format(stringEN, sizeof(stringEN), "»WARNING« You don't have enough money! "#C_DARK_RED_E"(%d$)", intDistance);
SendLanguageMessage(playerid, C_RED, stringDE, stringEN);
}
return 1;
}Ein Beispiel für einen Teleport wäre dann das hier.
COMMAND:ls(playerid, params[])
{
AddTeleport(playerid, "/ls", 2492.7268, -1668.3849, 13.3438, WEST, 2492.7268, -1668.3849, 13.3438, WEST, true, true, 0, 0);
return 1;
}Ich hoffe, jemand kann mir helfen!
-
Also, ich schicke euch mal die ganze Funktion.
stock AddTeleport(playerid, cmdtext[], Float:PedX, Float:PedY, Float:PedZ, Float:PedA, Float:VehX, Float:VehY, Float:VehZ, Float:VehA, bool:buffer, bool:spawnprotect, worldid = 0, interiorid = 0)
{
if(PlayerActionForbidden(playerid)) return 1;
if(IsPlayerInDownState[playerid]) return SendLanguageMessage(playerid, C_RED, "»WARNUNG« Bitte warte, bis du wieder respawnst.", "»WARNING« Please wait until you respawn.");
if(buffer) if(BufferCMD(playerid)) return 1;
new Float:distance = (GetPlayerDistanceFromPoint(playerid, PedX, PedY, PedZ) / 10);
new intDistance = floatround(distance, floatround_round);
if(GetPlayerMoney(playerid) >= intDistance)
{
if(spawnprotect == true)
{
SavePlayerHPandAP(playerid);
SetSpawnProtection(playerid);
}
GivePlayerMoneyEx(playerid, -intDistance);
SetPlayerPos(playerid, PedX, PedY, PedZ);
SetPlayerFacingAngle(playerid, PedA);
SetVehiclePos(GetPlayerVehicleID(playerid), VehX, VehY, VehZ);
SetVehicleZAngle(GetPlayerVehicleID(playerid), VehA);
PutPlayerInVehicle(playerid, GetPlayerVehicleID(playerid), 0);
SetPlayerVirtualWorld(playerid, worldid);
SetPlayerInterior(playerid, interiorid);
SetCameraBehindPlayer(playerid);
UpdateMSG(playerid, cmdtext);
//Lag Check
new Float:pos[4],
Float:zpos[4];
GetPlayerPos(playerid, pos[0], pos[1], pos[2]);
GetPlayerFacingAngle(playerid, pos[3]);
GetVehiclePos(GetPlayerVehicleID(playerid), zpos[0], zpos[1], zpos[2]);
GetVehicleZAngle(GetPlayerVehicleID(playerid), zpos[3]);
if((pos[0] != PedX && pos[1] != PedY && pos[2] != PedZ && pos[3] != PedA) || (zpos[0] != PedX && zpos[1] != PedY && zpos[2] != PedZ && zpos[3] != PedA))
{
if(!IsPlayerInAnyVehicle(playerid))
{
SetPlayerPos(playerid, PedX, PedY, PedZ);
SetPlayerFacingAngle(playerid, PedA);
}
else
{
SetVehiclePos(GetPlayerVehicleID(playerid), VehX, VehY, VehZ);
SetVehicleZAngle(GetPlayerVehicleID(playerid), VehA);
PutPlayerInVehicle(playerid, GetPlayerVehicleID(playerid), 0);
}
}
}
else
{
new stringDE[64],
stringEN[64];
format(stringDE, sizeof(stringDE), "»WARNUNG« Du hast nicht genug Geld! "#C_DARK_RED_E"(%d$)", intDistance);
format(stringEN, sizeof(stringEN), "»WARNING« You don't have enough money! "#C_DARK_RED_E"(%d$)", intDistance);
SendLanguageMessage(playerid, C_RED, stringDE, stringEN);
}
return 1;
}Das ist eine ganz normale Teleportfunktion mit allerlei Schnickschnack. Manchmal, wenn ich mich teleportieren möchte, werden mir die Teleportkosten zwar abgezogen, aber die Position des Spielers wird nicht gesetzt (siehe Zeilen 17-20) - wahrscheinlich durch Lag. Deswegen möchte ich eine Art "Lag Check" machen (siehe Zeilen 27-47) um nach dem ersten SetPlayerPos zu prüfen, ob die Position des Spielers tatsächlich anders ist.
-
Bei den Personen, die noch kein Icon rechts unten haben: Geht in den Ordner (C:)\Windows\System32\GWX
Dort startet ihr einfach die GWX.exe und schon habt ihr das Reservierenfenster und das Icon unten rechts.(Ob das allerdings auch so 100% klappt, hab ich noch nicht getestet)
/edit:
Scheint so als hätte es bei mir funktioniertExTaZZe:
@GT3RS:
Bei mir wird die .exe gar nicht erst ausgeführt, wenn ich drauf klicke. Dann heißts wohl weiter warten, bis die Meldung kommt.