bool BattlegroundSA::ResetObjs() { for (int i = BG_SA_BOAT_ONE; i <= BG_SA_BOAT_TWO; i++) for (BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) if (Player *plr = ObjectAccessor::FindPlayer(itr->first)) SendTransportsRemove(plr); uint32 atF = BG_SA_Factions[Attackers]; uint32 defF = BG_SA_Factions[Attackers ? TEAM_ALLIANCE : TEAM_HORDE]; for (uint8 i = 0; i <BG_SA_MAXOBJ; i++) DelObject(i); for (uint8 i = 0; i < BG_SA_MAXNPC; i++) DelCreature(i); for (uint8 i = BG_SA_MAXNPC; i < BG_SA_MAXNPC + BG_SA_MAX_GY; i++) DelCreature(i); for (uint8 i = 0; i < 6; i++) GateStatus[i] = BG_SA_GATE_OK; for (uint8 i = 0; i < BG_SA_BOAT_ONE; i++) { if (!AddObject(i, BG_SA_ObjEntries[i], BG_SA_ObjSpawnlocs[i][0], BG_SA_ObjSpawnlocs[i][1], BG_SA_ObjSpawnlocs[i][2], BG_SA_ObjSpawnlocs[i][3], 0, 0, 0, 0, RESPAWN_ONE_DAY)) return false; } for (uint8 i = BG_SA_BOAT_ONE; i < BG_SA_SIGIL_1; i++) { uint32 boatid=0; switch (i) { case BG_SA_BOAT_ONE: boatid= Attackers ? BG_SA_BOAT_ONE_H : BG_SA_BOAT_ONE_A; break; case BG_SA_BOAT_TWO: boatid= Attackers ? BG_SA_BOAT_TWO_H : BG_SA_BOAT_TWO_A; break; } if (!AddObject(i, boatid, BG_SA_ObjSpawnlocs[i][0], BG_SA_ObjSpawnlocs[i][1], BG_SA_ObjSpawnlocs[i][2]+(Attackers ? -3.750f: 0), BG_SA_ObjSpawnlocs[i][3], 0, 0, 0, 0, RESPAWN_ONE_DAY)) return false; } for (uint8 i = BG_SA_SIGIL_1; i < BG_SA_CENTRAL_FLAG; i++) { if (!AddObject(i, BG_SA_ObjEntries[i], BG_SA_ObjSpawnlocs[i][0], BG_SA_ObjSpawnlocs[i][1], BG_SA_ObjSpawnlocs[i][2], BG_SA_ObjSpawnlocs[i][3], 0, 0, 0, 0, RESPAWN_ONE_DAY)) return false; } // MAD props for Kiper for discovering those values - 4 hours of his work. GetBGObject(BG_SA_BOAT_ONE)->UpdateRotationFields(1.0f, 0.0002f); GetBGObject(BG_SA_BOAT_TWO)->UpdateRotationFields(1.0f, 0.00001f); SpawnBGObject(BG_SA_BOAT_ONE, RESPAWN_IMMEDIATELY); SpawnBGObject(BG_SA_BOAT_TWO, RESPAWN_IMMEDIATELY); //Cannons and demolishers - NPCs are spawned //By capturing GYs. for (uint8 i = 0; i < BG_SA_NPC_SPARKLIGHT; i++) { if (!AddCreature(BG_SA_NpcEntries[i], i, (Attackers == TEAM_ALLIANCE ? TEAM_HORDE : TEAM_ALLIANCE), BG_SA_NpcSpawnlocs[i][0], BG_SA_NpcSpawnlocs[i][1], BG_SA_NpcSpawnlocs[i][2], BG_SA_NpcSpawnlocs[i][3], 600)) return false; } OverrideGunFaction(); DemolisherStartState(true); for (uint8 i = 0; i <= BG_SA_TITAN_RELIC; i++) { SpawnBGObject(i, RESPAWN_IMMEDIATELY); GetBGObject(i)->SetUInt32Value(GAMEOBJECT_FACTION, defF); } GetBGObject(BG_SA_TITAN_RELIC)->SetUInt32Value(GAMEOBJECT_FACTION, atF); GetBGObject(BG_SA_TITAN_RELIC)->Refresh(); for (uint8 i = 0; i <= 5; i++) GateStatus[i] = BG_SA_GATE_OK; TotalTime = 0; ShipsStarted = false; //Graveyards! for (uint8 i = 0;i < BG_SA_MAX_GY; i++) { WorldSafeLocsEntry const *sg = NULL; sg = sWorldSafeLocsStore.LookupEntry(BG_SA_GYEntries[i]); if (!sg) { sLog->outError("SOTA: Can't find GY entry %u", BG_SA_GYEntries[i]); return false; } if (i == BG_SA_BEACH_GY) { GraveyardStatus[i] = Attackers; AddSpiritGuide(i + BG_SA_MAXNPC, sg->x, sg->y, sg->z, BG_SA_GYOrientation[i], ((Attackers == TEAM_HORDE)? HORDE : ALLIANCE)); } else { GraveyardStatus[i] = ((Attackers == TEAM_HORDE)? TEAM_ALLIANCE : TEAM_HORDE); if (!AddSpiritGuide(i + BG_SA_MAXNPC, sg->x, sg->y, sg->z, BG_SA_GYOrientation[i], ((Attackers == TEAM_HORDE)? ALLIANCE : HORDE))) sLog->outError("SOTA: couldn't spawn GY: %u", i); } } //GY capture points for (uint8 i = BG_SA_CENTRAL_FLAG; i < BG_SA_PORTAL_DEFFENDER_BLUE; i++) { AddObject(i, (BG_SA_ObjEntries[i] - (Attackers == TEAM_ALLIANCE ? 1:0)), BG_SA_ObjSpawnlocs[i][0], BG_SA_ObjSpawnlocs[i][1], BG_SA_ObjSpawnlocs[i][2], BG_SA_ObjSpawnlocs[i][3], 0, 0, 0, 0, RESPAWN_ONE_DAY); GetBGObject(i)->SetUInt32Value(GAMEOBJECT_FACTION, atF); } for (uint8 i = BG_SA_PORTAL_DEFFENDER_BLUE; i < BG_SA_BOMB; i++) { AddObject(i, BG_SA_ObjEntries[i], BG_SA_ObjSpawnlocs[i][0], BG_SA_ObjSpawnlocs[i][1], BG_SA_ObjSpawnlocs[i][2], BG_SA_ObjSpawnlocs[i][3], 0, 0, 0, 0, RESPAWN_ONE_DAY); GetBGObject(i)->SetUInt32Value(GAMEOBJECT_FACTION, defF); } for (uint8 i = BG_SA_BOMB; i < BG_SA_MAXOBJ; i++) { AddObject(i, BG_SA_ObjEntries[BG_SA_BOMB], BG_SA_ObjSpawnlocs[i][0], BG_SA_ObjSpawnlocs[i][1], BG_SA_ObjSpawnlocs[i][2], BG_SA_ObjSpawnlocs[i][3], 0, 0, 0, 0, RESPAWN_ONE_DAY); GetBGObject(i)->SetUInt32Value(GAMEOBJECT_FACTION, atF); } //Player may enter BEFORE we set up bG - lets update his worldstates anyway... UpdateWorldState(BG_SA_RIGHT_GY_HORDE , GraveyardStatus[BG_SA_RIGHT_CAPTURABLE_GY] == TEAM_HORDE?1:0); UpdateWorldState(BG_SA_LEFT_GY_HORDE , GraveyardStatus[BG_SA_LEFT_CAPTURABLE_GY] == TEAM_HORDE?1:0); UpdateWorldState(BG_SA_CENTER_GY_HORDE , GraveyardStatus[BG_SA_CENTRAL_CAPTURABLE_GY] == TEAM_HORDE?1:0); UpdateWorldState(BG_SA_RIGHT_GY_ALLIANCE , GraveyardStatus[BG_SA_RIGHT_CAPTURABLE_GY] == TEAM_ALLIANCE?1:0); UpdateWorldState(BG_SA_LEFT_GY_ALLIANCE , GraveyardStatus[BG_SA_LEFT_CAPTURABLE_GY] == TEAM_ALLIANCE?1:0); UpdateWorldState(BG_SA_CENTER_GY_ALLIANCE , GraveyardStatus[BG_SA_CENTRAL_CAPTURABLE_GY] == TEAM_ALLIANCE?1:0); if (Attackers == TEAM_ALLIANCE) { UpdateWorldState(BG_SA_ALLY_ATTACKS, 1); UpdateWorldState(BG_SA_HORDE_ATTACKS, 0); UpdateWorldState(BG_SA_RIGHT_ATT_TOKEN_ALL, 1); UpdateWorldState(BG_SA_LEFT_ATT_TOKEN_ALL, 1); UpdateWorldState(BG_SA_RIGHT_ATT_TOKEN_HRD, 0); UpdateWorldState(BG_SA_LEFT_ATT_TOKEN_HRD, 0); UpdateWorldState(BG_SA_HORDE_DEFENCE_TOKEN, 1); UpdateWorldState(BG_SA_ALLIANCE_DEFENCE_TOKEN, 0); } else { UpdateWorldState(BG_SA_HORDE_ATTACKS, 1); UpdateWorldState(BG_SA_ALLY_ATTACKS, 0); UpdateWorldState(BG_SA_RIGHT_ATT_TOKEN_ALL, 0); UpdateWorldState(BG_SA_LEFT_ATT_TOKEN_ALL, 0); UpdateWorldState(BG_SA_RIGHT_ATT_TOKEN_HRD, 1); UpdateWorldState(BG_SA_LEFT_ATT_TOKEN_HRD, 1); UpdateWorldState(BG_SA_HORDE_DEFENCE_TOKEN, 0); UpdateWorldState(BG_SA_ALLIANCE_DEFENCE_TOKEN, 1); } UpdateWorldState(BG_SA_PURPLE_GATEWS, 1); UpdateWorldState(BG_SA_RED_GATEWS, 1); UpdateWorldState(BG_SA_BLUE_GATEWS, 1); UpdateWorldState(BG_SA_GREEN_GATEWS, 1); UpdateWorldState(BG_SA_YELLOW_GATEWS, 1); UpdateWorldState(BG_SA_ANCIENT_GATEWS, 1); for (int i = BG_SA_BOAT_ONE; i <= BG_SA_BOAT_TWO; i++) for (BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) if (Player *plr = ObjectAccessor::FindPlayer(itr->first)) SendTransportInit(plr); TeleportPlayers(); return true; }
void Game::clientsync(Command c) { switch(c.GetMessageType()) { case 0: { emit PlayerPointChanged(c.GetPlayerId(),c.GetMessage()); break; } case 1://move { emit PlayerMoved(c.GetPlayerId(),c.GetMessage()); break; } case 2://plant { emit BombPlanted((c.GetMessage()/256)%256,c.GetMessage()%256,c.GetPlayerId()); break; } case 3://boom { if((c.GetMessage()/(256*256))%256==255)emit DeleteBomb((c.GetMessage()/256)%256,c.GetMessage()%256); emit FieldBlasted((c.GetMessage()/256)%256,c.GetMessage()%256,c.GetPlayerId(),(c.GetMessage()/(256*256))%256); break; } case 4://kioltas { emit FieldExcinted((c.GetMessage()/256)%256,c.GetMessage()%256); break; } case 5://die/blast { if(c.GetMessage()!=256){emit PlayerDied(c.GetPlayerId(),c.GetMessage());} else{emit PlayerBlasted(c.GetPlayerId());} break; } case 6://mezőváltozás { fields[(c.GetMessage()/256)%256][c.GetMessage()%256]=(c.GetMessage()/(256*256))%256; emit FieldChanged((c.GetMessage()/256)%256,c.GetMessage()%256,(c.GetMessage()/(256*256))%256); break; } case 7://bónuszok { switch(c.GetMessage()/(256*256*256)) { case 1: emit BonusTurnVisible((c.GetMessage()/256)%256,c.GetMessage()%256,(c.GetMessage()/(256*256))%256); break; case 2: emit BonusTurnInvisible((c.GetMessage()/256)%256,c.GetMessage()%256,(c.GetMessage()/(256*256))%256); break; case 3: emit PlayerTurnVisible(c.GetPlayerId()); break; case 4: emit PlayerTurnInvisible(c.GetPlayerId()); break; default: break; } break; } case 248: { emit Disconnected(); } case 249: { emit DeleteBomb((c.GetMessage()/256)%256,c.GetMessage()%256); break; } case 250://pályaszinkron { fields[(c.GetMessage()/256)%256][c.GetMessage()%256]=(c.GetMessage()/(256*256))%256; break; } case 251://játék kezdete { emit GameStarted(c.GetMessage()); if(clientconnection && cup->GetPlayerName(1)=="") { for(uchar i=0;i<clientconnection->GetPlayers().size();i++)cup->AddPlayer(clientconnection->GetPlayers().at(i)); } break; } case 252://játék vége { emit GameOver(); break; } case 253://a győztes { switch(c.GetMessage()) { case 0: emit PlayerWonTheCup(GetPlayers()[c.GetPlayerId()]); break; case 1: emit PlayerWonTheRound(GetPlayers()[c.GetPlayerId()]); if(map){destroymap->stop();QTimer::singleShot(2000,this,SLOT(StopTheGame()));} break; } break; } case 254://alaphelyzetbe állítás { emit SetPlayerStartPosition(c.GetPlayerId(),(c.GetMessage()/256)%256,c.GetMessage()%256); break; } case 255://azonosítás { playerid=c.GetPlayerId(); survive=c.GetMessage()==0?true:false; break; } default: { break; } } }
bool BattlegroundIC::SetupBattleground() { for (uint8 i = 0; i < MAX_NORMAL_GAMEOBJECTS_SPAWNS; ++i) { if (!AddObject(BG_IC_ObjSpawnlocs[i].type, BG_IC_ObjSpawnlocs[i].entry, BG_IC_ObjSpawnlocs[i].x, BG_IC_ObjSpawnlocs[i].y, BG_IC_ObjSpawnlocs[i].z, BG_IC_ObjSpawnlocs[i].o, 0, 0, 0, 0, RESPAWN_ONE_DAY)) { sLog->outError(LOG_FILTER_BATTLEGROUND, "Isle of Conquest: There was an error spawning gameobject %u", BG_IC_ObjSpawnlocs[i].entry); return false; } } for (uint8 i = 2; i < MAX_NORMAL_NPCS_SPAWNS; ++i) { if (!AddCreature(BG_IC_NpcSpawnlocs[i].entry, BG_IC_NpcSpawnlocs[i].type, BG_IC_NpcSpawnlocs[i].team, BG_IC_NpcSpawnlocs[i].x, BG_IC_NpcSpawnlocs[i].y, BG_IC_NpcSpawnlocs[i].z, BG_IC_NpcSpawnlocs[i].o, RESPAWN_ONE_DAY)) { sLog->outError(LOG_FILTER_BATTLEGROUND, "Isle of Conquest: There was an error spawning creature %u", BG_IC_NpcSpawnlocs[i].entry); return false; } } if (!AddSpiritGuide(BG_IC_NPC_SPIRIT_GUIDE_1+5, BG_IC_SpiritGuidePos[5][0], BG_IC_SpiritGuidePos[5][1], BG_IC_SpiritGuidePos[5][2], BG_IC_SpiritGuidePos[5][3], ALLIANCE) || !AddSpiritGuide(BG_IC_NPC_SPIRIT_GUIDE_1+6, BG_IC_SpiritGuidePos[6][0], BG_IC_SpiritGuidePos[6][1], BG_IC_SpiritGuidePos[6][2], BG_IC_SpiritGuidePos[6][3], HORDE) || !AddSpiritGuide(BG_IC_NPC_SPIRIT_GUIDE_1+3, BG_IC_SpiritGuidePos[7][0], BG_IC_SpiritGuidePos[7][1], BG_IC_SpiritGuidePos[7][2], BG_IC_SpiritGuidePos[7][3], ALLIANCE) || !AddSpiritGuide(BG_IC_NPC_SPIRIT_GUIDE_1+4, BG_IC_SpiritGuidePos[8][0], BG_IC_SpiritGuidePos[8][1], BG_IC_SpiritGuidePos[8][2], BG_IC_SpiritGuidePos[8][3], HORDE)) { sLog->outError(LOG_FILTER_BATTLEGROUND, "Isle of Conquest: Failed to spawn initial spirit guide!"); return false; } gunshipHorde = CreateTransport(GO_HORDE_GUNSHIP, TRANSPORT_PERIOD_TIME); gunshipAlliance = CreateTransport(GO_ALLIANCE_GUNSHIP, TRANSPORT_PERIOD_TIME); if (!gunshipAlliance || !gunshipHorde) { sLog->outError(LOG_FILTER_BATTLEGROUND, "Isle of Conquest: There was an error creating gunships!"); return false; } //Send transport init packet to all player in map for (BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) { if (Player* player = ObjectAccessor::FindPlayer(itr->first)) SendTransportInit(player); } // setting correct factions for Keep Cannons for (uint8 i = BG_IC_NPC_KEEP_CANNON_1; i < BG_IC_NPC_KEEP_CANNON_12; ++i) GetBGCreature(i)->setFaction(BG_IC_Factions[0]); for (uint8 i = BG_IC_NPC_KEEP_CANNON_13; i < BG_IC_NPC_KEEP_CANNON_25; ++i) GetBGCreature(i)->setFaction(BG_IC_Factions[1]); // correcting spawn time for keeps bombs for (uint8 i = BG_IC_GO_HUGE_SEAFORIUM_BOMBS_A_1; i < BG_IC_GO_HUGE_SEAFORIUM_BOMBS_H_4; ++i) GetBGObject(i)->SetRespawnTime(10); return true; }
bool BattlegroundSA::ResetObjs() { for (BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) if (Player* player = ObjectAccessor::FindPlayer(itr->first)) SendTransportsRemove(player); uint32 atF = BG_SA_Factions[Attackers]; uint32 defF = BG_SA_Factions[Attackers ? TEAM_ALLIANCE : TEAM_HORDE]; for (uint8 i = 0; i < BG_SA_MAXOBJ; i++) DelObject(i); for (uint8 i = 0; i < BG_SA_MAXNPC; i++) DelCreature(i); for (uint8 i = BG_SA_MAXNPC; i < BG_SA_MAXNPC + BG_SA_MAX_GY; i++) DelCreature(i); for (uint8 i = 0; i < 6; i++) GateStatus[i] = BG_SA_GATE_OK; if (!AddCreature(BG_SA_NpcEntries[BG_SA_NPC_KANRETHAD], BG_SA_NPC_KANRETHAD, BG_SA_NpcSpawnlocs[BG_SA_NPC_KANRETHAD])) { TC_LOG_ERROR("bg.battleground", "SOTA: couldn't spawn Kanrethad, aborted. Entry: %u", BG_SA_NpcEntries[BG_SA_NPC_KANRETHAD]); return false; } for (uint8 i = 0; i <= BG_SA_PORTAL_DEFFENDER_RED; i++) { if (!AddObject(i, BG_SA_ObjEntries[i], BG_SA_ObjSpawnlocs[i], 0, 0, 0, 0, RESPAWN_ONE_DAY)) { TC_LOG_ERROR("bg.battleground", "SOTA: couldn't spawn BG_SA_PORTAL_DEFFENDER_RED, Entry: %u", BG_SA_ObjEntries[i]); continue; } } for (uint8 i = BG_SA_BOAT_ONE; i <= BG_SA_BOAT_TWO; i++) { uint32 boatid = 0; switch (i) { case BG_SA_BOAT_ONE: boatid = Attackers ? BG_SA_BOAT_ONE_H : BG_SA_BOAT_ONE_A; break; case BG_SA_BOAT_TWO: boatid = Attackers ? BG_SA_BOAT_TWO_H : BG_SA_BOAT_TWO_A; break; default: break; } if (!AddObject(i, boatid, BG_SA_ObjSpawnlocs[i].GetPositionX(), BG_SA_ObjSpawnlocs[i].GetPositionY(), BG_SA_ObjSpawnlocs[i].GetPositionZ() + (Attackers ? -3.750f: 0), BG_SA_ObjSpawnlocs[i].GetOrientation(), 0, 0, 0, 0, RESPAWN_ONE_DAY)) { TC_LOG_ERROR("bg.battleground", "SOTA: couldn't spawn one of the BG_SA_BOAT, Entry: %u", boatid); continue; } } for (uint8 i = BG_SA_SIGIL_1; i <= BG_SA_LEFT_FLAGPOLE; i++) { if (!AddObject(i, BG_SA_ObjEntries[i], BG_SA_ObjSpawnlocs[i], 0, 0, 0, 0, RESPAWN_ONE_DAY)) { TC_LOG_ERROR("bg.battleground", "SOTA: couldn't spawn Sigil, Entry: %u", BG_SA_ObjEntries[i]); continue; } } // MAD props for Kiper for discovering those values - 4 hours of his work. GetBGObject(BG_SA_BOAT_ONE)->UpdateRotationFields(1.0f, 0.0002f); GetBGObject(BG_SA_BOAT_TWO)->UpdateRotationFields(1.0f, 0.00001f); SpawnBGObject(BG_SA_BOAT_ONE, RESPAWN_IMMEDIATELY); SpawnBGObject(BG_SA_BOAT_TWO, RESPAWN_IMMEDIATELY); //Cannons and demolishers - NPCs are spawned //By capturing GYs. for (uint8 i = 0; i < BG_SA_DEMOLISHER_5; i++) { if (!AddCreature(BG_SA_NpcEntries[i], i, BG_SA_NpcSpawnlocs[i], Attackers == TEAM_ALLIANCE ? TEAM_HORDE : TEAM_ALLIANCE, 600)) { TC_LOG_ERROR("bg.battleground", "SOTA: couldn't spawn Cannon or demolisher, Entry: %u, Attackers: %s", BG_SA_NpcEntries[i], Attackers == TEAM_ALLIANCE ? "Horde(1)" : "Alliance(0)"); continue; } } OverrideGunFaction(); DemolisherStartState(true); for (uint8 i = 0; i <= BG_SA_PORTAL_DEFFENDER_RED; i++) { SpawnBGObject(i, RESPAWN_IMMEDIATELY); GetBGObject(i)->SetFaction(defF); } GetBGObject(BG_SA_TITAN_RELIC)->SetFaction(atF); GetBGObject(BG_SA_TITAN_RELIC)->Refresh(); for (uint8 i = 0; i <= 5; i++) GateStatus[i] = BG_SA_GATE_OK; TotalTime = 0; ShipsStarted = false; //Graveyards for (uint8 i = 0; i < BG_SA_MAX_GY; i++) { WorldSafeLocsEntry const* sg = NULL; sg = sWorldSafeLocsStore.LookupEntry(BG_SA_GYEntries[i]); if (!sg) { TC_LOG_ERROR("bg.battleground", "SOTA: Can't find GY entry %u", BG_SA_GYEntries[i]); return false; } if (i == BG_SA_BEACH_GY) { GraveyardStatus[i] = Attackers; AddSpiritGuide(i + BG_SA_MAXNPC, sg->x, sg->y, sg->z, BG_SA_GYOrientation[i], Attackers); } else { GraveyardStatus[i] = ((Attackers == TEAM_HORDE)? TEAM_ALLIANCE : TEAM_HORDE); if (!AddSpiritGuide(i + BG_SA_MAXNPC, sg->x, sg->y, sg->z, BG_SA_GYOrientation[i], Attackers == TEAM_HORDE ? TEAM_ALLIANCE : TEAM_HORDE)) TC_LOG_ERROR("bg.battleground", "SOTA: couldn't spawn GY: %u", i); } } //GY capture points for (uint8 i = BG_SA_CENTRAL_FLAG; i <= BG_SA_LEFT_FLAG; i++) { if (!AddObject(i, (BG_SA_ObjEntries[i] - (Attackers == TEAM_ALLIANCE ? 1 : 0)), BG_SA_ObjSpawnlocs[i], 0, 0, 0, 0, RESPAWN_ONE_DAY)) { TC_LOG_ERROR("bg.battleground", "SOTA: couldn't spawn Central Flag Entry: %u", BG_SA_ObjEntries[i] - (Attackers == TEAM_ALLIANCE ? 1 : 0)); continue; } GetBGObject(i)->SetFaction(atF); } for (uint8 i = BG_SA_BOMB; i < BG_SA_MAXOBJ; i++) { if (!AddObject(i, BG_SA_ObjEntries[BG_SA_BOMB], BG_SA_ObjSpawnlocs[i], 0, 0, 0, 0, RESPAWN_ONE_DAY)) { TC_LOG_ERROR("bg.battleground", "SOTA: couldn't spawn SA Bomb Entry: %u", BG_SA_ObjEntries[BG_SA_BOMB] + i); continue; } GetBGObject(i)->SetFaction(atF); } //Player may enter BEFORE we set up BG - lets update his worldstates anyway... UpdateWorldState(BG_SA_RIGHT_GY_HORDE, GraveyardStatus[BG_SA_RIGHT_CAPTURABLE_GY] == TEAM_HORDE ? 1 : 0); UpdateWorldState(BG_SA_LEFT_GY_HORDE, GraveyardStatus[BG_SA_LEFT_CAPTURABLE_GY] == TEAM_HORDE ? 1 : 0); UpdateWorldState(BG_SA_CENTER_GY_HORDE, GraveyardStatus[BG_SA_CENTRAL_CAPTURABLE_GY] == TEAM_HORDE ? 1 : 0); UpdateWorldState(BG_SA_RIGHT_GY_ALLIANCE, GraveyardStatus[BG_SA_RIGHT_CAPTURABLE_GY] == TEAM_ALLIANCE ? 1 : 0); UpdateWorldState(BG_SA_LEFT_GY_ALLIANCE, GraveyardStatus[BG_SA_LEFT_CAPTURABLE_GY] == TEAM_ALLIANCE ? 1 : 0); UpdateWorldState(BG_SA_CENTER_GY_ALLIANCE, GraveyardStatus[BG_SA_CENTRAL_CAPTURABLE_GY] == TEAM_ALLIANCE ? 1 : 0); if (Attackers == TEAM_ALLIANCE) { UpdateWorldState(BG_SA_ALLY_ATTACKS, 1); UpdateWorldState(BG_SA_HORDE_ATTACKS, 0); UpdateWorldState(BG_SA_RIGHT_ATT_TOKEN_ALL, 1); UpdateWorldState(BG_SA_LEFT_ATT_TOKEN_ALL, 1); UpdateWorldState(BG_SA_RIGHT_ATT_TOKEN_HRD, 0); UpdateWorldState(BG_SA_LEFT_ATT_TOKEN_HRD, 0); UpdateWorldState(BG_SA_HORDE_DEFENCE_TOKEN, 1); UpdateWorldState(BG_SA_ALLIANCE_DEFENCE_TOKEN, 0); } else { UpdateWorldState(BG_SA_HORDE_ATTACKS, 1); UpdateWorldState(BG_SA_ALLY_ATTACKS, 0); UpdateWorldState(BG_SA_RIGHT_ATT_TOKEN_ALL, 0); UpdateWorldState(BG_SA_LEFT_ATT_TOKEN_ALL, 0); UpdateWorldState(BG_SA_RIGHT_ATT_TOKEN_HRD, 1); UpdateWorldState(BG_SA_LEFT_ATT_TOKEN_HRD, 1); UpdateWorldState(BG_SA_HORDE_DEFENCE_TOKEN, 0); UpdateWorldState(BG_SA_ALLIANCE_DEFENCE_TOKEN, 1); } UpdateWorldState(BG_SA_PURPLE_GATEWS, 1); UpdateWorldState(BG_SA_RED_GATEWS, 1); UpdateWorldState(BG_SA_BLUE_GATEWS, 1); UpdateWorldState(BG_SA_GREEN_GATEWS, 1); UpdateWorldState(BG_SA_YELLOW_GATEWS, 1); UpdateWorldState(BG_SA_ANCIENT_GATEWS, 1); for (int i = BG_SA_BOAT_ONE; i <= BG_SA_BOAT_TWO; i++) for (BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) if (Player* player = ObjectAccessor::FindPlayer(itr->first)) SendTransportInit(player); // set status manually so preparation is cast correctly in 2nd round too SetStatus(STATUS_WAIT_JOIN); TeleportPlayers(); return true; }
std::string CPlayerCoreFactory::SelectPlayerDialog(float posX, float posY) const { std::vector<std::string>players; GetPlayers(players); return SelectPlayerDialog(players, posX, posY); }
void Arena::EndBattleground(uint32 winner) { // arena rating calculation if (isRated()) { uint32 loserTeamRating = 0; uint32 loserMatchmakerRating = 0; int32 loserChange = 0; int32 loserMatchmakerChange = 0; uint32 winnerTeamRating = 0; uint32 winnerMatchmakerRating = 0; int32 winnerChange = 0; int32 winnerMatchmakerChange = 0; ArenaTeam* winnerArenaTeam = sArenaTeamMgr->GetArenaTeamById(GetArenaTeamIdForTeam(winner)); ArenaTeam* loserArenaTeam = sArenaTeamMgr->GetArenaTeamById(GetArenaTeamIdForTeam(GetOtherTeam(winner))); if (winnerArenaTeam && loserArenaTeam && winnerArenaTeam != loserArenaTeam) { loserTeamRating = loserArenaTeam->GetRating(); loserMatchmakerRating = GetArenaMatchmakerRating(GetOtherTeam(winner)); winnerTeamRating = winnerArenaTeam->GetRating(); winnerMatchmakerRating = GetArenaMatchmakerRating(winner); if (winner != 0) { winnerMatchmakerChange = winnerArenaTeam->WonAgainst(winnerMatchmakerRating, loserMatchmakerRating, winnerChange); loserMatchmakerChange = loserArenaTeam->LostAgainst(loserMatchmakerRating, winnerMatchmakerRating, loserChange); TC_LOG_DEBUG("bg.arena", "match Type: %u --- Winner: old rating: %u, rating gain: %d, old MMR: %u, MMR gain: %d --- Loser: old rating: %u, rating loss: %d, old MMR: %u, MMR loss: %d ---", GetArenaType(), winnerTeamRating, winnerChange, winnerMatchmakerRating, winnerMatchmakerChange, loserTeamRating, loserChange, loserMatchmakerRating, loserMatchmakerChange); SetArenaMatchmakerRating(winner, winnerMatchmakerRating + winnerMatchmakerChange); SetArenaMatchmakerRating(GetOtherTeam(winner), loserMatchmakerRating + loserMatchmakerChange); // bg team that the client expects is different to TeamId // alliance 1, horde 0 uint8 winnerTeam = winner == ALLIANCE ? BG_TEAM_ALLIANCE : BG_TEAM_HORDE; uint8 loserTeam = winner == ALLIANCE ? BG_TEAM_HORDE : BG_TEAM_ALLIANCE; _arenaTeamScores[winnerTeam].Assign(winnerChange, winnerMatchmakerRating, winnerArenaTeam->GetName()); _arenaTeamScores[loserTeam].Assign(loserChange, loserMatchmakerRating, loserArenaTeam->GetName()); TC_LOG_DEBUG("bg.arena", "Arena match Type: %u for Team1Id: %u - Team2Id: %u ended. WinnerTeamId: %u. Winner rating: +%d, Loser rating: %d", GetArenaType(), GetArenaTeamIdByIndex(TEAM_ALLIANCE), GetArenaTeamIdByIndex(TEAM_HORDE), winnerArenaTeam->GetId(), winnerChange, loserChange); if (sWorld->getBoolConfig(CONFIG_ARENA_LOG_EXTENDED_INFO)) for (auto const& score : PlayerScores) if (Player* player = ObjectAccessor::FindConnectedPlayer(ObjectGuid(HighGuid::Player, score.first))) { TC_LOG_DEBUG("bg.arena", "Statistics match Type: %u for %s (GUID: %u, Team: %d, IP: %s): %s", GetArenaType(), player->GetName().c_str(), score.first, player->GetArenaTeamId(GetArenaType() == 5 ? 2 : GetArenaType() == 3), player->GetSession()->GetRemoteAddress().c_str(), score.second->ToString().c_str()); } } // Deduct 16 points from each teams arena-rating if there are no winners after 45+2 minutes else { _arenaTeamScores[BG_TEAM_ALLIANCE].Assign(ARENA_TIMELIMIT_POINTS_LOSS, winnerMatchmakerRating, winnerArenaTeam->GetName()); _arenaTeamScores[BG_TEAM_HORDE].Assign(ARENA_TIMELIMIT_POINTS_LOSS, loserMatchmakerRating, loserArenaTeam->GetName()); winnerArenaTeam->FinishGame(ARENA_TIMELIMIT_POINTS_LOSS); loserArenaTeam->FinishGame(ARENA_TIMELIMIT_POINTS_LOSS); } uint8 aliveWinners = GetAlivePlayersCountByTeam(winner); for (auto const& i : GetPlayers()) { uint32 team = i.second.Team; if (i.second.OfflineRemoveTime) { // if rated arena match - make member lost! if (team == winner) winnerArenaTeam->OfflineMemberLost(i.first, loserMatchmakerRating, winnerMatchmakerChange); else loserArenaTeam->OfflineMemberLost(i.first, winnerMatchmakerRating, loserMatchmakerChange); continue; } Player* player = _GetPlayer(i.first, i.second.OfflineRemoveTime != 0, "Arena::EndBattleground"); if (!player) continue; // per player calculation if (team == winner) { // update achievement BEFORE personal rating update uint32 rating = player->GetArenaPersonalRating(winnerArenaTeam->GetSlot()); player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA, rating ? rating : 1); player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_WIN_ARENA, GetMapId()); // Last standing - Rated 5v5 arena & be solely alive player if (GetArenaType() == ARENA_TYPE_5v5 && aliveWinners == 1 && player->IsAlive()) player->CastSpell(player, SPELL_LAST_MAN_STANDING, true); winnerArenaTeam->MemberWon(player, loserMatchmakerRating, winnerMatchmakerChange); } else { loserArenaTeam->MemberLost(player, winnerMatchmakerRating, loserMatchmakerChange); // Arena lost => reset the win_rated_arena having the "no_lose" condition player->ResetAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA, ACHIEVEMENT_CRITERIA_CONDITION_NO_LOSE); } } // save the stat changes winnerArenaTeam->SaveToDB(); loserArenaTeam->SaveToDB(); // send updated arena team stats to players // this way all arena team members will get notified, not only the ones who participated in this match winnerArenaTeam->NotifyStatsChanged(); loserArenaTeam->NotifyStatsChanged(); } } // end battleground Battleground::EndBattleground(winner); }
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 BattlegroundRV::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(); } // teleport buggers if(m_uiTeleport < diff) { for(BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) { Player * plr = sObjectMgr->GetPlayer(itr->first); if (plr && plr->GetPositionZ() < 27) plr->TeleportTo(plr->GetMapId(), plr->GetPositionX(), plr->GetPositionY(), 29, plr->GetOrientation(), false); if (plr && plr->GetPositionZ() < 27) plr->TeleportTo(plr->GetMapId(), plr->GetPositionX(), plr->GetPositionY(), 29, plr->GetOrientation(), false); } m_uiTeleport = 1000; } else m_uiTeleport -= diff; } if (getTimer() < diff) { uint32 i; switch(getState()) { case BG_RV_STATE_OPEN_FENCES: { setTimer(BG_RV_PILAR_TO_FIRE_TIMER); setState(BG_RV_STATE_CLOSE_FIRE); break; } case BG_RV_STATE_CLOSE_FIRE: //uint32 i; for (i = BG_RV_OBJECT_FIRE_1; i <= BG_RV_OBJECT_FIREDOOR_2; ++i) DoorOpen(i); setTimer(BG_RV_FIRE_TO_PILAR_TIMER); setState(BG_RV_STATE_OPEN_PILARS); break; case BG_RV_STATE_OPEN_PILARS: for (i = BG_RV_OBJECT_PILAR_1; i <= BG_RV_OBJECT_PULLEY_2; ++i) DoorOpen(i); setTimer(BG_RV_PILAR_TO_FIRE_TIMER); setState(BG_RV_STATE_OPEN_FIRE); break; case BG_RV_STATE_OPEN_FIRE: for (i = BG_RV_OBJECT_FIRE_1; i <= BG_RV_OBJECT_FIREDOOR_2; ++i) DoorOpen(i); setTimer(BG_RV_FIRE_TO_PILAR_TIMER); setState(BG_RV_STATE_CLOSE_PILARS); break; case BG_RV_STATE_CLOSE_PILARS: //uint32 i; for (i = BG_RV_OBJECT_PILAR_1; i <= BG_RV_OBJECT_PULLEY_2; ++i) DoorOpen(i); setTimer(BG_RV_PILAR_TO_FIRE_TIMER); setState(BG_RV_STATE_CLOSE_FIRE); break; } } else setTimer(getTimer() - diff); }
void BattleGroundWS::Update(uint32 diff) { BattleGround::Update(diff); // after bg start we get there (once) if (GetStatus() == STATUS_WAIT_JOIN && GetPlayersSize()) { ModifyStartDelayTime(diff); if (!(m_Events & 0x01)) { m_Events |= 0x01; // setup here, only when at least one player has ported to the map if (!SetupBattleGround()) { EndNow(); return; } SetStartDelayTime(START_DELAY0); } // After 1 minute, warning is signalled else if (GetStartDelayTime() <= START_DELAY1 && !(m_Events & 0x04)) { m_Events |= 0x04; SendMessageToAll(GetMangosString(LANG_BG_WS_ONE_MINUTE)); } // After 1,5 minute, warning is signalled else if (GetStartDelayTime() <= START_DELAY2 && !(m_Events & 0x08)) { m_Events |= 0x08; SendMessageToAll(GetMangosString(LANG_BG_WS_HALF_MINUTE)); } // After 2 minutes, gates OPEN ! x) else if (GetStartDelayTime() < 0 && !(m_Events & 0x10)) { m_Events |= 0x10; // TODO implement timer to despawn doors after a short while OpenDoorEvent(BG_EVENT_DOOR); SpawnEvent(WS_EVENT_SPIRITGUIDES_SPAWN, 0, true); SpawnEvent(WS_EVENT_FLAG_A, 0, true); SpawnEvent(WS_EVENT_FLAG_H, 0, true); SendMessageToAll(GetMangosString(LANG_BG_WS_BEGIN)); PlaySoundToAll(SOUND_BG_START); SetStatus(STATUS_IN_PROGRESS); for(BattleGroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) if (Player* plr = sObjectMgr.GetPlayer(itr->first)) plr->RemoveAurasDueToSpell(SPELL_PREPARATION); } } else if (GetStatus() == STATUS_IN_PROGRESS) { if (m_FlagState[BG_TEAM_ALLIANCE] == BG_WS_FLAG_STATE_WAIT_RESPAWN) { m_FlagsTimer[BG_TEAM_ALLIANCE] -= diff; if (m_FlagsTimer[BG_TEAM_ALLIANCE] < 0) { m_FlagsTimer[BG_TEAM_ALLIANCE] = 0; RespawnFlag(ALLIANCE, true); } } if (m_FlagState[BG_TEAM_ALLIANCE] == BG_WS_FLAG_STATE_ON_GROUND) { m_FlagsDropTimer[BG_TEAM_ALLIANCE] -= diff; if (m_FlagsDropTimer[BG_TEAM_ALLIANCE] < 0) { m_FlagsDropTimer[BG_TEAM_ALLIANCE] = 0; RespawnFlagAfterDrop(ALLIANCE); } } if (m_FlagState[BG_TEAM_HORDE] == BG_WS_FLAG_STATE_WAIT_RESPAWN) { m_FlagsTimer[BG_TEAM_HORDE] -= diff; if (m_FlagsTimer[BG_TEAM_HORDE] < 0) { m_FlagsTimer[BG_TEAM_HORDE] = 0; RespawnFlag(HORDE, true); } } if (m_FlagState[BG_TEAM_HORDE] == BG_WS_FLAG_STATE_ON_GROUND) { m_FlagsDropTimer[BG_TEAM_HORDE] -= diff; if (m_FlagsDropTimer[BG_TEAM_HORDE] < 0) { m_FlagsDropTimer[BG_TEAM_HORDE] = 0; RespawnFlagAfterDrop(HORDE); } } } }
void BattlegroundEY::PostUpdateImpl(uint32 diff) { if (GetStatus() == STATUS_IN_PROGRESS) { m_PointAddingTimer -= diff; if (m_PointAddingTimer <= 0) { m_PointAddingTimer = BG_EY_FPOINTS_TICK_TIME; if (m_TeamPointsCount[BG_TEAM_ALLIANCE] > 0) AddPoints(ALLIANCE, BG_EY_TickPoints[m_TeamPointsCount[BG_TEAM_ALLIANCE] - 1]); if (m_TeamPointsCount[BG_TEAM_HORDE] > 0) AddPoints(HORDE, BG_EY_TickPoints[m_TeamPointsCount[BG_TEAM_HORDE] - 1]); } if (m_FlagState == BG_EY_FLAG_STATE_WAIT_RESPAWN || m_FlagState == BG_EY_FLAG_STATE_ON_GROUND) { m_FlagsTimer -= diff; if (m_FlagsTimer < 0) { m_FlagsTimer = 0; if (m_FlagState == BG_EY_FLAG_STATE_WAIT_RESPAWN) RespawnFlag(true); else RespawnFlagAfterDrop(); } } m_TowerCapCheckTimer -= diff; if (m_TowerCapCheckTimer <= 0) { // Check if the player joined the point. CheckSomeoneJoinedPoint(); // Check if the player left the point. CheckSomeoneLeftPoint(); UpdatePointStatuses(); m_TowerCapCheckTimer = BG_EY_FPOINTS_TICK_TIME; } } // Check for players below map / cheaters. if (GetStatus() == STATUS_WAIT_JOIN) { m_CheatersCheckTimer -= diff; if (m_CheatersCheckTimer <= 0) { if (!GetPlayers().empty()) { for (BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) { Player * plr = ObjectAccessor::FindPlayer(itr->first); if (!plr || !plr->IsInWorld()) continue; if (plr->GetPositionZ() < 1244.0f) { if (plr->GetBGTeam() == HORDE) plr->TeleportTo(566, 1807.98f, 1539.42f, 1247.52f, plr->GetOrientation(), 0); else plr->TeleportTo(566, 2527.18f, 1597.31f, 1248.78f, plr->GetOrientation(), 0); } } } m_CheatersCheckTimer = 4000; } } }
void BattleGroundSA::Update(uint32 diff) { BattleGround::Update(diff); if (GetStatus() == STATUS_WAIT_JOIN && !shipsStarted) if (Phase == SA_ROUND_ONE) // Round one not started yet if (shipsTimer <= diff) StartShips(); else shipsTimer -= diff; if (GetStatus() == STATUS_IN_PROGRESS) // Battleground already in progress { if (Round_timer >= BG_SA_ROUNDLENGTH) { if(Phase == SA_ROUND_ONE) // Timeout of first round { PlaySoundToAll(BG_SA_SOUND_GYD_VICTORY); SendMessageToAll(defender == ALLIANCE ? LANG_BG_SA_ALLIANCE_TIMEOUT_END_1ROUND : LANG_BG_SA_HORDE_TIMEOUT_END_1ROUND, CHAT_MSG_BG_SYSTEM_NEUTRAL, NULL); RoundScores[0].winner = GetDefender(); RoundScores[0].time = 601000; for (BattleGroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) { if (Player *plr = sObjectMgr.GetPlayer(itr->first)) plr->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, 52459); } ResetBattle(0, defender); } else // Timeout of second round { SendMessageToAll(defender == ALLIANCE ? LANG_BG_SA_ALLIANCE_TIMEOUT_END_2ROUND : LANG_BG_SA_HORDE_TIMEOUT_END_2ROUND, CHAT_MSG_BG_SYSTEM_NEUTRAL, NULL); RoundScores[1].winner = GetDefender(); RoundScores[1].time = 601000; for (BattleGroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) { if (Player *plr = sObjectMgr.GetPlayer(itr->first)) plr->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, 52459); } BattleGroundSA::EndBattleGround(defender); return; } } else Round_timer += diff; for (int gyd = 0; gyd < BG_SA_GRY_MAX; ++gyd) { // 3 sec delay to spawn new banner instead previous despawned one if (m_BannerTimers[gyd].timer) { if (m_BannerTimers[gyd].timer > diff) m_BannerTimers[gyd].timer -= diff; else { m_BannerTimers[gyd].timer = 0; _CreateBanner(gyd, m_BannerTimers[gyd].type, m_BannerTimers[gyd].teamIndex, false); } } // 1-minute to occupy a node from contested state if (m_GydTimers[gyd]) { if (m_GydTimers[gyd] > diff) m_GydTimers[gyd] -= diff; else { m_GydTimers[gyd] = 0; // Change from contested to occupied ! uint8 teamIndex = m_Gyd[gyd]-1; m_prevGyd[gyd] = m_Gyd[gyd]; m_Gyd[gyd] += 2; // create new occupied banner _CreateBanner(gyd, BG_SA_GARVE_TYPE_OCCUPIED, teamIndex, true); SpawnEvent(gyd+11, teamIndex, true); //_SendNodeUpdate(node); _GydOccupied(gyd,(teamIndex == 0) ? ALLIANCE:HORDE); // Message to chatlog RewardHonorToTeam(85, (teamIndex == 0) ? ALLIANCE:HORDE); RewardXpToTeam(0, 0.6f, (teamIndex == 0) ? ALLIANCE:HORDE); RewardReputationToTeam((teamIndex == 0) ? 1050:1085, 65, (teamIndex == 0) ? ALLIANCE:HORDE); switch(gyd) { case 0: SpawnEvent(SA_EVENT_ADD_VECH_W, 0, true);break; case 1: SpawnEvent(SA_EVENT_ADD_VECH_E, 0, true);break; } if (teamIndex == 0) { // SendMessage2ToAll(LANG_BG_SA_AH_SEIZES_GRAVEYARD,CHAT_MSG_BG_SYSTEM_ALLIANCE,NULL,LANG_BG_ALLY,_GydName(gyd)); PlaySoundToAll(BG_SA_SOUND_GYD_CAPTURED_ALLIANCE); SendWarningToAllSA(gyd, STATUS_CONQUESTED, ALLIANCE); } else { // SendMessage2ToAll(LANG_BG_SA_AH_SEIZES_GRAVEYARD,CHAT_MSG_BG_SYSTEM_HORDE,NULL,LANG_BG_HORDE,_GydName(gyd)); PlaySoundToAll(BG_SA_SOUND_GYD_CAPTURED_HORDE); SendWarningToAllSA(gyd, STATUS_CONQUESTED, HORDE); } } } } UpdateTimer(); } if (GetStatus() == STATUS_WAIT_JOIN && Phase == SA_ROUND_TWO) // Round two, not yet started { if (!shipsStarted) if (shipsTimer <= diff) { SendMessageToAll(LANG_BG_SA_START_ONE_MINUTE, CHAT_MSG_BG_SYSTEM_NEUTRAL, NULL); StartShips(); } else shipsTimer -= diff; if (TimeST2Round < diff) { Phase = 2; SpawnEvent(BG_EVENT_DOOR, 0, false); SpawnEvent(SA_EVENT_ADD_NPC, 0, true); SpawnEvent(SA_EVENT_ADD_BOMB, (GetDefender() == ALLIANCE ? 1 : 0), true); ToggleTimer(); SetStatus(STATUS_IN_PROGRESS); // Start round two PlaySoundToAll(SOUND_BG_START); SendMessageToAll(LANG_BG_SA_HAS_BEGUN, CHAT_MSG_BG_SYSTEM_NEUTRAL, NULL); SendWarningToAll(LANG_BG_SA_HAS_BEGUN); } else TimeST2Round -= diff; } }
void BattlegroundKT::PostUpdateImpl(uint32 diff) { if (GetStatus() == STATUS_WAIT_JOIN) { m_CheatersCheckTimer -= diff; if (m_CheatersCheckTimer <= 0) { for (BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) { Player * plr = ObjectAccessor::FindPlayer(itr->first); if (!plr || !plr->IsInWorld()) continue; if (plr->GetPositionZ() < 24.0f) { if (plr->GetBGTeam() == HORDE) plr->TeleportTo(998, 1781.31f, 1597.76f, 33.61f, plr->GetOrientation(), 0); else plr->TeleportTo(998, 1784.42f, 1072.73f, 29.88f, plr->GetOrientation(), 0); } } m_CheatersCheckTimer = 4000; } } if (GetStatus() == STATUS_IN_PROGRESS) { if (m_EndTimer <= diff) { uint32 allianceScore = GetTeamScore(ALLIANCE); uint32 hordeScore = GetTeamScore(HORDE); if (allianceScore > hordeScore) EndBattleground(ALLIANCE); else if (allianceScore < hordeScore) EndBattleground(HORDE); else EndBattleground(m_LastCapturedOrbTeam); // if 0 => tie } else { uint32 minutesLeftPrev = GetRemainingTimeInMinutes(); m_EndTimer -= diff; uint32 minutesLeft = GetRemainingTimeInMinutes(); if (minutesLeft != minutesLeftPrev) UpdateWorldState(BG_KT_TIME_REMAINING, minutesLeft); } if (m_UpdatePointsTimer <= diff) { for (uint8 i = 0; i < MAX_ORBS; ++i) { if (uint64 guid = m_OrbKeepers[i]) { if (m_playersZone.find(guid) != m_playersZone.end()) { if (Player* player = ObjectAccessor::FindPlayer(guid)) { AccumulateScore(player->GetBGTeam() == ALLIANCE ? BG_TEAM_ALLIANCE : BG_TEAM_HORDE, m_playersZone[guid]); UpdatePlayerScore(player, SCORE_ORB_SCORE, m_playersZone[guid]); } } } } m_UpdatePointsTimer = BG_KT_POINTS_UPDATE_TIME; } else m_UpdatePointsTimer -= diff; } }
uchar Game::GetPlaysersNumber() { return GetPlayers().size(); }
void BattleGroundEY::Update(time_t diff) { BattleGround::Update(diff); // after bg start we get there (once) if (GetStatus() == STATUS_WAIT_JOIN && GetPlayersSize()) { ModifyStartDelayTime(diff); if(!(m_Events & 0x01)) { m_Events |= 0x01; SpawnBGObject(BG_EY_OBJECT_DOOR_A, RESPAWN_IMMEDIATELY); SpawnBGObject(BG_EY_OBJECT_DOOR_H, RESPAWN_IMMEDIATELY); for(uint32 i = BG_EY_OBJECT_A_BANNER_FEL_REALVER_CENTER; i < BG_EY_OBJECT_MAX; ++i) SpawnBGObject(i, RESPAWN_ONE_DAY); SetStartDelayTime(START_DELAY0); } // After 1 minute, warning is signalled else if(GetStartDelayTime() <= START_DELAY1 && !(m_Events & 0x04)) { m_Events |= 0x04; SendMessageToAll(GetMangosString(LANG_BG_EY_ONE_MINUTE)); } // After 1,5 minute, warning is signalled else if(GetStartDelayTime() <= START_DELAY2 && !(m_Events & 0x08)) { m_Events |= 0x08; SendMessageToAll(GetMangosString(LANG_BG_EY_HALF_MINUTE)); } // After 2 minutes, gates OPEN ! x) else if(GetStartDelayTime() < 0 && !(m_Events & 0x10)) { m_Events |= 0x10; SpawnBGObject(BG_EY_OBJECT_DOOR_A, RESPAWN_ONE_DAY); SpawnBGObject(BG_EY_OBJECT_DOOR_H, RESPAWN_ONE_DAY); for(uint32 i = BG_EY_OBJECT_N_BANNER_FEL_REALVER_CENTER; i <= BG_EY_OBJECT_FLAG_NETHERSTORM; ++i) SpawnBGObject(i, RESPAWN_IMMEDIATELY); for(uint32 i = 0; i < EY_POINTS_MAX; ++i) { //randomly spawn buff uint8 buff = urand(0, 2); SpawnBGObject(BG_EY_OBJECT_SPEEDBUFF_FEL_REALVER + buff + i * 3, RESPAWN_IMMEDIATELY); } SendMessageToAll(GetMangosString(LANG_BG_EY_BEGIN)); PlaySoundToAll(SOUND_BG_START); SetStatus(STATUS_IN_PROGRESS); for(BattleGroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) if(Player *plr = objmgr.GetPlayer(itr->first)) plr->RemoveAurasDueToSpell(SPELL_PREPARATION); } } else if(GetStatus() == STATUS_IN_PROGRESS) { m_PointAddingTimer -= diff; if(m_PointAddingTimer <= 0) { m_PointAddingTimer = BG_EY_FPOINTS_TICK_TIME; if (m_TeamPointsCount[BG_TEAM_ALLIANCE] > 0) AddPoints(ALLIANCE, BG_EY_TickPoints[m_TeamPointsCount[BG_TEAM_ALLIANCE] - 1]); if (m_TeamPointsCount[BG_TEAM_HORDE] > 0) AddPoints(HORDE, BG_EY_TickPoints[m_TeamPointsCount[BG_TEAM_HORDE] - 1]); } if(m_FlagState == BG_EY_FLAG_STATE_WAIT_RESPAWN || m_FlagState == BG_EY_FLAG_STATE_ON_GROUND) { m_FlagsTimer -= diff; if(m_FlagsTimer < 0) { m_FlagsTimer = 0; if (m_FlagState == BG_EY_FLAG_STATE_WAIT_RESPAWN) RespawnFlag(true); else RespawnFlagAfterDrop(); } } m_TowerCapCheckTimer -= diff; if(m_TowerCapCheckTimer <= 0) { //check if player joined point /*I used this order of calls, because although we will check if one player is in gameobject's distance 2 times but we can count of players on current point in CheckSomeoneLeftPoint */ this->CheckSomeoneJoinedPoint(); //check if player left point this->CheckSomeoneLeftPoint(); this->UpdatePointStatuses(); m_TowerCapCheckTimer = BG_EY_FPOINTS_TICK_TIME; } } }
void BattleGroundAB::Update(uint32 diff) { BattleGround::Update(diff); if( GetStatus() == STATUS_WAIT_JOIN && GetPlayersSize() ) { ModifyStartDelayTime(diff); if( !(m_Events & 0x01) ) { m_Events |= 0x01; // setup here, only when at least one player has ported to the map if(!SetupBattleGround()) { EndNow(); return; } sLog.outDebug("Arathi Basin: entering state STATUS_WAIT_JOIN ..."); // despawn banners, auras and buffs for (int obj = BG_AB_OBJECT_BANNER_NEUTRAL; obj < BG_AB_DYNAMIC_NODES_COUNT * 8; ++obj) SpawnBGObject(obj, RESPAWN_ONE_DAY); for (int i = 0; i < BG_AB_DYNAMIC_NODES_COUNT * 3; ++i) SpawnBGObject(BG_AB_OBJECT_SPEEDBUFF_STABLES + i, RESPAWN_ONE_DAY); // Starting doors SpawnBGObject(BG_AB_OBJECT_GATE_A, RESPAWN_IMMEDIATELY); SpawnBGObject(BG_AB_OBJECT_GATE_H, RESPAWN_IMMEDIATELY); DoorClose(BG_AB_OBJECT_GATE_A); DoorClose(BG_AB_OBJECT_GATE_H); // Starting base spirit guides _NodeOccupied(BG_AB_SPIRIT_ALIANCE,ALLIANCE); _NodeOccupied(BG_AB_SPIRIT_HORDE,HORDE); SetStartDelayTime(START_DELAY0); } // After 1 minute, warning is signalled else if( GetStartDelayTime() <= START_DELAY1 && !(m_Events & 0x04) ) { m_Events |= 0x04; SendMessageToAll(GetMangosString(LANG_BG_AB_ONEMINTOSTART)); } // After 1,5 minute, warning is signalled else if( GetStartDelayTime() <= START_DELAY2 && !(m_Events & 0x08) ) { m_Events |= 0x08; SendMessageToAll(GetMangosString(LANG_BG_AB_HALFMINTOSTART)); } // After 2 minutes, gates OPEN ! x) else if( GetStartDelayTime() < 0 && !(m_Events & 0x10) ) { m_Events |= 0x10; SendMessageToAll(GetMangosString(LANG_BG_AB_STARTED)); // spawn neutral banners for (int banner = BG_AB_OBJECT_BANNER_NEUTRAL, i = 0; i < 5; banner += 8, ++i) SpawnBGObject(banner, RESPAWN_IMMEDIATELY); for (int i = 0; i < BG_AB_DYNAMIC_NODES_COUNT; ++i) { //randomly select buff to spawn uint8 buff = urand(0, 2); SpawnBGObject(BG_AB_OBJECT_SPEEDBUFF_STABLES + buff + i * 3, RESPAWN_IMMEDIATELY); } DoorOpen(BG_AB_OBJECT_GATE_A); DoorOpen(BG_AB_OBJECT_GATE_H); PlaySoundToAll(SOUND_BG_START); SetStatus(STATUS_IN_PROGRESS); for(BattleGroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) if(Player* plr = objmgr.GetPlayer(itr->first)) plr->RemoveAurasDueToSpell(SPELL_PREPARATION); } } else if( GetStatus() == STATUS_IN_PROGRESS ) { int team_points[2] = { 0, 0 }; for (int node = 0; node < BG_AB_DYNAMIC_NODES_COUNT; ++node) { // 3 sec delay to spawn new banner instead previous despawned one if( m_BannerTimers[node].timer ) { if( m_BannerTimers[node].timer > diff ) m_BannerTimers[node].timer -= diff; else { m_BannerTimers[node].timer = 0; _CreateBanner(node, m_BannerTimers[node].type, m_BannerTimers[node].teamIndex, false); } } // 1-minute to occupy a node from contested state if( m_NodeTimers[node] ) { if( m_NodeTimers[node] > diff ) m_NodeTimers[node] -= diff; else { m_NodeTimers[node] = 0; // Change from contested to occupied ! uint8 teamIndex = m_Nodes[node]-1; m_prevNodes[node] = m_Nodes[node]; m_Nodes[node] += 2; // burn current contested banner _DelBanner(node, BG_AB_NODE_TYPE_CONTESTED, teamIndex); // create new occupied banner _CreateBanner(node, BG_AB_NODE_TYPE_OCCUPIED, teamIndex, true); _SendNodeUpdate(node); _NodeOccupied(node,(teamIndex == 0) ? ALLIANCE:HORDE); // Message to chatlog char buf[256]; uint8 type = (teamIndex == 0) ? CHAT_MSG_BG_SYSTEM_ALLIANCE : CHAT_MSG_BG_SYSTEM_HORDE; sprintf(buf, GetMangosString(LANG_BG_AB_NODE_TAKEN), (teamIndex == 0) ? GetMangosString(LANG_BG_AB_ALLY) : GetMangosString(LANG_BG_AB_HORDE), _GetNodeName(node)); WorldPacket data; ChatHandler::FillMessageData(&data, NULL, type, LANG_UNIVERSAL, NULL, 0, buf, NULL); SendPacketToAll(&data); PlaySoundToAll((teamIndex == 0) ? SOUND_NODE_CAPTURED_ALLIANCE : SOUND_NODE_CAPTURED_HORDE); } } for (int team = 0; team < 2; ++team) if( m_Nodes[node] == team + BG_AB_NODE_TYPE_OCCUPIED ) ++team_points[team]; } // Accumulate points for (int team = 0; team < 2; ++team) { int points = team_points[team]; if( !points ) continue; m_lastTick[team] += diff; if( m_lastTick[team] > BG_AB_TickIntervals[points] ) { m_lastTick[team] -= BG_AB_TickIntervals[points]; m_TeamScores[team] += BG_AB_TickPoints[points]; m_HonorScoreTics[team] += BG_AB_TickPoints[points]; m_ReputationScoreTics[team] += BG_AB_TickPoints[points]; if( m_ReputationScoreTics[team] >= 200 ) { (team == BG_TEAM_ALLIANCE) ? RewardReputationToTeam(509, 10, ALLIANCE) : RewardReputationToTeam(510, 10, HORDE); m_ReputationScoreTics[team] -= 200; } if( m_HonorScoreTics[team] >= BG_HONOR_SCORE_TICKS ) { (team == BG_TEAM_ALLIANCE) ? RewardHonorToTeam(20, ALLIANCE) : RewardHonorToTeam(20, HORDE); m_HonorScoreTics[team] -= BG_HONOR_SCORE_TICKS; } if( !m_IsInformedNearVictory && m_TeamScores[team] > 1800 ) { if( team == BG_TEAM_ALLIANCE ) SendMessageToAll(GetMangosString(LANG_BG_AB_A_NEAR_VICTORY)); else SendMessageToAll(GetMangosString(LANG_BG_AB_H_NEAR_VICTORY)); PlaySoundToAll(SOUND_NEAR_VICTORY); m_IsInformedNearVictory = true; } if( m_TeamScores[team] > 2000 ) m_TeamScores[team] = 2000; if( team == BG_TEAM_ALLIANCE ) UpdateWorldState(BG_AB_OP_RESOURCES_ALLY, m_TeamScores[team]); if( team == BG_TEAM_HORDE ) UpdateWorldState(BG_AB_OP_RESOURCES_HORDE, m_TeamScores[team]); } } // Test win condition if( m_TeamScores[BG_TEAM_ALLIANCE] >= 2000 ) EndBattleGround(ALLIANCE); if( m_TeamScores[BG_TEAM_HORDE] >= 2000 ) EndBattleGround(HORDE); } }
bool BattlegroundIC::SetupBattleground() { // Spawn all GameObjects for (int i = 0 ; i < MAX_BG_IC_OBJ; ++i) { //Coordinate of GameObject float x,y,z,o; x=BG_IC_OBJ[i].x; y=BG_IC_OBJ[i].y; z=BG_IC_OBJ[i].z; o=BG_IC_OBJ[i].o; //Id of GameObject (relative to this script) uint8 id=BG_IC_OBJ[i].id; switch(BG_IC_OBJ[i].type) { //If object is a flag there is 3 GameObject associate : // The flag (clickable) // The aura // The case IC_TYPE_FLAG: { //Node id: for identify witch flag is it (for know what happen when clicking on flag) uint8 NodeId=BG_IC_OBJ[i].nodeid; uint32 BanneAura=0; uint32 BannerFlag=0; m_IC_NodeData[NodeId].current=BG_IC_OBJ[i].state; m_IC_NodeData[NodeId].previous=BG_IC_OBJ[i].state; m_IC_NodeData[NodeId].object_aura=id+2; m_IC_NodeData[NodeId].object_flag=id+1; m_IC_NodeData[NodeId].timeleft=0; for(int ws=0 ;ws<5 ;ws++) m_IC_NodeData[NodeId].worldstate[ws]=IC_InitNodeData[NodeId].worldstate[ws]; for(int gobid=0 ;gobid<5 ;gobid++) m_IC_NodeData[NodeId].gobentry[gobid]=IC_InitNodeData[NodeId].gobentry[gobid]; uint8 state=BG_IC_OBJ[i].state; switch(state) { case STATE_NEUTRAL: BanneAura=BG_IC_OBJECTID_AURA_C;break; case STATE_BANNER_ALLY: BanneAura=BG_IC_OBJECTID_AURA_A;break; case STATE_BANNER_HORDE: BanneAura=BG_IC_OBJECTID_AURA_H;break; default: sLog.outError("BattlegroundIC::SetupBattleground() Object: %i, bad state: %u",i,BG_IC_OBJ[i].state); return false; } BannerFlag=m_IC_NodeData[NodeId].gobentry[state]; //Spawn the pillar if(!AddObject(id,BG_IC_OBJ[i].entry,x,y,z,o,0,0,0,0,RESPAWN_ONE_DAY)) return false; //Spaw the aura if(!AddObject(id+2,BanneAura,x,y,z,o,0,0,0,0,RESPAWN_ONE_DAY)) return false; //Spawn the Flag if(!AddObject(id+1,BannerFlag,x,y,z,o,0,0,0,0,RESPAWN_ONE_DAY)) return false; //Set flag faction GetBGObject(id+1)->SetUInt32Value(GAMEOBJECT_FACTION, BG_IC_OBJ[i].faction); //if flag is clickable or not on start (like flag in the keep): if(BG_IC_OBJ[i].usable) GetBGObject(id+1)->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE); else GetBGObject(id+1)->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE); break; } //If door type: there are two GameObject: // Destructible object (building) // Door witch can be open close (for start) case IC_TYPE_DOOR_H: { // DoorId, for identify the door for event when destroy etc... uint8 DoorId=BG_IC_OBJ[i].nodeid; //Spawn destructible part if(!AddObject(id,BG_IC_OBJ[i].entry,x,y,z,o,0,0,0,0,RESPAWN_ONE_DAY)) return false; //Spawn door if(!AddObject(id+1,BG_IC_OBJECTID_GATE_H,x,y,z,o,0,0,0,0,RESPAWN_ONE_DAY)) return false; //Door faction GetBGObject(id)->SetUInt32Value(GAMEOBJECT_FACTION, BG_IC_OBJ[i].faction); GetBGObject(id)->SetGoState(GO_STATE_ACTIVE);//As on retail //Door must not be usable GetBGObject(id+1)->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE); //Stock door data for use it in script after m_IC_DoorData[DoorId].object_door=id+1; m_IC_DoorData[DoorId].object_build=id; m_IC_DoorData[DoorId].state=IC_InitDoorData[DoorId].state; //Worldstate for(int ws=0 ;ws<2 ;ws++) m_IC_DoorData[DoorId].worldstate[ws]=IC_InitDoorData[DoorId].worldstate[ws]; break; } //If door type: there are two GameObject: // Destructible object (building) // Door witch can be open close (for start) case IC_TYPE_DOOR_A: { // DoorId, for identify the door for event when destroy etc... uint8 DoorId=BG_IC_OBJ[i].nodeid; //Spawn destructible part if(!AddObject(id,BG_IC_OBJ[i].entry,x,y,z,o,0,0,0,0,RESPAWN_ONE_DAY)) return false; //Spawn door if(!AddObject(id+1,BG_IC_OBJECTID_GATE_A,x,y,z,o,0,0,0,0,RESPAWN_ONE_DAY)) return false; //DoorFaction GetBGObject(id)->SetUInt32Value(GAMEOBJECT_FACTION, BG_IC_OBJ[i].faction); GetBGObject(id)->SetGoState(GO_STATE_ACTIVE);//As on retail //Door must not be usable GetBGObject(id+1)->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE); //Stock door data for use it in script after m_IC_DoorData[DoorId].object_door=id+1; m_IC_DoorData[DoorId].object_build=id; m_IC_DoorData[DoorId].state=IC_InitDoorData[DoorId].state; //Worldstate for(int ws=0 ;ws<2 ;ws++) m_IC_DoorData[DoorId].worldstate[ws]=IC_InitDoorData[DoorId].worldstate[ws]; break; } //If object is teleporter: There are two GameObject // The teleporter // The aura case IC_TYPE_TELEPORT_H: { // Spawn teleporter if(!AddObject(id,BG_IC_OBJ[i].entry,x,y,z,o,0,0,0,0,RESPAWN_ONE_DAY)) return false; // Spawn Aura if(!AddObject(id+1,BG_IC_OBJECTID_AURA_TELEPORTER_H,x,y,z+0.2f,o,0,0,0,0,RESPAWN_ONE_DAY)) return false; //Disable teleporter, must be active on battle start. GetBGObject(id)->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE); GetBGObject(id+1)->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE); GetBGObject(id)->SetUInt32Value(GAMEOBJECT_FACTION, BG_IC_OBJ[i].faction); break; } //If object is teleporter: There are two GameObject // The teleporter // The aura case IC_TYPE_TELEPORT_A: { // Spawn teleporter if(!AddObject(id,BG_IC_OBJ[i].entry,x,y,z,o,0,0,0,0,RESPAWN_ONE_DAY)) return false; // Spawn Aura if(!AddObject(id+1,BG_IC_OBJECTID_AURA_TELEPORTER_A,x,y,z+0.000676f,o,0,0,0,0,RESPAWN_ONE_DAY)) return false; //Disable teleporter, must be active on battle start. GetBGObject(id)->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE); GetBGObject(id+1)->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE); GetBGObject(id)->SetUInt32Value(GAMEOBJECT_FACTION, BG_IC_OBJ[i].faction); break; } // if type is bomb: only one GameObject case IC_TYPE_BOMB: { //Spawn object if(!AddObject(id,BG_IC_OBJ[i].entry,x,y,z,o,0,0,0,0,RESPAWN_ONE_DAY)) return false; //Disable bomb, active on start GetBGObject(id)->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE); //TODO: 10 sec respawn time ? break; } //Decoration like bonfire case IC_TYPE_DECORATION: { //Spawn GameObject if(!AddObject(id,BG_IC_OBJ[i].entry,x,y,z,o,0,0,0,0,RESPAWN_ONE_DAY)) return false; break; } //The door associate to keep case IC_TYPE_LAST_DOOR_H: //Open when one of three door of Horde keep is destroy case IC_TYPE_LAST_DOOR_A: //Open when one of three door of Alliance keep is destroy case IC_TYPE_TOWER_DOOR: //Open on battleground start { //Spawn GameObject if(!AddObject(id,BG_IC_OBJ[i].entry,x,y,z,o,0,0,0,0,RESPAWN_ONE_DAY)) return false; //Close door GetBGObject(id)->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE); break; } } if(m_BgObjects[id] && GetBGObject(id)) GetBGObject(id)->setActive(true); } //GameObject are create but no spawn, now we must spawn (set visible) for (int obj = 0 ; obj < BG_IC_MAX_OBJECT; obj++) SpawnBGObject(obj, RESPAWN_IMMEDIATELY); //Spawn all spirit guide in each GY for(int i=BG_IC_ALLIANCE_KEEP;i<BG_IC_ALL_NODES_COUNT;i++) if (!AddSpiritGuide(i, BG_IC_SpiritGuidePos[i][0], BG_IC_SpiritGuidePos[i][1], BG_IC_SpiritGuidePos[i][2], BG_IC_SpiritGuidePos[i][3], BG_IC_graveInitTeam[i])) { sLog.outError("Failed to spawn spirit guide! point: %u, team: %u,", i, BG_IC_graveInitTeam[i]); return false; } //Npc spawning for (int i = 0 ; i < MAX_BG_IC_NPC; ++i) { float x,y,z,o; x=BG_IC_NPC[i].x; y=BG_IC_NPC[i].y; z=BG_IC_NPC[i].z; o=BG_IC_NPC[i].o; uint8 id=BG_IC_NPC[i].id; switch(BG_IC_NPC[i].type) { case IC_TYPE_NONE: case IC_TYPE_KEEP_GUN: if(!AddCreature(BG_IC_NPC[i].entry,id,BG_IC_NPC[i].faction,x,y,z,o,BG_IC_NPC[i].respawn)) return false; GetBGCreature(id)->setFaction(BG_IC_NPC[i].faction==FACTION_ALLIANCE?FACTION_NPC_ALLIANCE:FACTION_NPC_HORDE); break; } } //Spawning Gunship... in general system, there are spawn on server start and not on map loading... so for have // one transport for each battleground it's difficult without manual spawn m_GunshipA = MakeTransport(195121,120000,"IC - horde gunship"); m_GunshipH = MakeTransport(195276,120000,"IC - alliance gunship"); //Send transport init packet to all player in map for (BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end();itr++) { if (Player* p = sObjectMgr.GetPlayer(itr->first)) { SendTransportInit(p); } } return true; }
bool BattlegroundIC::SetupBattleground() { for (uint8 i = 0; i < MAX_NORMAL_GAMEOBJECTS_SPAWNS; i++) { if (!AddObject(BG_IC_ObjSpawnlocs[i].type, BG_IC_ObjSpawnlocs[i].entry, BG_IC_ObjSpawnlocs[i].x, BG_IC_ObjSpawnlocs[i].y, BG_IC_ObjSpawnlocs[i].z, BG_IC_ObjSpawnlocs[i].o, 0, 0, 0, 0, RESPAWN_ONE_DAY)) { sLog->outError("Isle of Conquest: There was an error spawning gameobject %u", BG_IC_ObjSpawnlocs[i].entry); return false; } } for (uint8 i = 0; i < MAX_NORMAL_NPCS_SPAWNS; i++) { Creature *temp = AddCreature(BG_IC_NpcSpawnlocs[i].entry, BG_IC_NpcSpawnlocs[i].type, BG_IC_NpcSpawnlocs[i].team, BG_IC_NpcSpawnlocs[i].x, BG_IC_NpcSpawnlocs[i].y, BG_IC_NpcSpawnlocs[i].z, BG_IC_NpcSpawnlocs[i].o, RESPAWN_ONE_DAY); if (!temp) { sLog->outError("Isle of Conquest: There was an error spawning creature %u", BG_IC_NpcSpawnlocs[i].entry); return false; } if (temp->GetEntry() == NPC_OVERLORD_AGMAR || temp->GetEntry() == NPC_HIGH_COMMANDER_HALFORD_WYRMBANE) temp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); } if (!AddSpiritGuide(BG_IC_NPC_SPIRIT_GUIDE_1+5, BG_IC_SpiritGuidePos[5][0], BG_IC_SpiritGuidePos[5][1], BG_IC_SpiritGuidePos[5][2], BG_IC_SpiritGuidePos[5][3], ALLIANCE) || !AddSpiritGuide(BG_IC_NPC_SPIRIT_GUIDE_1+6, BG_IC_SpiritGuidePos[6][0], BG_IC_SpiritGuidePos[6][1], BG_IC_SpiritGuidePos[6][2], BG_IC_SpiritGuidePos[6][3], HORDE) || !AddSpiritGuide(BG_IC_NPC_SPIRIT_GUIDE_1+3, BG_IC_SpiritGuidePos[7][0], BG_IC_SpiritGuidePos[7][1], BG_IC_SpiritGuidePos[7][2], BG_IC_SpiritGuidePos[7][3], ALLIANCE) || !AddSpiritGuide(BG_IC_NPC_SPIRIT_GUIDE_1+4, BG_IC_SpiritGuidePos[8][0], BG_IC_SpiritGuidePos[8][1], BG_IC_SpiritGuidePos[8][2], BG_IC_SpiritGuidePos[8][3], HORDE)) { sLog->outError("Isle of Conquest: Failed to spawn initial spirit guide!"); return false; } gunshipHorde = CreateTransport(GO_HORDE_GUNSHIP, TRANSPORT_PERIOD_TIME); gunshipAlliance = CreateTransport(GO_ALLIANCE_GUNSHIP, TRANSPORT_PERIOD_TIME); if (!gunshipAlliance || !gunshipHorde) { sLog->outError("Isle of Conquest: There was an error creating gunships!"); return false; } //Send transport init packet to all player in map for (BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end();itr++) { if (Player* player = sObjectMgr->GetPlayer(itr->first)) SendTransportInit(player); } // setting correct factions for Keep Cannons for (uint8 i = BG_IC_NPC_KEEP_CANNON_1; i < BG_IC_NPC_KEEP_CANNON_12; i++) GetBGCreature(i)->setFaction(BG_IC_Factions[0]); for (uint8 i = BG_IC_NPC_KEEP_CANNON_13; i < BG_IC_NPC_KEEP_CANNON_25; i++) GetBGCreature(i)->setFaction(BG_IC_Factions[1]); // correcting spawn time for keeps bombs for (uint8 i = BG_IC_GO_HUGE_SEAFORIUM_BOMBS_A_1; i < BG_IC_GO_HUGE_SEAFORIUM_BOMBS_H_4; i++) GetBGObject(i)->SetRespawnTime(10); return true; }
void BattlegroundEY::Update(uint32 diff) { Battleground::Update(diff); if (GetStatus() == STATUS_IN_PROGRESS) { m_PointAddingTimer -= diff; if (m_PointAddingTimer <= 0) { m_PointAddingTimer = BG_EY_FPOINTS_TICK_TIME; if (m_TeamPointsCount[BG_TEAM_ALLIANCE] > 0) AddPoints(ALLIANCE, BG_EY_TickPoints[m_TeamPointsCount[BG_TEAM_ALLIANCE] - 1]); if (m_TeamPointsCount[BG_TEAM_HORDE] > 0) AddPoints(HORDE, BG_EY_TickPoints[m_TeamPointsCount[BG_TEAM_HORDE] - 1]); } if (m_FlagState == BG_EY_FLAG_STATE_WAIT_RESPAWN || m_FlagState == BG_EY_FLAG_STATE_ON_GROUND) { m_FlagsTimer -= diff; if (m_FlagsTimer < 0) { m_FlagsTimer = 0; if (m_FlagState == BG_EY_FLAG_STATE_WAIT_RESPAWN) RespawnFlag(true); else RespawnFlagAfterDrop(); } } m_TowerCapCheckTimer -= diff; if (m_TowerCapCheckTimer <= 0) { //check if player joined point /*I used this order of calls, because although we will check if one player is in gameobject's distance 2 times but we can count of players on current point in CheckSomeoneLeftPoint */ this->CheckSomeoneJoinedPoint(); //check if player left point this->CheckSomeoneLeftPoint(); this->UpdatePointStatuses(); m_TowerCapCheckTimer = BG_EY_FPOINTS_TICK_TIME; } } if (GetStatus() == STATUS_WAIT_JOIN) { m_CheatersCheckTimer -= diff; if(m_CheatersCheckTimer <= 0) { for(BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) { Player * plr = sObjectMgr->GetPlayer(itr->first); if (!plr || !plr->IsInWorld()) continue; if (plr->GetPositionZ() < 1249) { if (plr->GetTeam() == HORDE) plr->TeleportTo(566, 1807.73f, 1539.41f, 1267.63f, plr->GetOrientation(), 0); else plr->TeleportTo(566, 2523.68f, 1596.59f, 1269.35f, plr->GetOrientation(), 0); } } m_CheatersCheckTimer = 3000; } } }
void BattlegroundSA::PostUpdateImpl(uint32 diff) { if (InitSecondRound) { if (UpdateWaitTimer < diff) { if (!SignaledRoundTwo) { SignaledRoundTwo = true; InitSecondRound = false; SendMessageToAll(LANGUAGE_BG_SA_ROUND_TWO_ONE_MINUTE, CHAT_MSG_BG_SYSTEM_NEUTRAL); } } else { UpdateWaitTimer -= diff; return; } } TotalTime += diff; if (Status == BG_SA_WARMUP ) { EndRoundTimer = BG_SA_ROUNDLENGTH; if (TotalTime >= BG_SA_WARMUPLENGTH) { TotalTime = 0; ToggleTimer(); DemolisherStartState(false); Status = BG_SA_ROUND_ONE; StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, (Attackers == TEAM_ALLIANCE) ? 23748 : 21702); } if (TotalTime >= BG_SA_BOAT_START) StartShips(); return; } else if (Status == BG_SA_SECOND_WARMUP) { if (RoundScores[0].time<BG_SA_ROUNDLENGTH) EndRoundTimer = RoundScores[0].time; else EndRoundTimer = BG_SA_ROUNDLENGTH; if (TotalTime >= 60000) { SendWarningToAll(LANGUAGE_BG_SA_HAS_BEGUN); TotalTime = 0; ToggleTimer(); DemolisherStartState(false); Status = BG_SA_ROUND_TWO; StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, (Attackers == TEAM_ALLIANCE) ? 23748 : 21702); // status was set to STATUS_WAIT_JOIN manually for Preparation, set it back now SetStatus(STATUS_IN_PROGRESS); for (BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) if (Player* p = ObjectAccessor::FindPlayer(itr->first)) p->RemoveAurasDueToSpell(SPELL_PREPARATION); } // Hmmmz if boats travel time is 1m23secs(for travel, and prepartion), then why is 2nd round 2m30secs, // team on boats will arrive and start b4 team does on land... these should be same times if (TotalTime >= 30000) { if (!SignaledRoundTwoHalfMin) { SignaledRoundTwoHalfMin = true; SendMessageToAll(LANGUAGE_BG_SA_ROUND_TWO_START_HALF_MINUTE, CHAT_MSG_BG_SYSTEM_NEUTRAL); } } StartShips(); return; } else if (GetStatus() == STATUS_IN_PROGRESS) { if (Status == BG_SA_ROUND_ONE) { if (TotalTime >= BG_SA_ROUNDLENGTH) { RoundScores[0].winner = Attackers; RoundScores[0].time = BG_SA_ROUNDLENGTH; TotalTime = 0; Status = BG_SA_SECOND_WARMUP; Attackers = (Attackers == TEAM_ALLIANCE) ? TEAM_HORDE : TEAM_ALLIANCE; UpdateWaitTimer = 5000; SignaledRoundTwo = false; SignaledRoundTwoHalfMin = false; InitSecondRound = true; ToggleTimer(); ResetObjs(); return; } } else if (Status == BG_SA_ROUND_TWO) { if (TotalTime >= EndRoundTimer) { RoundScores[1].time = BG_SA_ROUNDLENGTH; RoundScores[1].winner = (Attackers == TEAM_ALLIANCE) ? TEAM_HORDE : TEAM_ALLIANCE; if (RoundScores[0].time == RoundScores[1].time) EndBattleground(0); else if (RoundScores[0].time < RoundScores[1].time) EndBattleground(RoundScores[0].winner == TEAM_ALLIANCE ? ALLIANCE : HORDE); else EndBattleground(RoundScores[1].winner == TEAM_ALLIANCE ? ALLIANCE : HORDE); return; } } if (Status == BG_SA_ROUND_ONE || Status == BG_SA_ROUND_TWO) { SendTime(); UpdateDemolisherSpawns(); } } }
void BattleGroundWS::Update(uint32 diff) { BattleGround::Update(diff); // after bg start we get there (once) if (GetStatus() == STATUS_WAIT_JOIN && GetPlayersSize()) { ModifyStartDelayTime(diff); if (!(m_Events & 0x01)) { m_Events |= 0x01; // setup here, only when at least one player has ported to the map if (!SetupBattleGround()) { EndNow(); return; } // for (uint32 i = WS_SPIRIT_MAIN_ALLIANCE; i <= WS_SPIRIT_MAIN_HORDE; i++) // SpawnBGCreature(i, RESPAWN_IMMEDIATELY); for (uint32 i = BG_WS_OBJECT_DOOR_A_1; i <= BG_WS_OBJECT_DOOR_H_4; i++) { SpawnBGObject(i, RESPAWN_IMMEDIATELY); DoorClose(i); } for (uint32 i = BG_WS_OBJECT_A_FLAG; i <= BG_WS_OBJECT_BERSERKBUFF_2; i++) SpawnBGObject(i, RESPAWN_ONE_DAY); SetStartDelayTime(START_DELAY0); } // After 1 minute, warning is signalled else if (GetStartDelayTime() <= START_DELAY1 && !(m_Events & 0x04)) { m_Events |= 0x04; SendMessageToAll(GetTrinityString(LANG_BG_WS_ONE_MINUTE)); } // After 1,5 minute, warning is signalled else if (GetStartDelayTime() <= START_DELAY2 && !(m_Events & 0x08)) { m_Events |= 0x08; SendMessageToAll(GetTrinityString(LANG_BG_WS_HALF_MINUTE)); } // After 2 minutes, gates OPEN ! x) else if (GetStartDelayTime() < 0 && !(m_Events & 0x10)) { m_Events |= 0x10; for (uint32 i = BG_WS_OBJECT_DOOR_A_1; i <= BG_WS_OBJECT_DOOR_A_4; i++) DoorOpen(i); for (uint32 i = BG_WS_OBJECT_DOOR_H_1; i <= BG_WS_OBJECT_DOOR_H_2; i++) DoorOpen(i); SpawnBGObject(BG_WS_OBJECT_DOOR_A_5, RESPAWN_ONE_DAY); SpawnBGObject(BG_WS_OBJECT_DOOR_A_6, RESPAWN_ONE_DAY); SpawnBGObject(BG_WS_OBJECT_DOOR_H_3, RESPAWN_ONE_DAY); SpawnBGObject(BG_WS_OBJECT_DOOR_H_4, RESPAWN_ONE_DAY); for (uint32 i = BG_WS_OBJECT_A_FLAG; i <= BG_WS_OBJECT_BERSERKBUFF_2; i++) SpawnBGObject(i, RESPAWN_IMMEDIATELY); SendMessageToAll(GetTrinityString(LANG_BG_WS_BEGIN)); PlaySoundToAll(SOUND_BG_START); if (sWorld.getConfig(CONFIG_BG_START_MUSIC)) PlaySoundToAll(SOUND_BG_START_L70ETC); //MUSIC - Custom config SetStatus(STATUS_IN_PROGRESS); for (BattleGroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) if (Player* plr = sObjectMgr.GetPlayer(itr->first)) plr->RemoveAurasDueToSpell(SPELL_PREPARATION); } } else if (GetStatus() == STATUS_IN_PROGRESS) { if (m_FlagState[BG_TEAM_ALLIANCE] == BG_WS_FLAG_STATE_WAIT_RESPAWN) { m_FlagsTimer[BG_TEAM_ALLIANCE] -= diff; if (m_FlagsTimer[BG_TEAM_ALLIANCE] < 0) { m_FlagsTimer[BG_TEAM_ALLIANCE] = 0; RespawnFlag(ALLIANCE, true); } } if (m_FlagState[BG_TEAM_ALLIANCE] == BG_WS_FLAG_STATE_ON_GROUND) { m_FlagsDropTimer[BG_TEAM_ALLIANCE] -= diff; if (m_FlagsDropTimer[BG_TEAM_ALLIANCE] < 0) { m_FlagsDropTimer[BG_TEAM_ALLIANCE] = 0; RespawnFlagAfterDrop(ALLIANCE); m_BothFlagsKept = false; } } if (m_FlagState[BG_TEAM_HORDE] == BG_WS_FLAG_STATE_WAIT_RESPAWN) { m_FlagsTimer[BG_TEAM_HORDE] -= diff; if (m_FlagsTimer[BG_TEAM_HORDE] < 0) { m_FlagsTimer[BG_TEAM_HORDE] = 0; RespawnFlag(HORDE, true); } } if (m_FlagState[BG_TEAM_HORDE] == BG_WS_FLAG_STATE_ON_GROUND) { m_FlagsDropTimer[BG_TEAM_HORDE] -= diff; if (m_FlagsDropTimer[BG_TEAM_HORDE] < 0) { m_FlagsDropTimer[BG_TEAM_HORDE] = 0; RespawnFlagAfterDrop(HORDE); m_BothFlagsKept = false; } } if (m_BothFlagsKept) { m_FlagSpellForceTimer += diff; if (m_FlagDebuffState == 0 && m_FlagSpellForceTimer >= 600000) //10 minutes { if (Player * plr = sObjectMgr.GetPlayer(m_FlagKeepers[0])) plr->CastSpell(plr,WS_SPELL_FOCUSED_ASSAULT,true); if (Player * plr = sObjectMgr.GetPlayer(m_FlagKeepers[1])) plr->CastSpell(plr,WS_SPELL_FOCUSED_ASSAULT,true); m_FlagDebuffState = 1; } else if (m_FlagDebuffState == 1 && m_FlagSpellForceTimer >= 900000) //15 minutes { if (Player * plr = sObjectMgr.GetPlayer(m_FlagKeepers[0])) { plr->RemoveAurasDueToSpell(WS_SPELL_FOCUSED_ASSAULT); plr->CastSpell(plr,WS_SPELL_BRUTAL_ASSAULT,true); } if (Player * plr = sObjectMgr.GetPlayer(m_FlagKeepers[1])) { plr->RemoveAurasDueToSpell(WS_SPELL_FOCUSED_ASSAULT); plr->CastSpell(plr,WS_SPELL_BRUTAL_ASSAULT,true); } m_FlagDebuffState = 2; } } else { m_FlagSpellForceTimer = 0; //reset timer. m_FlagDebuffState = 0; } } }
void BattleGroundAV::Update(uint32 diff) { BattleGround::Update(diff); if (GetStatus() == STATUS_WAIT_JOIN && GetPlayersSize()) { ModifyStartDelayTime(diff); if (!(m_Events & 0x01)) { m_Events |= 0x01; if(!SetupBattleGround()) { EndNow(); return; } sLog.outDebug("Alterac Valley: entering state STATUS_WAIT_JOIN ..."); SetStartDelayTime(START_DELAY0); } // After 1 minute, warning is signalled else if (GetStartDelayTime() <= START_DELAY1 && !(m_Events & 0x04)) { m_Events |= 0x04; SendMessageToAll(GetMangosString(LANG_BG_AV_START_ONE_MINUTE)); } // After 1,5 minute, warning is signalled else if (GetStartDelayTime() <= START_DELAY2 && !(m_Events & 0x08)) { m_Events |= 0x08; SendMessageToAll(GetMangosString(LANG_BG_AV_START_HALF_MINUTE)); } // After 2 minutes, gates OPEN ! x) else if (GetStartDelayTime() <= 0 && !(m_Events & 0x10)) { UpdateWorldState(BG_AV_SHOW_H_SCORE, 1); UpdateWorldState(BG_AV_SHOW_A_SCORE, 1); m_Events |= 0x10; SendMessageToAll(GetMangosString(LANG_BG_AV_HAS_BEGUN)); PlaySoundToAll(SOUND_BG_START); SetStatus(STATUS_IN_PROGRESS); OpenDoorEvent(BG_EVENT_DOOR); for(BattleGroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) if(Player* plr = sObjectMgr.GetPlayer(itr->first)) plr->RemoveAurasDueToSpell(SPELL_PREPARATION); } } if (GetStatus() != STATUS_IN_PROGRESS) return; // add points from mine owning, and look if the neutral team can reclaim the mine for(uint8 mine = 0; mine < BG_AV_MAX_MINES; mine++) { if (m_Mine_Owner[mine] == BG_TEAM_ALLIANCE || m_Mine_Owner[mine] == BG_TEAM_HORDE) { m_Mine_Timer[mine] -=diff; if (m_Mine_Timer[mine] <= 0) { UpdateScore(BattleGroundTeamId(m_Mine_Owner[mine]), 1); m_Mine_Timer[mine] = BG_AV_MINE_TICK_TIMER; } if (m_Mine_Reclaim_Timer[mine] > diff) m_Mine_Reclaim_Timer[mine] -= diff; else ChangeMineOwner(mine, BG_AV_NEUTRAL_TEAM); } } // looks for all timers of the nodes and destroy the building (for graveyards the building wont get destroyed, it goes just to the other team for(BG_AV_Nodes i = BG_AV_NODES_FIRSTAID_STATION; i < BG_AV_NODES_MAX; ++i) { if (m_Nodes[i].State == POINT_ASSAULTED) { if (m_Nodes[i].Timer > diff) m_Nodes[i].Timer -= diff; else EventPlayerDestroyedPoint(i); } } }
void BattleGroundSA::EventPlayerDamageGO(Player *player, GameObject* target_obj, uint32 eventId, uint32 doneBy) { TeamIndex teamIndex = GetTeamIndex(player->GetTeam()); // Seaforium Charge Explosion if (doneBy == 52408) player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, BG_SA_PLANT_SEAFORIUM_CHARGE); BG_SA_GoType type = BG_SA_GO_GATES_T_NONE; switch (target_obj->GetEntry()) { case BG_SA_GO_GATES_ROOM_ANCIENT_SHRINE: { type = BG_SA_GO_GATES_T_ROOM_ANCIENT_SHRINE; switch (eventId) { case 21630: if (!GateRoomAncientShrineDamaged) { SendMessageSA(player, BG_SA_ATTACK, _GatesName(target_obj)); GateRoomAncientShrineDamaged = true; } break; case 19836: SendWarningToAllSA(SA_EVENT_NONE, TEAM_NONE, true, type); UpdateWorldState(BG_SA_GateStatus[type], (GetDefender() == HORDE) ? 5 : 2); GateStatus[type] = BG_SA_GO_GATES_DAMAGE; break; case 19837: SendWarningToAllSA(SA_EVENT_NONE, TEAM_NONE, true, type, true); UpdateWorldState(BG_SA_GateStatus[type], (GetDefender() == HORDE) ? 6 : 3); GateStatus[type] = BG_SA_GO_GATES_DESTROY; UpdatePlayerScore(player, SCORE_GATES_DESTROYED, 1); RewardHonorToTeam(100, (teamIndex == 0) ? ALLIANCE : HORDE); MakeInteractive(SA_EVENT_ADD_RELIC, (GetDefender() == ALLIANCE) ? 2 : 1, true); relicGateDestroyed = true; break; } break; } case BG_SA_GO_GATES_GREEN_EMERALD: { type = BG_SA_GO_GATES_T_GREEN_EMERALD; switch (eventId) { case 21630: if (!GateGreenEmeraldDamaged) { SendMessageSA(player, BG_SA_ATTACK, _GatesName(target_obj)); GateGreenEmeraldDamaged = true; } break; case 19041: SendWarningToAllSA(SA_EVENT_NONE, TEAM_NONE, true, type); UpdateWorldState(BG_SA_GateStatus[type], GateStatus[type] = BG_SA_GO_GATES_DAMAGE); break; case 19046: SendWarningToAllSA(SA_EVENT_NONE, TEAM_NONE, true, type, true); UpdateWorldState(BG_SA_GateStatus[type], GateStatus[type] = BG_SA_GO_GATES_DESTROY); UpdatePlayerScore(player, SCORE_GATES_DESTROYED, 1); RewardHonorToTeam(85, (teamIndex == 0) ? ALLIANCE : HORDE); // make western/eastern graveyard capturable for (int i = SA_EVENT_ADD_GRAVE_E; i <= SA_EVENT_ADD_GRAVE_W; i++) MakeInteractive(i, (GetDefender() == ALLIANCE) ? BG_SA_GRAVE_STATUS_ALLY_CONTESTED : BG_SA_GRAVE_STATUS_HORDE_CONTESTED, true); SpawnEvent(SA_EVENT_ADD_GREEN_SIGIL, 0, false); break; } break; } case BG_SA_GO_GATES_BLUE_SAPHIRE: { type = BG_SA_GO_GATES_T_BLUE_SAPHIRE; switch (eventId) { case 21630: if (!GateBlueSaphireDamaged) { SendMessageSA(player, BG_SA_ATTACK, _GatesName(target_obj)); GateBlueSaphireDamaged = true; } break; case 19040: SendWarningToAllSA(SA_EVENT_NONE, TEAM_NONE, true, type); UpdateWorldState(BG_SA_GateStatus[type], GateStatus[type] = BG_SA_GO_GATES_DAMAGE); break; case 19045: SendWarningToAllSA(SA_EVENT_NONE, TEAM_NONE, true, type, true); UpdateWorldState(BG_SA_GateStatus[type], GateStatus[type] = BG_SA_GO_GATES_DESTROY); UpdatePlayerScore(player, SCORE_GATES_DESTROYED, 1); RewardHonorToTeam(85, (teamIndex == 0) ? ALLIANCE : HORDE); // make western/eastern graveyard capturable for (int i = SA_EVENT_ADD_GRAVE_E; i <= SA_EVENT_ADD_GRAVE_W; i++) MakeInteractive(i, (GetDefender() == ALLIANCE) ? BG_SA_GRAVE_STATUS_ALLY_CONTESTED : BG_SA_GRAVE_STATUS_HORDE_CONTESTED, true); SpawnEvent(SA_EVENT_ADD_BLUE_SIGIL, 0, false); break; } break; } case BG_SA_GO_GATES_MAUVE_AMETHYST: { type = BG_SA_GO_GATES_T_MAUVE_AMETHYST; switch (eventId) { case 21630: if (!GateMauveAmethystDamaged) { SendMessageSA(player, BG_SA_ATTACK, _GatesName(target_obj)); GateMauveAmethystDamaged = true; } break; case 19043: SendWarningToAllSA(SA_EVENT_NONE, TEAM_NONE, true, type); UpdateWorldState(BG_SA_GateStatus[type], GateStatus[type] = BG_SA_GO_GATES_DAMAGE); break; case 19048: SendWarningToAllSA(SA_EVENT_NONE, TEAM_NONE, true, type, true); UpdateWorldState(BG_SA_GateStatus[type], GateStatus[type] = BG_SA_GO_GATES_DESTROY); UpdatePlayerScore(player, SCORE_GATES_DESTROYED, 1); RewardHonorToTeam(85, (teamIndex == 0) ? ALLIANCE : HORDE); // make the central graveyard capturable MakeInteractive(SA_EVENT_ADD_GRAVE_C, (GetDefender() == ALLIANCE) ? BG_SA_GRAVE_STATUS_ALLY_CONTESTED : BG_SA_GRAVE_STATUS_HORDE_CONTESTED, true); SpawnEvent(SA_EVENT_ADD_PURPLE_SIGIL, 0, false); break; } break; } case BG_SA_GO_GATES_RED_SUN: { type = BG_SA_GO_GATES_T_RED_SUN; switch (eventId) { case 21630: if (!GateRedSunDamaged) { SendMessageSA(player, BG_SA_ATTACK, _GatesName(target_obj)); GateRedSunDamaged = true; } break; case 19042: SendWarningToAllSA(SA_EVENT_NONE, TEAM_NONE, true, type); UpdateWorldState(BG_SA_GateStatus[type], GateStatus[type] = BG_SA_GO_GATES_DAMAGE); break; case 19047: SendWarningToAllSA(SA_EVENT_NONE, TEAM_NONE, true, type, true); UpdateWorldState(BG_SA_GateStatus[type], GateStatus[type] = BG_SA_GO_GATES_DESTROY); UpdatePlayerScore(player, SCORE_GATES_DESTROYED, 1); RewardHonorToTeam(85, (teamIndex == 0) ? ALLIANCE : HORDE); // make the central graveyard capturable MakeInteractive(SA_EVENT_ADD_GRAVE_C, (GetDefender() == ALLIANCE) ? BG_SA_GRAVE_STATUS_ALLY_CONTESTED : BG_SA_GRAVE_STATUS_HORDE_CONTESTED, true); SpawnEvent(SA_EVENT_ADD_RED_SIGIL, 0, false); break; } break; } case BG_SA_GO_GATES_YELLOW_MOON: { type = BG_SA_GO_GATES_T_YELLOW_MOON; switch (eventId) { case 21630: if (!GateYellowMoonDamaged) { SendMessageSA(player, BG_SA_ATTACK, _GatesName(target_obj)); GateYellowMoonDamaged = true; } break; case 19044: SendWarningToAllSA(SA_EVENT_NONE, TEAM_NONE, true, type); UpdateWorldState(BG_SA_GateStatus[type], GateStatus[type] = BG_SA_GO_GATES_DAMAGE); break; case 19049: SendWarningToAllSA(SA_EVENT_NONE, TEAM_NONE, true, type, true); UpdateWorldState(BG_SA_GateStatus[type], GateStatus[type] = BG_SA_GO_GATES_DESTROY); UpdatePlayerScore(player, SCORE_GATES_DESTROYED, 1); RewardHonorToTeam(85, (teamIndex == 0) ? ALLIANCE : HORDE); SpawnEvent(SA_EVENT_ADD_YELLOW_SIGIL, 0, false); break; } break; } case BG_SA_GO_TITAN_RELIC_A: case BG_SA_GO_TITAN_RELIC_H: { if (eventId == 20572 && player->GetTeam() != GetDefender()) { if (!relicGateDestroyed) { player->GetSession()->KickPlayer(); sLog.outError("Player %s has clicked SOTA Relic without Relic gate being destroyed", player->GetName()); return; } //Achievement Storm the Beach (1310) for (BattleGroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) { Player* plr = sObjectMgr.GetPlayer(itr->first); if (plr) { if (plr->GetTeam() != defender) plr->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, BG_SA_STORM_THE_BEACH); } } if (Phase == SA_ROUND_ONE) // Victory at first round { RoundScores[0].winner = GetDefender() == ALLIANCE ? HORDE : ALLIANCE; RoundScores[0].time = Round_timer; PlaySoundToAll(BG_SA_SOUND_GYD_VICTORY); SendMessageToAll(defender == HORDE ? LANG_BG_SA_ALLIANCE_END_1ROUND : LANG_BG_SA_HORDE_END_1ROUND, CHAT_MSG_BG_SYSTEM_NEUTRAL, NULL); SendWarningToAll(LANG_BG_SA_END_1ROUND); RewardHonorToTeam(150, (teamIndex == 0) ? ALLIANCE : HORDE); ResetBattle(player->GetTeam(), GetDefender()); } else // Victory at second round { RoundScores[1].winner = GetDefender() == ALLIANCE ? HORDE : ALLIANCE; SendMessageToAll(defender == HORDE ? LANG_BG_SA_ALLIANCE_END_2ROUND : LANG_BG_SA_HORDE_END_2ROUND, CHAT_MSG_BG_SYSTEM_NEUTRAL, NULL); RewardHonorToTeam(150, (teamIndex == 0) ? ALLIANCE : HORDE); EndBattleGround(player->GetTeam()); } } break; } } }
void Tractor::Update() { GetShape( 0 ).Rotate( M_PT_ZERO_ONE * 5 ); GetShape( 1 ).Rotate( -M_PT_ZERO_ONE * 5 ); if ( _power ) { GetShape( 3 ).Rotate( -M_PT_ZERO_ONE * 8 ); GetShape( 4 ).Rotate( M_PT_ZERO_ONE * 8 ); } if ( GetPosition()._x < 0 ) _dir.Set( 1, 0 ); else if ( GetPosition()._x > Lib::WIDTH ) _dir.Set( -1, 0 ); else if ( GetPosition()._y < 0 ) _dir.Set( 0, 1 ); else if ( GetPosition()._y > Lib::HEIGHT ) _dir.Set( 0, -1 ); else _timer++; if ( !_ready && !_spinning ) { Move( _dir * SPEED * ( IsOnScreen() ? M_ONE : M_TWO + M_HALF ) ); if ( _timer > TIMER * 8 ) { _ready = true; _timer = 0; } } else if ( _ready ) { if ( _timer > TIMER ) { _ready = false; _spinning = true; _timer = 0; _players = GetPlayers(); PlaySound( Lib::SOUND_BOSS_FIRE ); } } else if ( _spinning ) { Rotate( M_PT_ONE * 3 ); for ( unsigned int i = 0; i < _players.size(); i++ ) { if ( !( ( Player* )_players[ i ] )->IsKilled() ) { Vec2 d = GetPosition() - _players[ i ]->GetPosition(); d.Normalise(); _players[ i ]->Move( d * TRACTOR_SPEED ); } } if ( _timer % ( TIMER / 2 ) == 0 && IsOnScreen() && _power ) { Player* p = GetNearestPlayer(); Vec2 v = GetPosition(); Vec2 d = p->GetPosition() - v; d.Normalise(); Spawn( new SBBossShot( v, d * M_FOUR, 0xcc33ccff ) ); PlaySoundRandom( Lib::SOUND_BOSS_FIRE ); } if ( _timer > TIMER * 5 ) { _spinning = false; _timer = 0; } } }
void BattlegroundSA::PostUpdateImpl(uint32 diff) { if (InitSecondRound) { if (UpdateWaitTimer < diff) { if (!SignaledRoundTwo) { SignaledRoundTwo = true; InitSecondRound = false; SendMessageToAll(LANG_BG_SA_ROUND_TWO_ONE_MINUTE, CHAT_MSG_BG_SYSTEM_NEUTRAL); } } else { UpdateWaitTimer -= diff; return; } } TotalTime += diff; if (Status == BG_SA_WARMUP) { EndRoundTimer = BG_SA_ROUNDLENGTH; if (TotalTime >= BG_SA_WARMUPLENGTH) { if (Creature* c = GetBGCreature(BG_SA_NPC_KANRETHAD)) SendChatMessage(c, TEXT_ROUND_STARTED); TotalTime = 0; ToggleTimer(); DemolisherStartState(false); Status = BG_SA_ROUND_ONE; StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, (Attackers == TEAM_ALLIANCE) ? 23748 : 21702); } if (TotalTime >= BG_SA_BOAT_START) StartShips(); return; } else if (Status == BG_SA_SECOND_WARMUP) { if (RoundScores[0].time<BG_SA_ROUNDLENGTH) EndRoundTimer = RoundScores[0].time; else EndRoundTimer = BG_SA_ROUNDLENGTH; if (TotalTime >= 60000) { if (Creature* c = GetBGCreature(BG_SA_NPC_KANRETHAD)) SendChatMessage(c, TEXT_ROUND_STARTED); TotalTime = 0; ToggleTimer(); DemolisherStartState(false); _gateDestroyed = false; Status = BG_SA_ROUND_TWO; StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, (Attackers == TEAM_ALLIANCE) ? 23748 : 21702); // status was set to STATUS_WAIT_JOIN manually for Preparation, set it back now SetStatus(STATUS_IN_PROGRESS); for (BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) if (Player* p = ObjectAccessor::FindPlayer(itr->first)) p->RemoveAurasDueToSpell(SPELL_PREPARATION); } if (TotalTime >= 30000) { if (!SignaledRoundTwoHalfMin) { SignaledRoundTwoHalfMin = true; SendMessageToAll(LANG_BG_SA_ROUND_TWO_START_HALF_MINUTE, CHAT_MSG_BG_SYSTEM_NEUTRAL); } } StartShips(); return; } else if (GetStatus() == STATUS_IN_PROGRESS) { if (Status == BG_SA_ROUND_ONE) { if (TotalTime >= BG_SA_ROUNDLENGTH) { CastSpellOnTeam(SPELL_END_OF_ROUND, ALLIANCE); CastSpellOnTeam(SPELL_END_OF_ROUND, HORDE); RoundScores[0].winner = Attackers; RoundScores[0].time = BG_SA_ROUNDLENGTH; TotalTime = 0; Status = BG_SA_SECOND_WARMUP; Attackers = (Attackers == TEAM_ALLIANCE) ? TEAM_HORDE : TEAM_ALLIANCE; UpdateWaitTimer = 5000; SignaledRoundTwo = false; SignaledRoundTwoHalfMin = false; InitSecondRound = true; ToggleTimer(); ResetObjs(); GetBgMap()->UpdateAreaDependentAuras(); return; } } else if (Status == BG_SA_ROUND_TWO) { if (TotalTime >= EndRoundTimer) { CastSpellOnTeam(SPELL_END_OF_ROUND, ALLIANCE); CastSpellOnTeam(SPELL_END_OF_ROUND, HORDE); RoundScores[1].time = BG_SA_ROUNDLENGTH; RoundScores[1].winner = (Attackers == TEAM_ALLIANCE) ? TEAM_HORDE : TEAM_ALLIANCE; if (RoundScores[0].time == RoundScores[1].time) EndBattleground(0); else if (RoundScores[0].time < RoundScores[1].time) EndBattleground(RoundScores[0].winner == TEAM_ALLIANCE ? ALLIANCE : HORDE); else EndBattleground(RoundScores[1].winner == TEAM_ALLIANCE ? ALLIANCE : HORDE); return; } } if (Status == BG_SA_ROUND_ONE || Status == BG_SA_ROUND_TWO) { SendTime(); UpdateDemolisherSpawns(); } } }
void BattleGroundBE::Update(time_t diff) { BattleGround::Update(diff); // after bg start we get there if (GetStatus() == STATUS_WAIT_JOIN && GetPlayersSize()) { ModifyStartDelayTime(diff); if (!(m_Events & 0x01)) { m_Events |= 0x01; // setup here, only when at least one player has ported to the map if(!SetupBattleGround()) { EndNow(); return; } for(uint32 i = BG_BE_OBJECT_DOOR_1; i <= BG_BE_OBJECT_DOOR_4; i++) SpawnBGObject(i, RESPAWN_IMMEDIATELY); for(uint32 i = BG_BE_OBJECT_BUFF_1; i <= BG_BE_OBJECT_BUFF_2; i++) SpawnBGObject(i, RESPAWN_ONE_DAY); SetStartDelayTime(START_DELAY1); SendMessageToAll(LANG_ARENA_ONE_MINUTE); } // After 30 seconds, warning is signalled else if (GetStartDelayTime() <= START_DELAY2 && !(m_Events & 0x04)) { m_Events |= 0x04; SendMessageToAll(LANG_ARENA_THIRTY_SECONDS); } // After 15 seconds, warning is signalled else if (GetStartDelayTime() <= START_DELAY3 && !(m_Events & 0x08)) { m_Events |= 0x08; SendMessageToAll(LANG_ARENA_FIFTEEN_SECONDS); } // delay expired (1 minute) else if (GetStartDelayTime() <= 0 && !(m_Events & 0x10)) { m_Events |= 0x10; for(uint32 i = BG_BE_OBJECT_DOOR_1; i <= BG_BE_OBJECT_DOOR_2; i++) DoorOpen(i); for(uint32 i = BG_BE_OBJECT_BUFF_1; i <= BG_BE_OBJECT_BUFF_2; i++) SpawnBGObject(i, 60); SendMessageToAll(LANG_ARENA_BEGUN); SetStatus(STATUS_IN_PROGRESS); SetStartDelayTime(0); for(BattleGroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) if(Player *plr = objmgr.GetPlayer(itr->first)) plr->RemoveAurasDueToSpell(SPELL_ARENA_PREPARATION); if(!GetPlayersCountByTeam(ALLIANCE) && GetPlayersCountByTeam(HORDE)) EndBattleGround(HORDE); else if(GetPlayersCountByTeam(ALLIANCE) && !GetPlayersCountByTeam(HORDE)) EndBattleGround(ALLIANCE); } } /*if(GetStatus() == STATUS_IN_PROGRESS) { // update something }*/ }
void BattlegroundSA::TitanRelicActivated(Player* clicker) { if (!clicker) return; if (GateStatus[BG_SA_ANCIENT_GATE] == BG_SA_GATE_DESTROYED && GateStatus[BG_SA_YELLOW_GATE] == BG_SA_GATE_DESTROYED && (GateStatus[BG_SA_PURPLE_GATE] == BG_SA_GATE_DESTROYED || GateStatus[BG_SA_RED_GATE] == BG_SA_GATE_DESTROYED) && (GateStatus[BG_SA_GREEN_GATE] == BG_SA_GATE_DESTROYED || GateStatus[BG_SA_BLUE_GATE] == BG_SA_GATE_DESTROYED)) { if (clicker->GetBGTeamId() == Attackers) { if (clicker->GetBGTeamId() == TEAM_ALLIANCE) SendMessageToAll(LANG_BG_SA_ALLIANCE_CAPTURED_RELIC, CHAT_MSG_BG_SYSTEM_NEUTRAL); else SendMessageToAll(LANG_BG_SA_HORDE_CAPTURED_RELIC, CHAT_MSG_BG_SYSTEM_NEUTRAL); if (Status == BG_SA_ROUND_ONE) { RoundScores[0].winner = Attackers; RoundScores[0].time = TotalTime; // Achievement Storm the Beach (1310) for (BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) { if (Player* player = ObjectAccessor::FindPlayer(itr->first)) if (player->GetBGTeamId() == Attackers) player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, 65246); } Attackers = (Attackers == TEAM_ALLIANCE) ? TEAM_HORDE : TEAM_ALLIANCE; Status = BG_SA_SECOND_WARMUP; TotalTime = 0; ToggleTimer(); if (Creature* c = GetBGCreature(BG_SA_NPC_KANRETHAD)) SendChatMessage(c, TEXT_ROUND_1_FINISHED); UpdateWaitTimer = 5000; SignaledRoundTwo = false; SignaledRoundTwoHalfMin = false; InitSecondRound = true; ResetObjs(); GetBgMap()->UpdateAreaDependentAuras(); CastSpellOnTeam(SPELL_END_OF_ROUND, ALLIANCE); CastSpellOnTeam(SPELL_END_OF_ROUND, HORDE); } else if (Status == BG_SA_ROUND_TWO) { RoundScores[1].winner = Attackers; RoundScores[1].time = TotalTime; ToggleTimer(); // Achievement Storm the Beach (1310) for (BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) { if (Player* player = ObjectAccessor::FindPlayer(itr->first)) if (player->GetBGTeamId() == Attackers && RoundScores[1].winner == Attackers) player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, 65246); } if (RoundScores[0].time == RoundScores[1].time) EndBattleground(0); else if (RoundScores[0].time < RoundScores[1].time) EndBattleground(RoundScores[0].winner == TEAM_ALLIANCE ? ALLIANCE : HORDE); else EndBattleground(RoundScores[1].winner == TEAM_ALLIANCE ? ALLIANCE : HORDE); } } } }
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 BattleGroundSA::Update(uint32 diff) { BattleGround::Update(diff); if (GetStatus() == STATUS_WAIT_JOIN && !shipsStarted) if (Phase == SA_ROUND_ONE) // Round one not started yet { if (shipsTimer <= diff) StartShips(); else shipsTimer -= diff; } if (GetStatus() == STATUS_IN_PROGRESS) // Battleground already in progress { if (Round_timer >= BG_SA_ROUNDLENGTH) { if (Phase == SA_ROUND_ONE) // Timeout of first round { PlaySoundToAll(BG_SA_SOUND_GYD_VICTORY); SendMessageToAll(defender == ALLIANCE ? LANG_BG_SA_ALLIANCE_TIMEOUT_END_1ROUND : LANG_BG_SA_HORDE_TIMEOUT_END_1ROUND, CHAT_MSG_BG_SYSTEM_NEUTRAL, NULL); SendWarningToAll(LANG_BG_SA_END_1ROUND); RoundScores[0].winner = GetDefender(); RoundScores[0].time = BG_SA_ROUNDLENGTH; for (BattleGroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) { if (Player *plr = sObjectMgr.GetPlayer(itr->first)) plr->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, 52459); } ResetBattle(0, defender); } else // Timeout of second round { SendMessageToAll(defender == ALLIANCE ? LANG_BG_SA_ALLIANCE_TIMEOUT_END_2ROUND : LANG_BG_SA_HORDE_TIMEOUT_END_2ROUND, CHAT_MSG_BG_SYSTEM_NEUTRAL, NULL); RoundScores[1].winner = GetDefender(); for (BattleGroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) { if (Player *plr = sObjectMgr.GetPlayer(itr->first)) plr->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, 52459); } if (RoundScores[0].winner == GetDefender()) EndBattleGround(GetDefender()); else EndBattleGround(TEAM_NONE); return; } } else Round_timer += diff; for (int gyd = 0; gyd < BG_SA_GRY_MAX; ++gyd) { // 3 sec delay to spawn new banner instead previous despawned one if (m_BannerTimers[gyd].timer) { if (m_BannerTimers[gyd].timer > diff) m_BannerTimers[gyd].timer -= diff; else { m_BannerTimers[gyd].timer = 0; _CreateBanner(gyd, m_BannerTimers[gyd].type, m_BannerTimers[gyd].teamIndex, false); } } } UpdateTimer(); } if (GetStatus() == STATUS_WAIT_JOIN && Phase == SA_ROUND_TWO) // Round two, not yet started { if (!shipsStarted) { if (shipsTimer <= diff) { SendMessageToAll(LANG_BG_SA_START_ONE_MINUTE, CHAT_MSG_BG_SYSTEM_NEUTRAL, NULL); StartShips(); } else shipsTimer -= diff; } if (TimeST2Round < diff) { Phase = SA_ROUND_TWO; SpawnEvent(SA_EVENT_ADD_NPC, 0, true); SpawnEvent(SA_EVENT_ADD_BOMB_B, (GetDefender() == ALLIANCE ? BG_SA_GRAVE_STATUS_HORDE_OCCUPIED : BG_SA_GRAVE_STATUS_ALLY_OCCUPIED), true); ToggleTimer(); SetStatus(STATUS_IN_PROGRESS); // Start round two PlaySoundToAll(SOUND_BG_START); SendWarningToAll(LANG_BG_SA_HAS_BEGUN); for (BattleGroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) { if (Player* plr = sObjectMgr.GetPlayer(itr->first)) plr->RemoveAurasDueToSpell(SPELL_PREPARATION); } } else TimeST2Round -= diff; } }
//------------------------------------------------------------------------ void CGameRules::OnHostMigrationStateChanged() { CGame::EHostMigrationState migrationState = g_pGame->GetHostMigrationState(); if (migrationState == CGame::eHMS_Resuming) { // Assume remaining players aren't going to make it const uint32 maxMigratingPlayers = m_migratingPlayerMaxCount; for (uint32 index = 0; index < maxMigratingPlayers; ++ index) { SMigratingPlayerInfo *pPlayerInfo = &m_pMigratingPlayerInfo[index]; if (pPlayerInfo->InUse()) { // Pretend the player has disconnected FakeDisconnectPlayer(pPlayerInfo->m_originalEntityId); pPlayerInfo->Reset(); } } if (gEnv->bServer) { GetGameObject()->InvokeRMI(ClHostMigrationFinished(), NoParams(), eRMI_ToRemoteClients); } } else if (migrationState == CGame::eHMS_NotMigrating) { if (gEnv->bServer) { TPlayers players; GetPlayers(players); const int numPlayers = players.size(); for (int i = 0; i < numPlayers; ++ i) { IActor *pActor = g_pGame->GetIGameFramework()->GetIActorSystem()->GetActor(players[i]); if (pActor) { pActor->SetMigrating(false); } } } else { CPlayer *pPlayer = static_cast<CPlayer *>(g_pGame->GetIGameFramework()->GetClientActor()); if (pPlayer) { pPlayer->SetMigrating(false); } } CallOnForbiddenAreas("OnHostMigrationFinished"); // Migration has finished, if we've still got client params then they won't be valid anymore SAFE_DELETE(m_pHostMigrationClientParams); } else if (migrationState == CGame::eHMS_WaitingForPlayers) { CallOnForbiddenAreas("OnHostMigrationStarted"); } }