diff options
-rw-r--r-- | src/game/Player.cpp | 6 | ||||
-rw-r--r-- | src/game/Spell.h | 2 | ||||
-rw-r--r-- | src/game/SpellEffects.cpp | 6 | ||||
-rw-r--r-- | src/game/TemporarySummon.cpp | 28 | ||||
-rw-r--r-- | src/game/TemporarySummon.h | 2 | ||||
-rw-r--r-- | src/game/Totem.cpp | 13 | ||||
-rw-r--r-- | src/game/Totem.h | 2 | ||||
-rw-r--r-- | src/game/Unit.cpp | 29 | ||||
-rw-r--r-- | src/game/Unit.h | 4 |
9 files changed, 61 insertions, 31 deletions
diff --git a/src/game/Player.cpp b/src/game/Player.cpp index bfe682db204..29bf8b68ce2 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -472,6 +472,8 @@ Player::Player (WorldSession *session): Unit(), m_achievementMgr(this), m_reputa m_lastFallTime = 0; m_lastFallZ = 0; + + m_ControlledByPlayer = true; } Player::~Player () @@ -14460,11 +14462,11 @@ bool Player::LoadFromDB( uint32 guid, SqlQueryHolder *holder ) SetUInt32Value(UNIT_CHANNEL_SPELL,0); // clear charm/summon related fields + SetUInt64Value(UNIT_FIELD_SUMMONEDBY, 0); + SetUInt64Value(UNIT_FIELD_CHARMEDBY, 0); SetUInt64Value(UNIT_FIELD_CHARM, 0); SetUInt64Value(UNIT_FIELD_SUMMON, 0); SetUInt64Value(PLAYER_FARSIGHT, 0); - SetCharmerGUID(0); - SetOwnerGUID(0); SetCreatorGUID(0); // reset some aura modifiers before aura apply diff --git a/src/game/Spell.h b/src/game/Spell.h index 660ab8f53a7..e2724d5f3e4 100644 --- a/src/game/Spell.h +++ b/src/game/Spell.h @@ -671,7 +671,7 @@ namespace Trinity continue; if(!target->isAttackableByAOE()) continue; - if(i_source->GetTypeId()==TYPEID_PLAYER) + if(i_source->IsControlledByPlayer()) { if(i_source->IsFriendlyTo(target)) continue; diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp index f69bc3db828..2fbd4a3ade1 100644 --- a/src/game/SpellEffects.cpp +++ b/src/game/SpellEffects.cpp @@ -5761,7 +5761,7 @@ void Spell::EffectSummonCritter(uint32 i) if(!critter) return; - critter->SetOwnerGUID(m_caster->GetGUID()); + critter->SetOwner(m_caster, true); critter->SetCreatorGUID(m_caster->GetGUID()); critter->SetUInt32Value(UNIT_FIELD_FACTIONTEMPLATE,m_caster->getFaction()); critter->SetUInt32Value(UNIT_CREATED_BY_SPELL, m_spellInfo->Id); @@ -6426,7 +6426,7 @@ void Spell::SummonTotem(uint32 entry, SummonPropertiesEntry const *properties) if(slot >= SUMMON_SLOT_TOTEM && slot < MAX_TOTEM_SLOT) m_caster->m_SummonSlot[slot] = pTotem->GetGUID(); - pTotem->SetOwner(m_caster->GetGUID()); + pTotem->SetOwner(m_caster); pTotem->SetTypeBySummonSpell(m_spellInfo); // must be after Create call where m_spells initilized int32 duration=GetSpellDuration(m_spellInfo); @@ -6534,7 +6534,7 @@ void Spell::SummonVehicle(uint32 entry, SummonPropertiesEntry const *properties) if(!vehicle) return; - vehicle->SetOwnerGUID(m_caster->GetGUID()); + vehicle->SetUInt64Value(UNIT_FIELD_SUMMONEDBY, m_caster->GetGUID()); vehicle->SetUInt32Value(UNIT_CREATED_BY_SPELL, m_spellInfo->Id); if(damage) diff --git a/src/game/TemporarySummon.cpp b/src/game/TemporarySummon.cpp index c87ad91ff90..10b4eedb1c8 100644 --- a/src/game/TemporarySummon.cpp +++ b/src/game/TemporarySummon.cpp @@ -244,8 +244,8 @@ void TempSummon::RemoveFromWorld() } } - if(GetOwnerGUID()) - sLog.outError("Unit %u has owner guid when removed from world", GetEntry()); + //if(GetOwnerGUID()) + // sLog.outError("Unit %u has owner guid when removed from world", GetEntry()); Creature::RemoveFromWorld(); } @@ -254,6 +254,30 @@ void TempSummon::SaveToDB() { } +bool TempSummon::SetOwner(Unit *owner, bool apply) +{ + if(apply) + { + if(!AddUInt64Value(UNIT_FIELD_SUMMONEDBY, owner->GetGUID())) + { + sLog.outCrash("Unit %u is summoned by %u but it already has a owner", GetEntry(), owner->GetEntry()); + return false; + } + if(owner->GetTypeId() == TYPEID_PLAYER) + m_ControlledByPlayer = true; + } + else + { + if(!RemoveUInt64Value(UNIT_FIELD_SUMMONEDBY, owner->GetGUID())) + { + sLog.outCrash("Unit %u is unsummoned by %u but it has another owner", GetEntry(), owner->GetEntry()); + return false; + } + } + + return true; +} + Guardian::Guardian(SummonPropertiesEntry const *properties, Unit *owner) : TempSummon(properties, owner) , m_owner(owner), m_bonusdamage(0) { diff --git a/src/game/TemporarySummon.h b/src/game/TemporarySummon.h index cb5651d3194..c4f24d93273 100644 --- a/src/game/TemporarySummon.h +++ b/src/game/TemporarySummon.h @@ -37,6 +37,8 @@ class TempSummon : public Creature Unit* GetSummoner() const; SummonPropertiesEntry const *m_Properties; + + bool SetOwner(Unit *owner, bool apply); private: TempSummonType m_type; uint32 m_timer; diff --git a/src/game/Totem.cpp b/src/game/Totem.cpp index 6969960e7ea..eff78d4e8cd 100644 --- a/src/game/Totem.cpp +++ b/src/game/Totem.cpp @@ -142,15 +142,12 @@ void Totem::UnSummon() AddObjectToRemoveList(); } -void Totem::SetOwner(uint64 guid) +void Totem::SetOwner(Unit *owner) { - SetCreatorGUID(guid); - SetOwnerGUID(guid); - if (Unit *owner = GetOwner()) - { - this->setFaction(owner->getFaction()); - this->SetLevel(owner->getLevel()); - } + SetCreatorGUID(owner->GetGUID()); + TempSummon::SetOwner(owner, true); + setFaction(owner->getFaction()); + SetLevel(owner->getLevel()); } Unit *Totem::GetOwner() diff --git a/src/game/Totem.h b/src/game/Totem.h index 40e2744bbeb..1280ebc035d 100644 --- a/src/game/Totem.h +++ b/src/game/Totem.h @@ -46,7 +46,7 @@ class Totem : public TempSummon TotemType GetTotemType() const { return m_type; } void SetTypeBySummonSpell(SpellEntry const * spellProto); void SetDuration(uint32 dur) { m_duration = dur; } - void SetOwner(uint64 guid); + void SetOwner(Unit *owner); bool UpdateStats(Stats /*stat*/) { return true; } bool UpdateAllStats() { return true; } diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index 7b4cb2e1958..e381f41ef13 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -81,6 +81,7 @@ Unit::Unit() : WorldObject(), i_motionMaster(this), m_ThreatManager(this), m_HostilRefManager(this) , m_IsInNotifyList(false), m_Notified(false), IsAIEnabled(false), NeedChangeAI(false) , i_AI(NULL), i_disabledAI(NULL), m_removedAurasCount(0), m_Vehicle(NULL) +, m_ControlledByPlayer(false) { m_objectType |= TYPEMASK_UNIT; m_objectTypeId = TYPEID_UNIT; @@ -1613,7 +1614,7 @@ void Unit::DealMeleeDamage(CalcDamageInfo *damageInfo, bool durabilityLoss) // If this is a creature and it attacks from behind it has a probability to daze it's victim if( (damageInfo->hitOutCome==MELEE_HIT_CRIT || damageInfo->hitOutCome==MELEE_HIT_CRUSHING || damageInfo->hitOutCome==MELEE_HIT_NORMAL || damageInfo->hitOutCome==MELEE_HIT_GLANCING) && - GetTypeId() != TYPEID_PLAYER && !((Creature*)this)->GetCharmerOrOwnerGUID() && !pVictim->HasInArc(M_PI, this) + GetTypeId() != TYPEID_PLAYER && !((Creature*)this)->IsControlledByPlayer() && !pVictim->HasInArc(M_PI, this) && (pVictim->GetTypeId() == TYPEID_PLAYER || !((Creature*)pVictim)->isWorldBoss())) { // -probability is between 0% and 40% @@ -2457,9 +2458,8 @@ MeleeHitOutcome Unit::RollMeleeOutcomeAgainst (const Unit *pVictim, WeaponAttack // mobs can score crushing blows if they're 4 or more levels above victim if (getLevelForTarget(pVictim) >= pVictim->getLevelForTarget(this) + 4 && // can be from by creature (if can) or from controlled player that considered as creature - (GetTypeId()!=TYPEID_PLAYER && !((Creature*)this)->isPet() && - !(((Creature*)this)->GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_NO_CRUSH) || - GetTypeId()==TYPEID_PLAYER && GetCharmerOrOwnerGUID())) + !IsControlledByPlayer() && + !(GetTypeId() == TYPEID_UNIT && ((Creature*)this)->GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_NO_CRUSH)) { // when their weapon skill is 15 or more above victim's defense skill tmp = victimDefenseSkill; @@ -7835,7 +7835,7 @@ bool Unit::Attack(Unit *victim, bool meleeAttack) //if(GetTypeId()==TYPEID_UNIT) // ((Creature*)this)->SetCombatStartPosition(GetPositionX(), GetPositionY(), GetPositionZ()); - if(GetTypeId()==TYPEID_UNIT) + if(GetTypeId()==TYPEID_UNIT && !IsControlledByPlayer()) { // should not let player enter combat by right clicking target SetInCombatWith(victim); @@ -8060,11 +8060,8 @@ void Unit::SetGuardian(Guardian* guardian, bool apply) if(apply) { - if(!guardian->AddUInt64Value(UNIT_FIELD_SUMMONEDBY, GetGUID())) - { - sLog.outCrash("Guardian %u is summoned by %u but it already has a owner", guardian->GetEntry(), GetEntry()); + if(!guardian->SetOwner(this, true)) return; - } m_Controlled.insert(guardian); @@ -8108,11 +8105,8 @@ void Unit::SetGuardian(Guardian* guardian, bool apply) } else { - if(!guardian->RemoveUInt64Value(UNIT_FIELD_SUMMONEDBY, GetGUID())) - { - sLog.outCrash("Pet %u is unsummoned by %u but it has another owner", guardian->GetEntry(), GetEntry()); + if(!guardian->SetOwner(this, false)) return; - } m_Controlled.erase(guardian); @@ -8157,7 +8151,11 @@ void Unit::SetCharm(Unit* charm, bool apply) { if(!AddUInt64Value(UNIT_FIELD_CHARM, charm->GetGUID())) sLog.outCrash("Player %s is trying to charm unit %u, but it already has a charmed unit %u", GetName(), charm->GetEntry(), GetCharmGUID()); + + charm->m_ControlledByPlayer = true; } + else + charm->m_ControlledByPlayer = false; if(!charm->AddUInt64Value(UNIT_FIELD_CHARMEDBY, GetGUID())) sLog.outCrash("Unit %u is being charmed, but it already has a charmer %u", charm->GetEntry(), charm->GetCharmerGUID()); @@ -8172,6 +8170,11 @@ void Unit::SetCharm(Unit* charm, bool apply) sLog.outCrash("Player %s is trying to uncharm unit %u, but it has another charmed unit %u", GetName(), charm->GetEntry(), GetCharmGUID()); } + if(charm->GetTypeId() == TYPEID_PLAYER || IS_PLAYER_GUID(charm->GetOwnerGUID())) + charm->m_ControlledByPlayer = true; + else + charm->m_ControlledByPlayer = false; + if(!charm->RemoveUInt64Value(UNIT_FIELD_CHARMEDBY, GetGUID())) sLog.outCrash("Unit %u is being uncharmed, but it has another charmer %u", charm->GetEntry(), charm->GetCharmerGUID()); diff --git a/src/game/Unit.h b/src/game/Unit.h index 4d328042f53..64aeafaeed4 100644 --- a/src/game/Unit.h +++ b/src/game/Unit.h @@ -1214,7 +1214,6 @@ class TRINITY_DLL_SPEC Unit : public WorldObject virtual void setDeathState(DeathState s); // overwrited in Creature/Player/Pet uint64 GetOwnerGUID() const { return GetUInt64Value(UNIT_FIELD_SUMMONEDBY); } - void SetOwnerGUID(uint64 owner) { SetUInt64Value(UNIT_FIELD_SUMMONEDBY, owner); } uint64 GetCreatorGUID() const { return GetUInt64Value(UNIT_FIELD_CREATEDBY); } void SetCreatorGUID(uint64 creator) { SetUInt64Value(UNIT_FIELD_CREATEDBY, creator); } uint64 GetGuardianGUID() const { return GetUInt64Value(UNIT_FIELD_SUMMON); } @@ -1225,6 +1224,7 @@ class TRINITY_DLL_SPEC Unit : public WorldObject void SetPetGUID(uint64 guid) { m_SummonSlot[SUMMON_SLOT_PET] = guid; } uint64 GetPetGUID() const { return m_SummonSlot[SUMMON_SLOT_PET]; } + bool IsControlledByPlayer() const { return m_ControlledByPlayer; } uint64 GetCharmerOrOwnerGUID() const { return GetCharmerGUID() ? GetCharmerGUID() : GetOwnerGUID(); } uint64 GetCharmerOrOwnerOrOwnGUID() const { @@ -1624,6 +1624,8 @@ class TRINITY_DLL_SPEC Unit : public WorldObject float GetTransOffsetO() const { return m_movementInfo.t_o; } uint32 GetTransTime() const { return m_movementInfo.t_time; } int8 GetTransSeat() const { return m_movementInfo.t_seat; } + + bool m_ControlledByPlayer; protected: explicit Unit (); |