[SAMMELTHREAD] Kleine Scripting Fragen

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 :)

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • 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.. :D

    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;
    }

  • 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 :klugs:

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Kleines Beispiel


    Code
    mysql_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


  • 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;
    }

  • stock GetFreeATM()

    Schreib die Funktion am Einfachsten mal so:


    C
    stock GetFreeATM()
    {
        for(new id; id < MAX_ATM; id++)
        {
            if(!ATMInfo[id][aObject]) return id;
        }
        return -1;
    }


    und bei deinem Create, die Objekt Variable macht da keinen Sinn.


    Schreib das mal so:



    C
    new Float:Pos[3];
    GetPlayerPos(playerid, Pos[0], Pos[1], Pos[2]);
    GetXYInFrontOfPlayer(playerid, Pos[0], Pos[1], 3.0);
    ATMInfo[id][aObject] = CreateDynamicObject(19526, Pos[0], Pos[1], Pos[2], 0.0, 0.0, 0.0, -1, -1);
    EditDynamicObject(playerid, ATMInfo[id][aObject]);
    ATMEdit[playerid] = true;

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • 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 :D

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Achso, okay danke. :)


    Der query scheint richtig zu laufen


    SQL
    SELECT * FROM server_accounts WHERE Name = 'Peter' LIMIT 1

    /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;
    }

    Einmal editiert, zuletzt von FamouZz_ ()

  • 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 ;)

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Beitrag von FamouZz_ ()

    Dieser Beitrag wurde vom Autor gelöscht ().
  • Hey ich wollte mal wissen ob es iwas zu wissen gibt beiDynamischen Objecten die man ans Fahrzeug Attacht weil so Funktioniert es



    Code
    Holzfb[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 ?


    Code
    Holzfb[i][holzfb_hID] = CreateDynamicObject(1463,0,0,-1000,0,0,0,100);
    							AttachDynamicObjectToVehicle(Holzfb[i][holzfb_hID], Holzf[playerid][holzf_carid], 0.000000,-1.710000,0.280000,0.000000,0.000000,0.000000);
  • do.de - Domain-Offensive - Domains für alle und zu super Preisen