Browse Source

Fix crash when process movement on spawn not entity, added logging for potential delete spell crash on client removal

Emagi 1 month ago
parent
commit
c958e02b2e
2 changed files with 8 additions and 1 deletions
  1. 5 0
      EQ2/source/WorldServer/Entity.cpp
  2. 3 1
      EQ2/source/WorldServer/Spawn.cpp

+ 5 - 0
EQ2/source/WorldServer/Entity.cpp

@@ -118,6 +118,7 @@ void Entity::DeleteSpellEffects(bool removeClient)
 			{
 				if(deletedPtrs.find(GetInfoStruct()->maintained_effects[i].spell) == deletedPtrs.end())
 				{
+					LogWrite(SPELL__ERROR, 0, "Spell", "Delete maintained spell effect %u from %s", GetInfoStruct()->maintained_effects[i].spell_id, GetName());
 					lua_interface->RemoveSpell(GetInfoStruct()->maintained_effects[i].spell, false, removeClient, "", removeClient);
 					if (IsPlayer())
 						GetInfoStruct()->maintained_effects[i].icon = 0xFFFF;
@@ -135,9 +136,13 @@ void Entity::DeleteSpellEffects(bool removeClient)
 			if(deletedPtrs.find(GetInfoStruct()->spell_effects[i].spell) == deletedPtrs.end()) {
 				if(GetInfoStruct()->spell_effects[i].spell && GetInfoStruct()->spell_effects[i].spell->spell && 
 					GetInfoStruct()->spell_effects[i].spell->spell->GetSpellData()->spell_book_type == SPELL_BOOK_TYPE_NOT_SHOWN) {
+					LogWrite(SPELL__ERROR, 0, "Spell", "Delete spell effect %u from %s", GetInfoStruct()->spell_effects[i].spell_id, GetName());
 					lua_interface->RemoveSpell(GetInfoStruct()->spell_effects[i].spell, false, removeClient, "", removeClient);
 					deletedPtrs[GetInfoStruct()->spell_effects[i].spell] = true;
 				}
+				else {
+					LogWrite(PLAYER__ERROR, 0, "Debug", "Skip delete spell effect %u from %s", GetInfoStruct()->spell_effects[i].spell_id, GetName());
+				}
 			}
 			GetInfoStruct()->spell_effects[i].spell_id = 0xFFFFFFFF;
 			GetInfoStruct()->spell_effects[i].spell = nullptr;

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

@@ -2977,7 +2977,9 @@ void Spawn::ProcessMovement(bool isSpawnListLocked){
 				
 				if(data)
 				{
-					((Entity*)this)->SetSpeed(data->speed);
+					if(IsEntity()) {
+						((Entity*)this)->SetSpeed(data->speed);
+					}
 					SetSpeed(data->speed);
 					if(data->use_movement_location_heading)
 						SetHeading(data->heading);