summaryrefslogtreecommitdiff
path: root/src/server/game/Handlers/PetHandler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Handlers/PetHandler.cpp')
-rw-r--r--src/server/game/Handlers/PetHandler.cpp586
1 files changed, 293 insertions, 293 deletions
diff --git a/src/server/game/Handlers/PetHandler.cpp b/src/server/game/Handlers/PetHandler.cpp
index 7f0758de77..cb9297c1be 100644
--- a/src/server/game/Handlers/PetHandler.cpp
+++ b/src/server/game/Handlers/PetHandler.cpp
@@ -37,23 +37,23 @@
class LoadPetFromDBQueryHolder : public SQLQueryHolder
{
private:
- const uint32 m_petNumber;
- const uint32 m_diffTime;
- const bool m_current;
- const uint32 m_savedHealth;
- const uint32 m_savedMana;
- const std::string m_actionBar;
+ const uint32 m_petNumber;
+ const uint32 m_diffTime;
+ const bool m_current;
+ const uint32 m_savedHealth;
+ const uint32 m_savedMana;
+ const std::string m_actionBar;
public:
- LoadPetFromDBQueryHolder(uint32 petNumber, bool current, uint32 diffTime, std::string actionBar, uint32 health, uint32 mana)
+ LoadPetFromDBQueryHolder(uint32 petNumber, bool current, uint32 diffTime, std::string actionBar, uint32 health, uint32 mana)
: m_petNumber(petNumber), m_current(current), m_diffTime(diffTime), m_actionBar(actionBar),
- m_savedHealth(health), m_savedMana(mana) { }
+ m_savedHealth(health), m_savedMana(mana) { }
uint32 GetPetNumber() const { return m_petNumber; }
- uint32 GetDiffTime() const { return m_diffTime; }
- bool GetCurrent() const { return m_current; }
- uint32 GetSavedHealth() const { return m_savedHealth; }
- uint32 GetSavedMana() const { return m_savedMana; }
- std::string GetActionBar() const { return m_actionBar; }
+ uint32 GetDiffTime() const { return m_diffTime; }
+ bool GetCurrent() const { return m_current; }
+ uint32 GetSavedHealth() const { return m_savedHealth; }
+ uint32 GetSavedMana() const { return m_savedMana; }
+ std::string GetActionBar() const { return m_actionBar; }
bool Initialize();
};
@@ -64,17 +64,17 @@ bool LoadPetFromDBQueryHolder::Initialize()
bool res = true;
PreparedStatement* stmt = NULL;
- stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PET_AURA);
+ stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PET_AURA);
stmt->setUInt32(0, m_petNumber);
res &= SetPreparedQuery(PET_LOAD_QUERY_LOADAURAS, stmt);
- stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PET_SPELL);
+ stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PET_SPELL);
stmt->setUInt32(0, m_petNumber);
- res &= SetPreparedQuery(PET_LOAD_QUERY_LOADSPELLS, stmt);
+ res &= SetPreparedQuery(PET_LOAD_QUERY_LOADSPELLS, stmt);
- stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PET_SPELL_COOLDOWN);
+ stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PET_SPELL_COOLDOWN);
stmt->setUInt32(0, m_petNumber);
- res &= SetPreparedQuery(PET_LOAD_QUERY_LOADSPELLCOOLDOWN, stmt);
+ res &= SetPreparedQuery(PET_LOAD_QUERY_LOADSPELLCOOLDOWN, stmt);
return res;
}
@@ -89,41 +89,41 @@ uint8 WorldSession::HandleLoadPetFromDBFirstCallback(PreparedQueryResult result,
Field* fields = result->Fetch();
- // Xinef: this can happen if fetch is called twice, impossibru.
- if (!fields)
- return PET_LOAD_ERROR;
+ // Xinef: this can happen if fetch is called twice, impossibru.
+ if (!fields)
+ return PET_LOAD_ERROR;
- Player* owner = GetPlayer();
+ Player* owner = GetPlayer();
// update for case of current pet "slot = 0"
uint32 petentry = fields[1].GetUInt32();
if (!petentry)
return PET_LOAD_NO_RESULT;
- uint8 petSlot = fields[7].GetUInt8();
- bool current = petSlot == PET_SAVE_AS_CURRENT;
+ uint8 petSlot = fields[7].GetUInt8();
+ bool current = petSlot == PET_SAVE_AS_CURRENT;
uint32 summon_spell_id = fields[15].GetUInt32();
SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(summon_spell_id); // CANT BE NULL
bool is_temporary_summoned = spellInfo && spellInfo->GetDuration() > 0;
uint32 pet_number = fields[0].GetUInt32();
- uint32 savedhealth = fields[10].GetUInt32();
+ uint32 savedhealth = fields[10].GetUInt32();
uint32 savedmana = fields[11].GetUInt32();
- PetType pet_type = PetType(fields[16].GetUInt8());
+ PetType pet_type = PetType(fields[16].GetUInt8());
- // xinef: BG resurrect, overwrite saved value
- if (asynchLoadType == PET_LOAD_BG_RESURRECT)
- savedhealth = 1;
+ // xinef: BG resurrect, overwrite saved value
+ if (asynchLoadType == PET_LOAD_BG_RESURRECT)
+ savedhealth = 1;
- if (pet_type == HUNTER_PET && savedhealth == 0 && asynchLoadType != PET_LOAD_SUMMON_DEAD_PET)
- {
- WorldPacket data(SMSG_CAST_FAILED, 1+4+1+4);
+ if (pet_type == HUNTER_PET && savedhealth == 0 && asynchLoadType != PET_LOAD_SUMMON_DEAD_PET)
+ {
+ WorldPacket data(SMSG_CAST_FAILED, 1+4+1+4);
data << uint8(0);
data << uint32(883);
data << uint8(SPELL_FAILED_TARGETS_DEAD);
SendPacket(&data);
- owner->RemoveSpellCooldown(883, false);
- return PET_LOAD_ERROR;
- }
+ owner->RemoveSpellCooldown(883, false);
+ return PET_LOAD_ERROR;
+ }
// check temporary summoned pets like mage water elemental
if (current && is_temporary_summoned)
@@ -138,26 +138,26 @@ uint8 WorldSession::HandleLoadPetFromDBFirstCallback(PreparedQueryResult result,
Map* map = owner->GetMap();
uint32 guid = sObjectMgr->GenerateLowGuid(HIGHGUID_PET);
- Pet* pet = new Pet(owner, pet_type);
- LoadPetFromDBQueryHolder* holder = new LoadPetFromDBQueryHolder(pet_number, current, uint32(time(NULL) - fields[14].GetUInt32()), fields[13].GetString(), savedhealth, savedmana);
+ Pet* pet = new Pet(owner, pet_type);
+ LoadPetFromDBQueryHolder* holder = new LoadPetFromDBQueryHolder(pet_number, current, uint32(time(NULL) - fields[14].GetUInt32()), fields[13].GetString(), savedhealth, savedmana);
if (!pet->Create(guid, map, owner->GetPhaseMask(), petentry, pet_number) || !holder->Initialize())
- {
- delete pet;
- delete holder;
+ {
+ delete pet;
+ delete holder;
return PET_LOAD_ERROR;
- }
+ }
float px, py, pz;
owner->GetClosePoint(px, py, pz, pet->GetObjectSize(), PET_FOLLOW_DIST, pet->GetFollowAngle());
if (!pet->IsPositionValid())
{
sLog->outError("Pet (guidlow %d, entry %d) not loaded. Suggested coordinates isn't valid (X: %f Y: %f)", pet->GetGUIDLow(), pet->GetEntry(), pet->GetPositionX(), pet->GetPositionY());
- delete pet;
- delete holder;
+ delete pet;
+ delete holder;
return PET_LOAD_ERROR;
}
- pet->SetLoading(true);
+ pet->SetLoading(true);
pet->Relocate(px, py, pz, owner->GetOrientation());
pet->setPetType(pet_type);
pet->setFaction(owner->getFaction());
@@ -166,8 +166,8 @@ uint8 WorldSession::HandleLoadPetFromDBFirstCallback(PreparedQueryResult result,
if (pet->IsCritter())
{
map->AddToMap(pet->ToCreature(), true);
- pet->SetLoading(false); // xinef, mine
- delete holder;
+ pet->SetLoading(false); // xinef, mine
+ delete holder;
return PET_LOAD_OK;
}
@@ -184,10 +184,10 @@ uint8 WorldSession::HandleLoadPetFromDBFirstCallback(PreparedQueryResult result,
case SUMMON_PET:
petlevel = owner->getLevel();
- if (pet->IsPetGhoul())
- pet->SetUInt32Value(UNIT_FIELD_BYTES_0, 0x400); // class = rogue
- else
- pet->SetUInt32Value(UNIT_FIELD_BYTES_0, 0x800); // class = mage
+ if (pet->IsPetGhoul())
+ pet->SetUInt32Value(UNIT_FIELD_BYTES_0, 0x400); // class = rogue
+ else
+ pet->SetUInt32Value(UNIT_FIELD_BYTES_0, 0x800); // class = mage
pet->SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE);
// this enables popup window (pet dismiss, cancel)
@@ -211,7 +211,7 @@ uint8 WorldSession::HandleLoadPetFromDBFirstCallback(PreparedQueryResult result,
pet->SetUInt32Value(UNIT_FIELD_PET_NAME_TIMESTAMP, uint32(time(NULL))); // cast can't be helped here
pet->SetCreatorGUID(owner->GetGUID());
- owner->SetMinion(pet, true);
+ owner->SetMinion(pet, true);
pet->InitStatsForLevel(petlevel);
pet->SetUInt32Value(UNIT_FIELD_PETEXPERIENCE, fields[5].GetUInt32());
@@ -260,10 +260,10 @@ uint8 WorldSession::HandleLoadPetFromDBFirstCallback(PreparedQueryResult result,
owner->SendMessageToSet(&data, true);
}
- // do it as early as possible!
- pet->InitTalentForLevel(); // set original talents points before spell loading
- if (!is_temporary_summoned)
- pet->GetCharmInfo()->InitPetActionBar();
+ // do it as early as possible!
+ pet->InitTalentForLevel(); // set original talents points before spell loading
+ if (!is_temporary_summoned)
+ pet->GetCharmInfo()->InitPetActionBar();
map->AddToMap(pet->ToCreature(), true);
if (pet->getPetType() == SUMMON_PET && !current) //all (?) summon pets come with full health when called, but not when they are current
@@ -274,34 +274,34 @@ uint8 WorldSession::HandleLoadPetFromDBFirstCallback(PreparedQueryResult result,
pet->SetPower(POWER_MANA, savedmana > pet->GetMaxPower(POWER_MANA) ? pet->GetMaxPower(POWER_MANA) : savedmana);
}
- pet->SetAsynchLoadType(asynchLoadType);
+ pet->SetAsynchLoadType(asynchLoadType);
- // xinef: clear any old result
- if (_loadPetFromDBSecondCallback.ready())
- {
- SQLQueryHolder* param;
- _loadPetFromDBSecondCallback.get(param);
- delete param;
- }
- _loadPetFromDBSecondCallback.cancel();
+ // xinef: clear any old result
+ if (_loadPetFromDBSecondCallback.ready())
+ {
+ SQLQueryHolder* param;
+ _loadPetFromDBSecondCallback.get(param);
+ delete param;
+ }
+ _loadPetFromDBSecondCallback.cancel();
_loadPetFromDBSecondCallback = CharacterDatabase.DelayQueryHolder((SQLQueryHolder*)holder);
- return PET_LOAD_OK;
+ return PET_LOAD_OK;
}
void WorldSession::HandleLoadPetFromDBSecondCallback(LoadPetFromDBQueryHolder* holder)
{
- if (!GetPlayer())
+ if (!GetPlayer())
return;
- Player* owner = GetPlayer();
- Pet* pet = owner->GetPet();
- if (!pet)
- return;
+ Player* owner = GetPlayer();
+ Pet* pet = owner->GetPet();
+ if (!pet)
+ return;
- pet->_LoadAuras(holder->GetPreparedResult(PET_LOAD_QUERY_LOADAURAS), holder->GetDiffTime());
- bool current = holder->GetCurrent();
- uint32 summon_spell_id = pet->GetUInt32Value(UNIT_CREATED_BY_SPELL);
+ pet->_LoadAuras(holder->GetPreparedResult(PET_LOAD_QUERY_LOADAURAS), holder->GetDiffTime());
+ bool current = holder->GetCurrent();
+ uint32 summon_spell_id = pet->GetUInt32Value(UNIT_CREATED_BY_SPELL);
SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(summon_spell_id); // CANT BE NULL
bool is_temporary_summoned = spellInfo && spellInfo->GetDuration() > 0;
@@ -315,7 +315,7 @@ void WorldSession::HandleLoadPetFromDBSecondCallback(LoadPetFromDBQueryHolder* h
pet->InitLevelupSpellsForLevel();
pet->CastPetAuras(current);
- pet->GetCharmInfo()->LoadPetActionBar(holder->GetActionBar()); // action bar stored in already read string
+ pet->GetCharmInfo()->LoadPetActionBar(holder->GetActionBar()); // action bar stored in already read string
}
pet->CleanupActionBar(); // remove unknown spells from action bar after load
@@ -326,16 +326,16 @@ void WorldSession::HandleLoadPetFromDBSecondCallback(LoadPetFromDBQueryHolder* h
//set last used pet number (for use in BG's)
if (owner->GetTypeId() == TYPEID_PLAYER && pet->isControlled() && !pet->isTemporarySummoned() && (pet->getPetType() == SUMMON_PET || pet->getPetType() == HUNTER_PET))
- {
+ {
owner->ToPlayer()->SetLastPetNumber(holder->GetPetNumber());
- owner->SetLastPetSpell(pet->GetUInt32Value(UNIT_CREATED_BY_SPELL));
- }
+ owner->SetLastPetSpell(pet->GetUInt32Value(UNIT_CREATED_BY_SPELL));
+ }
if (pet->getPetType() == SUMMON_PET && !current) //all (?) summon pets come with full health when called, but not when they are current
- {
+ {
pet->SetPower(POWER_MANA, pet->GetMaxPower(POWER_MANA));
- pet->SetHealth(pet->GetMaxHealth());
- }
+ pet->SetHealth(pet->GetMaxHealth());
+ }
else
{
if (!holder->GetSavedHealth() && pet->getPetType() == HUNTER_PET && pet->GetAsynchLoadType() != PET_LOAD_SUMMON_DEAD_PET)
@@ -347,18 +347,18 @@ void WorldSession::HandleLoadPetFromDBSecondCallback(LoadPetFromDBQueryHolder* h
}
}
- pet->SetLoading(false);
- owner->SetTemporaryUnsummonedPetNumber(0); // clear this only if pet is loaded successfuly
+ pet->SetLoading(false);
+ owner->SetTemporaryUnsummonedPetNumber(0); // clear this only if pet is loaded successfuly
- // current
- if (current && owner->IsPetNeedBeTemporaryUnsummoned())
- {
+ // current
+ if (current && owner->IsPetNeedBeTemporaryUnsummoned())
+ {
owner->UnsummonPetTemporaryIfAny();
- return;
- }
+ return;
+ }
- pet->HandleAsynchLoadSucceed();
- return;
+ pet->HandleAsynchLoadSucceed();
+ return;
}
void WorldSession::HandleDismissCritter(WorldPacket &recvData)
@@ -414,7 +414,7 @@ void WorldSession::HandlePetAction(WorldPacket & recvData)
if (!pet->IsAlive())
{
- // xinef: allow dissmis dead pets
+ // xinef: allow dissmis dead pets
SpellInfo const* spell = (flag == ACT_ENABLED || flag == ACT_PASSIVE) ? sSpellMgr->GetSpellInfo(spellid) : NULL;
if ((flag != ACT_COMMAND || spellid != COMMAND_ABANDON) && (!spell || !spell->HasAttribute(SPELL_ATTR0_CASTABLE_WHILE_DEAD)))
return;
@@ -422,7 +422,7 @@ void WorldSession::HandlePetAction(WorldPacket & recvData)
// Xinef: allow to controll players
if (pet->GetTypeId() == TYPEID_PLAYER && flag != ACT_COMMAND && flag != ACT_REACTION)
- return;
+ return;
if (GetPlayer()->m_Controlled.size() == 1)
HandlePetActionHelper(pet, guid1, spellid, flag, guid2);
@@ -431,16 +431,16 @@ void WorldSession::HandlePetAction(WorldPacket & recvData)
//If a pet is dismissed, m_Controlled will change
std::vector<Unit*> controlled;
for (Unit::ControlSet::iterator itr = GetPlayer()->m_Controlled.begin(); itr != GetPlayer()->m_Controlled.end(); ++itr)
- {
- // xinef: allow to dissmis dead pets
+ {
+ // xinef: allow to dissmis dead pets
if ((*itr)->GetEntry() == pet->GetEntry() && ((*itr)->IsAlive() || (flag == ACT_COMMAND && spellid == COMMAND_ABANDON)))
controlled.push_back(*itr);
- // xinef: mirror image blizzard crappness
- else if ((*itr)->GetEntry() == NPC_MIRROR_IMAGE && flag == ACT_COMMAND && spellid == COMMAND_FOLLOW)
- {
- (*itr)->InterruptNonMeleeSpells(false);
- }
- }
+ // xinef: mirror image blizzard crappness
+ else if ((*itr)->GetEntry() == NPC_MIRROR_IMAGE && flag == ACT_COMMAND && spellid == COMMAND_FOLLOW)
+ {
+ (*itr)->InterruptNonMeleeSpells(false);
+ }
+ }
for (std::vector<Unit*>::iterator itr = controlled.begin(); itr != controlled.end(); ++itr)
HandlePetActionHelper(*itr, guid1, spellid, flag, guid2);
@@ -472,7 +472,7 @@ void WorldSession::HandlePetStopAttack(WorldPacket &recvData)
return;
pet->AttackStop();
- pet->ClearInPetCombat();
+ pet->ClearInPetCombat();
}
void WorldSession::HandlePetActionHelper(Unit* pet, uint64 guid1, uint16 spellid, uint16 flag, uint64 guid2)
@@ -491,32 +491,32 @@ void WorldSession::HandlePetActionHelper(Unit* pet, uint64 guid1, uint16 spellid
switch (spellid)
{
case COMMAND_STAY: //flat=1792 //STAY
- {
- bool controlledMotion = pet->GetMotionMaster()->GetMotionSlotType(MOTION_SLOT_CONTROLLED) != NULL_MOTION_TYPE;
- if (!controlledMotion)
- {
- pet->StopMovingOnCurrentPos();
- pet->GetMotionMaster()->Clear(false);
- pet->GetMotionMaster()->MoveIdle();
- }
+ {
+ bool controlledMotion = pet->GetMotionMaster()->GetMotionSlotType(MOTION_SLOT_CONTROLLED) != NULL_MOTION_TYPE;
+ if (!controlledMotion)
+ {
+ pet->StopMovingOnCurrentPos();
+ pet->GetMotionMaster()->Clear(false);
+ pet->GetMotionMaster()->MoveIdle();
+ }
charmInfo->SetCommandState(COMMAND_STAY);
charmInfo->SetIsCommandAttack(false);
charmInfo->SetIsCommandFollow(false);
charmInfo->SetIsFollowing(false);
charmInfo->SetIsReturning(false);
- charmInfo->SetIsAtStay(!controlledMotion);
+ charmInfo->SetIsAtStay(!controlledMotion);
charmInfo->SaveStayPosition(controlledMotion);
- charmInfo->SetForcedSpell(0);
- charmInfo->SetForcedTargetGUID(0);
+ charmInfo->SetForcedSpell(0);
+ charmInfo->SetForcedTargetGUID(0);
break;
- }
+ }
case COMMAND_FOLLOW: //spellid=1792 //FOLLOW
- {
+ {
pet->AttackStop();
pet->InterruptNonMeleeSpells(false);
- pet->ClearInPetCombat();
+ pet->ClearInPetCombat();
pet->GetMotionMaster()->MoveFollow(_player, PET_FOLLOW_DIST, pet->GetFollowAngle());
charmInfo->SetCommandState(COMMAND_FOLLOW);
@@ -526,10 +526,10 @@ void WorldSession::HandlePetActionHelper(Unit* pet, uint64 guid1, uint16 spellid
charmInfo->SetIsCommandFollow(true);
charmInfo->SetIsFollowing(false);
- charmInfo->SetForcedSpell(0);
- charmInfo->SetForcedTargetGUID(0);
+ charmInfo->SetForcedSpell(0);
+ charmInfo->SetForcedTargetGUID(0);
break;
- }
+ }
case COMMAND_ATTACK: //spellid=1792 //ATTACK
{
// Can't attack if owner is pacified
@@ -549,23 +549,23 @@ void WorldSession::HandlePetActionHelper(Unit* pet, uint64 guid1, uint16 spellid
if (!owner->IsValidAttackTarget(TargetUnit))
return;
- // pussywizard:
- if (Creature* creaturePet = pet->ToCreature())
- if (!creaturePet->_CanDetectFeignDeathOf(TargetUnit) || !creaturePet->CanCreatureAttack(TargetUnit) || creaturePet->isTargetNotAcceptableByMMaps(TargetUnit->GetGUID(), sWorld->GetGameTime(), TargetUnit))
- return;
+ // pussywizard:
+ if (Creature* creaturePet = pet->ToCreature())
+ if (!creaturePet->_CanDetectFeignDeathOf(TargetUnit) || !creaturePet->CanCreatureAttack(TargetUnit) || creaturePet->isTargetNotAcceptableByMMaps(TargetUnit->GetGUID(), sWorld->GetGameTime(), TargetUnit))
+ return;
// Not let attack through obstructions
bool checkLos = !MMAP::MMapFactory::IsPathfindingEnabled(pet->GetMap()) ||
- (TargetUnit->GetTypeId() == TYPEID_UNIT && (TargetUnit->ToCreature()->isWorldBoss() || TargetUnit->ToCreature()->IsDungeonBoss()));
-
- if (checkLos && !pet->IsWithinLOSInMap(TargetUnit))
- {
- WorldPacket data(SMSG_CAST_FAILED, 1+4+1);
- data << uint8(0);
- data << uint32(7389);
- data << uint8(SPELL_FAILED_LINE_OF_SIGHT);
- SendPacket(&data);
- return;
+ (TargetUnit->GetTypeId() == TYPEID_UNIT && (TargetUnit->ToCreature()->isWorldBoss() || TargetUnit->ToCreature()->IsDungeonBoss()));
+
+ if (checkLos && !pet->IsWithinLOSInMap(TargetUnit))
+ {
+ WorldPacket data(SMSG_CAST_FAILED, 1+4+1);
+ data << uint8(0);
+ data << uint32(7389);
+ data << uint8(SPELL_FAILED_LINE_OF_SIGHT);
+ SendPacket(&data);
+ return;
}
pet->ClearUnitState(UNIT_STATE_FOLLOW);
@@ -601,7 +601,7 @@ void WorldSession::HandlePetActionHelper(Unit* pet, uint64 guid1, uint16 spellid
charmInfo->SetIsCommandFollow(false);
charmInfo->SetIsReturning(false);
- pet->Attack(TargetUnit, true);
+ pet->Attack(TargetUnit, true);
pet->SendPetAIReaction(guid1);
}
}
@@ -609,12 +609,12 @@ void WorldSession::HandlePetActionHelper(Unit* pet, uint64 guid1, uint16 spellid
}
case COMMAND_ABANDON: // abandon (hunter pet) or dismiss (summoned pet)
if (pet->GetCharmerGUID() == GetPlayer()->GetGUID())
- {
- if (pet->IsSummon())
- pet->ToTempSummon()->UnSummon();
- else
- _player->StopCastingCharm();
- }
+ {
+ if (pet->IsSummon())
+ pet->ToTempSummon()->UnSummon();
+ else
+ _player->StopCastingCharm();
+ }
else if (pet->GetOwnerGUID() == GetPlayer()->GetGUID())
{
ASSERT(pet->GetTypeId() == TYPEID_UNIT);
@@ -641,14 +641,14 @@ void WorldSession::HandlePetActionHelper(Unit* pet, uint64 guid1, uint16 spellid
{
case REACT_PASSIVE: //passive
pet->AttackStop();
- pet->ClearInPetCombat();
+ pet->ClearInPetCombat();
case REACT_DEFENSIVE: //recovery
case REACT_AGGRESSIVE: //activete
if (pet->GetTypeId() == TYPEID_UNIT)
pet->ToCreature()->SetReactState(ReactStates(spellid));
- else
- charmInfo->SetPlayerReactState(ReactStates(spellid));
+ else
+ charmInfo->SetPlayerReactState(ReactStates(spellid));
break;
}
break;
@@ -687,7 +687,7 @@ void WorldSession::HandlePetActionHelper(Unit* pet, uint64 guid1, uint16 spellid
charmInfo->SetIsFollowing(false);
Spell* spell = new Spell(pet, spellInfo, TRIGGERED_NONE);
- spell->LoadScripts(); // xinef: load for CheckPetCast
+ spell->LoadScripts(); // xinef: load for CheckPetCast
SpellCastResult result = spell->CheckPetCast(unit_target);
@@ -740,19 +740,19 @@ void WorldSession::HandlePetActionHelper(Unit* pet, uint64 guid1, uint16 spellid
spell->prepare(&(spell->m_targets));
- charmInfo->SetForcedSpell(0);
- charmInfo->SetForcedTargetGUID(0);
+ charmInfo->SetForcedSpell(0);
+ charmInfo->SetForcedTargetGUID(0);
}
else
{
- // dont spam alerts
- if (!charmInfo->GetForcedSpell())
- {
- if (pet->isPossessed() || pet->IsVehicle())
- Spell::SendCastResult(GetPlayer(), spellInfo, 0, result);
- else
- spell->SendPetCastResult(result);
- }
+ // dont spam alerts
+ if (!charmInfo->GetForcedSpell())
+ {
+ if (pet->isPossessed() || pet->IsVehicle())
+ Spell::SendCastResult(GetPlayer(), spellInfo, 0, result);
+ else
+ spell->SendPetCastResult(result);
+ }
if (!pet->ToCreature()->HasSpellCooldown(spellid))
GetPlayer()->SendClearCooldown(spellid, pet);
@@ -760,8 +760,8 @@ void WorldSession::HandlePetActionHelper(Unit* pet, uint64 guid1, uint16 spellid
spell->finish(false);
delete spell;
- // reset specific flags in case of spell fail. AI will reset other flags
- pet->PetSpellFail(spellInfo, unit_target, result);
+ // reset specific flags in case of spell fail. AI will reset other flags
+ pet->PetSpellFail(spellInfo, unit_target, result);
}
break;
}
@@ -884,86 +884,86 @@ void WorldSession::HandlePetSetAction(WorldPacket & recvData)
}
}
- Unit::ControlSet petsSet;
- if (checkPet->GetEntry() != GUID_ENPART(petguid))
- petsSet.insert(checkPet);
- else
- petsSet = _player->m_Controlled;
-
- // Xinef: loop all pets with same entry (fixes partial state change for feral spirits)
- for (Unit::ControlSet::const_iterator itr = petsSet.begin(); itr != petsSet.end(); ++itr)
- {
- Unit* pet = *itr;
- if (checkPet->GetEntry() == GUID_ENPART(petguid) && pet->GetEntry() != GUID_ENPART(petguid))
- continue;
-
- CharmInfo* charmInfo = pet->GetCharmInfo();
- if (!charmInfo)
- {
- sLog->outError("WorldSession::HandlePetSetAction: object (GUID: %u TypeId: %u) is considered pet-like but doesn't have a charminfo!", pet->GetGUIDLow(), pet->GetTypeId());
- continue;
- }
-
- // check swap (at command->spell swap client remove spell first in another packet, so check only command move correctness)
- if (move_command)
- {
- uint8 act_state_0 = UNIT_ACTION_BUTTON_TYPE(data[0]);
- if (act_state_0 == ACT_COMMAND || act_state_0 == ACT_REACTION)
- {
- uint32 spell_id_0 = UNIT_ACTION_BUTTON_ACTION(data[0]);
- UnitActionBarEntry const* actionEntry_1 = charmInfo->GetActionBarEntry(position[1]);
- if (!actionEntry_1 || spell_id_0 != actionEntry_1->GetAction() ||
- act_state_0 != actionEntry_1->GetType())
- continue;
- }
-
- uint8 act_state_1 = UNIT_ACTION_BUTTON_TYPE(data[1]);
- if (act_state_1 == ACT_COMMAND || act_state_1 == ACT_REACTION)
- {
- uint32 spell_id_1 = UNIT_ACTION_BUTTON_ACTION(data[1]);
- UnitActionBarEntry const* actionEntry_0 = charmInfo->GetActionBarEntry(position[0]);
- if (!actionEntry_0 || spell_id_1 != actionEntry_0->GetAction() ||
- act_state_1 != actionEntry_0->GetType())
- continue;
- }
- }
-
- for (uint8 i = 0; i < count; ++i)
- {
- uint32 spell_id = UNIT_ACTION_BUTTON_ACTION(data[i]);
- uint8 act_state = UNIT_ACTION_BUTTON_TYPE(data[i]);
-
- //if it's act for spell (en/disable/cast) and there is a spell given (0 = remove spell) which pet doesn't know, don't add
- if (!((act_state == ACT_ENABLED || act_state == ACT_DISABLED || act_state == ACT_PASSIVE) && spell_id && !pet->HasSpell(spell_id)))
- {
- if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spell_id))
- {
- //sign for autocast
- if (act_state == ACT_ENABLED)
- {
- if (pet->GetTypeId() == TYPEID_UNIT && pet->IsPet())
- ((Pet*)pet)->ToggleAutocast(spellInfo, true);
- else
- for (Unit::ControlSet::iterator itr = GetPlayer()->m_Controlled.begin(); itr != GetPlayer()->m_Controlled.end(); ++itr)
- if ((*itr)->GetEntry() == pet->GetEntry())
- (*itr)->GetCharmInfo()->ToggleCreatureAutocast(spellInfo, true);
- }
- //sign for no/turn off autocast
- else if (act_state == ACT_DISABLED)
- {
- if (pet->GetTypeId() == TYPEID_UNIT && pet->IsPet())
- ((Pet*)pet)->ToggleAutocast(spellInfo, false);
- else
- for (Unit::ControlSet::iterator itr = GetPlayer()->m_Controlled.begin(); itr != GetPlayer()->m_Controlled.end(); ++itr)
- if ((*itr)->GetEntry() == pet->GetEntry())
- (*itr)->GetCharmInfo()->ToggleCreatureAutocast(spellInfo, false);
- }
- }
-
- charmInfo->SetActionBar(position[i], spell_id, ActiveStates(act_state));
- }
- }
- }
+ Unit::ControlSet petsSet;
+ if (checkPet->GetEntry() != GUID_ENPART(petguid))
+ petsSet.insert(checkPet);
+ else
+ petsSet = _player->m_Controlled;
+
+ // Xinef: loop all pets with same entry (fixes partial state change for feral spirits)
+ for (Unit::ControlSet::const_iterator itr = petsSet.begin(); itr != petsSet.end(); ++itr)
+ {
+ Unit* pet = *itr;
+ if (checkPet->GetEntry() == GUID_ENPART(petguid) && pet->GetEntry() != GUID_ENPART(petguid))
+ continue;
+
+ CharmInfo* charmInfo = pet->GetCharmInfo();
+ if (!charmInfo)
+ {
+ sLog->outError("WorldSession::HandlePetSetAction: object (GUID: %u TypeId: %u) is considered pet-like but doesn't have a charminfo!", pet->GetGUIDLow(), pet->GetTypeId());
+ continue;
+ }
+
+ // check swap (at command->spell swap client remove spell first in another packet, so check only command move correctness)
+ if (move_command)
+ {
+ uint8 act_state_0 = UNIT_ACTION_BUTTON_TYPE(data[0]);
+ if (act_state_0 == ACT_COMMAND || act_state_0 == ACT_REACTION)
+ {
+ uint32 spell_id_0 = UNIT_ACTION_BUTTON_ACTION(data[0]);
+ UnitActionBarEntry const* actionEntry_1 = charmInfo->GetActionBarEntry(position[1]);
+ if (!actionEntry_1 || spell_id_0 != actionEntry_1->GetAction() ||
+ act_state_0 != actionEntry_1->GetType())
+ continue;
+ }
+
+ uint8 act_state_1 = UNIT_ACTION_BUTTON_TYPE(data[1]);
+ if (act_state_1 == ACT_COMMAND || act_state_1 == ACT_REACTION)
+ {
+ uint32 spell_id_1 = UNIT_ACTION_BUTTON_ACTION(data[1]);
+ UnitActionBarEntry const* actionEntry_0 = charmInfo->GetActionBarEntry(position[0]);
+ if (!actionEntry_0 || spell_id_1 != actionEntry_0->GetAction() ||
+ act_state_1 != actionEntry_0->GetType())
+ continue;
+ }
+ }
+
+ for (uint8 i = 0; i < count; ++i)
+ {
+ uint32 spell_id = UNIT_ACTION_BUTTON_ACTION(data[i]);
+ uint8 act_state = UNIT_ACTION_BUTTON_TYPE(data[i]);
+
+ //if it's act for spell (en/disable/cast) and there is a spell given (0 = remove spell) which pet doesn't know, don't add
+ if (!((act_state == ACT_ENABLED || act_state == ACT_DISABLED || act_state == ACT_PASSIVE) && spell_id && !pet->HasSpell(spell_id)))
+ {
+ if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spell_id))
+ {
+ //sign for autocast
+ if (act_state == ACT_ENABLED)
+ {
+ if (pet->GetTypeId() == TYPEID_UNIT && pet->IsPet())
+ ((Pet*)pet)->ToggleAutocast(spellInfo, true);
+ else
+ for (Unit::ControlSet::iterator itr = GetPlayer()->m_Controlled.begin(); itr != GetPlayer()->m_Controlled.end(); ++itr)
+ if ((*itr)->GetEntry() == pet->GetEntry())
+ (*itr)->GetCharmInfo()->ToggleCreatureAutocast(spellInfo, true);
+ }
+ //sign for no/turn off autocast
+ else if (act_state == ACT_DISABLED)
+ {
+ if (pet->GetTypeId() == TYPEID_UNIT && pet->IsPet())
+ ((Pet*)pet)->ToggleAutocast(spellInfo, false);
+ else
+ for (Unit::ControlSet::iterator itr = GetPlayer()->m_Controlled.begin(); itr != GetPlayer()->m_Controlled.end(); ++itr)
+ if ((*itr)->GetEntry() == pet->GetEntry())
+ (*itr)->GetCharmInfo()->ToggleCreatureAutocast(spellInfo, false);
+ }
+ }
+
+ charmInfo->SetActionBar(position[i], spell_id, ActiveStates(act_state));
+ }
+ }
+ }
}
void WorldSession::HandlePetRename(WorldPacket & recvData)
@@ -1027,20 +1027,20 @@ void WorldSession::HandlePetRename(WorldPacket & recvData)
SQLTransaction trans = CharacterDatabase.BeginTransaction();
if (isdeclined)
{
- if (sWorld->getBoolConfig(CONFIG_DECLINED_NAMES_USED))
- {
- PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_PET_DECLINEDNAME);
- stmt->setUInt32(0, pet->GetCharmInfo()->GetPetNumber());
- trans->Append(stmt);
+ if (sWorld->getBoolConfig(CONFIG_DECLINED_NAMES_USED))
+ {
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_PET_DECLINEDNAME);
+ stmt->setUInt32(0, pet->GetCharmInfo()->GetPetNumber());
+ trans->Append(stmt);
- stmt = CharacterDatabase.GetPreparedStatement(CHAR_ADD_CHAR_PET_DECLINEDNAME);
- stmt->setUInt32(0, _player->GetGUIDLow());
+ stmt = CharacterDatabase.GetPreparedStatement(CHAR_ADD_CHAR_PET_DECLINEDNAME);
+ stmt->setUInt32(0, _player->GetGUIDLow());
- for (uint8 i = 0; i < 5; i++)
- stmt->setString(i+1, declinedname.name[i]);
+ for (uint8 i = 0; i < 5; i++)
+ stmt->setString(i+1, declinedname.name[i]);
- trans->Append(stmt);
- }
+ trans->Append(stmt);
+ }
}
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHAR_PET_NAME);
@@ -1065,7 +1065,7 @@ void WorldSession::HandlePetAbandon(WorldPacket & recvData)
// pet/charmed
Creature* pet = ObjectAccessor::GetCreatureOrPetOrVehicle(*_player, guid);
- if (pet && pet->ToPet() && pet->ToPet()->getPetType() == HUNTER_PET)
+ if (pet && pet->ToPet() && pet->ToPet()->getPetType() == HUNTER_PET)
{
if (pet->IsPet())
{
@@ -1096,9 +1096,9 @@ void WorldSession::HandlePetSpellAutocastOpcode(WorldPacket& recvPacket)
if (IS_PLAYER_GUID(guid))
return;
- SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellid);
- if (!spellInfo)
- return;
+ SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellid);
+ if (!spellInfo)
+ return;
Creature* checkPet = ObjectAccessor::GetCreatureOrPetOrVehicle(*_player, guid);
if (!checkPet || (checkPet != _player->GetGuardianPet() && checkPet != _player->GetCharm()))
@@ -1107,37 +1107,37 @@ void WorldSession::HandlePetSpellAutocastOpcode(WorldPacket& recvPacket)
return;
}
- Unit::ControlSet petsSet;
- if (checkPet->GetEntry() != GUID_ENPART(guid))
- petsSet.insert(checkPet);
- else
- petsSet = _player->m_Controlled;
-
- // Xinef: loop all pets with same entry (fixes partial state change for feral spirits)
- for (Unit::ControlSet::const_iterator itr = petsSet.begin(); itr != petsSet.end(); ++itr)
- {
- Unit* pet = *itr;
- if (checkPet->GetEntry() == GUID_ENPART(guid) && pet->GetEntry() != GUID_ENPART(guid))
- continue;
-
- // do not add not learned spells/ passive spells
- if (!pet->HasSpell(spellid) || !spellInfo->IsAutocastable())
- continue;
-
- CharmInfo* charmInfo = pet->GetCharmInfo();
- if (!charmInfo)
- {
- sLog->outError("WorldSession::HandlePetSpellAutocastOpcod: object (GUID: %u TypeId: %u) is considered pet-like but doesn't have a charminfo!", pet->GetGUIDLow(), pet->GetTypeId());
- continue;
- }
-
- if (pet->IsPet())
- ((Pet*)pet)->ToggleAutocast(spellInfo, state);
- else
- pet->GetCharmInfo()->ToggleCreatureAutocast(spellInfo, state);
-
- charmInfo->SetSpellAutocast(spellInfo, state);
- }
+ Unit::ControlSet petsSet;
+ if (checkPet->GetEntry() != GUID_ENPART(guid))
+ petsSet.insert(checkPet);
+ else
+ petsSet = _player->m_Controlled;
+
+ // Xinef: loop all pets with same entry (fixes partial state change for feral spirits)
+ for (Unit::ControlSet::const_iterator itr = petsSet.begin(); itr != petsSet.end(); ++itr)
+ {
+ Unit* pet = *itr;
+ if (checkPet->GetEntry() == GUID_ENPART(guid) && pet->GetEntry() != GUID_ENPART(guid))
+ continue;
+
+ // do not add not learned spells/ passive spells
+ if (!pet->HasSpell(spellid) || !spellInfo->IsAutocastable())
+ continue;
+
+ CharmInfo* charmInfo = pet->GetCharmInfo();
+ if (!charmInfo)
+ {
+ sLog->outError("WorldSession::HandlePetSpellAutocastOpcod: object (GUID: %u TypeId: %u) is considered pet-like but doesn't have a charminfo!", pet->GetGUIDLow(), pet->GetTypeId());
+ continue;
+ }
+
+ if (pet->IsPet())
+ ((Pet*)pet)->ToggleAutocast(spellInfo, state);
+ else
+ pet->GetCharmInfo()->ToggleCreatureAutocast(spellInfo, state);
+
+ charmInfo->SetSpellAutocast(spellInfo, state);
+ }
}
void WorldSession::HandlePetCastSpellOpcode(WorldPacket& recvPacket)
@@ -1180,20 +1180,20 @@ void WorldSession::HandlePetCastSpellOpcode(WorldPacket& recvPacket)
targets.Read(recvPacket, caster);
HandleClientCastFlags(recvPacket, castFlags, targets);
- bool SetFollow = caster->HasUnitState(UNIT_STATE_FOLLOW);
+ bool SetFollow = caster->HasUnitState(UNIT_STATE_FOLLOW);
caster->ClearUnitState(UNIT_STATE_FOLLOW);
Spell* spell = new Spell(caster, spellInfo, TRIGGERED_NONE);
spell->m_cast_count = castCount; // probably pending spell cast
spell->m_targets = targets;
- spell->LoadScripts();
+ spell->LoadScripts();
- // Xinef: Send default target, fixes return on NeedExplicitUnitTarget
- Unit* target = targets.GetUnitTarget();
- if (!target && spell->m_spellInfo->NeedsExplicitUnitTarget())
- target = _player->GetSelectedUnit();
+ // Xinef: Send default target, fixes return on NeedExplicitUnitTarget
+ Unit* target = targets.GetUnitTarget();
+ if (!target && spell->m_spellInfo->NeedsExplicitUnitTarget())
+ target = _player->GetSelectedUnit();
- SpellCastResult result = spell->CheckPetCast(target);
+ SpellCastResult result = spell->CheckPetCast(target);
if (result == SPELL_CAST_OK)
{
@@ -1215,8 +1215,8 @@ void WorldSession::HandlePetCastSpellOpcode(WorldPacket& recvPacket)
}
else
{
- if (!caster->GetCharmInfo() || !caster->GetCharmInfo()->GetForcedSpell())
- spell->SendPetCastResult(result);
+ if (!caster->GetCharmInfo() || !caster->GetCharmInfo()->GetForcedSpell())
+ spell->SendPetCastResult(result);
if (caster->GetTypeId() == TYPEID_PLAYER)
{
@@ -1228,17 +1228,17 @@ void WorldSession::HandlePetCastSpellOpcode(WorldPacket& recvPacket)
if (!caster->ToCreature()->HasSpellCooldown(spellId))
GetPlayer()->SendClearCooldown(spellId, caster);
- // reset specific flags in case of spell fail. AI will reset other flags
+ // reset specific flags in case of spell fail. AI will reset other flags
if (caster->IsPet())
- caster->PetSpellFail(spellInfo, targets.GetUnitTarget(), result);
+ caster->PetSpellFail(spellInfo, targets.GetUnitTarget(), result);
}
spell->finish(false);
delete spell;
}
- if (SetFollow && !caster->IsInCombat())
- caster->AddUnitState(UNIT_STATE_FOLLOW);
+ if (SetFollow && !caster->IsInCombat())
+ caster->AddUnitState(UNIT_STATE_FOLLOW);
}
void WorldSession::SendPetNameInvalid(uint32 error, const std::string& name, DeclinedName *declinedName)