Beiträge von Kaliber

    //Edit: @RG: sry habe dein Edit nicht gesehen ^^


    test() {
    new string[] = "Hallo";
    return string;
    }


    Der String muss halt erstmal im Speicher liegen.


    Zudem liegt der Fehler, den er gemacht hat daran, dass man 2 unterschiedliche Typen an Variablen zurückgeben kann.


    Wenn dann nur Strings oder nur Integer, aber nicht gemischt ;)


    //Edit²: @Dark.Shadow: In diesem Fall wäre strcat oder strins wesentlich schneller als format :p


    mfg. :thumbup:

    Hier mal ein wenig umgeschrieben, ungetestet:


    Spoiler anzeigen
    /*
    * Simple Votekick & Voteban System by DJ Deagle...HARD EDIT by Kaliber
    */
    #include <a_samp>
    #include <ocmd>

    Spoiler anzeigen
    #define SCM SendClientMessage
    #define SCMT SendClientMessageToAll

    Spoiler anzeigen
    static bool:active[2],bool:did[MAX_PLAYERS char],vote[2],name[MAX_PLAYERS][MAX_PLAYER_NAME];

    Spoiler anzeigen
    public OnPlayerConnect(playerid) return GetPlayerName(playerid,name[playerid],MAX_PLAYER_NAME);
    public OnFilterScriptInit() return print("\n-------------------------------------- \nSimple Votekick & Voteban System by DJ Deagle (e) by Kaliber!\n--------------------------------------\n");

    Spoiler anzeigen
    ocmd:votekick(playerid,params[]) {
    if(active[0] || active[1]) return SCM(playerid,-1,"Es ist bereits ein Votekick oder Voteban aktiv, warte bis dieser abgelaufen ist!");
    new pID,string[144];
    if(sscanf(params,"us",pID,string))return SCM(playerid,-1,"Benutze: /votekick [Spieler-ID] [Grund]");
    format(string,sizeof string,"Der Spieler %s möchte den Spieler %s via Votekick vom Server kicken! Grund: %s",name[playerid],name[pID],string);
    SCMT(-1," "),SCMT(-1,string),SCMT(-1,"Um zu voten gebe nun /yes oder /no ein!"),SCMT(-1,"Dafür hast du 13 Sekunden Zeit.");
    return active[0]=true,vote[0]++,did{playerid}=true,SetTimerEx("@EndVote",13000,0,"d",pID);
    }
    ocmd:voteban(playerid,params[]) {
    if(active[0] || active[1]) return SCM(playerid,-1,"Es ist bereits ein Votekick oder Voteban aktiv, warte bis dieser abgelaufen ist!");
    new pID,string[144];
    if(sscanf(params,"us",pID,string)) return SCM(playerid,-1,"Benutze: /voteban [Spieler-ID] [Grund]");
    format(string,sizeof string,"Der Spieler %s möchte den Spieler %s via Voteban vom Server bannen! Grund: %s",name[playerid],name[pID],string);
    SCMT(-1," "),SCMT(-1,string),SCMT(-1,"Um zu voten gebe nun /yes oder /no ein!"),SCMT(-1,"Dafür hast du 13 Sekunden Zeit.");
    return active[1]=true,vote[0]++,did{playerid}=true,SetTimerEx("@EndVote",13000,0,"d",pID);
    }
    ocmd:yes(playerid,params[]) {
    if(did{playerid}) return SCM(playerid,-1,"Du kannst nur ein mal Voten!");
    if(!active[0] && !active[1])return SCM(playerid,-1,"Es ist kein Votekick oder Voteban aktiv!");
    return vote[0]++,did{playerid}=true,SCM(playerid,-1,"Du hast für Ja gevotet.");
    }
    ocmd:no(playerid,params[]) {
    if(did{playerid})return SCM(playerid,-1,"Du kannst nur ein mal Voten!");
    if(!active[0] && !active[1])return SCM(playerid,-1,"Es ist kein Votekick oder Voteban aktiv!");
    return vote[1]++,did{playerid}=true,SCM(playerid,-1,"Du hast für Nein gevotet.");
    }
    @EndVote(playerid);@EndVote(playerid) {
    new string[128];
    SCMT(-1,"Die Abstimmung wurde beendet und die Stimmen werden sortiert!"),SCMT(-1," ");
    format(string,sizeof string,"Es haben %d Spieler für Ja, und %d Spieler für Nein gestimmt!",vote[0],vote[1]),SCMT(-1,string);
    if(vote[0] > vote[1]){
    format(string,sizeof string,"Der Spieler %s wurde vom Server %s!",name[playerid],(active[0]) ? ("gekickt") : ("gebannt")),SCMT(-1,string);
    if(active[0]) Kick(playerid); else Ban(playerid);
    } else format(string,sizeof string,"Der Spieler %s wurde vom Server nicht %s!",name[playerid],(active[0]) ? ("gekickt") : ("gebannt")),SCMT(-1,string);
    return ResetVars();
    }
    stock ResetVars() {
    for(new i; i<MAX_PLAYERS; i++) if(did{i}) did{i}=false;
    return active[0]=false,active[1]=false,vote[0]=0,vote[1]=0;
    }
    stock sscanf(string[], format[], {Float,_}:...) {
    if (string[0] == 0 || (string[0] == 1 && string[1] == 0)) return format[0];
    new formatPos = 0,stringPos = 0,paramPos = 2,paramCount = numargs(),delim = ' ';
    while (string[stringPos] && string[stringPos] <= ' ') stringPos++;
    while (paramPos < paramCount && string[stringPos]) {
    switch (format[formatPos++]) {
    case '\0': return 0;
    case 'u': {
    new end = stringPos - 1,id = 0,bool:num = true,ch;
    while ((ch = string[++end]) && ch != delim) {
    if (num) {
    if ('0' <= ch <= '9') id = (id * 10) + (ch - '0');
    else num = false;
    }
    }
    if (num && IsPlayerConnected(id)) setarg(paramPos, 0, id);
    else {
    #if !defined foreach
    #define foreach(%1,%2) for (new %2 = 0; %2 < MAX_PLAYERS; %2++) if (IsPlayerConnected(%2))
    #define __SSCANF_FOREACH__
    #endif
    string[end] = '\0',num = false,id = end - stringPos;
    foreach (Player, playerid) {
    if (!strcmp(name[playerid], string[stringPos], true, id)) {
    setarg(paramPos, 0, playerid),num = true;
    break;
    }
    }
    if (!num) setarg(paramPos, 0, INVALID_PLAYER_ID);
    string[end] = ch;
    #if defined __SSCANF_FOREACH__
    #undef foreach
    #undef __SSCANF_FOREACH__
    #endif
    }
    stringPos = end;
    }
    case 's', 'z': {
    new i = 0,ch;
    if (format[formatPos]) {
    while ((ch = string[stringPos++]) && ch != delim) setarg(paramPos, i++, ch);
    if (!i) return -1;
    }
    else {
    while ((ch = string[stringPos++]))setarg(paramPos, i++, ch);
    }
    stringPos--,setarg(paramPos, i, '\0');
    }
    default: continue;
    }
    while (string[stringPos] && string[stringPos] != delim && string[stringPos] > ' ') stringPos++;
    while (string[stringPos] && (string[stringPos] == delim || string[stringPos] <= ' ')) stringPos++;
    paramPos++;
    }
    do {
    if ((delim = format[formatPos++]) > ' ') {
    if (delim == '\'') {
    while ((delim = format[formatPos++]) && delim != '\'') {}
    }
    else if (delim != 'z') return delim;
    }
    }
    while (delim > ' ');
    return 0;
    }


    Kannst ja mal schauen, ob dich das ein wenig inspiriert :D


    mfg. :thumbup:

    Hallo,


    Im pRP habe ich meine IP vom server (einmal mit und einmal ohne Port) eingetragen. Aber das Script meint, der Server wäre nicht darauf gebinded. Woran liegt das?
    mfg


    Ehm...poste doch mal die Fehler und schau ob das vom Script aus ausgegeben wird und wenn ja...wo und lösch das doch einfach?! :rolleyes:

    Versuche es mal so:


    if(!strcmp(cmdtext,"/sperrcar",true)) {
    if(SpielerInfo[playerid][sMember] != 18) return SCM(playerid,0xFF0000FF,"Du bist kein Ordnungsamtmitglied.");
    tmp = strtok(cmdtext,idx);
    if(!tmp[0]) return SCM(playerid,0xFF0000FF,"{33CCFF}FEHLER:{FFFFFF} /sperrcar [Kennzeichen] [Preis] [Grund]");
    new kz[32];strcat(kz,tmp,32);
    if(!KZExistiert(kz)) return SCM(playerid,0xFF0000FF,"Dieses Kennzeichen wurde nicht registriert.");
    tmp=strtok(cmdtext,idx);
    if(!tmp[0]) return format(string,128,"{33CCFF}FEHLER:{FFFFFF} /sperrcar %s [Sperrpreis] [Grund]",kz),SCM(playerid,0xFF0000FF,string);
    new preis = strval(tmp);
    if(preis < 1) return SCM(playerid,0xFF0000FF,"Der Sperrpreis darf nicht unter 0 sein.");
    tmp=strtok(cmdtext,idx);
    if(!tmp[0]) return format(string,128,"{33CCFF}FEHLER:{FFFFFF} /sperrcar %s %d [Grund]",kz,preis),SCM(playerid,0xFF0000FF,string);
    new grund[128],kzveh = GetCarFromKZ(kz);strcat(grund,tmp,128);
    if(IsDtCarGesperrt(kzveh)) return SCM(playerid,0xFF0000FF,"Dieses Fahrzeug ist bereits gesperrt.");
    new modell = GetVehicleModel(kzveh),gpid = GetOwner(kzveh),gpidname[MAX_PLAYER_NAME],pnn[MAX_PLAYER_NAME];
    GetPlayerName(gpid,gpidname,sizeof(gpidname));
    format(string,sizeof(string),"Du hast das Kennzeichen %s (User: %d || Name: %s || Fahrzeug: %s) für %d€ mit folgendem Grund gesperrt: %s",kz,gpid,gpidname,CarName[modell-400],preis,grund);
    SCM(playerid,0x00FFFFFF,string),GetPlayerName(playerid,pnn,sizeof(pnn));
    format(string,sizeof(string),"%s hat dein Fahrzeug %s mit dem Kennzeichen %s für %d€ mit folgendem Grund gesperrt: %s",pnn,CarName[modell-400],kz,preis,grund);
    for(new x;x<MaxVeh;x++) if(!strcmp(PlayerCar[gpid][x][CarNumber],kz,true)) PlayerCar[gpid][x][CarGesperrt] = 1,PlayerCar[gpid][x][CarSperrpreis]=preis;
    return SCM(gpid,0xFF0000FF,string);
    }


    Wenn jetzt da steht: Server Unknown Command...dann check mal deine Funktionen mit nem Print-Debug oder hau mal das Crashdetect Plugin rein ;)


    mfg. :thumbup:

    Also um dieses Problem zu lösen, gibt es mehrere Möglichkeiten.


    Zum einen, kannst du eine Funktion (es heißt Funktion, nicht stock) verwenden, allerdings müsstest du dann mit Argumenten arbeiten, wie du schon festgestellt hast ;)


    Wenn man das noch mit OP Code verbindet, kannst du z.B. eine gute Funktion dafür schreiben:


    Spoiler anzeigen
    stock SCM(playerid, color, fstring[], {Float, _}:...) {
    new n = numargs() * 4;
    if (n == 3 * 4) return SendClientMessage(playerid, color, fstring);
    new message[128],arg_start,arg_end,i = 0;

    Spoiler anzeigen
    #emit CONST.pri fstring
    #emit ADD.C 0x4
    #emit STOR.S.pri arg_start

    Spoiler anzeigen
    #emit LOAD.S.pri n
    #emit ADD.C 0x8
    #emit STOR.S.pri arg_end

    Spoiler anzeigen
    for (i = arg_end; i >= arg_start; i -= 4) {
    #emit LCTRL 5
    #emit LOAD.S.alt i
    #emit ADD
    #emit LOAD.I
    #emit PUSH.pri
    }

    Spoiler anzeigen
    #emit PUSH.S fstring
    #emit PUSH.C 128
    #emit PUSH.ADR message
    #emit PUSH.S n
    #emit SYSREQ.C format
    i = n / 4 + 1;
    while (--i >= 0) {
    #emit STACK 0x4
    }
    return SendClientMessage(playerid, color, message);
    }


    Allerdings kann man es wie oben schon genannt auch noch anders lösen, eine alternativ Funktion wäre:


    http://forum.sa-mp.com/showthr…ientMessageEx#post1189734


    oder du nutzt ein Makro:


    new buffer[144 + 1];
    #define SCM(%0,%1,%2,%3) format(buffer, sizeof(buffer),%2,%3) && SendClientMessage(%0, %1, buffer)


    Alternativ kannst du aber auch noch Plugins benutzen:


    [ PLUGIN ] Better Format


    mfg. :thumbup: