Beiträge von Manyula

In 10 Minuten startet der nächtliche Backupvorgang! Es kann währenddessen (ca. 10 Minuten) zu Einschränkungen bei der Nutzung des Forums kommen
Weitere Infos findet ihr im Thema Backup des Forums

    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.

    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 line


    Was 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.

    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 mir wird die .exe gar nicht erst ausgeführt, wenn ich drauf klicke. Dann heißts wohl weiter warten, bis die Meldung kommt.