Дата: Воскресенье, 15.07.2012, 22:20 | Сообщение # 1
Лейтенант
Группа: Администраторы
Сообщений: 50
Quote
+ } + m_uiKnockback = 1000; + } + else + m_uiKnockback -= diff; + } } void BattleGroundDS::StartingEventCloseDoors() @@ -51,6 +71,7 @@ void BattleGroundDS::StartingEventCloseDoors() void BattleGroundDS::StartingEventOpenDoors() { + OpenDoorEvent(BG_EVENT_DOOR); } void BattleGroundDS::AddPlayer(Player *plr) @@ -60,19 +81,76 @@ void BattleGroundDS::AddPlayer(Player *plr) BattleGroundDSScore* sc = new BattleGroundDSScore; m_PlayerScores[plr->GetGUID()] = sc; + + UpdateWorldState(0xe11, GetAlivePlayersCountByTeam(ALLIANCE)); + UpdateWorldState(0xe10, GetAlivePlayersCountByTeam(HORDE)); +} + +void BattleGroundDS::RemovePlayer(Player* /*plr*/, uint64 /*guid*/) +{ + if (GetStatus() == STATUS_WAIT_LEAVE) + return; + + UpdateWorldState(0xe11, GetAlivePlayersCountByTeam(ALLIANCE)); + UpdateWorldState(0xe10, GetAlivePlayersCountByTeam(HORDE)); + + CheckArenaWinConditions(); } -void BattleGroundDS::RemovePlayer(Player * /*plr*/, uint64 /*guid*/) +void BattleGroundDS::HandleKillPlayer(Player *player, Player *killer) { + if (GetStatus() != STATUS_IN_PROGRESS) + return; + + if (!killer) + { + sLog.outError("BattleGroundDS: Killer player not found"); + return; + } + + BattleGround::HandleKillPlayer(player,killer); + + UpdateWorldState(0xe11, GetAlivePlayersCountByTeam(ALLIANCE)); + UpdateWorldState(0xe10, GetAlivePlayersCountByTeam(HORDE)); + + CheckArenaWinConditions(); +} + +bool BattleGroundDS::HandlePlayerUnderMap(Player *player) +{ + player->TeleportTo(GetMapId(),1299.046f,784.825f,9.338f,player->GetOrientation(),false); + return true; +} + +void BattleGroundDS::HandleAreaTrigger(Player *Source, uint32 Trigger) +{ + if (GetStatus() != STATUS_IN_PROGRESS) + return; + + switch(Trigger) + { + case 5347: + case 5348: + break; + default: + sLog.outError("WARNING: Unhandled AreaTrigger in Battleground: %u", Trigger); + Source->GetSession()->SendAreaTriggerMessage("Warning: Unhandled AreaTrigger in Battleground: %u", Trigger); + break; + } } -void BattleGroundDS::HandleKillPlayer(Player* player, Player* killer) +void BattleGroundDS::FillInitialWorldStates(WorldPacket &data, uint32& count) { - BattleGround::HandleKillPlayer(player, killer); + FillInitialWorldState(data, count, 0xe11, GetAlivePlayersCountByTeam(ALLIANCE)); + FillInitialWorldState(data, count, 0xe10, GetAlivePlayersCountByTeam(HORDE)); + FillInitialWorldState(data, count, 0xe1a, 1); } -void BattleGroundDS::HandleAreaTrigger(Player * /*Source*/, uint32 /*Trigger*/) +void BattleGroundDS::Reset() { + //call parent's class reset + BattleGround::Reset(); + m_uiKnockback = 5000; } bool BattleGroundDS::SetupBattleGround() diff --git a/src/game/BattleGroundDS.h b/src/game/BattleGroundDS.h index 0034226..2d21b58 100644 --- a/src/game/BattleGroundDS.h +++ b/src/game/BattleGroundDS.h @@ -45,6 +45,11 @@ class BattleGroundDS : public BattleGround void RemovePlayer(Player *plr, uint64 guid); void HandleAreaTrigger(Player *Source, uint32 Trigger); bool SetupBattleGround(); + virtual void Reset(); + virtual void FillInitialWorldStates(WorldPacket &d, uint32& count); void HandleKillPlayer(Player* player, Player *killer); + bool HandlePlayerUnderMap(Player * plr); + private: + uint32 m_uiKnockback; }; #endif diff --git a/src/game/BattleGroundMgr.cpp b/src/game/BattleGroundMgr.cpp index e4715ea..1015832 100644 --- a/src/game/BattleGroundMgr.cpp +++ b/src/game/BattleGroundMgr.cpp @@ -1485,8 +1485,8 @@ BattleGround * BattleGroundMgr::CreateNewBattleGround(BattleGroundTypeId bgTypeI //for arenas there is random map used if (bg_template->isArena()) { - BattleGroundTypeId arenas[] = {BATTLEGROUND_NA, BATTLEGROUND_BE, BATTLEGROUND_RL/*, BATTLEGROUND_DS, BATTLEGROUND_RV*/}; - uint32 arena_num = urand(0,2/*4*/); + BattleGroundTypeId arenas[] = {BATTLEGROUND_NA, BATTLEGROUND_BE, BATTLEGROUND_RL, BATTLEGROUND_DS/*, BATTLEGROUND_RV*/}; + uint32 arena_num = urand(0,3/*4*/); bgTypeId = arenas[arena_num]; bg_template = GetBattleGroundTemplate(bgTypeId); if (!bg_template) @@ -1897,7 +1897,8 @@ bool BattleGroundMgr::IsArenaType(BattleGroundTypeId bgTypeId) return ( bgTypeId == BATTLEGROUND_AA || bgTypeId == BATTLEGROUND_BE || bgTypeId == BATTLEGROUND_NA || - bgTypeId == BATTLEGROUND_RL ); + bgTypeId == BATTLEGROUND_RL || + bgTypeId == BATTLEGROUND_DS); } BattleGroundQueueTypeId BattleGroundMgr::BGQueueTypeId(BattleGroundTypeId bgTypeId, uint8 arenaType) diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 0372f37..d31f19e 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -8381,6 +8381,16 @@ void Player::SendInitWorldStates(uint32 zoneid, uint32 areaid) FillInitialWorldState(data,count,0xbba,0x0);// 9 show } break; + case 4378: // Dalaran Severs + if (bg && bg->GetTypeID(true) == BATTLEGROUND_DS) + bg->FillInitialWorldStates(data, count); + else + { + FillInitialWorldState(data,count,0xe11,0x0);// 7 gold + FillInitialWorldState(data,count,0xe10,0x0);// 8 green + FillInitialWorldState(data,count,0xe1a,0x0);// 9 show + } + break; case 3703: // Shattrath City break; default: diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index 37abee6..3694295 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -14222,6 +14222,27 @@ void Unit::KnockBackFrom(Unit* target, float horizontalSpeed, float verticalSpee } } +void Unit::KnockBackPlayerWithAngle(float angle, float horizontalSpeed, float verticalSpeed) +{ + float vsin = sin(angle); + float vcos = cos(angle); + + // Effect propertly implemented only for players + if(GetTypeId()==TYPEID_PLAYER) + { + WorldPacket data(SMSG_MOVE_KNOCK_BACK, 8+4+4+4+4+4); + data << GetPackGUID(); + data << uint32(0); // Sequence + data << float(vcos); // x direction + data << float(vsin); // y direction + data << float(horizontalSpeed); // Horizontal speed + data << float(-verticalSpeed); // Z Movement speed (vertical) + ((Player*)this)->GetSession()->SendPacket(&data); + } + else + sLog.outError("KnockBackPlayer: Target of KnockBackPlayer must be player!"); +} + float Unit::GetCombatRatingReduction(CombatRating cr) const { if (GetTypeId() == TYPEID_PLAYER) diff --git a/src/game/Unit.h b/src/game/Unit.h index 4aaf7c3..2094a98 100644 --- a/src/game/Unit.h +++ b/src/game/Unit.h @@ -1775,6 +1775,7 @@ class MANGOS_DLL_SPEC Unit : public WorldObject bool isHover() const { return HasAuraType(SPELL_AURA_HOVER); } void KnockBackFrom(Unit* target, float horizontalSpeed, float verticalSpeed); + void KnockBackPlayerWithAngle(float angle, float horizontalSpeed, float verticalSpeed); void _RemoveAllAuraMods(); void _ApplyAllAuraMods();
в базу sql Quote
delete from `gameobject` where `map` = 617; insert into `gameobject` values -- buffs ('200060','184663','617','1','1','1291.7','813.424','7.11472','4.64562','0','0','0.730314','-0.683111','-120','100','1'), ('200061', '184664','617','1','1','1291.7','768.911','7.11472','1.55194','0','0','0.700409','0.713742','-120','100','1'), -- doors ('200062','192642','617','1','1','1350.95','817.2','21.4096','3.15','0','0','0.99627','0.0862864','86400','100','1'), ('200063','192 643','617','1','1','1232.65','764.913','21.4729','6.3','0','0','0.0310211','-0.999519','86400','100','1'); delete from `gameobject_battleground` where `guid` in (200060,200061,200062,200063); insert into `gameobject_battleground` values -- buffs ('200060','252','0'), ('200061','252','0'), -- doors ('200062','254','0'), ('200063','254','0'); delete from `battleground_events` where `map` = 617; insert into `battleground_events` values ('617','252','0','buffs'), ('617','254','0','doors'); -- doors update `gameobject_template` set `faction` = 114, `flags` = 32, `size` = 1.5 where `entry` in (192642,192643);
идет набор модераторов