mirror of
https://github.com/mangosfour/server.git
synced 2025-12-13 22:37:03 +00:00
Merge commit 'origin/master' into 310
Conflicts: src/game/UpdateData.cpp
This commit is contained in:
commit
1f87157edf
20 changed files with 195 additions and 139 deletions
37
configure.ac
37
configure.ac
|
|
@ -163,39 +163,6 @@ Debugging options:
|
||||||
])
|
])
|
||||||
AC_MSG_RESULT($MANGOSD_DEBUG_INFO)
|
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.
|
## Check for required header files.
|
||||||
AC_HEADER_STDC
|
AC_HEADER_STDC
|
||||||
AC_HEADER_DIRENT
|
AC_HEADER_DIRENT
|
||||||
|
|
@ -211,10 +178,8 @@ AC_CHECK_HEADERS([zlib.h])
|
||||||
AC_HEADER_STDBOOL
|
AC_HEADER_STDBOOL
|
||||||
AC_C_CONST
|
AC_C_CONST
|
||||||
AC_C_INLINE
|
AC_C_INLINE
|
||||||
AC_TYPE_SIZE_T
|
|
||||||
AC_HEADER_TIME
|
AC_HEADER_TIME
|
||||||
AC_STRUCT_TM
|
AC_STRUCT_TM
|
||||||
AC_TYPE_UINT64_T
|
|
||||||
AC_C_VOLATILE
|
AC_C_VOLATILE
|
||||||
AC_CHECK_TYPES([ptrdiff_t])
|
AC_CHECK_TYPES([ptrdiff_t])
|
||||||
|
|
||||||
|
|
@ -272,8 +237,6 @@ MANGOS_LIBS="$POSTGRE_LIBS $MYSQL_LIBS $ZLIB $COMPATLIB $SSLLIB $MANGOS_LIBS"
|
||||||
## Export defined variables
|
## Export defined variables
|
||||||
AC_SUBST(DOXYGEN)
|
AC_SUBST(DOXYGEN)
|
||||||
AC_SUBST(MANGOSD_DEBUG_INFO)
|
AC_SUBST(MANGOSD_DEBUG_INFO)
|
||||||
AC_SUBST(MANGOSD_ENABLE_CLI)
|
|
||||||
AC_SUBST(MANGOSD_ENABLE_RA)
|
|
||||||
|
|
||||||
## Additional CPPFLAGS and LDFLAGS.
|
## Additional CPPFLAGS and LDFLAGS.
|
||||||
AC_SUBST(MANGOS_INCLUDES)
|
AC_SUBST(MANGOS_INCLUDES)
|
||||||
|
|
|
||||||
|
|
@ -150,7 +150,7 @@ namespace SOCKETS_NAMESPACE {
|
||||||
# error FreeBSD versions prior to 400014 does not support ipv6
|
# error FreeBSD versions prior to 400014 does not support ipv6
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
#elif defined __NetBSD__
|
#elif defined (__NetBSD__) || defined (__OpenBSD__)
|
||||||
# if !defined(MSG_NOSIGNAL)
|
# if !defined(MSG_NOSIGNAL)
|
||||||
# define MSG_NOSIGNAL 0
|
# define MSG_NOSIGNAL 0
|
||||||
# endif
|
# endif
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,10 @@
|
||||||
#include "G3D/debug.h"
|
#include "G3D/debug.h"
|
||||||
#include "G3D/format.h"
|
#include "G3D/format.h"
|
||||||
|
|
||||||
|
#if defined(__OpenBSD__)
|
||||||
|
#include <stdint.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef G3D_WIN32
|
#ifdef G3D_WIN32
|
||||||
|
|
||||||
#include <conio.h>
|
#include <conio.h>
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,3 @@
|
||||||
ALTER TABLE character_db_version CHANGE COLUMN required_7059_02_characters_pet_spell required_7067_03_characters_character_spell bit;
|
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);
|
||||||
|
|
|
||||||
|
|
@ -239,9 +239,13 @@ struct CreatureInfo
|
||||||
return SKILL_SKINNING; // normal case
|
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;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -396,7 +396,10 @@ void GameObject::Update(uint32 /*p_time*/)
|
||||||
|
|
||||||
if(GetOwnerGUID())
|
if(GetOwnerGUID())
|
||||||
{
|
{
|
||||||
m_respawnTime = 0;
|
if(Unit* owner = GetOwner())
|
||||||
|
owner->RemoveGameObject(this, false);
|
||||||
|
|
||||||
|
SetRespawnTime(0);
|
||||||
Delete();
|
Delete();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1780,7 +1780,7 @@ bool ChatHandler::HandleNpcTameCommand(const char* /*args*/)
|
||||||
|
|
||||||
CreatureInfo const* cInfo = creatureTarget->GetCreatureInfo();
|
CreatureInfo const* cInfo = creatureTarget->GetCreatureInfo();
|
||||||
|
|
||||||
if (!cInfo->isTameable ())
|
if (!cInfo->isTameable (player->CanTameExoticPets()))
|
||||||
{
|
{
|
||||||
PSendSysMessage (LANG_CREATURE_NON_TAMEABLE,cInfo->Entry);
|
PSendSysMessage (LANG_CREATURE_NON_TAMEABLE,cInfo->Entry);
|
||||||
SetSentErrorMessage (true);
|
SetSentErrorMessage (true);
|
||||||
|
|
|
||||||
|
|
@ -582,11 +582,10 @@ void WorldSession::HandleStablePet( WorldPacket & recv_data )
|
||||||
|
|
||||||
Pet *pet = _player->GetPet();
|
Pet *pet = _player->GetPet();
|
||||||
|
|
||||||
WorldPacket data(SMSG_STABLE_RESULT, 200); // guess size
|
|
||||||
|
|
||||||
// can't place in stable dead pet
|
// can't place in stable dead pet
|
||||||
if(!pet||!pet->isAlive()||pet->getPetType()!=HUNTER_PET)
|
if(!pet||!pet->isAlive()||pet->getPetType()!=HUNTER_PET)
|
||||||
{
|
{
|
||||||
|
WorldPacket data(SMSG_STABLE_RESULT, 1);
|
||||||
data << uint8(0x06);
|
data << uint8(0x06);
|
||||||
SendPacket(&data);
|
SendPacket(&data);
|
||||||
return;
|
return;
|
||||||
|
|
@ -615,6 +614,7 @@ void WorldSession::HandleStablePet( WorldPacket & recv_data )
|
||||||
delete result;
|
delete result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
WorldPacket data(SMSG_STABLE_RESULT, 1);
|
||||||
if( free_slot > 0 && free_slot <= GetPlayer()->m_stableSlots)
|
if( free_slot > 0 && free_slot <= GetPlayer()->m_stableSlots)
|
||||||
{
|
{
|
||||||
_player->RemovePet(pet,PetSaveMode(free_slot));
|
_player->RemovePet(pet,PetSaveMode(free_slot));
|
||||||
|
|
@ -647,11 +647,40 @@ void WorldSession::HandleUnstablePet( WorldPacket & recv_data )
|
||||||
if(GetPlayer()->hasUnitState(UNIT_STAT_DIED))
|
if(GetPlayer()->hasUnitState(UNIT_STAT_DIED))
|
||||||
GetPlayer()->RemoveSpellsCausingAura(SPELL_AURA_FEIGN_DEATH);
|
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();
|
Pet* pet = _player->GetPet();
|
||||||
if(pet && pet->isAlive())
|
if(pet && pet->isAlive())
|
||||||
{
|
{
|
||||||
|
WorldPacket data(SMSG_STABLE_RESULT, 1);
|
||||||
data << uint8(0x06);
|
data << uint8(0x06);
|
||||||
SendPacket(&data);
|
SendPacket(&data);
|
||||||
return;
|
return;
|
||||||
|
|
@ -661,28 +690,19 @@ void WorldSession::HandleUnstablePet( WorldPacket & recv_data )
|
||||||
if(pet)
|
if(pet)
|
||||||
_player->RemovePet(pet,PET_SAVE_AS_DELETED);
|
_player->RemovePet(pet,PET_SAVE_AS_DELETED);
|
||||||
|
|
||||||
Pet *newpet = NULL;
|
Pet *newpet = new Pet(HUNTER_PET);
|
||||||
|
if(!newpet->LoadPetFromDB(_player,creature_id,petnumber))
|
||||||
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();
|
|
||||||
uint32 petentry = fields[0].GetUInt32();
|
|
||||||
|
|
||||||
newpet = new Pet(HUNTER_PET);
|
|
||||||
if(!newpet->LoadPetFromDB(_player,petentry,petnumber))
|
|
||||||
{
|
{
|
||||||
delete newpet;
|
delete newpet;
|
||||||
newpet = NULL;
|
newpet = NULL;
|
||||||
}
|
WorldPacket data(SMSG_STABLE_RESULT, 1);
|
||||||
delete result;
|
data << uint8(0x06);
|
||||||
|
SendPacket(&data);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(newpet)
|
WorldPacket data(SMSG_STABLE_RESULT, 1);
|
||||||
data << uint8(0x09);
|
data << uint8(0x09);
|
||||||
else
|
|
||||||
data << uint8(0x06);
|
|
||||||
SendPacket(&data);
|
SendPacket(&data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -768,15 +788,32 @@ void WorldSession::HandleStableSwapPet( WorldPacket & recv_data )
|
||||||
Field *fields = result->Fetch();
|
Field *fields = result->Fetch();
|
||||||
|
|
||||||
uint32 slot = fields[0].GetUInt32();
|
uint32 slot = fields[0].GetUInt32();
|
||||||
uint32 petentry = fields[1].GetUInt32();
|
uint32 creature_id = fields[1].GetUInt32();
|
||||||
delete result;
|
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
|
// move alive pet to slot or delete dead pet
|
||||||
_player->RemovePet(pet,pet->isAlive() ? PetSaveMode(slot) : PET_SAVE_AS_DELETED);
|
_player->RemovePet(pet,pet->isAlive() ? PetSaveMode(slot) : PET_SAVE_AS_DELETED);
|
||||||
|
|
||||||
// summon unstabled pet
|
// summon unstabled pet
|
||||||
Pet *newpet = new Pet;
|
Pet *newpet = new Pet;
|
||||||
if(!newpet->LoadPetFromDB(_player,petentry,pet_number))
|
if(!newpet->LoadPetFromDB(_player,creature_id,pet_number))
|
||||||
{
|
{
|
||||||
delete newpet;
|
delete newpet;
|
||||||
data << uint8(0x06);
|
data << uint8(0x06);
|
||||||
|
|
|
||||||
|
|
@ -134,6 +134,17 @@ bool Pet::LoadPetFromDB( Player* owner, uint32 petentry, uint32 petnumber, bool
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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();
|
uint32 pet_number = fields[0].GetUInt32();
|
||||||
|
|
||||||
if (current && owner->IsPetNeedBeTemporaryUnsummoned())
|
if (current && owner->IsPetNeedBeTemporaryUnsummoned())
|
||||||
|
|
@ -164,7 +175,7 @@ bool Pet::LoadPetFromDB( Player* owner, uint32 petentry, uint32 petnumber, bool
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
setPetType(PetType(fields[18].GetUInt8()));
|
setPetType(pet_type);
|
||||||
setFaction(owner->getFaction());
|
setFaction(owner->getFaction());
|
||||||
SetUInt32Value(UNIT_CREATED_BY_SPELL, summon_spell_id);
|
SetUInt32Value(UNIT_CREATED_BY_SPELL, summon_spell_id);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3482,6 +3482,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
|
//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);
|
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)
|
if(m_canTitanGrip)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -1747,6 +1747,7 @@ class MANGOS_DLL_SPEC Player : public Unit
|
||||||
void SetCanDualWield(bool value) { m_canDualWield = value; }
|
void SetCanDualWield(bool value) { m_canDualWield = value; }
|
||||||
bool CanTitanGrip() const { return m_canTitanGrip ; }
|
bool CanTitanGrip() const { return m_canTitanGrip ; }
|
||||||
void SetCanTitanGrip(bool value) { m_canTitanGrip = value; }
|
void SetCanTitanGrip(bool value) { m_canTitanGrip = value; }
|
||||||
|
bool CanTameExoticPets() const { return isGameMaster() || HasAuraType(SPELL_AURA_ALLOW_TAME_PET_TYPE); }
|
||||||
|
|
||||||
void SetRegularAttackTime();
|
void SetRegularAttackTime();
|
||||||
void SetBaseModValue(BaseModGroup modGroup, BaseModType modType, float value) { m_auraBaseMod[modGroup][modType] = value; }
|
void SetBaseModValue(BaseModGroup modGroup, BaseModType modType, float value) { m_auraBaseMod[modGroup][modType] = value; }
|
||||||
|
|
|
||||||
|
|
@ -1821,10 +1821,11 @@ enum CreatureFamily
|
||||||
|
|
||||||
enum CreatureTypeFlags
|
enum CreatureTypeFlags
|
||||||
{
|
{
|
||||||
CREATURE_TYPEFLAGS_TAMEABLE = 0x0001,
|
CREATURE_TYPEFLAGS_TAMEABLE = 0x00001,
|
||||||
CREATURE_TYPEFLAGS_HERBLOOT = 0x0100,
|
CREATURE_TYPEFLAGS_HERBLOOT = 0x00100,
|
||||||
CREATURE_TYPEFLAGS_MININGLOOT = 0x0200,
|
CREATURE_TYPEFLAGS_MININGLOOT = 0x00200,
|
||||||
CREATURE_TYPEFLAGS_ENGINEERLOOT = 0x8000
|
CREATURE_TYPEFLAGS_ENGINEERLOOT = 0x08000,
|
||||||
|
CREATURE_TYPEFLAGS_EXOTIC = 0x10000
|
||||||
};
|
};
|
||||||
|
|
||||||
enum CreatureEliteType
|
enum CreatureEliteType
|
||||||
|
|
|
||||||
|
|
@ -1561,7 +1561,8 @@ void Spell::SetTargetMap(uint32 i,uint32 cur,UnitList& TagUnitMap)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Unit* pUnitTarget = m_targets.getUnitTarget();
|
Unit* pUnitTarget = m_targets.getUnitTarget();
|
||||||
if(!pUnitTarget)
|
Unit* originalCaster = GetOriginalCaster();
|
||||||
|
if(!pUnitTarget || !originalCaster)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
unMaxTargets = EffectChainTarget;
|
unMaxTargets = EffectChainTarget;
|
||||||
|
|
@ -1578,28 +1579,22 @@ void Spell::SetTargetMap(uint32 i,uint32 cur,UnitList& TagUnitMap)
|
||||||
cell.data.Part.reserved = ALL_DISTRICT;
|
cell.data.Part.reserved = ALL_DISTRICT;
|
||||||
cell.SetNoCreate();
|
cell.SetNoCreate();
|
||||||
|
|
||||||
Unit* originalCaster = GetOriginalCaster();
|
|
||||||
if(originalCaster)
|
|
||||||
{
|
|
||||||
std::list<Unit *> tempUnitMap;
|
std::list<Unit *> tempUnitMap;
|
||||||
|
|
||||||
{
|
{
|
||||||
MaNGOS::AnyAoETargetUnitInObjectRangeCheck u_check(pUnitTarget, originalCaster, max_range, false);
|
MaNGOS::AnyAoETargetUnitInObjectRangeCheck u_check(pUnitTarget, originalCaster, max_range, false);
|
||||||
MaNGOS::UnitListSearcher<MaNGOS::AnyAoETargetUnitInObjectRangeCheck> searcher(m_caster, tempUnitMap, u_check);
|
MaNGOS::UnitListSearcher<MaNGOS::AnyAoETargetUnitInObjectRangeCheck> searcher(m_caster, tempUnitMap, u_check);
|
||||||
|
|
||||||
TypeContainerVisitor<MaNGOS::UnitListSearcher<MaNGOS::AnyAoETargetUnitInObjectRangeCheck>, WorldTypeMapContainer> world_unit_searcher(searcher);
|
TypeContainerVisitor<MaNGOS::UnitListSearcher<MaNGOS::AnyAoETargetUnitInObjectRangeCheck>, WorldTypeMapContainer> world_unit_searcher(searcher);
|
||||||
TypeContainerVisitor<MaNGOS::UnitListSearcher<MaNGOS::AnyAoETargetUnitInObjectRangeCheck>, GridTypeMapContainer> grid_unit_searcher(searcher);
|
TypeContainerVisitor<MaNGOS::UnitListSearcher<MaNGOS::AnyAoETargetUnitInObjectRangeCheck>, GridTypeMapContainer> grid_unit_searcher(searcher);
|
||||||
|
|
||||||
CellLock<GridReadGuard> cell_lock(cell, p);
|
CellLock<GridReadGuard> cell_lock(cell, p);
|
||||||
|
|
||||||
cell_lock->Visit(cell_lock, world_unit_searcher, *m_caster->GetMap());
|
cell_lock->Visit(cell_lock, world_unit_searcher, *m_caster->GetMap());
|
||||||
cell_lock->Visit(cell_lock, grid_unit_searcher, *m_caster->GetMap());
|
cell_lock->Visit(cell_lock, grid_unit_searcher, *m_caster->GetMap());
|
||||||
}
|
}
|
||||||
|
|
||||||
tempUnitMap.sort(TargetDistanceOrder(pUnitTarget));
|
|
||||||
|
|
||||||
if (tempUnitMap.empty())
|
if (tempUnitMap.empty())
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
tempUnitMap.sort(TargetDistanceOrder(pUnitTarget));
|
||||||
|
|
||||||
if (*tempUnitMap.begin() == pUnitTarget)
|
if (*tempUnitMap.begin() == pUnitTarget)
|
||||||
tempUnitMap.erase (tempUnitMap.begin());
|
tempUnitMap.erase (tempUnitMap.begin());
|
||||||
|
|
||||||
|
|
@ -1612,23 +1607,19 @@ void Spell::SetTargetMap(uint32 i,uint32 cur,UnitList& TagUnitMap)
|
||||||
{
|
{
|
||||||
if (!prev->IsWithinDist (*next,CHAIN_SPELL_JUMP_RADIUS))
|
if (!prev->IsWithinDist (*next,CHAIN_SPELL_JUMP_RADIUS))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (!prev->IsWithinLOSInMap (*next))
|
if (!prev->IsWithinLOSInMap (*next))
|
||||||
{
|
{
|
||||||
++next;
|
++next;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
prev = *next;
|
prev = *next;
|
||||||
TagUnitMap.push_back(prev);
|
TagUnitMap.push_back(prev);
|
||||||
tempUnitMap.erase(next);
|
tempUnitMap.erase(next);
|
||||||
tempUnitMap.sort (TargetDistanceOrder(prev));
|
tempUnitMap.sort (TargetDistanceOrder(prev));
|
||||||
next = tempUnitMap.begin();
|
next = tempUnitMap.begin();
|
||||||
|
|
||||||
--t;
|
--t;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}break;
|
}break;
|
||||||
case TARGET_ALL_ENEMY_IN_AREA:
|
case TARGET_ALL_ENEMY_IN_AREA:
|
||||||
{
|
{
|
||||||
|
|
@ -4119,14 +4110,19 @@ SpellCastResult Spell::CheckCast(bool strict)
|
||||||
}
|
}
|
||||||
case SPELL_EFFECT_TAMECREATURE:
|
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)
|
if (!m_targets.getUnitTarget() || m_targets.getUnitTarget()->GetTypeId() == TYPEID_PLAYER)
|
||||||
return SPELL_FAILED_BAD_IMPLICIT_TARGETS;
|
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;
|
return SPELL_FAILED_HIGHLEVEL;
|
||||||
|
|
||||||
// use SMSG_PET_TAME_FAILURE?
|
// 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;
|
return SPELL_FAILED_BAD_TARGETS;
|
||||||
|
|
||||||
if(m_caster->GetPetGUID())
|
if(m_caster->GetPetGUID())
|
||||||
|
|
|
||||||
|
|
@ -2023,7 +2023,7 @@ void Aura::TriggerSpellWithValue()
|
||||||
uint32 trigger_spell_id = GetSpellProto()->EffectTriggerSpell[m_effIndex];
|
uint32 trigger_spell_id = GetSpellProto()->EffectTriggerSpell[m_effIndex];
|
||||||
int32 basepoints0 = this->GetModifier()->m_amount;
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*********************************************************/
|
/*********************************************************/
|
||||||
|
|
@ -6416,7 +6416,7 @@ void Aura::PeriodicDummyTick()
|
||||||
// Increases your attack power by $s1 for every $s2 armor value you have.
|
// Increases your attack power by $s1 for every $s2 armor value you have.
|
||||||
// Calculate AP bonus (from 1 efect of this spell)
|
// 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);
|
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;
|
return;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
@ -6439,7 +6439,7 @@ void Aura::PeriodicDummyTick()
|
||||||
int32 mod = (rage < 100) ? rage : 100;
|
int32 mod = (rage < 100) ? rage : 100;
|
||||||
int32 points = m_target->CalculateSpellDamage(spell, 1, spell->EffectBasePoints[1], m_target);
|
int32 points = m_target->CalculateSpellDamage(spell, 1, spell->EffectBasePoints[1], m_target);
|
||||||
int32 regen = m_target->GetMaxHealth() * (mod * points / 10) / 1000;
|
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);
|
m_target->SetPower(POWER_RAGE, rage-mod);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -6511,11 +6511,11 @@ void Aura::PeriodicDummyTick()
|
||||||
// Full damage to target at 0 tick
|
// Full damage to target at 0 tick
|
||||||
if (m_duration > m_modifier.periodictime)
|
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;
|
return;
|
||||||
}
|
}
|
||||||
damage/=4;
|
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;
|
return;
|
||||||
}
|
}
|
||||||
switch (spell->Id)
|
switch (spell->Id)
|
||||||
|
|
@ -6556,7 +6556,7 @@ void Aura::PeriodicDummyTick()
|
||||||
if (spell->SpellFamilyFlags & UI64LIT(0x0000000000000020))
|
if (spell->SpellFamilyFlags & UI64LIT(0x0000000000000020))
|
||||||
{
|
{
|
||||||
if (caster)
|
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;
|
return;
|
||||||
}
|
}
|
||||||
// Raise Dead
|
// Raise Dead
|
||||||
|
|
@ -6589,7 +6589,7 @@ void Aura::PeriodicDummyTick()
|
||||||
// Increases your attack power by $s1 for every $s2 armor value you have.
|
// Increases your attack power by $s1 for every $s2 armor value you have.
|
||||||
// Calculate AP bonus (from 1 efect of this spell)
|
// 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);
|
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;
|
return;
|
||||||
}
|
}
|
||||||
// Reaping
|
// Reaping
|
||||||
|
|
|
||||||
|
|
@ -302,8 +302,8 @@ void Player::UpdateAttackPowerAndDamage(bool ranged )
|
||||||
Unit::AuraList const& mDummy = GetAurasByType(SPELL_AURA_DUMMY);
|
Unit::AuraList const& mDummy = GetAurasByType(SPELL_AURA_DUMMY);
|
||||||
for(Unit::AuraList::const_iterator itr = mDummy.begin(); itr != mDummy.end(); ++itr)
|
for(Unit::AuraList::const_iterator itr = mDummy.begin(); itr != mDummy.end(); ++itr)
|
||||||
{
|
{
|
||||||
// Predatory Strikes
|
// Predatory Strikes (effect 0)
|
||||||
if ((*itr)->GetSpellProto()->SpellIconID == 1563)
|
if ((*itr)->GetEffIndex()==0 && (*itr)->GetSpellProto()->SpellIconID == 1563)
|
||||||
{
|
{
|
||||||
mLevelMult = (*itr)->GetModifier()->m_amount / 100.0f;
|
mLevelMult = (*itr)->GetModifier()->m_amount / 100.0f;
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
|
|
@ -1808,7 +1808,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.
|
// 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 absorbed = RemainingDamage * currentAbsorb / 100;
|
||||||
int32 regen = absorbed * 2 / 10;
|
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;
|
RemainingDamage -= absorbed;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
@ -5506,14 +5506,18 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
|
||||||
int32 holy = caster->SpellBaseDamageBonus(SPELL_SCHOOL_MASK_HOLY) +
|
int32 holy = caster->SpellBaseDamageBonus(SPELL_SCHOOL_MASK_HOLY) +
|
||||||
caster->SpellBaseDamageBonusForVictim(SPELL_SCHOOL_MASK_HOLY, this);
|
caster->SpellBaseDamageBonusForVictim(SPELL_SCHOOL_MASK_HOLY, this);
|
||||||
basepoints0 = int32(ap*0.10f + 0.10f*holy);
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
// Judgement of Wisdom
|
// Judgement of Wisdom
|
||||||
case 20186:
|
case 20186:
|
||||||
{
|
{
|
||||||
if (pVictim->getPowerType() == POWER_MANA)
|
if (pVictim->getPowerType() == POWER_MANA)
|
||||||
pVictim->CastSpell(pVictim, 20268, true, 0, triggeredByAura);
|
{
|
||||||
|
// 2% of maximum base mana
|
||||||
|
basepoints0 = int32(pVictim->GetCreateMana() * 2 / 100);
|
||||||
|
pVictim->CastCustomSpell(pVictim, 20268, &basepoints0, NULL, NULL, true, NULL, triggeredByAura);
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
// Holy Power (Redemption Armor set)
|
// Holy Power (Redemption Armor set)
|
||||||
|
|
@ -5547,6 +5551,29 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case 25899: // Greater Blessing of Sanctuary
|
||||||
|
case 20911: // Blessing of Sanctuary
|
||||||
|
{
|
||||||
|
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)
|
// Seal of Vengeance (damage calc on apply aura)
|
||||||
case 31801:
|
case 31801:
|
||||||
{
|
{
|
||||||
|
|
@ -5640,7 +5667,7 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
|
||||||
if (procSpell->Effect[i] == SPELL_EFFECT_ENERGIZE)
|
if (procSpell->Effect[i] == SPELL_EFFECT_ENERGIZE)
|
||||||
{
|
{
|
||||||
int32 mana = procSpell->EffectBasePoints[i];
|
int32 mana = procSpell->EffectBasePoints[i];
|
||||||
CastCustomSpell(this, 54986, 0, &mana, 0, true, castItem, triggeredByAura);
|
CastCustomSpell(this, 54986, NULL, &mana, NULL, true, castItem, triggeredByAura);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|
@ -6870,7 +6897,7 @@ bool Unit::HandleOverrideClassScriptAuraProc(Unit *pVictim, uint32 damage, Aura
|
||||||
return false;
|
return false;
|
||||||
int32 cost = procSpell->manaCost + procSpell->ManaCostPercentage * GetCreateMana() / 100;
|
int32 cost = procSpell->manaCost + procSpell->ManaCostPercentage * GetCreateMana() / 100;
|
||||||
int32 basepoints0 = cost * triggeredByAura->GetModifier()->m_amount/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;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -10763,6 +10790,7 @@ void Unit::ProcDamageAndSpellFor( bool isVictim, Unit * pTarget, uint32 procFlag
|
||||||
DealSpellDamage(&damageInfo, true);
|
DealSpellDamage(&damageInfo, true);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN:
|
||||||
case SPELL_AURA_MANA_SHIELD:
|
case SPELL_AURA_MANA_SHIELD:
|
||||||
case SPELL_AURA_OBS_MOD_MANA:
|
case SPELL_AURA_OBS_MOD_MANA:
|
||||||
case SPELL_AURA_DUMMY:
|
case SPELL_AURA_DUMMY:
|
||||||
|
|
|
||||||
|
|
@ -309,7 +309,7 @@ class ByteBuffer
|
||||||
}
|
}
|
||||||
void append(const ByteBuffer& buffer)
|
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)
|
void appendPackGUID(uint64 guid)
|
||||||
|
|
|
||||||
|
|
@ -79,16 +79,16 @@ class MANGOS_DLL_SPEC Database
|
||||||
template<class Class, typename ParamType1>
|
template<class Class, typename ParamType1>
|
||||||
bool AsyncPQuery(Class *object, void (Class::*method)(QueryResult*, ParamType1), ParamType1 param1, const char *format,...) ATTR_PRINTF(5,6);
|
bool AsyncPQuery(Class *object, void (Class::*method)(QueryResult*, ParamType1), ParamType1 param1, const char *format,...) ATTR_PRINTF(5,6);
|
||||||
template<class Class, typename ParamType1, typename ParamType2>
|
template<class Class, typename ParamType1, typename ParamType2>
|
||||||
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<class Class, typename ParamType1, typename ParamType2, typename ParamType3>
|
template<class Class, typename ParamType1, typename ParamType2, typename ParamType3>
|
||||||
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
|
// PQuery / static
|
||||||
template<typename ParamType1>
|
template<typename ParamType1>
|
||||||
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<typename ParamType1, typename ParamType2>
|
template<typename ParamType1, typename ParamType2>
|
||||||
bool AsyncPQuery(void (*method)(QueryResult*, ParamType1, ParamType2), ParamType1 param1, ParamType2 param2, const char *format,...) ATTR_PRINTF(5,6);
|
bool AsyncPQuery(void (*method)(QueryResult*, ParamType1, ParamType2), ParamType1 param1, ParamType2 param2, const char *format,...) ATTR_PRINTF(5,6);
|
||||||
template<typename ParamType1, typename ParamType2, typename ParamType3>
|
template<typename ParamType1, typename ParamType2, typename ParamType3>
|
||||||
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<class Class>
|
template<class Class>
|
||||||
// QueryHolder
|
// QueryHolder
|
||||||
bool DelayQueryHolder(Class *object, void (Class::*method)(QueryResult*, SqlQueryHolder*), SqlQueryHolder *holder);
|
bool DelayQueryHolder(Class *object, void (Class::*method)(QueryResult*, SqlQueryHolder*), SqlQueryHolder *holder);
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef __REVISION_NR_H__
|
#ifndef __REVISION_NR_H__
|
||||||
#define __REVISION_NR_H__
|
#define __REVISION_NR_H__
|
||||||
#define REVISION_NR "7961"
|
#define REVISION_NR "7975"
|
||||||
#endif // __REVISION_NR_H__
|
#endif // __REVISION_NR_H__
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue