[LogikFehler]Rennen mit Ausschluss | Nicht Coder können auch helfen

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

    • Das müsste um einiges kürzer gehen und in GameContext, da das sozusagen für alle spieler ist und nicht nur für ein Objekt...

      [cpp]
      // Character.h:
      bool aRoundDone[MAX_CLIENTS-1]; // Maximale Anzahl an Runden...
      int CurrentRound;

      //Character.cpp:

      // iwo, wo du prüfst, ob Spieler das Ziel durchläuft
      if(/*Durch das Ziel gekommen*/)
      aRoundDone[CurrentRound++] = true;

      // Gamecontext.h, unter private
      int RoundKick;

      // GameContext.cpp, am besten OnTick oder so
      int Kick = -1;

      for(int i = 0; i < MAX_CLIENTS)
      {
      if(!GameServer()->m_apPlayers)
      continue;
      if(GameServer()->m_apPlayers[i]->GetTeam() == TEAM_SPECTATORS)
      continue;

      CCharacter *Char = GameServer()->GetPlayerChar(i);

      if(Char && Char->IsAlive() && !Char->aRoundDone[RoundKick])
      {
      switch(Kick)
      {
      case -1:
      Kick = i; // Spieler i wird zum Kicken vorgeschlagen
      case -2:
      break; // Mehrere Spieler sind noch da, switch ende
      default:
      Kick = -2; // Wenn bereits ein Spieler auf der Liste steht, wird dieser entfernt
      }
      }
      }

      if(Kick >= 0)
      {
      /* east: falls du das meinst... sry habe mich verguckt^^ natürlich ergibt es keinen sinn i wird zu diesem zeitpunkt schon ausm stackspeicher entfernt...
      /* falsch: GameServer()->SendChatTarget(i,"You're Out!"); */
      /* richtig: */ GameServer()->SendChatTarget(Kick,"You're Out!");
      // Dein Code zum Rauswerfen [...]
      RoundKick++;
      }

      [/cpp]

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

    • Pikotee schrieb:


      [cpp]

      {
      /* east: falls du das meinst... sry habe mich verguckt^^ natürlich ergibt es keinen sinn i wird zu diesem zeitpunkt schon ausm stackspeicher entfernt...
      /* falsch: GameServer()->SendChatTarget(i,"You're Out!"); */
      /* richtig: */ GameServer()->SendChatTarget(Kick,"You're Out!");
      // Dein Code zum Rauswerfen [...]
      RoundKick++;
      }

      [/cpp]

      Mit "am Ende" meinte ich nachdem die Schleife beendet wurde.
      Hat sich ja geklärt^^
    • Also, sowohl von der Logik als auch vom Code her müsste das klappen. Wie rufst du die Funktion denn auf?

      Jedoch muss ich sagen, dass nicht nur die Logik an sich, sondern auch dein Code hässlich sind und überarbeitet werden müssten.

      1. Tipp: speichere die ID vom letzten Spieler der die Runde noch nicht erreicht hat, damit sparst du dir die 2. unnötige Schleife...

      2. Tipp: Führe einen RoundCount für jeden Char ein, wie Pikotee es bereits vorgeschlagen hat, dabei reicht aber ein simpler Integer, der die aktuelle Runde wiederspiegelt.


      Ich hätte es z.B. so in der art gemacht: so wird derjenige mit der niedrigsten rundenanzahl gekickt



      [cpp]int lastID = -1;
      int lastRound=MAX_ROUNDS;
      for(int i = 0; i < MAX_CLIENTS; ++i){
      //überprüfung ob char vorhanden ist etc.
      if(pChar->m_CurrentRound < lastRound) {
      if(lastID==-1){
      lastRound=pChar->m_CurrentRound ;
      lastID=i;
      }
      else
      return; // es sind mehrere in der Runde
      }
      }
      if(lastID != -1) KICK[/cpp]


      Gruß Pata