Vehicle Respawn

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Guten Abend,


    wieso repsawnt der CMD mir alle Autos, auch die eine Person als Fahrer haben ?



    ocmd:rac(playerid, params[])
    {
    for(new v=0; v<MAX_VEHICLES; v++)
    {
    if(GetPlayerState(playerid) == PLAYER_STATE_DRIVER)
    {
    SetVehicleToRespawn(v);
    }
    }
    return 1;
    }


    Danke fürs helfen

  • ocmd:rac(playerid, params[])
    {
    // GILT FÜR ALLE VEHICLES
    for(new v=0; v<MAX_VEHICLES; v++)
    {
    for (new id = 0; id < MAX_PLAYERS; id++) if (!IsPlayerConnected(id) || IsPlayerNPC(id)) continue; else if (GetPlayerState(i) != PLAYER_STATE_DRIVER) SetVehicleToRespawn(v);
    }
    // GILT NUR FÜR DAS VEHICLE INDEM MAN SITZT
    if (GetPlayerState(playerid) == PLAYER_STATE_DRIVER) SetVehicleToRespawn(GetPlayerVehicleID(playerid));
    return 1;
    }

  • tutst doch im ersten teil des codes ;)


    Edit; korrigiert, sorry



    ocmd:rac(playerid, params[])
    {
    new flag;
    for(new vehicleid = 0; vehicleid < MAX_VEHICLES; vehicleid++)
    {
    if (!IsValidVehicle(vehicleid)) continue;
    flag = false;
    for (new id = 0; id < MAX_PLAYERS; id++)
    {
    if (!IsPlayerConnected(id) || IsPlayerNPC(id)) continue; else if (GetPlayerVehicleID(playerid) == vehicleid) {flag = true; break;}
    }
    if (!flag) SetVehicleToRespawn(vehicleid);
    }
    return 1;
    }

    2 Mal editiert, zuletzt von Woozie ()

  • ich habe das jetz so, und er respownt immer noch alle auch wen ich in einem drinne bin:



    ocmd:rac(playerid, params[])
    {
    if(isPlayerAnAdmin(playerid, 1337))
    {
    new string[258];
    format(string, sizeof(string), "Administrator %s (ID: %d) hat alle unbenutzten Fahrzeuge respawnt.", SpielerName(playerid), playerid);
    SendClientMessageToAll(Gelb, string);
    for(new v=0; v<MAX_VEHICLES; v++)
    {
    for (new id = 0; id < MAX_PLAYERS; id++)
    if (!IsPlayerConnected(id) || IsPlayerNPC(id)) continue;
    else if (GetPlayerState(id) != PLAYER_STATE_DRIVER)
    SetVehicleToRespawn(v);
    }
    return 1;
    }
    return SendClientMessage(playerid, Rot, "Du bist nicht berechtigt diesen Befehl zu benutzen.");
    }

  • Teste mal das das sollte 1A klappen
    bcmd:respawncars(playerid,params[])
    {
    for(new i;i<MAX_VEHICLES;i++)
    {
    if(GetVehicleDriver(i)!=INVALID_PLAYER_ID) continue;
    else SetVehicleToRespawn(i);
    }
    SendClientMessage(playerid,cYellow,"Die unbenutzten Autos wurden respawnt");
    return 1;
    }
    das irgendwo hin wo nix ist
    GetVehicleDriver(vehicleid)
    {
    for(new i;i!=MAX_PLAYERS;i++) if(GetPlayerVehicleID(i) == vehicleid && GetPlayerState(i) == 2) return i;
    return INVALID_PLAYER_ID;
    }

    All in all it's just another brick in the wall

  • new car[MAX_PLAYERS],count;
    for(new i=0;i<MAX_PLAYERS;i++)
    {
    if(!IsPlayerConnected(i)) continue;
    if(GetPlayerState(i)!=PLAYER_STATE_DRIVER) continue;
    car[count]=GetPlayerVehicleID(i);
    count;
    }


    for(new i=0;i<MAX_VEHICLES;i++)
    {
    new bool:found;
    for(new j=0;j<count;j++)
    {
    if(i==car[j])
    {
    found=true;
    continue;
    }
    }
    if(found==true) continue;
    SetVehicleToRespawn(i);
    }


    So würd ichs machen.


  • Wozu sie dinnlosen Deklairungen?
    es sind nur 2 For schleifen und die sache geht schnell über die Bühne


    Woozie
    Ich finde auch das es einfacher ohen deklairungen ist, denn a ist es etwas schneller und b reicht dafür die getvehicleDriver funktion :P

    All in all it's just another brick in the wall

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Danke so funktioniert es einwandfrei.


    funktionieren tut es... aber überleg mal:


    a) Die schleife geht durch alle Autos (2000x)
    b) Jeder Schleifenabruf geht jeden Spieler durch (=2000 * MAX_PLAYERS (100-500)) = 200000 (bei 100))
    c) Bei jedem Durchgang wird überprüft ob der Spieler verbunden ist, ob sein Auto mit dem des aktuellen Autos übereinstimmt, und ob er der Fahrer ist oder nicht.
    d) Das macht dann 200000*3 Abfragen = 600000


    Das überlastet ganz gewiss den Server nicht,
    aber man sollte sich Gedanken machen wie das zu lösen ist ohne den großen Rechenaufwand.


    Wozu sie dinnlosen Deklairungen?


    Um Ressourcen zu sparen! Das ist zwar im Endeffekt mehr Schreibarbeit, mehr Zeilen,
    der Prozessor kann das aber deutlich schneller ausrechnen.


    Wahrscheinlich habe ich irgendwo einen Denkfehler drin, müsste man halt testen.

  • Es ist nicht so lahm wie du denkst
    bei 2k fahrzeugen hat er bei mir nichtmal 2 Sek gebraucht für einen respawn
    wenn ich dazu noch 500 Bots nahm, hat er mir die sachen in 5 sek respawnt ohne mukken
    bei anderen dingen die ich mal gestestet habe ist der serber erheblich langsamer geworden

    All in all it's just another brick in the wall

  • Natürlich geht das rasend schnell.
    Prozessoren rechnen mit immer mehr Kernen und Hertz, aber man sollte trotzdem
    seine Zeilen so programmieren, dass sie möglichst wenig Prozessorenarbeit verursachen.


    Was ist ein Script für ein Script, wenn es 50% langsamer ist?

  • hm ..hier mal ein zitat von meinem beitrag:

    wenn du noch mehr resourcen sparen willste definiere MAX_PLAYERS und/oder MAX_VEHICLES neu.


    #undef MAX_VEHICLES
    #define MAX_VEHICLES


    denn es macht keinen sinn eine schleife 2000 x durchlaufen zu lassen obwohl der server nur 2-300 fahrzeuge hat.
    genau das gleiche bei MAX_PLAYERS.