static bool HandleListAurasCommand(ChatHandler* handler, char const* /*args*/) { Unit* unit = handler->getSelectedUnit(); if (!unit) { handler->SendSysMessage(LANG_SELECT_CHAR_OR_CREATURE); handler->SetSentErrorMessage(true); return false; } char const* talentStr = handler->GetTrinityString(LANG_TALENT); char const* passiveStr = handler->GetTrinityString(LANG_PASSIVE); Unit::AuraApplicationMap const& auras = unit->GetAppliedAuras(); handler->PSendSysMessage(LANG_COMMAND_TARGET_LISTAURAS, auras.size()); for (Unit::AuraApplicationMap::const_iterator itr = auras.begin(); itr != auras.end(); ++itr) { bool talent = GetTalentSpellCost(itr->second->GetBase()->GetId()) > 0; AuraApplication const* aurApp = itr->second; Aura const* aura = aurApp->GetBase(); char const* name = aura->GetSpellInfo()->SpellName[handler->GetSessionDbcLocale()]; std::ostringstream ss_name; ss_name << "|cffffffff|Hspell:" << aura->GetId() << "|h[" << name << "]|h|r"; handler->PSendSysMessage(LANG_COMMAND_TARGET_AURADETAIL, aura->GetId(), (handler->GetSession() ? ss_name.str().c_str() : name), aurApp->GetEffectMask(), aura->GetCharges(), aura->GetStackAmount(), aurApp->GetSlot(), aura->GetDuration(), aura->GetMaxDuration(), (aura->IsPassive() ? passiveStr : ""), (talent ? talentStr : ""), aura->GetCasterGUID().IsPlayer() ? "player" : "creature", aura->GetCasterGUID().GetCounter()); } for (uint16 i = 0; i < TOTAL_AURAS; ++i) { Unit::AuraEffectList const& auraList = unit->GetAuraEffectsByType(AuraType(i)); if (auraList.empty()) continue; handler->PSendSysMessage(LANG_COMMAND_TARGET_LISTAURATYPE, auraList.size(), i); for (Unit::AuraEffectList::const_iterator itr = auraList.begin(); itr != auraList.end(); ++itr) handler->PSendSysMessage(LANG_COMMAND_TARGET_AURASIMPLE, (*itr)->GetId(), (*itr)->GetEffIndex(), (*itr)->GetAmount()); } return true; }
void PhasingHandler::OnConditionChange(WorldObject* object) { PhaseShift& phaseShift = object->GetPhaseShift(); PhaseShift& suppressedPhaseShift = object->GetSuppressedPhaseShift(); PhaseShift newSuppressions; ConditionSourceInfo srcInfo = ConditionSourceInfo(object); bool changed = false; for (auto itr = phaseShift.Phases.begin(); itr != phaseShift.Phases.end();) { if (itr->AreaConditions && !sConditionMgr->IsObjectMeetToConditions(srcInfo, *itr->AreaConditions)) { newSuppressions.AddPhase(itr->Id, itr->Flags, itr->AreaConditions, itr->References); phaseShift.ModifyPhasesReferences(itr, -itr->References); itr = phaseShift.Phases.erase(itr); } else ++itr; } for (auto itr = suppressedPhaseShift.Phases.begin(); itr != suppressedPhaseShift.Phases.end();) { if (sConditionMgr->IsObjectMeetToConditions(srcInfo, *ASSERT_NOTNULL(itr->AreaConditions))) { changed = phaseShift.AddPhase(itr->Id, itr->Flags, itr->AreaConditions, itr->References) || changed; suppressedPhaseShift.ModifyPhasesReferences(itr, -itr->References); itr = suppressedPhaseShift.Phases.erase(itr); } else ++itr; } for (auto itr = phaseShift.VisibleMapIds.begin(); itr != phaseShift.VisibleMapIds.end();) { if (!sConditionMgr->IsObjectMeetingNotGroupedConditions(CONDITION_SOURCE_TYPE_TERRAIN_SWAP, itr->first, srcInfo)) { newSuppressions.AddVisibleMapId(itr->first, itr->second.VisibleMapInfo, itr->second.References); for (uint32 uiWorldMapAreaIdSwap : itr->second.VisibleMapInfo->UiWorldMapAreaIDSwaps) changed = phaseShift.RemoveUiWorldMapAreaIdSwap(uiWorldMapAreaIdSwap).Erased || changed; itr = phaseShift.VisibleMapIds.erase(itr); } else ++itr; } for (auto itr = suppressedPhaseShift.VisibleMapIds.begin(); itr != suppressedPhaseShift.VisibleMapIds.end();) { if (sConditionMgr->IsObjectMeetingNotGroupedConditions(CONDITION_SOURCE_TYPE_TERRAIN_SWAP, itr->first, srcInfo)) { changed = phaseShift.AddVisibleMapId(itr->first, itr->second.VisibleMapInfo, itr->second.References) || changed; for (uint32 uiWorldMapAreaIdSwap : itr->second.VisibleMapInfo->UiWorldMapAreaIDSwaps) changed = phaseShift.AddUiWorldMapAreaIdSwap(uiWorldMapAreaIdSwap) || changed; itr = suppressedPhaseShift.VisibleMapIds.erase(itr); } else ++itr; } Unit* unit = object->ToUnit(); if (unit) { for (AuraEffect const* aurEff : unit->GetAuraEffectsByType(SPELL_AURA_PHASE)) { uint32 phaseId = uint32(aurEff->GetMiscValueB()); auto eraseResult = newSuppressions.RemovePhase(phaseId); // if condition was met previously there is nothing to erase if (eraseResult.Iterator != newSuppressions.Phases.end() || eraseResult.Erased) phaseShift.AddPhase(phaseId, GetPhaseFlags(phaseId), nullptr); } for (AuraEffect const* aurEff : unit->GetAuraEffectsByType(SPELL_AURA_PHASE_GROUP)) { if (std::vector<uint32> const* phasesInGroup = sDB2Manager.GetPhasesForGroup(uint32(aurEff->GetMiscValueB()))) { for (uint32 phaseId : *phasesInGroup) { auto eraseResult = newSuppressions.RemovePhase(phaseId); // if condition was met previously there is nothing to erase if (eraseResult.Iterator != newSuppressions.Phases.end() || eraseResult.Erased) phaseShift.AddPhase(phaseId, GetPhaseFlags(phaseId), nullptr); } } } } changed = changed || !newSuppressions.Phases.empty() || !newSuppressions.VisibleMapIds.empty(); for (auto itr = newSuppressions.Phases.begin(); itr != newSuppressions.Phases.end(); ++itr) suppressedPhaseShift.AddPhase(itr->Id, itr->Flags, itr->AreaConditions, itr->References); for (auto itr = newSuppressions.VisibleMapIds.begin(); itr != newSuppressions.VisibleMapIds.end(); ++itr) suppressedPhaseShift.AddVisibleMapId(itr->first, itr->second.VisibleMapInfo, itr->second.References); if (unit) { if (changed) unit->OnPhaseChange(); ForAllControlled(unit, [&](Unit* controlled) { InheritPhaseShift(controlled, unit); }); if (changed) unit->RemoveNotOwnSingleTargetAuras(true); } UpdateVisibilityIfNeeded(object, true, changed); }
void WorldSession::HandleMirrorImageDataRequest(WorldPackets::Spells::GetMirrorImageData& getMirrorImageData) { ObjectGuid guid = getMirrorImageData.UnitGUID; // Get unit for which data is needed by client Unit* unit = ObjectAccessor::GetUnit(*_player, guid); if (!unit) return; if (!unit->HasAuraType(SPELL_AURA_CLONE_CASTER)) return; // Get creator of the unit (SPELL_AURA_CLONE_CASTER does not stack) Unit* creator = unit->GetAuraEffectsByType(SPELL_AURA_CLONE_CASTER).front()->GetCaster(); if (!creator) return; if (Player* player = creator->ToPlayer()) { WorldPackets::Spells::MirrorImageComponentedData mirrorImageComponentedData; mirrorImageComponentedData.UnitGUID = guid; mirrorImageComponentedData.DisplayID = creator->GetDisplayId(); mirrorImageComponentedData.RaceID = creator->getRace(); mirrorImageComponentedData.Gender = creator->getGender(); mirrorImageComponentedData.ClassID = creator->getClass(); Guild* guild = player->GetGuild(); mirrorImageComponentedData.SkinColor = player->GetByteValue(PLAYER_BYTES, PLAYER_BYTES_OFFSET_SKIN_ID); mirrorImageComponentedData.FaceVariation = player->GetByteValue(PLAYER_BYTES, PLAYER_BYTES_OFFSET_FACE_ID); mirrorImageComponentedData.HairVariation = player->GetByteValue(PLAYER_BYTES, PLAYER_BYTES_OFFSET_HAIR_STYLE_ID); mirrorImageComponentedData.HairColor = player->GetByteValue(PLAYER_BYTES, PLAYER_BYTES_OFFSET_HAIR_COLOR_ID); mirrorImageComponentedData.BeardVariation = player->GetByteValue(PLAYER_BYTES_2, PLAYER_BYTES_2_OFFSET_FACIAL_STYLE); mirrorImageComponentedData.GuildGUID = (guild ? guild->GetGUID() : ObjectGuid::Empty); mirrorImageComponentedData.ItemDisplayID.reserve(11); static EquipmentSlots const itemSlots[] = { EQUIPMENT_SLOT_HEAD, EQUIPMENT_SLOT_SHOULDERS, EQUIPMENT_SLOT_BODY, EQUIPMENT_SLOT_CHEST, EQUIPMENT_SLOT_WAIST, EQUIPMENT_SLOT_LEGS, EQUIPMENT_SLOT_FEET, EQUIPMENT_SLOT_WRISTS, EQUIPMENT_SLOT_HANDS, EQUIPMENT_SLOT_TABARD, EQUIPMENT_SLOT_BACK, EQUIPMENT_SLOT_END }; // Display items in visible slots for (auto const& slot : itemSlots) { uint32 itemDisplayId; if ((slot == EQUIPMENT_SLOT_HEAD && player->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_HIDE_HELM)) || (slot == EQUIPMENT_SLOT_BACK && player->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_HIDE_CLOAK))) itemDisplayId = 0; else if (Item const* item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, slot)) itemDisplayId = item->GetDisplayId(); else itemDisplayId = 0; mirrorImageComponentedData.ItemDisplayID.push_back(itemDisplayId); } SendPacket(mirrorImageComponentedData.Write()); } else { WorldPackets::Spells::MirrorImageCreatureData mirrorImageCreatureData; mirrorImageCreatureData.UnitGUID = guid; mirrorImageCreatureData.DisplayID = creator->GetDisplayId(); SendPacket(mirrorImageCreatureData.Write()); } }