ServerTick, Timed-Events, Timer

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • ServerTick, Timed-Events, Timer

      Hier ein Tutorial das mehr Mainstream ist also kein Lua code oder so was sondern nur pure c++ :)

      1. Was bedeutet ServerTick?
      2. Wie benutze ich ServerTick und TickSpeed?
      3. Wie baue ich einen Timer?
      4. Wie mache ich Timelimits?
      5. Beispiele
      6. Schlusswort



      1. Was bedeutet ServerTick?
      Der ServerTick ist eine Zahl die bei jedem durchlauf erhöht wird. Es gibt 50 durchläufe pro Sekunde. Bei jedem durchlauf wird eine sogenannte TickFunction in einigen Klassen ausgeführt:
      -GameContext (gamecontext.cpp) der bei anderen Klassen die TickFunktion ausführt und sich selbst in der TickFunktion (hier OnTick) unter anderem um die Votes kümmert.
      Folgende
      1. World: Die Welt (gameworld.cpp) welche bei allen Entities die Tickfunktion ausführt. Der Character, Pickups und Projektile sind Entities.
      2. Controller: Der Controller (gamecontroller.cpp) gibt die Spielregeln vor und überprüft ob ein Team/Spieler gewonnen hat.
      3. Players: Die Player (player.cpp) wo unter anderem der Ping berechnet wird.

      Quellcode

      1. Tick
      2. Game Context (CGameContext::OnTick)
      3. Game World (GAMEWORLD::Tick)
      4. Reset world if requested (GAMEWORLD::Reset)
      5. All entities in the world (ENTITY::Tick)
      6. All entities in the world (ENTITY::TickDefered)
      7. Remove entities marked for deletion (GAMEWORLD::remove_entities)
      8. Game Controller (GAMECONTROLLER::Tick)
      9. All players (CPlayer::Tick)



      2. Wie benutze ich ServerTick und TickSpeed?
      [cpp]
      Server()->Tick();
      Server()->TickSpeed();
      [/cpp]
      Aufruf der Funktionen in C++.
      Mit Server()->Tick() können wir den aktuellen Tick wert abfragen.
      Server()->TickSpeed() gibt uns immer 50 zurück.

      3. Wie baue ich einen Timer?
      Jetzt bauen wir einen einfachen Timer in einer TickFunktion.
      [cpp]
      CPlayer::Tick()
      {
      if (Server()->Tick() % (Server()->TickSpeed() * 1) == 0)
      {
      //Code hier
      }
      }
      [/cpp]
      Der hier beschriebene Timer führt jede Sekunde den Code in der if aus. Das *1 ist ein platzhalter für die Sekundenzahl. Ihr könnt die * 1 durch eine andere Sekundenzahl ersätzen.

      4. Wie mache ich Timelimits?
      Um ein timelimit zu machen müssen wir erstmal eine Variable in die Klassen-Headerdatei definieren.
      [cpp]
      int m_MyTimeLimit;
      [/cpp]
      In die .cpp datei kommt folgender code:
      [cpp]
      CPlayer::Tick()
      {
      if (m_MyTimeLimit + Server()->TickSpeed() < Server()->Tick())
      {
      //Dieser Code wird jeden Tick ausgeführt bis m_MyTimeLimit auf Server()->Tick() gesetzt wird.
      //So kann man z.b. Spamprotection realisieren
      }
      }
      [/cpp]


      5. Beispiele
      player.cpp
      [cpp]
      if(!m_pCharacter && m_DieTick+Server()->TickSpeed()*3 <= Server()->Tick())
      m_Spawning = true;
      [/cpp]
      Nach dem der Tee Tot ist wird der nach 3 Sekunden automatisch respawnt.

      [cpp]
      // we got to wait 0.5 secs before respawning
      m_RespawnTick = Server()->Tick()+Server()->TickSpeed()/2;
      [/cpp]
      Vor dem Respawn müssen wir 0,5 sekunden warten. Nach 0,5 sek ist ein Respawn durch klicken der Maus möglich.


      6. Schlusswort
      Wenn es um Zeitgesteuerte Abläufe geht, ob periodisch oder zufällig ist die TickFunktion ein nützliches Hilfsmittel und in vielen Fällen sogar anders kaum zu realisieren.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von MAP94 ()

    • Ich bin davon ausgegangen, dass wir den TickSpeed nicht ändern weil man sonst einen Alternativen Cient braucht. Aber natprlich hast du recht. Man kann den TickSpeed in der protocol.h geändert werden

      [cpp]
      // this should be revised
      enum
      {
      SERVER_TICK_SPEED=50,
      SERVER_FLAG_PASSWORD = 0x1,

      MAX_CLIENTS=16,

      MAX_INPUT_SIZE=128,
      MAX_SNAPSHOT_PACKSIZE=900,

      MAX_NAME_LENGTH=16,
      MAX_CLAN_LENGTH=12,

      // message packing
      MSGFLAG_VITAL=1,
      MSGFLAG_FLUSH=2,
      MSGFLAG_NORECORD=4,
      MSGFLAG_RECORD=8,
      MSGFLAG_NOSEND=16
      };
      [/cpp]
    • Hi ich hab da mal eine frage. es ist zwar so das es in folgendem code alle 3 sekunden zutrifft jedoch jan die situation jederzeit eintreffen und dann kann es sein das die bedingung schon nach 1 sec erfüllt ist. wie bekomme ich es hin das es immer 3 sekunden dauert bis die bedingung zutrifft?
      [cpp] if(m_Health < 10)
      {
      regenhealth = 1;
      }

      if(regenhealth = 1)
      {

      if((Server()->Tick() % (Server()->TickSpeed() * 3) == 0) && waithealthregen <= 0)
      {
      waithealthregen++;
      }

      if((Server()->Tick() % (Server()->TickSpeed() / 3) == 0) && waithealthregen == 1)
      {
      if(m_Health < 10)
      {
      m_Health++;
      }
      else
      {
      waithealthregen = 0;
      regenhealth = 0;
      }
      }
      }[/cpp]
    • Achso, nun verstehe ich wo dein Problem liegt.
      Du meinst der Servertick könnte auch in dem Moment, wo Health < 10 ist bei 100 liegen und so wäre die Verzögerung nur 1 Sekunde.


      Erstell eine Variable, die den derzeitigen Wert von Server->Tick() speichert und lasse waithealthregen++; erst dann zu, wenn der Wert
      Server-Tick() 150 höher ist, als der Wert von der Variablen.

      Der Wert der Variable darf sich aber nicht überschreiben, bei dem nächsten Tick.