fix(Core/Pets): fix crash at pet resurrect (#10120)

This commit is contained in:
Kargatum
2022-01-16 05:08:54 +07:00
committed by GitHub
parent 2781c9810f
commit 7f05e20994
8 changed files with 301 additions and 226 deletions

View File

@@ -1157,10 +1157,10 @@ public:
Player* player = handler->GetSession()->GetPlayer();
if (player->GetPetGUID())
if (player->IsExistPet())
{
handler->SendSysMessage (LANG_YOU_ALREADY_HAVE_PET);
handler->SetSentErrorMessage (true);
handler->SendSysMessage(LANG_YOU_ALREADY_HAVE_PET);
handler->SetSentErrorMessage(true);
return false;
}
@@ -1168,46 +1168,18 @@ public:
if (!cInfo->IsTameable(player->CanTameExoticPets()))
{
handler->PSendSysMessage (LANG_CREATURE_NON_TAMEABLE, cInfo->Entry);
handler->PSendSysMessage(LANG_CREATURE_NON_TAMEABLE, cInfo->Entry);
handler->SetSentErrorMessage (true);
return false;
}
// Everything looks OK, create new pet
Pet* pet = player->CreateTamedPetFrom(creatureTarget);
if (!pet)
if (!player->CreatePet(creatureTarget))
{
handler->PSendSysMessage (LANG_CREATURE_NON_TAMEABLE, cInfo->Entry);
handler->SetSentErrorMessage (true);
handler->PSendSysMessage(LANG_CREATURE_NON_TAMEABLE, cInfo->Entry);
handler->SetSentErrorMessage(true);
return false;
}
// place pet before player
float x, y, z;
player->GetClosePoint (x, y, z, creatureTarget->GetObjectSize(), CONTACT_DISTANCE);
pet->Relocate(x, y, z, M_PI - player->GetOrientation());
// set pet to defensive mode by default (some classes can't control controlled pets in fact).
pet->SetReactState(REACT_DEFENSIVE);
// calculate proper level
uint8 level = (creatureTarget->getLevel() < (player->getLevel() - 5)) ? (player->getLevel() - 5) : creatureTarget->getLevel();
// prepare visual effect for levelup
pet->SetUInt32Value(UNIT_FIELD_LEVEL, level - 1);
// add to world
pet->GetMap()->AddToMap(pet->ToCreature());
// visual effect for levelup
pet->SetUInt32Value(UNIT_FIELD_LEVEL, level);
// caster have pet now
player->SetMinion(pet, true);
pet->SavePetToDB(PET_SAVE_AS_CURRENT);
player->PetSpellInitialize();
return true;
}

View File

@@ -66,44 +66,24 @@ public:
// Creatures with family 0 crashes the server
if (!creatrueTemplate->family)
{
handler->PSendSysMessage("This creature cannot be tamed. (family id: 0).");
handler->PSendSysMessage(LANG_CREATURE_NON_TAMEABLE, creatrueTemplate->Entry);
handler->SetSentErrorMessage(true);
return false;
}
PetStable const* petStable = player->GetPetStable();
if (petStable && (petStable->CurrentPet || petStable->GetUnslottedHunterPet()))
if (player->IsExistPet())
{
handler->PSendSysMessage("You already have a pet");
handler->SendSysMessage(LANG_YOU_ALREADY_HAVE_PET);
handler->SetSentErrorMessage(true);
return false;
}
// Everything looks OK, create new pet
Pet* pet = player->CreateTamedPetFrom(creatureTarget);
// "kill" original creature
creatureTarget->DespawnOrUnsummon();
uint8 level = (creatureTarget->getLevel() < (player->getLevel() - 5)) ? (player->getLevel() - 5) : player->getLevel();
// prepare visual effect for levelup
pet->SetUInt32Value(UNIT_FIELD_LEVEL, level - 1);
// add to world
pet->GetMap()->AddToMap(pet->ToCreature());
// visual effect for levelup
pet->SetUInt32Value(UNIT_FIELD_LEVEL, level);
// caster have pet now
player->SetMinion(pet, true);
pet->InitTalentForLevel();
pet->SavePetToDB(PET_SAVE_AS_CURRENT);
player->PetSpellInitialize();
if (!player->CreatePet(creatureTarget))
{
handler->PSendSysMessage(LANG_CREATURE_NON_TAMEABLE, creatrueTemplate->Entry);
handler->SetSentErrorMessage(true);
return false;
}
return true;
}

View File

@@ -517,4 +517,3 @@ void AddSC_elwynn_forest()
RegisterCreatureAI(npc_supervisor_raelen);
RegisterCreatureAI(npc_eastvale_peasent);
}

View File

@@ -1998,4 +1998,3 @@ void AddSC_go_scripts()
new go_veil_skith_cage();
new go_bells();
}