Beiträge von d0ma

    .... die mit dem if(a>0) usw in der Schleife sind alle falsch



    new inNaehe=0;
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    if(IsPlayerInRangeOfPoint(i, X, Y, Z)
    {
    inNaehe=1;
    break;
    }
    }
    if(inNaehe)SendClientMessage(playerid, GRAU, "Es ist jemand in dieser nähe!");
    else SendClientMessage(playerid, GRAU, "Es ist niemand in dieser nähe!");

    Wenn du als Admin eingloggt bist dann wird im ersten if-Teil "return 1; ausgeführt = code dahinter wird nichtmehr ausgeführt


    Also das return entfernen:
    public OnPlayerTakeDamage(playerid, issuerid, Float: amount, weaponid)
    {
    if(issuerid != INVALID_PLAYER_ID)
    {
    if(IsPlayerAnAdmin(playerid))
    {
    new string[128], attacker[24];
    new weaponname[24];


    GetPlayerName(issuerid,attacker,sizeof(attacker));
    GetWeaponName(weaponid, weaponname, sizeof(weaponname));
    format(string, sizeof(string), "WARNUNG: %s schießt auf dich! - Waffe: %s", attacker, weaponname);
    SendClientMessage(playerid,WEISS, string);
    }
    }
    if(weaponid == 24)
    {
    new Float:health;
    GetPlayerHealth(playerid,health);
    SetPlayerHealth(playerid,0);
    return 1;
    }
    return 1;
    }

    Wenn man wirklich mit einer zu intensiven Schleife zu kämpfen hat: Kann auch das unterhalb probiert werden.


    ---------------------------


    • Timer mit intensiven for Schleifen durch alle Spieler entfernen und in OnPlayerUpdate einbauen:


    Voraussetzung für die Integration in OnPlayerUpdate: Die Aufgaben der for Schleife müssen nicht für alle Spieler zum exakt gleichen Zeitpunkt ausgeführt werden.
    Eine for-Schleife die durch alle Spieler läuft und viel Inhalt enthält kann eine große Lag-Quelle sein und wird die CPU-Nutzung des Servers steigern, da viel zu viel auf einmal erledigt werden muss. Beispielsweise ein AntiCheat System das 10 verschiedene Cheatarten abdeckt und das für jeden einzelnen Spieler einzeln überprüft. Was natürlich viel zu viel Arbeit auf einmal erzeugen würde. Die Lösung: -Die Aufgaben bestmöglich verteilen.


    Vorher:
    public OnGameModeInit()
    {
    SetTimer("beispiel", 5000, 1 );
    return 1;
    }
    forward beispiel();
    public beispiel()
    {
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    //(1)* Viel inhalt in dieser Schleife ....
    SendClientMessage(i, FARBE, "BEISPIEL nachricht");
    }
    }


    Nachher:
    Kann bei intensiven Spieler/MAX_PLAYERS Schleifen so oft besser umgesetzt werden:
    new lastPublicBeispiel[MAX_PLAYERS];
    #define timerPublicBeispiel 5000
    public OnPlayerUpdate(playerid)
    {
    if((GetTickCount() - lastPublicBeispiel[playerid]) > timerPublicBeispiel)
    {
    lastPublicBeispiel[playerid] = GetTickCount();
    //(1)* Inhalt der Schleife zuvor, alle i's sollten mit playerid ersetzt werden
    SendClientMessage(playerid, FARBE, "BEISPIEL nachricht");
    }
    return 1;
    }
    So wird für jeden Spieler der Inhalt zu einer anderen Zeit ausgeführt und so bestmöglich verteilt(= Es wird nichtmehr zuviel auf einmal verlangt)
    ---------------------------

    gettime(); liefert die aktuelle Anzahl an vergangen Sekunden seit dem 1 Januar 1970 zurück und zu dieser Zahl rechnest du deine gewünschte Ban-zeit dazu:
    BanInYears(playerid, years)
    {
    //Diese Zahl musst du abspeichern und beim connect wieder laden um sie zu überprüfen: gettime()+(60*60*24*364*years)
    Kick(playerid);
    }
    BanInMonths(playerid, months) // 30 tage
    {
    //Diese Zahl musst du abspeichern und beim connect wieder laden um sie zu überprüfen: gettime()+(60*60*24*30*years)
    Kick(playerid);
    }
    BanInDays(playerid, days)
    {
    //Diese Zahl musst du abspeichern und beim connect wieder laden um sie zu überprüfen: gettime()+(60*60*24*days)
    Kick(playerid);
    }
    BanInHours(playerid, hours)
    {
    //Diese Zahl musst du abspeichern und beim connect wieder laden um sie zu überprüfen: gettime()+(60*60*hours)
    Kick(playerid);
    }
    BanInMinutes(playerid, minutes)
    {
    //Diese Zahl musst du abspeichern und beim connect wieder laden um sie zu überprüfen: gettime()+(60*minutes)
    Kick(playerid);
    }
    BanInSeconds(playerid, seconds)
    {
    //Diese Zahl musst du abspeichern und beim connect wieder laden um sie zu überprüfen: gettime()+(seconds)
    Kick(playerid);
    }


    in OnPlayerConnect überprüfst du ob die gespeicherte Zahl größer ist wie die aktuelle gettime(); zeit:
    public OnPlayerConnect(playerid)
    {
    //Gespeicherte Zahl laden
    if(DieGespeicherteZahl > gettime())
    {
    //spieler ist noch immer gebannt
    Kick(playerid);
    }
    }

    Schlauer währe wenn du anstatt 10 1 Sekunden Timer wo du verschiedene sachen ausführen lässt 1 1 Sekunden Timer zu machen wo das ganze ausgeführt wird.


    NIEMALS


    Um es ganz einfach auszudrücken: Der SA-MP Server bearbeitet entweder Scriptaufgaben oder Syncaufgaben.(Sync -> Script -> Sync -> Script -> Sync -> usw) Wenn du alle 10 zusammenfügst, dann wird alles auf einmal ausgeführt = der Server kann solange keine syncaufgaben mehr verarbeiten.
    Am besten ist es alle Aufgaben im Script bestmöglich zu verteilen so das nur immer kurze Scriptaufgaben erledigt werden müssen.