tHandling of not-yet-fully-connected players much improved, to cut down on invalid packets - vaccinewars - be a doctor and try to vaccinate the world
(HTM) git clone git://src.adamsgaard.dk/vaccinewars
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
(DIR) commit ac035dba03aa85c81f2c394ff428452bdef9cad4
(DIR) parent 658b93f9bdd6342e90eb03adaa9508ed754b1178
(HTM) Author: Ben Webb <ben@salilab.org>
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(-)
---
(DIR) 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;
(DIR) 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));
(DIR) 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
(DIR) diff --git a/src/message.c b/src/message.c
t@@ -433,12 +433,15 @@ void BroadcastToClients(AICode AI,MsgCode Code,char *Data,
/* 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,
(DIR) 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);