Dummy erkennen?

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

    • OOkay

      Da du das bei 15 Spielern/14 Spielern willst brauchen wir auch nichts groß in den Network datein zu verändern.

      Also als erstes brauchst du eine Variable die dir sagt ob der Spieler ein Dummy ist.

      Spoiler anzeigen

      [cpp]bool m_aIsDummy[MAX_CLIENTS];[/cpp]
      oder wir machen es direkt in der "CClient" Klasse des Servers

      [cpp]
      class CClient
      {
      public:

      enum
      {
      STATE_EMPTY = 0,
      STATE_AUTH,
      STATE_CONNECTING,
      STATE_READY,
      STATE_INGAME,

      SNAPRATE_INIT=0,
      SNAPRATE_FULL,
      SNAPRATE_RECOVER
      };

      class CInput
      {
      public:
      int m_aData[MAX_INPUT_SIZE];
      int m_GameTick; // the tick that was chosen for the input
      };

      // connection state info
      int m_State;
      int m_Latency;
      int m_SnapRate;

      int m_LastAckedSnapshot;
      int m_LastInputTick;
      CSnapshotStorage m_Snapshots;

      CInput m_LatestInput;
      CInput m_aInputs[200]; // TODO: handle input better
      int m_CurrentInput;

      char m_aName[MAX_NAME_LENGTH];
      char m_aClan[MAX_CLAN_LENGTH];
      int m_Country;
      int m_Score;
      int m_Authed;
      int m_AuthTries;

      const IConsole::CCommandInfo *m_pRconCmdToSend;

      void Reset();
      };

      CClient m_aClients[MAX_CLIENTS];
      [/cpp]

      dort fügen wir dann unser bool ein ->
      [cpp]
      ...
      int m_Score;
      int m_Authed;
      int m_AuthTries;

      ++ bool m_IsDummy;

      const IConsole::CCommandInfo *m_pRconCmdToSend;
      ...
      [/cpp]

      dann müssen wir noch überprüfen ob der spieler ein Dummy ist -> Also schauen wir beim Verbinden auf den Server (z.B. direkt bei den Infos) ob der Spieler ein Dummy ist, indem wir die ip des Spielers mit den ip's der Spieler auf dem Server vergleichen (.. du musst natürlich auch bedenken, dass ein Familienmitglied evtl. auch gerade Teeworlds auf diesem Server spielen will.. - aber das ist ja nicht mein Problem ;) )

      [cpp]
      if(Sys)
      {
      // system message
      if(Msg == NETMSG_INFO)
      {
      if(m_aClients[ClientID].m_State == CClient::STATE_AUTH)
      {

      const char *pVersion = Unpacker.GetString(CUnpacker::SANITIZE_CC);
      if(str_comp(pVersion, GameServer()->NetVersion()) != 0)
      {
      // wrong version
      char aReason[256];
      str_format(aReason, sizeof(aReason), "Wrong version. Server is running '%s' and client '%s'", GameServer()->NetVersion(), pVersion);
      m_NetServer.Drop(ClientID, aReason);
      return;
      }

      const char *pPassword = Unpacker.GetString(CUnpacker::SANITIZE_CC);
      if(g_Config.m_Password[0] != 0 && str_comp(g_Config.m_Password, pPassword) != 0)
      {
      // wrong password
      m_NetServer.Drop(ClientID, "Wrong password");
      return;
      }

      //Hier kannst du das z.b. einfügen (sorry hab grad keine lust das mit der ip raus zu suchen - musst du selber machen)

      for(int i = 0; i < MAX_CLIENTS; i++)
      {
      if(m_aClients.m_State == CClient::STATE_EMPTY || i == ClientID) //hieß glaub empty
      continue;

      if(Ip von Spieler i == Ip von Spieler "ClientID")
      {
      m_aClients[ClientID].m_IsDummy = true;
      break;
      }
      }

      if(m_aClients[ClientID].m_IsDummy && Spielerzahl >= 14/15)
      {
      m_NetServer.Drop(ClientID, "only one client per ip while server is nearly full");
      return;
      }

      if(Spielerzahl == 16)
      {
      for(int i = 0; i < MAX_CLIENTS; i++)
      {
      if(m_aClients[i].m_State == CClient::STATE_EMPTY || !m_aClients[i].m_IsDummy)
      continue;

      m_NetServer.Drop(i, "kicked all dummys on server - sorry :3");
      //Evtl. solltest du nur einmal in den chat schreiben, dass alle dummys gekickt wurden, da es sonst etwas spammen könnte
      }
      }
      m_aClients[ClientID].m_State = CClient::STATE_CONNECTING;
      SendMap(ClientID);
      }
      }
      [/cpp]
      Und bei der Reset funktion solltest du IsDummy dann auch wieder auf false setzen ;)


      ~Alles im Editor hier geschrieben und nicht getestet ;) Aber viel spaß mit dem Anfang, sollte er dir gefallen^^ (Formatieren musst du natürlich selber :*P )

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von solala.' ()