void DamageTaken(Unit* /*attacker*/, uint32& damage) override { if (me->HealthBelowPctDamaged(50, damage) && (events.GetPhaseMask() & PHASE_MASK_NORMAL) && !_hasDispersed) { events.SetPhase(PHASE_DISPERSE); _hasDispersed = true; me->AttackStop(); DoCast(me, SPELL_SANDSTORM); SendWeather(WEATHER_STATE_LIGHT_SANDSTORM, 1.0f); events.ScheduleEvent(EVENT_PTAH_EXPLODE, 6000, 0, PHASE_DISPERSE); events.ScheduleEvent(EVENT_QUICKSAND, 10000, 0, PHASE_DISPERSE); std::list<Creature*> stalkers; GetCreatureListWithEntryInGrid(stalkers, me, NPC_BEETLE_STALKER, 100.0f); std::list<Creature*> beetlers = stalkers; Trinity::Containers::RandomResizeList(beetlers, 9); // Holds the summoners of Jeweled Scarab for (std::list<Creature*>::iterator itr = beetlers.begin(); itr != beetlers.end(); ++itr) { stalkers.remove((*itr)); // Remove it to prevent a single trigger from spawning multiple npcs. (*itr)->CastSpell((*itr), SPELL_BEETLE_BURROW); // Cast visual // Summon after 5 seconds. (*itr)->m_Events.AddEvent(new SummonScarab((*itr), instance), (*itr)->m_Events.CalculateTime(5000)); } Trinity::Containers::RandomResizeList(stalkers, 2); // Holds the summoners of Dustbone Horror for (std::list<Creature*>::iterator itr = stalkers.begin(); itr != stalkers.end(); ++itr) (*itr)->CastSpell((*itr), SPELL_SUMMON_DUSTBONE_HORROR); } }
void SetData(uint32 index, uint32 /*value*/) override { if (index == DATA_SUMMON_DEATHS) { ++_summonDeaths; if (_summonDeaths == 11) // All summons died { SendWeather(WEATHER_STATE_FOG, 0.0f); me->RemoveAurasDueToSpell(SPELL_PTAH_EXPLOSION); events.SetPhase(PHASE_NORMAL); events.ScheduleEvent(EVENT_RAGING_SMASH, urand(7000, 12000), 0, PHASE_NORMAL); events.ScheduleEvent(EVENT_FLAME_BOLT, 15000, 0, PHASE_NORMAL); events.ScheduleEvent(EVENT_EARTH_SPIKE, urand(16000, 21000), 0, PHASE_NORMAL); } } }
// This packet actually contains the char name after the opcode void CUser::GameStart(Packet & pkt) { if (isInGame()) return; uint8 opcode = pkt.read<uint8>(); if (opcode == 1) { SendMyInfo(); g_pMain->UserInOutForMe(this); g_pMain->MerchantUserInOutForMe(this); g_pMain->NpcInOutForMe(this); SendNotice(); SendTime(); SendWeather(); // SendHackToolList(); Packet result(WIZ_GAMESTART); Send(&result); } else if (opcode == 2) { m_state = GAME_STATE_INGAME; UserInOut(INOUT_RESPAWN); if (!m_bCity && m_sHp <= 0) m_bCity = -1; if (m_bCity > 0) { int level = GetLevel(); if (m_bCity <= 100) level--; // make sure we don't exceed bounds if (level > MAX_LEVEL) level = MAX_LEVEL; else if (level < 1) level = 1; m_iLostExp = (g_pMain->GetExpByLevel(level) * (m_bCity % 10) / 100); if (((m_bCity % 10) / 100) == 1) m_iLostExp /= 2; } else { m_iLostExp = 0; } CheckSeedQuest(); BlinkStart(); SetUserAbility(); // rental RecastSavedMagic(m_sHp == m_iMaxHp ? true : false); //ItemMallRecast // If we've relogged while dead, we need to make sure the client // is still given the option to revive. if (isDead()) SendDeathAnimation(); g_pMain->TempleEventGetActiveEventTime(this); } m_tHPLastTimeNormal = UNIXTIME; }