Creature* ObjectAccessor::GetCreatureOrPetOrVehicle(WorldObject const& u, uint64 guid) { if (IS_PET_GUID(guid)) return GetPet(u, guid); if (IS_CRE_OR_VEH_GUID(guid)) return GetCreature(u, guid); return NULL; }
Creature* ObjectAccessor::GetCreatureOrPetOrVehicle(WorldObject const& u, uint64 guid) { if (IS_PLAYER_GUID(guid)) return NULL; if (IS_PET_GUID(guid)) return GetPet(guid); return u.IsInWorld() ? u.GetMap()->GetCreature(guid) : NULL; }
void GameObject::CleanupsBeforeDelete() { if(m_uint32Values) // field array can be not exist if GameOBject not loaded { // Possible crash at access to deleted GO in Unit::m_gameobj if(uint64 owner_guid = GetOwnerGUID()) { if(Unit* owner = ObjectAccessor::GetUnit(*this,owner_guid)) owner->RemoveGameObject(this,false); else { const char * ownerType = "creature"; if(IS_PLAYER_GUID(owner_guid)) ownerType = "player"; else if(IS_PET_GUID(owner_guid)) ownerType = "pet"; sLog.outError("Delete GameObject (GUID: %u Entry: %u SpellId %u LinkedGO %u) that lost references to owner (GUID %u Type '%s') GO list. Crash possible later.", GetGUIDLow(), GetGOInfo()->id, m_spellId, GetGOInfo()->GetLinkedGameObjectEntry(), GUID_LOPART(owner_guid), ownerType); } } } }
// is Resource heavy, do not spam or use heavily in loop Unit *PlayerbotClassAI::FindMainTankInRaid(Player *gPlayer) { // check if original main tank is still alive. No point regetting main // tank b/c chances are slim that it will not get reset in the middle of a fight. // But if main tank dies, try to find next best canidate if (mainTank!=NULL && mainTank->isAlive()) { return mainTank; } if (!gPlayer) return NULL; Group *pGroup = gPlayer->GetGroup(); if (!pGroup) return NULL; uint64 pLeaderGuid = pGroup->GetLeaderGUID(); Unit *pPlayer = NULL; // Check if set in raid if (pGroup->isRaidGroup()) { QueryResult result = CharacterDatabase.PQuery("SELECT memberGuid FROM group_member WHERE memberFlags='%u' AND guid = '%u'",MEMBER_FLAG_MAINTANK, pGroup->GetGUID()); if(result) { uint64 pGuid = MAKE_NEW_GUID(result->Fetch()->GetInt32(),0,HIGHGUID_PLAYER); pPlayer = sObjectMgr->GetPlayer(pGuid); if (pPlayer && pGroup->IsMember(pGuid) && pPlayer->isAlive()){ mainTank = pPlayer; return pPlayer; } } } // if could not find tank try assuming // Assume the one with highest health is the main tank uint32 maxhpfound=0; std::list<Unit*> unitList; gPlayer->GetRaidMember(unitList,30); if (!unitList.empty()){ for (std::list<Unit*>::iterator itr = unitList.begin() ; itr!=unitList.end();++itr) { //Player *tPlayer = GetPlayerBot()->GetObjPlayer((*itr)->GetGUID()); Unit *tPlayer = sObjectMgr->GetPlayer((*itr)->GetGUID()); if (tPlayer == NULL) continue; if (tPlayer->isDead()) continue; if (GetPlayerBot()->GetAreaId() != tPlayer->GetAreaId()) continue; //if(tPlayer->GetGUID() == GetPlayerBot()->GetGUID()) continue; if (GetPlayerBot()->GetDistance(tPlayer) > 50) continue; if (tPlayer->GetMaxHealth() > maxhpfound) { maxhpfound = tPlayer->GetMaxHealth(); pPlayer=tPlayer; } // Also check pets if ( (tPlayer->getClass() == (uint8) CLASS_HUNTER || tPlayer->getClass() == (uint8) CLASS_WARLOCK) && IS_PET_GUID(tPlayer->GetPetGUID()) ) { Pet* tpet = ObjectAccessor::GetPet(*tPlayer, tPlayer->GetPetGUID()); if (!tpet || !tpet->IsInWorld() || !tpet->isDead()) continue; if (tpet->GetArmor() > tPlayer->GetArmor()) //Probably a tanking capable pet.. { if (tpet->GetMaxHealth() > maxhpfound) { maxhpfound = tpet->GetMaxHealth(); pPlayer=tpet; } else if (tPlayer->GetGUID() == pPlayer->GetGUID()) {pPlayer = tpet;} //set pet as tank instead of owner } } } } mainTank = pPlayer; return pPlayer; }
size_t ChatHandler::BuildChatPacket(WorldPacket& data, ChatMsg chatType, Language language, uint64 senderGUID, uint64 receiverGUID, std::string const& message, uint8 chatTag, std::string const& senderName /*= ""*/, std::string const& receiverName /*= ""*/, uint32 achievementId /*= 0*/, bool gmMessage /*= false*/, std::string const& channelName /*= ""*/) { size_t receiverGUIDPos = 0; data.Initialize(!gmMessage ? SMSG_MESSAGECHAT : SMSG_GM_MESSAGECHAT); data << uint8(chatType); data << int32(language); data << uint64(senderGUID); data << uint32(0); // some flags switch (chatType) { case CHAT_MSG_MONSTER_SAY: case CHAT_MSG_MONSTER_PARTY: case CHAT_MSG_MONSTER_YELL: case CHAT_MSG_MONSTER_WHISPER: case CHAT_MSG_MONSTER_EMOTE: case CHAT_MSG_RAID_BOSS_EMOTE: case CHAT_MSG_RAID_BOSS_WHISPER: case CHAT_MSG_BATTLENET: data << uint32(senderName.length() + 1); data << senderName; receiverGUIDPos = data.wpos(); data << uint64(receiverGUID); if (receiverGUID && !IS_PLAYER_GUID(receiverGUID) && !IS_PET_GUID(receiverGUID)) { data << uint32(receiverName.length() + 1); data << receiverName; } break; case CHAT_MSG_WHISPER_FOREIGN: data << uint32(senderName.length() + 1); data << senderName; receiverGUIDPos = data.wpos(); data << uint64(receiverGUID); break; case CHAT_MSG_BG_SYSTEM_NEUTRAL: case CHAT_MSG_BG_SYSTEM_ALLIANCE: case CHAT_MSG_BG_SYSTEM_HORDE: receiverGUIDPos = data.wpos(); data << uint64(receiverGUID); if (receiverGUID && !IS_PLAYER_GUID(receiverGUID)) { data << uint32(receiverName.length() + 1); data << receiverName; } break; case CHAT_MSG_ACHIEVEMENT: case CHAT_MSG_GUILD_ACHIEVEMENT: receiverGUIDPos = data.wpos(); data << uint64(receiverGUID); break; default: if (gmMessage) { data << uint32(senderName.length() + 1); data << senderName; } if (chatType == CHAT_MSG_CHANNEL) { ASSERT(channelName.length() > 0); data << channelName; } receiverGUIDPos = data.wpos(); data << uint64(receiverGUID); break; } data << uint32(message.length() + 1); data << message; data << uint8(chatTag); if (chatType == CHAT_MSG_ACHIEVEMENT || chatType == CHAT_MSG_GUILD_ACHIEVEMENT) data << uint32(achievementId); return receiverGUIDPos; }
size_t ChatHandler::BuildChatPacket(WorldPacket& data, ChatMsg chatType, Language language, ObjectGuid senderGUID, ObjectGuid receiverGUID, std::string const& message, uint8 chatTag, std::string const& senderName /*= ""*/, std::string const& receiverName /*= ""*/, uint32 achievementId /*= 0*/, bool gmMessage /*= false*/, std::string const& channelName /*= ""*/, std::string const& addonPrefix /*= ""*/) { bool hasAchievementId = (chatType == CHAT_MSG_ACHIEVEMENT || chatType == CHAT_MSG_GUILD_ACHIEVEMENT) && achievementId; bool hasSenderName = false; bool hasReceiverName = false; bool hasChannelName = false; bool hasGroupGUID = false; bool hasGuildGUID = false; bool hasPrefix = false; switch (chatType) { case CHAT_MSG_BATTLEGROUND: case CHAT_MSG_BATTLEGROUND_LEADER: case CHAT_MSG_PARTY: case CHAT_MSG_PARTY_LEADER: case CHAT_MSG_RAID: case CHAT_MSG_RAID_LEADER: case CHAT_MSG_RAID_WARNING: hasGroupGUID = true; break; case CHAT_MSG_GUILD: case CHAT_MSG_OFFICER: case CHAT_MSG_GUILD_ACHIEVEMENT: hasGuildGUID = true; break; case CHAT_MSG_MONSTER_WHISPER: case CHAT_MSG_RAID_BOSS_WHISPER: case CHAT_MSG_BATTLENET: if (receiverGUID && !IS_PLAYER_GUID(receiverGUID) && !IS_PET_GUID(receiverGUID)) hasReceiverName = receiverName.length(); case CHAT_MSG_MONSTER_SAY: case CHAT_MSG_MONSTER_PARTY: case CHAT_MSG_MONSTER_YELL: case CHAT_MSG_MONSTER_EMOTE: case CHAT_MSG_RAID_BOSS_EMOTE: hasSenderName = senderName.length(); break; case CHAT_MSG_WHISPER_FOREIGN: hasSenderName = senderName.length(); break; case CHAT_MSG_BG_SYSTEM_NEUTRAL: case CHAT_MSG_BG_SYSTEM_ALLIANCE: case CHAT_MSG_BG_SYSTEM_HORDE: if (receiverGUID && !IS_PLAYER_GUID(receiverGUID)) hasReceiverName = receiverName.length(); break; case CHAT_MSG_CHANNEL: hasChannelName = channelName.length(); hasSenderName = senderName.length(); break; default: if (gmMessage) hasSenderName = senderName.length(); break; } if (language == LANG_ADDON) hasPrefix = addonPrefix.length(); Player* sender = sObjectAccessor->FindPlayer(senderGUID); ObjectGuid guildGUID = hasGuildGUID && sender && sender->GetGuildId() ? MAKE_NEW_GUID(sender->GetGuildId(), 0, HIGHGUID_GUILD) : 0; ObjectGuid groupGUID = hasGroupGUID && sender && sender->GetGroup() ? sender->GetGroup()->GetGUID() : 0; data.Initialize(SMSG_MESSAGECHAT); data.WriteBit(!hasSenderName); data.WriteBit(0); // HideInChatLog - only bubble shows if (hasSenderName) data.WriteBits(senderName.length(), 11); data.WriteBit(0); // Fake Bit data.WriteBit(!hasChannelName); data.WriteBit(0); // Unk data.WriteBit(1); // SendFakeTime - float later data.WriteBit(!chatTag); // ChatFlags data.WriteBit(1); // RealmID ? data.WriteBit(groupGUID[0]); data.WriteBit(groupGUID[1]); data.WriteBit(groupGUID[5]); data.WriteBit(groupGUID[4]); data.WriteBit(groupGUID[3]); data.WriteBit(groupGUID[2]); data.WriteBit(groupGUID[6]); data.WriteBit(groupGUID[7]); if (chatTag) data.WriteBits(chatTag, 9); data.WriteBit(0); // Fake Bit data.WriteBit(receiverGUID[7]); data.WriteBit(receiverGUID[6]); data.WriteBit(receiverGUID[1]); data.WriteBit(receiverGUID[4]); data.WriteBit(receiverGUID[0]); data.WriteBit(receiverGUID[2]); data.WriteBit(receiverGUID[3]); data.WriteBit(receiverGUID[5]); data.WriteBit(0); // Fake Bit data.WriteBit(!language); data.WriteBit(!hasPrefix); data.WriteBit(senderGUID[0]); data.WriteBit(senderGUID[3]); data.WriteBit(senderGUID[7]); data.WriteBit(senderGUID[2]); data.WriteBit(senderGUID[1]); data.WriteBit(senderGUID[5]); data.WriteBit(senderGUID[4]); data.WriteBit(senderGUID[6]); data.WriteBit(!hasAchievementId); data.WriteBit(!message.length()); if (hasChannelName) data.WriteBits(channelName.length(), 7); if (message.length()) data.WriteBits(message.length(), 12); data.WriteBit(!hasReceiverName); if (hasPrefix) data.WriteBits(addonPrefix.length(), 5); data.WriteBit(1); // RealmID ? if (hasReceiverName) data.WriteBits(receiverName.length(), 11); data.WriteBit(0); // Fake Bit data.WriteBit(guildGUID[2]); data.WriteBit(guildGUID[5]); data.WriteBit(guildGUID[7]); data.WriteBit(guildGUID[4]); data.WriteBit(guildGUID[0]); data.WriteBit(guildGUID[1]); data.WriteBit(guildGUID[3]); data.WriteBit(guildGUID[6]); data.WriteByteSeq(guildGUID[4]); data.WriteByteSeq(guildGUID[5]); data.WriteByteSeq(guildGUID[7]); data.WriteByteSeq(guildGUID[3]); data.WriteByteSeq(guildGUID[2]); data.WriteByteSeq(guildGUID[6]); data.WriteByteSeq(guildGUID[0]); data.WriteByteSeq(guildGUID[1]); if (hasChannelName) data.WriteString(channelName); if (hasPrefix) data.WriteString(addonPrefix); // if (hasFakeTime) // data << float(fakeTime); data.WriteByteSeq(senderGUID[4]); data.WriteByteSeq(senderGUID[7]); data.WriteByteSeq(senderGUID[1]); data.WriteByteSeq(senderGUID[5]); data.WriteByteSeq(senderGUID[0]); data.WriteByteSeq(senderGUID[6]); data.WriteByteSeq(senderGUID[2]); data.WriteByteSeq(senderGUID[3]); data << uint8(chatType); if (hasAchievementId) data << uint32(achievementId); data.WriteByteSeq(groupGUID[1]); data.WriteByteSeq(groupGUID[3]); data.WriteByteSeq(groupGUID[4]); data.WriteByteSeq(groupGUID[6]); data.WriteByteSeq(groupGUID[0]); data.WriteByteSeq(groupGUID[2]); data.WriteByteSeq(groupGUID[5]); data.WriteByteSeq(groupGUID[7]); data.WriteByteSeq(receiverGUID[2]); data.WriteByteSeq(receiverGUID[5]); data.WriteByteSeq(receiverGUID[3]); data.WriteByteSeq(receiverGUID[6]); data.WriteByteSeq(receiverGUID[7]); data.WriteByteSeq(receiverGUID[4]); data.WriteByteSeq(receiverGUID[1]); data.WriteByteSeq(receiverGUID[0]); if (language) data << uint8(language); if (message.length()) data.WriteString(message); if (hasReceiverName) data.WriteString(receiverName); if (hasSenderName) data.WriteString(senderName); return data.wpos(); }
size_t ChatHandler::BuildChatPacket(WorldPacket& data, ChatMsg chatType, Language language, uint64 senderGUID, uint64 receiverGUID, std::string const& message, uint8 chatTag, std::string const& senderName /*= ""*/, std::string const& receiverName /*= ""*/, uint32 achievementId /*= 0*/, bool gmMessage /*= false*/, std::string const& channelName /*= ""*/, std::string const& addonPrefix /*= ""*/) { size_t receiverGUIDPos = 0; data.Initialize(!gmMessage ? SMSG_MESSAGECHAT : SMSG_GM_MESSAGECHAT); data << uint8(chatType); data << int32(language); data << uint64(senderGUID); data << uint32(0); // some flags switch (chatType) { case CHAT_MSG_MONSTER_SAY: case CHAT_MSG_MONSTER_PARTY: case CHAT_MSG_MONSTER_YELL: case CHAT_MSG_MONSTER_WHISPER: case CHAT_MSG_MONSTER_EMOTE: case CHAT_MSG_RAID_BOSS_EMOTE: case CHAT_MSG_RAID_BOSS_WHISPER: case CHAT_MSG_BATTLENET: data << uint32(senderName.length() + 1); data << senderName; receiverGUIDPos = data.wpos(); data << uint64(receiverGUID); if (receiverGUID && !IS_PLAYER_GUID(receiverGUID) && !IS_PET_GUID(receiverGUID)) { data << uint32(receiverName.length() + 1); data << receiverName; } if (language == LANG_ADDON) data << addonPrefix; break; case CHAT_MSG_WHISPER_FOREIGN: data << uint32(senderName.length() + 1); data << senderName; receiverGUIDPos = data.wpos(); data << uint64(receiverGUID); if (language == LANG_ADDON) data << addonPrefix; break; case CHAT_MSG_BG_SYSTEM_NEUTRAL: case CHAT_MSG_BG_SYSTEM_ALLIANCE: case CHAT_MSG_BG_SYSTEM_HORDE: receiverGUIDPos = data.wpos(); data << uint64(receiverGUID); if (receiverGUID && !IS_PLAYER_GUID(receiverGUID)) { data << uint32(receiverName.length() + 1); data << receiverName; } if (language == LANG_ADDON) data << addonPrefix; break; case CHAT_MSG_ACHIEVEMENT: case CHAT_MSG_GUILD_ACHIEVEMENT: receiverGUIDPos = data.wpos(); data << uint64(receiverGUID); if (language == LANG_ADDON) data << addonPrefix; break; default: if (gmMessage) { data << uint32(senderName.length() + 1); data << senderName; } if (chatType == CHAT_MSG_CHANNEL) { ASSERT(channelName.length() > 0); data << channelName; } receiverGUIDPos = data.wpos(); data << uint64(receiverGUID); if (language == LANG_ADDON) data << addonPrefix; break; } data << uint32(message.length() + 1); data << message; data << uint8(chatTag); if (chatType == CHAT_MSG_ACHIEVEMENT || chatType == CHAT_MSG_GUILD_ACHIEVEMENT) data << uint32(achievementId); else if (chatType == CHAT_MSG_RAID_BOSS_WHISPER || chatType == CHAT_MSG_RAID_BOSS_EMOTE) { data << float(0.0f); // Display time in middle of the screen (in seconds), defaults to 10 if not set (cannot be below 1) data << uint8(0); // Hide in chat frame (only shows in middle of the screen) } return receiverGUIDPos; }