Benutzerinformationen überspringen
Pwner!
Wohnort: ▬▬▬▬▬▬▬▬▬▬▬▬▬▬ ♥ bei Jimjam ♥ ▬▬▬▬▬▬▬▬▬▬▬▬▬▬
Beruf: ▬▬▬▬▬▬▬▬▬▬▬▬▬▬ ♥ Jimjam's Freund ♥ ▬▬▬▬▬▬▬▬▬▬▬▬▬▬
Renommeemodifikator: 11
if (Server()->Tick() % (Server()->TickSpeed() * 1) == 4)
{
GameServer->Broadcast(-1, g_Config.m_SvBroadcastMsg);
}
Wäre eine möglichkeit, einfach in einer Tick/OnTick funktion aufrufen. Kann aber sein, dass ich mich mit den Parametern vertan hab, muss du gucken.
Meskalin.
IP Adressen vergleichen.
Ewiges broadcast kannst du durch ein bisschen pfuschen im Code hinbekommen.
Alle Dummys, oder nur ein Zufälliger/der erste Dummy/der zuletzt gejointe...Also perfekt wäre es wenn man bis zu 15 bzw. 14. Spieler nen dummy hernehmen kann aber wenn der 16. Kommt der dummy automatisch gekickt werden soll. Und erst wieder joinen kann wenn 14 bzw. 15 spieler ''nur'' noch droben sind
Des wäre nice ;))
Benutzerinformationen überspringen
Pwner!
Wohnort: ▬▬▬▬▬▬▬▬▬▬▬▬▬▬ ♥ bei Jimjam ♥ ▬▬▬▬▬▬▬▬▬▬▬▬▬▬
Beruf: ▬▬▬▬▬▬▬▬▬▬▬▬▬▬ ♥ Jimjam's Freund ♥ ▬▬▬▬▬▬▬▬▬▬▬▬▬▬
Renommeemodifikator: 11
C++ Quelltext |
|
1 |
bool m_aIsDummy[MAX_CLIENTS]; |
C++ Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
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]; |
C++ Quelltext |
|
1 2 3 4 5 6 7 8 9 |
... int m_Score; int m_Authed; int m_AuthTries; ++ bool m_IsDummy; const IConsole::CCommandInfo *m_pRconCmdToSend; ... |
C++ Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
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[i].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); } } |
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »solala.'« (10. November 2014, 20:00)