Simpler /motor Befehl zwingt Server in die Knie :o

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
  • Hey Community!


    Ich bin echt am Verzweifeln. Ich hab auf die schnelle aus meinem Nitrado Minecraftserver einen GTA Server gemacht um etwas zu testen.
    Diese Zeilen:


    ocmd:motor(playerid,params[])
    {
    if(IsPlayerInAnyVehicle(playerid))
    {
    if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER)
    {
    SendClientMessage(playerid,WHITE,"Du musst der Fahrer sein!");
    return 1;
    }
    new vehicleid = GetPlayerVehicleID(playerid);
    if(enginebool[vehicleid] == false)
    {
    TextDrawHideForPlayer(playerid,MOTORAN);
    TextDrawHideForPlayer(playerid,MOTORAUS);
    KillTimer(autotimer[playerid]);
    SetVehicleEngineOn(vehicleid);
    enginebool[vehicleid] = true;
    TextDrawShowForPlayer(playerid,MOTORAN);
    autotimer[playerid]=SetTimerEx("drawtimer",1000,0,"i",playerid);
    return 1;
    }
    else
    {
    TextDrawHideForPlayer(playerid,MOTORAN);
    TextDrawHideForPlayer(playerid,MOTORAUS);
    KillTimer( autotimer[playerid]);
    SetVehicleEngineOff(vehicleid);
    enginebool[vehicleid] = false;
    TextDrawShowForPlayer(playerid,MOTORAUS);
    autotimer[playerid]=SetTimerEx("drawtimer",1000,0,"i",playerid);
    return 1;
    }
    }
    return 1;
    }


    Treiben die CPU Auslastung von 0-1% auf 97% und sofort geht nichts mehr. Der Server reagiert absolut auf garnichts mehr.
    Ich verzweifle noch, was um alles in der Welt bringt ihn zum abschmieren? Die selben Zeilen funktionieren auf meinem PC 1A.


    Hat jemand eine Idee/Lösung?!
    MfG, UltimateKeks :)

  • Also ich habe auch so einen ähnlichen Befehl, aber bei mir geht alles ganz normal.
    Vielleicht hilft er dir, ich mag jetzt deinen langen nicht angucken :)
    if(strcmp(cmdtext, "/motor", true) == 0)
    {
    if(GetPlayerVehicleSeat(playerid) == 0)
    {
    new car = GetPlayerVehicleID(playerid);
    if(GetVehicleModel(car) == 509 || GetVehicleModel(car) == 481 || GetVehicleModel(car) == 510)
    {
    SendClientMessage(playerid, GRAU, "Du sitzt auf einem Fahrrad. Das hat keinen Motor!");
    }


    else if (Tank[car] < 1)
    {
    SendClientMessage(playerid, GRAU, "Der Tank ist leer. Du musst erst /tanken.");
    }


    else if (Motor[car] == false )
    {
    new string[55];
    GetVehicleParamsEx(car,engine,lights,alarm,doors,bonnet,boot,objective);
    SetVehicleParamsEx(car,VEHICLE_PARAMS_ON,lights,alarm,doors,bonnet,boot,objective);
    Motor[car] = true;
    SCM(playerid,0x00853CFF,"Motor wurde gestartet.");
    format(string,sizeof(string),"~w~Motor: ~g~AN");
    TextDrawSetString(MotorAnzeige[playerid],string);
    TextDrawShowForPlayer(playerid,MotorAnzeige[playerid]);
    }
    else
    {
    new string[55];
    GetVehicleParamsEx(car,engine,lights,alarm,doors,bonnet,boot,objective);
    SetVehicleParamsEx(car,VEHICLE_PARAMS_OFF,lights,alarm,doors,bonnet,boot,objective);
    Motor[car] = false;
    SCM(playerid,0x980000FF,"Motor wurde ausgeschalten.");
    format(string,sizeof(string),"~w~Motor: ~r~AUS");
    TextDrawSetString(MotorAnzeige[playerid],string);
    TextDrawShowForPlayer(playerid,MotorAnzeige[playerid]);
    }
    }
    return 1;
    }

  • Naja von der Struktur her sind doch alle /motor - Commands die selben...


    if motor aus, dann an.
    if motor an, dann aus


    der Rest ist ja nur Deko :D
    Trotzdem hatte ich so etwas noch nie O.o
    Würde der Befehl nun 200 Schleifen starten
    wäre mir alles klar, aber das sind doch nur ein paar
    Funktionen


    //edit:


    Hier die Drawtimer-Funktion:


    forward drawtimer(playerid);
    public drawtimer(playerid)
    {
    TextDrawHideForPlayer(playerid,MOTORAN);
    TextDrawHideForPlayer(playerid,MOTORAUS);
    return 1;
    }

  • Ja, aber weißt du sicher das en an /motor an sich liegt ?


    Nicht an den Timer, ich weiß ja nicht was daran alles ausgeführt wird..


    Kannst ja mal probieren ihn zu entfernen ^^


    Wenn man rüber kuckt sieht man nicht viel ...


    Du kannst ja trozdem mal das Crashdetect Plugin ausprobieren der outputted dir auch so errors/fehler auch wenn er nicht crasht


    /E: Okay xD er wird ja nur einmalig ausgeführt

  • Habs jetzt mehrmals probiert... /motor = Server aus ^^
    Habe crashdetect.so drauf, teste jetzt.


    //edit:


    crashdetect.so findet nichts, meldet nichts. Ich habe das glaube ich auch etwas falsch formuliert:
    Der Server bleibt an, reagiert jedoch auf nichts. Wenn man dann beispielsweise GTA beendet und neu
    verbindet geht nach "Connecting to ....." nichts mehr.


    //Edit2:


    Selbst diese Variante macht den Server sofort dicht:


    if(IsPlayerInAnyVehicle(playerid))
    {
    if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER)
    {
    SendClientMessage(playerid,WHITE,"Du musst der Fahrer sein!");
    return 1;
    }
    new vehicleid = GetPlayerVehicleID(playerid);
    if(enginebool[vehicleid] == false)
    {
    TextDrawHideForPlayer(playerid,MOTORAN);
    TextDrawHideForPlayer(playerid,MOTORAUS);
    //KillTimer(autotimer[playerid]);
    SetVehicleEngineOn(vehicleid);
    enginebool[vehicleid] = true;
    TextDrawShowForPlayer(playerid,MOTORAN);
    //autotimer[playerid]=SetTimerEx("drawtimer",1000,0,"i",playerid);
    return 1;
    }
    else
    {
    TextDrawHideForPlayer(playerid,MOTORAN);
    TextDrawHideForPlayer(playerid,MOTORAUS);
    //KillTimer( autotimer[playerid]);
    SetVehicleEngineOff(vehicleid);
    enginebool[vehicleid] = false;
    TextDrawShowForPlayer(playerid,MOTORAUS);
    //autotimer[playerid]=SetTimerEx("drawtimer",1000,0,"i",playerid);
    return 1;
    }
    }

  • Etwas komisch, bist du sicher das es wirklich nur der Motor befehl ist ?


    Ich hatte damals das gleiche bei Linux Servern, aber crashdetect hatte mir die Warnings/Errors rausgegeben ..


    Probier mal eine abgespeckte version ohne deine stock/public, also mit SetVehicleParamsEx auch wenn ToggleVehicleEngineOn das gleiche macht ^^

  • Ich komme mir verarscht vor?! -.-
    Selbst diese Version, die ja nur eine Variable setzt und den Motor anschaltet bringt ihn zum abschmiern:


    if(IsPlayerInAnyVehicle(playerid))
    {
    if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER)
    {
    SendClientMessage(playerid,WHITE,"Du musst der Fahrer sein!");
    return 1;
    }
    new vehicleid = GetPlayerVehicleID(playerid);
    if(enginebool[vehicleid] == false)
    {
    //TextDrawHideForPlayer(playerid,MOTORAN);
    //TextDrawHideForPlayer(playerid,MOTORAUS);
    //KillTimer(autotimer[playerid]);
    new engine,lights,alarm,doors,bonnet,boot,objective;
    GetVehicleParamsEx(GetPlayerVehicleID(playerid),engine,lights,alarm,doors,bonnet,boot,objective);
    SetVehicleParamsEx(GetPlayerVehicleID(playerid),1,lights,alarm,doors,bonnet,boot,objective);
    enginebool[vehicleid] = true;
    //TextDrawShowForPlayer(playerid,MOTORAN);
    //autotimer[playerid]=SetTimerEx("drawtimer",1000,0,"i",playerid);
    return 1;
    }
    else
    {
    //TextDrawHideForPlayer(playerid,MOTORAN);
    //TextDrawHideForPlayer(playerid,MOTORAUS);
    //KillTimer( autotimer[playerid]);
    new engine,lights,alarm,doors,bonnet,boot,objective;
    GetVehicleParamsEx(GetPlayerVehicleID(playerid),engine,lights,alarm,doors,bonnet,boot,objective);
    SetVehicleParamsEx(GetPlayerVehicleID(playerid),0,lights,alarm,doors,bonnet,boot,objective);
    enginebool[vehicleid] = false;
    //TextDrawShowForPlayer(playerid,MOTORAUS);
    //autotimer[playerid]=SetTimerEx("drawtimer",1000,0,"i",playerid);
    return 1;
    }
    }


    Der Server ist wirklich instant tot, es passiert zu 100% bei dem Befehl /motor, mehrmals habe ich es nun getestet.
    Er läuft nicht instabil oder so, andere Befehle die Schleifen ausführen etc funktionieren problemlos.

  • Probier mal das:


    if(IsPlayerInAnyVehicle(playerid))
    {
    if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER) return SendClientMessage(playerid,WHITE,"Du musst der Fahrer sein!");
    new engine,lights,alarm,doors,bonnet,boot,objective, vehicleid = GetPlayerVehicleID(playerid);
    if(enginebool[vehicleid] == false)
    {
    GetVehicleParamsEx(vehicleid,engine,lights,alarm,doors,bonnet,boot,objective);
    SetVehicleParamsEx(vehicleid,1,lights,alarm,doors,bonnet,boot,objective);
    enginebool[vehicleid] = true;
    }
    else
    {
    GetVehicleParamsEx(vehicleid,engine,lights,alarm,doors,bonnet,boot,objective);
    SetVehicleParamsEx(vehicleid,0,lights,alarm,doors,bonnet,boot,objective);
    enginebool[vehicleid] = false;
    }
    return 1;
    }


    Falls dann auch der Server abschmieren sollte, kann es an diesen Sachen liegen:


    1. Komische Timer mit irgentwelchen dummen Funktionen
    2. Du lädst das falsche Script


    mfg. :thumbup:

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Ok Leute. Ich habe nun aktives Debugging betrieben um den Fehler zu finden. Das hier funktioniert:


    if(enginebool[vehicleid] == false)
    {
    TextDrawHideForPlayer(playerid,MOTORAN);
    TextDrawHideForPlayer(playerid,MOTORAUS);
    KillTimer(autotimer[playerid]);
    //new engine,lights,alarm,doors,bonnet,boot,objective;
    //GetVehicleParamsEx(GetPlayerVehicleID(playerid),engine,lights,alarm,doors,bonnet,boot,objective);
    //SetVehicleParamsEx(GetPlayerVehicleID(playerid),1,lights,alarm,doors,bonnet,boot,objective);
    enginebool[vehicleid] = true;
    TextDrawShowForPlayer(playerid,MOTORAN);
    autotimer[playerid]=SetTimerEx("drawtimer",1000,0,"i",playerid);
    return 1;
    }


    Das hier nicht:


    if(enginebool[vehicleid] == false)
    {
    TextDrawHideForPlayer(playerid,MOTORAN);
    TextDrawHideForPlayer(playerid,MOTORAUS);
    KillTimer(autotimer[playerid]);
    new engine,lights,alarm,doors,bonnet,boot,objective;
    GetVehicleParamsEx(GetPlayerVehicleID(playerid),engine,lights,alarm,doors,bonnet,boot,objective);
    SetVehicleParamsEx(GetPlayerVehicleID(playerid),1,lights,alarm,doors,bonnet,boot,objective);
    enginebool[vehicleid] = true;
    TextDrawShowForPlayer(playerid,MOTORAN);
    autotimer[playerid]=SetTimerEx("drawtimer",1000,0,"i",playerid);
    return 1;
    }


    Sprich: Die Zeilen GetVehicleParamsEx und SetVehicleParamsEx überlasten den Server -.-

  • Erklär mir mal, warum Du folgenden Code verwendest?


    autotimer[playerid]=SetTimerEx("drawtimer",1000,0,"i",playerid);
    Der Timer, drawtimer bezieht sich doch bereits auf die
    Spieler ID. Weshalb deklarierst Du den Timer also doppelt?


    Deine Timer Funktion sollte wie folgt beginnen:


    public drawtimer(playerid)
    {
    ...
    Das ist zwar nicht Dein Problem, aber fixen solltest Du das auch mal.



    Hat sich schon geklärt, hatte mich verlesen. Entschudigung!

    Einmal editiert, zuletzt von 4#Future ()

  • Was zum!?


    SetTimerEx("drawtimer",1000,0,"i",playerid)
    returnt die ID des Timers, der erstellt wurde. also benutzt man
    variable = SetTimerEx("drawtimer",1000,0,"i",playerid)
    Um in "variable" die ID des Timers zu speichern. Wie dir vielleicht aufgefallen
    ist, wird nämlich bei meinem Motor-Befehl erst Killtimer(autotimer[playerid])
    ausgeführt um zu verhindern das der Timer mehrmals läuft (falls man zweimal
    schnell hintereinander /motor eingibt). Und wie zum Geier kommst du auf
    OnGameModeExit?! Das hat noch weniger mit meinem Problem zu tun. Tu
    mir nun bitte einen Gefallen und lass diese belanglosen und unnötigen Posts.
    Die helfen mir absolut nicht und ergeben zudem keinen Sinn!

  • Diese Zeilen klatschen die CPU Auslastung des Nitrado Testservers auf 100%:


    new engine,lights,alarm,doors,bonnet,boot,objective;
    GetVehicleParamsEx(GetPlayerVehicleID(playerid),engine,lights,alarm,doors,bonnet,boot,objective);
    SetVehicleParamsEx(GetPlayerVehicleID(playerid),1,lights,alarm,doors,bonnet,boot,objective);


    Warum auch immer....

  • Ehrlich gesagt, versteh ich das überhaupt nicht.


    Auch in meinem Filterscript verwende ich diese
    Funktion mehrmals und das ohne Auslastungsprobleme.


    Bist Du Dir sicher, dass es von diesen 3 Zeilen kommt?



    Ich bin mir das nicht so sicher.