bool GossipSelect_go_ulduar_teleporter(Player* pPlayer, GameObject* pGo, uint32 sender, uint32 action) { int32 damage = 0; if (sender != GOSSIP_SENDER_MAIN) return false; if (pPlayer->IsInCombat()) return false; if (action >= 0 && action <= PORTALS_COUNT) pPlayer->TeleportTo(PortalLoc[action].map_num, PortalLoc[action].x, PortalLoc[action].y, PortalLoc[action].z, PortalLoc[action].o); if (PortalLoc[action].spellID != 0 ) { if (SpellEntry const* spell = (SpellEntry*)GetSpellStore()->LookupEntry(PortalLoc[action].spellID)) { SpellAuraHolderPtr holder = CreateSpellAuraHolder(spell, pPlayer, pPlayer); Aura* aura = holder->CreateAura(AURA_CLASS_AURA, EFFECT_INDEX_2, NULL, holder, pPlayer, pPlayer, NULL); pPlayer->AddSpellAuraHolder(holder); } } pPlayer->CLOSE_GOSSIP_MENU(); return true; }
void UpdateAI(const uint32 uiDiff) { if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; // Berserk if (m_uiBerserkTimer <= uiDiff) { if (DoCastSpellIfCan(m_creature, SPELL_BERSERK) == CAST_OK) { DoScriptText(SAY_BERSERK, m_creature); m_uiBerserkTimer = 5 * MINUTE * IN_MILLISECONDS; } } else m_uiBerserkTimer -= uiDiff; // Gastric Bloat if (m_uiGastricBloatTimer <= uiDiff) { if (DoCastSpellIfCan(m_creature->getVictim(), SPELL_GASTRIC_BLOAT_TRIG) == CAST_OK) m_uiGastricBloatTimer = 10000; } else m_uiGastricBloatTimer -= uiDiff; // Inhale Blight, Pungent Blight if (m_uiInhaleBlightTimer <= uiDiff) { // check for Pungent Blight SpellAuraHolderPtr holder = m_creature->GetSpellAuraHolder(SPELL_INHALED_BLIGHT_10); if (!holder) holder = m_creature->GetSpellAuraHolder(SPELL_INHALED_BLIGHT_25); if (holder) { if (holder->GetStackAmount() >= 3) { // can't inhale anymore... if (DoCastSpellIfCan(m_creature, SPELL_PUNGENT_BLIGHT) == CAST_OK) { DoScriptText(SAY_PUNGUENT_BLIGHT_EMOTE, m_creature); DoScriptText(SAY_PUNGUENT_BLIGHT, m_creature); m_uiInhaleBlightTimer = 35000; } return; } } if (DoCastSpellIfCan(m_creature, SPELL_INHALE_BLIGHT) == CAST_OK) { if (m_pInstance) { if (Creature *pProfessor = m_pInstance->GetSingleCreatureFromStorage(NPC_PROFESSOR_PUTRICIDE)) DoScriptText(SAY_BLIGHT, pProfessor); } m_uiInhaleBlightTimer = 30000; } } else m_uiInhaleBlightTimer -= uiDiff; // Gas Spore if (m_uiGasSporeTimer <= uiDiff) { if (DoCastSpellIfCan(m_creature, SPELL_GAS_SPORE) == CAST_OK) { DoScriptText(SAY_SPORE, m_creature); m_uiGasSporeTimer = 40000; // make sure Vile Gas is not cast when players are gathered near Gas Spore if (m_uiVileGasTimer < 12000) m_uiVileGasTimer = 12000; } } else m_uiGasSporeTimer -= uiDiff; // Vile Gas if (m_uiVileGasTimer <= uiDiff) { // DoCastSpellIfCan(m_creature, SPELL_VILE_GAS_SUMMON, CAST_TRIGGERED); // DoCastSpellIfCan(m_creature, SPELL_VILE_GAS, CAST_TRIGGERED); if (Unit *pTarget = SelectRandomRangedTarget(m_creature)) { pTarget->CastSpell(pTarget, SPELL_VILE_GAS_SUMMON_TRIG, true); DoCastSpellIfCan(m_creature, SPELL_VILE_GAS, CAST_TRIGGERED); m_uiVileGasTimer = 30000; } } else m_uiVileGasTimer -= uiDiff; // Malleable Goo if (m_bIsHeroic) { if (m_uiMalleableGooTimer <= uiDiff) { if (Creature *pProfessor = m_pInstance->GetSingleCreatureFromStorage(NPC_PROFESSOR_PUTRICIDE)) { if (Unit *pTarget = SelectRandomRangedTarget(m_creature)) { // pProfessor->CastSpell(m_creature, SPELL_MALLEABLE_GOO_SUMMON, true); // pProfessor->CastSpell(m_creature, SPELL_MALLEABLE_GOO, true); float x, y, z; pTarget->GetPosition(x, y, z); if (Creature *pTmp = m_creature->SummonCreature(NPC_MALLEABLE_GOO, x, y, z, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 20000)) { pProfessor->CastSpell(pTmp, SPELL_MALLEABLE_GOO_MISSILE, false); m_uiMalleableGooTimer = urand(15000, 20000); } } } } else m_uiMalleableGooTimer -= uiDiff; } DoMeleeAttackIfReady(); }
bool PlayerbotDruidAI::HealTarget(Unit *target) { PlayerbotAI* ai = GetAI(); uint8 hp = target->GetHealth() * 100 / target->GetMaxHealth(); //If spell exists and orders say we should be dispelling if ((REMOVE_CURSE > 0 || ABOLISH_POISON > 0) && ai->GetCombatOrder() != PlayerbotAI::ORDERS_NODISPEL) { //This does something important(lol) uint32 dispelMask = GetDispellMask(DISPEL_CURSE); uint32 dispelMask2 = GetDispellMask(DISPEL_POISON); //Get a list of all the targets auras(spells affecting target) Unit::SpellAuraHolderMap const& auras = target->GetSpellAuraHolderMap(); //Iterate through the auras for (Unit::SpellAuraHolderMap::const_iterator itr = auras.begin(); itr != auras.end(); ++itr) { SpellAuraHolderPtr holder = itr->second; //I dont know what this does but it doesn't work without it if ((1 << holder->GetSpellProto()->Dispel) & dispelMask) { //If the spell is dispellable and we can dispel it, do so if ((holder->GetSpellProto()->Dispel == DISPEL_CURSE) & (REMOVE_CURSE > 0)) ai->CastSpell(REMOVE_CURSE, *target); return false; } else if ((1 << holder->GetSpellProto()->Dispel) & dispelMask2) { if ((holder->GetSpellProto()->Dispel == DISPEL_POISON) & (ABOLISH_POISON > 0)) ai->CastSpell(ABOLISH_POISON, *target); return false; } } } if (hp >= 70) return false; // Reset form if needed GoBuffForm(GetPlayerBot()); if (hp < 70 && REJUVENATION > 0 && !target->HasAura(REJUVENATION) && ai->CastSpell(REJUVENATION, *target)) return true; if (hp < 60 && LIFEBLOOM > 0 && !target->HasAura(LIFEBLOOM) && ai->CastSpell(LIFEBLOOM, *target)) return true; if (hp < 55 && REGROWTH > 0 && !target->HasAura(REGROWTH) && ai->CastSpell(REGROWTH, *target)) return true; if (hp < 50 && SWIFTMEND > 0 && (target->HasAura(REJUVENATION) || target->HasAura(REGROWTH)) && ai->CastSpell(SWIFTMEND, *target)) return true; if (hp < 45 && WILD_GROWTH > 0 && !target->HasAura(WILD_GROWTH) && ai->CastSpell(WILD_GROWTH, *target)) return true; if (hp < 30 && NOURISH > 0 && ai->CastSpell(NOURISH, *target)) return true; if (hp < 25 && HEALING_TOUCH > 0 && ai->CastSpell(HEALING_TOUCH, *target)) return true; return false; } // end HealTarget
bool BSWScriptedAI::_doAura(uint32 SpellID, Unit* pTarget, SpellEffectIndex index, int32 basepoint, bool isStack) { if (!pTarget || !pTarget->IsInMap(m_creature) || !pTarget->isAlive()) { error_log("BSW: FAILED adding aura of spell number %u - no target or target not in map or target is dead",SpellID); return false; } if (_hasAura(SpellID,pTarget)) debug_log("BSW: adding aura stack from spell %u index %u",SpellID, index); else debug_log("BSW: adding new aura from spell %u index %u",SpellID, index); SpellEntry const *spell = (SpellEntry *)GetSpellStore()->LookupEntry(SpellID); if (spell) { if (IsSpellAppliesAura(spell, (1 << EFFECT_INDEX_0) | (1 << EFFECT_INDEX_1) | (1 << EFFECT_INDEX_2)) || IsSpellHaveEffect(spell, SPELL_EFFECT_PERSISTENT_AREA_AURA)) { int32 _basepoint = basepoint ? basepoint - 1 : spell->EffectBasePoints[index] + 1; bool addedToExisting = true; SpellAuraHolderPtr holder = pTarget->GetSpellAuraHolder(SpellID, pTarget->GetObjectGuid()); Aura* aura = NULL; if (!holder) { holder = CreateSpellAuraHolder(spell, pTarget, pTarget); addedToExisting = false; } if (aura = holder->GetAuraByEffectIndex(index)) { if (isStack) holder->ModStackAmount(1); } else { aura = holder->CreateAura(spell, index, &_basepoint, holder, pTarget, m_creature, NULL); holder->SetAuraDuration(aura->GetAuraMaxDuration()); } if (addedToExisting) { pTarget->AddAuraToModList(aura); holder->SetInUse(true); aura->ApplyModifier(true,true); holder->SetInUse(false); } else pTarget->AddSpellAuraHolder(holder); return true; } } error_log("BSW: FAILED adding aura from spell %u index %u",SpellID, index); return false; };
void WorldSession::BuildPartyMemberStatsChangedPacket(Player *player, WorldPacket *data) { uint32 mask = player->GetGroupUpdateFlag(); if (mask & GROUP_UPDATE_FLAG_POWER_TYPE) // if update power type, update current/max power also mask |= (GROUP_UPDATE_FLAG_CUR_POWER | GROUP_UPDATE_FLAG_MAX_POWER); if (mask & GROUP_UPDATE_FLAG_PET_POWER_TYPE) // same for pets mask |= (GROUP_UPDATE_FLAG_PET_CUR_POWER | GROUP_UPDATE_FLAG_PET_MAX_POWER); uint32 byteCount = 0; for (int i = 1; i < GROUP_UPDATE_FLAGS_COUNT; ++i) if (mask & (1 << i)) byteCount += GroupUpdateLength[i]; data->Initialize(SMSG_PARTY_MEMBER_STATS, 8 + 4 + byteCount); *data << player->GetPackGUID(); *data << uint32(mask); if (mask & GROUP_UPDATE_FLAG_STATUS) { if (player->IsPvP()) *data << uint16(MEMBER_STATUS_ONLINE | MEMBER_STATUS_PVP); else *data << uint16(MEMBER_STATUS_ONLINE); } if (mask & GROUP_UPDATE_FLAG_CUR_HP) *data << uint32(player->GetHealth()); if (mask & GROUP_UPDATE_FLAG_MAX_HP) *data << uint32(player->GetMaxHealth()); Powers powerType = player->getPowerType(); if (mask & GROUP_UPDATE_FLAG_POWER_TYPE) *data << uint8(powerType); if (mask & GROUP_UPDATE_FLAG_CUR_POWER) *data << uint16(player->GetPower(powerType)); if (mask & GROUP_UPDATE_FLAG_MAX_POWER) *data << uint16(player->GetMaxPower(powerType)); if (mask & GROUP_UPDATE_FLAG_LEVEL) *data << uint16(player->getLevel()); if (mask & GROUP_UPDATE_FLAG_ZONE) *data << uint16(player->GetZoneId()); if (mask & GROUP_UPDATE_FLAG_POSITION) *data << uint16(player->GetPositionX()) << uint16(player->GetPositionY()); if (mask & GROUP_UPDATE_FLAG_AURAS) { const uint64& auramask = player->GetAuraUpdateMask(); *data << uint64(auramask); for(uint32 i = 0; i < MAX_AURAS; ++i) { if(auramask & (uint64(1) << i)) { SpellAuraHolderPtr holder = player->GetVisibleAura(i); *data << uint32(holder ? holder->GetId() : 0); *data << uint8(holder ? 1 : 0); } } } Pet *pet = player->GetPet(); if (mask & GROUP_UPDATE_FLAG_PET_GUID) *data << (pet ? pet->GetObjectGuid() : ObjectGuid()); if (mask & GROUP_UPDATE_FLAG_PET_NAME) { if(pet) *data << pet->GetName(); else *data << uint8(0); } if (mask & GROUP_UPDATE_FLAG_PET_MODEL_ID) { if(pet) *data << uint16(pet->GetDisplayId()); else *data << uint16(0); } if (mask & GROUP_UPDATE_FLAG_PET_CUR_HP) { if(pet) *data << uint32(pet->GetHealth()); else *data << uint32(0); } if (mask & GROUP_UPDATE_FLAG_PET_MAX_HP) { if(pet) *data << uint32(pet->GetMaxHealth()); else *data << uint32(0); } if (mask & GROUP_UPDATE_FLAG_PET_POWER_TYPE) { if(pet) *data << uint8(pet->getPowerType()); else *data << uint8(0); } if (mask & GROUP_UPDATE_FLAG_PET_CUR_POWER) { if(pet) *data << uint16(pet->GetPower(pet->getPowerType())); else *data << uint16(0); } if (mask & GROUP_UPDATE_FLAG_PET_MAX_POWER) { if(pet) *data << uint16(pet->GetMaxPower(pet->getPowerType())); else *data << uint16(0); } if (mask & GROUP_UPDATE_FLAG_PET_AURAS) { if(pet) { MAPLOCK_READ(pet,MAP_LOCK_TYPE_AURAS); const uint64& auramask = pet->GetAuraUpdateMask(); *data << uint64(auramask); for(uint32 i = 0; i < MAX_AURAS; ++i) { if(auramask & (uint64(1) << i)) { SpellAuraHolderPtr holder = pet->GetVisibleAura(i); *data << uint32(holder ? holder->GetId() : 0); *data << uint8(holder ? 1 : 0); } } } else *data << uint64(0); } if (mask & GROUP_UPDATE_FLAG_VEHICLE_SEAT) *data << uint32(player->m_movementInfo.GetTransportDBCSeat()); }