[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 krieg ich das denn jetzt richtig hin ?

    Ich habe dir den Code ausgebessert und mit Kommentaren versehen, damit du die Änderungen nachvollziehen kannst.
    ocmd:unban(playerid,params[])
    {
    new pname[MAX_PLAYER_NAME], preason[64], query[128];
    if(PlayerInfo[playerid][pAdmin] <= 2) return SendClientMessage(playerid,COLOR_GRAD1,"Du bist nicht berechtigt, diesen Befehl auszuführen.");
    //Bei sscanf "s" muss immer die Größe mitgegeben werden, beim neuen Plugin
    if(sscanf(params, "s[24]s[64]", pname, preason)) return SendClientMessage(playerid,COLOR_GRAD1,"FEHLER: /unban [Exakter Spielername] [Grund]");
    //Um Speicher zu sparen, nutzen wir "string" zwei mal, da es nach dem Query-Absenden nicht mehr benötigt wird.
    mysql_format(handle, string, sizeof(string), "SELECT id, Username FROM user WHERE Username = '%e'", pname);
    mysql_pquery(handle, string, "UnBanForPlayer", "ds", playerid, preason); //UnBanForPlayer mitgeben, sonst wird es nicht aufgerufen.
    return 1;
    }


    forward UnBanForPlayer(playerid, preason[]);
    public UnBanForPlayer(playerid, preason[])
    {
    new rows, string[145], id, pname[MAX_PLAYER_NAME]; //145 Zeichen = Maximum für SendClientMessage
    cache_get_row_count(rows);
    if(rows == 0) return SendClientMessage(playerid, COLOR_RED, "Der angegebene Name konnte in der Datenbank nicht gefunden werden!");
    else
    {
    //Daten aus Ergebnis auslesen
    id = cache_get_field_content_int(0, "id", handle);
    cache_get_field_content(0, "Username", pname, handle);
    //Die Nachricht geben wir erst hier aus:
    format(string, sizeof(string), "Du hast %s entbannt, grund %s", pname, preason);
    SendClientMessage(playerid, -1, string);
    //string erhält einen neuen Text, der alte Text (Nachricht) wird verworfen, brauchen wir ja auch nicht mehr.
    mysql_format(handle, string, sizeof(string), "UPDATE `user` SET `pBanned` = '0' WHERE `id` = '%d'", id);
    mysql_pquery(handle, string);
    }
    return 1;
    }

  • Beitrag von Javez ()

    Dieser Beitrag wurde vom Autor aus folgendem Grund gelöscht: Fixxed, Kaliber seine Möglichkeit funktionierte ().
  • Probier mal:


    C
    new string[2048] = HTML_SERVER"Arena\t"HTML_SERVER"Spieler / Maximale Spieler\t"HTML_SERVER"Waffen";
    for(new i; i<MAX_1VS1_ARENEN; i++)
    {
    	format(string, sizeof(string), "%s\n%s\t0 / 2\t%s", string, Deathmatch_1vs1[i][d_Name_GER], Deathmatch_1vs1[i][d_WeaponName_GER]);
    }
    ShowPlayerDialog(playerid, DIALOG_1VS1, DIALOG_STYLE_TABLIST_HEADERS, ""HTML_SERVER""#SERVER_NAME" "HTML_WHITE"- 1 gegen 1", string, "Bestätigen", "Zurück");

    ast2ufdyxkb1.png


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

  • Habe einen Denkfehler. Will das die Funktion nur aufgerufen wird, wenn der Spieler zwischen virtueller Welt 1000 bis 1024 ist.

    forward Deathmatch_Timer();
    public Deathmatch_Timer()
    {
    for(new i = 0, j = GetPlayerPoolSize(); i <= j; i++)
    {
    if(IsPlayerConnected(i))
    {
    if(Lobby_ID[i] == 1)
    {
    if(GetPlayerVirtualWorld(i) >= 1000 || GetPlayerVirtualWorld(i) <= 1024)
    {
    if(!IsPlayerInArea(i,-2597, 411, -2569, 459))
    {
    new rand = randomex(0,3);
    SetPlayerPos(i, Deathmatch_1vs1_Spawns[rand][d_X], Deathmatch_1vs1_Spawns[rand][d_Y], Deathmatch_1vs1_Spawns[rand][d_Z]);
    SetPlayerFacingAngle(i, Deathmatch_1vs1_Spawns[rand][d_R]);
    SetCameraBehindPlayer(i);
    Language_Message(i, COLOR_GREEN, "* Du wurdest automatisch zurück in die Arena geportet!", "You got ported in the area.");

    }
    }
    }
    }
    }
    return true;
    }

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Hab hier mal was gebastelt, um die Top 5 auszulesen. Einer eine Ahnung, wie ich weiter mache?
    Brauche von jedem der in der Top 5 ist, den Namen um Sie in einem TextDraw anzuzeigen.

    forward Top5_OnGameModeInit()
    {
    new query[256];
    format(query, sizeof(query),"SELECT * FROM "#MySQL_TAG"_accounts ORDER BY ABS(killstoday) DESC LIMIT 5");
    mysql_pquery(MySQL, query, "Update_Top5");
    SetTimer("Top5_Query", true, 60000);
    }



    forward Top5_Query();
    public Top5_Query()
    {
    new query[256];
    format(query, sizeof(query),"SELECT * FROM "#MySQL_TAG"_accounts ORDER BY ABS(killstoday) DESC LIMIT 5");
    mysql_pquery(MySQL, query, "Update_Top5");
    return true;
    }



    forward Update_Top5();
    public Update_Top5()
    {

    return true;
    }

  • Du machst eine for Schleife die 5 mal durchloopt, also durch alle 5 Rows, während diesem Loop liest du den Namen des Spielers aus der Datenbank mit cache_get_value_name(i, "Name", name) und speicherst es.
    Dann fügst du nach der Schleife die Namen einfach in den Textdraw ein.

  • Du machst eine for Schleife die 5 mal durchloopt, also durch alle 5 Rows, während diesem Loop liest du den Namen des Spielers aus der Datenbank mit cache_get_value_name(i, "Name", name) und speicherst es.
    Dann fügst du nach der Schleife die Namen einfach in den Textdraw ein.

    Funktioniert nicht. Die Zahlen zählen auch komisch, anstatt von 1- 5.


    Code:

    forward Top5_Query();
    public Top5_Query()
    {
    new query2[256];
    format(query2, sizeof(query2),"SELECT * FROM "#MySQL_TAG"_accounts ORDER BY ABS(killstoday) DESC LIMIT 5");
    mysql_pquery(MySQL, query2, "Update_Top5");
    }



    forward Update_Top5();
    public Update_Top5()
    {
    new rows, string[256], name[64];
    cache_get_row_count(rows);
    if(rows == 0)
    {
    print("Leer");
    }
    else
    {
    for(new i = 1; i < 5; i++)
    {
    cache_get_value_name(0, "name", name);
    format(string, sizeof(string),"~r~%d. ~w~%s~n~", i, name);
    }
    TextDrawSetString(Top5_TextDraw[1], string);
    }
    return true;
    }


  • 1. Von"cache_get_value_name(0, "name", name);" die 0 zu i ändern, sonst wird immer nur die erste Row ausgelesen.
    2. Wie hast du die Nummerierung von 1-5 denn mit den Textdraws gemacht? Du musst halt abfragen was i gerade ist, und dann eben den Namen an die Zeile i setzen.
    Also versuch mal das "TextDrawSetString(Top5_TextDraw[1], string);" in die Schleife zu machen, und das 1 zu i zu ändern. (Wenn du den Textdraw so gemacht hast das 1, Platz 1 ist und 2 Platz 2 etc.)


    Sonst musst du mir sagen wie du das gemacht hast.

  • Bin bald soweit. Einziges Manko zur Zeit noch, habe 3 Accounts in der Datenbank.
    Da er aber keine finden kann, nimmt er den letzten Account so oft, bis rows voll ist.


    Code:

    for(new i = 0; i < 5; i++)
    {
    cache_get_value_name(i, "name", name);
    format(string, sizeof(string),"~w~%s~r~%d. ~w~%s~n~",string, i+1, name);
    }
    TextDrawSetString(Top5_TextDraw[1], string);


  • Das mit der Schleife ist unfug, vor der Schleife eine 25 Zeichen lange Variable erstellen, den Namen auch dort drinne speichern und dann in der Schleife abfragen ob der Name mit dem neuen/nächsten Namen ist.
    Dann kannst du das ganze entweder via Continue überspringen oder du setzt einen invalid Wert oder was auch immer.


    LG

  • "for(new i = 1; i < rows+1; i++); "

    Die Schleife muss, wie die Zeilen von Result auch, bei 0 beginnen, sonst fehlt die erste Zeile der Tabelle.


    vor der Schleife eine 25 Zeichen lange Variable erstellen...

    Bloß nicht! Dafür kann man ja die Anzahl der Zeilen auslesen.



    for(new i = 0; i < 5; i++)

    zu:
    new rows;
    cache_get_row_count(rows);
    for(new i = 0; i < rows; i++)



    Oder als Vorschlag auch so:
    new rows;
    cache_get_row_count(rows);
    for(new i = 0; i < rows; i++)
    {
    cache_get_value_name(i, "name", name);
    format(string, sizeof(string),"~w~%s~r~%d. ~w~%s~n~",string, i+1, name);
    }
    for(new i = rows; i < 5; i++)
    {
    format(string, sizeof(string),"~w~%s~r~%d. ~w~ - ~n~",string, i+1);
    }
    TextDrawSetString(Top5_TextDraw[1], string);


    Dann zeigt es die nicht belegten Plätze mit "-" an.

  • OnPlayerConnect:

    mysql_format(handle,Query, sizeof(Query), "SELECT * FROM `multiaccounts` WHERE `IP` = '%s'", PlayerIP(playerid));
    mysql_pquery(handle,Query,"OnCheckMulti","d",playerid);


    OnCheckMulti:

    forward OnCheckMulti(playerid);
    public OnCheckMulti(playerid)
    {
    new rows,multistring[256],query[300];
    cache_get_row_count(rows);
    if(rows == 0)
    {
    mysql_format(handle,query, sizeof(query), "INSERT INTO `multiaccounts` (`IP`, `Accounts`) VALUES ('%s', '%e')", PlayerIP(playerid), GetName(playerid));
    mysql_tquery(handle,query);
    }
    else
    {
    new multis,multi[16][32],bool:found;
    cache_get_value_name(0,"Accounts",multistring);
    multis = strexplode(multi, multistring, ",");
    for(new i = 0; i < multis; i++)
    {
    if(strfind(multi[i],GetName(playerid),true) == -1) found = true;
    if(strfind(multi[i],GetName(playerid),true) != -1) found = false;
    }
    if(!found)
    {
    new name[32];
    format(name,sizeof(name),", %s",GetName(playerid));
    strcat(multistring, name);
    mysql_format(handle,query,sizeof(query),"UPDATE `multiaccounts` SET Accounts = '%s' WHERE IP = '%s'",multistring,PlayerIP(playerid));
    mysql_tquery(handle,query);
    }

    Ist noch länger, aber der Rest des Codes ist unwichtig.


    Wenn ich mit dem gleichen Namen wie er schon in der Datenbank steht connecte, wird er trotzdem eingetragen, warum?
    Eigentlich werden ja mit strexplode alle Namen die mit einem , getrennt sind einzelnt ausgeschrieben, also loop ich durch ob der Name dort schon irgendwo vorhanden ist, und wenn nicht soll der Name hinzugefügt werden.
    Der Name wird aber immer hinzugefügt..

  • if(dialogid == DIALOG_MDC){if(response == 1){switch(listitem){case 0:{ShowPlayerDialog(playerid,DIALOG_MDCCHECK,DIALOG_STYLE_INPUT,"Spieler abfragen","Gebe nun den exakten Spielernamen ein!!","Eingabe","Verlassen");}case 1:{ShowPlayerDialog(playerid,DIALOG_MDCFAHNDUNG,DIALOG_STYLE_INPUT,"Spieler Fahnden","Gebe nun den exakten Spielernamen ein!","Eingabe","Verlasen");// Hier Eventuell der RPName bzw Hitmen / FBIname ka}}}return 1;}if(dialogid == DIALOG_MDCFAHNDUNG){ShowPlayerDialog(playerid,DIALOG_MDCREASON,DIALOG_STYLE_INPUT,"Spieler fahnden","Gebe einen Grund zur Fahndung\ndes Spielers an:","Starten","Verlassen");}if(dialogid == DIALOG_MDCREASON){if(!response) return 1;for(new i = 0; i < MAX_PLAYERS; i++){if(IsPlayerConnected(i)){if(IsACop(i)){// if(sscanf(theMDCChecked[playerid],"u", pid))// GetPlayerName(theMDCChecked[playerid],giveplayers,sizeof(giveplayers));new pid = GetPVarInt(playerid,"FahndetName");// if(sscanf(pid,"u", giveplayeryo))new string62[128];format(string62, sizeof(string62), "HQ: Alle Einheiten: Reporter: %s",GetName(playerid));SendClientMessage(i, TEAM_BLUE_COLOR, string62);format(string62, sizeof(string62), "HQ: %s wird Gesucht, Verbrechen: %s",GetName(pid),inputtext);SendClientMessage(i, TEAM_BLUE_COLOR, string62);SendClientMessage(pid,-1,"du wirdst gesucht!"); // [b]Problem hierbei Message wird an PLAYERID und nicht an PID gesendet(der gesuchte)[/b]return 1;}}}return 1;}


    Problembeschreibung ist im Text markiert zu finden


    /edit 17:20 zeile 43