void BattleGroundDS::Update(uint32 diff) { BattleGround::Update(diff); if (GetStatus() == STATUS_IN_PROGRESS) { // first knockback if(m_uiKnockback < diff && KnockbackCheck) { //dalaran sewers = 617; for(BattleGroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) { Player * plr = sObjectMgr.GetPlayer(itr->first); if (plr) { if (plr->GetTeam() == ALLIANCE && plr->GetDistance2d(1214, 765) <= 50 && plr->GetPositionZ() > 10) plr->KnockBackPlayerWithAngle(6.05f, 55, 7); if (plr->GetTeam() == HORDE && plr->GetDistance2d(1369, 817) <= 50 && plr->GetPositionZ() > 10) plr->KnockBackPlayerWithAngle(3.03f, 55, 7); } } KnockbackCheck = false; }else m_uiKnockback -= diff; // just for sure if knockback wont work from any reason teleport down if(m_uiTeleport < diff && TeleportCheck) { //dalaran sewers = 617; for(BattleGroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) { Player * plr = sObjectMgr.GetPlayer(itr->first); if (plr) { if (plr->GetTeam() == ALLIANCE && plr->GetDistance2d(1214, 765) <= 50 && plr->GetPositionZ() > 10) plr->TeleportTo(617, 1257+urand(0,2), 761+urand(0,2), 3.2f, 0.5f); if (plr->GetTeam() == HORDE && plr->GetDistance2d(1369, 817) <= 50 && plr->GetPositionZ() > 10) plr->TeleportTo(617, 1328+urand(0,2), 815+urand(0,2), 3.2f, 3.5f); } } TeleportCheck = false; // close the gate OpenDoorEvent(BG_EVENT_DOOR); }else m_uiTeleport -= diff; if (m_uiFall < diff) { for(BattleGroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) { Player * plr = sObjectMgr.GetPlayer(itr->first); if (plr) { if (plr->GetPositionZ() < 0.5) plr->TeleportTo(617, plr->GetPositionX(), plr->GetPositionY(), plr->GetPositionZ() + 8, plr->GetOrientation()); } } }else m_uiFall -= diff; } }
void BattlegroundDS::Update(uint32 diff) { Battleground::Update(diff); if (GetStatus() == STATUS_IN_PROGRESS) { if (GetStartTime() >= 47*MINUTE*IN_MILLISECONDS) // after 47 minutes without one team losing, the arena closes with no winner and no rating change { UpdateArenaWorldState(); CheckArenaAfterTimerConditions(); } } if (getWaterFallTimer() < diff) { if (GetBgMap(false)) if (isWaterFallActive()) { setWaterFallTimer(urand(BG_DS_WATERFALL_TIMER_MIN, BG_DS_WATERFALL_TIMER_MAX)); for (uint32 i = BG_DS_OBJECT_WATER_1; i <= BG_DS_OBJECT_WATER_2; ++i) SpawnBGObject(i, getWaterFallTimer()); setWaterFallActive(false); } else { setWaterFallTimer(BG_DS_WATERFALL_DURATION); for (uint32 i = BG_DS_OBJECT_WATER_1; i <= BG_DS_OBJECT_WATER_2; ++i) SpawnBGObject(i, RESPAWN_IMMEDIATELY); setWaterFallActive(true); } } else setWaterFallTimer(getWaterFallTimer() - diff); if (GetStatus() == STATUS_IN_PROGRESS) { if(m_knockback < diff && m_knockbackCheck) { for(BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); itr++) { Player * plr = sObjectMgr->GetPlayer(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); } m_knockbackCheck = false; } else m_knockback -= diff; } }
void BattleGroundDS::Update(uint32 diff) { BattleGround::Update(diff); if (GetStatus() == STATUS_IN_PROGRESS) { // knockback if (m_uiKnockback < diff) { for(BattleGroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) { Player * plr = sObjectMgr.GetPlayer(itr->first); if (plr && plr->IsWithinLOS(1214,765,14) && plr->GetDistance2d(1214,765) <= 50) plr->KnockBackPlayerWithAngle(6.40f,55,7); if (plr && plr->IsWithinLOS(1369,817,14) && plr->GetDistance2d(1369,817) <= 50) plr->KnockBackPlayerWithAngle(3.03f,55,7); } m_uiKnockback = 1000; } else m_uiKnockback -= diff; // Waterfall if (m_uiWaterfall < diff) { if (WaterfallActivated) { SpawnEvent(WATERFALL_EVENT, 0, false); WaterfallActivated = false; } else { SpawnEvent(WATERFALL_EVENT, 0, true); WaterfallActivated = true; for (BattleGroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) { Player * plr = sObjectMgr.GetPlayer(itr->first); if (plr && plr->GetDistance2d(1291, 790) <= 6) plr->KnockBackFrom(plr, -20.0f, 9.0f); } } m_uiWaterfall = urand(30,45)*IN_MILLISECONDS; } else m_uiWaterfall -= diff; } }
void UpdatePortals() // Here we handle the beams' behavior { for (int j=0; j<3; ++j) // j = color if (Creature *portal = Unit::GetCreature(*me, PortalGUID[j])) { // the one who's been casted upon before Unit *current = Unit::GetUnit(*portal, BeamTarget[j]); // temporary store for the best suitable beam reciever Unit *pTarget = me; if (Map* map = me->GetMap()) { Map::PlayerList const& players = map->GetPlayers(); // get the best suitable target for (Map::PlayerList::const_iterator i = players.begin(); i != players.end(); ++i) { Player* p = i->getSource(); if (p && p->isAlive() // alive && (!pTarget || pTarget->GetDistance2d(portal)>p->GetDistance2d(portal)) // closer than current best && !p->HasAura(PlayerDebuff[j],0) // not exhausted && !p->HasAura(PlayerBuff[(j+1)%3],0) // not on another beam && !p->HasAura(PlayerBuff[(j+2)%3],0) && IsBetween(me, p, portal)) // on the beam pTarget = p; } } // buff the target if (pTarget->GetTypeId() == TYPEID_PLAYER) pTarget->AddAura(PlayerBuff[j], pTarget); else pTarget->AddAura(NetherBuff[j], pTarget); // cast visual beam on the chosen target if switched // simple target switching isn't working -> using BeamerGUID to cast (workaround) if (!current || pTarget != current) { BeamTarget[j] = pTarget->GetGUID(); // remove currently beaming portal if (Creature *beamer = Unit::GetCreature(*portal, BeamerGUID[j])) { beamer->CastSpell(pTarget, PortalBeam[j], false); beamer->SetVisibility(VISIBILITY_OFF); beamer->DealDamage(beamer, beamer->GetMaxHealth()); beamer->RemoveFromWorld(); BeamerGUID[j] = 0; } // create new one and start beaming on the target if (Creature *beamer = portal->SummonCreature(PortalID[j],portal->GetPositionX(),portal->GetPositionY(),portal->GetPositionZ(),portal->GetOrientation(),TEMPSUMMON_TIMED_DESPAWN,60000)) { beamer->CastSpell(pTarget, PortalBeam[j], false); BeamerGUID[j] = beamer->GetGUID(); } } // aggro target if Red Beam if (j == RED_PORTAL && me->getVictim() != pTarget && pTarget->GetTypeId() == TYPEID_PLAYER) me->getThreatManager().addThreat(pTarget, 100000.0f+DoGetThreat(me->getVictim())); } }
void BattlegroundDS::PostUpdateImpl(uint32 diff) { if (getWaterFallTimer() < diff) { if (isWaterFallActive()) { setWaterFallTimer(urand(BG_DS_WATERFALL_TIMER_MIN, BG_DS_WATERFALL_TIMER_MAX)); for (uint32 i = BG_DS_OBJECT_WATER_1; i <= BG_DS_OBJECT_WATER_2; ++i) SpawnBGObject(i, getWaterFallTimer()); setWaterFallActive(false); } else { setWaterFallTimer(BG_DS_WATERFALL_DURATION); for (uint32 i = BG_DS_OBJECT_WATER_1; i <= BG_DS_OBJECT_WATER_2; ++i) SpawnBGObject(i, RESPAWN_IMMEDIATELY); setWaterFallActive(true); } } else setWaterFallTimer(getWaterFallTimer() - diff); if (GetStatus() == STATUS_IN_PROGRESS) { if(m_knockback < diff && m_knockbackCheck) { for(BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); itr++) { Player * plr = sObjectMgr->GetPlayerByLowGUID(itr->first); if(plr) { 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); if(plr->HasAura(SPELL_DEMONIC_CIRCLE)) plr->RemoveAurasDueToSpell(SPELL_DEMONIC_CIRCLE); } } m_knockbackCheck = false; } else m_knockback -= diff; } }
void BattlegroundEY::UpdatePointStatuses() { for (uint8 point = 0; point < EY_POINTS_MAX; ++point) { if (m_PlayersNearPoint[point].empty()) continue; //count new point bar status: m_PointBarStatus[point] += (m_CurrentPointPlayersCount[2 * point] - m_CurrentPointPlayersCount[2 * point + 1] < BG_EY_POINT_MAX_CAPTURERS_COUNT) ? m_CurrentPointPlayersCount[2 * point] - m_CurrentPointPlayersCount[2 * point + 1] : BG_EY_POINT_MAX_CAPTURERS_COUNT; if (m_PointBarStatus[point] > BG_EY_PROGRESS_BAR_ALI_CONTROLLED) //point is fully alliance's m_PointBarStatus[point] = BG_EY_PROGRESS_BAR_ALI_CONTROLLED; if (m_PointBarStatus[point] < BG_EY_PROGRESS_BAR_HORDE_CONTROLLED) //point is fully horde's m_PointBarStatus[point] = BG_EY_PROGRESS_BAR_HORDE_CONTROLLED; uint32 pointOwnerTeamId = 0; //find which team should own this point if (m_PointBarStatus[point] <= BG_EY_PROGRESS_BAR_NEUTRAL_LOW) pointOwnerTeamId = HORDE; else if (m_PointBarStatus[point] >= BG_EY_PROGRESS_BAR_NEUTRAL_HIGH) pointOwnerTeamId = ALLIANCE; else pointOwnerTeamId = EY_POINT_NO_OWNER; for (uint8 i = 0; i < m_PlayersNearPoint[point].size(); ++i) { Player* player = ObjectAccessor::FindPlayer(m_PlayersNearPoint[point][i]); if (player) { this->UpdateWorldStateForPlayer(PROGRESS_BAR_STATUS, m_PointBarStatus[point], player); //if point owner changed we must evoke event! if (pointOwnerTeamId != m_PointOwnedByTeam[point]) { //point was uncontrolled and player is from team which captured point if (m_PointState[point] == EY_POINT_STATE_UNCONTROLLED && player->GetTeam() == pointOwnerTeamId) this->EventTeamCapturedPoint(player, point); //point was under control and player isn't from team which controlled it if (m_PointState[point] == EY_POINT_UNDER_CONTROL && player->GetTeam() != m_PointOwnedByTeam[point]) this->EventTeamLostPoint(player, point); } // Fix for Fel Reaver Ruins // This is here because the capture point areatrigger overlays the flag deposit one. // Their respective IDs are 5866 and 4515 // Most probably Blizz wanted it to be this way but could not make it // So they removed areaTrigger 5866. Best would be to implement DISABLE_AREATRIGGER. if (point == FEL_REAVER && m_PointOwnedByTeam[point] == player->GetTeam()) if (m_FlagState && GetFlagPickerGUID() == player->GetGUID()) if (player->GetDistance2d(float(2044), float(1730)) < 2.0f) EventPlayerCapturedFlag(player, BG_EY_OBJECT_FLAG_FEL_REAVER); } } } }
void BattlegroundEY::UpdatePointStatuses() { _400Ally40Horde = 0; for(uint8 point = 0; point < EY_POINTS_MAX; ++point) { if(m_PlayersNearPoint[point].empty()) continue; //count new point bar status: m_PointBarStatus[point] += (m_CurrentPointPlayersCount[2 * point] - m_CurrentPointPlayersCount[2 * point + 1] < BG_EY_POINT_MAX_CAPTURERS_COUNT) ? m_CurrentPointPlayersCount[2 * point] - m_CurrentPointPlayersCount[2 * point + 1] : BG_EY_POINT_MAX_CAPTURERS_COUNT; if(m_PointBarStatus[point] > BG_EY_PROGRESS_BAR_ALI_CONTROLLED) { m_PointBarStatus[point] = BG_EY_PROGRESS_BAR_ALI_CONTROLLED; _400Ally40Horde += 10; } else if(m_PointBarStatus[point] < BG_EY_PROGRESS_BAR_HORDE_CONTROLLED) { _400Ally40Horde += 100; m_PointBarStatus[point] = BG_EY_PROGRESS_BAR_HORDE_CONTROLLED; } uint32 pointOwnerTeamId = 0; //find which team should own this point if(m_PointBarStatus[point] <= BG_EY_PROGRESS_BAR_NEUTRAL_LOW) pointOwnerTeamId = HORDE; else if(m_PointBarStatus[point] >= BG_EY_PROGRESS_BAR_NEUTRAL_HIGH) pointOwnerTeamId = ALLIANCE; else pointOwnerTeamId = EY_POINT_NO_OWNER; for(uint8 i = 0; i < m_PlayersNearPoint[point].size(); ++i) { Player* plr = sObjectMgr->GetPlayer(m_PlayersNearPoint[point][i]); if(plr) { this->UpdateWorldStateForPlayer(PROGRESS_BAR_STATUS, m_PointBarStatus[point], plr); //if point owner changed we must evoke event! if(pointOwnerTeamId != m_PointOwnedByTeam[point]) { //point was uncontrolled and player is from team which captured point if(m_PointState[point] == EY_POINT_STATE_UNCONTROLLED && plr->GetTeam() == pointOwnerTeamId) this->EventTeamCapturedPoint(plr, point); //point was under control and player isn't from team which controlled it if(m_PointState[point] == EY_POINT_UNDER_CONTROL && plr->GetTeam() != m_PointOwnedByTeam[point]) this->EventTeamLostPoint(plr, point); } if(point == FEL_REAVER && m_PointOwnedByTeam[point] == plr->GetTeam()) // hack fix for Fel Reaver Ruins { if(m_FlagState && GetFlagPickerGUID() == plr->GetGUID()) if(plr->GetDistance2d(2044.0f,1730.0f) < 7.0f) EventPlayerCapturedFlag(plr, BG_EY_OBJECT_FLAG_FEL_REAVER); } } } } }
void BattlegroundEY::UpdatePointStatuses() { for (uint8 point = 0; point < EY_POINTS_MAX; ++point) { if (m_PlayersNearPoint[point].empty()) continue; // Count new point bar status: m_PointBarStatus[point] += (m_CurrentPointPlayersCount[2 * point] - m_CurrentPointPlayersCount[2 * point + 1] < BG_EY_POINT_MAX_CAPTURERS_COUNT) ? m_CurrentPointPlayersCount[2 * point] - m_CurrentPointPlayersCount[2 * point + 1] : BG_EY_POINT_MAX_CAPTURERS_COUNT; if (m_PointBarStatus[point] > BG_EY_PROGRESS_BAR_ALI_CONTROLLED) // Point is full Alliance. m_PointBarStatus[point] = BG_EY_PROGRESS_BAR_ALI_CONTROLLED; if (m_PointBarStatus[point] < BG_EY_PROGRESS_BAR_HORDE_CONTROLLED) // Point is full Horde. m_PointBarStatus[point] = BG_EY_PROGRESS_BAR_HORDE_CONTROLLED; uint32 pointOwnerTeamId = 0; // Find which team should own this point. if (m_PointBarStatus[point] <= BG_EY_PROGRESS_BAR_NEUTRAL_LOW) pointOwnerTeamId = HORDE; else if (m_PointBarStatus[point] >= BG_EY_PROGRESS_BAR_NEUTRAL_HIGH) pointOwnerTeamId = ALLIANCE; else pointOwnerTeamId = EY_POINT_NO_OWNER; for (uint8 i = 0; i < m_PlayersNearPoint[point].size(); ++i) { Player* player = ObjectAccessor::FindPlayer(m_PlayersNearPoint[point][i]); if (player) { UpdateWorldStateForPlayer(PROGRESS_BAR_STATUS, m_PointBarStatus[point], player); // If the point owner changed we must evoke the event! if (pointOwnerTeamId != m_PointOwnedByTeam[point]) { // The point was uncontrolled and the player is from the team which captured the point. if (m_PointState[point] == EY_POINT_STATE_UNCONTROLLED && player->GetBGTeam() == pointOwnerTeamId) this->EventTeamCapturedPoint(player, point); // The point was under control andthe player isn't from the team which controlled it. if (m_PointState[point] == EY_POINT_UNDER_CONTROL && player->GetBGTeam() != m_PointOwnedByTeam[point]) this->EventTeamLostPoint(player, point); } // Fix for Fel Reaver Ruins. if (point == FEL_REAVER && m_PointOwnedByTeam[point] == player->GetBGTeam()) if (m_FlagState && GetFlagPickerGUID() == player->GetGUID()) if (player->GetDistance2d(2044.0f, 1730.0f) < 2.0f) EventPlayerCapturedFlag(player, BG_EY_OBJECT_FLAG_FEL_REAVER); } } } }
void BattleGroundDS::Update(uint32 diff) { BattleGround::Update(diff); if (GetStatus() == STATUS_IN_PROGRESS) { // knockback if(m_uiKnockback < diff) { for(BattleGroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) { Player * plr = sObjectMgr.GetPlayer(itr->first); if (plr && plr->IsWithinLOS(1214,765,14) && plr->GetDistance2d(1214,765) <= 50) plr->KnockBackPlayerWithAngle(6.40f,55,7); if (plr && plr->IsWithinLOS(1369,817,14) && plr->GetDistance2d(1369,817) <= 50) plr->KnockBackPlayerWithAngle(3.03f,55,7); } m_uiKnockback = 1000; } else m_uiKnockback -= diff; } }
void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEATH, me); AchievementEntry const *achievSnakes = GetAchievementStore()->LookupEntry(ACHIEV_SNAKES); if (achievSnakes && IsHeroic()) { for (std::set<uint64>::const_iterator itr = lUnWrappedPlayers.begin(); itr != lUnWrappedPlayers.end(); ++itr) { Player* temp = Unit::GetPlayer(*me, *itr); if (temp && temp->isAlive() && (temp->GetDistance2d(me) < 100)) temp->CompletedAchievement(achievSnakes); } } if (pInstance) pInstance->SetData(DATA_SLAD_RAN_EVENT, DONE); }
void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEATH, me); if (pInstance) { AchievementEntry const *achievIntenseCold = GetAchievementStore()->LookupEntry(ACHIEV_INTENSE_COLD); if (achievIntenseCold && IsHeroic()) { for (std::set<uint64>::const_iterator itr = lIntenseColdPlayers.begin(); itr != lIntenseColdPlayers.end(); ++itr) { Player* temp = Unit::GetPlayer(*me, *itr); if (temp && temp->isAlive() && (temp->GetDistance2d(me) < 50)) temp->CompletedAchievement(achievIntenseCold); } } pInstance->SetData(DATA_KERISTRASZA_EVENT, DONE); } }
void GameObject::Use(Unit* user) { // by default spell caster is user Unit* spellCaster = user; uint32 spellId = 0; switch(GetGoType()) { case GAMEOBJECT_TYPE_DOOR: //0 case GAMEOBJECT_TYPE_BUTTON: //1 //doors/buttons never really despawn, only reset to default state/flags UseDoorOrButton(); // activate script sWorld.ScriptsStart(sGameObjectScripts, GetDBTableGUIDLow(), spellCaster, this); return; case GAMEOBJECT_TYPE_QUESTGIVER: //2 { if(user->GetTypeId()!=TYPEID_PLAYER) return; Player* player = (Player*)user; player->PrepareQuestMenu( GetGUID() ); player->SendPreparedQuest( GetGUID() ); return; } //Sitting: Wooden bench, chairs enzz case GAMEOBJECT_TYPE_CHAIR: //7 { GameObjectInfo const* info = GetGOInfo(); if(!info) return; if(user->GetTypeId()!=TYPEID_PLAYER) return; Player* player = (Player*)user; // a chair may have n slots. we have to calculate their positions and teleport the player to the nearest one // check if the db is sane if(info->chair.slots > 0) { float lowestDist = DEFAULT_VISIBILITY_DISTANCE; float x_lowest = GetPositionX(); float y_lowest = GetPositionY(); // the object orientation + 1/2 pi // every slot will be on that straight line float orthogonalOrientation = GetOrientation()+M_PI*0.5f; // find nearest slot for(uint32 i=0; i<info->chair.slots; i++) { // the distance between this slot and the center of the go - imagine a 1D space float relativeDistance = (info->size*i)-(info->size*(info->chair.slots-1)/2.0f); float x_i = GetPositionX() + relativeDistance * cos(orthogonalOrientation); float y_i = GetPositionY() + relativeDistance * sin(orthogonalOrientation); // calculate the distance between the player and this slot float thisDistance = player->GetDistance2d(x_i, y_i); /* debug code. It will spawn a npc on each slot to visualize them. Creature* helper = player->SummonCreature(14496, x_i, y_i, GetPositionZ(), GetOrientation(), TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 10000); std::ostringstream output; output << i << ": thisDist: " << thisDistance; helper->MonsterSay(output.str().c_str(), LANG_UNIVERSAL, 0); */ if(thisDistance <= lowestDist) { lowestDist = thisDistance; x_lowest = x_i; y_lowest = y_i; } } player->TeleportTo(GetMapId(), x_lowest, y_lowest, GetPositionZ(), GetOrientation(),TELE_TO_NOT_LEAVE_TRANSPORT | TELE_TO_NOT_LEAVE_COMBAT | TELE_TO_NOT_UNSUMMON_PET); } else { // fallback, will always work player->TeleportTo(GetMapId(), GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation(),TELE_TO_NOT_LEAVE_TRANSPORT | TELE_TO_NOT_LEAVE_COMBAT | TELE_TO_NOT_UNSUMMON_PET); } player->SetStandState(PLAYER_STATE_SIT_LOW_CHAIR+info->chair.height); return; } //big gun, its a spell/aura case GAMEOBJECT_TYPE_GOOBER: //10 { GameObjectInfo const* info = GetGOInfo(); if(user->GetTypeId()==TYPEID_PLAYER) { Player* player = (Player*)user; // show page if(info->goober.pageId) { WorldPacket data(SMSG_GAMEOBJECT_PAGETEXT, 8); data << GetGUID(); player->GetSession()->SendPacket(&data); } // possible quest objective for active quests player->CastedCreatureOrGO(info->id, GetGUID(), 0); } // cast this spell later if provided spellId = info->goober.spellId; break; } case GAMEOBJECT_TYPE_CAMERA: //13 { GameObjectInfo const* info = GetGOInfo(); if(!info) return; if(user->GetTypeId()!=TYPEID_PLAYER) return; Player* player = (Player*)user; if(info->camera.cinematicId) { WorldPacket data(SMSG_TRIGGER_CINEMATIC, 4); data << info->camera.cinematicId; player->GetSession()->SendPacket(&data); } return; } //fishing bobber case GAMEOBJECT_TYPE_FISHINGNODE: //17 { if(user->GetTypeId()!=TYPEID_PLAYER) return; Player* player = (Player*)user; if(player->GetGUID() != GetOwnerGUID()) return; switch(getLootState()) { case GO_READY: // ready for loot { // 1) skill must be >= base_zone_skill // 2) if skill == base_zone_skill => 5% chance // 3) chance is linear dependence from (base_zone_skill-skill) uint32 subzone = GetAreaId(); int32 zone_skill = objmgr.GetFishingBaseSkillLevel( subzone ); if(!zone_skill) zone_skill = objmgr.GetFishingBaseSkillLevel( GetZoneId() ); //provide error, no fishable zone or area should be 0 if(!zone_skill) sLog.outErrorDb("Fishable areaId %u are not properly defined in `skill_fishing_base_level`.",subzone); int32 skill = player->GetSkillValue(SKILL_FISHING); int32 chance = skill - zone_skill + 5; int32 roll = irand(1,100); DEBUG_LOG("Fishing check (skill: %i zone min skill: %i chance %i roll: %i",skill,zone_skill,chance,roll); if(skill >= zone_skill && chance >= roll) { // prevent removing GO at spell cancel player->RemoveGameObject(this,false); SetOwnerGUID(player->GetGUID()); //fish catched player->UpdateFishingSkill(); GameObject* ok = LookupFishingHoleAround(DEFAULT_VISIBILITY_DISTANCE); if (ok) { player->SendLoot(ok->GetGUID(),LOOT_FISHINGHOLE); SetLootState(GO_JUST_DEACTIVATED); } else player->SendLoot(GetGUID(),LOOT_FISHING); } else { // fish escaped, can be deleted now SetLootState(GO_JUST_DEACTIVATED); WorldPacket data(SMSG_FISH_ESCAPED, 0); player->GetSession()->SendPacket(&data); } break; } case GO_JUST_DEACTIVATED: // nothing to do, will be deleted at next update break; default: { SetLootState(GO_JUST_DEACTIVATED); WorldPacket data(SMSG_FISH_NOT_HOOKED, 0); player->GetSession()->SendPacket(&data); break; } } if(player->m_currentSpells[CURRENT_CHANNELED_SPELL]) { player->m_currentSpells[CURRENT_CHANNELED_SPELL]->SendChannelUpdate(0); player->m_currentSpells[CURRENT_CHANNELED_SPELL]->finish(); } return; } case GAMEOBJECT_TYPE_SUMMONING_RITUAL: //18 { if(user->GetTypeId()!=TYPEID_PLAYER) return; Player* player = (Player*)user; Unit* caster = GetOwner(); GameObjectInfo const* info = GetGOInfo(); if( !caster || caster->GetTypeId()!=TYPEID_PLAYER ) return; // accept only use by player from same group for caster except caster itself if(((Player*)caster)==player || !((Player*)caster)->IsInSameRaidWith(player)) return; AddUniqueUse(player); // full amount unique participants including original summoner if(GetUniqueUseCount() < info->summoningRitual.reqParticipants) return; // in case summoning ritual caster is GO creator spellCaster = caster; if(!caster->m_currentSpells[CURRENT_CHANNELED_SPELL]) return; spellId = info->summoningRitual.spellId; // finish spell caster->m_currentSpells[CURRENT_CHANNELED_SPELL]->SendChannelUpdate(0); caster->m_currentSpells[CURRENT_CHANNELED_SPELL]->finish(); // can be deleted now SetLootState(GO_JUST_DEACTIVATED); // go to end function to spell casting break; } case GAMEOBJECT_TYPE_SPELLCASTER: //22 { SetUInt32Value(GAMEOBJECT_FLAGS,2); GameObjectInfo const* info = GetGOInfo(); if(!info) return; if(info->spellcaster.partyOnly) { Unit* caster = GetOwner(); if( !caster || caster->GetTypeId()!=TYPEID_PLAYER ) return; if(user->GetTypeId()!=TYPEID_PLAYER || !((Player*)user)->IsInSameRaidWith((Player*)caster)) return; } spellId = info->spellcaster.spellId; AddUse(); break; } case GAMEOBJECT_TYPE_MEETINGSTONE: //23 { GameObjectInfo const* info = GetGOInfo(); if(user->GetTypeId()!=TYPEID_PLAYER) return; Player* player = (Player*)user; Player* targetPlayer = ObjectAccessor::FindPlayer(player->GetSelection()); // accept only use by player from same group for caster except caster itself if(!targetPlayer || targetPlayer == player || !targetPlayer->IsInSameGroupWith(player)) return; //required lvl checks! uint8 level = player->getLevel(); if (level < info->meetingstone.minLevel || level > info->meetingstone.maxLevel) return; level = targetPlayer->getLevel(); if (level < info->meetingstone.minLevel || level > info->meetingstone.maxLevel) return; spellId = 23598; break; } case GAMEOBJECT_TYPE_FLAGSTAND: // 24 { if(user->GetTypeId()!=TYPEID_PLAYER) return; Player* player = (Player*)user; if( player->isAllowUseBattleGroundObject() ) { // in battleground check BattleGround *bg = player->GetBattleGround(); if(!bg) return; // BG flag click // AB: // 15001 // 15002 // 15003 // 15004 // 15005 bg->EventPlayerClickedOnFlag(player, this); return; //we don;t need to delete flag ... it is despawned! } break; } case GAMEOBJECT_TYPE_FLAGDROP: // 26 { if(user->GetTypeId()!=TYPEID_PLAYER) return; Player* player = (Player*)user; if( player->isAllowUseBattleGroundObject() ) { // in battleground check BattleGround *bg = player->GetBattleGround(); if(!bg) return; // BG flag dropped // WS: // 179785 - Silverwing Flag // 179786 - Warsong Flag // EotS: // 184142 - Netherstorm Flag GameObjectInfo const* info = GetGOInfo(); if(info) { switch(info->id) { case 179785: // Silverwing Flag // check if it's correct bg if(bg->GetTypeID() == BATTLEGROUND_WS) bg->EventPlayerClickedOnFlag(player, this); break; case 179786: // Warsong Flag if(bg->GetTypeID() == BATTLEGROUND_WS) bg->EventPlayerClickedOnFlag(player, this); break; case 184142: // Netherstorm Flag if(bg->GetTypeID() == BATTLEGROUND_EY) bg->EventPlayerClickedOnFlag(player, this); break; } } //this cause to call return, all flags must be deleted here!! spellId = 0; Delete(); } break; } case GAMEOBJECT_TYPE_BARBER_CHAIR: //32 { GameObjectInfo const* info = GetGOInfo(); if(!info) return; if(user->GetTypeId()!=TYPEID_PLAYER) return; Player* player = (Player*)user; // fallback, will always work player->TeleportTo(GetMapId(), GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation(),TELE_TO_NOT_LEAVE_TRANSPORT | TELE_TO_NOT_LEAVE_COMBAT | TELE_TO_NOT_UNSUMMON_PET); WorldPacket data(SMSG_ENABLE_BARBER_SHOP, 0); player->GetSession()->SendPacket(&data); player->SetStandState(PLAYER_STATE_SIT_LOW_CHAIR+info->barberChair.chairheight); return; } default: sLog.outDebug("Unknown Object Type %u", GetGoType()); break; } if(!spellId) return; SpellEntry const *spellInfo = sSpellStore.LookupEntry( spellId ); if(!spellInfo) { sLog.outError("WORLD: unknown spell id %u at use action for gameobject (Entry: %u GoType: %u )", spellId,GetEntry(),GetGoType()); return; } Spell *spell = new Spell(spellCaster, spellInfo, false); // spell target is user of GO SpellCastTargets targets; targets.setUnitTarget( user ); spell->prepare(&targets); }
void BattleGroundDS::Update(uint32 diff) { BattleGround::Update(diff); if (GetStatus() == STATUS_IN_PROGRESS) { // push people from the tubes if (pushbackCheck) { // knockback if (m_uiKnockback < diff) { for (BattleGroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) { Player *plr = sObjectMgr.GetPlayer(itr->first); if (!plr) continue; if (GameObject* obj = plr->GetGameObject(48018)) // Remove Demonic Circle obj->Delete(); if (plr->GetPositionZ() < 11.0f) continue; float angle = (plr->GetBGTeam() == ALLIANCE /*gold*/) ? plr->GetAngle(1259.58f, 764.43f) : plr->GetAngle(1325.84f, 817.304f); plr->KnockBackPlayerWithAngle(angle, 45, 7); if (plr->IsWithinDist2d(1214, 765, 50) && plr->IsWithinLOS(1214, 765, 14)) plr->KnockBackPlayerWithAngle(6.40f,55,7); if (plr->IsWithinDist2d(1369, 817, 50) && plr->IsWithinLOS(1369, 817, 14)) plr->KnockBackPlayerWithAngle(3.03f,55,7); } pushbackCheck = false; m_uiKnockback = 1000; } else m_uiKnockback -= diff; } // in case pushback failed if (teleportCheck) { if (m_uiTeleport < diff) { for (BattleGroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) { if (Player *plr = sObjectMgr.GetPlayer(itr->first)) { if (plr->GetPositionZ() < 11.0f) continue; float x, y; if (plr->GetBGTeam() == ALLIANCE) { x = 1259.58f; y = 764.43f; } else { x = 1325.84f; y = 817.304f; } plr->TeleportTo(GetMapId(), x + urand(0,2), y + urand(0,2), 3.15f, plr->GetOrientation()); } } teleportCheck = false; // close the gate OpenDoorEvent(BG_EVENT_DOOR); } else m_uiTeleport -= diff; } // Waterfall if (m_uiWaterfall < diff) { if (waterfallActivated) { SpawnEvent(WATERFALL_EVENT, 0, false); waterfallActivated = false; } else { SpawnEvent(WATERFALL_EVENT, 0, true); waterfallActivated = true; for (BattleGroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) { Player * plr = sObjectMgr.GetPlayer(itr->first); if (plr && plr->GetDistance2d(1291, 790) <= 6) plr->KnockBackFrom(plr, -20.0f, 9.0f); } } m_uiWaterfall = urand(30,45)*IN_MILLISECONDS; } else m_uiWaterfall -= diff; } }
void UpdateAI(const uint32 diff) { if (!UpdateVictim()) return; events.Update(diff); if (me->HasAura(SPELL_MAGNETIC_FIELD)) { if (magnetic_timer <= diff) { //Grip the players Map::PlayerList const& PlayerList = me->GetMap()->GetPlayers(); if (!PlayerList.isEmpty()) { for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) { Player* plr = i->getSource(); if( !plr) continue; if (plr->GetDistance2d(me) <= 5.f) plr->GetMotionMaster()->MoveJump(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 25.0f, 10.f); } } magnetic_timer = 1000; } else magnetic_timer -= diff; } if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_OUTRO_02: if (me->GetInstanceScript()) me->GetInstanceScript()->SetData(TYPE_OUTRO_04, 0); break; case EVENT_OUTRO_01: if (me->GetInstanceScript()) me->GetInstanceScript()->SetData(TYPE_OUTRO_02, 0); break; case EVENT_LIGHTNING_BOLT: if (!me->HasAura(SPELL_MAGNETIC_FIELD)) me->CastSpell(me->getVictim(), SPELL_LIGHTNING_BOLT, false); events.ScheduleEvent(EVENT_LIGHTNING_BOLT, 6000); break; case EVENT_WHIRLING_DERVISH: if (!me->HasAura(SPELL_MAGNETIC_FIELD)) me->CastSpell(me, SPELL_WHIRLING_DERVISH, false); events.ScheduleEvent(EVENT_WHIRLING_DERVISH, 10000); break; case EVENT_MAGNETIC_FIELD: { me->CastSpell(me, SPELL_MAGNETIC_FIELD, false); events.ScheduleEvent(EVENT_MAGNETIC_FIELD, 30000); } break; case EVENT_BOSS_RETIRE: if (me->GetInstanceScript()) me->GetInstanceScript()->SetData(TYPE_KUAI_ATTACK, 0); break; } } 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 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 WorldSession::HandleLootMoneyOpcode(WorldPacket & /*recv_data*/) { sLog.outDebug("WORLD: CMSG_LOOT_MONEY"); Player *player = GetPlayer(); uint64 guid = player->GetLootGUID(); if (!guid) return; Loot *pLoot = NULL; switch (GUID_HIPART(guid)) { case HIGHGUID_GAMEOBJECT: { GameObject *pGameObject = GetPlayer()->GetMap()->GetGameObject(guid); // not check distance for GO in case owned GO (fishing bobber case, for example) if (pGameObject && (pGameObject->GetOwnerGUID()==_player->GetGUID() || pGameObject->IsWithinDistInMap(_player,INTERACTION_DISTANCE))) pLoot = &pGameObject->loot; break; } case HIGHGUID_CORPSE: // remove insignia ONLY in BG { Corpse *bones = ObjectAccessor::GetCorpse(*GetPlayer(), guid); if (bones && bones->IsWithinDistInMap(_player,INTERACTION_DISTANCE)) pLoot = &bones->loot; break; } case HIGHGUID_ITEM: { if (Item *item = GetPlayer()->GetItemByGuid(guid)) pLoot = &item->loot; break; } case HIGHGUID_UNIT: { Creature* pCreature = GetPlayer()->GetMap()->GetCreature(guid); bool ok_loot = pCreature && pCreature->isAlive() == (player->getClass()==CLASS_ROGUE && pCreature->lootForPickPocketed); if (ok_loot && pCreature->IsWithinDistInMap(_player,INTERACTION_DISTANCE)) pLoot = &pCreature->loot ; break; } default: return; // unlootable type } if (pLoot) { if (!IS_ITEM_GUID(guid) && player->GetGroup()) //item can be looted only single player { Group *group = player->GetGroup(); std::vector<Player*> playersNear; for (GroupReference *itr = group->GetFirstMember(); itr != NULL; itr = itr->next()) { Player* playerGroup = itr->getSource(); if (!playerGroup) continue; if (player->GetDistance2d(playerGroup) < sWorld.getConfig(CONFIG_GROUP_XP_DISTANCE)) playersNear.push_back(playerGroup); } uint32 money_per_player = uint32((pLoot->gold)/(playersNear.size())); for (std::vector<Player*>::iterator i = playersNear.begin(); i != playersNear.end(); ++i) { (*i)->ModifyMoney(money_per_player); //Offset surely incorrect, but works WorldPacket data(SMSG_LOOT_MONEY_NOTIFY, 4); data << uint32(money_per_player); (*i)->SendPacketToSelf(&data); } } else { uint32 gold = pLoot->gold; player->ModifyMoney(gold); } pLoot->gold = 0; pLoot->NotifyMoneyRemoved(); } }
void UpdateAI(uint32 diff) { if (wipe_timer <= diff) { if (me->GetInstanceScript() && me->GetInstanceScript()->GetData(TYPE_IS_WIPE)) { me->GetInstanceScript()->SetData(TYPE_IS_WIPE, 1); wipe_timer = 2000; } } else wipe_timer -= diff; if (!UpdateVictim()) return; events.Update(diff); if (me->GetHealthPct() < 70.f && status == PHASE_1) { me->AddAura(SPELL_JADE_ESSENCE, me); events.Reset(); events.ScheduleEvent(EVENT_JADE_SERPENT_STRIKE, 5000); events.ScheduleEvent(EVENT_JADE_SERPENT_KICK, 10000); Talk(TALK_EVENT_01); status = PHASE_2; } if (me->GetHealthPct() < 30.f && status == PHASE_2) { events.Reset(); events.ScheduleEvent(EVENT_SUMMON_YULON, 500); Talk(TALK_EVENT_02); status = PHASE_3; } while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_SERPENT_STRIKE: { me->CastSpell(me->GetVictim(), SPELL_SERPENT_STRIKE, false); Map::PlayerList const& PlayerList = me->GetInstanceScript()->instance->GetPlayers(); if (!PlayerList.isEmpty()) { for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) { Player* plr = i->GetSource(); if (!plr) continue; if (plr->GetDistance2d(me) < 10.f) plr->KnockbackFrom(me->GetPositionX(), me->GetPositionY(), 10, 10); } } events.ScheduleEvent(EVENT_SERPENT_STRIKE, 10000); events.ScheduleEvent(EVENT_SERPENT_WAVE, 4000); } break; case EVENT_SERPENT_KICK: me->CastSpell(me->GetVictim(), SPELL_SERPENT_KICK, false); events.ScheduleEvent(EVENT_SERPENT_KICK, 10000); break; case EVENT_SERPENT_WAVE: { TempSummon* sum = nullptr; sum = me->SummonCreature(CREATURE_TRIGGER_WAVE, 932.775f, -2548.743f, 179.821f, 1.254f); if (sum) { sum->SetDisplayId(11686); sum->CastSpell(sum, SPELL_SERPENT_WAVE_VISUAL, false); sum->CastSpell(sum, SPELL_SERPENT_WAVE_PERIODIC, false); sum->GetMotionMaster()->MovePoint(0, 939.796f, -2530.586f, 179.941f); sum->DespawnOrUnsummon(3200); } sum = me->SummonCreature(CREATURE_TRIGGER_WAVE, 940.014f, -2564.114f, 179.821f, 5.978f); if (sum) { sum->SetDisplayId(11686); sum->CastSpell(sum, SPELL_SERPENT_WAVE_VISUAL, false); sum->CastSpell(sum, SPELL_SERPENT_WAVE_PERIODIC, false); sum->GetMotionMaster()->MovePoint(0, 957.711f, -2570.030f, 179.941f); sum->DespawnOrUnsummon(3200); } sum = me->SummonCreature(CREATURE_TRIGGER_WAVE, 925.971f, -2572.423f, 179.821f, 4.395f); if (sum) { sum->SetDisplayId(11686); sum->CastSpell(sum, SPELL_SERPENT_WAVE_VISUAL, false); sum->CastSpell(sum, SPELL_SERPENT_WAVE_PERIODIC, false); sum->GetMotionMaster()->MovePoint(0, 919.606f, -2591.245f, 179.941f); sum->DespawnOrUnsummon(3200); } sum = me->SummonCreature(CREATURE_TRIGGER_WAVE, 918.923f, -2557.356f, 179.821f, 2.821f); if (sum) { sum->SetDisplayId(11686); sum->CastSpell(sum, SPELL_SERPENT_WAVE_VISUAL, false); sum->CastSpell(sum, SPELL_SERPENT_WAVE_PERIODIC, false); sum->GetMotionMaster()->MovePoint(0, 901.839f, -2551.843f, 179.941f); sum->DespawnOrUnsummon(3200); } } break; case EVENT_JADE_SERPENT_STRIKE: { me->CastSpell(me->GetVictim(), SPELL_JADE_SERPENT_STRIKE, false); Map::PlayerList const& PlayerList = me->GetInstanceScript()->instance->GetPlayers(); if (!PlayerList.isEmpty()) { for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) { Player* plr = i->GetSource(); if (!plr) continue; if (plr->GetDistance2d(me) < 10.f) plr->KnockbackFrom(me->GetPositionX(), me->GetPositionY(), 10, 10); } } events.ScheduleEvent(EVENT_JADE_SERPENT_STRIKE, 10000); events.ScheduleEvent(EVENT_JADE_SERPENT_WAVE, 4000); } break; case EVENT_JADE_SERPENT_KICK: me->CastSpell(me->GetVictim(), SPELL_JADE_SERPENT_KICK, false); events.ScheduleEvent(EVENT_JADE_SERPENT_KICK, 10000); break; case EVENT_JADE_SERPENT_WAVE: { TempSummon* sum = nullptr; sum = me->SummonCreature(CREATURE_TRIGGER_WAVE, 932.775f, -2548.743f, 179.821f, 1.254f); if (sum) { sum->SetDisplayId(11686); sum->CastSpell(sum, SPELL_JADE_SERPENT_WAVE_VISUAL, false); sum->CastSpell(sum, SPELL_SERPENT_WAVE_PERIODIC, false); sum->GetMotionMaster()->MovePoint(0, 939.796f, -2530.586f, 179.941f); sum->DespawnOrUnsummon(3200); } sum = me->SummonCreature(CREATURE_TRIGGER_WAVE, 940.014f, -2564.114f, 179.821f, 5.978f); if (sum) { sum->SetDisplayId(11686); sum->CastSpell(sum, SPELL_JADE_SERPENT_WAVE_VISUAL, false); sum->CastSpell(sum, SPELL_SERPENT_WAVE_PERIODIC, false); sum->GetMotionMaster()->MovePoint(0, 957.711f, -2570.030f, 179.941f); sum->DespawnOrUnsummon(3200); } sum = me->SummonCreature(CREATURE_TRIGGER_WAVE, 925.971f, -2572.423f, 179.821f, 4.395f); if (sum) { sum->SetDisplayId(11686); sum->CastSpell(sum, SPELL_JADE_SERPENT_WAVE_VISUAL, false); sum->CastSpell(sum, SPELL_SERPENT_WAVE_PERIODIC, false); sum->GetMotionMaster()->MovePoint(0, 919.606f, -2591.245f, 179.941f); sum->DespawnOrUnsummon(3200); } sum = me->SummonCreature(CREATURE_TRIGGER_WAVE, 918.923f, -2557.356f, 179.821f, 2.821f); if (sum) { sum->SetDisplayId(11686); sum->CastSpell(sum, SPELL_JADE_SERPENT_WAVE_VISUAL, false); sum->CastSpell(sum, SPELL_SERPENT_WAVE_PERIODIC, false); sum->GetMotionMaster()->MovePoint(0, 901.839f, -2551.843f, 179.941f); sum->DespawnOrUnsummon(3200); } } break; case EVENT_SUMMON_YULON: me->CastSpell(me, SPELL_SUMMON_JADE_SERPENT, false); me->CastSpell(me, SPELL_JADE_SOUL, false); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->ApplySpellImmune(SPELL_JADE_SOUL, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, true); me->ApplySpellImmune(SPELL_JADE_SOUL, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_MAGIC, true); me->SetReactState(REACT_PASSIVE); me->AddUnitState(UNIT_STATE_ROOT); events.ScheduleEvent(EVENT_AURA_JADE, 3000); break; case EVENT_AURA_JADE: me->CastSpell(me, SPELL_JADE_SOUL, false); events.ScheduleEvent(EVENT_AURA_JADE, 2500); break; } } DoMeleeAttackIfReady(); }
void BattleGroundDS::Update(uint32 diff) { BattleGround::Update(diff); if (GetStatus() == STATUS_IN_PROGRESS) { // despawn doors just for make a sure players don't get stuck behind it if(!DoorsDespawned) { DespawnEvent(DOORS_EVENT, 0); DoorsDespawned = true; } // knocking out of tube if(KnockbackCheck) { if(m_uiKnockback < diff || KnockbackSpam) { for(BattleGroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) { Player * plr = sObjectMgr.GetPlayer(itr->first); if (plr->GetTeam() == ALLIANCE && plr->GetDistance2d(1214, 765) <= 50 && plr->GetPositionZ() > 10) plr->KnockBackPlayerWithAngle(6.05f, 35.0f, 7.0f); if (plr->GetTeam() == HORDE && plr->GetDistance2d(1369, 817) <= 50 && plr->GetPositionZ() > 10) plr->KnockBackPlayerWithAngle(3.03f, 35.0f, 7.0f); } if(!KnockbackSpam) { m_uiKnockSpam = 5000; KnockbackSpam = true; // Remove Demonic Circle for(BattleGroundPlayerMap::const_iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr) if (Player *plr = sObjectMgr.GetPlayer(itr->first)) if(GameObject* obj = plr->GetGameObject(48018)) obj->Delete(); } } else m_uiKnockback -= diff; if(KnockbackSpam) { if(m_uiKnockSpam < diff) KnockbackCheck = false; else m_uiKnockSpam -= diff; } } // Waterfall if(m_uiWaterfall < diff) { if(WaterfallActivated) { DespawnEvent(WATERFALL_EVENT, 0); WaterfallActivated = false; } else { SpawnEvent(WATERFALL_EVENT, 0, true); WaterfallActivated = true; } m_uiWaterfall = urand(30,45)*IN_MILLISECONDS; } else m_uiWaterfall -= diff; } }
void WorldSession::HandleInitiateTradeOpcode(WorldPacket& recvPacket) { uint64 ID; recvPacket >> ID; if (GetPlayer()->pTrader) return; if (!GetPlayer()->isAlive()) { SendTradeStatus(TRADE_STATUS_YOU_DEAD); return; } if (GetPlayer()->hasUnitState(UNIT_STAT_STUNNED)) { SendTradeStatus(TRADE_STATUS_YOU_STUNNED); return; } if (isLogingOut()) { SendTradeStatus(TRADE_STATUS_YOU_LOGOUT); return; } if (GetPlayer()->isInFlight()) { SendTradeStatus(TRADE_STATUS_TARGET_TO_FAR); return; } Player* pOther = ObjectAccessor::FindPlayer(ID); if (!pOther) { SendTradeStatus(TRADE_STATUS_NO_TARGET); return; } if (pOther == GetPlayer() || pOther->pTrader) { SendTradeStatus(TRADE_STATUS_BUSY); return; } if (!pOther->isAlive()) { SendTradeStatus(TRADE_STATUS_TARGET_DEAD); return; } if (pOther->isInFlight()) { SendTradeStatus(TRADE_STATUS_TARGET_TO_FAR); return; } if (pOther->hasUnitState(UNIT_STAT_STUNNED)) { SendTradeStatus(TRADE_STATUS_TARGET_STUNNED); return; } if (pOther->GetSession()->isLogingOut()) { SendTradeStatus(TRADE_STATUS_TARGET_LOGOUT); return; } if (pOther->GetSocial()->HasIgnore(GetPlayer()->GetGUIDLow())) { SendTradeStatus(TRADE_STATUS_IGNORE_YOU); return; } if (!sWorld.getConfig(CONFIG_ALLOW_TWO_SIDE_TRADE) && pOther->GetTeam() != _player->GetTeam()) { SendTradeStatus(TRADE_STATUS_WRONG_FACTION); return; } if (pOther->GetDistance2d(_player) > 10.0f) { SendTradeStatus(TRADE_STATUS_TARGET_TO_FAR); return; } // OK start trade _player->pTrader = pOther; pOther->pTrader =_player; WorldPacket data(SMSG_TRADE_STATUS, 12); data << (uint32) TRADE_STATUS_BEGIN_TRADE; data << (uint64)_player->GetGUID(); _player->pTrader->GetSession()->SendPacket(&data); }