aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2016-07-13 16:53:50 +0200
committerShauren <shauren.trinity@gmail.com>2016-07-13 17:08:40 +0200
commit63212069380ac31b2ff56829458ad33c74bcdc5c (patch)
tree539888152342683f5cc09329dbf938be36c1750b /src
parent776b0a3c8585afedce65b1e0a63b431231a13cd1 (diff)
parentdb85bad1ff349d2e710de34d2a3dd8ae2a2a07a8 (diff)
Merge branch '6.x' of https://github.com/TrinityCore/TrinityCore into legion
Diffstat (limited to 'src')
-rw-r--r--src/server/game/AI/CreatureAI.h8
-rw-r--r--src/server/game/Entities/GameObject/GameObject.cpp11
-rw-r--r--src/server/game/Entities/Item/Item.cpp37
-rw-r--r--src/server/game/Entities/Object/Object.cpp46
-rw-r--r--src/server/game/Entities/Object/Object.h32
-rw-r--r--src/server/game/Entities/Player/Player.h1
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp55
-rw-r--r--src/server/game/Entities/Unit/Unit.h4
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp2
9 files changed, 125 insertions, 71 deletions
diff --git a/src/server/game/AI/CreatureAI.h b/src/server/game/AI/CreatureAI.h
index f175050e107..a2c5bb0db3e 100644
--- a/src/server/game/AI/CreatureAI.h
+++ b/src/server/game/AI/CreatureAI.h
@@ -127,6 +127,14 @@ class TC_GAME_API CreatureAI : public UnitAI
virtual void SummonedCreatureDespawn(Creature* /*summon*/) { }
virtual void SummonedCreatureDies(Creature* /*summon*/, Unit* /*killer*/) { }
+ // Called when the creature successfully summons a gameobject
+ virtual void JustSummonedGameobject(GameObject* /*gameobject*/) { }
+ virtual void SummonedGameobjectDespawn(GameObject* /*gameobject*/) { }
+
+ // Called when the creature successfully registers a dynamicobject
+ virtual void JustRegisteredDynObject(DynamicObject* /*dynObject*/) { }
+ virtual void JustUnregisteredDynObject(DynamicObject* /*dynObject*/) { }
+
// Called when hit by a spell
virtual void SpellHit(Unit* /*caster*/, SpellInfo const* /*spell*/) { }
diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp
index 1ca20e0c4cc..eb7b3ec9d85 100644
--- a/src/server/game/Entities/GameObject/GameObject.cpp
+++ b/src/server/game/Entities/GameObject/GameObject.cpp
@@ -34,7 +34,6 @@
#include "UpdateFieldFlags.h"
#include "World.h"
#include "Transport.h"
-#include <boost/dynamic_bitset.hpp>
GameObject::GameObject() : WorldObject(false), MapObject(),
m_model(NULL), m_goValue(), m_AI(NULL), _animKitId(0)
@@ -2303,16 +2302,16 @@ void GameObject::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player* t
bool forcedFlags = GetGoType() == GAMEOBJECT_TYPE_CHEST && GetGOInfo()->chest.usegrouplootrules && HasLootRecipient();
bool targetIsGM = target->IsGameMaster();
- boost::dynamic_bitset<uint32> updateMask(m_valuesCount);
+ std::size_t blockCount = UpdateMask::GetBlockCount(m_valuesCount);
uint32* flags = GameObjectUpdateFieldFlags;
uint32 visibleFlag = UF_FLAG_PUBLIC;
if (GetOwnerGUID() == target->GetGUID())
visibleFlag |= UF_FLAG_OWNER;
- *data << uint8(updateMask.num_blocks());
+ *data << uint8(blockCount);
std::size_t maskPos = data->wpos();
- data->resize(data->size() + updateMask.num_blocks() * sizeof(uint32));
+ data->resize(data->size() + blockCount * sizeof(UpdateMask::BlockType));
for (uint16 index = 0; index < m_valuesCount; ++index)
{
@@ -2320,7 +2319,7 @@ void GameObject::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player* t
((updateType == UPDATETYPE_VALUES ? _changesMask[index] : m_uint32Values[index]) && (flags[index] & visibleFlag)) ||
(index == GAMEOBJECT_FLAGS && forcedFlags))
{
- updateMask.set(index);
+ UpdateMask::SetUpdateBit(data->contents() + maskPos, index);
if (index == OBJECT_DYNAMIC_FLAGS)
{
@@ -2394,8 +2393,6 @@ void GameObject::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player* t
*data << m_uint32Values[index]; // other cases
}
}
-
- boost::to_block_range(updateMask, reinterpret_cast<uint32*>(data->contents() + maskPos));
}
void GameObject::GetRespawnPosition(float &x, float &y, float &z, float* ori /* = NULL*/) const
diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp
index 2372318ad2d..5acfa65ee7b 100644
--- a/src/server/game/Entities/Item/Item.cpp
+++ b/src/server/game/Entities/Item/Item.cpp
@@ -33,7 +33,6 @@
#include "TradeData.h"
#include "GameTables.h"
#include "CollectionMgr.h"
-#include <boost/dynamic_bitset.hpp>
void AddItemsSetItem(Player* player, Item* item)
{
@@ -1244,14 +1243,14 @@ void Item::BuildDynamicValuesUpdate(uint8 updateType, ByteBuffer* data, Player*
if (!target)
return;
- boost::dynamic_bitset<uint32> updateMask(_dynamicValuesCount);
+ std::size_t blockCount = UpdateMask::GetBlockCount(_dynamicValuesCount);
uint32* flags = nullptr;
uint32 visibleFlag = GetDynamicUpdateFieldData(target, flags);
- *data << uint8(updateMask.num_blocks());
+ *data << uint8(blockCount);
std::size_t maskPos = data->wpos();
- data->resize(data->size() + updateMask.num_blocks() * sizeof(uint32));
+ data->resize(data->size() + blockCount * sizeof(UpdateMask::BlockType));
for (uint16 index = 0; index < _dynamicValuesCount; ++index)
{
@@ -1259,43 +1258,45 @@ void Item::BuildDynamicValuesUpdate(uint8 updateType, ByteBuffer* data, Player*
if (_fieldNotifyFlags & flags[index] ||
((updateType == UPDATETYPE_VALUES ? _dynamicChangesMask[index] : !values.empty()) && (flags[index] & visibleFlag)))
{
- updateMask.set(index);
+ UpdateMask::SetUpdateBit(data->contents() + maskPos, index);
- boost::dynamic_bitset<uint32> arrayMask(values.size());
- *data << uint16(arrayMask.num_blocks());
- std::size_t fieldMaskPos = data->wpos();
- data->resize(data->size() + arrayMask.num_blocks() * sizeof(uint32));
+ std::size_t arrayBlockCount = UpdateMask::GetBlockCount(values.size());
+ *data << uint16(UpdateMask::EncodeDynamicFieldChangeType(arrayBlockCount, _dynamicChangesMask[index], updateType));
+ if (_dynamicChangesMask[index] == UpdateMask::VALUE_AND_SIZE_CHANGED && updateType == UPDATETYPE_VALUES)
+ *data << uint32(values.size());
+
+ std::size_t arrayMaskPos = data->wpos();
+ data->resize(data->size() + arrayBlockCount * sizeof(UpdateMask::BlockType));
if (index != ITEM_DYNAMIC_FIELD_MODIFIERS)
{
for (std::size_t v = 0; v < values.size(); ++v)
{
if (updateType == UPDATETYPE_VALUES ? _dynamicChangesArrayMask[index][v] : values[v])
{
- arrayMask.set(v);
+ UpdateMask::SetUpdateBit(data->contents() + arrayMaskPos, v);
*data << uint32(values[v]);
}
}
-
}
else
{
// in case of ITEM_DYNAMIC_FIELD_MODIFIERS it is ITEM_FIELD_MODIFIERS_MASK that controls index of each value, not updatemask
// so we just have to write this starting from 0 index
- for (std::size_t v = 0, m = 0; v < values.size(); ++v)
+ uint32 m = 0;
+ for (std::size_t v = 0; v < values.size(); ++v)
{
- if (values[v] || _dynamicChangesArrayMask[index][v])
+ if (values[v])
{
- arrayMask.set(m++);
+ UpdateMask::SetUpdateBit(data->contents() + arrayMaskPos, m++);
*data << uint32(values[v]);
}
}
- }
- boost::to_block_range(arrayMask, reinterpret_cast<uint32*>(data->contents() + fieldMaskPos));
+ if (_changesMask[ITEM_FIELD_MODIFIERS_MASK] && updateType == UPDATETYPE_VALUES)
+ data->put(arrayMaskPos - sizeof(m), m);
+ }
}
}
-
- boost::to_block_range(updateMask, reinterpret_cast<uint32*>(data->contents() + maskPos));
}
void Item::AddToObjectUpdate()
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp
index d61fdf09c93..d6157b43dde 100644
--- a/src/server/game/Entities/Object/Object.cpp
+++ b/src/server/game/Entities/Object/Object.cpp
@@ -45,7 +45,6 @@
#include "BattlefieldMgr.h"
#include "GameObjectPackets.h"
#include "MiscPackets.h"
-#include <boost/dynamic_bitset.hpp>
Object::Object()
{
@@ -764,27 +763,25 @@ void Object::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player* targe
if (!target)
return;
- boost::dynamic_bitset<uint32> updateMask(m_valuesCount);
+ std::size_t blockCount = UpdateMask::GetBlockCount(m_valuesCount);
uint32* flags = NULL;
uint32 visibleFlag = GetUpdateFieldData(target, flags);
ASSERT(flags);
- *data << uint8(updateMask.num_blocks());
+ *data << uint8(blockCount);
std::size_t maskPos = data->wpos();
- data->resize(data->size() + updateMask.num_blocks() * sizeof(uint32));
+ data->resize(data->size() + blockCount * sizeof(UpdateMask::BlockType));
for (uint16 index = 0; index < m_valuesCount; ++index)
{
if (_fieldNotifyFlags & flags[index] ||
((updateType == UPDATETYPE_VALUES ? _changesMask[index] : m_uint32Values[index]) && (flags[index] & visibleFlag)))
{
- updateMask.set(index);
+ UpdateMask::SetUpdateBit(data->contents() + maskPos, index);
*data << m_uint32Values[index];
}
}
-
- boost::to_block_range(updateMask, reinterpret_cast<uint32*>(data->contents() + maskPos));
}
void Object::BuildDynamicValuesUpdate(uint8 updateType, ByteBuffer* data, Player* target) const
@@ -792,14 +789,14 @@ void Object::BuildDynamicValuesUpdate(uint8 updateType, ByteBuffer* data, Player
if (!target)
return;
- boost::dynamic_bitset<uint32> updateMask(_dynamicValuesCount);
+ std::size_t blockCount = UpdateMask::GetBlockCount(_dynamicValuesCount);
uint32* flags = nullptr;
uint32 visibleFlag = GetDynamicUpdateFieldData(target, flags);
- *data << uint8(updateMask.num_blocks());
+ *data << uint8(blockCount);
std::size_t maskPos = data->wpos();
- data->resize(data->size() + updateMask.num_blocks() * sizeof(uint32));
+ data->resize(data->size() + blockCount * sizeof(UpdateMask::BlockType));
for (uint16 index = 0; index < _dynamicValuesCount; ++index)
{
@@ -807,26 +804,25 @@ void Object::BuildDynamicValuesUpdate(uint8 updateType, ByteBuffer* data, Player
if (_fieldNotifyFlags & flags[index] ||
((updateType == UPDATETYPE_VALUES ? _dynamicChangesMask[index] : !values.empty()) && (flags[index] & visibleFlag)))
{
- updateMask.set(index);
+ UpdateMask::SetUpdateBit(data->contents() + maskPos, index);
+
+ std::size_t arrayBlockCount = UpdateMask::GetBlockCount(values.size());
+ *data << uint16(UpdateMask::EncodeDynamicFieldChangeType(arrayBlockCount, _dynamicChangesMask[index], updateType));
+ if (_dynamicChangesMask[index] == UpdateMask::VALUE_AND_SIZE_CHANGED && updateType == UPDATETYPE_VALUES)
+ *data << uint32(values.size());
- boost::dynamic_bitset<uint32> arrayMask(values.size());
- *data << uint16(arrayMask.num_blocks());
- std::size_t fieldMaskPos = data->wpos();
- data->resize(data->size() + arrayMask.num_blocks() * sizeof(uint32));
+ std::size_t arrayMaskPos = data->wpos();
+ data->resize(data->size() + arrayBlockCount * sizeof(UpdateMask::BlockType));
for (std::size_t v = 0; v < values.size(); ++v)
{
if (updateType == UPDATETYPE_VALUES ? _dynamicChangesArrayMask[index][v] : values[v])
{
- arrayMask.set(v);
+ UpdateMask::SetUpdateBit(data->contents() + arrayMaskPos, v);
*data << uint32(values[v]);
}
}
-
- boost::to_block_range(arrayMask, reinterpret_cast<uint32*>(data->contents() + fieldMaskPos));
}
}
-
- boost::to_block_range(updateMask, reinterpret_cast<uint32*>(data->contents() + maskPos));
}
void Object::AddToObjectUpdateIfNeeded()
@@ -1378,7 +1374,7 @@ void Object::RemoveDynamicValue(uint16 index, uint32 value)
if (values[i] == value)
{
values[i] = 0;
- _dynamicChangesMask[index] = 1;
+ _dynamicChangesMask[index] = UpdateMask::VALUE_CHANGED;
_dynamicChangesArrayMask[index][i] = 1;
AddToObjectUpdateIfNeeded();
@@ -1393,7 +1389,7 @@ void Object::ClearDynamicValue(uint16 index)
if (!_dynamicValues[index].empty())
{
_dynamicValues[index].clear();
- _dynamicChangesMask[index] = 1;
+ _dynamicChangesMask[index] = UpdateMask::VALUE_AND_SIZE_CHANGED;
_dynamicChangesArrayMask[index].clear();
AddToObjectUpdateIfNeeded();
@@ -1404,9 +1400,13 @@ void Object::SetDynamicValue(uint16 index, uint16 offset, uint32 value)
{
ASSERT(index < _dynamicValuesCount || PrintIndexError(index, false));
+ UpdateMask::DynamicFieldChangeType changeType = UpdateMask::VALUE_CHANGED;
std::vector<uint32>& values = _dynamicValues[index];
if (values.size() <= offset)
+ {
values.resize(offset + 1);
+ changeType = UpdateMask::VALUE_AND_SIZE_CHANGED;
+ }
if (_dynamicChangesArrayMask[index].size() <= offset)
_dynamicChangesArrayMask[index].resize((offset / 32 + 1) * 32);
@@ -1414,7 +1414,7 @@ void Object::SetDynamicValue(uint16 index, uint16 offset, uint32 value)
if (values[offset] != value)
{
values[offset] = value;
- _dynamicChangesMask[index] = 1;
+ _dynamicChangesMask[index] = changeType;
_dynamicChangesArrayMask[index][offset] = 1;
AddToObjectUpdateIfNeeded();
diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h
index e0aedc79c7f..a78caf15e44 100644
--- a/src/server/game/Entities/Object/Object.h
+++ b/src/server/game/Entities/Object/Object.h
@@ -92,6 +92,36 @@ class ZoneScript;
typedef std::unordered_map<Player*, UpdateData> UpdateDataMapType;
+namespace UpdateMask
+{
+ typedef uint32 BlockType;
+
+ enum DynamicFieldChangeType : uint16
+ {
+ VALUE_CHANGED = 0x7FFF,
+ VALUE_AND_SIZE_CHANGED = 0x8000
+ };
+
+ inline std::size_t GetBlockCount(std::size_t bitCount)
+ {
+ using BitsPerBlock = std::integral_constant<std::size_t, sizeof(BlockType) * 8>;
+ return (bitCount + BitsPerBlock::value - 1) / BitsPerBlock::value;
+ }
+
+ inline std::size_t EncodeDynamicFieldChangeType(std::size_t blockCount, DynamicFieldChangeType changeType, uint8 updateType)
+ {
+ return blockCount | ((changeType & VALUE_AND_SIZE_CHANGED) * (3 - updateType /*this part evaluates to 0 if update type is not VALUES*/));
+ }
+
+ template<typename T>
+ inline void SetUpdateBit(T* data, std::size_t bitIndex)
+ {
+ static_assert(std::is_integral<T>::value && std::is_unsigned<T>::value, "Type used for SetUpdateBit data arg is not an unsigned integer");
+ using BitsPerBlock = std::integral_constant<std::size_t, sizeof(T) * 8>;
+ data[bitIndex / BitsPerBlock::value] |= T(1) << (bitIndex % BitsPerBlock::value);
+ }
+}
+
// Helper class used to iterate object dynamic fields while interpreting them as a structure instead of raw int array
template<class T>
class DynamicFieldStructuredView
@@ -301,7 +331,7 @@ class TC_GAME_API Object
std::vector<uint32>* _dynamicValues;
std::vector<uint8> _changesMask;
- std::vector<uint8> _dynamicChangesMask;
+ std::vector<UpdateMask::DynamicFieldChangeType> _dynamicChangesMask;
std::vector<uint8>* _dynamicChangesArrayMask;
uint16 m_valuesCount;
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 4288b9aef12..c836fda5435 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -52,7 +52,6 @@ class Pet;
class PlayerMenu;
class PlayerSocial;
class SpellCastTargets;
-class UpdateMask;
class PlayerAI;
typedef std::deque<Mail*> PlayerMails;
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index b535e2225ac..1dde054a0a6 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -70,7 +70,6 @@
#include "VehiclePackets.h"
#include "LootPackets.h"
#include "PartyPackets.h"
-#include <boost/dynamic_bitset.hpp>
#include <cmath>
float baseMoveSpeed[MAX_MOVE_TYPE] =
@@ -4673,24 +4672,31 @@ void Unit::ApplyStatPercentBuffMod(Stats stat, float val, bool apply)
void Unit::_RegisterDynObject(DynamicObject* dynObj)
{
m_dynObj.push_back(dynObj);
+ if (GetTypeId() == TYPEID_UNIT && IsAIEnabled)
+ ToCreature()->AI()->JustRegisteredDynObject(dynObj);
}
void Unit::_UnregisterDynObject(DynamicObject* dynObj)
{
m_dynObj.remove(dynObj);
+ if (GetTypeId() == TYPEID_UNIT && IsAIEnabled)
+ ToCreature()->AI()->JustUnregisteredDynObject(dynObj);
}
-DynamicObject* Unit::GetDynObject(uint32 spellId)
+DynamicObject* Unit::GetDynObject(uint32 spellId) const
{
- if (m_dynObj.empty())
- return NULL;
- for (DynObjectList::const_iterator i = m_dynObj.begin(); i != m_dynObj.end();++i)
- {
- DynamicObject* dynObj = *i;
- if (dynObj->GetSpellId() == spellId)
- return dynObj;
- }
- return NULL;
+ std::vector<DynamicObject*> dynamicobjects = GetDynObjects(spellId);
+ return dynamicobjects.empty() ? nullptr : dynamicobjects.front();
+}
+
+std::vector<DynamicObject*> Unit::GetDynObjects(uint32 spellId) const
+{
+ std::vector<DynamicObject*> dynamicobjects;
+ for (DynObjectList::const_iterator i = m_dynObj.begin(); i != m_dynObj.end(); ++i)
+ if ((*i)->GetSpellId() == spellId)
+ dynamicobjects.push_back(*i);
+
+ return dynamicobjects;
}
void Unit::RemoveDynObject(uint32 spellId)
@@ -4718,11 +4724,18 @@ void Unit::RemoveAllDynObjects()
GameObject* Unit::GetGameObject(uint32 spellId) const
{
+ std::vector<GameObject*> gameobjects = GetGameObjects(spellId);
+ return gameobjects.empty() ? nullptr : gameobjects.front();
+}
+
+std::vector<GameObject*> Unit::GetGameObjects(uint32 spellId) const
+{
+ std::vector<GameObject*> gameobjects;
for (GameObjectList::const_iterator i = m_gameObj.begin(); i != m_gameObj.end(); ++i)
if ((*i)->GetSpellId() == spellId)
- return *i;
+ gameobjects.push_back(*i);
- return NULL;
+ return gameobjects;
}
void Unit::AddGameObject(GameObject* gameObj)
@@ -4741,6 +4754,9 @@ void Unit::AddGameObject(GameObject* gameObj)
// note: item based cooldowns and cooldown spell mods with charges ignored (unknown existing cases)
GetSpellHistory()->StartCooldown(createBySpell, 0, nullptr, true);
}
+
+ if (GetTypeId() == TYPEID_UNIT && ToCreature()->IsAIEnabled)
+ ToCreature()->AI()->JustSummonedGameobject(gameObj);
}
void Unit::RemoveGameObject(GameObject* gameObj, bool del)
@@ -4773,6 +4789,9 @@ void Unit::RemoveGameObject(GameObject* gameObj, bool del)
m_gameObj.remove(gameObj);
+ if (GetTypeId() == TYPEID_UNIT && ToCreature()->IsAIEnabled)
+ ToCreature()->AI()->SummonedGameobjectDespawn(gameObj);
+
if (del)
{
gameObj->SetRespawnTime(0);
@@ -15678,7 +15697,7 @@ void Unit::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player* target)
else if (GetTypeId() == TYPEID_PLAYER)
valCount = PLAYER_FIELD_END_NOT_SELF;
- boost::dynamic_bitset<uint32> updateMask(valCount);
+ std::size_t blockCount = UpdateMask::GetBlockCount(valCount);
Player* plr = GetCharmerOrOwnerPlayerOrPlayerItself();
if (GetOwnerGUID() == target->GetGUID())
@@ -15693,9 +15712,9 @@ void Unit::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player* target)
Creature const* creature = ToCreature();
- *data << uint8(updateMask.num_blocks());
+ *data << uint8(blockCount);
std::size_t maskPos = data->wpos();
- data->resize(data->size() + updateMask.num_blocks() * sizeof(uint32));
+ data->resize(data->size() + blockCount * sizeof(UpdateMask::BlockType));
for (uint16 index = 0; index < valCount; ++index)
{
@@ -15704,7 +15723,7 @@ void Unit::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player* target)
((updateType == UPDATETYPE_VALUES ? _changesMask[index] : m_uint32Values[index]) && (flags[index] & visibleFlag)) ||
(index == UNIT_FIELD_AURASTATE && HasFlag(UNIT_FIELD_AURASTATE, PER_CASTER_AURA_STATE_MASK)))
{
- updateMask.set(index);
+ UpdateMask::SetUpdateBit(data->contents() + maskPos, index);
if (index == UNIT_NPC_FLAGS)
{
@@ -15819,8 +15838,6 @@ void Unit::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player* target)
}
}
}
-
- boost::to_block_range(updateMask, reinterpret_cast<uint32*>(data->contents() + maskPos));
}
void Unit::DestroyForPlayer(Player* target) const
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index f991720b1eb..e219d04908f 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -2038,11 +2038,13 @@ class TC_GAME_API Unit : public WorldObject
// DynamicObject management
void _RegisterDynObject(DynamicObject* dynObj);
void _UnregisterDynObject(DynamicObject* dynObj);
- DynamicObject* GetDynObject(uint32 spellId);
+ DynamicObject* GetDynObject(uint32 spellId) const;
+ std::vector<DynamicObject*> GetDynObjects(uint32 spellId) const;
void RemoveDynObject(uint32 spellId);
void RemoveAllDynObjects();
GameObject* GetGameObject(uint32 spellId) const;
+ std::vector<GameObject*> GetGameObjects(uint32 spellId) const;
void AddGameObject(GameObject* gameObj);
void RemoveGameObject(GameObject* gameObj, bool del);
void RemoveGameObject(uint32 spellid, bool del);
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index bae5da71a9e..381b9093e3a 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -603,7 +603,7 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_QUERY_CREATURE, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Query::QueryCreature, &WorldSession::HandleCreatureQuery);
DEFINE_HANDLER(CMSG_QUERY_GAME_OBJECT, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Query::QueryGameObject, &WorldSession::HandleGameObjectQueryOpcode);
DEFINE_HANDLER(CMSG_QUERY_GARRISON_CREATURE_NAME, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL);
- DEFINE_HANDLER(CMSG_QUERY_GUILD_INFO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::QueryGuildInfo, &WorldSession::HandleGuildQueryOpcode);
+ DEFINE_HANDLER(CMSG_QUERY_GUILD_INFO, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Guild::QueryGuildInfo, &WorldSession::HandleGuildQueryOpcode);
DEFINE_HANDLER(CMSG_QUERY_INSPECT_ACHIEVEMENTS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Inspect::QueryInspectAchievements, &WorldSession::HandleQueryInspectAchievements);
DEFINE_HANDLER(CMSG_QUERY_NEXT_MAIL_TIME, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Mail::MailQueryNextMailTime, &WorldSession::HandleQueryNextMailTime);
DEFINE_HANDLER(CMSG_QUERY_NPC_TEXT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Query::QueryNPCText, &WorldSession::HandleNpcTextQueryOpcode);