Browse Source

Fix #391 - no crash on eq2world shutdown
Fixed some misc. memory leaks in client/player
removed unneeded debug message
Fixed zone shutdown timers and the incoming clients count

Emagi 1 year ago
parent
commit
2f541603fd

+ 6 - 1
EQ2/source/WorldServer/Player.cpp

@@ -3821,7 +3821,12 @@ bool Player::SetSpawnSentState(Spawn* spawn, SpawnState state) {
 		else
 			spawn_packet_sent.insert(make_pair(spawn->GetID(), state));
 		if(state == SPAWN_STATE_SENT_WAIT) {
-			spawn_state_list.erase(spawn->GetID());
+			map<int32,SpawnQueueState*>::iterator state_itr;
+			if((state_itr = spawn_state_list.find(spawn->GetID())) != spawn_state_list.end()) {
+				safe_delete(state_itr->second);
+				spawn_state_list.erase(state_itr);
+			}
+			
 			SpawnQueueState* removal = new SpawnQueueState;
 			removal->index_id = index;
 			removal->spawn_state_timer = Timer(500, true);

+ 1 - 3
EQ2/source/WorldServer/Spawn.cpp

@@ -3976,9 +3976,7 @@ void Spawn::TransferLoot(Spawn* spawn) {
 	for (itr = loot_items.begin(); itr != loot_items.end();) {
 		if (!(*itr)->IsBodyDrop()) {
 			spawn->AddLootItem(*itr);
-			vector<Item*>::iterator tmpItr = itr;
-			
-			itr = loot_items.erase(tmpItr);
+			itr = loot_items.erase(itr);
 		}
 		else {
 			itr++;

+ 8 - 0
EQ2/source/WorldServer/client.cpp

@@ -284,6 +284,14 @@ void Client::RemoveClientFromZone() {
 	if (player && !player->GetPendingDeletion())
 		safe_delete(player);
 	MDeletePlayer.releasewritelock(__FUNCTION__, __LINE__);
+	
+	deque<BuyBackItem*>::iterator itr;
+	MBuyBack.writelock(__FUNCTION__, __LINE__);
+	for (itr = buy_back_items.begin(); itr != buy_back_items.end();) {
+		safe_delete(*itr);
+		itr = buy_back_items.erase(itr);
+	}
+	MBuyBack.releasewritelock(__FUNCTION__, __LINE__);
 }
 
 

+ 9 - 5
EQ2/source/WorldServer/zoneserver.cpp

@@ -119,10 +119,10 @@ extern MasterSkillList master_skill_list;
 int32 MinInstanceID = 1000;
 
 // JA: Moved most default values to Rules and risky initializers to ZoneServer::Init() - 2012.12.07
-ZoneServer::ZoneServer(const char* name, bool incoming_clients) {
+ZoneServer::ZoneServer(const char* name, bool incoming_client) {
 	incoming_clients = 0;
 	
-	if(incoming_clients)
+	if(incoming_client)
 		IncrementIncomingClients();
 	
 	MIncomingClients.SetName("ZoneServer::MIncomingClients");
@@ -3282,8 +3282,13 @@ void ZoneServer::ClientProcess()
 				shutdownDelayTimer.Start(timerDelay, true);
 			}
 			else if(!incoming_clients || shutdownDelayCheck) {
-				LogWrite(ZONE__INFO, 0, "Zone", "Starting zone shutdown timer for %s...", GetZoneName());
-				shutdownTimer.Start();
+				if(!shutdownTimer.Enabled()) {
+					LogWrite(ZONE__INFO, 0, "Zone", "Starting zone shutdown timer for %s...", GetZoneName());
+					shutdownTimer.Start();
+				}
+				else {
+					LogWrite(ZONE__INFO, 0, "Zone", "zone shutdown timer for %s has %u remaining...", GetZoneName(), shutdownTimer.GetRemainingTime());
+				}
 			}
 		}
 		MIncomingClients.releasereadlock(__FUNCTION__, __LINE__);
@@ -4533,7 +4538,6 @@ void ZoneServer::KillSpawn(bool spawnListLocked, Spawn* dead, Spawn* killer, boo
 		// If dead has loot attempt to drop a chest
 		if (dead->HasLoot()) {
 			if(!(groupMemberAlive = dead->IsSpawnGroupMembersAlive(dead))) {
-				LogWrite(SPAWN__ERROR, 0, "Spawn", "%s: Dead drops chest", dead->GetName());
 				chest = ((Entity*)dead)->DropChest();
 			}
 			else {

+ 1 - 1
EQ2/source/WorldServer/zoneserver.h

@@ -260,7 +260,7 @@ struct ZoneInfoSlideStruct {
 // need to attempt to clean this up and add xml comments, remove unused code, find a logical way to sort the functions maybe by get/set/process/add etc...
 class ZoneServer {
 public:
-	ZoneServer(const char* file, bool incoming_clients=false);
+	ZoneServer(const char* file, bool incoming_client=false);
     ~ZoneServer();
 	
 	void		IncrementIncomingClients();

+ 1 - 1
EQ2/source/common/database.cpp

@@ -464,7 +464,7 @@ void Database::PurgeDBInstances()
 	map<Database*, bool>::iterator itr;
 	DBInstanceMutex.writelock(__FUNCTION__, __LINE__);
 	for (itr = dbInstances.begin(); itr != dbInstances.end(); itr++) {
-		Database* tmpInst = itr->first;
+		WorldDatabase* tmpInst = (WorldDatabase*)itr->first;
 		safe_delete(tmpInst);
 	}
 	dbInstances.clear();