From: <mr...@us...> - 2007-12-09 22:59:00
|
Revision: 408 http://planeshift.svn.sourceforge.net/planeshift/?rev=408&view=rev Author: mr_dave Date: 2007-12-09 14:59:04 -0800 (Sun, 09 Dec 2007) Log Message: ----------- Fixed FS#669 Modified Paths: -------------- trunk/docs/history.txt trunk/src/server/gmeventmanager.cpp trunk/src/server/gmeventmanager.h Modified: trunk/docs/history.txt =================================================================== --- trunk/docs/history.txt 2007-12-09 03:19:18 UTC (rev 407) +++ trunk/docs/history.txt 2007-12-09 22:59:04 UTC (rev 408) @@ -1,3 +1,7 @@ +*** 2007-12-09 by Dave Bentham +- Fixed FS#669: deleting GM character does not remove their Event(s) from + the game. + *** 2007-12-09 by Kenny Graunke - Remove ugly hack to unreverse animation direction - the new CS fixes it. - Introduced /planeshift/userdata VFS mount, a platform-specific location for Modified: trunk/src/server/gmeventmanager.cpp =================================================================== --- trunk/src/server/gmeventmanager.cpp 2007-12-09 03:19:18 UTC (rev 407) +++ trunk/src/server/gmeventmanager.cpp 2007-12-09 22:59:04 UTC (rev 408) @@ -111,7 +111,7 @@ bool GMEventManager::AddNewGMEvent (Client* client, csString eventName, csString eventDescription) { int newEventID, zero=0; - int gmID = client->GetPlayerID(); + unsigned int gmID = client->GetPlayerID(); int clientnum = client->GetClientNum(); GMEvent* gmEvent; @@ -169,9 +169,10 @@ } /// GM registers player into his/her event -bool GMEventManager::RegisterPlayerInGMEvent (int clientnum, int gmID, Client* target) +bool GMEventManager::RegisterPlayerInGMEvent (int clientnum, unsigned int gmID, Client* target) { - int playerID, zero=0; + unsigned int playerID; + int zero=0; GMEvent *gmEvent; // make sure GM is running an event, the player is valid and available. @@ -286,7 +287,7 @@ } /// GM completes their event -bool GMEventManager::CompleteGMEvent (Client* client, int gmID) +bool GMEventManager::CompleteGMEvent (Client* client, unsigned int gmID) { int zero = 0; @@ -329,9 +330,10 @@ } /// GM removes player from incomplete event -bool GMEventManager::RemovePlayerFromGMEvent (int clientnum, int gmID, Client* target) +bool GMEventManager::RemovePlayerFromGMEvent (int clientnum, unsigned int gmID, Client* target) { - int playerID, zero=0; + unsigned int playerID; + int zero=0; GMEvent* gmEvent; GMEvent* playerEvent; @@ -483,7 +485,7 @@ } /// return all events, running & complete, for a specified player -int GMEventManager::GetAllGMEventsForPlayer (int playerID, +int GMEventManager::GetAllGMEventsForPlayer (unsigned int playerID, csArray<int>& completedEvents, int& runningEventAsGM, csArray<int>& completedEventsAsGM) @@ -575,6 +577,10 @@ } else // and name the running GM { + if (theEvent->gmID == UNDEFINED_GMID) + { + eventDesc.AppendFmt(" (No GM)"); + } if ((target = clientConnections->FindPlayer(theEvent->gmID))) { eventDesc.AppendFmt(" (%s)", target->GetName()); @@ -600,8 +606,9 @@ } } -/// remove players complete references to GM events they were involved with -bool GMEventManager::RemovePlayerFromGMEvents(int playerID) +/// remove players complete references to GM events they were involved with, +/// e.g. if a character is deleted. +bool GMEventManager::RemovePlayerFromGMEvents(unsigned int playerID) { int runningEventIDAsGM; int runningEventID, gmEventID; @@ -644,21 +651,18 @@ // ...and from the DB too if (eventsFound) db->Command("DELETE FROM character_events WHERE player_id = %d", playerID); - - // if this is a GM whats running an event, remove players from it first - // before removing GM themself + + // if this is a GM thats being deleted, set its GMID to UNDEFINED_GMID. if (runningEventIDAsGM >= 0) { gmEvent = GetGMEventByID(runningEventIDAsGM); if (gmEvent) { - gmEvents.Delete(gmEvent); - db->Command("DELETE FROM character_events WHERE event_id = %d", runningEventIDAsGM); - db->Command("DELETE FROM gm_events WHERE id = %d", runningEventIDAsGM); - delete gmEvent; + gmEvent->gmID = UNDEFINED_GMID; + db->Command("UPDATE gm_events SET gm_id = %d WHERE id = %d", UNDEFINED_GMID, gmEvent->id); } else - Error3("Cannot remove GM Event %d after loss of GM %d.", runningEventID, playerID); + Error3("Cannot remove GM %d from Event %d.", playerID, runningEventID); } evIter = completedEventIDsAsGM.GetIterator(); while(evIter.HasNext()) @@ -667,14 +671,12 @@ gmEvent = GetGMEventByID(gmEventID); if (gmEvent) { - gmEvents.Delete(gmEvent); - db->Command("DELETE FROM character_events WHERE event_id = %d", gmEventID); - db->Command("DELETE FROM gm_events WHERE id = %d", gmEventID); - delete gmEvent; + gmEvent->gmID = UNDEFINED_GMID; + db->Command("UPDATE gm_events SET gm_id = %d WHERE id = %d", UNDEFINED_GMID, gmEvent->id); } else - Error3("Cannot remove GM Event %d after loss of GM %d.", gmEventID, playerID); - } + Error3("Cannot remove GM %d from Event %d.", playerID, gmEventID); + } return true; } @@ -801,7 +803,8 @@ void GMEventManager::DiscardGMEvent(Client* client, int eventID) { int runningEventIDAsGM; - int runningEventID, playerID; + int runningEventID; + unsigned int playerID; csArray<int> completedEventIDsAsGM; csArray<int> completedEventIDs; GMEvent* gmEvent; Modified: trunk/src/server/gmeventmanager.h =================================================================== --- trunk/src/server/gmeventmanager.h 2007-12-09 03:19:18 UTC (rev 407) +++ trunk/src/server/gmeventmanager.h 2007-12-09 22:59:04 UTC (rev 408) @@ -30,6 +30,8 @@ #define MAX_EVENT_NAME_LENGTH 40 #define MAX_REGISTER_RANGE 100.0 +#define UNDEFINED_GMID 0 + enum GMEventStatus { EMPTY = 0, // no GM event @@ -72,7 +74,7 @@ * @param target: registeree player client. * @return bool: true = success, false = failed. */ - bool RegisterPlayerInGMEvent (int clientnum, int gmID, Client* target); + bool RegisterPlayerInGMEvent (int clientnum, unsigned int gmID, Client* target); /** GM registers all players in range. * @@ -88,7 +90,7 @@ * @param gmID: Game Master player ID. * @return bool: true = success, false = failed. */ - bool CompleteGMEvent (Client* client, int gmID); + bool CompleteGMEvent (Client* client, unsigned int gmID); /** A player completes an event. * @@ -112,7 +114,7 @@ * @param target: registeree player client to be removed. * @return bool: true = success, false = failed. */ - bool RemovePlayerFromGMEvent (int clientnum, int gmID, Client* target); + bool RemovePlayerFromGMEvent (int clientnum, unsigned int gmID, Client* target); /** Reward players who complete an event (NB event must be live at the time * of reward). @@ -140,7 +142,7 @@ * @param completedEventsAsGM: array of ids of completed events as GM. * @return int: running event id. */ - int GetAllGMEventsForPlayer (int playerID, + int GetAllGMEventsForPlayer (unsigned int playerID, csArray<int>& completedEvents, int& runningEventAsGM, csArray<int>& completedEventsAsGM); @@ -163,7 +165,7 @@ * @param playerID: id of player being removed * @returns bool: true = success */ - bool RemovePlayerFromGMEvents(int playerID); + bool RemovePlayerFromGMEvents(unsigned int playerID); private: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |