Beiträge von Jeffry

    Hmm, merke gerade das es dann nicht mehr mit der Playerid funktioniert, soll ja mit beidem gehen @Jeffry

    Ah, auch noch zusätzlich. Das geht auch, so:
    CMD:kick(playerid, params[]) {
    new playerID, pname[MAX_PLAYER_NAME], Reason[64], cQuery[128 + (MAX_PLAYER_NAME * 2)];



    if(pData[playerid][P_Admin] < 1) return
    SendClientMessage(playerid, COLOR_RED, LV_Fail);



    if(sscanf(params,"sS()[32]", pname, Reason)) return
    SendClientMessage(playerid, COLOR_RED, "Use: /kick <player> <reason>");


    if(IsNumeric(pname))
    playerID = strval(pname);
    else
    playerID = ReturnPlayerID(pname);


    if(!IsPlayerConnected(playerID)) return
    SendClientMessage(playerid, COLOR_RED, ID_Fail);



    if(!Reason[0]) format(Reason, sizeof(Reason), "No reason given");



    format(cQuery, sizeof(cQuery), "{%06x}%s {FFFFFF}has been kicked by {%06x}%s {FFFFFF}(%s)", GetPlayerColor(playerid) >>> 8, GetName(playerID), GetPlayerColor(playerID) >>> 8, GetName(playerid), Reason);
    SendClientMessageToAll(-1, cQuery);



    format(cQuery, sizeof(cQuery), "Admin %s kicked %s for %s", GetName(playerid), GetName(playerID), Reason);
    writeLog("Logs/Kick.txt", cQuery);



    Kick(playerID);
    return 1;
    }


    Und füge diese Funktion noch hinzu:
    stock IsNumeric(const string[])
    {
    for(new i = 0, j = strlen(string); i < j; i++)
    {
    if(string[i] > '9' || string[i] < '0') return 0;
    }
    return 1;
    }

    Nutze:
    stock ReturnPlayerID(l_PlayerName[]) //©Jeffry
    {
    new l_name[MAX_PLAYER_NAME];
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(GetPlayerName(i, l_name, MAX_PLAYER_NAME))
    {
    if(!strcmp(l_name,l_PlayerName, true)) return i;
    }
    }
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(GetPlayerName(i, l_name, MAX_PLAYER_NAME))
    {
    if(strfind(l_name,l_PlayerName,true)!=-1) return i;
    }
    }
    return INVALID_PLAYER_ID;
    }


    Und schreibe den Befehl so:
    CMD:kick(playerid, params[]) {
    new playerID, pname[MAX_PLAYER_NAME], Reason[64], cQuery[128 + (MAX_PLAYER_NAME * 2)];



    if(pData[playerid][P_Admin] < 1) return
    SendClientMessage(playerid, COLOR_RED, LV_Fail);



    if(sscanf(params,"s[24]S()[32]", pname, Reason)) return
    SendClientMessage(playerid, COLOR_RED, "Use: /kick <player> <reason>");


    playerID = ReturnPlayerID(pname);


    if(!IsPlayerConnected(playerID)) return
    SendClientMessage(playerid, COLOR_RED, ID_Fail);



    if(!Reason[0]) format(Reason, sizeof(Reason), "No reason given");



    format(cQuery, sizeof(cQuery), "{%06x}%s {FFFFFF}has been kicked by {%06x}%s {FFFFFF}(%s)", GetPlayerColor(playerid) >>> 8, GetName(playerID), GetPlayerColor(playerID) >>> 8, GetName(playerid), Reason);
    SendClientMessageToAll(-1, cQuery);



    format(cQuery, sizeof(cQuery), "Admin %s kicked %s for %s", GetName(playerid), GetName(playerID), Reason);
    writeLog("Logs/Kick.txt", cQuery);



    Kick(playerID);
    return 1;
    }


    Dann geht das beschriebene Szenario, wenn du den genauen Namen eingibst, und falls nicht, wird die erst-gefundene ID genommen.

    Jeffry, bist du in der Lage mir mal das an dem Beispiel hier zu erläutern (das mit dem Tutorial das du mir geschickt hast):

    Für ein solches Vorhaben ist das nicht so einfach zu realisieren.
    Hier eine mögliche Variante: http://forum.sa-mp.com/showpost.php?p=1223168&postcount=2
    Was genau mit den #emit's gemacht wird kann ich dir nicht sagen, da ich mich da nie eingearbeitet habe, weil man das eigentlich auch nicht braucht. Aber wenn es klappt, passt es ja.

    geändert und nun funktioniert dieser Code!

    Das ist falsch so und wird dir Fehler im Log ausgeben, da ein Cache aufgerufen wird, der nicht existiert.


    Die ShowHelp Funktion ist eine Funktion, die der Thread-Ersteller selbst erstellt hat, und wahrscheinlich irgendeine Info-Nachricht anzeigt.
    Wenn du dies so nicht machst, dann nutze:
    if(!strlen(str)) return SendClientMessage(playerid, 0xFF0000FF, "Nutze: /help [Stichwort]");

    in etwa so:

    Nein, bitte niemals so machen, außer es ist wirklich nicht anders möglich, und das ist eigentlich nie der Fall. Das was du da machst geht komplett am Sinn der neuen Versionen vorbei, da es fast genau das Gleiche macht, wie die alten Plugins, nämlich auf die Antwort des MySQL Servers warten. Das ist schlecht und sollte so nicht mehr gemacht werden.



    Wie sähe die Query mit der latest MySQL Version aus ?

    #define DIALOG_HELP 1403
    public OnPlayerCommandText(playerid, cmdtext[])
    {
    new cmd[256], idx;
    cmd = strtok(cmdtext, idx);
    if(strcmp("/help", cmd, true) == 0)
    {
    new str[256];
    str = strtok(cmdtext, idx);
    if(!strlen(str)) return ShowHelp(playerid);
    SendClientMessage(playerid, COLOR_LIGHTBLUE, "*** Hilfe *** Suche Artikel... (Es sollte gleich ein Infotext angezeigt werden. Wenn nicht, probiere es zu einem späteren Ueitpunkt nochmal.)");
    mysql_format(handle, str, sizeof(str), "SELECT header FROM helptabelle WHERE tags LIKE '%%%e%%';", str);
    mysql_pquery(handle, str, "OnCmdHelp", "d", playerid);
    return 1;
    }
    return 0;
    }


    forward OnCmdHelp(playerid);
    public OnCmdHelp(playerid)
    {
    new num_rows = cache_get_row_count();
    if(!num_rows) return SendClientMessage(playerid, COLOR_LIGHTBLUE, "*** Hilfe *** Leider gibt es dazu keinen passenden Treffer.");
    new msg[1024], tmp[64];
    for(new i = 0; i < num_rows; i++)
    {
    cache_get_field_content(i, "header", tmp);
    format(msg, sizeof(msg), "%s%s\n", msg, tmp);
    }
    ShowPlayerDialog(playerid, DIALOG_HELP, DIALOG_STYLE_MSGBOX, "Help-Artikel", msg, "Auswählen", "Abbrechen");
    return 1;
    }


    #define DIALOG_HELPTEXT 2401
    public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
    {
    switch(dialogid)
    {
    case DIALOG_HELP:
    {
    if(!response) return 1;
    new str[256];
    mysql_format(handle, str, sizeof(str), "SELECT helptext FROM helptabelle WHERE header = '%e';", inputtext);
    mysql_pquery(handle, str, "OnDialogHelp", "d", playerid);
    return 1;
    }
    }
    return 0;
    }


    forward OnDialogHelp(playerid);
    public OnDialogHelp(playerid)
    {
    if(!cache_get_row_count()) return SendClientMessage(playerid, COLOR_LIGHTBLUE, "*** Hilfe *** Leider gibt es dazu keinen passenden Treffer.");
    new msg[1024];
    cache_get_field_content(0, "helptext", msg);
    for(new i=0; i<strlen(msg); i++) if(msg[i] == '~') msg[i] = '\n';
    ShowPlayerDialog(playerid, DIALOG_HELPTEXT, DIALOG_STYLE_MSGBOX, "Help-Text", msg, "Ok", "");
    return 1;
    }

    mach hinten aus dem , ein ;

    Das Komma ist korrekt, da er zwei Anweisungen im return hat.



    error 036: empty statement

    Bei mir kompiliert das ohne Probleme.
    Poste bitte folgendes: DIALOG_SCODE, SERVER_COLOR_HTML, SERVERTAG, COLOR_ROT
    Möglicherweise liegt es daran.




    Macht es Sinn Textdraws in OnGameModeExit zu zerstören?

    Wenn man es zu 100% sauber schreiben will, dann ja. Es dürfte aber auch in den meisten Fällen kein Problem verursachen, wenn man es nicht macht.

    Nein, aus
    if(IsPlayerInRangeOfPoint(playerid,radius,vcoord[0],vcoord[1],vcoord[2]))
    das hier:
    if(IsPlayerInRangeOfPoint(playerid,radius-0.1,vcoord[0],vcoord[1],vcoord[2]))


    Eventuell auch mehr als 0.1, ich weiß nicht, welche Werte da genau zurück gegeben werden, eventuell benötigt das kleine Anpassungen. Einfach mal ausprobieren, wann es passt.