Browse Source

Spawn struct fixes / logging

Image 4 years ago
parent
commit
9574459e57

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

@@ -106,6 +106,9 @@ Player::Player(){
 	spawn_footer_struct = 0;
 	widget_footer_struct = 0;
 	sign_footer_struct = 0;
+	pos_xor_size = 0;
+	info_xor_size = 0;
+	vis_xor_size = 0;
 	pos_mutex.SetName("Player::pos_mutex");
 	vis_mutex.SetName("Player::vis_mutex");
 	info_mutex.SetName("Player::info_mutex");
@@ -2966,16 +2969,19 @@ uchar* Player::GetTempPosPacketForXOR(){
 
 uchar* Player::SetTempInfoPacketForXOR(int16 size){
 	spawn_tmp_info_xor_packet = new uchar[size];
+	info_xor_size = size;
 	return spawn_tmp_info_xor_packet;
 }
 
 uchar* Player::SetTempVisPacketForXOR(int16 size){
 	spawn_tmp_vis_xor_packet = new uchar[size];
+	vis_xor_size = size;
 	return spawn_tmp_vis_xor_packet;
 }
 
 uchar* Player::SetTempPosPacketForXOR(int16 size){
 	spawn_tmp_pos_xor_packet = new uchar[size];
+	pos_xor_size = size;
 	return spawn_tmp_pos_xor_packet;
 }
 

+ 6 - 0
EQ2/source/WorldServer/Player.h

@@ -544,6 +544,9 @@ public:
 	uchar*	SetTempInfoPacketForXOR(int16 size);
 	uchar*	SetTempVisPacketForXOR(int16 size);
 	uchar*	SetTempPosPacketForXOR(int16 size);
+	int32	GetTempInfoXorSize() { return info_xor_size; }
+	int32	GetTempVisXorSize() { return vis_xor_size; }
+	int32	GetTempPosXorSize() { return pos_xor_size; }
 	bool	CheckPlayerInfo();
 	void	CalculateLocation();
 	void	SetSpawnDeleteTime(int32 id, int32 time);
@@ -932,6 +935,9 @@ private:
 	uchar*		  spawn_tmp_vis_xor_packet;
 	uchar*		  spawn_tmp_pos_xor_packet;
 	uchar*		  spawn_tmp_info_xor_packet;
+	int32 vis_xor_size;
+	int32 pos_xor_size;
+	int32 info_xor_size;
 
 	// Character history, map<type, map<subtype, vector<data> > >
 	map<int8, map<int8, vector<HistoryData*> > > m_characterHistory;

+ 38 - 14
EQ2/source/WorldServer/Spawn.cpp

@@ -423,8 +423,13 @@ uchar* Spawn::spawn_info_changes(Player* player, int16 version){
 	string* data = packet->serializeString();
 	int32 size = data->length();
 	uchar* xor_info_packet = player->GetTempInfoPacketForXOR();
-	if (!xor_info_packet)
+	if (!xor_info_packet || size != player->GetTempInfoXorSize())
+	{
+		LogWrite(ZONE__DEBUG, 0, "Zone", "InstantiateInfoPacket: %i, %i", size, player->GetTempInfoXorSize());
+		safe_delete(xor_info_packet);
 		xor_info_packet = player->SetTempInfoPacketForXOR(size);
+	}
+
 	uchar* orig_packet = player->GetSpawnInfoPacketForXOR(id);
 	if(orig_packet){
 		memcpy(xor_info_packet, (uchar*)data->c_str(), size);
@@ -459,8 +464,12 @@ uchar* Spawn::spawn_vis_changes(Player* player, int16 version){
 	string* data = vis_struct->serializeString();
 	int32 size = data->length();
 	uchar* xor_vis_packet = player->GetTempVisPacketForXOR();
-	if (!xor_vis_packet)
+	if (!xor_vis_packet || size != player->GetTempVisXorSize())
+	{
+		LogWrite(ZONE__DEBUG, 0, "Zone", "InstantiateVisPacket: %i, %i", size, player->GetTempVisXorSize());
+		safe_delete(xor_vis_packet);
 		xor_vis_packet = player->SetTempVisPacketForXOR(size);
+	}
 	if(orig_packet){
 		memcpy(xor_vis_packet, (uchar*)data->c_str(), size);
 		Encode(xor_vis_packet, orig_packet, size);
@@ -482,9 +491,9 @@ uchar* Spawn::spawn_vis_changes(Player* player, int16 version){
 	return tmp2;
 }
 
-uchar* Spawn::spawn_pos_changes(Player* player, int16 version){
+uchar* Spawn::spawn_pos_changes(Player* player, int16 version) {
 	int16 index = player->GetIndexForSpawn(this);
-	
+
 	PacketStruct* packet = player->GetSpawnPosStruct();
 
 	player->pos_mutex.writelock(__FUNCTION__, __LINE__);
@@ -494,8 +503,12 @@ uchar* Spawn::spawn_pos_changes(Player* player, int16 version){
 	string* data = packet->serializeString();
 	int32 size = data->length();
 	uchar* xor_pos_packet = player->GetTempPosPacketForXOR();
-	if (!xor_pos_packet)
+	if (!xor_pos_packet || size != player->GetTempPosXorSize())
+	{
+		LogWrite(ZONE__DEBUG, 0, "Zone", "InstantiatePosPacket: %i, %i", size, player->GetTempPosXorSize());
+		safe_delete(xor_pos_packet);
 		xor_pos_packet = player->SetTempPosPacketForXOR(size);
+	}
 	if(orig_packet){
 		memcpy(xor_pos_packet, (uchar*)data->c_str(), size);
 		Encode(xor_pos_packet, orig_packet, size);
@@ -675,7 +688,9 @@ uchar* Spawn::spawn_info_changes_ex(Player* player, int16 version) {
 	int32 size = data->length();
 	uchar* xor_info_packet = player->GetTempInfoPacketForXOR();
 
-	if (!xor_info_packet) {
+	if (!xor_info_packet || size != player->GetTempInfoXorSize()) {
+		LogWrite(ZONE__DEBUG, 0, "Zone", "InstantiateInfoExPacket: %i, %i", size, player->GetTempInfoXorSize());
+		safe_delete(xor_info_packet);
 		xor_info_packet = player->SetTempInfoPacketForXOR(size);
 	}
 
@@ -737,7 +752,9 @@ uchar* Spawn::spawn_vis_changes_ex(Player* player, int16 version) {
 	int32 size = data->length();
 	uchar* xor_vis_packet = player->GetTempVisPacketForXOR();
 
-	if (!xor_vis_packet) {
+	if (!xor_vis_packet || size != player->GetTempVisXorSize()) {
+		LogWrite(ZONE__DEBUG, 0, "Zone", "InstantiateVisExPacket: %i, %i", size, player->GetTempVisXorSize());
+		safe_delete(xor_vis_packet);
 		xor_vis_packet = player->SetTempVisPacketForXOR(size);
 	}
 
@@ -798,7 +815,9 @@ uchar* Spawn::spawn_pos_changes_ex(Player* player, int16 version) {
 	int32 size = data->length();
 	uchar* xor_pos_packet = player->GetTempPosPacketForXOR();
 
-	if (!xor_pos_packet) {
+	if (!xor_pos_packet || size != player->GetTempPosXorSize()) {
+		LogWrite(ZONE__DEBUG, 0, "Zone", "InstantiatePosExPacket: %i, %i", size, player->GetTempPosXorSize());
+		safe_delete(xor_pos_packet);
 		xor_pos_packet = player->SetTempPosPacketForXOR(size);
 	}
 
@@ -1580,7 +1599,7 @@ void Spawn::InitializePosPacketData(Player* player, PacketStruct* packet, bool b
 	else {
 			if (size == 0)
 				size = 32;
-			packet->setDataByName("size", 1);
+
 			packet->setDataByName("pos_collision_radius", appearance.pos.collision_radius > 0 ? appearance.pos.collision_radius : 32);
 
 			packet->setDataByName("pos_size", 1.0f);
@@ -1751,10 +1770,7 @@ void Spawn::InitializeInfoPacketData(Player* spawn, PacketStruct* packet){
 	packet->setDataByName("heroic_flag", appearance.heroic_flag);
  	if(!IsObject() && !IsGroundSpawn() && !IsWidget() && !IsSign())
 		packet->setDataByName("interaction_flag", 12); //this makes NPCs head turn to look at you
-	if (version >= 1188 && (IsPlayer() || IsBot()))
-		packet->setDataByName("spawn_type", 0);
-	else
-		packet->setDataByName("spawn_type", spawn_type);
+
 	packet->setDataByName("class", appearance.adventure_class);
 
 	int16 model_type = appearance.model_type;
@@ -1954,8 +1970,16 @@ void Spawn::InitializeInfoPacketData(Player* spawn, PacketStruct* packet){
 	}
 	packet->setDataByName("icon", temp_icon);//appearance.icon);
 
-	int16 temp_activity_status = 0;
+	int32 temp_activity_status = 0;
+	
+	if (!Alive() && !IsObject() && !IsGroundSpawn())
+		temp_activity_status = 1;
+
+	temp_activity_status += (IsNPC() || IsObject() || IsGroundSpawn()) ? 1 << 1 : 0;
 	if (version >= 1188) {
+		if (IsGroundSpawn())
+			temp_activity_status += ACTIVITY_STATUS_INTERACTABLE_1188;
+
 		if ((appearance.activity_status & ACTIVITY_STATUS_ROLEPLAYING) > 0)
 			temp_activity_status += ACTIVITY_STATUS_ROLEPLAYING_1188;
 

+ 21 - 11
EQ2/source/WorldServer/Spawn.h

@@ -110,17 +110,27 @@
 #define ACTIVITY_STATUS_IMMUNITY_GAINED		8192
 #define ACTIVITY_STATUS_IMMUNITY_REMAINING	16384
 
-#define ACTIVITY_STATUS_AFK_1188					1
-#define ACTIVITY_STATUS_ROLEPLAYING_1188			2
-#define ACTIVITY_STATUS_ANONYMOUS_1188				4
-#define ACTIVITY_STATUS_LINKDEAD_1188				8
-#define ACTIVITY_STATUS_CAMPING_1188				16
-#define ACTIVITY_STATUS_LFG_1188					32
-#define ACTIVITY_STATUS_LFW_1188					64
-#define ACTIVITY_STATUS_SOLID_1188					128 //used by zone objects to remain solid
-#define ACTIVITY_STATUS_MENTORING_1188				4096
-#define ACTIVITY_STATUS_IMMUNITY_GAINED_1188		16384
-#define ACTIVITY_STATUS_IMMUNITY_REMAINING_1188		32768
+#define ACTIVITY_STATUS_MERCENARY_1188				1<<2
+#define ACTIVITY_STATUS_STATICOBJECT_1188			1<<3
+#define ACTIVITY_STATUS_MERCHANT_1188				1<<4
+#define ACTIVITY_STATUS_HIDEICON_1188				1<<9
+#define ACTIVITY_STATUS_INTERACTABLE_1188			1<<10
+#define ACTIVITY_STATUS_NOTARGET_1188				1<<11
+#define ACTIVITY_STATUS_ISTRANSPORT_1188			1<<12
+#define ACTIVITY_STATUS_SHOWHOUSEICON_1188			1<<13
+#define ACTIVITY_STATUS_LOOTABLE_1188				1<<14
+#define ACTIVITY_STATUS_INCOMBAT_1188				1<<15
+#define ACTIVITY_STATUS_AFK_1188					1<<16
+#define ACTIVITY_STATUS_ROLEPLAYING_1188			1<<17
+#define ACTIVITY_STATUS_ANONYMOUS_1188				1<<18
+#define ACTIVITY_STATUS_LINKDEAD_1188				1<<19
+#define ACTIVITY_STATUS_CAMPING_1188				1<<20
+#define ACTIVITY_STATUS_LFG_1188					1<<21
+#define ACTIVITY_STATUS_LFW_1188					1<<22
+#define ACTIVITY_STATUS_SOLID_1188					1<<23 //used by zone objects to remain solid
+#define ACTIVITY_STATUS_MENTORING_1188				1<<28
+#define ACTIVITY_STATUS_IMMUNITY_GAINED_1188		1<<30
+#define ACTIVITY_STATUS_IMMUNITY_REMAINING_1188		1<<31
 
 #define POS_STATE_KNEELING					 64
 #define POS_STATE_SOLID						128 //used by most mobs to remaind solid (cant walk through them)

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

@@ -3191,8 +3191,9 @@ void ZoneServer::UpdateVitality(float amount){
 void ZoneServer::SendSpawn(Spawn* spawn, Client* client){
 	EQ2Packet* outapp = spawn->serialize(client->GetPlayer(), client->GetVersion());
 
+	LogWrite(ZONE__DEBUG, 7, "Zone", "%s: Processing SendSpawn for spawn index %u (%s)...", client->GetPlayer()->GetName(), client->GetPlayer()->GetIndexForSpawn(spawn), spawn->GetName());
 	if(outapp)
-		client->QueuePacket(outapp, true);
+		client->QueuePacket(outapp);
 	/*
 	vis flags:
 	2 = show icon
@@ -3548,9 +3549,10 @@ bool ZoneServer::SendRemoveSpawn(Client* client, Spawn* spawn, PacketStruct* pac
 
 	int16 index = client->GetPlayer()->GetIndexForSpawn(spawn);
 	int32 cur_id = client->GetPlayer()->GetIDWithPlayerSpawn(spawn);
-	if(packet && index > 0 && client->GetPlayer()->WasSpawnRemoved(spawn) == false)
+	bool wasRemoved = client->GetPlayer()->WasSpawnRemoved(spawn);
+	LogWrite(ZONE__DEBUG, 7, "Zone", "%s: Processing SendRemoveSpawn for spawn index %u (%s)...cur_id: %i, wasremoved:: %i", client->GetPlayer()->GetName(), index, spawn->GetName(), cur_id, wasRemoved);
+	if(packet && index > 0 && !wasRemoved)
 	{
-		LogWrite(ZONE__DEBUG, 7, "Zone", "Processing SendRemoveSpawn for spawn index %u (%s)...cur_id: %i", index,spawn->GetName(), cur_id);
 		packet->setDataByName("spawn_index", index);
 		client->GetPlayer()->GetPlayerSpawnMap()->erase(index);
 		client->GetPlayer()->GetPlayerSpawnIndexMap()->erase(spawn);