////////////////////////////////////////////////////////////////////////// // WORLD PVP NOT SUPPORTED! ////////////////////////////////////////////////////////////////////////// int LuaGlobalFunctions_SendPvPCaptureMessage(lua_State * L) { uint32 zoneid = luaL_checkint(L, 1); const char* msg = luaL_checkstring(L, 2); AreaTable * at = dbcArea.LookupEntry(zoneid); if(!zoneid || !msg || !at) return 1; MapMgr* mapmgr = sInstanceMgr.GetMapMgr(at->mapId); if (mapmgr != NULL) mapmgr->SendPvPCaptureMessage(ZONE_MASK_ALL, zoneid, msg); return 1; }
void AIUpdate() { uint32 plrcounts[2] = { 0, 0 }; // details: // loop through inrange players, for new ones, send the enable CP worldstate. // the value of the map is a timestamp of the last update, to avoid cpu time wasted // doing lookups of objects that have already been updated itr = _gameobject->GetInRangePlayerSetBegin(); itrend = _gameobject->GetInRangePlayerSetEnd(); map<uint32, uint32>::iterator it2, it3; uint32 timeptr = (uint32)UNIXTIME; bool in_range; bool is_valid; Player* plr; MapMgr* mgr = _gameobject->GetMapMgr(); for(; itr != itrend; ++itr) { plr = TO< Player* >(*itr); if(!plr->IsPvPFlagged() || !(plr->isAlive()) && !(plr->IsStealth()) && !(plr->m_invisible) && !(plr->SchoolImmunityList[0])) is_valid = false; else is_valid = true; in_range = (_gameobject->GetDistance2dSq((*itr)) <= BANNER_RANGE); it2 = StoredPlayers.find((*itr)->GetLowGUID()); if(it2 == StoredPlayers.end()) { // new player :) if(in_range) { plr->SendWorldStateUpdate(WORLDSTATE_TEROKKAR_PVP_CAPTURE_BAR_DISPLAY, 1); plr->SendWorldStateUpdate(WORLDSTATE_TEROKKAR_PVP_CAPTURE_BAR_VALUE, Status); StoredPlayers.insert(make_pair((*itr)->GetLowGUID(), timeptr)); if(is_valid) plrcounts[(*itr)->GetTeam()]++; } } else { // oldie if(!in_range) { plr->SendWorldStateUpdate(WORLDSTATE_TEROKKAR_PVP_CAPTURE_BAR_DISPLAY, 0); StoredPlayers.erase(it2); } else { plr->SendWorldStateUpdate(WORLDSTATE_TEROKKAR_PVP_CAPTURE_BAR_VALUE, Status); it2->second = timeptr; if(is_valid) plrcounts[(*itr)->GetTeam()]++; } } } // handle stuff for the last tick if(Status == 100 && m_bannerStatus != BANNER_STATUS_ALLIANCE) { m_bannerStatus = BANNER_STATUS_ALLIANCE; SetArtKit(); // send message to everyone in the zone, has been captured by the Alliance mgr->SendPvPCaptureMessage(ZONE_TEROKKAR_FOREST, ZONE_TEROKKAR_FOREST, "|cffffff00%s has been taken by the Alliance!|r", ControlPointName); // tower update TFg_allianceTowers++; UpdateTowerCount(); // state update mgr->GetWorldStatesHandler().SetWorldStateForZone(ZONE_TEROKKAR_FOREST, mgr->GetAreaID( _gameobject->GetPositionX(), _gameobject->GetPositionY() ), g_neutralStateFields[towerid], 0); mgr->GetWorldStatesHandler().SetWorldStateForZone(ZONE_TEROKKAR_FOREST, mgr->GetAreaID( _gameobject->GetPositionX(), _gameobject->GetPositionY() ), g_allianceStateFields[towerid], 1); // woot TFg_towerOwners[towerid] = 1; } else if(Status == 0 && m_bannerStatus != BANNER_STATUS_HORDE) { m_bannerStatus = BANNER_STATUS_HORDE; SetArtKit(); // send message to everyone in the zone, has been captured by the Horde mgr->SendPvPCaptureMessage(ZONE_TEROKKAR_FOREST, ZONE_TEROKKAR_FOREST, "|cffffff00%s has been taken by the Horde!|r", ControlPointName); // tower update TFg_hordeTowers++; UpdateTowerCount(); // state update mgr->GetWorldStatesHandler().SetWorldStateForZone(ZONE_TEROKKAR_FOREST, mgr->GetAreaID( _gameobject->GetPositionX(), _gameobject->GetPositionY() ), g_neutralStateFields[towerid], 0); mgr->GetWorldStatesHandler().SetWorldStateForZone(ZONE_TEROKKAR_FOREST, mgr->GetAreaID( _gameobject->GetPositionX(), _gameobject->GetPositionY() ), g_hordeStateFields[towerid], 1); // woot TFg_towerOwners[towerid] = 0; } else if(m_bannerStatus != BANNER_STATUS_NEUTRAL) { // if the difference for the faction is >50, change to neutral if(m_bannerStatus == BANNER_STATUS_ALLIANCE && Status <= 50) { // send message: The Alliance has lost control of point xxx m_bannerStatus = BANNER_STATUS_NEUTRAL; SetArtKit(); TFg_allianceTowers--; UpdateTowerCount(); mgr->SendPvPCaptureMessage(ZONE_TEROKKAR_FOREST, ZONE_TEROKKAR_FOREST, "|cffffff00The Alliance have lost control of %s!|r", ControlPointName); // state update mgr->GetWorldStatesHandler().SetWorldStateForZone(ZONE_TEROKKAR_FOREST, mgr->GetAreaID( _gameobject->GetPositionX(), _gameobject->GetPositionY() ), g_allianceStateFields[towerid], 0); mgr->GetWorldStatesHandler().SetWorldStateForZone(ZONE_TEROKKAR_FOREST, mgr->GetAreaID( _gameobject->GetPositionX(), _gameobject->GetPositionY() ), g_neutralStateFields[towerid], 1); // woot TFg_towerOwners[towerid] = -1; } else if(m_bannerStatus == BANNER_STATUS_HORDE && Status >= 50) { // send message: The Alliance has lost control of point xxx m_bannerStatus = BANNER_STATUS_NEUTRAL; SetArtKit(); TFg_hordeTowers--; UpdateTowerCount(); mgr->SendPvPCaptureMessage(ZONE_TEROKKAR_FOREST, ZONE_TEROKKAR_FOREST, "|cffffff00The Horde have lost control of %s!|r", ControlPointName); // state update mgr->GetWorldStatesHandler().SetWorldStateForZone(ZONE_TEROKKAR_FOREST, mgr->GetAreaID( _gameobject->GetPositionX(), _gameobject->GetPositionY() ), g_hordeStateFields[towerid], 0); mgr->GetWorldStatesHandler().SetWorldStateForZone(ZONE_TEROKKAR_FOREST, mgr->GetAreaID( _gameobject->GetPositionX(), _gameobject->GetPositionY() ), g_neutralStateFields[towerid], 1); // woot TFg_towerOwners[towerid] = -1; } } // send any out of range players the disable flag for(it2 = StoredPlayers.begin(); it2 != StoredPlayers.end();) { it3 = it2; ++it2; if(it3->second != timeptr) { plr = _gameobject->GetMapMgr()->GetPlayer(it3->first); // they WILL be out of range at this point. this is guaranteed. means they left the set rly quickly. if(plr) plr->SendWorldStateUpdate(WORLDSTATE_TEROKKAR_PVP_CAPTURE_BAR_DISPLAY, 0); StoredPlayers.erase(it3); } } // work out current status for next tick uint32 delta; if(plrcounts[0] > plrcounts[1]) { delta = plrcounts[0] - plrcounts[1]; delta *= CAPTURE_RATE; // cap it at 25 so the banner always gets removed. if(delta > 25) delta = 25; Status += delta; if(Status >= 100) Status = 100; } else if(plrcounts[1] > plrcounts[0]) { delta = plrcounts[1] - plrcounts[0]; delta *= CAPTURE_RATE; // cap it at 25 so the banner always gets removed. if(delta > 25) delta = 25; if(delta > Status) Status = 0; else Status -= delta; } }