Beiträge von Jeffry

    Ich veröffentliche hier mal meine strtok-Version, die ich vor langer Zeit erstellt habe. Diese macht 1:1 das Gleiche wie die originale strtok-Funktion, nur mit dem Unterschied, dass sie mehr als doppelt so schnell ist.


    Original: http://wiki.sa-mp.com/wiki/Strtok


    v2.0 by Jeffry:
    stock strtok(const string[], &index) //©Jeffry
    {
    new result[20], length = strlen(string), i = index;
    while ((i < length) && (string[i] == ' ')) i++;
    strmid(result,string,i,((index = strfind(string, " ", false, i)) == -1) ? (index = length) : (index) , 20);
    index++;
    return result;
    }


    Man kann einfach die alte strtok Funktion mit der Meinen ersetzen, mehr ist nicht notwendig.


    Zitat
    Zeit-Tests

    [07/09/2014 15:22:34] Original: 3233ms
    [07/09/2014 15:22:36] Jeffry: 1455ms

    Zeit-Tests

    new idx, t;
    new params[16] = "abc def ghi";
    t = GetTickCount();
    for(new i=0; i<1000000; i++)
    {
    idx = 0;
    strtok_Original(params, idx);
    strtok_Original(params, idx);
    strtok_Original(params, idx);
    }
    printf("Original: %dms", GetTickCount() - t);

    Zeit-Tests
    t = GetTickCount();
    for(new i=0; i<1000000; i++)
    {
    idx = 0;
    strtok_Jeffry(params, idx);
    strtok_Jeffry(params, idx);
    strtok_Jeffry(params, idx);
    }
    printf("Jeffry: %dms", GetTickCount() - t);
    Die Tests wurden mit einem Intel® Core™ i7-3770 Prozessor durchgeführt.


    Keywords: strtok

    Mit alle, meinst du alle FraktionsCars deiner Fraktion?
    Falls ja
    if(i == FraktionsCars[i][f_car_id_x] && FraktionsCars[i][f_id] == Spieler[playerid][fraktion]) SetVehicleToRespawn(i);
    zu
    if(FraktionsCars[i][f_id] == Spieler[playerid][fraktion]) SetVehicleToRespawn(FraktionsCars[i][f_car_id_x]);

    Liegt wohl an einem gesprengten Array. Welches das ist müssen wir über Debugging herausfinden:
    ocmd:fcarrespawn(playerid, params[])
    {
    printf("Befehl gestartet: %d", playerid);
    if(Spieler[playerid][fraktion] == 0) return SCM(playerid, C_DRED, "Du bist in keiner Fraktion");
    if(Spieler[playerid][rang] != 8) return SCM(playerid, C_DRED, "Du bist kein Leader");
    for(new i = 0; i < MAX_VEHICLES; i++)
    {
    printf("Gehe in V-ID: %d", i);
    if(AnyPlayerInVehicle(i)) continue;
    if(i == FraktionsCars[i][f_car_id_x] && FraktionsCars[i][f_id] == Spieler[playerid][fraktion]) SetVehicleToRespawn(i);
    }
    printf("Erste Schleife beendet.");
    format(s, sizeof(s), "%s %s hat alle Fraktions-Cars respawnt", FRangName(playerid), GetName(playerid));
    printf("Vor zweiter Schleife. => s = %s", s);
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    printf("Prüfe ID: %d", i);
    if(!InFrak(i, Spieler[playerid][fraktion])) continue;
    SCM(i, C_YELLOW, s);
    }
    printf("Ende");
    return 1;
    }
    Was wird geprintet? (Achtung, könnte viel sein!)

    Die Koordinaten von "IsPlayerInRangeOfPoint" stimmen nicht.


    if(IsPlayerInRangeOfPoint(playerid,5,1037.4674,2428.6323,10.8203))
    {
    DisablePlayerCheckpoint(playerid);
    SetPlayerCheckpoint(playerid,1037.4674,2428.6323,10.8203,3.0);
    }
    Das sind dieselben Koordinaten, das macht keinen Sinn.


    ------
    @FerienFreak: Wo gibst du dem Spieler denn den Skin ID 1?

    forward WantedLoss();
    public WantedLoss()
    {
    for(new playerid=0; playerid<MAX_PLAYERS; playerid++)
    {
    if(WantedLevel[playerid] > 0)
    {
    WantedLevel[playerid] --;
    SetPlayerWantedLevel(playerid, WantedLevel[playerid]);
    new tmp[64];
    format(tmp,sizeof(tmp), "Aktuelles Wantedlevel: %i", wlevel-1);
    SendClientMessage(playerid, COLOR_GREEN,tmp);
    }
    }
    return 1;
    }


    Der Timer unter OnGameModeInit:
    SetTimer("WantedLoss",15*60*1000,1);

    Es geht ja darum das er die Include von seinem FTP laden will, nicht von einer lokalen Festplatte


    Wie ich bereits gesagt habe, die Include wird vom Compiler gelesen und muss beim Starten des Servers nicht verfügbar sein. Daher muss sie auch nicht auf den FTP-Server hochgeladen werden.
    Deshalb heißt das Ding ja auch "Include", was so viel heißt wie "beinhaltet", das heißt der Code der in der Include steht, steht nach dem Compilieren in der .amx des GameModes bzw. des FilterScripts in dem die Include inkludiert ist.


    Hochladen kann man sie zwar, das bringt aber rein gar nichts. Der Server benötigt nur die amx Dateien, die pwn und die inc Dateien interessieren den Server nicht, die sind nur für den Compilier und den Programmierer interessant.


    Im GameMode
    #inlcude <myobjects>
    public OnGameModeInit()
    {
    LoadObject();
    return 1;
    }


    In der Include "myobjects.inc" (in /pawno/includes):
    stock LoadObjects()
    {
    CreateObject(...);
    //...
    return 1;
    }


    => GameMode kompilieren und amx Datei hochladen. Die Include muss nicht hochgeladen werden.