void Totem::UnSummon() { CombatStop(); RemoveAurasDueToSpell(GetSpell()); // clear owner's totem slot for (int i = SUMMON_SLOT_TOTEM; i < MAX_TOTEM_SLOT; ++i) { if (m_owner->m_SummonSlot[i] == GetGUID()) { m_owner->m_SummonSlot[i] = 0; break; } } m_owner->RemoveAurasDueToSpell(GetSpell()); //remove aura all party members too Group *pGroup = NULL; if (m_owner->GetTypeId() == TYPEID_PLAYER) { m_owner->ToPlayer()->SendAutoRepeatCancel(this); // Not only the player can summon the totem (scripted AI) pGroup = m_owner->ToPlayer()->GetGroup(); if (pGroup) { for (GroupReference *itr = pGroup->GetFirstMember(); itr != NULL; itr = itr->next()) { Player* Target = itr->getSource(); if (Target && pGroup->SameSubGroup((Player*)m_owner, Target)) Target->RemoveAurasDueToSpell(GetSpell()); } } } AddObjectToRemoveList(); }
void Totem::UnSummon() { SendObjectDeSpawnAnim(GetObjectGuid()); CombatStop(); RemoveAurasDueToSpell(GetSpell()); if (Unit* owner = GetOwner()) { owner->_RemoveTotem(this); owner->RemoveAurasDueToSpell(GetSpell()); // remove aura all party members too if (owner->GetTypeId() == TYPEID_PLAYER) { // Not only the player can summon the totem (scripted AI) if (Group* pGroup = ((Player*)owner)->GetGroup()) { for (GroupReference* itr = pGroup->GetFirstMember(); itr != NULL; itr = itr->next()) { Player* Target = itr->getSource(); if (Target && pGroup->SameSubGroup((Player*)owner, Target)) { Target->RemoveAurasDueToSpell(GetSpell()); } } } } if (owner->GetTypeId() == TYPEID_UNIT && ((Creature*)owner)->AI()) { ((Creature*)owner)->AI()->SummonedCreatureDespawn((Creature*)this); } } // any totem unsummon look like as totem kill, req. for proper animation if (IsAlive()) { SetDeathState(DEAD); } AddObjectToRemoveList(); }
void Totem::UnSummon() { CombatStop(); for (uint8 i=0; i<CREATURE_MAX_SPELLS; i++) RemoveAurasDueToSpell(m_spells[i]); if (Unit *owner = GetOwner()) { owner->_RemoveTotem(this); for (uint8 i=0; i<CREATURE_MAX_SPELLS; i++) owner->RemoveAurasDueToSpell(m_spells[i]); //remove aura all party members too if (owner->GetTypeId() == TYPEID_PLAYER) { ((Player*)owner)->SendAutoRepeatCancel(this); // Not only the player can summon the totem (scripted AI) if (Group *pGroup = ((Player*)owner)->GetGroup()) { for(GroupReference *itr = pGroup->GetFirstMember(); itr != NULL; itr = itr->next()) { Player* Target = itr->getSource(); if(Target && pGroup->SameSubGroup((Player*)owner, Target)) for (uint8 i=0; i<CREATURE_MAX_SPELLS; i++) Target->RemoveAurasDueToSpell(m_spells[i]); } } } if (owner->GetTypeId() == TYPEID_UNIT && ((Creature*)owner)->AI()) ((Creature*)owner)->AI()->SummonedCreatureDespawn((Creature*)this); } AddObjectToRemoveList(); }
// apply a team buff for the specific zone void WorldPvP::DoProcessTeamBuff(Team uiTeam, uint32 uiSpellId, bool bRemove) { for (ObjectGuidSet::iterator itr = m_sZonePlayers.begin(); itr != m_sZonePlayers.end(); ++itr) { if (!(*itr)) continue; Player* pPlayer = sObjectMgr.GetPlayer(*itr); if (!pPlayer) continue; if (pPlayer->GetTeam() == uiTeam) { if (!bRemove) pPlayer->CastSpell(pPlayer, uiSpellId, true); else { if (pPlayer->HasAura(uiSpellId)) pPlayer->RemoveAurasDueToSpell(uiSpellId); } } } }
//Enable\Disable Invisible mode static bool HandleGMVisibleCommand(ChatHandler* handler, char const* args) { if (!*args) { handler->PSendSysMessage(LANG_YOU_ARE, handler->GetSession()->GetPlayer()->isGMVisible() ? handler->GetTrinityString(LANG_VISIBLE) : handler->GetTrinityString(LANG_INVISIBLE)); return true; } const uint32 VISUAL_AURA = 37800; std::string param = (char*)args; Player* player = handler->GetSession()->GetPlayer(); if (param == "on") { if (player->HasAura(VISUAL_AURA, 0)) player->RemoveAurasDueToSpell(VISUAL_AURA); player->SetGMVisible(true); handler->GetSession()->SendNotification(LANG_INVISIBLE_VISIBLE); return true; } if (param == "off") { handler->GetSession()->SendNotification(LANG_INVISIBLE_INVISIBLE); player->SetGMVisible(false); player->AddAura(VISUAL_AURA, player); return true; } handler->SendSysMessage(LANG_USE_BOL); handler->SetSentErrorMessage(true); return false; }
void LfgGroup::KilledCreature(Creature *creature) { if ((creature->GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_INSTANCE_BIND) && m_instanceStatus == INSTANCE_NOT_SAVED) { m_instanceStatus = INSTANCE_SAVED; } if (!m_awarded && creature->GetEntry() == sLfgMgr.GetDungeonInfo(m_dungeonInfo->ID)->lastBossId) { //Last boss m_instanceStatus = INSTANCE_COMPLETED; //Reward here for (GroupReference *itr = GetFirstMember(); itr != NULL; itr = itr->next()) { Player *plr = itr->getSource(); if (!plr || !plr->IsInWorld()) continue; WorldPacket data(SMSG_LFG_PLAYER_REWARD); data << uint32(GetDungeonInfo((IsRandom() || IsFromRnd(plr->GetGUID())))->Entry()); data << uint32(m_dungeonInfo->Entry()); uint32 ID = GetDungeonInfo((IsRandom() || IsFromRnd(plr->GetGUID())))->ID; sLfgMgr.BuildRewardBlock(&data, ID, plr); plr->GetSession()->SendPacket(&data); LfgReward *reward = sLfgMgr.GetDungeonReward(ID, plr->m_lookingForGroup.DoneDungeon(ID, plr), plr->getLevel()); if (!reward) continue; plr->CompleteQuest(reward->questInfo->GetQuestId()); if (IsRandom()) plr->RemoveAurasDueToSpell(LFG_RANDOM_COOLDOWN); } m_awarded = true; } SendUpdate(); }
bool ChatHandler::HandleUnFreezeCommand(char *args) { std::string name; Player* player; char* TargetName = strtok((char*)args, " "); //get entered #name if (!TargetName) //if no #name entered use target { player = getSelectedPlayer(); if (player) //prevent crash with creature as target { name = player->GetName(); } } else // if #name entered { name = TargetName; normalizePlayerName(name); player = sObjectMgr.GetPlayer(name.c_str()); //get player by #name } //effect if (player) { PSendSysMessage(LANG_COMMAND_UNFREEZE, name.c_str()); //Reset player faction + allow combat + allow duels player->setFactionForRace(player->getRace()); player->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); //allow movement and spells uint32 spellID = 9454; // uint32 spellID1 = 23775; player->RemoveAurasDueToSpell(spellID); //save player player->SaveToDB(); } if (!player) { if (TargetName) { //check for offline players QueryResult *result = CharacterDatabase.PQuery("SELECT characters.guid FROM `characters` WHERE characters.name = '%s'", name.c_str()); if (!result) { SendSysMessage(LANG_COMMAND_FREEZE_WRONG); return true; } //if player found: delete his freeze aura Field *fields = result->Fetch(); uint64 pguid = fields[0].GetUInt64(); delete result; CharacterDatabase.PQuery("DELETE FROM `character_aura` WHERE character_aura.spell = 9454 AND character_aura.guid = '%u'", pguid); PSendSysMessage(LANG_COMMAND_UNFREEZE, name.c_str()); return true; } else { SendSysMessage(LANG_COMMAND_FREEZE_WRONG); return true; } } return true; }
void BattleGroundSA::Update(uint32 diff) { BattleGround::Update(diff); if (GetStatus() == STATUS_WAIT_JOIN && !shipsStarted) if (Phase == SA_ROUND_ONE) // Round one not started yet { if (shipsTimer <= diff) StartShips(); else shipsTimer -= diff; } if (GetStatus() == STATUS_IN_PROGRESS) // Battleground already in progress { if (Round_timer >= BG_SA_ROUNDLENGTH) { if (Phase == SA_ROUND_ONE) // Timeout of first round { PlaySoundToAll(BG_SA_SOUND_GYD_VICTORY); SendMessageToAll(defender == ALLIANCE ? LANG_BG_SA_ALLIANCE_TIMEOUT_END_1ROUND : LANG_BG_SA_HORDE_TIMEOUT_END_1ROUND, CHAT_MSG_BG_SYSTEM_NEUTRAL, NULL); SendWarningToAll(LANG_BG_SA_END_1ROUND); RoundScores[0].winner = GetDefender(); RoundScores[0].time = BG_SA_ROUNDLENGTH; for (BattleGroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) { Player* plr = sObjectMgr.GetPlayer(itr->first); if (plr) plr->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, BG_SA_END_OF_ROUND); } ResetBattle(0, defender); } else // Timeout of second round { SendMessageToAll(defender == ALLIANCE ? LANG_BG_SA_ALLIANCE_TIMEOUT_END_2ROUND : LANG_BG_SA_HORDE_TIMEOUT_END_2ROUND, CHAT_MSG_BG_SYSTEM_NEUTRAL, NULL); RoundScores[1].winner = GetDefender(); for (BattleGroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) { Player* plr = sObjectMgr.GetPlayer(itr->first); if (plr) plr->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, BG_SA_END_OF_ROUND); } if (RoundScores[0].winner == GetDefender()) EndBattleGround(GetDefender()); else EndBattleGround(TEAM_NONE); return; } } else Round_timer += diff; for (int gyd = 0; gyd < BG_SA_GRY_MAX; ++gyd) { // 3 sec delay to spawn new banner instead previous despawned one if (m_BannerTimers[gyd].timer) { if (m_BannerTimers[gyd].timer > diff) m_BannerTimers[gyd].timer -= diff; else { m_BannerTimers[gyd].timer = 0; _CreateBanner(gyd, m_BannerTimers[gyd].type, m_BannerTimers[gyd].teamIndex, false); } } } UpdateTimer(); } if (GetStatus() == STATUS_WAIT_JOIN && Phase == SA_ROUND_TWO) // Round two, not yet started { if (!shipsStarted) { if (shipsTimer <= diff) { SendMessageToAll(LANG_BG_SA_START_ONE_MINUTE, CHAT_MSG_BG_SYSTEM_NEUTRAL, NULL); StartShips(); } else shipsTimer -= diff; } if (TimeST2Round < diff) { Phase = SA_ROUND_TWO; SpawnEvent(SA_EVENT_ADD_NPC, 0, true); SpawnEvent(SA_EVENT_ADD_BOMB_B, (GetDefender() == ALLIANCE ? BG_SA_GRAVE_STATUS_HORDE_OCCUPIED : BG_SA_GRAVE_STATUS_ALLY_OCCUPIED), true); ToggleTimer(); SetStatus(STATUS_IN_PROGRESS); // Start round two PlaySoundToAll(SOUND_BG_START); SendWarningToAll(LANG_BG_SA_HAS_BEGUN); for (BattleGroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) { Player* plr = sObjectMgr.GetPlayer(itr->first); if (plr) { plr->RemoveAurasDueToSpell(SPELL_PREPARATION); if(plr->GetTeam()!=GetDefender()) { plr->GetAchievementMgr().StartTimedAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET,BG_SA_STORM_THE_BEACH_TIMER1); plr->GetAchievementMgr().StartTimedAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET,BG_SA_STORM_THE_BEACH_TIMER2); } } } } else TimeST2Round -= diff; } }
void UpdateAI(const uint32 diff) { if (WaterTimer < diff) // every 1000ms { Map *map = m_creature->GetMap(); if(!map->IsDungeon()) return; Map::PlayerList const &players = map->GetPlayers(); if(players.getSize()==0) return; for(Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) { Player* plr = itr->getSource(); if (!plr) continue; if (!(plr)->GetSession() || !(plr)->isAlive()) continue; if (!InCombat && plr->GetDistance(m_creature) < 2.25 && (plr->HasAura(33095, 2))) { if (TimeToSpawn%40 == 0) { DoYell(EMOTE_STOPFISHING, LANG_UNIVERSAL, NULL); } if (FirstVictim == 0) FirstVictim = plr; // Remember the first player who started fishing // the player is trying to catch fish TimeToSpawn--; // Time to spawn reduced for every fishing player by 1 per second } // --> more fishermen(and-women): faster spawn if (!InCombat && (TimeToSpawn<=1)) // effective up to TimeToSpawn seconds of fishing { if (pInstance) pInstance->SetData(DATA_THELURKERBELOWEVENT, IN_PROGRESS); m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); m_creature->RemoveFlag(UNIT_NPC_EMOTESTATE, EMOTE_STATE_SUBMERGED); DoCast(m_creature, SPELL_EMERGE); m_creature->setFaction(14); InCombat = true; if (FirstVictim) { if (FirstVictim->GetSession() && FirstVictim->isAlive()) m_creature->AddThreat(FirstVictim, 1.0f); // guarantee, that first fisher is first in ThreatList } Aggro(NULL); // Put anybody else into the fight (with 0.0 aggro) } if(plr && plr->GetDistance(m_creature ) > 5625) { if (plr->HasAura(SCALDING_WATER,0)) plr->RemoveAurasDueToSpell(SCALDING_WATER); if (plr->IsInWater() && !plr->isGameMaster() && !InCombat) { Fishy = plr->SummonCreature(MOB_COILFANG_FRENZY,plr->GetPositionX(),plr->GetPositionY(),plr->GetPositionZ(),plr->GetOrientation(),TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,15000); if (Fishy) Fishy->AI()->AttackStart(plr); } }else{ if (plr->IsInWater()) { if (!plr->HasAura(SCALDING_WATER,0)) plr->CastSpell(plr,SCALDING_WATER,true); }else{ if (plr->HasAura(SCALDING_WATER,0)) plr->RemoveAurasDueToSpell(SCALDING_WATER); } } } WaterTimer = 1000; }else WaterTimer -= diff; //Return since we have no target if (!m_creature->SelectHostilTarget() || !m_creature->getVictim() ) return; if(!Submerged) { if(SpoutTimer < diff) { //Turning while spouting ;) bit fuzzy but working if (OrientationUpdated == -1) { OrientationUpdated = 0; Unit* target = NULL; target = SelectUnit(SELECT_TARGET_TOPAGGRO,0); m_creature->SetUInt64Value(UNIT_FIELD_TARGET, 0); //DoTextEmote(EMOTE_SPOUT,NULL); SpoutTimer = 5000; switch(rand()%2) { case 0: Clockwise = true; break; case 1: Clockwise = false; break; } guids.clear(); //clear targets return; } else { if(Clockwise) SpoutAngle += PI/100; else SpoutAngle -= PI/100; if(SpoutAngle > 2*PI) SpoutAngle -= 2*PI; if(SpoutAngle < 0) SpoutAngle += 2*PI; //So spin around ya evil fish m_creature->SetUInt64Value(UNIT_FIELD_TARGET, 0); m_creature->SetOrientation(SpoutAngle); m_creature->StopMoving(); //Spout part if(SVTimer < diff) { DoCast(m_creature, SPELL_SPOUT); SVTimer = 850; } SVTimer -= diff; OrientationUpdated++; SpoutTimer = 100; if (OrientationUpdated == 200) { SpoutTimer = 45000; OrientationUpdated = -1; WhirlTimer = 5000; Unit *victim = m_creature->getVictim(); if(victim) { m_creature->SetUInt64Value(UNIT_FIELD_TARGET, victim->GetGUID()); } } } }else SpoutTimer -= diff; if(PhaseTimer >= diff) PhaseTimer -= diff; //need to count the phase timer while spouting too if(OrientationUpdated != -1) return; //Whirl directly after a Spout and at random times if(WhirlTimer < diff) { WhirlTimer = rand()%5000 + 15000; DoCast(m_creature,SPELL_WHIRL); }else WhirlTimer -= diff; if(PhaseTimer < diff) { DoCast(m_creature,SPELL_SUBMERGE); PhaseTimer = 60000; Submerged = true; }else PhaseTimer -= diff; if(GeyserTimer < diff) { Unit* target = NULL; target = SelectUnit(SELECT_TARGET_RANDOM,1); GeyserTimer = rand()%15000 + 10000; if(target) DoCast(target,SPELL_GEYSER); }else GeyserTimer -= diff; if(WaterboltTimer < diff) { Unit* target = NULL; int i = 0; bool meleeTarget = false; target = SelectUnit(SELECT_TARGET_TOPAGGRO,0); if (!target) target = m_creature->getVictim(); while (target) { if( m_creature->IsWithinDistInMap(target, 6)) { meleeTarget = true; break; } target = SelectUnit(SELECT_TARGET_TOPAGGRO,i); i++; } if(!meleeTarget) { DoCast(m_creature->getVictim(),SPELL_WATERBOLT); WaterboltTimer = 3000; } else DoMeleeAttackIfReady(); // WTF ? (1) }else WaterboltTimer -= diff; DoMeleeAttackIfReady(); //(1) } else { if(PhaseTimer < diff) { Submerged = false; m_creature->RemoveAllAuras(); m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); m_creature->RemoveFlag(UNIT_NPC_EMOTESTATE, EMOTE_STATE_SUBMERGED); m_creature->RemoveFlag(UNIT_FIELD_BYTES_1,9); DoCast(m_creature, SPELL_EMERGE); Spawned = false; SpoutTimer = 5000; PhaseTimer = 120000; return; } else { /*if(!m_creature->isInCombat()) m_creature->SetInCombat();*/ PhaseTimer -= diff; } if(!Spawned) { m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); SummonAdd(MOBID_COILFANG_AMBUSHER,AddPos[0][0],AddPos[0][1],AddPos[0][2]); SummonAdd(MOBID_COILFANG_AMBUSHER,AddPos[1][0],AddPos[1][1],AddPos[1][2]); SummonAdd(MOBID_COILFANG_AMBUSHER,AddPos[2][0],AddPos[2][1],AddPos[2][2]); SummonAdd(MOBID_COILFANG_AMBUSHER,AddPos[3][0],AddPos[3][1],AddPos[3][2]); SummonAdd(MOBID_COILFANG_AMBUSHER,AddPos[4][0],AddPos[4][1],AddPos[4][2]); SummonAdd(MOBID_COILFANG_AMBUSHER,AddPos[5][0],AddPos[5][1],AddPos[5][2]); SummonAdd(MOBID_COILFANG_GUARDIAN,AddPos[6][0],AddPos[6][1],AddPos[6][2]); SummonAdd(MOBID_COILFANG_GUARDIAN,AddPos[7][0],AddPos[7][1],AddPos[7][2]); SummonAdd(MOBID_COILFANG_GUARDIAN,AddPos[8][0],AddPos[8][1],AddPos[8][2]); Spawned = true; } } }
void UpdateAI(const uint32 uiDiff) { if (!m_pInstance) return; if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) { if (m_pInstance->GetData(TYPE_THADDIUS) == SPECIAL) // make thaddius attackable 15 seconds after stalagg&feugen are dead if(m_uiStartTimer < uiDiff) m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); else m_uiStartTimer -= uiDiff; return; } if(m_uiScreamTimer < uiDiff) { switch(urand(0,3)) { case 0: DoScriptText(SAY_SCREAM1,m_creature); break; case 1: DoScriptText(SAY_SCREAM2,m_creature); break; case 2: DoScriptText(SAY_SCREAM3,m_creature); break; case 3: DoScriptText(SAY_SCREAM4,m_creature); break; } m_uiScreamTimer = urand(15000, 60000); } else m_uiScreamTimer -= uiDiff; if(!m_creature->IsWithinDistInMap(m_creature->getVictim(),5.f)) // this is not correct, spell should be cast when checked if no player is near Thaddius { if(m_uiBallLightningTimer < uiDiff) { m_creature->CastSpell(m_creature->getVictim(),SPELL_BALL_LIGHTNING,true); m_uiBallLightningTimer = urand(5000, 10000); // timers probably not right } else m_uiBallLightningTimer -= uiDiff; } if (m_uiChainLightningTimer < uiDiff) { m_creature->CastSpell(m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM,0),m_bIsRegularMode?SPELL_CHAIN_LIGHTNING:SPELL_CHAIN_LIGHTNING_H,true); m_uiChainLightningTimer = urand(14000,16000); } else m_uiChainLightningTimer -= uiDiff; if (m_uiPolarityShiftTimer < uiDiff) { // get count of positive and negative charges uint32 m_uiNegativeCharge = m_creature->GetMap()->GetPlayersCountExceptGMs() / 2; uint32 m_uiPositiveCharge = m_creature->GetMap()->GetPlayersCountExceptGMs() - m_uiNegativeCharge; // split players into positive and negative charged Map* pMap = m_creature->GetMap(); Map::PlayerList const& pPlayers = pMap->GetPlayers(); if (!pPlayers.isEmpty()) { for (Map::PlayerList::const_iterator itr = pPlayers.begin(); itr != pPlayers.end(); ++itr) { if (itr->getSource()->isGameMaster()) continue; Player *pTarget = itr->getSource(); pTarget->RemoveAurasDueToSpell(SPELL_CHARGE_POSITIVE_DMGBUFF); pTarget->RemoveAurasDueToSpell(SPELL_CHARGE_NEGATIVE_DMGBUFF); pTarget->RemoveAurasDueToSpell(SPELL_CHARGE_POSITIVE_NEARDMG); pTarget->RemoveAurasDueToSpell(SPELL_CHARGE_NEGATIVE_NEARDMG); if(((rand()%2) && m_uiNegativeCharge) || (!m_uiPositiveCharge)) { pTarget->CastSpell(pTarget,SPELL_CHARGE_NEGATIVE_NEARDMG,true); m_uiNegativeCharge--; } else { pTarget->CastSpell(pTarget,SPELL_CHARGE_POSITIVE_NEARDMG,true); m_uiPositiveCharge--; } } } m_uiPolarityShiftTimer = 30000; } else m_uiPolarityShiftTimer -= uiDiff; if (m_uiEnrageTimer < uiDiff) { m_creature->CastSpell(m_creature,SPELL_BERSERK,true); m_uiEnrageTimer = 10*MINUTE*IN_MILLISECONDS; } else m_uiEnrageTimer -= uiDiff; DoMeleeAttackIfReady(); }
void BattlegroundDS::PostUpdateImpl(uint32 diff) { if (GetStatus() != STATUS_IN_PROGRESS) return; if (getPipeKnockBackCount() < BG_DS_PIPE_KNOCKBACK_TOTAL_COUNT) { if (getPipeKnockBackTimer() < diff) { for (uint32 i = BG_DS_NPC_PIPE_KNOCKBACK_1; i <= BG_DS_NPC_PIPE_KNOCKBACK_2; ++i) if (Creature* waterSpout = GetBgMap()->GetCreature(BgCreatures[i])) waterSpout->CastSpell(waterSpout, BG_DS_SPELL_FLUSH, true); setPipeKnockBackCount(getPipeKnockBackCount() + 1); setPipeKnockBackTimer(BG_DS_PIPE_KNOCKBACK_DELAY); } else setPipeKnockBackTimer(getPipeKnockBackTimer() - diff); } if (getWaterFallStatus() == BG_DS_WATERFALL_STATUS_ON) // Repeat knockback while the waterfall still active { if (getWaterFallKnockbackTimer() < diff) { if (Creature* waterSpout = GetBgMap()->GetCreature(BgCreatures[BG_DS_NPC_WATERFALL_KNOCKBACK])) waterSpout->CastSpell(waterSpout, BG_DS_SPELL_WATER_SPOUT, true); setWaterFallKnockbackTimer(BG_DS_WATERFALL_KNOCKBACK_TIMER); } else setWaterFallKnockbackTimer(getWaterFallKnockbackTimer() - diff); } if (getWaterFallTimer() < diff) { if (getWaterFallStatus() == BG_DS_WATERFALL_STATUS_OFF) // Add the water { DoorClose(BG_DS_OBJECT_WATER_2); setWaterFallTimer(BG_DS_WATERFALL_WARNING_DURATION); setWaterFallStatus(BG_DS_WATERFALL_STATUS_WARNING); } else if (getWaterFallStatus() == BG_DS_WATERFALL_STATUS_WARNING) // Active collision and start knockback timer { if (GameObject* gob = GetBgMap()->GetGameObject(BgObjects[BG_DS_OBJECT_WATER_1])) gob->SetGoState(GO_STATE_READY); setWaterFallTimer(BG_DS_WATERFALL_DURATION); setWaterFallStatus(BG_DS_WATERFALL_STATUS_ON); setWaterFallKnockbackTimer(BG_DS_WATERFALL_KNOCKBACK_TIMER); } else //if (getWaterFallStatus() == BG_DS_WATERFALL_STATUS_ON) // Remove collision and water { // turn off collision if (GameObject* gob = GetBgMap()->GetGameObject(BgObjects[BG_DS_OBJECT_WATER_1])) gob->SetGoState(GO_STATE_ACTIVE); DoorOpen(BG_DS_OBJECT_WATER_2); setWaterFallTimer(urand(BG_DS_WATERFALL_TIMER_MIN, BG_DS_WATERFALL_TIMER_MAX)); setWaterFallStatus(BG_DS_WATERFALL_STATUS_OFF); } } else setWaterFallTimer(getWaterFallTimer() - diff); if (GetStatus() == STATUS_IN_PROGRESS) { if(knockback < diff && knockbackCheck) { for(BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end();itr++) { Player * plr = ObjectAccessor::FindPlayer(itr->first); if (plr->GetTeam() == ALLIANCE && plr->GetDistance2d(1214, 765) <= 50 && plr->GetPositionZ() > 10) KnockBackPlayer(plr, 6.15f, 50.00f, 7.00f); if (plr->GetTeam() == HORDE && plr->GetDistance2d(1369, 817) <= 50 && plr->GetPositionZ() > 10) KnockBackPlayer(plr, 3.10f, 50.00f, 7.00f); plr->RemoveAurasDueToSpell(48018); } knockbackCheck = false; } else knockback -= diff; } }
void UpdateAI(const uint32 uiDiff) override { if (m_uiPossessEndTimer) { // Check if the possessed player has been damaged if (m_uiPossessEndTimer <= uiDiff) { // If aura has expired, return to fight if (!m_creature->HasAura(SPELL_POSSESS_INV)) { m_uiPossessEndTimer = 0; return; } // Check for possessed player Player* pPlayer = m_creature->GetMap()->GetPlayer(m_possessedPlayer); if (!pPlayer || !pPlayer->IsAlive()) { m_creature->RemoveAurasDueToSpell(SPELL_POSSESS_INV); m_uiPossessEndTimer = 0; return; } // If possessed player has less than 50% health if (pPlayer->GetHealth() <= pPlayer->GetMaxHealth() * .5f) { m_creature->RemoveAurasDueToSpell(SPELL_POSSESS_INV); pPlayer->RemoveAurasDueToSpell(SPELL_POSSESSED); pPlayer->RemoveAurasDueToSpell(SPELL_POSSESS); m_uiPossessEndTimer = 0; return; } m_uiPossessEndTimer = 1000; } else { m_uiPossessEndTimer -= uiDiff; } } if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) { return; } // BansheeWail if (m_uiBansheeWailTimer < uiDiff) { if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0)) { if (DoCastSpellIfCan(pTarget, SPELL_BANSHEE_WAIL) == CAST_OK) { m_uiBansheeWailTimer = urand(2000, 3000); } } } else { m_uiBansheeWailTimer -= uiDiff; } // BansheeCurse if (m_uiBansheeCurseTimer < uiDiff) { if (DoCastSpellIfCan(m_creature, SPELL_BANSHEE_CURSE) == CAST_OK) { m_uiBansheeCurseTimer = 20000; } } else { m_uiBansheeCurseTimer -= uiDiff; } // Silence if (m_uiSilenceTimer < uiDiff) { if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0)) { if (DoCastSpellIfCan(pTarget, SPELL_SILENCE) == CAST_OK) { m_uiSilenceTimer = 25000; } } } else { m_uiSilenceTimer -= uiDiff; } // Possess if (m_uiPossessTimer < uiDiff) { if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 1, SPELL_POSSESS, SELECT_FLAG_PLAYER)) { if (DoCastSpellIfCan(pTarget, SPELL_POSSESS) == CAST_OK) { DoCastSpellIfCan(pTarget, SPELL_POSSESSED, CAST_TRIGGERED); DoCastSpellIfCan(m_creature, SPELL_POSSESS_INV, CAST_TRIGGERED); m_possessedPlayer = pTarget->GetObjectGuid(); m_uiPossessEndTimer = 1000; m_uiPossessTimer = 30000; } } } else { m_uiPossessTimer -= uiDiff; } DoMeleeAttackIfReady(); }
void BattlegroundDS::PostUpdateImpl(uint32 diff) { if (GetStartTime() >= 75*IN_MILLISECONDS) { for (BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); itr++) { Player* player = ObjectAccessor::FindPlayer(itr->first); if (player && player->isAlive() && player->GetPositionX() < 1260 && player->GetPositionY() >755 && player->GetPositionY() < 775 && player->GetPositionZ() > 13) { player->KnockBackWithAngle(6.15f, 50.00f, 5.00f); player->RemoveAurasDueToSpell(48018); } if (player && player->isAlive() && player->GetPositionX() > 1330 && player->GetPositionY() >805 && player->GetPositionY() < 825 && player->GetPositionZ() > 13) { player->KnockBackWithAngle(3.10f, 50.00f, 5.00f); player->RemoveAurasDueToSpell(48018); } } } if (m_knockback) { if (m_knockback <= diff) { for (BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) { Player *player = ObjectAccessor::FindPlayer(itr->first); if (!player) continue; if (player->GetDistance2d(1214.0f, 765.0f) <= 50.0f && player->GetPositionZ() > 13.0f) player->KnockBackWithAngle(0.0f, 55.0f, 9.0f); else if (player->GetDistance2d(1369.0f, 817.0f) <= 50.0f && player->GetPositionZ() > 13.0f) player->KnockBackWithAngle(M_PI, 55.0f, 9.0f); } m_knockback = 0; } else m_knockback -= diff; } if (!m_knockback && m_teleport) { if (m_teleport <= diff) { for (BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) { Player* player = ObjectAccessor::FindPlayer(itr->first); if (!player) continue; if (player->GetPositionZ() > 13.0f) HandlePlayerUnderMap(player); } m_teleport = 5 * IN_MILLISECONDS; } else m_teleport -= diff; } if (m_waterFall <= diff) { if (m_waterFallStatus == 0) // Add the water { DoorClose(BG_DS_OBJECT_WATER_2); m_waterFall = 7 * IN_MILLISECONDS; m_waterFallStatus = 1; } else if (m_waterFallStatus == 1) // Knockback, spawn the LOS object { for (BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) { Player *player = ObjectAccessor::FindPlayer(itr->first); if (!player) continue; if (player->GetDistance2d(1291.56f, 790.837f) <= BG_DS_WATERFALL_RADIUS) player->KnockbackFrom(1291.56f, 790.837f, 20.0f, 7.0f); } SpawnBGObject(BG_DS_OBJECT_WATER_1, RESPAWN_IMMEDIATELY); GetBgMap()->SetDynLOSObjectState(m_dynamicLOSid, true); m_waterFall = BG_DS_WATERFALL_DURATION; m_waterFallStatus = 2; } else // remove LOS and water { DoorOpen(BG_DS_OBJECT_WATER_2); SpawnBGObject(BG_DS_OBJECT_WATER_1, RESPAWN_ONE_DAY); GetBgMap()->SetDynLOSObjectState(m_dynamicLOSid, false); m_waterFall = urand(BG_DS_WATERFALL_TIMER_MIN, BG_DS_WATERFALL_TIMER_MAX); m_waterFallStatus = 0; } } else m_waterFall -= diff; }
void HandleEnergize(SpellEffIndex effIndex) { Player* caster = GetCaster()->ToPlayer(); // No boomy, no deal. if (caster->GetPrimaryTalentTree(caster->GetActiveSpec()) != TALENT_TREE_DRUID_BALANCE) return; switch (GetSpellInfo()->Id) { case SPELL_DRUID_WRATH: { energizeAmount = -GetSpellInfo()->Effects[effIndex].BasePoints; // -13 // If we are set to fill the lunar side or we've just logged in with 0 power.. if ((!caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER) && caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE_MARKER)) || caster->GetPower(POWER_ECLIPSE) == 0) { caster->CastCustomSpell(caster, SPELL_DRUID_ECLIPSE_GENERAL_ENERGIZE, &energizeAmount, 0, 0, true); // If the energize was due to 0 power, cast the eclipse marker aura if (!caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE_MARKER)) caster->CastSpell(caster, SPELL_DRUID_LUNAR_ECLIPSE_MARKER, true); } // The energizing effect brought us out of the solar eclipse, remove the aura if (caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE) && caster->GetPower(POWER_ECLIPSE) <= 0) caster->RemoveAurasDueToSpell(SPELL_DRUID_SOLAR_ECLIPSE); break; } case SPELL_DRUID_STARFIRE: { energizeAmount = GetSpellInfo()->Effects[effIndex].BasePoints; // 20 // If we are set to fill the solar side or we've just logged in with 0 power.. if ((!caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE_MARKER) && caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER)) || caster->GetPower(POWER_ECLIPSE) == 0) { caster->CastCustomSpell(caster, SPELL_DRUID_ECLIPSE_GENERAL_ENERGIZE, &energizeAmount, 0, 0, true); // If the energize was due to 0 power, cast the eclipse marker aura if (!caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER)) caster->CastSpell(caster, SPELL_DRUID_SOLAR_ECLIPSE_MARKER, true); } // The energizing effect brought us out of the lunar eclipse, remove the aura if (caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE) && caster->GetPower(POWER_ECLIPSE) >= 0) caster->RemoveAura(SPELL_DRUID_LUNAR_ECLIPSE); break; } case SPELL_DRUID_STARSURGE: { // If we are set to fill the solar side or we've just logged in with 0 power (confirmed with sniffs) if ((!caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE_MARKER) && caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER)) || caster->GetPower(POWER_ECLIPSE) == 0) { energizeAmount = GetSpellInfo()->Effects[effIndex].BasePoints; // 15 caster->CastCustomSpell(caster, SPELL_DRUID_STARSURGE_ENERGIZE, &energizeAmount, 0, 0, true); // If the energize was due to 0 power, cast the eclipse marker aura if (!caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER)) caster->CastSpell(caster, SPELL_DRUID_SOLAR_ECLIPSE_MARKER, true); } else if (!caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER) && caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE_MARKER)) { energizeAmount = -GetSpellInfo()->Effects[effIndex].BasePoints; // -15 caster->CastCustomSpell(caster, SPELL_DRUID_STARSURGE_ENERGIZE, &energizeAmount, 0, 0, true); } // The energizing effect brought us out of the lunar eclipse, remove the aura if (caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE) && caster->GetPower(POWER_ECLIPSE) >= 0) caster->RemoveAura(SPELL_DRUID_LUNAR_ECLIPSE); // The energizing effect brought us out of the solar eclipse, remove the aura else if (caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE) && caster->GetPower(POWER_ECLIPSE) <= 0) caster->RemoveAura(SPELL_DRUID_SOLAR_ECLIPSE); break; } } }
void UpdateAI(const uint32 uiDiff) { // Check if we have a target if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) { // No target so we'll use this section to do our random wispers instance wide // WisperTimer if (m_uiWisperTimer < uiDiff) { if (!m_creature->GetMap()->IsDungeon()) return; // Play random sound to the map m_creature->GetMap()->PlayDirectSoundToMap(RANDOM_SOUND_WHISPER); // One random wisper every 90 - 300 seconds m_uiWisperTimer = urand(90000, 300000); } else m_uiWisperTimer -= uiDiff; return; } m_creature->SetTargetGuid(ObjectGuid()); // No instance if (!m_pInstance) return; switch (m_pInstance->GetData(TYPE_CTHUN_PHASE)) { // Transition phase case PHASE_TRANSITION: { // PhaseTimer if (m_uiPhaseTimer < uiDiff) { // Switch m_pInstance->SetData(TYPE_CTHUN_PHASE, PHASE_CTHUN); // Switch to C'thun model m_creature->InterruptNonMeleeSpells(false); DoCastSpellIfCan(m_creature, SPELL_TRANSFORM); m_creature->SetHealth(m_creature->GetMaxHealth()); m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); // Emerging phase m_creature->SetInCombatWithZone(); // Place all units in threat list on outside of stomach m_mStomachMap.clear(); ThreatList const& tList = m_creature->getThreatManager().getThreatList(); for (ThreatList::const_iterator i = tList.begin();i != tList.end(); ++i) { // Outside stomach, only players if ((*i)->getUnitGuid().IsPlayer()) m_mStomachMap[(*i)->getUnitGuid()] = false; } // Spawn 2 flesh tentacles m_uiFleshTentaclesKilled = 0; // Spawn flesh tentacle Creature* pSpawned = m_creature->SummonCreature(MOB_FLESH_TENTACLE, TENTACLE_POS1_X, TENTACLE_POS1_Y, TENTACLE_POS1_Z, TENTACLE_POS1_O, TEMPSUMMON_CORPSE_DESPAWN, 0); if (!pSpawned) ++m_uiFleshTentaclesKilled; else { if (flesh_tentacleAI* pTentacleAI = dynamic_cast<flesh_tentacleAI*>(pSpawned->AI())) pTentacleAI->SpawnedByCthun(m_creature); } // Spawn flesh tentacle pSpawned = m_creature->SummonCreature(MOB_FLESH_TENTACLE, TENTACLE_POS2_X, TENTACLE_POS2_Y, TENTACLE_POS2_Z, TENTACLE_POS2_O, TEMPSUMMON_CORPSE_DESPAWN, 0); if (!pSpawned) ++m_uiFleshTentaclesKilled; else { if (flesh_tentacleAI* pTentacleAI = dynamic_cast<flesh_tentacleAI*>(pSpawned->AI())) pTentacleAI->SpawnedByCthun(m_creature); } m_uiPhaseTimer = 0; } else m_uiPhaseTimer -= uiDiff; break; } // Body Phase case PHASE_CTHUN: { // Weaken if (m_uiFleshTentaclesKilled > 1) { m_pInstance->SetData(TYPE_CTHUN_PHASE, PHASE_CTHUN_WEAKENED); DoScriptText(EMOTE_WEAKENED, m_creature); m_uiPhaseTimer = 45000; DoCastSpellIfCan(m_creature, SPELL_RED_COLORATION, CAST_TRIGGERED); // Kick all players out of stomach for (StomachMap::iterator itr = m_mStomachMap.begin(); itr != m_mStomachMap.end(); ++itr) { // Check for valid player Player* pPlayer = m_creature->GetMap()->GetPlayer(itr->first); if (pPlayer && itr->second == true) { // Teleport each player out DoTeleportPlayer(pPlayer, m_creature->GetPositionX(), m_creature->GetPositionY(), m_creature->GetPositionZ()+10, rand()%6); // Cast knockback on them DoCastSpellIfCan(pPlayer, SPELL_EXIT_STOMACH_KNOCKBACK, CAST_TRIGGERED); // Remove the acid debuff pPlayer->RemoveAurasDueToSpell(SPELL_DIGESTIVE_ACID); itr->second = false; } } return; } // Stomach acid if (m_uiStomachAcidTimer < uiDiff) { // Apply aura to all players in stomach for (StomachMap::iterator itr = m_mStomachMap.begin(); itr != m_mStomachMap.end(); ++itr) { // Check for valid player Player* pPlayer = m_creature->GetMap()->GetPlayer(itr->first); // Only apply to units in stomach if (pPlayer && itr->second == true) { // Cast digestive acid on them DoCastSpellIfCan(pPlayer, SPELL_DIGESTIVE_ACID, CAST_TRIGGERED); // Check if player should be kicked from stomach if (pPlayer->IsWithinDist3d(KICK_X, KICK_Y, KICK_Z, 10.0f)) { // Teleport each player out DoTeleportPlayer(pPlayer, m_creature->GetPositionX(), m_creature->GetPositionY(), m_creature->GetPositionZ()+10, rand()%6); // Cast knockback on them DoCastSpellIfCan(pPlayer, SPELL_EXIT_STOMACH_KNOCKBACK, CAST_TRIGGERED); // Remove the acid debuff pPlayer->RemoveAurasDueToSpell(SPELL_DIGESTIVE_ACID); itr->second = false; } } } m_uiStomachAcidTimer = 4000; } else m_uiStomachAcidTimer -= uiDiff; // Stomach Enter Timer if (m_uiStomachEnterTimer < uiDiff) { if (Player* pTarget = SelectRandomNotStomach()) { // Set target in stomach m_mStomachMap[pTarget->GetObjectGuid()] = true; pTarget->InterruptNonMeleeSpells(false); pTarget->CastSpell(pTarget, SPELL_MOUTH_TENTACLE, true, NULL, NULL, m_creature->GetObjectGuid()); m_stomachEnterTargetGuid = pTarget->GetObjectGuid(); m_uiStomachEnterVisTimer = 3800; } m_uiStomachEnterTimer = 13800; } else m_uiStomachEnterTimer -= uiDiff; if (m_uiStomachEnterVisTimer && m_stomachEnterTargetGuid) { if (m_uiStomachEnterVisTimer <= uiDiff) { // Check for valid player if (Player* pPlayer = m_creature->GetMap()->GetPlayer(m_stomachEnterTargetGuid)) DoTeleportPlayer(pPlayer, STOMACH_X, STOMACH_Y, STOMACH_Z, STOMACH_O); m_stomachEnterTargetGuid.Clear(); m_uiStomachEnterVisTimer = 0; // Note that actually C'Thun cannot be soloed, so kill all players, if no player left outside of stomach bool bKillAllPlayer = true; for (StomachMap::iterator itr = m_mStomachMap.begin(); itr != m_mStomachMap.end(); ++itr) { Player* pPlayer = m_creature->GetMap()->GetPlayer(itr->first); if (itr->second == false && pPlayer) { bKillAllPlayer = false; break; } } if (bKillAllPlayer) { for (StomachMap::iterator itr = m_mStomachMap.begin(); itr != m_mStomachMap.end(); ++itr) { if (Player* pPlayer = m_creature->GetMap()->GetPlayer(itr->first)) m_creature->DealDamage(pPlayer, pPlayer->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NONE, NULL, false); } EnterEvadeMode(); return; } } else m_uiStomachEnterVisTimer -= uiDiff; } // GientClawTentacleTimer if (m_uiGiantClawTentacleTimer < uiDiff) { if (Player* pTarget = SelectRandomNotStomach()) { // Spawn claw tentacle on the random target if (Creature* pSummoned = m_creature->SummonCreature(MOB_GIANT_CLAW_TENTACLE, pTarget->GetPositionX(), pTarget->GetPositionY(), pTarget->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 500)) pSummoned->AI()->AttackStart(pTarget); } // One giant claw tentacle every minute m_uiGiantClawTentacleTimer = 60000; } else m_uiGiantClawTentacleTimer -= uiDiff; // GiantEyeTentacleTimer if (m_uiGiantEyeTentacleTimer < uiDiff) { if (Player* pTarget = SelectRandomNotStomach()) { // Spawn claw tentacle on the random target if (Creature* pSummoned = m_creature->SummonCreature(MOB_GIANT_EYE_TENTACLE, pTarget->GetPositionX(), pTarget->GetPositionY(), pTarget->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 500)) pSummoned->AI()->AttackStart(pTarget); } // One giant eye tentacle every minute m_uiGiantEyeTentacleTimer = 60000; } else m_uiGiantEyeTentacleTimer -= uiDiff; // EyeTentacleTimer if (m_uiEyeTentacleTimer < uiDiff) { // Spawn the 8 Eye Tentacles in the corret spots SpawnEyeTentacle(0, 25); //south SpawnEyeTentacle(12, 12); //south west SpawnEyeTentacle(25, 0); //west SpawnEyeTentacle(12, -12); //north west SpawnEyeTentacle(0, -25); //north SpawnEyeTentacle(-12, -12); //north east SpawnEyeTentacle(-25, 0); // east SpawnEyeTentacle(-12, 12); // south east //These spawn at every 30 seconds m_uiEyeTentacleTimer = 30000; } else m_uiEyeTentacleTimer -= uiDiff; break; } // Weakened state case PHASE_CTHUN_WEAKENED: { // PhaseTimer if (m_uiPhaseTimer < uiDiff) { // Switch m_pInstance->SetData(TYPE_CTHUN_PHASE, PHASE_CTHUN); // Remove red coloration m_creature->RemoveAurasDueToSpell(SPELL_RED_COLORATION); // Spawn 2 flesh tentacles m_uiFleshTentaclesKilled = 0; // Spawn flesh tentacle Creature* pSpawned = m_creature->SummonCreature(MOB_FLESH_TENTACLE, TENTACLE_POS1_X, TENTACLE_POS1_Y, TENTACLE_POS1_Z, TENTACLE_POS1_O, TEMPSUMMON_CORPSE_DESPAWN, 0); if (!pSpawned) ++m_uiFleshTentaclesKilled; else { if (flesh_tentacleAI* pTentacleAI = dynamic_cast<flesh_tentacleAI*>(pSpawned->AI())) pTentacleAI->SpawnedByCthun(m_creature); } pSpawned = NULL; // Spawn flesh tentacle pSpawned = m_creature->SummonCreature(MOB_FLESH_TENTACLE, TENTACLE_POS2_X, TENTACLE_POS2_Y, TENTACLE_POS2_Z, TENTACLE_POS2_O, TEMPSUMMON_CORPSE_DESPAWN, 0); if (!pSpawned) ++m_uiFleshTentaclesKilled; else { if (flesh_tentacleAI* pTentacleAI = dynamic_cast<flesh_tentacleAI*>(pSpawned->AI())) pTentacleAI->SpawnedByCthun(m_creature); } m_uiPhaseTimer = 0; } else m_uiPhaseTimer -= uiDiff; } } }
void SetData(uint32 type, uint32 data) { Player *player = GetPlayerInMap(); if (!player) { debug_log("TSCR: Instance Stratholme: SetData (Type: %u Data %u) cannot find any player.", type, data); return; } switch(type) { case TYPE_BARON_RUN: switch(data) { case IN_PROGRESS: if (Encounter[0] == IN_PROGRESS || Encounter[0] == FAIL) break; BaronRun_Timer = 2700000; debug_log("TSCR: Instance Stratholme: Baron run in progress."); break; case FAIL: //may add code to remove aura from players, but in theory the time should be up already and removed. break; case DONE: BaronRun_Timer = 0; break; } Encounter[0] = data; break; case TYPE_BARONESS: Encounter[1] = data; if (data == SPECIAL) UpdateGoState(ziggurat1GUID,0,false); if (data == DONE) StartSlaugtherSquare(); break; case TYPE_NERUB: Encounter[2] = data; if (data == SPECIAL) UpdateGoState(ziggurat2GUID,0,false); if (data == DONE) StartSlaugtherSquare(); break; case TYPE_PALLID: Encounter[3] = data; if (data == SPECIAL) UpdateGoState(ziggurat3GUID,0,false); if (data == DONE) StartSlaugtherSquare(); break; case TYPE_RAMSTEIN: if (data == IN_PROGRESS) { if (Encounter[4] != IN_PROGRESS) UpdateGoState(portGauntletGUID,1,false); uint32 count = abomnationGUID.size(); for(std::set<uint64>::iterator i = abomnationGUID.begin(); i != abomnationGUID.end(); ++i) { if (Unit* abom = Unit::GetUnit(*player, *i)) { if (!abom->isAlive()) --count; } } if (!count) { //a bit itchy, it should close the door after 10 secs, but it doesn't. skipping it for now. //UpdateGoState(ziggurat4GUID,0,true); player->SummonCreature(C_RAMSTEIN,4032.84,-3390.24,119.73,4.71,TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,1800000); debug_log("TSCR: Instance Stratholme: Ramstein spawned."); } else debug_log("TSCR: Instance Stratholme: %u Abomnation left to kill.",count); } if (data == SPECIAL) { SlaugtherSquare_Timer = 300000; HandleGameObject(portGauntletGUID, true); debug_log("TSCR: Instance Stratholme: Slaugther event will continue in 5 minutes."); } if (data == DONE) { SlaugtherSquare_Timer = 10000; debug_log("TSCR: Instance Stratholme: Skeletons died, slaughter event will continue"); } if (data == FAIL) { HandleGameObject(portGauntletGUID, true); data = SPECIAL; } Encounter[4] = data; break; case TYPE_BARON: if (data == IN_PROGRESS) { if (GetData(TYPE_BARON_RUN) == IN_PROGRESS) { if (Unit *t = Unit::GetUnit(*player, ysidaTriggerGUID)) t->SummonCreature(C_YSIDA,t->GetPositionX(),t->GetPositionY(),t->GetPositionZ(),t->GetOrientation(),TEMPSUMMON_TIMED_DESPAWN,1800000); if (Group *pGroup = player->GetGroup()) { for(GroupReference *itr = pGroup->GetFirstMember(); itr != NULL; itr = itr->next()) { Player* pGroupie = itr->getSource(); if (!pGroupie) continue; if (pGroupie->HasAura(SPELL_BARON_ULTIMATUM,0)) pGroupie->RemoveAurasDueToSpell(SPELL_BARON_ULTIMATUM); if (pGroupie->GetQuestStatus(QUEST_DEAD_MAN_PLEA) == QUEST_STATUS_INCOMPLETE) { pGroupie->CastedCreatureOrGO(C_YSIDA, ysidaGUID,0); pGroupie->AreaExploredOrEventHappens(QUEST_DEAD_MAN_PLEA); } } } else if (player->HasAura(SPELL_BARON_ULTIMATUM,0)) player->RemoveAurasDueToSpell(SPELL_BARON_ULTIMATUM); if (Unit *temp = Unit::GetUnit(*player,GetData64(DATA_BARON))) { player->CastedCreatureOrGO(C_YSIDA, ysidaGUID,0); player->AreaExploredOrEventHappens(QUEST_DEAD_MAN_PLEA); } SetData(TYPE_BARON_RUN,DONE); } } if (data == DONE) { HandleGameObject(portGauntletGUID, true); } if (Encounter[5] != DONE) Encounter[5] = data; break; case TYPE_SH_AELMAR: IsSilverHandDead[0] = (data) ? true : false; break; case TYPE_SH_CATHELA: IsSilverHandDead[1] = (data) ? true : false; break; case TYPE_SH_GREGOR: IsSilverHandDead[2] = (data) ? true : false; break; case TYPE_SH_NEMAS: IsSilverHandDead[3] = (data) ? true : false; break; case TYPE_SH_VICAR: IsSilverHandDead[4] = (data) ? true : false; break; case TYPE_GAUNTLET_MOB: if (data != 1) break; if (GetData(TYPE_NERUB) != DONE && std::none_of(acolyte2GUID.begin(),acolyte2GUID.end(),[this](uint64 guid)-> bool {Creature *c = GetCreature(guid) ; return c ? c->isAlive():false;})) { Creature *c = GetCreature(CrystalsGUID[1]); if(c && c->isAlive()) c->Kill(c,false); SetData(TYPE_NERUB,DONE); } if (GetData(TYPE_BARONESS) != DONE && std::none_of(acolyte1GUID.begin(),acolyte1GUID.end(),[this](uint64 guid)-> bool {Creature *c = GetCreature(guid) ; return c ? c->isAlive():false;})) { Creature *c = GetCreature(CrystalsGUID[0]); if(c && c->isAlive()) c->Kill(c,false); SetData(TYPE_BARONESS,DONE); } if (GetData(TYPE_PALLID) != DONE && std::none_of(acolyte3GUID.begin(),acolyte3GUID.end(),[this](uint64 guid)-> bool {Creature *c = GetCreature(guid) ; return c ? c->isAlive():false;})) { Creature *c = GetCreature(CrystalsGUID[2]); if(c && c->isAlive()) c->Kill(c,false); SetData(TYPE_PALLID,DONE); } } }
// return true = remove from update list, false = continue bool LfgGroup::UpdateVoteToKick(uint32 diff) { if (!m_voteToKick.isInProggres) return true; if (diff) { if (m_voteToKick.GetTimeLeft() <= 0) { m_voteToKick.isInProggres = false; for(member_citerator citr = m_memberSlots.begin(); citr != m_memberSlots.end(); ++citr) { Player *member = sObjectMgr.GetPlayer(citr->guid); if (!member || !member->GetSession()) continue; SendBootPlayer(member); } m_voteToKick.Reset(); return true; } return false; } //Send Update for(member_citerator citr = m_memberSlots.begin(); citr != m_memberSlots.end(); ++citr) { Player *member = sObjectMgr.GetPlayer(citr->guid); if (!member || !member->GetSession()) continue; SendBootPlayer(member); } if (m_voteToKick.GetVotesNum(false) < 3) return false; else if (m_voteToKick.GetVotesNum(true) >= 3) { Player *victim = sObjectMgr.GetPlayer(m_voteToKick.victim); sLfgMgr.LfgLog("Remove member - afk rolecheck"); RemoveMember(m_voteToKick.victim, 1); if (victim && victim->GetSession()) { victim->ScheduleDelayedOperation(DELAYED_LFG_MOUNT_RESTORE); victim->ScheduleDelayedOperation(DELAYED_LFG_TAXI_RESTORE); victim->ScheduleDelayedOperation(DELAYED_LFG_CLEAR_LOCKS); victim->RemoveAurasDueToSpell(LFG_BOOST); WorldLocation teleLoc = victim->m_lookingForGroup.joinLoc; if (!teleLoc.coords.isNULL()) victim->TeleportTo(teleLoc); else victim->TeleportToHomebind(); } else { AreaTrigger const *trigger = sObjectMgr.GetGoBackTrigger(GetDungeonInfo()->map); if(trigger) Player::SavePositionInDB(trigger->target_mapId, trigger->target_X, trigger->target_Y, trigger->target_Z, trigger->target_Orientation, sTerrainMgr.GetZoneId(trigger->target_mapId, trigger->target_X, trigger->target_Y, trigger->target_Z), m_voteToKick.victim); } //Change leader if (m_voteToKick.victim == m_leaderGuid) { for(member_citerator citr = m_memberSlots.begin(); citr != m_memberSlots.end(); ++citr) { Player *plr = sObjectMgr.GetPlayer(citr->guid); if (!plr || !plr->GetSession()) continue; if (plr->m_lookingForGroup.roles & LEADER) { ChangeLeader(plr->GetGUID()); break; } } if (m_voteToKick.victim == m_leaderGuid) ChangeLeader(GetFirstMember()->getSource()->GetGUID()); } m_voteToKick.Reset(); SendUpdate(); return true; } return false; }