void CSector::SetWeatherChance( bool fRain, int iChance ) { ADDTOCALLSTACK("CSector::SetWeatherChance"); // Set via the client. // Transfer from snow to rain does not work ! must be DRY first. if ( iChance > 100 ) iChance = 100; if ( iChance < 0 ) { // just set back to defaults. SetDefaultWeatherChance(); } else if ( fRain ) { m_RainChance = (uchar)(iChance | LIGHT_OVERRIDE); } else { m_ColdChance = (uchar)(iChance | LIGHT_OVERRIDE); } // Recalc the weather immediatly. SetWeather( GetWeatherCalc()); }
void Reset() { if (pInstance) pInstance->SetData(DATA_AKILZONEVENT, NOT_STARTED); StaticDisruption_Timer = urand(10000,20000); //10 to 20 seconds (bosskillers) GustOfWind_Timer = urand(20000,30000); //20 to 30 seconds(bosskillers) CallLighting_Timer = urand(10000,20000); //totaly random timer. can't find any info on this ElectricalStorm_Timer = 60000; //60 seconds(bosskillers) Enrage_Timer = 10*MINUTE*IN_MILLISECONDS; //10 minutes till enrage(bosskillers) SummonEagles_Timer = 99999; TargetGUID = 0; CloudGUID = 0; CycloneGUID = 0; DespawnSummons(); for (uint8 i = 0; i < 8; ++i) BirdGUIDs[i] = 0; StormCount = 0; StormSequenceTimer = 0; isRaining = false; SetWeather(WEATHER_STATE_FINE, 0.0f); }
bool CSector::r_LoadVal( CScript &s ) { ADDTOCALLSTACK("CSector::r_LoadVal"); EXC_TRY("LoadVal"); switch ( FindTableSorted( s.GetKey(), sm_szLoadKeys, CountOf( sm_szLoadKeys )-1 )) { case SC_COLDCHANCE: SetWeatherChance( false, s.HasArgs() ? s.GetArgVal() : -1 ); return true; case SC_FLAGS: m_dwFlags = s.GetArgVal(); return true; case SC_LIGHT: if ( g_Cfg.m_bAllowLightOverride ) SetLight( (s.HasArgs()) ? s.GetArgVal() : -1 ); else g_Log.EventWarn("AllowLightOverride flag is disabled in sphere.ini, so sector's LIGHT property wasn't set\n"); return true; case SC_RAINCHANCE: SetWeatherChance( true, s.HasArgs() ? s.GetArgVal() : -1 ); return true; case SC_SEASON: SetSeason(s.HasArgs() ? static_cast<SEASON_TYPE>(s.GetArgVal()) : SEASON_Summer); return (true); case SC_WEATHER: SetWeather(s.HasArgs() ? static_cast<WEATHER_TYPE>(s.GetArgVal()) : WEATHER_DRY); return true; } EXC_CATCH; EXC_DEBUG_START; EXC_ADD_SCRIPT; EXC_DEBUG_END; return false; }
bool CSector::r_LoadVal( CScript &s ) { ADDTOCALLSTACK("CSector::r_LoadVal"); EXC_TRY("LoadVal"); switch ( FindTableSorted( s.GetKey(), sm_szLoadKeys, COUNTOF( sm_szLoadKeys )-1 )) { case SC_COLDCHANCE: SetWeatherChance( false, s.HasArgs() ? s.GetArgVal() : -1 ); return( true ); case SC_FLAGS: m_dwFlags = s.GetArgVal(); return true; case SC_LIGHT: if ( g_Cfg.m_bAllowLightOverride ) m_Env.m_Light = static_cast<BYTE>(s.GetArgVal()|LIGHT_OVERRIDE); return true; case SC_RAINCHANCE: SetWeatherChance( true, s.HasArgs() ? s.GetArgVal() : -1 ); return( true ); case SC_SEASON: SetSeason(s.HasArgs() ? static_cast<SEASON_TYPE>(s.GetArgVal()) : SEASON_Summer); return (true); case SC_WEATHER: SetWeather(s.HasArgs() ? static_cast<WEATHER_TYPE>(s.GetArgVal()) : WEATHER_DRY); return( true ); } EXC_CATCH; EXC_DEBUG_START; EXC_ADD_SCRIPT; EXC_DEBUG_END; return false; }
void Reset() override { _Reset(); Initialize(); SetWeather(WEATHER_STATE_FINE, 0.0f); }
void CZone::LoadZoneWeather() { static const int8* Query = "SELECT " "weather.none," "weather.sunshine," "weather.clouds," "weather.fog," "weather.hot_spell," "weather.heat_wave," "weather.rain," "weather.squall," "weather.dust_storm," "weather.sand_storm," "weather.wind," "weather.gales," "weather.snow," "weather.blizzards," "weather.thunder," "weather.thunder_storms," "weather.auroras," "weather.stellar_glares," "weather.gloom," "weather.darkness " "FROM zone_weather as weather " "WHERE zoneid = %u " "LIMIT 1"; if (Sql_Query(SqlHandle, Query, m_zoneID) != SQL_ERROR && Sql_NumRows(SqlHandle) != 0 && Sql_NextRow(SqlHandle) == SQL_SUCCESS) { uint16 Frequency = 0; for (uint8 weather = 0; weather < MAX_WEATHER_ID; ++weather) { m_WeatherFrequency[weather] = (uint8)Sql_GetIntData(SqlHandle,weather); if (m_WeatherFrequency[weather] == 100) { m_IsWeatherStatic = true; SetWeather((WEATHER)weather); } Frequency += m_WeatherFrequency[weather]; } if (Frequency != 100) { //ShowWarning(CL_YELLOW"Total Weather Frequency is %u for zone %u\n" CL_RESET, Frequency, m_zoneID); } } else { memset(&m_WeatherFrequency, 0, sizeof(m_WeatherFrequency)); ShowFatalError(CL_RED"CZone::LoadZoneWeather: Cannot load zone weather (%u)\n" CL_RESET, m_zoneID); } }
void JustDied(Unit* pKiller) { DoScriptText(SAY_DEATH, m_creature); SetWeather(WEATHER_STATE_FINE, 0.0f); if (!m_pInstance) return; m_pInstance->SetData(TYPE_AKILZON, DONE); }
void CEnvironment::StopWFX () { VERIFY (CurrentCycleName.size()); bWFX = false; SetWeather (CurrentCycleName,false); Current[0] = WFX_end_desc[0]; Current[1] = WFX_end_desc[1]; #ifdef WEATHER_LOGGING Msg ("WFX - end. Weather: '%s' Desc: '%s'/'%s' GameTime: %3.2f",CurrentWeatherName.c_str(),Current[0]->sect_name.c_str(),Current[1]->sect_name.c_str(),fGameTime); #endif }
void Reset() { _Reset(); TargetGUID = 0; CloudGUID = 0; CycloneGUID = 0; memset(BirdGUIDs, 0, sizeof(BirdGUIDs)); StormCount = 0; isRaining = false; SetWeather(WEATHER_STATE_FINE, 0.0f); }
TEST_F(CTestBattleField, GetTotalStrengthWorksWhenOnWeather) { CCardDeck deckFull = CardLoader("./testCards.data"); ICard* iCard = NULL; for (int _index = 0; _index != deckFull.Size(); ++_index) { iCard = deckFull.At(_index); m_battleField.EnDeck(iCard); } SetWeather(0); int nTotalStrength = m_battleField.GetTotalStrength(); EXPECT_EQ(14, nTotalStrength); }
void Reset() { if (instance) instance->SetData(DATA_AKILZONEVENT, NOT_STARTED); TargetGUID = 0; CloudGUID = 0; CycloneGUID = 0; DespawnSummons(); memset(BirdGUIDs, 0, sizeof(BirdGUIDs)); StormCount = 0; isRaining = false; SetWeather(WEATHER_STATE_FINE, 0.0f); }
void MapWindow::OnDestroy() { #ifdef HAVE_NOAA SetNOAAStore(nullptr); #endif airspace_renderer.Clear(); SetWaypoints(nullptr); SetTopography(nullptr); SetTerrain(nullptr); SetWeather(nullptr); #ifndef ENABLE_OPENGL buffer_canvas.Destroy(); #endif DoubleBufferWindow::OnDestroy(); }
void QuickParameters::ReinitCombo() { CRCombo* combo; targtype=0,targentry=0; for (int t=0;t<4;t++) for (int e=0;e<4;e++) if(CSQuick1::quickdef.targets[t][e]==CSQuick1::quickdef.target) targtype=t,targentry=e; combo=GETDLGITEM(IDC_TARGTYPE); combo->Clear(); combo->AddString(LoadResString(CSQuick1::quickdef.targtypeIDs[0])); if (CSQuick1::quickdef.targtypeIDs[1]) combo->AddString(LoadResString(CSQuick1::quickdef.targtypeIDs[1])); if (CSQuick1::quickdef.targtypeIDs[2]) combo->AddString(LoadResString(CSQuick1::quickdef.targtypeIDs[2])); if (CSQuick1::quickdef.targtypeIDs[3]) combo->AddString(LoadResString(CSQuick1::quickdef.targtypeIDs[3])); if (CSQuick1::quickdef.targtypeIDs[0]) combo->SetIndex(targtype); TargNameCombo(); SWord Latitude = 51; //RDH 25/02/00 MMC.Sky.SetMissionDawnDusk(Latitude, MMC.currdate, MMC.dawntime, MMC.dusktime); int timeindex = CSQuick1::quickdef.time; SetTime(timeindex); combo=GETDLGITEM(IDC_TIME); combo->Clear(); combo->RESCOMBO(DAWN,4)->SetIndex(timeindex); int weatherindex = CSQuick1::quickdef.weather; SetWeather(weatherindex); combo=GETDLGITEM(IDC_CLOUD); combo->Clear(); combo->RESCOMBO(CLEARSKY,4)->SetIndex(weatherindex); }
void MapWindow::OnDestroy() { SetMarks(NULL); airspace_renderer.Clear(); SetWaypoints(NULL); SetTopography(NULL); SetTerrain(NULL); SetWeather(NULL); #ifndef ENABLE_OPENGL buffer_canvas.reset(); if (!IsAncientHardware()) stencil_canvas.reset(); #endif DoubleBufferWindow::OnDestroy(); }
void UpdateAI(const uint32 diff) { if (!UpdateVictim()) return; if (StormCount) { Unit* pTarget = Unit::GetUnit(*me, CloudGUID); if (!pTarget || !pTarget->IsAlive()) { EnterEvadeMode(); return; } else if (Unit* Cyclone = Unit::GetUnit(*me, CycloneGUID)) Cyclone->CastSpell(pTarget, 25160, true); // keep casting or... if (StormSequenceTimer <= diff) HandleStormSequence(pTarget); else StormSequenceTimer -= diff; return; } if (Enrage_Timer <= diff) { me->MonsterYell(SAY_ONENRAGE, LANG_UNIVERSAL, 0); DoPlaySoundToSet(me, SOUND_ONENRAGE); DoCast(me, SPELL_BERSERK, true); Enrage_Timer = (diff - Enrage_Timer) + 600000; } else Enrage_Timer -= diff; if (StaticDisruption_Timer <= diff) { Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 1); if (!pTarget) pTarget = me->GetVictim(); TargetGUID = pTarget->GetGUID(); DoCast(pTarget, SPELL_STATIC_DISRUPTION, false); me->SetInFront(me->GetVictim()); StaticDisruption_Timer = (diff - StaticDisruption_Timer) + (10 + rand() % 8) * 1000; // < 20s /*if (float dist = me->IsWithinDist3d(pTarget->GetPositionX(), pTarget->GetPositionY(), pTarget->GetPositionZ(), 5.0f) dist = 5.0f; SDisruptAOEVisual_Timer = 1000 + floor(dist / 30 * 1000.0f);*/ } else StaticDisruption_Timer -= diff; if (GustOfWind_Timer <= diff) { Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 1); if (!pTarget) pTarget = me->GetVictim(); DoCast(pTarget, SPELL_GUST_OF_WIND); GustOfWind_Timer = (diff - GustOfWind_Timer) + (20 + rand() % 10) * 1000; //20 to 30 seconds(bosskillers) } else GustOfWind_Timer -= diff; if (CallLighting_Timer <= diff) { DoCastVictim( SPELL_CALL_LIGHTNING); CallLighting_Timer = (diff - CallLighting_Timer) + (12 + rand() % 5) * 1000; //totaly random timer. can't find any info on this } else CallLighting_Timer -= diff; if (!isRaining && ElectricalStorm_Timer < 8000 + urand(0, 5000)) { SetWeather(WEATHER_STATE_HEAVY_RAIN, 0.9999f); isRaining = true; } if (ElectricalStorm_Timer <= diff) { Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 50, true); if (!pTarget) { EnterEvadeMode(); return; } pTarget->CastSpell(pTarget, SPELL_ELECTRICAL_STORM_VISUAL, true);//cloud visual DoCast(pTarget, SPELL_ELECTRICAL_STORM, false);//storm cyclon + visual float x, y, z; pTarget->GetPosition(x, y, z); pTarget->SetLevitate(true); Movement::MoveSplineInit init(*me); init.MoveTo(x, y, me->GetPositionZ() + 15.0f, true); init.Launch(); Unit* Cloud = me->SummonTrigger(x, y, me->GetPositionZ() + 16, 0, 15000); if (Cloud) { CloudGUID = Cloud->GetGUID(); Cloud->SetLevitate(true); Cloud->StopMoving(); Cloud->SetObjectScale(1.0f); Cloud->setFaction(35); Cloud->SetMaxHealth(9999999); Cloud->SetHealth(9999999); Cloud->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); } ElectricalStorm_Timer = (diff - ElectricalStorm_Timer) + 60000; //60 seconds (bosskillers) StormCount = 1; StormSequenceTimer = 0; } else ElectricalStorm_Timer -= diff; if (SummonEagles_Timer <= diff) { if (urand(0, 1)) { me->MonsterYell(SAY_ONSUMMON2, LANG_UNIVERSAL, 0); DoPlaySoundToSet(me, SOUND_ONSUMMON1); } else { me->MonsterYell(SAY_ONSUMMON2, LANG_UNIVERSAL, 0); DoPlaySoundToSet(me, SOUND_ONSUMMON2); } float x, y, z; me->GetPosition(x, y, z); for (uint8 i = 0; i < 8; ++i) { if (!Unit::GetUnit(*me, BirdGUIDs[i])) // they despawn on death { if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0)) { x = pTarget->GetPositionX() + irand(-10, 10); y = pTarget->GetPositionY() + irand(-10, 10); z = pTarget->GetPositionZ() + urand(16, 20); if (z > 95) z = 95 - urand(0, 5); } if (Creature* pCreature = me->SummonCreature(MOB_SOARING_EAGLE, x, y, z, 0, TEMPSUMMON_CORPSE_DESPAWN, 0)) { pCreature->AddThreat(me->GetVictim(), 1.0f); pCreature->AI()->AttackStart(me->GetVictim()); BirdGUIDs[i] = pCreature->GetGUID(); } } } SummonEagles_Timer = (diff - SummonEagles_Timer) + 999999; } else SummonEagles_Timer -= diff; DoMeleeAttackIfReady(); }
void HandleStormSequence(Unit* Cloud) // 1: begin, 2-9: tick, 10: end { if (StormCount < 10 && StormCount > 1) { // deal damage int32 bp0 = 800; for (uint8 i = 2; i < StormCount; ++i) bp0 *= 2; CellCoord p(Trinity::ComputeCellCoord(me->GetPositionX(), me->GetPositionY())); Cell cell(p); cell.SetNoCreate(); std::list<Unit*> tempUnitMap; { Trinity::AnyAoETargetUnitInObjectRangeCheck u_check(me, me, SIZE_OF_GRIDS); Trinity::UnitListSearcher<Trinity::AnyAoETargetUnitInObjectRangeCheck> searcher(me, tempUnitMap, u_check); TypeContainerVisitor<Trinity::UnitListSearcher<Trinity::AnyAoETargetUnitInObjectRangeCheck>, WorldTypeMapContainer > world_unit_searcher(searcher); TypeContainerVisitor<Trinity::UnitListSearcher<Trinity::AnyAoETargetUnitInObjectRangeCheck>, GridTypeMapContainer > grid_unit_searcher(searcher); cell.Visit(p, world_unit_searcher, *me->GetMap(), *me, SIZE_OF_GRIDS); cell.Visit(p, grid_unit_searcher, *me->GetMap(), *me, SIZE_OF_GRIDS); } // deal damage for (std::list<Unit*>::const_iterator i = tempUnitMap.begin(); i != tempUnitMap.end(); ++i) { if (Unit* target = (*i)) { if (Cloud && !Cloud->IsWithinDist(target, 6, false)) Cloud->CastCustomSpell(target, SPELL_ZAP, &bp0, NULL, NULL, true, 0, 0, me->GetGUID()); } } // visual float x, y, z; z = me->GetPositionZ(); for (uint8 i = 0; i < 5+rand()%5; ++i) { x = 343.0f+rand()%60; y = 1380.0f+rand()%60; if (Unit* trigger = me->SummonTrigger(x, y, z, 0, 2000)) { trigger->setFaction(35); trigger->SetMaxHealth(100000); trigger->SetHealth(100000); trigger->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); if (Cloud) Cloud->CastCustomSpell(trigger, /*43661*/SPELL_ZAP, &bp0, NULL, NULL, true, 0, 0, Cloud->GetGUID()); } } } ++StormCount; if (StormCount > 10) { StormCount = 0; // finish events.ScheduleEvent(EVENT_SUMMON_EAGLES, 5000); me->InterruptNonMeleeSpells(false); CloudGUID = 0; if (Cloud) Cloud->DealDamage(Cloud, Cloud->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); SetWeather(WEATHER_STATE_FINE, 0.0f); isRaining = false; } events.ScheduleEvent(EVENT_STORM_SEQUENCE, 1000); }
void CZone::UpdateWeather() { uint32 CurrentVanaDate = CVanaTime::getInstance()->getDate(); // Current Vanadiel timestamp in minutes uint32 StartFogVanaDate = (CurrentVanaDate - (CurrentVanaDate % VTIME_DAY)) + (VTIME_HOUR * 2); // Vanadiel timestamp of 2 AM in minutes uint32 EndFogVanaDate = StartFogVanaDate + (VTIME_HOUR * 5); // Vanadiel timestamp of 7 AM in minutes uint32 WeatherNextUpdate = 0; uint32 WeatherDay = 0; uint8 WeatherOffset = 0; uint8 WeatherChance = 0; // Random time between 3 minutes and 30 minutes for the next weather change WeatherNextUpdate = (dsprand::GetRandomNumber(180,1620)); // Find the timestamp since the start of vanadiel WeatherDay = CVanaTime::getInstance()->getVanaTime(); // Calculate what day we are on since the start of vanadiel time // 1 Vana'diel Day = 57 minutes 36 seconds or 3456 seconds WeatherDay = WeatherDay / 3456; // The weather starts over again every 2160 days WeatherDay = WeatherDay % WEATHER_CYCLE; // Get a random number to determine which weather effect we will use WeatherChance = dsprand::GetRandomNumber(100); zoneWeather_t&& weatherType = zoneWeather_t(0, 0, 0); for (auto& weather : m_WeatherVector) { if (weather.first > WeatherDay) { break; } weatherType = weather.second; } uint8 Weather = 0; // 15% chance for rare weather, 35% chance for common weather, 50% chance for normal weather // * Percentages were generated from a 6 hour sample and rounded down to closest multiple of 5* if (WeatherChance <= 15) //15% chance to have the weather_rare { Weather = weatherType.rare; } else if (WeatherChance <= 50) // 35% chance to have weather_common { Weather = weatherType.common; } else { Weather = weatherType.normal; } // Fog in the morning between the hours of 2 and 7 if there is not a specific elemental weather to override it if ((CurrentVanaDate >= StartFogVanaDate) && (CurrentVanaDate < EndFogVanaDate) && (Weather < WEATHER_HOT_SPELL) && (GetType() > ZONETYPE_CITY)) { Weather = WEATHER_FOG; //Force the weather to change by 7 am // 2.4 vanadiel minutes = 1 earth second WeatherNextUpdate = (uint32)((EndFogVanaDate - CurrentVanaDate) * 2.4); } SetWeather((WEATHER)Weather); luautils::OnZoneWeatherChange(GetID(), Weather); //ShowDebug(CL_YELLOW"Zone::zone_update_weather: Weather of %s updated to %u\n" CL_RESET, PZone->GetName(), Weather); CTaskMgr::getInstance()->AddTask(new CTaskMgr::CTask("zone_update_weather", gettick() + (WeatherNextUpdate * 1000), this, CTaskMgr::TASK_ONCE, zone_update_weather)); }
void QuickParameters::OnTextChangedCloud(LPCTSTR Caption, short index) { CSQuick1::quickdef.weather = index; SetWeather(index); }
void UpdateAI(uint32 diff) override { if (!UpdateVictim()) return; events.Update(diff); while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_STATIC_DISRUPTION: { Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1); if (!target) target = me->GetVictim(); if (target) { TargetGUID = target->GetGUID(); DoCast(target, SPELL_STATIC_DISRUPTION, false); me->SetInFront(me->GetVictim()); } /*if (float dist = me->IsWithinDist3d(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 5.0f) dist = 5.0f; SDisruptAOEVisual_Timer = 1000 + floor(dist / 30 * 1000.0f);*/ events.ScheduleEvent(EVENT_STATIC_DISRUPTION, urand(10000, 18000)); break; } case EVENT_GUST_OF_WIND: { Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1); if (!target) target = me->GetVictim(); if (target) DoCast(target, SPELL_GUST_OF_WIND); events.ScheduleEvent(EVENT_GUST_OF_WIND, urand(20000, 30000)); break; } case EVENT_CALL_LIGHTNING: DoCastVictim(SPELL_CALL_LIGHTNING); events.ScheduleEvent(EVENT_CALL_LIGHTNING, urand(12000, 17000)); // totaly random timer. can't find any info on this break; case EVENT_ELECTRICAL_STORM: { Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50, true); if (!target) { EnterEvadeMode(); return; } target->CastSpell(target, 44007, true); // cloud visual DoCast(target, SPELL_ELECTRICAL_STORM, false); // storm cyclon + visual float x, y, z; target->GetPosition(x, y, z); /// @todo: fix it in correct way, that causes player to can fly until logout /* if (target) { target->SetDisableGravity(true); target->MonsterMoveWithSpeed(x, y, me->GetPositionZ()+15, 0); } */ Unit* Cloud = me->SummonTrigger(x, y, me->GetPositionZ()+16, 0, 15000); if (Cloud) { CloudGUID = Cloud->GetGUID(); Cloud->SetDisableGravity(true); Cloud->StopMoving(); Cloud->SetObjectScale(1.0f); Cloud->setFaction(35); Cloud->SetMaxHealth(9999999); Cloud->SetHealth(9999999); Cloud->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); } StormCount = 1; events.ScheduleEvent(EVENT_ELECTRICAL_STORM, 60000); // 60 seconds(bosskillers) events.ScheduleEvent(EVENT_RAIN, urand(47000, 52000)); break; } case EVENT_RAIN: if (!isRaining) { SetWeather(WEATHER_STATE_HEAVY_RAIN, 0.9999f); isRaining = true; } else events.ScheduleEvent(EVENT_RAIN, 1000); break; case EVENT_STORM_SEQUENCE: { Unit* target = ObjectAccessor::GetUnit(*me, CloudGUID); if (!target || !target->IsAlive()) { EnterEvadeMode(); return; } else if (Unit* Cyclone = ObjectAccessor::GetUnit(*me, CycloneGUID)) Cyclone->CastSpell(target, SPELL_SAND_STORM, true); // keep casting or... HandleStormSequence(target); break; } case EVENT_SUMMON_EAGLES: Talk(SAY_SUMMON); float x, y, z; me->GetPosition(x, y, z); for (uint8 i = 0; i < 8; ++i) { Unit* bird = ObjectAccessor::GetUnit(*me, BirdGUIDs[i]); if (!bird) //they despawned on die { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) { x = target->GetPositionX() + irand(-10, 10); y = target->GetPositionY() + irand(-10, 10); z = target->GetPositionZ() + urand(16, 20); if (z > 95) z = 95.0f - urand(0, 5); } Creature* creature = me->SummonCreature(NPC_SOARING_EAGLE, x, y, z, 0, TEMPSUMMON_CORPSE_DESPAWN, 0); if (creature) { creature->AddThreat(me->GetVictim(), 1.0f); creature->AI()->AttackStart(me->GetVictim()); BirdGUIDs[i] = creature->GetGUID(); } } } break; case EVENT_ENRAGE: Talk(SAY_ENRAGE); DoCast(me, SPELL_BERSERK, true); events.ScheduleEvent(EVENT_ENRAGE, 600000); break; default: break; } } DoMeleeAttackIfReady(); }
void HandleStormSequence(Unit *Cloud) // 1: begin, 2-9: tick, 10: end { if (StormCount < 10 && StormCount > 1) { // deal damage int32 bp0 = 800; for (uint8 i = 2; i < StormCount; ++i) bp0 *= 2; std::list<Unit *> tempUnitMap; MaNGOS::AnyAoETargetUnitInObjectRangeCheck u_check(m_creature, 200); MaNGOS::UnitListSearcher<MaNGOS::AnyAoETargetUnitInObjectRangeCheck> searcher(tempUnitMap, u_check); Cell::VisitAllObjects(m_creature, searcher, 200); for (std::list<Unit*>::iterator i = tempUnitMap.begin(); i != tempUnitMap.end(); ++i) { if (!Cloud->IsWithinDistInMap(*i, 15)) { float x, y, z; (*i)->GetPosition(x, y, z); x = rand()%2 ? x + rand()%5 : x - rand()%5; y = rand()%2 ? y + rand()%5 : y - rand()%5; z = Cloud->GetPositionZ() + 2 - rand()%4; if (Creature *trigger = m_creature->SummonCreature(MOB_TEMP_TRIGGER, x, y, z, 0, TEMPSUMMON_TIMED_DESPAWN, 2000)) { trigger->SetSplineFlags(SPLINEFLAG_FLYING); trigger->StopMoving(); trigger->CastSpell(trigger, 37248, true); trigger->CastCustomSpell(*i, 43137, &bp0, NULL, NULL, true, 0, 0, m_creature->GetGUID()); } } } // visual float x, y, z; for (uint8 i = 0; i < StormCount; ++i) { Cloud->GetPosition(x, y, z); x = rand()%2 ? x + rand()%10 : x - rand()%10; y = rand()%2 ? y + rand()%10 : y - rand()%10; z = z + 2 - rand()%4; if (Creature *trigger = m_creature->SummonCreature(MOB_TEMP_TRIGGER, x, y, z, 0, TEMPSUMMON_TIMED_DESPAWN, 2000)) { trigger->SetSplineFlags(SPLINEFLAG_FLYING); trigger->StopMoving(); trigger->CastSpell(trigger, 37248, true); } Cloud->GetPosition(x, y, z); x = rand()%2 ? x + 10 + rand()%10 : x - 10 - rand()%10; y = rand()%2 ? y + 10 + rand()%10 : y - 10 - rand()%10; if (Unit *trigger = m_creature->SummonCreature(MOB_TEMP_TRIGGER, x, y, m_creature->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 2000)) { trigger->SetMaxHealth(9999999); trigger->SetHealth(9999999); trigger->CastSpell(trigger, 43661, true); } } } StormCount++; if (StormCount > 10) { StormCount = 0; // finish SummonEagles_Timer = 5000; m_creature->InterruptNonMeleeSpells(false); Cloud->RemoveAurasDueToSpell(45213); CloudGUID = 0; if (Unit* Cyclone = m_creature->GetMap()->GetUnit(CycloneGUID)) Cyclone->RemoveAurasDueToSpell(25160); SetWeather(WEATHER_STATE_FINE, 0.0f); isRaining = false; } StormSequenceTimer = 1000; }
void Aggro(Unit* pWho) { DoScriptText(SAY_AGGRO, m_creature); m_creature->SetInCombatWithZone(); SetWeather(WEATHER_STATE_THUNDERS, 0.0f); }
void HandleStormSequence(Unit *Cloud) // 1: begin, 2-9: tick, 10: end { if(StormCount < 10 && StormCount > 1) { // deal damage int32 bp0 = 800; for(uint8 i = 2; i < StormCount; ++i) bp0 *= 2; CellPair p(Ribon::ComputeCellPair(m_creature->GetPositionX(), m_creature->GetPositionY())); Cell cell(p); cell.data.Part.reserved = ALL_DISTRICT; cell.SetNoCreate(); std::list<Unit *> tempUnitMap; { Ribon::AnyAoETargetUnitInObjectRangeCheck u_check(m_creature, m_creature, 999); Ribon::UnitListSearcher<Ribon::AnyAoETargetUnitInObjectRangeCheck> searcher(m_creature, tempUnitMap, u_check); TypeContainerVisitor<Ribon::UnitListSearcher<Ribon::AnyAoETargetUnitInObjectRangeCheck>, WorldTypeMapContainer > world_unit_searcher(searcher); TypeContainerVisitor<Ribon::UnitListSearcher<Ribon::AnyAoETargetUnitInObjectRangeCheck>, GridTypeMapContainer > grid_unit_searcher(searcher); CellLock<GridReadGuard> cell_lock(cell, p); cell_lock->Visit(cell_lock, world_unit_searcher, *(m_creature->GetMap())); cell_lock->Visit(cell_lock, grid_unit_searcher, *(m_creature->GetMap())); } //dealdamege for(std::list<Unit*>::iterator i = tempUnitMap.begin(); i != tempUnitMap.end(); ++i) { if(!Cloud->IsWithinDist(*i, 6, false)) { Cloud->CastCustomSpell(*i, 43137, &bp0, NULL, NULL, true, 0, 0, m_creature->GetGUID()); } } // visual float x,y,z; z = m_creature->GetPositionZ(); for(uint8 i = 0; i < 5+rand()%5; ++i) { x = 343+rand()%60; y = 1380+rand()%60; if(Unit *trigger = m_creature->SummonTrigger(x, y, z, 0, 2000)) { trigger->setFaction(35); trigger->SetMaxHealth(100000); trigger->SetHealth(100000); trigger->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); if (Cloud) Cloud->CastCustomSpell(trigger, /*43661*/43137, &bp0, NULL, NULL,true, 0, 0, Cloud->GetGUID()); } } } StormCount++; if(StormCount > 10) { StormCount = 0; // finish SummonEagles_Timer = 5000; m_creature->InterruptNonMeleeSpells(false); CloudGUID = 0; if (Cloud) Cloud->DealDamage(Cloud, Cloud->GetHealth(),NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); SetWeather(WEATHER_STATE_FINE, 0.0f); isRaining = false; } StormSequenceTimer = 1000; }
void UpdateAI(const uint32 diff) { if (!m_creature->SelectHostilTarget() && !m_creature->getVictim()) return; if(StormCount) { Unit* target = Unit::GetUnit(*m_creature, CloudGUID); if(!target || !target->isAlive()) { EnterEvadeMode(); return; } else if(Unit* Cyclone = Unit::GetUnit(*m_creature, CycloneGUID)) Cyclone->CastSpell(target, 25160, true); // keep casting or... if(StormSequenceTimer < diff) { HandleStormSequence(target); }else StormSequenceTimer -= diff; return; } if (Enrage_Timer < diff) { DoYell(SAY_ONENRAGE, LANG_UNIVERSAL, NULL); DoPlaySoundToSet(m_creature, SOUND_ONENRAGE); m_creature->CastSpell(m_creature, SPELL_BERSERK, true); Enrage_Timer = 600000; }else Enrage_Timer -= diff; if (StaticDisruption_Timer < diff) { Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 1); if(!target) target = m_creature->getVictim(); TargetGUID = target->GetGUID(); m_creature->CastSpell(target, SPELL_STATIC_DISRUPTION, false); m_creature->SetInFront(m_creature->getVictim()); StaticDisruption_Timer = (10+rand()%8)*1000; // < 20s float dist = m_creature->GetDistance(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ()); if (dist < 5.0f) dist = 5.0f; SDisruptAOEVisual_Timer = 1000 + floor(dist / 30 * 1000.0f); }else StaticDisruption_Timer -= diff; if (SDisruptAOEVisual_Timer < diff) { Unit* SDVictim = Unit::GetUnit((*m_creature), TargetGUID); if(SDVictim && SDVictim->isAlive()) SDVictim->CastSpell(SDVictim, SPELL_STATIC_VISUAL, true); SDisruptAOEVisual_Timer = 99999; TargetGUID = 0; }else SDisruptAOEVisual_Timer -= diff; if (GustOfWind_Timer < diff) { Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 1); if(!target) target = m_creature->getVictim(); DoCast(target, SPELL_GUST_OF_WIND); GustOfWind_Timer = (20+rand()%10)*1000; //20 to 30 seconds(bosskillers) } else GustOfWind_Timer -= diff; if (CallLighting_Timer < diff) { DoCast(m_creature->getVictim(), SPELL_CALL_LIGHTNING); CallLighting_Timer = (12 + rand()%5)*1000; //totaly random timer. can't find any info on this } else CallLighting_Timer -= diff; if (!isRaining && ElectricalStorm_Timer < 8000 + rand()%5000) { SetWeather(WEATHER_STATE_HEAVY_RAIN, 0.9999f); isRaining = true; } if (ElectricalStorm_Timer < diff) { Unit* target = SelectRandomPlayer(50); if(!target) target = m_creature->getVictim(); float x, y, z; target->GetPosition(x, y, z); Creature *Cloud = m_creature->SummonCreature(MOB_TEMP_TRIGGER, x, y, m_creature->GetPositionZ() + 10, 0, TEMPSUMMON_TIMED_DESPAWN, 15000); if(Cloud) { CloudGUID = Cloud->GetGUID(); Cloud->AddMonsterMoveFlag(MONSTER_MOVE_LEVITATING); Cloud->StopMoving(); Cloud->SetFloatValue(OBJECT_FIELD_SCALE_X, 3.0f); Cloud->setFaction(35); Cloud->SetMaxHealth(9999999); Cloud->SetHealth(9999999); Cloud->CastSpell(Cloud, 45213, true); // cloud visual m_creature->StopMoving(); Cloud->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); m_creature->CastSpell(Cloud, 43501, false); // siphon soul } Unit *Cyclone = m_creature->SummonCreature(MOB_TEMP_TRIGGER, x, y, z, 0, TEMPSUMMON_TIMED_DESPAWN, 15000); if(Cyclone) { Cyclone->CastSpell(Cyclone, 25160, true); // wind visual CycloneGUID = Cyclone->GetGUID(); } ElectricalStorm_Timer = 60000; //60 seconds(bosskillers) StormCount = 1; StormSequenceTimer = 0; } else ElectricalStorm_Timer -= diff; if (SummonEagles_Timer < diff) { DoYell(SAY_ONSUMMON, LANG_UNIVERSAL, NULL); DoPlaySoundToSet(m_creature, SOUND_ONSUMMON); float x, y, z; m_creature->GetPosition(x, y, z); for (uint8 i = 0; i < 6 + rand()%3; i++) { if(Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0)) { x = target->GetPositionX() + 10 - rand()%20; y = target->GetPositionY() + 10 - rand()%20; z = target->GetPositionZ() + 6 + rand()%5 + 10; if(z > 95) z = 95 - rand()%5; } Creature *pCreature = m_creature->SummonCreature(MOB_SOARING_EAGLE, x, y, z, 0, TEMPSUMMON_CORPSE_DESPAWN, 0); if (pCreature) { pCreature->AddThreat(m_creature->getVictim(), 1.0f); pCreature->AI()->AttackStart(m_creature->getVictim()); } } SummonEagles_Timer = 999999; } else SummonEagles_Timer -= diff; DoMeleeAttackIfReady(); }
void HandleStormSequence(Unit *Cloud) // 1: begin, 2-9: tick, 10: end { if(StormCount < 10 && StormCount > 1) { // deal damage int32 bp0 = 800; for(uint8 i = 2; i < StormCount; ++i) bp0 *= 2; CellPair p(MaNGOS::ComputeCellPair(m_creature->GetPositionX(), m_creature->GetPositionY())); Cell cell(p); cell.data.Part.reserved = ALL_DISTRICT; cell.SetNoCreate(); std::list<Unit *> tempUnitMap; { MaNGOS::AnyAoETargetUnitInObjectRangeCheck u_check(m_creature, m_creature, 999); MaNGOS::UnitListSearcher<MaNGOS::AnyAoETargetUnitInObjectRangeCheck> searcher(tempUnitMap, u_check); TypeContainerVisitor<MaNGOS::UnitListSearcher<MaNGOS::AnyAoETargetUnitInObjectRangeCheck>, WorldTypeMapContainer > world_unit_searcher(searcher); TypeContainerVisitor<MaNGOS::UnitListSearcher<MaNGOS::AnyAoETargetUnitInObjectRangeCheck>, GridTypeMapContainer > grid_unit_searcher(searcher); CellLock<GridReadGuard> cell_lock(cell, p); cell_lock->Visit(cell_lock, world_unit_searcher, *(m_creature->GetMap())); cell_lock->Visit(cell_lock, grid_unit_searcher, *(m_creature->GetMap())); } for(std::list<Unit*>::iterator i = tempUnitMap.begin(); i != tempUnitMap.end(); ++i) { if(!Cloud->IsWithinDistInMap(*i, 15)) { float x, y, z; (*i)->GetPosition(x, y, z); x = rand()%2 ? x + rand()%5 : x - rand()%5; y = rand()%2 ? y + rand()%5 : y - rand()%5; z = Cloud->GetPositionZ() + 2 - rand()%4; if(Creature *trigger = m_creature->SummonCreature(MOB_TEMP_TRIGGER, x, y, z, 0, TEMPSUMMON_TIMED_DESPAWN, 2000)) { trigger->AddMonsterMoveFlag(MONSTER_MOVE_LEVITATING); trigger->StopMoving(); trigger->CastSpell(trigger, 37248, true); trigger->CastCustomSpell(*i, 43137, &bp0, NULL, NULL, true, 0, 0, m_creature->GetGUID()); } } } // visual float x, y, z; for(uint8 i = 0; i < StormCount; ++i) { Cloud->GetPosition(x, y, z); x = rand()%2 ? x + rand()%10 : x - rand()%10; y = rand()%2 ? y + rand()%10 : y - rand()%10; z = z + 2 - rand()%4; if(Creature *trigger = m_creature->SummonCreature(MOB_TEMP_TRIGGER, x, y, z, 0, TEMPSUMMON_TIMED_DESPAWN, 2000)) { trigger->AddMonsterMoveFlag(MONSTER_MOVE_LEVITATING); trigger->StopMoving(); trigger->CastSpell(trigger, 37248, true); } Cloud->GetPosition(x, y, z); x = rand()%2 ? x + 10 + rand()%10 : x - 10 - rand()%10; y = rand()%2 ? y + 10 + rand()%10 : y - 10 - rand()%10; if(Creature *trigger = m_creature->SummonCreature(MOB_TEMP_TRIGGER, x, y, m_creature->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 2000)) { trigger->SetMaxHealth(9999999); trigger->SetHealth(9999999); trigger->CastSpell(trigger, 43661, true); } } } StormCount++; if(StormCount > 10) { StormCount = 0; // finish SummonEagles_Timer = 5000; m_creature->InterruptNonMeleeSpells(false); Cloud->RemoveAurasDueToSpell(45213); CloudGUID = 0; if(Unit* Cyclone = Unit::GetUnit(*m_creature, CycloneGUID)) Cyclone->RemoveAurasDueToSpell(25160); SetWeather(WEATHER_STATE_FINE, 0.0f); isRaining = false; } StormSequenceTimer = 1000; }
void CEnvironment::load () { tonemap = Device.Resources->_CreateTexture("$user$tonemap"); //. hack if (!eff_Rain) eff_Rain = xr_new<CEffect_Rain>(); if (!eff_LensFlare) eff_LensFlare = xr_new<CLensFlare>(); if (!eff_Thunderbolt) eff_Thunderbolt = xr_new<CEffect_Thunderbolt>(); // load weathers if (WeatherCycles.empty()){ LPCSTR first_weather=0; int weather_count = pSettings->line_count("weathers"); for (int w_idx=0; w_idx<weather_count; w_idx++){ LPCSTR weather, sect_w; if (pSettings->r_line("weathers",w_idx,&weather,§_w)){ if (0==first_weather) first_weather=weather; int env_count = pSettings->line_count(sect_w); LPCSTR exec_tm, sect_e; for (int env_idx=0; env_idx<env_count; env_idx++){ if (pSettings->r_line(sect_w,env_idx,&exec_tm,§_e)){ CEnvDescriptor* D=xr_new<CEnvDescriptor>(); D->load (exec_tm,sect_e,this); WeatherCycles[weather].push_back (D); #ifdef DEBUG D->sect_name = sect_e; #endif } } } } // sorting weather envs EnvsMapIt _I=WeatherCycles.begin(); EnvsMapIt _E=WeatherCycles.end(); for (; _I!=_E; _I++){ R_ASSERT3 (_I->second.size()>1,"Environment in weather must >=2",*_I->first); std::sort(_I->second.begin(),_I->second.end(),sort_env_etl_pred); } R_ASSERT2 (!WeatherCycles.empty(),"Empty weathers."); SetWeather (first_weather); } // load weather effects if (WeatherFXs.empty()){ int line_count = pSettings->line_count("weather_effects"); for (int w_idx=0; w_idx<line_count; w_idx++){ LPCSTR weather, sect_w; if (pSettings->r_line("weather_effects",w_idx,&weather,§_w)){ EnvVec& env = WeatherFXs[weather]; env.push_back (xr_new<CEnvDescriptor>()); env.back()->exec_time_loaded = 0; env.push_back (xr_new<CEnvDescriptor>()); env.back()->exec_time_loaded = 0; int env_count = pSettings->line_count(sect_w); LPCSTR exec_tm, sect_e; for (int env_idx=0; env_idx<env_count; env_idx++){ if (pSettings->r_line(sect_w,env_idx,&exec_tm,§_e)){ CEnvDescriptor* D=xr_new<CEnvDescriptor>(); D->load (exec_tm,sect_e,this); env.push_back (D); #ifdef DEBUG D->sect_name = sect_e; #endif } } env.push_back (xr_new<CEnvDescriptor>()); env.back()->exec_time_loaded = DAY_LENGTH; } } // sorting weather envs EnvsMapIt _I=WeatherFXs.begin(); EnvsMapIt _E=WeatherFXs.end(); for (; _I!=_E; _I++){ R_ASSERT3 (_I->second.size()>1,"Environment in weather must >=2",*_I->first); std::sort(_I->second.begin(),_I->second.end(),sort_env_etl_pred); } } }
bool CSector::r_Verb( CScript & s, CTextConsole * pSrc ) { ADDTOCALLSTACK("CSector::r_Verb"); EXC_TRY("Verb"); ASSERT(pSrc); int index = FindTableSorted( s.GetKey(), sm_szVerbKeys, CountOf(sm_szVerbKeys)-1 ); switch (index) { case SEV_ALLCHARS: // "ALLCHARS" v_AllChars( s, pSrc ); break; case SEV_ALLCHARSIDLE: // "ALLCHARSIDLE" v_AllCharsIdle( s, pSrc ); break; case SEV_ALLCLIENTS: // "ALLCLIENTS" v_AllClients( s, pSrc ); break; case SEV_ALLITEMS: // "ALLITEMS" v_AllItems( s, pSrc ); break; case SEV_AWAKE: if (!IsSleeping()) { break; } GoAwake(); break; case SEV_DRY: // "DRY" SetWeather( WEATHER_DRY ); break; case SEV_LIGHT: if ( g_Cfg.m_bAllowLightOverride ) SetLight( (s.HasArgs()) ? s.GetArgVal() : -1 ); else g_Log.EventWarn("AllowLightOverride flag is disabled in sphere.ini, so sector's LIGHT property wasn't set\n"); break; case SEV_RAIN: SetWeather(s.HasArgs() ? static_cast<WEATHER_TYPE>(s.GetArgVal()) : WEATHER_RAIN); break; case SEV_RESPAWN: ( toupper( s.GetArgRaw()[0] ) == 'A' ) ? g_World.RespawnDeadNPCs() : RespawnDeadNPCs(); break; case SEV_RESTOCK: // x // set restock time of all vendors in World, set the respawn time of all spawns in World. ( toupper( s.GetArgRaw()[0] ) == 'A' ) ? g_World.Restock() : Restock(); break; case SEV_SEASON: SetSeason(static_cast<SEASON_TYPE>(s.GetArgVal())); break; case SEV_SLEEP: { if (IsSleeping()) { break; } if (!s.HasArgs())// with no args it will check if it can sleep before, to avoid possible problems. { if (!CanSleep(true)) { break; } } GoSleep(); } break; case SEV_SNOW: SetWeather( WEATHER_SNOW ); break; default: return( CScriptObj::r_Verb( s, pSrc )); } return true; EXC_CATCH; EXC_DEBUG_START; EXC_ADD_SCRIPTSRC; EXC_DEBUG_END; return false; }
void UpdateAI(const uint32 diff) { if (!UpdateVictim()) return; if(StormCount) { Unit* target = Unit::GetUnit(*m_creature, CloudGUID); if(!target || !target->isAlive()) { EnterEvadeMode(); return; } else if(Unit* Cyclone = Unit::GetUnit(*m_creature, CycloneGUID)) Cyclone->CastSpell(target, 25160, true); // keep casting or... if(StormSequenceTimer < diff) { HandleStormSequence(target); }else StormSequenceTimer -= diff; return; } if (Enrage_Timer < diff) { DoYell(SAY_ONENRAGE, LANG_UNIVERSAL, NULL); DoPlaySoundToSet(m_creature, SOUND_ONENRAGE); m_creature->CastSpell(m_creature, SPELL_BERSERK, true); Enrage_Timer = 600000; }else Enrage_Timer -= diff; if (StaticDisruption_Timer < diff) { Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 1); if(!target) target = m_creature->getVictim(); TargetGUID = target->GetGUID(); m_creature->CastSpell(target, SPELL_STATIC_DISRUPTION, false); m_creature->SetInFront(m_creature->getVictim()); StaticDisruption_Timer = (10+rand()%8)*1000; // < 20s /*if(float dist = m_creature->IsWithinDist3d(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 5.0f) dist = 5.0f; SDisruptAOEVisual_Timer = 1000 + floor(dist / 30 * 1000.0f);*/ }else StaticDisruption_Timer -= diff; if (GustOfWind_Timer < diff) { Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 1); if(!target) target = m_creature->getVictim(); DoCast(target, SPELL_GUST_OF_WIND); GustOfWind_Timer = (20+rand()%10)*1000; //20 to 30 seconds(bosskillers) } else GustOfWind_Timer -= diff; if (CallLighting_Timer < diff) { DoCast(m_creature->getVictim(), SPELL_CALL_LIGHTNING); CallLighting_Timer = (12 + rand()%5)*1000; //totaly random timer. can't find any info on this } else CallLighting_Timer -= diff; if (!isRaining && ElectricalStorm_Timer < 8000 + rand()%5000) { SetWeather(WEATHER_STATE_HEAVY_RAIN, 0.9999f); isRaining = true; } if (ElectricalStorm_Timer < diff) { Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50, true); if(!target) { EnterEvadeMode(); return; } target->CastSpell(target, 44007, true);//cloud visual m_creature->CastSpell(target, SPELL_ELECTRICAL_STORM, false);//storm cyclon + visual float x,y,z; target->GetPosition(x,y,z); if (target) { target->SetUnitMovementFlags(MOVEMENTFLAG_LEVITATING); target->SendMonsterMove(x,y,m_creature->GetPositionZ()+15,0); } Unit *Cloud = m_creature->SummonTrigger(x, y, m_creature->GetPositionZ()+16, 0, 15000); if(Cloud) { CloudGUID = Cloud->GetGUID(); Cloud->SetUnitMovementFlags(MOVEMENTFLAG_LEVITATING); Cloud->StopMoving(); Cloud->SetFloatValue(OBJECT_FIELD_SCALE_X, 1.0f); Cloud->setFaction(35); Cloud->SetMaxHealth(9999999); Cloud->SetHealth(9999999); Cloud->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); } ElectricalStorm_Timer = 60000; //60 seconds(bosskillers) StormCount = 1; StormSequenceTimer = 0; } else ElectricalStorm_Timer -= diff; if (SummonEagles_Timer < diff) { DoYell(SAY_ONSUMMON, LANG_UNIVERSAL, NULL); DoPlaySoundToSet(m_creature, SOUND_ONSUMMON); float x, y, z; m_creature->GetPosition(x, y, z); for (uint8 i = 0; i < 8; i++) { Unit* bird = Unit::GetUnit(*m_creature,BirdGUIDs[i]); if(!bird)//they despawned on die { if(Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0)) { x = target->GetPositionX() + 10 - rand()%20; y = target->GetPositionY() + 10 - rand()%20; z = target->GetPositionZ() + 6 + rand()%5 + 10; if(z > 95) z = 95 - rand()%5; } Creature *pCreature = m_creature->SummonCreature(MOB_SOARING_EAGLE, x, y, z, 0, TEMPSUMMON_CORPSE_DESPAWN, 0); if (pCreature) { pCreature->AddThreat(m_creature->getVictim(), 1.0f); pCreature->AI()->AttackStart(m_creature->getVictim()); BirdGUIDs[i] = pCreature->GetGUID(); } } } SummonEagles_Timer = 999999; } else SummonEagles_Timer -= diff; DoMeleeAttackIfReady(); }
void HandleStormSequence(Unit* Cloud) // 1: begin, 2-9: tick, 10: end { if (StormCount < 10 && StormCount > 1) { // deal damage int32 bp0 = 800; for (uint8 i = 2; i < StormCount; ++i) bp0 *= 2; std::list<Unit*> tempUnitMap; Trinity::AnyAoETargetUnitInObjectRangeCheck u_check(me, me, SIZE_OF_GRIDS); Trinity::UnitListSearcher<Trinity::AnyAoETargetUnitInObjectRangeCheck> searcher(me, tempUnitMap, u_check); Cell::VisitAllObjects(me, searcher, SIZE_OF_GRIDS); // deal damage for (std::list<Unit*>::const_iterator i = tempUnitMap.begin(); i != tempUnitMap.end(); ++i) { if (Unit* target = (*i)) { if (Cloud && !Cloud->IsWithinDist(target, 6, false)) { CastSpellExtraArgs args; args.TriggerFlags = TRIGGERED_FULL_MASK; args.OriginalCaster = me->GetGUID(); args.AddSpellMod(SPELLVALUE_BASE_POINT0, bp0); Cloud->CastSpell(target, SPELL_ZAP, args); } } } // visual float x, y, z; z = me->GetPositionZ(); uint8 maxCount = 5 + rand32() % 5; for (uint8 i = 0; i < maxCount; ++i) { x = 343.0f + rand32() % 60; y = 1380.0f + rand32() % 60; if (Unit* trigger = me->SummonTrigger(x, y, z, 0, 2000)) { trigger->SetFaction(FACTION_FRIENDLY); trigger->SetMaxHealth(100000); trigger->SetHealth(100000); trigger->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); if (Cloud) { CastSpellExtraArgs args; args.TriggerFlags = TRIGGERED_FULL_MASK; args.OriginalCaster = Cloud->GetGUID(); args.AddSpellMod(SPELLVALUE_BASE_POINT0, bp0); Cloud->CastSpell(trigger, SPELL_ZAP, args); } } } } ++StormCount; if (StormCount > 10) { StormCount = 0; // finish events.ScheduleEvent(EVENT_SUMMON_EAGLES, 5s); me->InterruptNonMeleeSpells(false); CloudGUID.Clear(); if (Cloud) Cloud->KillSelf(); SetWeather(WEATHER_STATE_FINE, 0.0f); isRaining = false; } events.ScheduleEvent(EVENT_STORM_SEQUENCE, 1s); }