tHandling of not-yet-fully-connected players much improved, to cut down on inva… | |
git clone git://src.adamsgaard.dk/vaccinewars | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit ac035dba03aa85c81f2c394ff428452bdef9cad4 | |
parent 658b93f9bdd6342e90eb03adaa9508ed754b1178 | |
Author: Ben Webb <[email protected]> | |
Date: Mon, 3 Dec 2001 16:10:56 +0000 | |
Handling of not-yet-fully-connected players much improved, to cut down on | |
invalid packets | |
Diffstat: | |
M src/AIPlayer.c | 1 + | |
M src/dopewars.c | 6 ++++++ | |
M src/dopewars.h | 1 + | |
M src/message.c | 15 +++++++++------ | |
M src/serverside.c | 40 ++++++++++++++++++++++-------… | |
5 files changed, 45 insertions(+), 18 deletions(-) | |
--- | |
diff --git a/src/AIPlayer.c b/src/AIPlayer.c | |
t@@ -274,6 +274,7 @@ int HandleAIMessage(char *Message,Player *AIPlay) { | |
GSList *list; | |
struct timeval tv; | |
gboolean Handled; | |
+ | |
if (ProcessMessage(Message,AIPlay,&From,&AI,&Code, | |
&Data,FirstClient)==-1) { | |
g_warning("Bad network message. Oops."); return 0; | |
diff --git a/src/dopewars.c b/src/dopewars.c | |
t@@ -727,6 +727,12 @@ GSList *AddPlayer(int fd,Player *NewPlayer,GSList *First)… | |
return g_slist_append(First,(gpointer)NewPlayer); | |
} | |
+gboolean IsConnectedPlayer(Player *play) { | |
+/* Returns TRUE only if the given player has properly connected (i.e. has | |
+ a valid name) */ | |
+ return (play && play->Name && play->Name[0]); | |
+} | |
+ | |
void UpdatePlayer(Player *Play) { | |
/* Redimensions the Gun and Drug lists for "Play" */ | |
Play->Guns=(Inventory *)g_realloc(Play->Guns,NumGun*sizeof(Inventory)); | |
diff --git a/src/dopewars.h b/src/dopewars.h | |
t@@ -403,4 +403,5 @@ void RestoreConfig(void); | |
void ScannerErrorHandler(GScanner *scanner,gchar *msg,gint error); | |
void OpenLog(void); | |
void CloseLog(void); | |
+gboolean IsConnectedPlayer(Player *play); | |
#endif | |
diff --git a/src/message.c b/src/message.c | |
t@@ -433,12 +433,15 @@ void BroadcastToClients(AICode AI,MsgCode Code,char *Dat… | |
/* Sends the message made up of AI,Code and Data to all players except */ | |
/* "Except" (if non-NULL). It will be sent by the server, and on behalf of */ | |
/* player "From" */ | |
- Player *tmp; | |
- GSList *list; | |
- for (list=FirstServer;list;list=g_slist_next(list)) { | |
- tmp=(Player *)list->data; | |
- if (tmp!=Except) SendServerMessage(From,AI,Code,tmp,Data); | |
- } | |
+ Player *tmp; | |
+ GSList *list; | |
+ | |
+ for (list=FirstServer;list;list=g_slist_next(list)) { | |
+ tmp=(Player *)list->data; | |
+ if (IsConnectedPlayer(tmp) && tmp!=Except) { | |
+ SendServerMessage(From,AI,Code,tmp,Data); | |
+ } | |
+ } | |
} | |
void SendInventory(Player *From,AICode AI,MsgCode Code, | |
diff --git a/src/serverside.c b/src/serverside.c | |
t@@ -369,7 +369,9 @@ void HandleServerMessage(gchar *buf,Player *Play) { | |
SetPlayerName(Play,Data); | |
for (list=FirstServer;list;list=g_slist_next(list)) { | |
pt=(Player *)list->data; | |
- if (pt!=Play && !IsCop(pt)) SendPlayerDetails(pt,Play,C_LIST… | |
+ if (pt!=Play && IsConnectedPlayer(pt) && !IsCop(pt)) { | |
+ SendPlayerDetails(pt,Play,C_LIST); | |
+ } | |
} | |
SendServerMessage(NULL,C_NONE,C_ENDLIST,Play,NULL); | |
RegisterWithMetaServer(TRUE,FALSE,TRUE); | |
t@@ -380,7 +382,9 @@ void HandleServerMessage(gchar *buf,Player *Play) { | |
} | |
for (list=FirstServer;list;list=g_slist_next(list)) { | |
pt=(Player *)list->data; | |
- if (pt!=Play) SendPlayerDetails(Play,pt,C_JOIN); | |
+ if (IsConnectedPlayer(pt) && pt!=Play) { | |
+ SendPlayerDetails(Play,pt,C_JOIN); | |
+ } | |
} | |
Play->EventNum=E_ARRIVE; | |
SendPlayerData(Play); | |
t@@ -525,8 +529,8 @@ void HandleServerMessage(gchar *buf,Player *Play) { | |
BroadcastToClients(C_NONE,C_MSG,Data,Play,Play); | |
break; | |
default: | |
- g_warning("%s:%c:%s:%s",GetPlayerName(Play),Code, | |
- GetPlayerName(To),Data); | |
+ dopelog(0,_("Unknown message: %s:%c:%s:%s"),GetPlayerName(Play),Code, | |
+ GetPlayerName(To),Data); | |
break; | |
} | |
} | |
t@@ -536,6 +540,9 @@ void ClientLeftServer(Player *Play) { | |
/* cleans up after them if necessary. */ | |
Player *tmp; | |
GSList *list; | |
+ | |
+ if (!IsConnectedPlayer(Play)) return; | |
+ | |
if (Play->EventNum==E_FIGHT || Play->EventNum==E_FIGHTASK) { | |
WithdrawFromCombat(Play); | |
} | |
t@@ -1447,9 +1454,13 @@ void GuiServerLoop(gboolean is_service) { | |
void FinishGame(Player *Play,char *Message) { | |
/* Tells player "Play" that the game is over; display "Message" */ | |
- ClientLeftServer(Play); | |
Play->EventNum=E_FINISH; | |
+ ClientLeftServer(Play); | |
SendHighScores(Play,TRUE,Message); | |
+ | |
+/* Blank the name, so that CountPlayers ignores this player */ | |
+ SetPlayerName(Play,NULL); | |
+ | |
/* Make sure they do actually disconnect, eventually! */ | |
if (ConnectTimeout) { | |
Play->ConnectTimeout=time(NULL)+(time_t)ConnectTimeout; | |
t@@ -1928,7 +1939,8 @@ void SendEvent(Player *To) { | |
case E_ARRIVE: | |
for (list=FirstServer;list;list=g_slist_next(list)) { | |
Play=(Player *)list->data; | |
- if (Play!=To && Play->IsAt==To->IsAt && | |
+ if (IsConnectedPlayer(Play) && Play!=To && | |
+ Play->IsAt==To->IsAt && | |
Play->EventNum==E_NONE && TotalGunsCarried(To)>0) { | |
text=g_strdup_printf(_("AE^%s is already here!^" | |
"Do you Attack, or Evade?"), | |
t@@ -2392,6 +2404,11 @@ void WithdrawFromCombat(Player *Play) { | |
GSList *list; | |
gchar *text; | |
+ for (list=FirstServer;list;list=g_slist_next(list)) { | |
+ Attack=(Player *)list->data; | |
+ if (Attack->Attacking==Play) Attack->Attacking=NULL; | |
+ } | |
+ | |
if (!Play->FightArray) return; | |
ResolveTipoff(Play); | |
t@@ -2406,11 +2423,6 @@ void WithdrawFromCombat(Player *Play) { | |
if (!FightDone) break; | |
} | |
- for (list=FirstServer;list;list=g_slist_next(list)) { | |
- Attack=(Player *)list->data; | |
- if (Attack->Attacking==Play) Attack->Attacking=NULL; | |
- } | |
- | |
SendFightLeave(Play,FightDone); | |
g_ptr_array_remove(Play->FightArray,(gpointer)Play); | |
t@@ -2734,6 +2746,7 @@ void HandleAnswer(Player *From,Player *To,char *answer) { | |
break; | |
} else if (From->EventNum==E_ARRIVE) { | |
if ((answer[0]=='A' || answer[0]=='T') && | |
+ IsConnectedPlayer(From->OnBehalfOf) && | |
g_slist_find(FirstServer,(gpointer)From->OnBehalfOf)) { | |
Defender=From->OnBehalfOf; | |
From->OnBehalfOf=NULL; /* So we don't think it was a tipoff */ | |
t@@ -2995,6 +3008,8 @@ GSList *HandleTimeouts(GSList *First) { | |
dopelog(1,_("Player removed due to idle timeout")); | |
SendPrintMessage(NULL,C_NONE,Play,"Disconnected due to idle timeout"); | |
ClientLeftServer(Play); | |
+/* Blank the name, so that CountPlayers ignores this player */ | |
+ SetPlayerName(Play,NULL); | |
/* Make sure they do actually disconnect, eventually! */ | |
if (ConnectTimeout) { | |
Play->ConnectTimeout=time(NULL)+(time_t)ConnectTimeout; | |
t@@ -3003,7 +3018,8 @@ GSList *HandleTimeouts(GSList *First) { | |
Play->ConnectTimeout=0; | |
dopelog(1,_("Player removed due to connect timeout")); | |
First=RemovePlayer(Play,First); | |
- } else if (Play->FightTimeout!=0 && Play->FightTimeout<=timenow) { | |
+ } else if (IsConnectedPlayer(Play) && | |
+ Play->FightTimeout!=0 && Play->FightTimeout<=timenow) { | |
ClearFightTimeout(Play); | |
if (IsCop(Play)) Fire(Play); | |
else SendFightReload(Play); |