Browse Source

Help fix ghost_map crashes on client

Issue #86
Image 4 years ago
parent
commit
4274a24f10

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

@@ -613,7 +613,6 @@ EQ2Packet* Spawn::spawn_update_packet(Player* player, int16 version, bool overri
 	tmp_info_packet_size = info_packet_size;
 	tmp_pos_packet_size = pos_packet_size;
 	tmp_vis_packet_size = vis_packet_size;
-	m_Update.releasewritelock(__FUNCTION__, __LINE__);
 
 	int32 size = info_packet_size + pos_packet_size + vis_packet_size + 11;
 	uchar* tmp = new uchar[size];
@@ -645,6 +644,7 @@ EQ2Packet* Spawn::spawn_update_packet(Player* player, int16 version, bool overri
 	safe_delete_array(info_changes);
 	safe_delete_array(vis_changes);
 	safe_delete_array(pos_changes);
+	m_Update.releasewritelock(__FUNCTION__, __LINE__);
 	return ret_packet;
 }
 

+ 1 - 2
EQ2/source/WorldServer/client.cpp

@@ -8280,9 +8280,8 @@ void Client::SendSpawnChanges(set<Spawn*>& spawns) {
 			pos_size = 0;
 			vis_size = 0;
 		}*/
-
 		int16 index = GetPlayer()->GetIndexForSpawn(spawn);
-		if (index == 0)
+		if (index == 0 || !GetPlayer()->WasSentSpawn(spawn->GetID()) || GetPlayer()->WasSpawnRemoved(spawn))
 			continue;
 		
 		if (spawn->info_changed) {

+ 6 - 7
EQ2/source/WorldServer/zoneserver.cpp

@@ -1450,13 +1450,6 @@ bool ZoneServer::SpawnProcess(){
 	MMasterSpawnLock.writelock(__FUNCTION__, __LINE__);
 	// If the zone is loading data or shutting down don't do anything
 	if(!LoadingData && !zoneShuttingDown && !reloading_spellprocess) {
-
-
-		// send spawn changes, changed_spawns loop
-		if(spawn_update.Check() && !zoneShuttingDown) { //check for changed spawns every {Rule:SpawnUpdateTimer} milliseconds (default: 200ms)
-			SendSpawnChanges();
-		}
-
 		// Set some bool's for timers
 		bool movement = movement_timer.Check();
 		bool spawnRange = spawn_range.Check();
@@ -1494,6 +1487,12 @@ bool ZoneServer::SpawnProcess(){
 		if(spawn_check_add.Check() && !zoneShuttingDown)
 			CheckSendSpawnToClient();
 
+
+		// send spawn changes, changed_spawns loop
+		if (spawn_update.Check() && !zoneShuttingDown) { //check for changed spawns every {Rule:SpawnUpdateTimer} milliseconds (default: 200ms)
+			SendSpawnChanges();
+		}
+
 		MSpawnList.readlock(__FUNCTION__, __LINE__);
 		for (itr = spawn_list.begin(); itr != spawn_list.end(); itr++) {
 			// Break the loop if the zone is shutting down