Beiträge von Goldkiller

    Ich hab dir das Script mal verbessert, möglicherweise auch den Grund für den Fehler gefixt.
    Kurz noch vorneweg.
    Du brauchst doch nicht für jeden Check vorher den Namen neu abfragen.Es reicht doch wenn du den Namen des Spielers 1x mit GetPlayerName() abfragst, dann diesen weiterhin verwendest.Ist definitiv besser als immer eine neue Variable zu erstellen und neu GetPlayerName() zu benutzen.
    Außerdem solltest du dir klar machen, dass bei diesen Namechecks; falls diese zutreffen ein return bewirkt, dass der nachfolgende Code nicht mehr aufgerufen wird.
    if(strcmp("eddik",eddik, true) == 0) //wenn der Spieler Name Blub ist, passiert nun dies
    {
    SendClientMessage(playerid, rot,"Dein Skin wurde geändert");
    SetPlayerSkin(playerid, 287);
    return 1;
    }

    Das return 1; ist wohl der Fehler, falls dein Namen bei diesen Checks dabei war.


    Ich hab dir das mal gefixt und verbessert.
    >> Klick mich << - Oh,gibt ja schon den PAWN Highlighter :-O
    Schau dir den Code mal an,Ich hab dort auch etwas vermerkt als Kommentar.
    Sollte es immernoch nicht funktionieren, gib mal bitte an was in die Console geschrieben wird beim spawnen.Hab dir nämlich Debug-Infos eingefügt.
    // DEBUG
    printf("Spieler[%d][team] = %d",playerid,Spieler[playerid][team]);
    // !DEBUG

    Schlimm wie viele Antworten es gegeben hat, und trotzdem zu keiner Lösung gekommen ist :p.


    new
    vehicleid,
    modelid;
    vehicleid = GetPlayerVehicleID(playerid);
    if(vehicleid) { // Ob Spieler in Fahrzeug sitzt
    modelid = GetVehicleModel(vehicleid);
    if( (modelid == 427 ) || (modelid == 523) || (modelid == 596) ) {
    // Falls er in einem dieser Fahrzeugmodelle sitzr
    }
    }


    Natürlich wissen hier Leute wie das funktioniert.
    Im Prinzip funktioniert es folgendermaßen. ( Ganz wichtig, die Variable WUNSCHZAHL ( Integer ) repräsentiert die Variable in der du die Zahlen für das Nummernschild speicherst die der Spieler angegeben hat als Wunschziffern. )
    new
    tmp[64],
    bool:bInUse = false,
    File:fFile;
    fFile = fopen("kennzeichen.cfg",io_read);
    if(fFile) { // Datei erfolgreich geöffnet
    while(fread(fFile,tmp,sizeof(tmp))) { // Solange wir aus der Datei lesen
    StripNewLine(tmp); // Ist mehr oder weniger ein fix,kann ich nur empfehlen
    if(!tmp[0]) { // Falls es eine leere Zeile ist
    continue;
    }
    if(WUNSCHZAHL == strval(tmp) ) { // Überprüfen ob WUNSCHZAHL der Zahl die ausgelesen wurde entspricht
    bInUse = true;
    break;
    }
    }
    fclose(fFile);
    }
    if(bInUse) {
    // Falls Zahl bereits vorhanden, was machen?
    }
    else {
    fFile = fopen("kennzeichen.cfg",io_append); // Datei öffnen und zum schreiben vorbereit mit io_append
    format(tmp,sizeof(tmp),"%d\r\n",WUNSCHZAHL); // String formatieren
    fwrite(fFile,tmp); // in Datei schreiben
    fclose(fFile); // Datei schließen
    }

    Man könnte sich nach dem Prinzip auch eine Funktion basteln, wäre vllt für dich praktischer.

    Zitat

    Goldkiller keine belleidigung


    Wo hab Ich das ?


    Zitat

    aber ich brauche kein Tutorial


    Okay.


    Zitat

    habe 20k selfmade script in dcmd so dumm bin ich nicht


    Hat keiner gesagt. Aber dann nicht wissen wozu Strings bzw Integer gut sind ist merkwürdig.

    new id = strval(strget(params, 0));
    new grund = strval(strget(params, 0));

    1. Wäre hier immer der grund der Gleiche Wert wie id
    2. Ist der Grund kein Integer
    Der Fehler liegt beides mal hier.
    Der Grund ist wieso jemand gekickt wurde, ist höchstwahrscheinlich immer ein String.Daher ist es falsch was du dort machst.
    Ich würde dir das DCMD + SSCANF Tutorial empfehlen, da steht wie du das ganz leicht ohne Fehler scriptest.

    {
    new
    pID,
    Float:x,Float:y,Float:z;
    GetPlayerPos(pID,x,y,z);
    IsPlayerInRangeOfPoint(pID,5,x,y,z);
    TogglePlayerControllable(pID,0);
    SetTimer("untazer",8000,0);
    return 1;
    }
    Ich glaube du bist auf dem DCMD + bzw SSCANF Trip kleben geblieben.
    Es macht doch keinen Sinn in dem Public alles über pID abzuwickeln, du übergibst doch die SpielerID bereits direkt in Form von playerid.
    Auch weiss ich nicht wozu du dort irgendetwas mit der Position machen willst.
    IsPlayerInRangeOfPoint wird sowieso meist in Verbindung mit if() benutzt.
    /*
    new
    Float:x,
    Float:y,
    Float:z;
    GetPlayerPos(playerid,x,y,z);
    IsPlayerInRangeOfPoint(playerid,5,x,y,z);
    */
    TogglePlayerControllable(playerid,0);
    SetTimer("untazer",8000,0);
    return 1;

    Nette Map.Hat mich tatsächlich dazu gebracht an einem Script weiterzuarbeiten und es in Sachen RACE zu erweitern.
    Bswp Dynamisches laden von MAP Objekte, Rundenbasierte Rennen, Wetter und Zeit individuell einstellbar pro Rennen.
    Gerne mehr davon ;)

    Rafelder: Schneller und ressourcenschonender ist es natürlich alles in eine Datei zu speichern. Aber wegen der ganzen Übersicht rate ich dir für jedes Haus eine eigene Datei zu nehmen, das dauert zwar länger aber erleichtert dir das arbeiten an Variablen erheblich (man findet sie besser usw.). Aber jeder, wie er es möchte...


    Ich würde gerne wissen, was genau Ressourcenschonender ist. Bin nämlich der Meinung, dass es sowohl Resourcenschonender + Übersichtlicher ist, es in einzelnen Datein zu speichern.
    Darfst mich gerne eine besseren belehren, vllt dann auch im Thread der sich um Resourcenschonendes scripten dreht ;) .

    Du musst auch irgendwo / irgendwann in die Datei schreiben, wer der neue Besitzer ist.
    Einfach zu sagen "Die Variablen hat den und den Wert" bringt ja nix, wenn du es nirgendwo extern speicherst.
    //INI_WriteString(const key[], const value[])
    new
    str[16];
    format(str,sizeof(str),"Besitzer%d",h);
    INI_WriteString(str,HausInfo[h][Besitzer]);

    Du musst lspdtor und lspdtor_zu als Globale Variablen erstellen, also irgendwo über main() .
    Sind diese zwei Variablen nicht Global, wirst du immer Fehler erhalten. Müsste auch das abstürzen verhindern, falls du sicher bist dass es an diesem Codeabschnitten liegt.

    dcmd_back(playerid,params[])
    new
    name[MAX_PLAYER_NAME],
    string[128];
    GetPlayerName(playerid,name,sizeof(name));
    format(string,sizeof(string),"%s ist nun nicht mehr afk",name);
    SendClientMessageToAll(0xFFFF00AA,string);
    TogglePlayerControllable(playerid,true);
    return 1;
    }
    Wie auch immer, du hast das Tutorial DCMD + SSCANF ( falls du es dir angeschaut hast ) nicht wirklich verstanden.
    Wozu brauchst du denn bei /BACK einen extra Parameter? x(

    Liegt daran,dass bei seinem Codeschnippsel irgendwann der Index zu Hoch ist und somit "Out of Bounce".
    public OnPlayerEnterRaceCheckpoint(playerid)
    {
    CP++;
    DisablePlayerRaceCheckpoint(playerid);
    SetPlayerRaceCheckpoint(playerid, 0, CPS[CP][0], CPS[CP][1], CPS[CP][2], CPS[CP+1][0], CPS[CP+1][1], CPS[CP+1][2], 5);
    return 1;
    }

    Angenommen für das Beispiel CP ist vor aufrufen des Callbacks 8.
    public OnPlayerEnterRaceCheckpoint(playerid)
    {
    // 8
    CP++;
    // 9
    DisablePlayerRaceCheckpoint(playerid);
    SetPlayerRaceCheckpoint(playerid, 0, CPS[9][0], CPS[9][1], CPS[9][2], CPS[9+1][0], CPS[9+1][1], CPS[9+1][2], 5);
    return 1;
    }

    Um das Problem zu verdeutlichen:
    CPS[9+1][0], CPS[9+1][1], CPS[9+1][2]
    Hier können wir nich drauf zugreifen.Das Array hat nur eine Größe von 10, bedeutet wir können auf die Einträge von 0 - 9 zugreifen.Normalerweise Stopt das Script an solchen Stellen immer, wenn es ein "Array out of Bounce" gibt.

    Verstehe dein Problem nicht wirklich.Solltest dich vielleicht etwas genauer ausdrücken.
    Wie auch immer,

    new port = GetServerVarAsInt("port");
    printf("Port: %s", port);
    Du musst port auch als Integer / Dezimalzahl printen , nicht String ;).
    Also änder
    printf("Port: %s", port);
    in
    printf("Port: %d", port);
    Was du sonst noch wissen wolltest konnt Ich leider aus deinem Text nicht entnehmen :-O!


    //Edit:

    Zitat

    Server.cfg
    bind - Force the server to use a specific IP on a server. This IP must match one assigned to a network card on the server. This is useful for running multiple servers on the same port on the same box.


    Mit bind bekommst du nicht die ServerIP, falls du das meinst.

    Der Server auf dem meine Homepage + das Script ist, ist anscheinend down.
    http://subdomain.kilu.info/
    Ich würde es dir ja gerne so Uploaden, nur hab ich die Letzte Release Version nicht auf dem PC. Wenn es möglich ist, warte bis der Server wieder Online ist.Dürfte nicht lange dauern, spätestens Morgen Abend würde Ich sagen.

    Irgendwo muss auch Spieler[playerid][skin] etwas zugewiesen werden, sonst wird es ja immer bei 0 bleiben.
    dini_IntSet(accFormat,"skin",Spieler[playerid][skin]);
    Änder das mal in

    Spieler[playerid][skin] = GetPlayerSkin(playerid);
    dini_IntSet(accFormat,"skin",Spieler[playerid][skin]);

    Timer sind dazu da , Funktionen zu bestimmten Zeitpunkten aufzurufen.
    Um Beispielsweise ein Payday zu machen bei dem alle 10Minuten jedem Spieler Geld gegeben wird brauchst du Timer. Gibt viele Sache wo man Timer gebrauchen kann.


    Zitat

    ICH LASS DOCH NICHT EINFACH TIMER LAUFEN WENN SIE NIX BRINGEN -.-


    Gut möglich das Ich dich eben falsch verstanden habe.Wenn der Timer abgelaufen ist wird eben die angegeben Funktion aufgerufen.

    Zitat

    Und noch ne frage wie kann ich den Timer abfragen ob er
    schon auf 0 ist (**aus**)


    Wenn ich dich richtig verstanden habe, kann man das nicht abfragen.



    SetTimerEx("message",1000,false,"is",1,"string to pass");
    message - Der Name der public Funktion die aufgerufen werden soll funcname[] Name of the function to call as a string. Needs to be a public!
    1000 - Das Intervall in MS wann die Funktion aufgerufen werden soll interval Inverval in milliseconds.
    false - Angabe ob die Funktion einmal oder als Wiederholung aufgerufen werden soll. repeating Boolean if the timer should oocur repeatedly or only once
    is - Angabe über die Typen der Parameter die übergeben werden an die Funktion format[] Special format indicating the types of the variables following
    1"string to pass - Die Parameter die Übergeben werden {Float,_}:... Indefinite number of arguments to pass


    //Edit : Pfff, und ich mach mir die Mühe mit Farben und bin dann langsamer x(

    Du hast
    #if defined FILTERSCRIPT

    nicht geschlossen
    Daher fehlt dir wohl am Ende noch ein
    #endif


    Da hast du bereits die Antwort die du wolltest bekommen.Wenn du daraus nicht verstehst,dass dir unter dem letzten #endif noch ein #endif dann hast du irgendwas falsch gemacht beim lernen der Grundlagen.Denn wie im zitierten Beitrag bereits erwähnt, hast du
    #if defined FILTERSCRIPT
    nicht geschlossen.


    Danach wird es zwar einwandfrei kompilieren, aber nicht funktionieren weil es kein richtiges NPC Script ist.Genau genommen wird der ganze Bereich zwischen
    #if defined FILTERSCRIPT
    eh nicht kompiliert.Deswegen lösch lieber die Zeile
    #if defined FILTERSCRIPT

    Das kannst du mit \n machen.
    if (strcmp("/help", cmdtext, true, 10) == 0)


    {
    ShowPlayerDialog(playerid,1,DIALOG_STYLE_MSGBOX,"Help","Blablabla\n*** ACCOUNT ***\n /rules /login /stats /buylevel\nNoch mehr\nNeue Zeile", "Continue", "Quit");
    return 1;

    }

    Du hast
    #if defined FILTERSCRIPT

    nicht geschlossen
    Daher fehlt dir wohl am Ende noch ein
    #endif


    //Edit: Sorry, hab erst im nachhinein bemerkt dass es sich um ein NPC Script handelt :pinch: . Hab nicht mehr wirklich im Kopf wie diese funktionieren, da muss dir jemand Anderes helfen.