From dd09e6fdf773b1d56d685c7231717a29472c2dea Mon Sep 17 00:00:00 2001 From: AlexDereka Date: Fri, 5 Jun 2009 15:05:45 +0400 Subject: [PATCH 01/14] [7962] Fixed compilation on OpenBSD. Remove outdated options from configure.ac. --- configure.ac | 37 ---------------------------- dep/include/sockets/socket_include.h | 2 +- dep/src/g3dlite/System.cpp | 4 +++ src/shared/Database/Database.h | 8 +++--- src/shared/revision_nr.h | 2 +- 5 files changed, 10 insertions(+), 43 deletions(-) diff --git a/configure.ac b/configure.ac index fbbc65d9c..b41a20cf3 100644 --- a/configure.ac +++ b/configure.ac @@ -163,39 +163,6 @@ Debugging options: ]) AC_MSG_RESULT($MANGOSD_DEBUG_INFO) - -# Enable CLI console? -AC_MSG_CHECKING(whether cli console is enabled) -MANGOSD_ENABLE_CLI=no -AC_ARG_ENABLE(cli, -[ --enable-cli Turn on command console system], -[ - if test "$enableval" = "yes" ; then - CFLAGS="-DENABLE_CLI $CFLAGS" - CXXFLAGS="-DENABLE_CLI $CXXFLAGS" - MANGOSD_ENABLE_CLI=yes - elif test "$withval" != "no" ; then - AC_MSG_ERROR(Please choose yes or no) - fi -]) -AC_MSG_RESULT($MANGOSD_ENABLE_CLI) - -# Enable remote console? -AC_MSG_CHECKING(whether remote console is enabled) -MANGOSD_ENABLE_RA=no -AC_ARG_ENABLE(ra, -[ --enable-ra Turn on remote console system], -[ - if test "$enableval" = "yes" ; then - CFLAGS="-DENABLE_RA $CFLAGS" - CXXFLAGS="-DENABLE_RA $CXXFLAGS" - MANGOSD_ENABLE_RA=yes - elif test "$withval" != "no" ; then - AC_MSG_ERROR(Please choose yes or no) - fi -]) -AC_MSG_RESULT($MANGOSD_ENABLE_RA) - ## Check for required header files. AC_HEADER_STDC AC_HEADER_DIRENT @@ -211,10 +178,8 @@ AC_CHECK_HEADERS([zlib.h]) AC_HEADER_STDBOOL AC_C_CONST AC_C_INLINE -AC_TYPE_SIZE_T AC_HEADER_TIME AC_STRUCT_TM -AC_TYPE_UINT64_T AC_C_VOLATILE AC_CHECK_TYPES([ptrdiff_t]) @@ -272,8 +237,6 @@ MANGOS_LIBS="$POSTGRE_LIBS $MYSQL_LIBS $ZLIB $COMPATLIB $SSLLIB $MANGOS_LIBS" ## Export defined variables AC_SUBST(DOXYGEN) AC_SUBST(MANGOSD_DEBUG_INFO) -AC_SUBST(MANGOSD_ENABLE_CLI) -AC_SUBST(MANGOSD_ENABLE_RA) ## Additional CPPFLAGS and LDFLAGS. AC_SUBST(MANGOS_INCLUDES) diff --git a/dep/include/sockets/socket_include.h b/dep/include/sockets/socket_include.h index 34e7a8ca5..b2d55bc19 100644 --- a/dep/include/sockets/socket_include.h +++ b/dep/include/sockets/socket_include.h @@ -150,7 +150,7 @@ namespace SOCKETS_NAMESPACE { # error FreeBSD versions prior to 400014 does not support ipv6 # endif -#elif defined __NetBSD__ +#elif defined (__NetBSD__) || defined (__OpenBSD__) # if !defined(MSG_NOSIGNAL) # define MSG_NOSIGNAL 0 # endif diff --git a/dep/src/g3dlite/System.cpp b/dep/src/g3dlite/System.cpp index 06be7cd25..3f129af61 100644 --- a/dep/src/g3dlite/System.cpp +++ b/dep/src/g3dlite/System.cpp @@ -23,6 +23,10 @@ #include "G3D/debug.h" #include "G3D/format.h" +#if defined(__OpenBSD__) + #include +#endif + #ifdef G3D_WIN32 #include diff --git a/src/shared/Database/Database.h b/src/shared/Database/Database.h index fbfd4d6a5..da3e9a706 100644 --- a/src/shared/Database/Database.h +++ b/src/shared/Database/Database.h @@ -79,16 +79,16 @@ class MANGOS_DLL_SPEC Database template bool AsyncPQuery(Class *object, void (Class::*method)(QueryResult*, ParamType1), ParamType1 param1, const char *format,...) ATTR_PRINTF(5,6); template - bool AsyncPQuery(Class *object, void (Class::*method)(QueryResult*, ParamType1, ParamType2), ParamType1 param1, ParamType2 param2, const char *format,...) ATTR_PRINTF(5,6); + bool AsyncPQuery(Class *object, void (Class::*method)(QueryResult*, ParamType1, ParamType2), ParamType1 param1, ParamType2 param2, const char *format,...) ATTR_PRINTF(6,7); template - bool AsyncPQuery(Class *object, void (Class::*method)(QueryResult*, ParamType1, ParamType2, ParamType3), ParamType1 param1, ParamType2 param2, ParamType3 param3, const char *format,...) ATTR_PRINTF(5,6); + bool AsyncPQuery(Class *object, void (Class::*method)(QueryResult*, ParamType1, ParamType2, ParamType3), ParamType1 param1, ParamType2 param2, ParamType3 param3, const char *format,...) ATTR_PRINTF(7,8); // PQuery / static template - bool AsyncPQuery(void (*method)(QueryResult*, ParamType1), ParamType1 param1, const char *format,...) ATTR_PRINTF(5,6); + bool AsyncPQuery(void (*method)(QueryResult*, ParamType1), ParamType1 param1, const char *format,...) ATTR_PRINTF(4,5); template bool AsyncPQuery(void (*method)(QueryResult*, ParamType1, ParamType2), ParamType1 param1, ParamType2 param2, const char *format,...) ATTR_PRINTF(5,6); template - bool AsyncPQuery(void (*method)(QueryResult*, ParamType1, ParamType2, ParamType3), ParamType1 param1, ParamType2 param2, ParamType3 param3, const char *format,...) ATTR_PRINTF(5,6); + bool AsyncPQuery(void (*method)(QueryResult*, ParamType1, ParamType2, ParamType3), ParamType1 param1, ParamType2 param2, ParamType3 param3, const char *format,...) ATTR_PRINTF(6,7); template // QueryHolder bool DelayQueryHolder(Class *object, void (Class::*method)(QueryResult*, SqlQueryHolder*), SqlQueryHolder *holder); diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 4cedafe21..d64029851 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "7961" + #define REVISION_NR "7962" #endif // __REVISION_NR_H__ From 5848ada3eb3b743c163b5aa17f1133ee6c22e21a Mon Sep 17 00:00:00 2001 From: ApoC Date: Fri, 5 Jun 2009 13:58:03 +0200 Subject: [PATCH 02/14] [7963] Fixed energize value for 20186 proc. Signed-off-by: ApoC --- src/game/Unit.cpp | 6 +++++- src/shared/revision_nr.h | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index d0d78ceea..236d029d8 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -5507,7 +5507,11 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu case 20186: { if (pVictim->getPowerType() == POWER_MANA) - pVictim->CastSpell(pVictim, 20268, true, 0, triggeredByAura); + { + // 2% of maximum mana + basepoints0 = int32(pVictim->GetMaxPower(POWER_MANA) * 2 / 100); + pVictim->CastCustomSpell(pVictim, 20268, &basepoints0, NULL, NULL, true, 0, triggeredByAura); + } return true; } // Holy Power (Redemption Armor set) diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index d64029851..5a200dafe 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "7962" + #define REVISION_NR "7963" #endif // __REVISION_NR_H__ From 877f81c37b00e6304bc2c8144eb54cd1cf7a51e1 Mon Sep 17 00:00:00 2001 From: ApoC Date: Fri, 5 Jun 2009 14:03:58 +0200 Subject: [PATCH 03/14] [7964] Use NULL instead of 0 for "empty" pointers. Signed-off-by: ApoC --- src/game/SpellAuras.cpp | 14 +++++++------- src/game/Unit.cpp | 10 +++++----- src/shared/revision_nr.h | 2 +- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/game/SpellAuras.cpp b/src/game/SpellAuras.cpp index 6cb7a79fc..1c3cf8332 100644 --- a/src/game/SpellAuras.cpp +++ b/src/game/SpellAuras.cpp @@ -2017,7 +2017,7 @@ void Aura::TriggerSpellWithValue() uint32 trigger_spell_id = GetSpellProto()->EffectTriggerSpell[m_effIndex]; int32 basepoints0 = this->GetModifier()->m_amount; - caster->CastCustomSpell(target, trigger_spell_id, &basepoints0, 0, 0, true, 0, this); + caster->CastCustomSpell(target, trigger_spell_id, &basepoints0, NULL, NULL, true, NULL, this); } /*********************************************************/ @@ -6412,7 +6412,7 @@ void Aura::PeriodicDummyTick() // Increases your attack power by $s1 for every $s2 armor value you have. // Calculate AP bonus (from 1 efect of this spell) int32 apBonus = m_modifier.m_amount * m_target->GetArmor() / m_target->CalculateSpellDamage(spell, 1, spell->EffectBasePoints[1], m_target); - m_target->CastCustomSpell(m_target, 61217, &apBonus, &apBonus, 0, true, 0, this); + m_target->CastCustomSpell(m_target, 61217, &apBonus, &apBonus, NULL, true, NULL, this); return; } break; @@ -6435,7 +6435,7 @@ void Aura::PeriodicDummyTick() int32 mod = (rage < 100) ? rage : 100; int32 points = m_target->CalculateSpellDamage(spell, 1, spell->EffectBasePoints[1], m_target); int32 regen = m_target->GetMaxHealth() * (mod * points / 10) / 1000; - m_target->CastCustomSpell(m_target, 22845, ®en, 0, 0, true, 0, this); + m_target->CastCustomSpell(m_target, 22845, ®en, NULL, NULL, true, NULL, this); m_target->SetPower(POWER_RAGE, rage-mod); return; } @@ -6507,11 +6507,11 @@ void Aura::PeriodicDummyTick() // Full damage to target at 0 tick if (m_duration > m_modifier.periodictime) { - caster->CastCustomSpell(m_target, 53352, &damage, 0, 0, true, 0, this); + caster->CastCustomSpell(m_target, 53352, &damage, NULL, NULL, true, NULL, this); return; } damage/=4; - caster->CastCustomSpell(m_target, 56298, &damage, 0, 0, true, 0, this); + caster->CastCustomSpell(m_target, 56298, &damage, NULL, NULL, true, NULL, this); return; } switch (spell->Id) @@ -6552,7 +6552,7 @@ void Aura::PeriodicDummyTick() if (spell->SpellFamilyFlags & UI64LIT(0x0000000000000020)) { if (caster) - caster->CastCustomSpell(m_target, 52212, &m_modifier.m_amount, NULL, NULL, true, 0, this); + caster->CastCustomSpell(m_target, 52212, &m_modifier.m_amount, NULL, NULL, true, NULL, this); return; } // Raise Dead @@ -6585,7 +6585,7 @@ void Aura::PeriodicDummyTick() // Increases your attack power by $s1 for every $s2 armor value you have. // Calculate AP bonus (from 1 efect of this spell) int32 apBonus = m_modifier.m_amount * m_target->GetArmor() / m_target->CalculateSpellDamage(spell, 1, spell->EffectBasePoints[1], m_target); - m_target->CastCustomSpell(m_target, 61217, &apBonus, &apBonus, 0, true, 0, this); + m_target->CastCustomSpell(m_target, 61217, &apBonus, &apBonus, NULL, true, NULL, this); return; } // Reaping diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index 236d029d8..1d97a1f4a 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -1802,7 +1802,7 @@ void Unit::CalcAbsorbResist(Unit *pVictim,SpellSchoolMask schoolMask, DamageEffe // This, if I'm not mistaken, shows that we get back ~2% of the absorbed damage as runic power. int32 absorbed = RemainingDamage * currentAbsorb / 100; int32 regen = absorbed * 2 / 10; - pVictim->CastCustomSpell(pVictim, 49088, ®en, 0, 0, true, 0, *i); + pVictim->CastCustomSpell(pVictim, 49088, ®en, NULL, NULL, true, NULL, *i); RemainingDamage -= absorbed; continue; } @@ -5500,7 +5500,7 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu int32 holy = caster->SpellBaseDamageBonus(SPELL_SCHOOL_MASK_HOLY) + caster->SpellBaseDamageBonusForVictim(SPELL_SCHOOL_MASK_HOLY, this); basepoints0 = int32(ap*0.10f + 0.10f*holy); - pVictim->CastCustomSpell(pVictim, 20267, &basepoints0, 0, 0, true, 0, triggeredByAura); + pVictim->CastCustomSpell(pVictim, 20267, &basepoints0, NULL, NULL, true, NULL, triggeredByAura); return true; } // Judgement of Wisdom @@ -5510,7 +5510,7 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu { // 2% of maximum mana basepoints0 = int32(pVictim->GetMaxPower(POWER_MANA) * 2 / 100); - pVictim->CastCustomSpell(pVictim, 20268, &basepoints0, NULL, NULL, true, 0, triggeredByAura); + pVictim->CastCustomSpell(pVictim, 20268, &basepoints0, NULL, NULL, true, NULL, triggeredByAura); } return true; } @@ -5638,7 +5638,7 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu if (procSpell->Effect[i] == SPELL_EFFECT_ENERGIZE) { int32 mana = procSpell->EffectBasePoints[i]; - CastCustomSpell(this, 54986, 0, &mana, 0, true, castItem, triggeredByAura); + CastCustomSpell(this, 54986, NULL, &mana, NULL, true, castItem, triggeredByAura); break; } return true; @@ -6868,7 +6868,7 @@ bool Unit::HandleOverrideClassScriptAuraProc(Unit *pVictim, uint32 damage, Aura return false; int32 cost = procSpell->manaCost + procSpell->ManaCostPercentage * GetCreateMana() / 100; int32 basepoints0 = cost * triggeredByAura->GetModifier()->m_amount/100; - CastCustomSpell(this, 47762, &basepoints0, 0, 0, true, 0, triggeredByAura); + CastCustomSpell(this, 47762, &basepoints0, NULL, NULL, true, NULL, triggeredByAura); return true; } } diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 5a200dafe..3022cc64b 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "7963" + #define REVISION_NR "7964" #endif // __REVISION_NR_H__ From 30c054ae38ded99cf1459bc91b3aa5fc8a2f4288 Mon Sep 17 00:00:00 2001 From: ApoC Date: Fri, 5 Jun 2009 16:23:05 +0200 Subject: [PATCH 04/14] [7965] Implemented proc for 20911 spell. Signed-off-by: ApoC --- src/game/Unit.cpp | 24 ++++++++++++++++++++++++ src/shared/revision_nr.h | 2 +- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index 1d97a1f4a..4b693b4db 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -5545,6 +5545,29 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu } break; } + // Blessing of Sanctuary + case 20911: + { + if (target->GetTypeId() != TYPEID_PLAYER) + return false; + + target = this; + switch (target->getPowerType()) + { + case POWER_MANA: + triggered_spell_id = 57319; + break; + case POWER_RAGE: + triggered_spell_id = 57320; + break; + case POWER_RUNIC_POWER: + triggered_spell_id = 57321; + break; + default: + return false; + } + break; + } // Seal of Vengeance (damage calc on apply aura) case 31801: { @@ -10761,6 +10784,7 @@ void Unit::ProcDamageAndSpellFor( bool isVictim, Unit * pTarget, uint32 procFlag DealSpellDamage(&damageInfo, true); break; } + case SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN: case SPELL_AURA_MANA_SHIELD: case SPELL_AURA_OBS_MOD_MANA: case SPELL_AURA_DUMMY: diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 3022cc64b..26aaceaf3 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "7964" + #define REVISION_NR "7965" #endif // __REVISION_NR_H__ From e5e8a3755f8ff89cf69d6aa4d64a07924549efde Mon Sep 17 00:00:00 2001 From: ApoC Date: Fri, 5 Jun 2009 16:40:14 +0200 Subject: [PATCH 05/14] [7966] Clean up in Spell:SetTargetMap * Little optimization * Code style cleanup * Formating cleanup Signed-off-by: ApoC --- src/game/Spell.cpp | 73 ++++++++++++++++++---------------------- src/shared/revision_nr.h | 2 +- 2 files changed, 33 insertions(+), 42 deletions(-) diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index 319ad16dc..34332c67f 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -1561,7 +1561,8 @@ void Spell::SetTargetMap(uint32 i,uint32 cur,UnitList& TagUnitMap) else { Unit* pUnitTarget = m_targets.getUnitTarget(); - if(!pUnitTarget) + Unit* originalCaster = GetOriginalCaster(); + if(!pUnitTarget || !originalCaster) break; unMaxTargets = EffectChainTarget; @@ -1578,55 +1579,45 @@ void Spell::SetTargetMap(uint32 i,uint32 cur,UnitList& TagUnitMap) cell.data.Part.reserved = ALL_DISTRICT; cell.SetNoCreate(); - Unit* originalCaster = GetOriginalCaster(); - if(originalCaster) + std::list tempUnitMap; { - std::list tempUnitMap; + MaNGOS::AnyAoETargetUnitInObjectRangeCheck u_check(pUnitTarget, originalCaster, max_range, false); + MaNGOS::UnitListSearcher searcher(m_caster, tempUnitMap, u_check); + TypeContainerVisitor, WorldTypeMapContainer> world_unit_searcher(searcher); + TypeContainerVisitor, GridTypeMapContainer> grid_unit_searcher(searcher); + CellLock cell_lock(cell, p); - { - MaNGOS::AnyAoETargetUnitInObjectRangeCheck u_check(pUnitTarget, originalCaster, max_range, false); - MaNGOS::UnitListSearcher searcher(m_caster, tempUnitMap, u_check); + cell_lock->Visit(cell_lock, world_unit_searcher, *m_caster->GetMap()); + cell_lock->Visit(cell_lock, grid_unit_searcher, *m_caster->GetMap()); + } + if (tempUnitMap.empty()) + break; - TypeContainerVisitor, WorldTypeMapContainer > world_unit_searcher(searcher); - TypeContainerVisitor, GridTypeMapContainer > grid_unit_searcher(searcher); + tempUnitMap.sort(TargetDistanceOrder(pUnitTarget)); - CellLock cell_lock(cell, p); - cell_lock->Visit(cell_lock, world_unit_searcher, *m_caster->GetMap()); - cell_lock->Visit(cell_lock, grid_unit_searcher, *m_caster->GetMap()); - } + if (*tempUnitMap.begin() == pUnitTarget) + tempUnitMap.erase (tempUnitMap.begin()); - tempUnitMap.sort(TargetDistanceOrder(pUnitTarget)); + TagUnitMap.push_back(pUnitTarget); + uint32 t = unMaxTargets - 1; + Unit *prev = pUnitTarget; + std::list::iterator next = tempUnitMap.begin(); - if(tempUnitMap.empty()) + while (t && next != tempUnitMap.end()) + { + if (!prev->IsWithinDist (*next,CHAIN_SPELL_JUMP_RADIUS)) break; - - if(*tempUnitMap.begin() == pUnitTarget) - tempUnitMap.erase(tempUnitMap.begin()); - - TagUnitMap.push_back(pUnitTarget); - uint32 t = unMaxTargets - 1; - Unit *prev = pUnitTarget; - std::list::iterator next = tempUnitMap.begin(); - - while(t && next != tempUnitMap.end() ) + if (!prev->IsWithinLOSInMap (*next)) { - if(!prev->IsWithinDist(*next,CHAIN_SPELL_JUMP_RADIUS)) - break; - - if(!prev->IsWithinLOSInMap(*next)) - { - ++next; - continue; - } - - prev = *next; - TagUnitMap.push_back(prev); - tempUnitMap.erase(next); - tempUnitMap.sort(TargetDistanceOrder(prev)); - next = tempUnitMap.begin(); - - --t; + ++next; + continue; } + prev = *next; + TagUnitMap.push_back(prev); + tempUnitMap.erase(next); + tempUnitMap.sort (TargetDistanceOrder(prev)); + next = tempUnitMap.begin(); + --t; } } }break; diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 26aaceaf3..441a4f4b2 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "7965" + #define REVISION_NR "7966" #endif // __REVISION_NR_H__ From 3b72c6f2078f956a6b987ce4db49e1a06f4b899f Mon Sep 17 00:00:00 2001 From: tomrus88 Date: Fri, 5 Jun 2009 16:12:01 +0400 Subject: [PATCH 06/14] [7967] Removed unused field. (cherry picked from commit acb3e8402f08aa0c2073bc78607f76c8d7098105) Signed-off-by: VladimirMangos --- src/game/Corpse.cpp | 38 ++++++++++++++++++++++++-------------- src/game/DynamicObject.cpp | 19 +++++++++++-------- src/game/DynamicObject.h | 3 +-- src/shared/revision_nr.h | 2 +- 4 files changed, 37 insertions(+), 25 deletions(-) diff --git a/src/game/Corpse.cpp b/src/game/Corpse.cpp index f1a4ad115..0e5b28fe6 100644 --- a/src/game/Corpse.cpp +++ b/src/game/Corpse.cpp @@ -49,14 +49,18 @@ Corpse::~Corpse() void Corpse::AddToWorld() { ///- Register the corpse for guid lookup - if(!IsInWorld()) ObjectAccessor::Instance().AddObject(this); + if(!IsInWorld()) + ObjectAccessor::Instance().AddObject(this); + Object::AddToWorld(); } void Corpse::RemoveFromWorld() { ///- Remove the corpse from the accessor - if(IsInWorld()) ObjectAccessor::Instance().RemoveObject(this); + if(IsInWorld()) + ObjectAccessor::Instance().RemoveObject(this); + Object::RemoveFromWorld(); } @@ -77,7 +81,7 @@ bool Corpse::Create( uint32 guidlow, Player *owner) if(!IsPositionValid()) { sLog.outError("Corpse (guidlow %d, owner %s) not created. Suggested coordinates isn't valid (X: %f Y: %f)", - guidlow,owner->GetName(),owner->GetPositionX(), owner->GetPositionY()); + guidlow, owner->GetName(), owner->GetPositionX(), owner->GetPositionY()); return false; } @@ -122,7 +126,7 @@ void Corpse::SaveToDB() void Corpse::DeleteBonesFromWorld() { - assert(GetType()==CORPSE_BONES); + assert(GetType() == CORPSE_BONES); Corpse* corpse = ObjectAccessor::GetCorpse(*this, GetGUID()); if (!corpse) @@ -151,7 +155,7 @@ bool Corpse::LoadFromDB(uint32 guid, QueryResult *result) // 0 1 2 3 4 5 6 7 8 9 result = CharacterDatabase.PQuery("SELECT position_x,position_y,position_z,orientation,map,data,time,corpse_type,instance,phaseMask FROM corpse WHERE guid = '%u'",guid); - if( ! result ) + if( !result ) { sLog.outError("Corpse (GUID: %u) not found in table `corpse`, can't load. ",guid); return false; @@ -159,13 +163,17 @@ bool Corpse::LoadFromDB(uint32 guid, QueryResult *result) Field *fields = result->Fetch(); - if(!LoadFromDB(guid,fields)) + if(!LoadFromDB(guid, fields)) { - if (!external) delete result; + if (!external) + delete result; + return false; } - if (!external) delete result; + if (!external) + delete result; + return true; } @@ -187,13 +195,15 @@ bool Corpse::LoadFromDB(uint32 guid, Field *fields) return false; } - m_time = time_t(fields[6].GetUInt64()); - m_type = CorpseType(fields[7].GetUInt32()); + m_time = time_t(fields[6].GetUInt64()); + m_type = CorpseType(fields[7].GetUInt32()); + if(m_type >= MAX_CORPSE_TYPE) { sLog.outError("Corpse (guidlow %d, owner %d) have wrong corpse type, not load.",GetGUIDLow(),GUID_LOPART(GetOwnerGUID())); return false; } + uint32 instanceid = fields[8].GetUInt32(); uint32 phaseMask = fields[9].GetUInt32(); @@ -203,13 +213,13 @@ bool Corpse::LoadFromDB(uint32 guid, Field *fields) // place SetInstanceId(instanceid); SetMapId(mapid); - SetPhaseMask(phaseMask,false); - Relocate(positionX,positionY,positionZ,ort); + SetPhaseMask(phaseMask, false); + Relocate(positionX, positionY, positionZ, ort); if(!IsPositionValid()) { sLog.outError("Corpse (guidlow %d, owner %d) not created. Suggested coordinates isn't valid (X: %f Y: %f)", - GetGUIDLow(),GUID_LOPART(GetOwnerGUID()),GetPositionX(),GetPositionY()); + GetGUIDLow(), GUID_LOPART(GetOwnerGUID()), GetPositionX(), GetPositionY()); return false; } @@ -220,5 +230,5 @@ bool Corpse::LoadFromDB(uint32 guid, Field *fields) bool Corpse::isVisibleForInState(Player const* u, bool inVisibleList) const { - return IsInWorld() && u->IsInWorld() && IsWithinDistInMap(u,World::GetMaxVisibleDistanceForObject()+(inVisibleList ? World::GetVisibleObjectGreyDistance() : 0.0f), false); + return IsInWorld() && u->IsInWorld() && IsWithinDistInMap(u, World::GetMaxVisibleDistanceForObject() + (inVisibleList ? World::GetVisibleObjectGreyDistance() : 0.0f), false); } diff --git a/src/game/DynamicObject.cpp b/src/game/DynamicObject.cpp index 2fb5473cd..acb1c70f8 100644 --- a/src/game/DynamicObject.cpp +++ b/src/game/DynamicObject.cpp @@ -39,14 +39,18 @@ DynamicObject::DynamicObject() : WorldObject() void DynamicObject::AddToWorld() { ///- Register the dynamicObject for guid lookup - if(!IsInWorld()) ObjectAccessor::Instance().AddObject(this); + if(!IsInWorld()) + ObjectAccessor::Instance().AddObject(this); + Object::AddToWorld(); } void DynamicObject::RemoveFromWorld() { ///- Remove the dynamicObject from the accessor - if(IsInWorld()) ObjectAccessor::Instance().RemoveObject(this); + if(IsInWorld()) + ObjectAccessor::Instance().RemoveObject(this); + Object::RemoveFromWorld(); } @@ -55,7 +59,7 @@ bool DynamicObject::Create( uint32 guidlow, Unit *caster, uint32 spellId, uint32 SetInstanceId(caster->GetInstanceId()); WorldObject::_Create(guidlow, HIGHGUID_DYNAMICOBJECT, caster->GetMapId(), caster->GetPhaseMask()); - Relocate(x,y,z,0); + Relocate(x, y, z, 0); if(!IsPositionValid()) { @@ -78,14 +82,13 @@ bool DynamicObject::Create( uint32 guidlow, Unit *caster, uint32 spellId, uint32 m_radius = radius; m_effIndex = effIndex; m_spellId = spellId; - m_casterGuid = caster->GetGUID(); return true; } Unit* DynamicObject::GetCaster() const { // can be not found in some cases - return ObjectAccessor::GetUnit(*this,m_casterGuid); + return ObjectAccessor::GetUnit(*this, GetCasterGUID()); } void DynamicObject::Update(uint32 p_time) @@ -111,7 +114,7 @@ void DynamicObject::Update(uint32 p_time) cell.data.Part.reserved = ALL_DISTRICT; cell.SetNoCreate(); - MaNGOS::DynamicObjectUpdater notifier(*this,caster); + MaNGOS::DynamicObjectUpdater notifier(*this, caster); TypeContainerVisitor world_object_notifier(notifier); TypeContainerVisitor grid_object_notifier(notifier); @@ -136,12 +139,12 @@ void DynamicObject::Delete() void DynamicObject::Delay(int32 delaytime) { m_aliveDuration -= delaytime; - for(AffectedSet::iterator iunit= m_affected.begin();iunit != m_affected.end();++iunit) + for(AffectedSet::iterator iunit= m_affected.begin(); iunit != m_affected.end(); ++iunit) if (*iunit) (*iunit)->DelayAura(m_spellId, m_effIndex, delaytime); } bool DynamicObject::isVisibleForInState(Player const* u, bool inVisibleList) const { - return IsInWorld() && u->IsInWorld() && IsWithinDistInMap(u,World::GetMaxVisibleDistanceForObject()+(inVisibleList ? World::GetVisibleObjectGreyDistance() : 0.0f), false); + return IsInWorld() && u->IsInWorld() && IsWithinDistInMap(u, World::GetMaxVisibleDistanceForObject() + (inVisibleList ? World::GetVisibleObjectGreyDistance() : 0.0f), false); } diff --git a/src/game/DynamicObject.h b/src/game/DynamicObject.h index ed19dc28f..3db328055 100644 --- a/src/game/DynamicObject.h +++ b/src/game/DynamicObject.h @@ -39,7 +39,7 @@ class DynamicObject : public WorldObject uint32 GetSpellId() const { return m_spellId; } uint32 GetEffIndex() const { return m_effIndex; } uint32 GetDuration() const { return m_aliveDuration; } - uint64 GetCasterGUID() const { return m_casterGuid; } + uint64 GetCasterGUID() const { return GetUInt64Value(DYNAMICOBJECT_CASTER); } Unit* GetCaster() const; float GetRadius() const { return m_radius; } bool IsAffecting(Unit *unit) const { return m_affected.find(unit) != m_affected.end(); } @@ -58,7 +58,6 @@ class DynamicObject : public WorldObject bool isActiveObject() const { return false; } protected: - uint64 m_casterGuid; uint32 m_spellId; uint32 m_effIndex; int32 m_aliveDuration; diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 441a4f4b2..b24cf0818 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "7966" + #define REVISION_NR "7967" #endif // __REVISION_NR_H__ From ef2d0df05d021584a3f9561401053f16157f1c7c Mon Sep 17 00:00:00 2001 From: VladimirMangos Date: Sat, 6 Jun 2009 08:53:39 +0400 Subject: [PATCH 07/14] [7968] In packet compression use real writed data size. --- src/game/UpdateData.cpp | 9 ++++----- src/shared/ByteBuffer.h | 2 +- src/shared/revision_nr.h | 2 +- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/game/UpdateData.cpp b/src/game/UpdateData.cpp index 546d84002..a01d82181 100644 --- a/src/game/UpdateData.cpp +++ b/src/game/UpdateData.cpp @@ -103,7 +103,7 @@ void UpdateData::Compress(void* dst, uint32 *dst_size, void* src, int src_size) bool UpdateData::BuildPacket(WorldPacket *packet) { - ByteBuffer buf(m_data.size()); + ByteBuffer buf(4+(m_outOfRangeGUIDs.empty() ? 0 : 1+4+9*m_outOfRangeGUIDs.size())+m_data.wpos()); buf << (uint32) (!m_outOfRangeGUIDs.empty() ? m_blockCount + 1 : m_blockCount); @@ -122,15 +122,14 @@ bool UpdateData::BuildPacket(WorldPacket *packet) packet->clear(); - size_t pSize = buf.size(); + size_t pSize = buf.wpos(); // use real used data size if (pSize > 100 ) // compress large packets { - packet->resize(pSize); + uint32 destsize = pSize; + packet->resize( destsize + sizeof(uint32) ); packet->put(0, pSize); - - uint32 destsize = pSize; Compress(const_cast(packet->contents()) + sizeof(uint32), &destsize, (void*)buf.contents(), pSize); if (destsize == 0) return false; diff --git a/src/shared/ByteBuffer.h b/src/shared/ByteBuffer.h index c289d34a7..f109504ca 100644 --- a/src/shared/ByteBuffer.h +++ b/src/shared/ByteBuffer.h @@ -309,7 +309,7 @@ class ByteBuffer } void append(const ByteBuffer& buffer) { - if(buffer.size()) append(buffer.contents(),buffer.wpos()); + if(buffer.wpos()) append(buffer.contents(),buffer.wpos()); } void appendPackGUID(uint64 guid) diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index b24cf0818..8e23251aa 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "7967" + #define REVISION_NR "7968" #endif // __REVISION_NR_H__ From 4118a70f6513586fc7be1f433b6f4b573b2ccfc1 Mon Sep 17 00:00:00 2001 From: Ambal Date: Sat, 6 Jun 2009 11:38:23 +0400 Subject: [PATCH 08/14] [7969] Remove gameobject from owner gameobjecs list at expire. This will prevent delayd owner access from gameobject destructor in time remove list proccessing and fix possible related problems with crosslinked pointers. Signed-off-by: VladimirMangos --- src/game/GameObject.cpp | 5 ++++- src/shared/revision_nr.h | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/game/GameObject.cpp b/src/game/GameObject.cpp index d08d6f9c0..98be0da03 100644 --- a/src/game/GameObject.cpp +++ b/src/game/GameObject.cpp @@ -399,7 +399,10 @@ void GameObject::Update(uint32 /*p_time*/) if(GetOwnerGUID()) { - m_respawnTime = 0; + if(Unit* owner = GetOwner()) + owner->RemoveGameObject(this, false); + + SetRespawnTime(0); Delete(); return; } diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 8e23251aa..04203eeaf 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "7968" + #define REVISION_NR "7969" #endif // __REVISION_NR_H__ From 01d93fa10d5d7b2c3d8795490512b7deb8e08167 Mon Sep 17 00:00:00 2001 From: VladimirMangos Date: Sat, 6 Jun 2009 19:57:09 +0400 Subject: [PATCH 09/14] [7970] Update test for spell 16972 and ranks (now if have 2 dummy effect but need effect 0 in check place) --- src/game/StatSystem.cpp | 4 ++-- src/shared/revision_nr.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/game/StatSystem.cpp b/src/game/StatSystem.cpp index 8ca0ee1a8..b22ccd03f 100644 --- a/src/game/StatSystem.cpp +++ b/src/game/StatSystem.cpp @@ -302,8 +302,8 @@ void Player::UpdateAttackPowerAndDamage(bool ranged ) Unit::AuraList const& mDummy = GetAurasByType(SPELL_AURA_DUMMY); for(Unit::AuraList::const_iterator itr = mDummy.begin(); itr != mDummy.end(); ++itr) { - // Predatory Strikes - if ((*itr)->GetSpellProto()->SpellIconID == 1563) + // Predatory Strikes (effect 0) + if ((*itr)->GetEffIndex()==0 && (*itr)->GetSpellProto()->SpellIconID == 1563) { mLevelMult = (*itr)->GetModifier()->m_amount / 100.0f; break; diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 04203eeaf..fd9a94e11 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "7969" + #define REVISION_NR "7970" #endif // __REVISION_NR_H__ From 5ac6b2f34b64fd62321592e0c35a3246bc4ff827 Mon Sep 17 00:00:00 2001 From: VladimirMangos Date: Sat, 6 Jun 2009 21:14:43 +0400 Subject: [PATCH 10/14] [7971] Implement support exotic pets limtations related to hunter telent 53270. Note: before this commit hunters can tame exotic pets like any other. After patch like not propertly contriolled pets will auto-dismiss at loading if talent not learned. --- src/game/CharacterHandler.cpp | 4 +- src/game/Creature.h | 8 +++- src/game/Level2.cpp | 2 +- src/game/NPCHandler.cpp | 87 +++++++++++++++++++++++++---------- src/game/Pet.cpp | 15 +++++- src/game/Player.cpp | 8 ++++ src/game/Player.h | 1 + src/game/SharedDefines.h | 9 ++-- src/game/Spell.cpp | 9 +++- src/shared/revision_nr.h | 2 +- 10 files changed, 106 insertions(+), 39 deletions(-) diff --git a/src/game/CharacterHandler.cpp b/src/game/CharacterHandler.cpp index 08b4cba3f..1a0547c46 100644 --- a/src/game/CharacterHandler.cpp +++ b/src/game/CharacterHandler.cpp @@ -159,7 +159,7 @@ void WorldSession::HandleCharEnumOpcode( WorldPacket & /*recv_data*/ ) // ------- Query Without Declined Names -------- // 0 1 2 3 4 5 6 7 8 "SELECT characters.guid, characters.data, characters.name, characters.position_x, characters.position_y, characters.position_z, characters.map, characters.totaltime, characters.leveltime, " - // 9 10 11 12 13 14 + // 9 10 11 12 13 14 "characters.at_login, characters.zone, character_pet.entry, character_pet.modelid, character_pet.level, guild_member.guildid " "FROM characters LEFT JOIN character_pet ON characters.guid=character_pet.owner AND character_pet.slot='%u' " "LEFT JOIN guild_member ON characters.guid = guild_member.guid " @@ -168,7 +168,7 @@ void WorldSession::HandleCharEnumOpcode( WorldPacket & /*recv_data*/ ) // --------- Query With Declined Names --------- // 0 1 2 3 4 5 6 7 8 "SELECT characters.guid, characters.data, characters.name, characters.position_x, characters.position_y, characters.position_z, characters.map, characters.totaltime, characters.leveltime, " - // 9 10 11 12 13 14 15 + // 9 10 11 12 13 14 15 "characters.at_login, characters.zone, character_pet.entry, character_pet.modelid, character_pet.level, guild_member.guildid, character_declinedname.genitive " "FROM characters LEFT JOIN character_pet ON characters.guid = character_pet.owner AND character_pet.slot='%u' " "LEFT JOIN character_declinedname ON characters.guid = character_declinedname.guid " diff --git a/src/game/Creature.h b/src/game/Creature.h index 07623c5e1..e171e56f7 100644 --- a/src/game/Creature.h +++ b/src/game/Creature.h @@ -235,9 +235,13 @@ struct CreatureInfo return SKILL_SKINNING; // normal case } - bool isTameable() const + bool isTameable(bool exotic) const { - return type == CREATURE_TYPE_BEAST && family != 0 && (type_flags & CREATURE_TYPEFLAGS_TAMEABLE); + if(type != CREATURE_TYPE_BEAST || family == 0 || (type_flags & CREATURE_TYPEFLAGS_TAMEABLE)==0) + return false; + + // if can tame exotic then can tame any temable + return exotic || (type_flags & CREATURE_TYPEFLAGS_EXOTIC)==0; } }; diff --git a/src/game/Level2.cpp b/src/game/Level2.cpp index 7cd09d8ce..27bbc8e59 100644 --- a/src/game/Level2.cpp +++ b/src/game/Level2.cpp @@ -1786,7 +1786,7 @@ bool ChatHandler::HandleNpcTameCommand(const char* /*args*/) CreatureInfo const* cInfo = creatureTarget->GetCreatureInfo(); - if (!cInfo->isTameable ()) + if (!cInfo->isTameable (player->CanTameExoticPets())) { PSendSysMessage (LANG_CREATURE_NON_TAMEABLE,cInfo->Entry); SetSentErrorMessage (true); diff --git a/src/game/NPCHandler.cpp b/src/game/NPCHandler.cpp index 45dc90bdd..f36fa96b9 100644 --- a/src/game/NPCHandler.cpp +++ b/src/game/NPCHandler.cpp @@ -582,11 +582,10 @@ void WorldSession::HandleStablePet( WorldPacket & recv_data ) Pet *pet = _player->GetPet(); - WorldPacket data(SMSG_STABLE_RESULT, 200); // guess size - // can't place in stable dead pet if(!pet||!pet->isAlive()||pet->getPetType()!=HUNTER_PET) { + WorldPacket data(SMSG_STABLE_RESULT, 1); data << uint8(0x06); SendPacket(&data); return; @@ -615,6 +614,7 @@ void WorldSession::HandleStablePet( WorldPacket & recv_data ) delete result; } + WorldPacket data(SMSG_STABLE_RESULT, 1); if( free_slot > 0 && free_slot <= GetPlayer()->m_stableSlots) { _player->RemovePet(pet,PetSaveMode(free_slot)); @@ -647,11 +647,40 @@ void WorldSession::HandleUnstablePet( WorldPacket & recv_data ) if(GetPlayer()->hasUnitState(UNIT_STAT_DIED)) GetPlayer()->RemoveSpellsCausingAura(SPELL_AURA_FEIGN_DEATH); - WorldPacket data(SMSG_STABLE_RESULT, 200); // guess size + uint32 creature_id = 0; + + { + QueryResult *result = CharacterDatabase.PQuery("SELECT entry FROM character_pet WHERE owner = '%u' AND id = '%u' AND slot >='%u' AND slot <= '%u'", + _player->GetGUIDLow(),petnumber,PET_SAVE_FIRST_STABLE_SLOT,PET_SAVE_LAST_STABLE_SLOT); + if(result) + { + Field *fields = result->Fetch(); + creature_id = fields[0].GetUInt32(); + delete result; + } + } + + if(!creature_id) + { + WorldPacket data(SMSG_STABLE_RESULT, 1); + data << uint8(0x06); + SendPacket(&data); + return; + } + + CreatureInfo const* creatureInfo = objmgr.GetCreatureTemplate(creature_id); + if(!creatureInfo || !creatureInfo->isTameable(_player->CanTameExoticPets())) + { + WorldPacket data(SMSG_STABLE_RESULT, 1); + data << uint8(0x06); + SendPacket(&data); + return; + } Pet* pet = _player->GetPet(); if(pet && pet->isAlive()) { + WorldPacket data(SMSG_STABLE_RESULT, 1); data << uint8(0x06); SendPacket(&data); return; @@ -661,28 +690,19 @@ void WorldSession::HandleUnstablePet( WorldPacket & recv_data ) if(pet) _player->RemovePet(pet,PET_SAVE_AS_DELETED); - Pet *newpet = NULL; - - QueryResult *result = CharacterDatabase.PQuery("SELECT entry FROM character_pet WHERE owner = '%u' AND id = '%u' AND slot >='%u' AND slot <= '%u'", - _player->GetGUIDLow(),petnumber,PET_SAVE_FIRST_STABLE_SLOT,PET_SAVE_LAST_STABLE_SLOT); - if(result) + Pet *newpet = new Pet(HUNTER_PET); + if(!newpet->LoadPetFromDB(_player,creature_id,petnumber)) { - Field *fields = result->Fetch(); - uint32 petentry = fields[0].GetUInt32(); - - newpet = new Pet(HUNTER_PET); - if(!newpet->LoadPetFromDB(_player,petentry,petnumber)) - { - delete newpet; - newpet = NULL; - } - delete result; + delete newpet; + newpet = NULL; + WorldPacket data(SMSG_STABLE_RESULT, 1); + data << uint8(0x06); + SendPacket(&data); + return; } - if(newpet) - data << uint8(0x09); - else - data << uint8(0x06); + WorldPacket data(SMSG_STABLE_RESULT, 1); + data << uint8(0x09); SendPacket(&data); } @@ -767,16 +787,33 @@ void WorldSession::HandleStableSwapPet( WorldPacket & recv_data ) Field *fields = result->Fetch(); - uint32 slot = fields[0].GetUInt32(); - uint32 petentry = fields[1].GetUInt32(); + uint32 slot = fields[0].GetUInt32(); + uint32 creature_id = fields[1].GetUInt32(); delete result; + if(!creature_id) + { + WorldPacket data(SMSG_STABLE_RESULT, 1); + data << uint8(0x06); + SendPacket(&data); + return; + } + + CreatureInfo const* creatureInfo = objmgr.GetCreatureTemplate(creature_id); + if(!creatureInfo || !creatureInfo->isTameable(_player->CanTameExoticPets())) + { + WorldPacket data(SMSG_STABLE_RESULT, 1); + data << uint8(0x06); + SendPacket(&data); + return; + } + // move alive pet to slot or delete dead pet _player->RemovePet(pet,pet->isAlive() ? PetSaveMode(slot) : PET_SAVE_AS_DELETED); // summon unstabled pet Pet *newpet = new Pet; - if(!newpet->LoadPetFromDB(_player,petentry,pet_number)) + if(!newpet->LoadPetFromDB(_player,creature_id,pet_number)) { delete newpet; data << uint8(0x06); diff --git a/src/game/Pet.cpp b/src/game/Pet.cpp index 78bd87966..283ee468c 100644 --- a/src/game/Pet.cpp +++ b/src/game/Pet.cpp @@ -134,8 +134,19 @@ bool Pet::LoadPetFromDB( Player* owner, uint32 petentry, uint32 petnumber, bool return false; } - uint32 pet_number = fields[0].GetUInt32(); + PetType pet_type = PetType(fields[18].GetUInt8()); + if(pet_type==HUNTER_PET) + { + CreatureInfo const* creatureInfo = objmgr.GetCreatureTemplate(petentry); + if(!creatureInfo || !creatureInfo->isTameable(owner->CanTameExoticPets())) + { + delete result; + return false; + } + } + uint32 pet_number = fields[0].GetUInt32(); + if (current && owner->IsPetNeedBeTemporaryUnsummoned()) { owner->SetTemporaryUnsummonedPetNumber(pet_number); @@ -164,7 +175,7 @@ bool Pet::LoadPetFromDB( Player* owner, uint32 petentry, uint32 petnumber, bool return false; } - setPetType(PetType(fields[18].GetUInt8())); + setPetType(pet_type); setFaction(owner->getFaction()); SetUInt32Value(UNIT_CREATED_BY_SPELL, summon_spell_id); diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 818c35a5b..61830d18e 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -3480,6 +3480,14 @@ bool Player::resetTalents(bool no_cost) //FIXME: remove pet before or after unlearn spells? for now after unlearn to allow removing of talent related, pet affecting auras RemovePet(NULL,PET_SAVE_NOT_IN_SLOT, true); + /* when prev line will dropped use next line + if(Pet* pet = GetPet()) + { + if(pet->getPetType()==HUNTER_PET && !pet->GetCreatureInfo()->isTameable(CanTameExoticPets())) + RemovePet(NULL,PET_SAVE_NOT_IN_SLOT, true); + } + */ + if(m_canTitanGrip) { diff --git a/src/game/Player.h b/src/game/Player.h index 24cd6139c..a22e7f8aa 100644 --- a/src/game/Player.h +++ b/src/game/Player.h @@ -1729,6 +1729,7 @@ class MANGOS_DLL_SPEC Player : public Unit void SetCanDualWield(bool value) { m_canDualWield = value; } bool CanTitanGrip() const { return m_canTitanGrip ; } void SetCanTitanGrip(bool value) { m_canTitanGrip = value; } + bool CanTameExoticPets() const { return isGameMaster() || HasAuraType(SPELL_AURA_ALLOW_TAME_PET_TYPE); } void SetRegularAttackTime(); void SetBaseModValue(BaseModGroup modGroup, BaseModType modType, float value) { m_auraBaseMod[modGroup][modType] = value; } diff --git a/src/game/SharedDefines.h b/src/game/SharedDefines.h index 893a6ad2a..e304f2c7c 100644 --- a/src/game/SharedDefines.h +++ b/src/game/SharedDefines.h @@ -1818,10 +1818,11 @@ enum CreatureFamily enum CreatureTypeFlags { - CREATURE_TYPEFLAGS_TAMEABLE = 0x0001, - CREATURE_TYPEFLAGS_HERBLOOT = 0x0100, - CREATURE_TYPEFLAGS_MININGLOOT = 0x0200, - CREATURE_TYPEFLAGS_ENGINEERLOOT = 0x8000 + CREATURE_TYPEFLAGS_TAMEABLE = 0x00001, + CREATURE_TYPEFLAGS_HERBLOOT = 0x00100, + CREATURE_TYPEFLAGS_MININGLOOT = 0x00200, + CREATURE_TYPEFLAGS_ENGINEERLOOT = 0x08000, + CREATURE_TYPEFLAGS_EXOTIC = 0x10000 }; enum CreatureEliteType diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index 34332c67f..053ad0f1c 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -4111,14 +4111,19 @@ SpellCastResult Spell::CheckCast(bool strict) } case SPELL_EFFECT_TAMECREATURE: { + if (m_caster->GetTypeId() != TYPEID_PLAYER) + return SPELL_FAILED_BAD_TARGETS; + if (!m_targets.getUnitTarget() || m_targets.getUnitTarget()->GetTypeId() == TYPEID_PLAYER) return SPELL_FAILED_BAD_IMPLICIT_TARGETS; - if (m_targets.getUnitTarget()->getLevel() > m_caster->getLevel()) + Creature* target = (Creature*)m_targets.getUnitTarget(); + + if (target->getLevel() > m_caster->getLevel()) return SPELL_FAILED_HIGHLEVEL; // use SMSG_PET_TAME_FAILURE? - if (!((Creature*)m_targets.getUnitTarget())->GetCreatureInfo()->isTameable ()) + if (!target->GetCreatureInfo()->isTameable (((Player*)m_caster)->CanTameExoticPets())) return SPELL_FAILED_BAD_TARGETS; if(m_caster->GetPetGUID()) diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index fd9a94e11..ab4e44b4a 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "7970" + #define REVISION_NR "7971" #endif // __REVISION_NR_H__ From ffad65fe0170a787cfe1ae9663bd3d8b48941c69 Mon Sep 17 00:00:00 2001 From: ApoC Date: Sun, 7 Jun 2009 02:13:50 +0200 Subject: [PATCH 11/14] [7972] Fixed 20186 to use base max mana instead of max current mana. Thx. to Ambient who pointed it out. Signed-off-by: ApoC --- src/game/Unit.cpp | 4 ++-- src/shared/revision_nr.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index 4b693b4db..a3ef9b4a1 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -5508,8 +5508,8 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu { if (pVictim->getPowerType() == POWER_MANA) { - // 2% of maximum mana - basepoints0 = int32(pVictim->GetMaxPower(POWER_MANA) * 2 / 100); + // 2% of maximum base mana + basepoints0 = int32(pVictim->GetCreateMana() * 2 / 100); pVictim->CastCustomSpell(pVictim, 20268, &basepoints0, NULL, NULL, true, NULL, triggeredByAura); } return true; diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index ab4e44b4a..d5e8ece38 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "7971" + #define REVISION_NR "7972" #endif // __REVISION_NR_H__ From 4668323c830769bd6fd9961f65f70bb4513bbf73 Mon Sep 17 00:00:00 2001 From: ApoC Date: Sun, 7 Jun 2009 02:15:46 +0200 Subject: [PATCH 12/14] [7973] Implemented proc for 25899. Signed-off-by: ApoC --- src/game/Unit.cpp | 4 ++-- src/shared/revision_nr.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index a3ef9b4a1..e9962cf43 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -5545,8 +5545,8 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu } break; } - // Blessing of Sanctuary - case 20911: + case 25899: // Greater Blessing of Sanctuary + case 20911: // Blessing of Sanctuary { if (target->GetTypeId() != TYPEID_PLAYER) return false; diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index d5e8ece38..2c684fd27 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "7972" + #define REVISION_NR "7973" #endif // __REVISION_NR_H__ From 1f7a7a65184fc1cb43e236a8e48ba730f3eb482d Mon Sep 17 00:00:00 2001 From: DerDyddye Date: Thu, 4 Jun 2009 22:32:14 +0200 Subject: [PATCH 13/14] [7974] Added two more achievement_criteria for `achievement_criteria_data` (T_LEVEL, T_GENDER) Its required for implementing new cases of 110 achievement criteria in 3.1.x. Ofc, this required DB support. (cherry picked from commit f06f38ba5f355885ff36d6b7e35ce56a2fad5cd7) Signed-off-by: VladimirMangos (cherry picked from commit 5347c3718b3e4c5d79e68a6d4581c449f0294af3) Patch author name fixed. Signed-off-by: VladimirMangos --- src/game/AchievementMgr.cpp | 25 ++++++++++++++++++++++++- src/game/AchievementMgr.h | 14 +++++++++++++- src/shared/revision_nr.h | 2 +- 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/src/game/AchievementMgr.cpp b/src/game/AchievementMgr.cpp index b24bc8ad2..3915a7703 100644 --- a/src/game/AchievementMgr.cpp +++ b/src/game/AchievementMgr.cpp @@ -169,6 +169,22 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) return false; } return true; + case ACHIEVEMENT_CRITERIA_DATA_TYPE_T_LEVEL: + if(level.minlevel < 0 || level.minlevel > STRONG_MAX_LEVEL) + { + sLog.outErrorDb( "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_T_LEVEL (%u) have wrong minlevel in value1 (%u), ignore.", + criteria->ID, criteria->requiredType,dataType,level.minlevel); + return false; + } + return true; + case ACHIEVEMENT_CRITERIA_DATA_TYPE_T_GENDER: + if(gender.gender > GENDER_NONE) + { + sLog.outErrorDb( "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_T_GENDER (%u) have wrong gender in value1 (%u), ignore.", + criteria->ID, criteria->requiredType,dataType,gender.gender); + return false; + } + return true; default: sLog.outErrorDb( "Table `achievement_criteria_data` (Entry: %u Type: %u) have data for not supported data type (%u), ignore.", criteria->ID, criteria->requiredType,dataType); return false; @@ -217,8 +233,15 @@ bool AchievementCriteriaData::Meets(Player const* source, Unit const* target, ui return target && target->HasAura(aura.spell_id,aura.effect_idx); case ACHIEVEMENT_CRITERIA_DATA_TYPE_VALUE: return miscvalue1 >= value.minvalue; + case ACHIEVEMENT_CRITERIA_DATA_TYPE_T_LEVEL: + if (!target) + return false; + return target->getLevel() >= level.minlevel; + case ACHIEVEMENT_CRITERIA_DATA_TYPE_T_GENDER: + if (!target) + return false; + return target->getGender() == gender.gender; } - return false; } diff --git a/src/game/AchievementMgr.h b/src/game/AchievementMgr.h index 14ca857ab..5976c4411 100644 --- a/src/game/AchievementMgr.h +++ b/src/game/AchievementMgr.h @@ -51,9 +51,11 @@ enum AchievementCriteriaDataType ACHIEVEMENT_CRITERIA_DATA_TYPE_S_AREA = 6, // area id 0 ACHIEVEMENT_CRITERIA_DATA_TYPE_T_AURA = 7, // spell_id effect_idx ACHIEVEMENT_CRITERIA_DATA_TYPE_VALUE = 8, // minvalue value provided with achievement update must be not less that limit + ACHIEVEMENT_CRITERIA_DATA_TYPE_T_LEVEL = 9, // minlevel minlevel of target + ACHIEVEMENT_CRITERIA_DATA_TYPE_T_GENDER = 10,// gender 0=male; 1=female }; -#define MAX_ACHIEVEMENT_CRITERIA_DATA_TYPE 9 // maximum value in AchievementCriteriaDataType enum +#define MAX_ACHIEVEMENT_CRITERIA_DATA_TYPE 11 // maximum value in AchievementCriteriaDataType enum class Player; class Unit; @@ -101,6 +103,16 @@ struct AchievementCriteriaData { uint32 minvalue; } value; + // ACHIEVEMENT_CRITERIA_DATA_TYPE_T_LEVEL + struct + { + uint32 minlevel; + } level; + // ACHIEVEMENT_CRITERIA_DATA_TYPE_T_GENDER + struct + { + uint32 gender; + } gender; // ... struct { diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 2c684fd27..0aea1968f 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "7973" + #define REVISION_NR "7974" #endif // __REVISION_NR_H__ From 3e4036855ce860a89a1dcfa0f321ddca1542f96e Mon Sep 17 00:00:00 2001 From: VladimirMangos Date: Sun, 7 Jun 2009 15:36:37 +0400 Subject: [PATCH 14/14] [7975] Not remove spell 34090 in 7067_03_characters_character_spell.sql. Spell can be learned independently from form. --- sql/updates/7067_03_characters_character_spell.sql | 2 +- src/shared/revision_nr.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sql/updates/7067_03_characters_character_spell.sql b/sql/updates/7067_03_characters_character_spell.sql index 7dd212210..6eaf9d20b 100644 --- a/sql/updates/7067_03_characters_character_spell.sql +++ b/sql/updates/7067_03_characters_character_spell.sql @@ -1,3 +1,3 @@ ALTER TABLE character_db_version CHANGE COLUMN required_7059_02_characters_pet_spell required_7067_03_characters_character_spell bit; -DELETE FROM `character_spell` WHERE `spell` IN (7376,3025,5419,5421,21156,7381,1178,21178,9635,21178,24905,5420,34123,33948,34090,34764,40121,40122); +DELETE FROM `character_spell` WHERE `spell` IN (7376,3025,5419,5421,21156,7381,1178,21178,9635,21178,24905,5420,34123,33948,34764,40121,40122); diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 0aea1968f..ad2ed7f14 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "7974" + #define REVISION_NR "7975" #endif // __REVISION_NR_H__