/* * Ascent MMORPG Server * Copyright (C) 2005-2007 Ascent Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ #include "StdAfx.h" static float EOTSBuffCoordinates[4][4] = { { 2050.542236f, 1372.680176f, 1194.561279f, 1.67552f }, // 184964 -- Speed Buff { 2047.728271f, 1749.736084f, 1190.198608f, -0.872665f }, // 184971 -- Restoration Buff { 2283.300049f, 1748.891235f, 1189.706787f, 1.76278f }, // 184978 -- Berserk Buff { 2050.542236f, 1372.680176f, 1194.561279f, -1.50098f }, // 184973 -- Speed Buff }; static float EOTSBuffRotations[4][2] = { { 0.681998f, -0.731354f }, { 0.771625f, 0.636078f }, { 0.422618f, -0.906308f }, { 0.743145f, 0.669131f }, }; uint32 EOTSbuffentrys[4] = {184964,184971,184978,184973}; const float EOTSGraveyardLocations[EOTS_TOWER_COUNT][3] = { { 2012.403442f, 1455.412354f, 1172.201782f }, // BE Tower { 2013.061890f, 1677.238037f, 1182.125732f }, // Fel Reaver Ruins { 2355.297852f, 1683.713989f, 1173.153687f }, // Mage Tower { 2351.785400f, 1455.399048f, 1185.333374f }, // Draenei Ruins }; const float EOTSCPLocations[EOTS_TOWER_COUNT][3] = { { 2048.290039f, 1393.757690f, 1194.363525f }, // BE Tower { 2043.571533f, 1729.117310f, 1189.911865f }, // Fel Reaver Ruins { 2284.430664f, 1731.128488f, 1189.874512f }, // Mage Tower { 2285.848877f, 1402.939575f, 1197.128540f }, // Draenei Ruins }; const float EOTSFlagLocation[3] = { 2174.718750f, 1568.766113f, 1159.958740f }; const float EOTSStartLocations[2][3] = { { 2523.686035f, 1596.597290f, 1269.347656f }, { 1807.735962f, 1539.415649f, 1267.627319f }, }; const float EOTSBubbleLocations[2][4] = { { 2527.596924f, 1596.906494f, 1262.128052f, -3.124139f }, { 0.0f, 0.0f, 0.0f, 0.0f }, }; const float EOTSBubbleRotations[2][4] = { { -0.173642f, -0.001515f, 0.984770f, -0.008594f }, { -0.173642f, -0.001515f, 0.984770f, -0.008594f }, }; //=================================================== // 184083 - Draenei Tower Cap Pt, 184082 - Human Tower Cap Pt, 184081 - Fel Reaver Cap Pt, 184080 - BE Tower Cap Pt #define EOTS_GO_BE_TOWER 184080 #define EOTS_GO_FELREAVER 184081 #define EOTS_GO_MAGE_TOWER 184082 #define EOTS_GO_DRAENEI_TOWER 184083 #define EOTS_TOWER_BE 0 #define EOTS_TOWER_FELREAVER 1 #define EOTS_TOWER_MAGE 2 #define EOTS_TOWER_DRAENEI 3 #define EOTS_BANNER_NEUTRAL 184382 #define EOTS_BANNER_ALLIANCE 184381 #define EOTS_BANNER_HORDE 184380 #define EOTS_CAPTURE_DISTANCE 900 /*30*/ const uint32 EOTSTowerIds[EOTS_TOWER_COUNT] = { EOTS_GO_BE_TOWER, EOTS_GO_FELREAVER, EOTS_GO_MAGE_TOWER, EOTS_GO_DRAENEI_TOWER }; /** * WorldStates */ #define EOTS_WORLDSTATE_DISPLAYON 2718 #define EOTS_WORLDSTATE_DISPLAYVALUE 2719 #define EOTS_WORLDSTATE_ALLIANCE_VICTORYPOINTS 2749 #define EOTS_WORLDSTATE_HORDE_VICTORYPOINTS 2750 #define EOTS_WORLDSTATE_ALLIANCE_BASES 2752 #define EOTS_WORLDSTATE_HORDE_BASES 2753 #define EOTS_NETHERWING_FLAG_SPELL 34976 #define EOTS_CAPTURE_RATE 20 EyeOfTheStorm::EyeOfTheStorm(MapMgr * mgr, uint32 id, uint32 lgroup, uint32 t) : CBattleground(mgr,id,lgroup,t) { uint32 i; for(i = 0; i < EOTS_TOWER_COUNT; ++i) { EOTSm_buffs[i] = NULL; m_CPStatus[i] = 50; m_CPBanner[i] = NULL; m_CPStatusGO[i] = NULL; m_spiritGuides[i] = NULL; } m_flagHolder = 0; m_points[0] = m_points[1] = 0; } EyeOfTheStorm::~EyeOfTheStorm() { for(uint32 i = 0; i < EOTS_TOWER_COUNT; ++i) { if(EOTSm_buffs[i] != NULL) { EOTSm_buffs[i]->m_battleground = NULL; if( !EOTSm_buffs[i]->IsInWorld() ) delete EOTSm_buffs[i]; } } } void EyeOfTheStorm::RepopPlayersOfTeam(int32 team, Creature * sh) { map >::iterator itr = m_resurrectMap.find(sh); if( itr != m_resurrectMap.end() ) { for( set::iterator it2 = itr->second.begin(); it2 != itr->second.end(); ++it2 ) { Player* r_plr = m_mapMgr->GetPlayer( *it2 ); if( r_plr != NULL && (team < 0 || (int32)r_plr->GetTeam() == team) && r_plr->isDead() ) HookHandleRepop( r_plr ); } } } bool EyeOfTheStorm::HookHandleRepop(Player * plr) { uint32 i; int32 sval; uint32 t = plr->GetTeam(); float dist = 999999.0f; float distcur; LocationVector dest; if(plr->GetTeam() == 0) sval = 100; else sval = 0; dest.ChangeCoords( EOTSStartLocations[t][0], EOTSStartLocations[t][1], EOTSStartLocations[t][2], 0 ); for(i = 0; i < EOTS_TOWER_COUNT; ++i) { if( m_CPStatus[i] == sval ) { distcur = plr->GetPositionNC().Distance2DSq( EOTSGraveyardLocations[i][0], EOTSGraveyardLocations[i][1] ); if( distcur < dist ) { dist = distcur; dest.ChangeCoords( EOTSGraveyardLocations[i][0], EOTSGraveyardLocations[i][1], EOTSGraveyardLocations[i][2], 0 ); } } } plr->SafeTeleport(plr->GetMapId(), plr->GetInstanceID(), dest); return true; } void EyeOfTheStorm::HookOnAreaTrigger(Player * plr, uint32 id) { int32 tid = -1; switch(id) { case 4476: // BE Tower tid = EOTS_TOWER_BE; break; case 4514: // Fel Reaver Tower tid = EOTS_TOWER_FELREAVER; break; case 4518: // Draenei Tower tid = EOTS_TOWER_DRAENEI; break; case 4516: // Mage Tower tid = EOTS_TOWER_MAGE; break; } if( tid < 0 ) return; uint32 spellid=0; uint32 x = (uint32)tid; //printf("x:%u\n",x); if(EOTSm_buffs[x] && EOTSm_buffs[x]->IsInWorld()) { //printf("Buff HOOK! X: %u, x name: \n",x,EOTSm_buffs[x]->GetInfo()->Name); spellid = EOTSm_buffs[x]->GetInfo()->sound3; SpellEntry * sp = dbcSpell.LookupEntryForced(spellid); if(sp) { //printf("Apply spellID: %u, name: %s\n",spellid,sp->Name); Spell * pSpell = new Spell(plr, sp, true, NULL); SpellCastTargets targets(plr->GetGUID()); pSpell->prepare(&targets); } EOTSm_buffs[x]->Despawn(EOTS_BUFF_RESPAWN_TIME); } uint32 team = plr->GetTeam(); if( plr->GetGUIDLow() != m_flagHolder ) return; int32 val; uint32 i; uint32 towers = 0; if( team == 0 ) val = 100; else val = 0; if( m_CPStatus[tid] != val ) return; // not captured by our team for(i = 0; i < EOTS_TOWER_COUNT; ++i) { if(m_CPStatus[i] == val) towers++; } /* Points from flag captures * 1 towers controlled = 75 points * 2 towers controlled = 85 points * 3 towers controlled = 100 points * 4 towers controlled = 500 points */ // 25 is guessed const static uint32 points[5] = { 25, 75, 85, 100, 500 }; const char * msgs[2] = { "The Alliance have captured the flag.", "The Horde have captured the flag." }; SendChatMessage( 0x54, 0, msgs[team] ); GivePoints( team, points[towers] ); m_standFlag->PushToWorld( m_mapMgr ); m_flagHolder = 0; SetWorldState( 2757, 1 ); plr->RemoveAura( EOTS_NETHERWING_FLAG_SPELL ); } void EyeOfTheStorm::HookOnPlayerDeath(Player * plr) { plr->m_bgScore.Deaths++; UpdatePvPData(); } void EyeOfTheStorm::HookFlagDrop(Player * plr, GameObject * obj) { if( !m_dropFlag->IsInWorld() ) return; m_dropFlag->RemoveFromWorld(false); plr->CastSpell( plr->GetGUID(), EOTS_NETHERWING_FLAG_SPELL, true ); SetWorldState( 2757, 0 ); PlaySoundToAll( 8212 ); SendChatMessage( 0x53, plr->GetGUID(), "$n has taken the flag!" ); m_flagHolder = plr->GetGUIDLow(); event_RemoveEvents( EVENT_EOTS_RESET_FLAG ); } void EyeOfTheStorm::HookFlagStand(Player * plr, GameObject * obj) { } bool EyeOfTheStorm::HookSlowLockOpen(GameObject * pGo, Player * pPlayer, Spell * pSpell) { if( m_flagHolder != 0 ) return false; m_standFlag->RemoveFromWorld(false); pPlayer->CastSpell( pPlayer->GetGUID(), EOTS_NETHERWING_FLAG_SPELL, true ); SetWorldState( 2757, 0 ); PlaySoundToAll( 8212 ); SendChatMessage( 0x53, pPlayer->GetGUID(), "$n has taken the flag!" ); m_flagHolder = pPlayer->GetGUIDLow(); return true; } void EyeOfTheStorm::HookOnMount(Player * plr) { if( m_flagHolder == plr->GetGUIDLow() ) { plr->RemoveAura( EOTS_NETHERWING_FLAG_SPELL ); //DropFlag( plr ); } } void EyeOfTheStorm::OnAddPlayer(Player * plr) { if(!m_started) plr->CastSpell(plr, BG_PREPARATION, true); } void EyeOfTheStorm::OnRemovePlayer(Player * plr) { uint32 i; for( i = 0; i < EOTS_TOWER_COUNT; ++i ) { m_CPDisplay[i].erase( plr ); } if( m_flagHolder == plr->GetGUIDLow() ) { plr->RemoveAura( EOTS_NETHERWING_FLAG_SPELL ); //DropFlag( plr ); } plr->RemoveAura(BG_PREPARATION); } void EyeOfTheStorm::DropFlag(Player * plr) { if( m_flagHolder != plr->GetGUIDLow() ) return; m_dropFlag->SetPosition( plr->GetPosition() ); m_dropFlag->PushToWorld( m_mapMgr ); m_flagHolder = 0; sEventMgr.AddEvent( this, &EyeOfTheStorm::EventResetFlag, EVENT_EOTS_RESET_FLAG, 60000, 1, EVENT_FLAG_DO_NOT_EXECUTE_IN_WORLD_CONTEXT ); } void EyeOfTheStorm::EventResetFlag() { if(!m_dropFlag->IsInWorld()) return; m_dropFlag->RemoveFromWorld(false); m_standFlag->PushToWorld(m_mapMgr); SetWorldState( 2757, 1 ); PlaySoundToAll( 8192 ); SendChatMessage( 0x52, 0, "The flag has been reset." ); m_flagHolder = 0; } void EyeOfTheStorm::OnCreate() { GameObjectInfo* goi; uint32 i; /* eww worldstates */ SetWorldState(2565, 142); SetWorldState(2720, 0); SetWorldState(2719, 0); SetWorldState(2718, 0); SetWorldState(2260, 0); SetWorldState(2264, 0); SetWorldState(2263, 0); SetWorldState(2262, 0); SetWorldState(2261, 0); SetWorldState(2259, 0); SetWorldState(2742, 0); SetWorldState(2741, 0); SetWorldState(2740, 0); SetWorldState(2739, 0); SetWorldState(2738, 0); SetWorldState(2737, 0); SetWorldState(2736, 0); SetWorldState(2735, 0); SetWorldState(2733, 0); SetWorldState(2732, 0); SetWorldState(2731, 1); SetWorldState(2730, 0); SetWorldState(2729, 0); SetWorldState(2728, 1); SetWorldState(2727, 0); SetWorldState(2726, 0); SetWorldState(2725, 1); SetWorldState(2724, 0); SetWorldState(2723, 0); SetWorldState(2722, 1); SetWorldState(2757, 1); SetWorldState(2753, 0); SetWorldState(2752, 0); SetWorldState(2770, 1); SetWorldState(2769, 1); SetWorldState(2750, 0); SetWorldState(2749, 0); SetWorldState(3191, 2); SetWorldState(3218, 0); SetWorldState(3217, 0); SetWorldState(3085, 379); /* create gameobjects */ for(i = 0; i < EOTS_TOWER_COUNT; ++i) { goi = GameObjectNameStorage.LookupEntry( EOTSTowerIds[i] ); if( goi == NULL ) { Log.LargeErrorMessage(LARGERRORMESSAGE_ERROR, "EOTS is being created and you are missing gameobjects. Terminating."); abort(); return; } m_CPStatusGO[i] = m_mapMgr->CreateGameObject(); m_CPStatusGO[i]->CreateFromProto( goi->ID, m_mapMgr->GetMapId(), EOTSCPLocations[i][0], EOTSCPLocations[i][1], EOTSCPLocations[i][2], 0); m_CPStatusGO[i]->PushToWorld( m_mapMgr ); goi = GameObjectNameStorage.LookupEntry( EOTS_BANNER_NEUTRAL ); if( goi == NULL ) { Log.LargeErrorMessage(LARGERRORMESSAGE_ERROR, "EOTS is being created and you are missing gameobjects. Terminating."); abort(); return; } m_CPBanner[i] = m_mapMgr->CreateGameObject(); m_CPBanner[i]->CreateFromProto( goi->ID, m_mapMgr->GetMapId(), EOTSCPLocations[i][0], EOTSCPLocations[i][1], EOTSCPLocations[i][2], 0); m_CPBanner[i]->PushToWorld( m_mapMgr ); } /* BUBBLES! */ for( i = 0; i < 2; ++i ) { m_bubbles[i] = m_mapMgr->CreateGameObject(); if( !m_bubbles[i]->CreateFromProto( 184719, m_mapMgr->GetMapId(), EOTSBubbleLocations[i][0], EOTSBubbleLocations[i][1], EOTSBubbleLocations[i][2], EOTSBubbleLocations[i][3] ) ) { m_bubbles[i]->SetFloatValue(OBJECT_FIELD_SCALE_X,0.1f); m_bubbles[i]->SetUInt32Value(GAMEOBJECT_STATE,1); m_bubbles[i]->SetUInt32Value(GAMEOBJECT_FLAGS,32); Log.LargeErrorMessage(LARGERRORMESSAGE_ERROR, "EOTS is being created and you are missing gameobjects. Terminating."); abort(); return; } m_bubbles[i]->PushToWorld( m_mapMgr ); } SpawnBuff(EOTS_TOWER_DRAENEI); SpawnBuff(EOTS_TOWER_MAGE); SpawnBuff(EOTS_TOWER_FELREAVER); SpawnBuff(EOTS_TOWER_BE); /* Flag */ m_standFlag = m_mapMgr->CreateGameObject(); m_standFlag->CreateFromProto( 184141, m_mapMgr->GetMapId(), 2174.782227f, 1569.054688f, 1160.361938f, -1.448624f ); m_standFlag->SetFloatValue( GAMEOBJECT_ROTATION_02, 0.662620f ); m_standFlag->SetFloatValue( GAMEOBJECT_ROTATION_03, -0.748956f ); m_standFlag->SetFloatValue( OBJECT_FIELD_SCALE_X, 2.5f ); m_standFlag->PushToWorld( m_mapMgr ); m_dropFlag = m_mapMgr->CreateGameObject(); m_dropFlag->CreateFromProto( 184142, m_mapMgr->GetMapId(), 2174.782227f, 1569.054688f, 1160.361938f, -1.448624f ); m_dropFlag->SetFloatValue( GAMEOBJECT_ROTATION_02, 0.885448f ); m_dropFlag->SetFloatValue( GAMEOBJECT_ROTATION_03, -0.464739f ); m_dropFlag->SetFloatValue( OBJECT_FIELD_SCALE_X, 2.5f ); } void EyeOfTheStorm::RespawnCPFlag(uint32 i, uint32 id) { m_CPBanner[i]->RemoveFromWorld(false); m_CPBanner[i]->SetNewGuid( m_mapMgr->GenerateGameobjectGuid() ); m_CPBanner[i]->CreateFromProto( id, m_mapMgr->GetMapId(), m_CPBanner[i]->GetPositionX(), m_CPBanner[i]->GetPositionY(), m_CPBanner[i]->GetPositionZ(), m_CPBanner[i]->GetOrientation() ); m_CPBanner[i]->PushToWorld( m_mapMgr ); } void EyeOfTheStorm::UpdateCPs() { uint32 i; set::iterator itr, itrend; Player * plr; GameObject * go; int32 delta; uint32 playercounts[2]; uint32 towers[2] = {0,0}; EOTSCaptureDisplayList::iterator eitr, eitr2, eitrend; EOTSCaptureDisplayList * disp; for(i = 0; i < EOTS_TOWER_COUNT; ++i) { /* loop players inrange, add any that arent in the set to the set */ playercounts[0] = playercounts[1] = 0; go = m_CPStatusGO[i]; disp = &m_CPDisplay[i]; itr = go->GetInRangePlayerSetBegin(); itrend = go->GetInRangePlayerSetEnd(); for( ; itr != itrend; ++itr ) { plr = *itr; if( plr->GetDistance2dSq( go ) <= EOTS_CAPTURE_DISTANCE ) { playercounts[plr->GetTeam()]++; if( disp->find( plr ) == disp->end() ) { disp->insert( plr ); plr->SendWorldStateUpdate(EOTS_WORLDSTATE_DISPLAYON, 1); } } } /* score diff calculation */ //printf("EOTS: Playercounts = %u %u\n", playercounts[0], playercounts[1]); if(playercounts[0] != playercounts[1]) { if(playercounts[0] > playercounts[1]) delta = playercounts[0]; else if(playercounts[1] > playercounts[0]) delta = -(int32)playercounts[1]; delta *= EOTS_CAPTURE_RATE; m_CPStatus[i] += delta; if( m_CPStatus[i] > 100 ) m_CPStatus[i] = 100; else if( m_CPStatus[i] < 0 ) m_CPStatus[i] = 0; // change the flag depending on cp status if( m_CPStatus[i] == 0 ) { if( m_CPBanner[i]->GetEntry() != EOTS_BANNER_HORDE ) { RespawnCPFlag(i, EOTS_BANNER_HORDE); if( m_spiritGuides[i] != NULL ) { RepopPlayersOfTeam( 0, m_spiritGuides[i] ); m_spiritGuides[i]->Despawn( 0, 0 ); RemoveSpiritGuide( m_spiritGuides[i] ); m_spiritGuides[i] = NULL; } m_spiritGuides[i] = SpawnSpiritGuide( EOTSGraveyardLocations[i][0], EOTSGraveyardLocations[i][1], EOTSGraveyardLocations[i][2], 0, 1 ); AddSpiritGuide( m_spiritGuides[i] ); } } else if( m_CPStatus[i] == 100 ) { if( m_CPBanner[i]->GetEntry() != EOTS_BANNER_ALLIANCE ) { RespawnCPFlag(i, EOTS_BANNER_ALLIANCE); if( m_spiritGuides[i] != NULL ) { RepopPlayersOfTeam( 1, m_spiritGuides[i] ); m_spiritGuides[i]->Despawn( 0, 0 ); RemoveSpiritGuide( m_spiritGuides[i] ); m_spiritGuides[i] = NULL; } m_spiritGuides[i] = SpawnSpiritGuide( EOTSGraveyardLocations[i][0], EOTSGraveyardLocations[i][1], EOTSGraveyardLocations[i][2], 0, 0 ); AddSpiritGuide( m_spiritGuides[i] ); } } else { if( m_CPBanner[i]->GetEntry() != EOTS_BANNER_NEUTRAL ) { RespawnCPFlag(i, EOTS_BANNER_NEUTRAL); if( m_spiritGuides[i] != NULL ) { RepopPlayersOfTeam( -1, m_spiritGuides[i] ); m_spiritGuides[i]->Despawn( 0, 0 ); RemoveSpiritGuide( m_spiritGuides[i] ); m_spiritGuides[i] = NULL; } } } } /* update the players with the new value */ eitr = disp->begin(); eitrend = disp->end(); for( ; eitr != eitrend; ) { plr = *eitr; eitr2 = eitr; ++eitr; if( plr->GetDistance2dSq( go ) > EOTS_CAPTURE_DISTANCE ) { disp->erase( eitr2 ); plr->SendWorldStateUpdate(EOTS_WORLDSTATE_DISPLAYON, 0); // hide the cp bar } else plr->SendWorldStateUpdate(EOTS_WORLDSTATE_DISPLAYVALUE, m_CPStatus[i]); } } for(i = 0; i < EOTS_TOWER_COUNT; ++i) { if( m_CPStatus[i] == 100 ) towers[0]++; else if( m_CPStatus[i] == 0 ) towers[1]++; } SetWorldState( EOTS_WORLDSTATE_ALLIANCE_BASES, towers[0] ); SetWorldState( EOTS_WORLDSTATE_HORDE_BASES, towers[1] ); } void EyeOfTheStorm::GeneratePoints() { uint32 i; uint32 towers[2] = {0,0}; /* # Unlike Arathi Basin, points are always generated in 2 seconds intervals no matter how many towers are controlled by both teams. # Each claimed tower generates victory points for the controlling team. The more towers your team owns, the faster your team gains points * 1 tower controlled = 1 point/tick (0.5 points per second) * 2 towers controlled = 2 points/tick (1 point per second) * 3 towers controlled = 5 points/tick (2.5 points per second) * 4 towers controlled = 10 points/tick (5 points per second) */ uint32 pointspertick[5] = { 0, 1, 2, 5, 10 }; for(i = 0; i < EOTS_TOWER_COUNT; ++i) { if(m_CPStatus[i] == 100) towers[0]++; else if(m_CPStatus[i] == 0) towers[1]++; } for( i = 0; i < 2; ++i ) { if( towers[i] == 0 ) { //printf("EOTS: No points on team %u\n", i); continue; } if( GivePoints( i, pointspertick[towers[i]] ) ) return; } } bool EyeOfTheStorm::GivePoints(uint32 team, uint32 points) { //printf("EOTS: Give team %u %u points.\n", team, points); m_points[team] += points; if (m_points[team] > 2000) m_points[team] = 2000; SetWorldState( EOTS_WORLDSTATE_ALLIANCE_VICTORYPOINTS + team, m_points[team] ); if( m_points[team] == 2000 ) { m_ended = true; // Don't ask me about this shit... if (team == 0) m_winningteam = 1; else m_winningteam = 0; //uint8 winteam = team; m_nextPvPUpdateTime = 0; sEventMgr.RemoveEvents(this); sEventMgr.AddEvent(((CBattleground*)this), &CBattleground::Close, EVENT_BATTLEGROUND_CLOSE, 120000, 1,0); /* add the marks of honor to all players */ m_mainLock.Acquire(); for(uint32 i = 0; i < 2; ++i) { for(set::iterator itr = m_players[i].begin(); itr != m_players[i].end(); ++itr) { (*itr)->Root(); if(i == team) { ItemPrototype* it = ItemPrototypeStorage.LookupEntry(29024); if(it) { Item *item; item = objmgr.CreateItem( 29024, (*itr)); item->SetUInt32Value(ITEM_FIELD_STACK_COUNT, ((3 > it->MaxCount) ? it->MaxCount : 3)); if(it->Bonding==ITEM_BIND_ON_PICKUP) item->SoulBind(); if(!(*itr)->GetItemInterface()->AddItemToFreeSlot(item)) { delete item; return true; } SlotResult *lr = (*itr)->GetItemInterface()->LastSearchResult(); (*itr)->GetSession()->SendItemPushResult(item,false,true,false,true,lr->ContainerSlot,lr->Slot,3); } } else { ItemPrototype* it = ItemPrototypeStorage.LookupEntry(29024); if(it) { Item *item; item = objmgr.CreateItem( 29024, (*itr)); item->SetUInt32Value(ITEM_FIELD_STACK_COUNT, ((1 > it->MaxCount) ? it->MaxCount : 1)); if(it->Bonding==ITEM_BIND_ON_PICKUP) item->SoulBind(); if(!(*itr)->GetItemInterface()->AddItemToFreeSlot(item)) { delete item; return true; } SlotResult *lr = (*itr)->GetItemInterface()->LastSearchResult(); (*itr)->GetSession()->SendItemPushResult(item,false,true,false,true,lr->ContainerSlot,lr->Slot,1); } } } } m_mainLock.Release(); return true; } return false; } void EyeOfTheStorm::HookOnPlayerKill(Player * plr, Unit * pVictim) { plr->m_bgScore.KillingBlows++; UpdatePvPData(); } void EyeOfTheStorm::HookOnHK(Player * plr) { plr->m_bgScore.HonorableKills++; UpdatePvPData(); } void EyeOfTheStorm::SpawnBuff(uint32 x) { uint32 chosen_buffid = EOTSbuffentrys[RandomUInt(3)]; GameObjectInfo * goi = GameObjectNameStorage.LookupEntry(chosen_buffid); if(goi == NULL) return; if(EOTSm_buffs[x] == NULL) { EOTSm_buffs[x] = SpawnGameObject(chosen_buffid, m_mapMgr->GetMapId(), EOTSBuffCoordinates[x][0], EOTSBuffCoordinates[x][1], EOTSBuffCoordinates[x][2], EOTSBuffCoordinates[x][3], 0, 114, 1); EOTSm_buffs[x]->SetFloatValue(GAMEOBJECT_ROTATION_02, EOTSBuffRotations[x][0]); EOTSm_buffs[x]->SetFloatValue(GAMEOBJECT_ROTATION_03, EOTSBuffRotations[x][1]); EOTSm_buffs[x]->SetUInt32Value(GAMEOBJECT_STATE, 1); EOTSm_buffs[x]->SetUInt32Value(GAMEOBJECT_TYPE_ID, 6); EOTSm_buffs[x]->SetUInt32Value(GAMEOBJECT_ANIMPROGRESS, 100); EOTSm_buffs[x]->PushToWorld(m_mapMgr); } else { if(EOTSm_buffs[x]->IsInWorld()) EOTSm_buffs[x]->RemoveFromWorld(false); if(chosen_buffid != EOTSm_buffs[x]->GetEntry()) { EOTSm_buffs[x]->SetNewGuid(m_mapMgr->GenerateGameobjectGuid()); EOTSm_buffs[x]->SetUInt32Value(OBJECT_FIELD_ENTRY, chosen_buffid); EOTSm_buffs[x]->SetInfo(goi); } EOTSm_buffs[x]->PushToWorld(m_mapMgr); } } LocationVector EyeOfTheStorm::GetStartingCoords(uint32 Team) { return LocationVector( EOTSStartLocations[Team][0], EOTSStartLocations[Team][1], EOTSStartLocations[Team][2] ); } void EyeOfTheStorm::OnStart() { for(uint32 i = 0; i < 2; ++i) { for(set::iterator itr = m_players[i].begin(); itr != m_players[i].end(); ++itr) { (*itr)->RemoveAura(BG_PREPARATION); } } uint32 i; /* start the events */ sEventMgr.AddEvent(this, &EyeOfTheStorm::GeneratePoints, EVENT_EOTS_GIVE_POINTS, 2000, 0, EVENT_FLAG_DO_NOT_EXECUTE_IN_WORLD_CONTEXT); sEventMgr.AddEvent(this, &EyeOfTheStorm::UpdateCPs, EVENT_EOTS_CHECK_CAPTURE_POINT_STATUS, 5000, 0, EVENT_FLAG_DO_NOT_EXECUTE_IN_WORLD_CONTEXT); /* spirit guides */ AddSpiritGuide(SpawnSpiritGuide( EOTSStartLocations[0][0], EOTSStartLocations[0][1], EOTSStartLocations[0][2], 0, 0 )); AddSpiritGuide(SpawnSpiritGuide( EOTSStartLocations[1][0], EOTSStartLocations[1][1], EOTSStartLocations[1][2], 0, 1 )); /* remove the bubbles */ for( i = 0; i < 2; ++i ) { m_bubbles[i]->RemoveFromWorld(false); delete m_bubbles[i]; m_bubbles[i] = NULL; } m_started = true; }