132 player->
SendNewItem(resultValue.item, resultValue.count,
false,
false,
true, resultValue.dungeonEncounterId);
145 std::vector<Loot*> forceLootRelease;
146 for (std::pair<ObjectGuid const, Loot*>
const& lootView : player->
GetAELootView())
148 Loot* loot = lootView.second;
153 if (shareMoney && player->
GetGroup())
157 std::vector<Player*> playersNear;
160 Player* member = itr->GetSource();
168 playersNear.push_back(member);
173 for (std::vector<Player*>::const_iterator i = playersNear.begin(); i != playersNear.end(); ++i)
177 (*i)->ModifyMoney(goldPerPlayer + goldMod);
181 packet.
Money = goldPerPlayer;
183 packet.
SoleLooter = playersNear.size() <= 1 ? true :
false;
184 (*i)->SendDirectMessage(packet.
Write());
209 forceLootRelease.push_back(loot);
212 for (
Loot* loot : forceLootRelease)
231 if (
GetPlayer()->IsNonMeleeSpellCast(
false))
237 std::vector<Creature*> corpses;
244 if (!corpses.empty())
249 if (!corpses.empty())
398 for (
auto const& [lootGuid, loot] : lootView)
420 TC_LOG_DEBUG(
"network",
"WorldSession::HandleLootMasterGiveOpcode (CMSG_LOOT_MASTER_GIVE, 0x02A3) Target = [{}].", target->
GetName());
444 TC_LOG_DEBUG(
"loot",
"MasterLootItem: Player {} might be using a hack! (slot {}, size {})",
482 target->
SendNewItem(resultValue.item, resultValue.count,
false,
false,
true);
503 if (chrSpec->ClassID ==
GetPlayer()->GetClass())
DB2Storage< ChrSpecializationEntry > sChrSpecializationStore("ChrSpecialization.db2", &ChrSpecializationLoadInfo::Instance)
@ MoneyLootedFromCreatures
@ EQUIP_ERR_CANT_EQUIP_EVER
@ EQUIP_ERR_ITEM_MAX_COUNT
#define TC_LOG_DEBUG(filterType__,...)
#define TC_LOG_INFO(filterType__,...)
@ LOOT_ERROR_MASTER_OTHER
@ LOOT_ERROR_MASTER_INV_FULL
@ LOOT_ERROR_MASTER_UNIQUE_ITEM
@ LOOT_ERROR_PLAYER_NOT_FOUND
#define INTERACTION_DISTANCE
std::vector< ItemPosCount > ItemPosCountVec
@ GAMEOBJECT_TYPE_FISHINGHOLE
@ GAMEOBJECT_TYPE_FISHINGNODE
@ GAMEOBJECT_TYPE_GATHERING_NODE
@ CORPSE_DYNFLAG_LOOTABLE
@ SPELL_AURA_MOD_MONEY_GAIN
@ PROC_SPELL_TYPE_MASK_ALL
T CalculatePct(T base, U pct)
bool IsValidLootTarget(Creature const *creature) const
AELootCreatureCheck(Player *looter, ObjectGuid mainLootTarget)
ObjectGuid _mainLootTarget
bool IsValidAELootTarget(Creature const *creature) const
bool operator()(Creature const *creature) const
static float constexpr LootDistance
void Add(Item *item, uint8 count, LootType lootType, uint32 dungeonEncounterId)
void RemoveCorpseDynamicFlag(CorpseDynFlags dynamicFlags)
std::unique_ptr< Loot > m_loot
void AllLootRemovedFromCorpse()
Loot * GetLootForPlayer(Player const *player) const override
bool IsFullyLooted() const
ObjectGuid GetOwnerGUID() const override
bool IsWithinDistInMap(Player const *player) const
bool IsFullyLooted() const
GameObjectValue const * GetGOValue() const
void OnLootRelease(Player *looter)
void SetLootState(LootState s, Unit *unit=nullptr)
GameobjectTypes GetGoType() const
uint32 GetUseCount() const
ObjectGuid GetMasterLooterGuid() const
GroupReference * GetFirstMember()
ItemTemplate const * GetTemplate() const
std::unique_ptr< Loot > m_loot
bool PlayerVote(Player *player, RollVote vote)
GameObject * GetGameObject(ObjectGuid const &guid)
Creature * GetCreature(ObjectGuid const &guid)
LowType GetCounter() const
static ObjectGuid const Empty
bool IsGameObject() const
bool IsCreatureOrVehicle() const
UF::UpdateField< UF::ObjectData, 0, TYPEID_OBJECT > m_objectData
UF::UpdateFieldHolder m_values
void RemoveDynamicFlag(uint32 flag)
static ObjectGuid GetGUID(Object const *o)
void ForceUpdateFieldChange(UF::UpdateFieldSetter< T > const &)
void SendLootError(ObjectGuid const &lootObj, ObjectGuid const &owner, LootError error) const
Item * StoreNewItem(ItemPosCountVec const &pos, uint32 itemId, bool update, ItemRandomBonusListId randomBonusListId=0, GuidSet const &allowedLooters=GuidSet(), ItemContext context=ItemContext::NONE, std::vector< int32 > const *bonusListIDs=nullptr, bool addToCollection=true)
bool ModifyMoney(int64 amount, bool sendError=true)
void ApplyItemLootedSpell(Item *item, bool apply)
void SendLootRelease(ObjectGuid guid) const
std::unordered_map< ObjectGuid, Loot * > m_AELootView
LootRoll * GetLootRoll(ObjectGuid const &lootObjectGuid, uint8 lootListId)
bool isAllowedToLoot(Creature const *creature) const
ObjectGuid const & GetLootGUID() const
void SetLootGUID(ObjectGuid const &guid)
bool IsAtGroupRewardDistance(WorldObject const *pRewardSource) const
WorldSession * GetSession() const
void DestroyItem(uint8 bag, uint8 slot, bool update)
void SendLoot(Loot &loot, bool aeLooting=false)
void UpdateCriteria(CriteriaType type, uint64 miscValue1=0, uint64 miscValue2=0, uint64 miscValue3=0, WorldObject *ref=nullptr)
uint32 DestroyItemCount(uint32 item, uint32 count, bool update, bool unequip_check=false)
std::unordered_map< ObjectGuid, Loot * > const & GetAELootView() const
void StoreLootItem(ObjectGuid lootWorldObjectGuid, uint8 lootSlot, Loot *loot, AELootResult *aeResult=nullptr)
Group * GetGroup(Optional< uint8 > partyIndex)
void SetLootSpecId(uint32 id)
Item * GetItemByGuid(ObjectGuid guid) const
InventoryResult CanStoreNewItem(uint8 bag, uint8 slot, ItemPosCountVec &dest, uint32 item, uint32 count, uint32 *no_space_count=nullptr) const
void SendNewItem(Item *item, uint32 quantity, bool received, bool created, bool broadcast=false, uint32 dungeonEncounterId=0)
MutableFieldReference< T, false > ModifyValue(UpdateField< T, BlockBit, Bit >(Derived::*field))
void InterruptNonMeleeSpells(bool withDelayed, uint32 spellid=0, bool withInstant=true)
void RemoveAurasWithInterruptFlags(InterruptFlags flag, SpellInfo const *source=nullptr)
bool IsInRaidWith(Unit const *unit) const
int32 GetTotalAuraModifierByMiscValue(AuraType auraType, int32 misc_value) const
static void ProcSkillsAndAuras(Unit *actor, Unit *actionTarget, ProcFlagsInit const &typeMaskActor, ProcFlagsInit const &typeMaskActionTarget, ProcFlagsSpellType spellTypeMask, ProcFlagsSpellPhase spellPhaseMask, ProcFlagsHit hitMask, Spell *spell, DamageInfo *damageInfo, HealInfo *healInfo)
void RemoveUnitFlag(UnitFlags flags)
std::string const & GetName() const
bool IsWithinDistInMap(WorldObject const *obj, float dist2compare, bool is3D=true, bool incOwnRadius=true, bool incTargetRadius=true) const
bool IsWithinDist(WorldObject const *obj, float dist2compare, bool is3D=true, bool incOwnRadius=true, bool incTargetRadius=true) const
bool IsInMap(WorldObject const *obj) const
WorldPacket const * Write() override
Array< LootRequest, 1000 > Loot
WorldPacket const * Write() override
Array< LootRequest, 1000 > Loot
void HandleLootMasterGiveOpcode(WorldPackets::Loot::MasterLootItem &masterLootItem)
void HandleLootReleaseOpcode(WorldPackets::Loot::LootRelease &packet)
void HandleLootMoneyOpcode(WorldPackets::Loot::LootMoney &packet)
void HandleLootOpcode(WorldPackets::Loot::LootUnit &packet)
void DoLootRelease(Loot *loot)
Player * GetPlayer() const
void SendPacket(WorldPacket const *packet, bool forced=false)
Send a packet to the client.
void HandleAutostoreLootItemOpcode(WorldPackets::Loot::LootItem &packet)
void HandleSetLootSpecialization(WorldPackets::Loot::SetLootSpecialization &packet)
void HandleLootRoll(WorldPackets::Loot::LootRoll &packet)
TC_GAME_API bool GetName(uint32 accountId, std::string &name)
TC_GAME_API Player * GetPlayer(Map const *, ObjectGuid const &guid)
TC_GAME_API Creature * GetCreature(WorldObject const &u, ObjectGuid const &guid)
TC_GAME_API Corpse * GetCorpse(WorldObject const &u, ObjectGuid const &guid)
auto MapGetValuePtr(M &map, typename M::key_type const &key)
static void VisitGridObjects(WorldObject const *obj, T &visitor, float radius, bool dont_load=true)
bool HasFlag(ItemFlags flag) const
bool HasAllowedLooter(ObjectGuid const &looter) const
std::vector< int32 > BonusListIDs
ItemRandomBonusListId randomBonusListId
GuidSet const & GetAllowedLooters() const
void NotifyLootList(Map const *map) const
void NotifyMoneyRemoved(Map const *map)
void NotifyItemRemoved(uint8 lootListId, Map const *map)
ObjectGuid roundRobinPlayer
ObjectGuid const & GetOwnerGUID() const
ObjectGuid const & GetGUID() const
std::vector< LootItem > items
void RemoveLooter(ObjectGuid GUID)
uint32 GetDungeonEncounterId() const
LootMethod GetLootMethod() const
bool HasAllowedLooter(ObjectGuid const &looter) const
UpdateField< uint32, 0, 2 > DynamicFlags
struct GameObjectValue::@209 FishingHole