aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorNay <dnpd.dd@gmail.com>2012-09-30 15:46:00 +0100
committerNay <dnpd.dd@gmail.com>2012-09-30 15:46:00 +0100
commit94c8c7ec4e3a1cf625bee0bab77f8814253ddf0d (patch)
treed8a1f5748f9c8f381c9d071c299470c195f8107d /src
parent35412ddc3c5bb08f8640aa429fc4e1e4791fe2fd (diff)
parent8ac05aff2dc2adf94604bc5ce94d489c7311693d (diff)
Merge remote-tracking branch 'origin/master' into 4.3.4
Conflicts: src/server/game/Battlefield/BattlefieldMgr.h src/server/game/Entities/Player/Player.cpp src/server/game/Globals/ObjectMgr.cpp src/server/game/Handlers/BattleGroundHandler.cpp src/server/game/Handlers/CharacterHandler.cpp
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Battlefield/Battlefield.h6
-rw-r--r--src/server/game/Battlefield/BattlefieldMgr.h6
-rw-r--r--src/server/game/Battlefield/Zones/BattlefieldWG.cpp41
-rw-r--r--src/server/game/Battlefield/Zones/BattlefieldWG.h18
-rwxr-xr-xsrc/server/game/Battlegrounds/Battleground.cpp4
-rwxr-xr-xsrc/server/game/Battlegrounds/Zones/BattlegroundAB.cpp1
-rwxr-xr-xsrc/server/game/Battlegrounds/Zones/BattlegroundEY.h4
-rwxr-xr-xsrc/server/game/Battlegrounds/Zones/BattlegroundWS.cpp34
-rw-r--r--src/server/game/Entities/Player/Player.cpp54
-rwxr-xr-xsrc/server/game/Entities/Player/Player.h1
-rwxr-xr-xsrc/server/game/Entities/Unit/Unit.cpp10
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp35
-rwxr-xr-xsrc/server/game/Globals/ObjectMgr.h2
-rw-r--r--src/server/game/Handlers/CharacterHandler.cpp65
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.cpp4
-rw-r--r--src/server/game/World/World.cpp3
-rw-r--r--src/server/scripts/Kalimdor/tanaris.cpp64
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp54
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp146
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp8
-rw-r--r--src/server/scripts/Spells/spell_paladin.cpp2
-rw-r--r--src/server/shared/Database/Implementation/CharacterDatabase.cpp4
-rwxr-xr-xsrc/server/shared/Database/Implementation/CharacterDatabase.h2
-rw-r--r--src/server/shared/Logging/Log.cpp11
24 files changed, 357 insertions, 222 deletions
diff --git a/src/server/game/Battlefield/Battlefield.h b/src/server/game/Battlefield/Battlefield.h
index 520f6a8c2a7..00e55283c52 100644
--- a/src/server/game/Battlefield/Battlefield.h
+++ b/src/server/game/Battlefield/Battlefield.h
@@ -212,9 +212,6 @@ class Battlefield : public ZoneScript
/// Call this to init the Battlefield
virtual bool SetupBattlefield() { return true; }
- /// Generate packet which contain all worldstatedata of area
- virtual void FillInitialWorldStates(WorldPacket& /*data*/) {}
-
/// Update data of a worldstate to all players present in zone
void SendUpdateWorldState(uint32 field, uint32 value);
@@ -332,7 +329,8 @@ class Battlefield : public ZoneScript
virtual void DoCompleteOrIncrementAchievement(uint32 /*achievement*/, Player* /*player*/, uint8 /*incrementNumber = 1*/) {};
/// Send all worldstate data to all player in zone.
- virtual void SendInitWorldStatesToAll() {};
+ virtual void SendInitWorldStatesToAll() = 0;
+ virtual void FillInitialWorldStates(WorldPacket& /*data*/) = 0;
/// Return if we can use mount in battlefield
bool CanFlyIn() { return !m_isActive; }
diff --git a/src/server/game/Battlefield/BattlefieldMgr.h b/src/server/game/Battlefield/BattlefieldMgr.h
index b448cd4ead2..29c4856e859 100644
--- a/src/server/game/Battlefield/BattlefieldMgr.h
+++ b/src/server/game/Battlefield/BattlefieldMgr.h
@@ -46,11 +46,11 @@ class BattlefieldMgr
// called when player resurrects
void HandlePlayerResurrects(Player * player, uint32 areaflag);
// return assigned battlefield
- Battlefield *GetBattlefieldToZoneId(uint32 zoneid);
- Battlefield *GetBattlefieldByBattleId(uint32 battleid);
+ Battlefield* GetBattlefieldToZoneId(uint32 zoneid);
+ Battlefield* GetBattlefieldByBattleId(uint32 battleid);
Battlefield *GetBattlefieldByGUID(uint64 guid);
- ZoneScript *GetZoneScript(uint32 zoneId);
+ ZoneScript* GetZoneScript(uint32 zoneId);
void AddZone(uint32 zoneid, Battlefield * handle);
diff --git a/src/server/game/Battlefield/Zones/BattlefieldWG.cpp b/src/server/game/Battlefield/Zones/BattlefieldWG.cpp
index 2270bcf7927..de1ee1785d8 100644
--- a/src/server/game/Battlefield/Zones/BattlefieldWG.cpp
+++ b/src/server/game/Battlefield/Zones/BattlefieldWG.cpp
@@ -612,33 +612,26 @@ void BattlefieldWG::OnCreatureRemove(Creature* /*creature*/)
void BattlefieldWG::OnGameObjectCreate(GameObject* go)
{
- bool isWorkshop = false;
uint8 workshopId = 0;
switch (go->GetEntry())
{
case GO_WINTERGRASP_FACTORY_BANNER_NE:
- isWorkshop = true;
workshopId = BATTLEFIELD_WG_WORKSHOP_NE;
break;
case GO_WINTERGRASP_FACTORY_BANNER_NW:
- isWorkshop = true;
workshopId = BATTLEFIELD_WG_WORKSHOP_NW;
break;
case GO_WINTERGRASP_FACTORY_BANNER_SE:
- isWorkshop = true;
workshopId = BATTLEFIELD_WG_WORKSHOP_SE;
break;
case GO_WINTERGRASP_FACTORY_BANNER_SW:
- isWorkshop = true;
workshopId = BATTLEFIELD_WG_WORKSHOP_SW;
break;
-
+ default:
+ return;
}
- if (!isWorkshop)
- return;
-
for (Workshop::const_iterator itr = WorkshopsList.begin(); itr != WorkshopsList.end(); ++itr)
{
if (WGWorkshop* workshop = (*itr))
@@ -851,20 +844,13 @@ uint32 BattlefieldWG::GetData(uint32 data)
return Battlefield::GetData(data);
}
-// Method sending worldsate to player
-WorldPacket BattlefieldWG::BuildInitWorldStates()
-{
- WorldPacket data(SMSG_INIT_WORLD_STATES, (4 + 4 + 4 + 2 + (BuildingsInZone.size() * 8) + (WorkshopsList.size() * 8)));
-
- data << uint32(m_MapId);
- data << uint32(m_ZoneId);
- data << uint32(0);
- data << uint16(4 + 2 + 4 + BuildingsInZone.size() + WorkshopsList.size());
+void BattlefieldWG::FillInitialWorldStates(WorldPacket& data)
+{
data << uint32(BATTLEFIELD_WG_WORLD_STATE_ATTACKER) << uint32(GetAttackerTeam());
data << uint32(BATTLEFIELD_WG_WORLD_STATE_DEFENDER) << uint32(GetDefenderTeam());
- data << uint32(BATTLEFIELD_WG_WORLD_STATE_ACTIVE) << uint32(IsWarTime()? 0 : 1); // Note: cleanup these two, their names look awkward
- data << uint32(BATTLEFIELD_WG_WORLD_STATE_SHOW_WORLDSTATE) << uint32(IsWarTime()? 1 : 0);
+ data << uint32(BATTLEFIELD_WG_WORLD_STATE_ACTIVE) << uint32(IsWarTime() ? 0 : 1); // Note: cleanup these two, their names look awkward
+ data << uint32(BATTLEFIELD_WG_WORLD_STATE_SHOW_WORLDSTATE) << uint32(IsWarTime() ? 1 : 0);
for (uint32 i = 0; i < 2; ++i)
data << ClockWorldState[i] << uint32(time(NULL) + (m_Timer / 1000));
@@ -880,23 +866,28 @@ WorldPacket BattlefieldWG::BuildInitWorldStates()
for (Workshop::const_iterator itr = WorkshopsList.begin(); itr != WorkshopsList.end(); ++itr)
if (*itr)
data << WorkshopsData[(*itr)->workshopId].worldstate << (*itr)->state;
-
- return data;
}
void BattlefieldWG::SendInitWorldStatesTo(Player* player)
{
- WorldPacket data = BuildInitWorldStates();
+ WorldPacket data(SMSG_INIT_WORLD_STATES, (4 + 4 + 4 + 2 + (BuildingsInZone.size() * 8) + (WorkshopsList.size() * 8)));
+
+ data << uint32(m_MapId);
+ data << uint32(m_ZoneId);
+ data << uint32(0);
+ data << uint16(10 + BuildingsInZone.size() + WorkshopsList.size()); // Number of fields
+
+ FillInitialWorldStates(data);
+
player->GetSession()->SendPacket(&data);
}
void BattlefieldWG::SendInitWorldStatesToAll()
{
- WorldPacket data = BuildInitWorldStates();
for (uint8 team = 0; team < 2; team++)
for (GuidSet::iterator itr = m_players[team].begin(); itr != m_players[team].end(); ++itr)
if (Player* player = sObjectAccessor->FindPlayer(*itr))
- player->GetSession()->SendPacket(&data);
+ SendInitWorldStatesTo(player);
}
void BattlefieldWG::BrokenWallOrTower(TeamId /*team*/)
diff --git a/src/server/game/Battlefield/Zones/BattlefieldWG.h b/src/server/game/Battlefield/Zones/BattlefieldWG.h
index 11510e1ea98..323f7f2b13d 100644
--- a/src/server/game/Battlefield/Zones/BattlefieldWG.h
+++ b/src/server/game/Battlefield/Zones/BattlefieldWG.h
@@ -26,12 +26,6 @@
#include "GroupMgr.h"
#include "Battlefield.h"
-uint32 const VehNumWorldState[2] = { 3680, 3490 };
-uint32 const MaxVehNumWorldState[2] = { 3681, 3491 };
-uint32 const ClockWorldState[2] = { 3781, 4354 };
-uint32 const WintergraspFaction[3] = { 1732, 1735, 35 };
-float const WintergraspStalkerPos[4] = { 0, 0, 0, 0 };
-
class BattlefieldWG;
class WintergraspCapturePoint;
@@ -404,9 +398,9 @@ class BattlefieldWG : public Battlefield
void UpdateVehicleCountWG();
void UpdateCounterVehicle(bool init);
- WorldPacket BuildInitWorldStates();
void SendInitWorldStatesTo(Player* player);
void SendInitWorldStatesToAll();
+ void FillInitialWorldStates(WorldPacket& data);
void HandleKill(Player* killer, Unit* victim);
void OnUnitDeath(Unit* unit);
@@ -421,6 +415,7 @@ class BattlefieldWG : public Battlefield
uint8 GetSpiritGraveyardId(uint32 areaId);
uint32 GetData(uint32 data);
+
protected:
bool m_isRelicInteractible;
@@ -441,6 +436,12 @@ class BattlefieldWG : public Battlefield
GameObject* m_titansRelic;
};
+uint32 const VehNumWorldState[] = { 3680, 3490 };
+uint32 const MaxVehNumWorldState[] = { 3681, 3491 };
+uint32 const ClockWorldState[] = { 3781, 4354 };
+uint32 const WintergraspFaction[] = { 1732, 1735, 35 };
+float const WintergraspStalkerPos[] = { 0, 0, 0, 0 };
+
uint8 const WG_MAX_OBJ = 32;
uint8 const WG_KEEPGAMEOBJECT_MAX = 44;
uint8 const WG_MAX_TURRET = 15;
@@ -448,6 +449,7 @@ uint8 const WG_MAX_KEEP_NPC = 39;
uint8 const WG_MAX_OUTSIDE_NPC = 14;
uint8 const WG_OUTSIDE_ALLIANCE_NPC = 7;
uint8 const WG_MAX_TELEPORTER = 12;
+uint8 const WG_MAX_WORKSHOP = 6;
enum WintergraspGameObjectBuildingType
{
@@ -1112,8 +1114,6 @@ const WintergraspTowerCannonData TowerCannon[WG_MAX_TOWER_CANNON] =
// *****************WorkShop Data & Element*****************
// *********************************************************
-uint8 const WG_MAX_WORKSHOP = 6;
-
struct WGWorkshopData
{
uint8 id;
diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp
index 0b7b6cd6f75..1f1adb2fb65 100755
--- a/src/server/game/Battlegrounds/Battleground.cpp
+++ b/src/server/game/Battlegrounds/Battleground.cpp
@@ -1961,8 +1961,6 @@ void Battleground::RewardXPAtKill(Player* killer, Player* victim)
void Battleground::HandleAreaTrigger(Player* player, uint32 trigger)
{
- sLog->outError(LOG_FILTER_BATTLEGROUND, "WARNING: Unhandled AreaTrigger %u in Battleground %u. Player coords (x: %f, y: %f, z: %f)",
+ sLog->outDebug(LOG_FILTER_BATTLEGROUND, "Unhandled AreaTrigger %u in Battleground %u. Player coords (x: %f, y: %f, z: %f)",
trigger, player->GetMapId(), player->GetPositionX(), player->GetPositionY(), player->GetPositionZ());
- if (player->isGameMaster())
- player->GetSession()->SendAreaTriggerMessage("Warning: Unhandled AreaTrigger in Battleground: %u", trigger);
}
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp
index dfd7af583a5..e91c5122604 100755
--- a/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp
@@ -236,6 +236,7 @@ void BattlegroundAB::HandleAreaTrigger(Player* player, uint32 trigger)
case 3870: // Black Smith
case 4020: // Unk1
case 4021: // Unk2
+ case 4674: // Unk3
//break;
default:
Battleground::HandleAreaTrigger(player, trigger);
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundEY.h b/src/server/game/Battlegrounds/Zones/BattlegroundEY.h
index c7ee4c62504..f7487a46653 100755
--- a/src/server/game/Battlegrounds/Zones/BattlegroundEY.h
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundEY.h
@@ -105,11 +105,11 @@ enum EYBattlegroundObjectEntry
enum EYBattlegroundPointsTrigger
{
TR_BLOOD_ELF_POINT = 4476,
- TR_FEL_REAVER_POINT = 4514,
+ TR_FEL_REAVER_POINT = 4514,
TR_MAGE_TOWER_POINT = 4516,
TR_DRAENEI_RUINS_POINT = 4518,
TR_BLOOD_ELF_BUFF = 4568,
- TR_FEL_REAVER_BUFF = 4569,
+ TR_FEL_REAVER_BUFF = 4569,
TR_MAGE_TOWER_BUFF = 4570,
TR_DRAENEI_RUINS_BUFF = 4571
};
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp
index a50553d2fa3..024c570d174 100755
--- a/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp
@@ -65,7 +65,7 @@ void BattlegroundWS::PostUpdateImpl(uint32 diff)
{
if (GetStatus() == STATUS_IN_PROGRESS)
{
- if (GetStartTime() >= 25*MINUTE*IN_MILLISECONDS)
+ if (GetStartTime() >= 27*MINUTE*IN_MILLISECONDS)
{
if (GetTeamScore(ALLIANCE) == 0)
{
@@ -83,7 +83,8 @@ void BattlegroundWS::PostUpdateImpl(uint32 diff)
else
EndBattleground(ALLIANCE);
}
- else if (GetStartTime() > uint32(_minutesElapsed * MINUTE * IN_MILLISECONDS))
+ // first update needed after 1 minute of game already in progress
+ else if (GetStartTime() > uint32(_minutesElapsed * MINUTE * IN_MILLISECONDS) + 3 * MINUTE * IN_MILLISECONDS)
{
++_minutesElapsed;
UpdateWorldState(BG_WS_STATE_TIMER, 25 - _minutesElapsed);
@@ -159,6 +160,17 @@ void BattlegroundWS::PostUpdateImpl(uint32 diff)
}
else
{
+ if (Player* player = ObjectAccessor::FindPlayer(m_FlagKeepers[0]))
+ {
+ player->RemoveAurasDueToSpell(WS_SPELL_FOCUSED_ASSAULT);
+ player->RemoveAurasDueToSpell(WS_SPELL_BRUTAL_ASSAULT);
+ }
+ if (Player* player = ObjectAccessor::FindPlayer(m_FlagKeepers[1]))
+ {
+ player->RemoveAurasDueToSpell(WS_SPELL_FOCUSED_ASSAULT);
+ player->RemoveAurasDueToSpell(WS_SPELL_BRUTAL_ASSAULT);
+ }
+
_flagSpellForceTimer = 0; //reset timer.
_flagDebuffState = 0;
}
@@ -826,23 +838,17 @@ void BattlegroundWS::FillInitialWorldStates(WorldPacket& data)
data << uint32(BG_WS_FLAG_CAPTURES_MAX) << uint32(BG_WS_MAX_TEAM_SCORE);
- if (GetStatus() == STATUS_IN_PROGRESS)
- {
- data << uint32(BG_WS_STATE_TIMER_ACTIVE) << uint32(1);
- data << uint32(BG_WS_STATE_TIMER) << uint32(25-_minutesElapsed);
- }
- else
- data << uint32(BG_WS_STATE_TIMER_ACTIVE) << uint32(0);
-
if (_flagState[BG_TEAM_HORDE] == BG_WS_FLAG_STATE_ON_PLAYER)
- data << uint32(BG_WS_FLAG_STATE_ALLIANCE) << uint32(2);
+ data << uint32(BG_WS_FLAG_STATE_HORDE) << uint32(2);
else
- data << uint32(BG_WS_FLAG_STATE_ALLIANCE) << uint32(1);
+ data << uint32(BG_WS_FLAG_STATE_HORDE) << uint32(1);
if (_flagState[BG_TEAM_ALLIANCE] == BG_WS_FLAG_STATE_ON_PLAYER)
- data << uint32(BG_WS_FLAG_STATE_HORDE) << uint32(2);
+ data << uint32(BG_WS_FLAG_STATE_ALLIANCE) << uint32(2);
else
- data << uint32(BG_WS_FLAG_STATE_HORDE) << uint32(1);
+ data << uint32(BG_WS_FLAG_STATE_ALLIANCE) << uint32(1);
+ data << uint32(BG_WS_STATE_TIMER_ACTIVE) << uint32(1);
+ data << uint32(BG_WS_STATE_TIMER) << uint32(25 - _minutesElapsed);
}
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index f577a51e468..688a0c83f59 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -77,7 +77,7 @@
#include "DB2Stores.h"
#include "Battlefield.h"
#include "BattlefieldMgr.h"
-#include "BattlefieldMgr.h"
+#include "BattlefieldWG.h"
#define ZONE_UPDATE_INTERVAL (1*IN_MILLISECONDS)
@@ -5540,12 +5540,7 @@ void Player::RepopAtGraveyard()
if (sBattlefieldMgr->GetBattlefieldToZoneId(GetZoneId()))
ClosestGrave = sBattlefieldMgr->GetBattlefieldToZoneId(GetZoneId())->GetClosestGraveYard(this);
else
- {
- if (sBattlefieldMgr->GetBattlefieldToZoneId(GetZoneId()))
- ClosestGrave = sBattlefieldMgr->GetBattlefieldToZoneId(GetZoneId())->GetClosestGraveYard(this);
- else
- ClosestGrave = sObjectMgr->GetClosestGraveYard(GetPositionX(), GetPositionY(), GetPositionZ(), GetMapId(), GetTeam());
- }
+ ClosestGrave = sObjectMgr->GetClosestGraveYard(GetPositionX(), GetPositionY(), GetPositionZ(), GetMapId(), GetTeam());
}
// stop countdown until repop
@@ -9155,6 +9150,7 @@ void Player::SendInitWorldStates(uint32 zoneid, uint32 areaid)
uint32 mapid = GetMapId();
OutdoorPvP* pvp = sOutdoorPvPMgr->GetOutdoorPvPToZoneId(zoneid);
InstanceScript* instance = GetInstanceScript();
+ Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(zoneid);
sLog->outDebug(LOG_FILTER_NETWORKIO, "Sending SMSG_INIT_WORLD_STATES to Map: %u, Zone: %u", mapid, zoneid);
@@ -9187,7 +9183,7 @@ void Player::SendInitWorldStates(uint32 zoneid, uint32 areaid)
NumberOfFields = 83;
break;
case 3277:
- NumberOfFields = 16;
+ NumberOfFields = 18;
break;
case 3358:
case 3820:
@@ -9225,6 +9221,10 @@ void Player::SendInitWorldStates(uint32 zoneid, uint32 areaid)
case 4273: // Ulduar
NumberOfFields = 10;
break;
+ case 4197: // Wintergrasp
+ /// Use the max here, and fill with zeros if missing.
+ NumberOfFields = 10 + WG_MAX_OBJ + WG_MAX_WORKSHOP;
+ break;
default:
NumberOfFields = 12;
break;
@@ -9234,6 +9234,7 @@ void Player::SendInitWorldStates(uint32 zoneid, uint32 areaid)
data << uint32(mapid); // mapid
data << uint32(zoneid); // zone id
data << uint32(areaid); // area id, new 2.1.0
+ size_t countPos = data.wpos();
data << uint16(NumberOfFields); // count of uint64 blocks
data << uint32(0x8d8) << uint32(0x0); // 1
data << uint32(0x8d7) << uint32(0x0); // 2
@@ -9760,6 +9761,16 @@ void Player::SendInitWorldStates(uint32 zoneid, uint32 areaid)
if (bg && bg->GetTypeID(true) == BATTLEGROUND_BFG)
bg->FillInitialWorldStates(data);
break;
+ // Wintergrasp
+ case 4197:
+ if (bf && bf->GetTypeId() == BATTLEFIELD_WG)
+ {
+ bf->FillInitialWorldStates(data);
+ break;
+ }
+ else
+ data.put<uint16>(countPos, 12);
+ // No break here, intended.
default:
data << uint32(0x914) << uint32(0x0); // 7
data << uint32(0x913) << uint32(0x0); // 8
@@ -9769,6 +9780,7 @@ void Player::SendInitWorldStates(uint32 zoneid, uint32 areaid)
}
GetSession()->SendPacket(&data);
SendBGWeekendWorldStates();
+ SendBattlefieldWorldStates();
}
void Player::SendBGWeekendWorldStates()
@@ -9786,6 +9798,24 @@ void Player::SendBGWeekendWorldStates()
}
}
+void Player::SendBattlefieldWorldStates()
+{
+ /// Send misc stuff that needs to be sent on every login, like the battle timers.
+ if (sWorld->getBoolConfig(CONFIG_WINTERGRASP_ENABLE))
+ {
+ if (BattlefieldWG* wg = (BattlefieldWG*)sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG))
+ {
+ if (wg->IsWarTime())
+ SendUpdateWorldState(ClockWorldState[1], uint32(time(NULL)));
+ else // Time to next battle
+ {
+ uint32 timer = wg->GetTimer() / 1000;
+ SendUpdateWorldState(ClockWorldState[1], time(NULL) + timer);
+ }
+ }
+ }
+}
+
uint32 Player::GetXPRestBonus(uint32 xp)
{
uint32 rested_bonus = (uint32)GetRestBonus(); // xp for each rested bonus
@@ -22032,6 +22062,14 @@ inline void UpdateVisibilityOf_helper(std::set<uint64>& s64, T* target, std::set
}
template<>
+inline void UpdateVisibilityOf_helper(std::set<uint64>& s64, GameObject* target, std::set<Unit*>& /*v*/)
+{
+ // Don't update only GAMEOBJECT_TYPE_TRANSPORT (or all transports and destructible buildings?)
+ if ((target->GetGOInfo()->type != GAMEOBJECT_TYPE_TRANSPORT))
+ s64.insert(target->GetGUID());
+}
+
+template<>
inline void UpdateVisibilityOf_helper(std::set<uint64>& s64, Creature* target, std::set<Unit*>& v)
{
s64.insert(target->GetGUID());
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 22091f80ce2..5b165b59623 100755
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -2300,6 +2300,7 @@ class Player : public Unit, public GridObject<Player>
void SendUpdateWorldState(uint32 Field, uint32 Value);
void SendDirectMessage(WorldPacket* data);
void SendBGWeekendWorldStates();
+ void SendBattlefieldWorldStates();
void SendAurasForTarget(Unit* target);
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 8e13c24c64f..3d7365d45f1 100755
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -6351,7 +6351,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere
if (beaconTarget == this || !(beaconTarget->GetAura(53563, victim->GetGUID())))
return false;
basepoints0 = int32(damage);
- triggered_spell_id = procSpell->IsRankOf(sSpellMgr->GetSpellInfo(365)) ? 53652 : 53654;
+ triggered_spell_id = procSpell->IsRankOf(sSpellMgr->GetSpellInfo(635)) ? 53652 : 53654;
}
else
{ // Check Party/Raid Group
@@ -6370,7 +6370,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere
beaconTarget = Member;
basepoints0 = int32(damage);
- triggered_spell_id = procSpell->IsRankOf(sSpellMgr->GetSpellInfo(365)) ? 53652 : 53654;
+ triggered_spell_id = procSpell->IsRankOf(sSpellMgr->GetSpellInfo(635)) ? 53652 : 53654;
break;
}
}
@@ -6396,7 +6396,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere
basepoints0 = CalculatePctN(damage, percent);
victim->CastCustomSpell(beaconTarget, triggered_spell_id, &basepoints0, NULL, NULL, true, 0, triggeredByAura);
return true;
- }
+ }
else
return false;
}
@@ -10371,7 +10371,9 @@ bool Unit::IsImmunedToSpellEffect(SpellInfo const* spellInfo, uint32 index) cons
SpellImmuneList const& list = m_spellImmune[IMMUNITY_STATE];
for (SpellImmuneList::const_iterator itr = list.begin(); itr != list.end(); ++itr)
if (itr->type == aura)
- return true;
+ if (!(spellInfo->AttributesEx3 & SPELL_ATTR3_IGNORE_HIT_RESULT))
+ return true;
+
// Check for immune to application of harmful magical effects
AuraEffectList const& immuneAuraApply = GetAuraEffectsByType(SPELL_AURA_MOD_IMMUNE_AURA_APPLY_SCHOOL);
for (AuraEffectList::const_iterator iter = immuneAuraApply.begin(); iter != immuneAuraApply.end(); ++iter)
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index fdc1a26f6a4..a1cbe86649f 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -8618,6 +8618,41 @@ void ObjectMgr::LoadHotfixData()
sLog->outInfo(LOG_FILTER_SERVER_LOADING, ">> Loaded %u hotfix info entries in %u ms", count, GetMSTimeDiffToNow(oldMSTime));
}
+void ObjectMgr::LoadFactionChangeTitles()
+{
+ uint32 oldMSTime = getMSTime();
+
+ QueryResult result = WorldDatabase.Query("SELECT alliance_id, horde_id FROM player_factionchange_titles");
+
+ if (!result)
+ {
+ sLog->outInfo(LOG_FILTER_SERVER_LOADING, ">> Loaded 0 faction change title pairs. DB table `player_factionchange_title` is empty.");
+ return;
+ }
+
+ uint32 count = 0;
+
+ do
+ {
+ Field* fields = result->Fetch();
+
+ uint32 alliance = fields[0].GetUInt32();
+ uint32 horde = fields[1].GetUInt32();
+
+ if (!sCharTitlesStore.LookupEntry(alliance))
+ sLog->outError(LOG_FILTER_SQL, "Title %u referenced in `player_factionchange_title` does not exist, pair skipped!", alliance);
+ else if (!sCharTitlesStore.LookupEntry(horde))
+ sLog->outError(LOG_FILTER_SQL, "Title %u referenced in `player_factionchange_title` does not exist, pair skipped!", horde);
+ else
+ FactionChange_Titles[alliance] = horde;
+
+ ++count;
+ }
+ while (result->NextRow());
+
+ sLog->outInfo(LOG_FILTER_SERVER_LOADING, ">> Loaded %u faction change title pairs in %u ms", count, GetMSTimeDiffToNow(oldMSTime));
+}
+
GameObjectTemplate const* ObjectMgr::GetGameObjectTemplate(uint32 entry)
{
GameObjectTemplateContainer::const_iterator itr = _gameObjectTemplateStore.find(entry);
diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h
index 644c5064135..8631cfb282d 100755
--- a/src/server/game/Globals/ObjectMgr.h
+++ b/src/server/game/Globals/ObjectMgr.h
@@ -1128,11 +1128,13 @@ class ObjectMgr
CharacterConversionMap FactionChange_Items;
CharacterConversionMap FactionChange_Spells;
CharacterConversionMap FactionChange_Reputation;
+ CharacterConversionMap FactionChange_Titles;
void LoadFactionChangeAchievements();
void LoadFactionChangeItems();
void LoadFactionChangeSpells();
void LoadFactionChangeReputations();
+ void LoadFactionChangeTitles();
void LoadHotfixData();
HotfixData const& GetHotfixData() const { return _hotfixData; }
diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp
index 7951ac25d92..af633544245 100644
--- a/src/server/game/Handlers/CharacterHandler.cpp
+++ b/src/server/game/Handlers/CharacterHandler.cpp
@@ -1732,6 +1732,7 @@ void WorldSession::HandleCharFactionOrRaceChange(WorldPacket& recvData)
uint32 level = uint32(fields[1].GetUInt8());
uint32 at_loginFlags = fields[2].GetUInt16();
uint32 used_loginFlag = ((recvData.GetOpcode() == CMSG_CHAR_RACE_CHANGE) ? AT_LOGIN_CHANGE_RACE : AT_LOGIN_CHANGE_FACTION);
+ char const* knownTitlesStr = fields[3].GetCString();
if (!sObjectMgr->GetPlayerInfo(race, playerClass))
{
@@ -2109,6 +2110,70 @@ void WorldSession::HandleCharFactionOrRaceChange(WorldPacket& recvData)
stmt->setUInt32(2, lowGuid);
trans->Append(stmt);
}
+
+ // Title conversion
+ if (knownTitlesStr)
+ {
+ const uint32 ktcount = KNOWN_TITLES_SIZE * 2;
+ uint32 knownTitles[ktcount];
+ Tokens tokens(knownTitlesStr, ' ', ktcount);
+
+ if (tokens.size() != ktcount)
+ return;
+
+ for (uint32 index = 0; index < ktcount; ++index)
+ knownTitles[index] = atol(tokens[index]);
+
+ for (std::map<uint32, uint32>::const_iterator it = sObjectMgr->FactionChange_Titles.begin(); it != sObjectMgr->FactionChange_Titles.end(); ++it)
+ {
+ uint32 title_alliance = it->first;
+ uint32 title_horde = it->second;
+
+ CharTitlesEntry const* atitleInfo = sCharTitlesStore.LookupEntry(title_alliance);
+ CharTitlesEntry const* htitleInfo = sCharTitlesStore.LookupEntry(title_horde);
+ // new team
+ if (team == BG_TEAM_ALLIANCE)
+ {
+ uint32 bitIndex = htitleInfo->bit_index;
+ uint32 index = bitIndex / 32;
+ uint32 old_flag = 1 << (bitIndex % 32);
+ uint32 new_flag = 1 << (atitleInfo->bit_index % 32);
+ if (knownTitles[index] & old_flag)
+ {
+ knownTitles[index] &= ~old_flag;
+ // use index of the new title
+ knownTitles[atitleInfo->bit_index / 32] |= new_flag;
+ }
+ }
+ else
+ {
+ uint32 bitIndex = atitleInfo->bit_index;
+ uint32 index = bitIndex / 32;
+ uint32 old_flag = 1 << (bitIndex % 32);
+ uint32 new_flag = 1 << (htitleInfo->bit_index % 32);
+ if (knownTitles[index] & old_flag)
+ {
+ knownTitles[index] &= ~old_flag;
+ // use index of the new title
+ knownTitles[htitleInfo->bit_index / 32] |= new_flag;
+ }
+ }
+
+ std::ostringstream ss;
+ for (uint32 index = 0; index < ktcount; ++index)
+ ss << knownTitles[index] << ' ';
+
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHAR_TITLES_FACTION_CHANGE);
+ stmt->setString(0, ss.str().c_str());
+ stmt->setUInt32(1, lowGuid);
+ trans->Append(stmt);
+
+ // unset any currently chosen title
+ stmt = CharacterDatabase.GetPreparedStatement(CHAR_RES_CHAR_TITLES_FACTION_CHANGE);
+ stmt->setUInt32(0, lowGuid);
+ trans->Append(stmt);
+ }
+ }
}
CharacterDatabase.CommitTransaction(trans);
diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
index 85a1f07f490..b18a4497b68 100644
--- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp
+++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
@@ -2251,6 +2251,10 @@ void AuraEffect::HandleAuraTransform(AuraApplication const* aurApp, uint8 mode,
case 75532:
target->SetDisplayId(target->getGender() == GENDER_MALE ? 31737 : 31738);
break;
+ // Gnomeregan Pride
+ case 75531:
+ target->SetDisplayId(target->getGender() == GENDER_MALE ? 31654 : 31655);
+ break;
default:
break;
}
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index b424214510a..e1aa214c583 100644
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -1628,6 +1628,9 @@ void World::SetInitialWorldSettings()
sLog->outInfo(LOG_FILTER_SERVER_LOADING, "Loading faction change reputation pairs...");
sObjectMgr->LoadFactionChangeReputations();
+ sLog->outInfo(LOG_FILTER_SERVER_LOADING, "Loading faction change title pairs...");
+ sObjectMgr->LoadFactionChangeTitles();
+
sLog->outInfo(LOG_FILTER_SERVER_LOADING, "Loading GM tickets...");
sTicketMgr->LoadTickets();
diff --git a/src/server/scripts/Kalimdor/tanaris.cpp b/src/server/scripts/Kalimdor/tanaris.cpp
index 45fbb15e582..7053f48c851 100644
--- a/src/server/scripts/Kalimdor/tanaris.cpp
+++ b/src/server/scripts/Kalimdor/tanaris.cpp
@@ -41,20 +41,20 @@ EndContentData */
enum CustodianOfTime
{
- WHISPER_CUSTODIAN_1 = -1000217,
- WHISPER_CUSTODIAN_2 = -1000218,
- WHISPER_CUSTODIAN_3 = -1000219,
- WHISPER_CUSTODIAN_4 = -1000220,
- WHISPER_CUSTODIAN_5 = -1000221,
- WHISPER_CUSTODIAN_6 = -1000222,
- WHISPER_CUSTODIAN_7 = -1000223,
- WHISPER_CUSTODIAN_8 = -1000224,
- WHISPER_CUSTODIAN_9 = -1000225,
- WHISPER_CUSTODIAN_10 = -1000226,
- WHISPER_CUSTODIAN_11 = -1000227,
- WHISPER_CUSTODIAN_12 = -1000228,
- WHISPER_CUSTODIAN_13 = -1000229,
- WHISPER_CUSTODIAN_14 = -1000230
+ WHISPER_CUSTODIAN_1 = 0,
+ WHISPER_CUSTODIAN_2 = 1,
+ WHISPER_CUSTODIAN_3 = 2,
+ WHISPER_CUSTODIAN_4 = 3,
+ WHISPER_CUSTODIAN_5 = 4,
+ WHISPER_CUSTODIAN_6 = 5,
+ WHISPER_CUSTODIAN_7 = 6,
+ WHISPER_CUSTODIAN_8 = 7,
+ WHISPER_CUSTODIAN_9 = 8,
+ WHISPER_CUSTODIAN_10 = 9,
+ WHISPER_CUSTODIAN_11 = 10,
+ WHISPER_CUSTODIAN_12 = 11,
+ WHISPER_CUSTODIAN_13 = 12,
+ WHISPER_CUSTODIAN_14 = 13
};
class npc_custodian_of_time : public CreatureScript
@@ -78,58 +78,58 @@ public:
switch (waypointId)
{
case 0:
- DoScriptText(WHISPER_CUSTODIAN_1, me, player);
+ Talk(WHISPER_CUSTODIAN_1, player->GetGUID());
break;
case 1:
- DoScriptText(WHISPER_CUSTODIAN_2, me, player);
+ Talk(WHISPER_CUSTODIAN_2, player->GetGUID());
break;
case 2:
- DoScriptText(WHISPER_CUSTODIAN_3, me, player);
+ Talk(WHISPER_CUSTODIAN_3, player->GetGUID());
break;
case 3:
- DoScriptText(WHISPER_CUSTODIAN_4, me, player);
+ Talk(WHISPER_CUSTODIAN_4, player->GetGUID());
break;
case 5:
- DoScriptText(WHISPER_CUSTODIAN_5, me, player);
+ Talk(WHISPER_CUSTODIAN_5, player->GetGUID());
break;
case 6:
- DoScriptText(WHISPER_CUSTODIAN_6, me, player);
+ Talk(WHISPER_CUSTODIAN_6, player->GetGUID());
break;
case 7:
- DoScriptText(WHISPER_CUSTODIAN_7, me, player);
+ Talk(WHISPER_CUSTODIAN_7, player->GetGUID());
break;
case 8:
- DoScriptText(WHISPER_CUSTODIAN_8, me, player);
+ Talk(WHISPER_CUSTODIAN_8, player->GetGUID());
break;
case 9:
- DoScriptText(WHISPER_CUSTODIAN_9, me, player);
+ Talk(WHISPER_CUSTODIAN_9, player->GetGUID());
break;
case 10:
- DoScriptText(WHISPER_CUSTODIAN_4, me, player);
+ Talk(WHISPER_CUSTODIAN_4, player->GetGUID());
break;
case 13:
- DoScriptText(WHISPER_CUSTODIAN_10, me, player);
+ Talk(WHISPER_CUSTODIAN_10, player->GetGUID());
break;
case 14:
- DoScriptText(WHISPER_CUSTODIAN_4, me, player);
+ Talk(WHISPER_CUSTODIAN_4, player->GetGUID());
break;
case 16:
- DoScriptText(WHISPER_CUSTODIAN_11, me, player);
+ Talk(WHISPER_CUSTODIAN_11, player->GetGUID());
break;
case 17:
- DoScriptText(WHISPER_CUSTODIAN_12, me, player);
+ Talk(WHISPER_CUSTODIAN_12, player->GetGUID());
break;
case 18:
- DoScriptText(WHISPER_CUSTODIAN_4, me, player);
+ Talk(WHISPER_CUSTODIAN_4, player->GetGUID());
break;
case 22:
- DoScriptText(WHISPER_CUSTODIAN_13, me, player);
+ Talk(WHISPER_CUSTODIAN_13, player->GetGUID());
break;
case 23:
- DoScriptText(WHISPER_CUSTODIAN_4, me, player);
+ Talk(WHISPER_CUSTODIAN_4, player->GetGUID());
break;
case 24:
- DoScriptText(WHISPER_CUSTODIAN_14, me, player);
+ Talk(WHISPER_CUSTODIAN_14, player->GetGUID());
DoCast(player, 34883);
// below here is temporary workaround, to be removed when spell works properly
player->AreaExploredOrEventHappens(10277);
diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp
index 7f4da5666ff..9274a016e2f 100644
--- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp
@@ -19,16 +19,13 @@
#include "ScriptedCreature.h"
#include "ahnkahet.h"
-//not in db
enum Yells
{
- SAY_AGGRO = -1619014,
- SAY_SLAY_1 = -1619015,
- SAY_SLAY_2 = -1619016,
- SAY_SLAY_3 = -1619017,
- SAY_DEATH = -1619018,
- SAY_EGG_SAC_1 = -1619019,
- SAY_EGG_SAC_2 = -1619020
+ SAY_AGGRO = 0,
+ SAY_SLAY = 1,
+ SAY_DEATH = 2,
+ SAY_EGG_SAC = 3,
+ EMOTE_HATCHES = 4
};
enum Spells
@@ -50,8 +47,6 @@ enum Creatures
#define ACTION_AHNKAHAR_GUARDIAN_DEAD 1
#define DATA_RESPECT_YOUR_ELDERS 2
-#define EMOTE_HATCHES "An Ahn'kahar Guardian hatches!"
-
class boss_elder_nadox : public CreatureScript
{
public:
@@ -61,7 +56,7 @@ class boss_elder_nadox : public CreatureScript
{
boss_elder_nadoxAI(Creature* creature) : ScriptedAI(creature)
{
- instance = me->GetInstanceScript();
+ instance = creature->GetInstanceScript();
}
uint32 uiPlagueTimer;
@@ -78,16 +73,13 @@ class boss_elder_nadox : public CreatureScript
void Reset()
{
- uiPlagueTimer = 13000;
- uiRagueTimer = 20000;
-
+ uiPlagueTimer = 13000;
+ uiRagueTimer = 20000;
uiSwarmerSpawnTimer = 10000;
- uiGuardSpawnTimer = 25000;
-
- uiEnrageTimer = 5000;
-
- bGuardSpawned = false;
- respectYourElders = true;
+ uiGuardSpawnTimer = 25000;
+ uiEnrageTimer = 5000;
+ bGuardSpawned = false;
+ respectYourElders = true;
if (instance)
instance->SetData(DATA_ELDER_NADOX_EVENT, NOT_STARTED);
@@ -95,7 +87,7 @@ class boss_elder_nadox : public CreatureScript
void EnterCombat(Unit* /*who*/)
{
- DoScriptText(SAY_DEATH, me);
+ Talk(SAY_AGGRO);
if (instance)
instance->SetData(DATA_ELDER_NADOX_EVENT, IN_PROGRESS);
@@ -103,12 +95,12 @@ class boss_elder_nadox : public CreatureScript
void KilledUnit(Unit* /*who*/)
{
- DoScriptText(RAND(SAY_SLAY_1, SAY_SLAY_2, SAY_SLAY_3), me);
+ Talk(SAY_SLAY);
}
void JustDied(Unit* /*killer*/)
{
- DoScriptText(SAY_SLAY_3, me); //SAY_SLAY_3 on death?
+ Talk(SAY_DEATH);
if (instance)
instance->SetData(DATA_ELDER_NADOX_EVENT, DONE);
@@ -135,7 +127,7 @@ class boss_elder_nadox : public CreatureScript
if (uiPlagueTimer <= diff)
{
- DoCast(me->getVictim(), SPELL_BROOD_PLAGUE);
+ DoCastVictim(SPELL_BROOD_PLAGUE);
uiPlagueTimer = 15000;
}
else
@@ -160,7 +152,7 @@ class boss_elder_nadox : public CreatureScript
DoCast(me, SPELL_SUMMON_SWARMERS, true);
DoCast(me, SPELL_SUMMON_SWARMERS);
if (urand(1, 3) == 3) // 33% chance of dialog
- DoScriptText(RAND(SAY_EGG_SAC_1, SAY_EGG_SAC_2), me);
+ Talk(SAY_EGG_SAC);
uiSwarmerSpawnTimer = 10000;
}
@@ -169,7 +161,7 @@ class boss_elder_nadox : public CreatureScript
if (!bGuardSpawned && uiGuardSpawnTimer <= diff)
{
- me->MonsterTextEmote(EMOTE_HATCHES, me->GetGUID(), true);
+ Talk(EMOTE_HATCHES, me->GetGUID());
DoCast(me, SPELL_SUMMON_SWARM_GUARD);
bGuardSpawned = true;
}
@@ -217,7 +209,7 @@ class mob_ahnkahar_nerubian : public CreatureScript
{
mob_ahnkahar_nerubianAI(Creature* creature) : ScriptedAI(creature)
{
- instance = me->GetInstanceScript();
+ instance = creature->GetInstanceScript();
}
InstanceScript* instance;
@@ -237,9 +229,7 @@ class mob_ahnkahar_nerubian : public CreatureScript
Nadox->AI()->DoAction(ACTION_AHNKAHAR_GUARDIAN_DEAD);
}
- void EnterCombat(Unit* /*who*/)
- {
- }
+ void EnterCombat(Unit* /*who*/) {}
void UpdateAI(uint32 const diff)
{
@@ -300,9 +290,7 @@ public:
class achievement_respect_your_elders : public AchievementCriteriaScript
{
public:
- achievement_respect_your_elders() : AchievementCriteriaScript("achievement_respect_your_elders")
- {
- }
+ achievement_respect_your_elders() : AchievementCriteriaScript("achievement_respect_your_elders") {}
bool OnCheck(Player* /*player*/, Unit* target)
{
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp
index 98b3a6b658b..6a4a5255293 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp
@@ -21,97 +21,93 @@
enum Yells
{
- SAY_AGGRO = -1603240,
- SAY_HARDMODE_ON = -1603241,
- SAY_MKII_ACTIVATE = -1603242,
- SAY_MKII_SLAY_1 = -1603243,
- SAY_MKII_SLAY_2 = -1603244,
- SAY_MKII_DEATH = -1603245,
- SAY_VX001_ACTIVATE = -1603246,
- SAY_VX001_SLAY_1 = -1603247,
- SAY_VX001_SLAY_2 = -1603248,
- SAY_VX001_DEATH = -1603249,
- SAY_AERIAL_ACTIVATE = -1603250,
- SAY_AERIAL_SLAY_1 = -1603251,
- SAY_AERIAL_SLAY_2 = -1603252,
- SAY_AERIAL_DEATH = -1603253,
- SAY_V07TRON_ACTIVATE = -1603254,
- SAY_V07TRON_SLAY_1 = -1603255,
- SAY_V07TRON_SLAY_2 = -1603256,
- SAY_V07TRON_DEATH = -1603257,
- SAY_BERSERK = -1603258,
- SAY_YS_HELP = -1603259,
+ SAY_AGGRO = 0,
+ SAY_HARDMODE_ON = 1,
+ SAY_MKII_ACTIVATE = 2,
+ SAY_MKII_SLAY = 3,
+ SAY_MKII_DEATH = 4,
+ SAY_VX001_ACTIVATE = 5,
+ SAY_VX001_SLAY = 6,
+ SAY_VX001_DEATH = 7,
+ SAY_AERIAL_ACTIVATE = 8,
+ SAY_AERIAL_SLAY = 9,
+ SAY_AERIAL_DEATH = 10,
+ SAY_V07TRON_ACTIVATE = 11,
+ SAY_V07TRON_SLAY = 12,
+ SAY_V07TRON_DEATH = 13,
+ SAY_BERSERK = 14,
+ SAY_YS_HELP = 15
};
enum Spells
{
- SPELL_JETPACK = 63341,
- SPELL_EMERGENCY_MODE = 64582,
- SPELL_SELF_REPAIR = 64383,
- SPELL_MAGNETIC_CORE = 64444,
- // Leviathan MK II
- SPELL_FLAME_SUPPRESSANT_MK = 64570,
- SPELL_NAPALM_SHELL = 63666,
- SPELL_PLASMA_BLAST = 62977,
- SPELL_PROXIMITY_MINES = 63027,
- SPELL_SHOCK_BLAST = 63631,
- // VX 001
- SPELL_FLAME_SUPPRESSANT_VX = 65192,
- SPELL_FROSTBOMB = 64623,
- SPELL_HAND_PULSE = 64348,
- SPELL_SPINNING_UP = 63414,
- SPELL_RAPID_BURST = 63387,
- SPELL_P3WX2_LASER_BARRAGE = 63293,
- SPELL_ROCKET_STRIKE = 63041,
- SPELL_HEAT_WAVE = 63677,
- // Aerial Command Unit
- SPELL_PLASMA_BALL = 63689,
- // Additonal spells
- SPELL_MAGNETIC_FIELD = 64668,
- SPELL_DEAFENING_SIREN = 64616,
- SPELL_WATER_SPRAY = 64619,
- SPELL_FROST_BOMB_HARD_MODE = 64627,
- SPELL_EXPLOSION = 66351,
- SPELL_DISARM = 1842,
- SPELL_RIDE_VEHICLE = 46598,
- SPELL_TRIGGER_MISSILE = 65347,
+ SPELL_JETPACK = 63341,
+ SPELL_EMERGENCY_MODE = 64582,
+ SPELL_SELF_REPAIR = 64383,
+ SPELL_MAGNETIC_CORE = 64444,
+ // Leviathan MK II
+ SPELL_FLAME_SUPPRESSANT_MK = 64570,
+ SPELL_NAPALM_SHELL = 63666,
+ SPELL_PLASMA_BLAST = 62977,
+ SPELL_PROXIMITY_MINES = 63027,
+ SPELL_SHOCK_BLAST = 63631,
+ // VX 001
+ SPELL_FLAME_SUPPRESSANT_VX = 65192,
+ SPELL_FROSTBOMB = 64623,
+ SPELL_HAND_PULSE = 64348,
+ SPELL_SPINNING_UP = 63414,
+ SPELL_RAPID_BURST = 63387,
+ SPELL_P3WX2_LASER_BARRAGE = 63293,
+ SPELL_ROCKET_STRIKE = 63041,
+ SPELL_HEAT_WAVE = 63677,
+ // Aerial Command Unit
+ SPELL_PLASMA_BALL = 63689,
+ // Additonal spells
+ SPELL_MAGNETIC_FIELD = 64668,
+ SPELL_DEAFENING_SIREN = 64616,
+ SPELL_WATER_SPRAY = 64619,
+ SPELL_FROST_BOMB_HARD_MODE = 64627,
+ SPELL_EXPLOSION = 66351,
+ SPELL_DISARM = 1842,
+ SPELL_RIDE_VEHICLE = 46598,
+ SPELL_TRIGGER_MISSILE = 65347,
};
enum Npc
{
- NPC_ASSAULT_BOT = 34057,
- NPC_BOMB_BOT = 33836,
- NPC_JUNK_BOT = 33855,
- NPC_EMERGENCE_FIRE_BOT = 34147,
- NPC_FROST_BOMB = 34149,
+ NPC_ASSAULT_BOT = 34057,
+ NPC_BOMB_BOT = 33836,
+ NPC_JUNK_BOT = 33855,
+ NPC_EMERGENCE_FIRE_BOT = 34147,
+ NPC_FROST_BOMB = 34149,
};
class spell_ulduar_proximity_mines : public SpellScriptLoader
{
- public:
- spell_ulduar_proximity_mines() : SpellScriptLoader("spell_ulduar_proximity_mines") { }
+ public:
+ spell_ulduar_proximity_mines() : SpellScriptLoader("spell_ulduar_proximity_mines") { }
- class spell_ulduar_proximity_minesSpellScript : public SpellScript
- {
- PrepareSpellScript(spell_ulduar_proximity_minesSpellScript)
+ class spell_ulduar_proximity_minesSpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_ulduar_proximity_minesSpellScript)
- void HandleScript(SpellEffIndex effIndex)
- {
- PreventHitDefaultEffect(effIndex);
- for (uint8 i = 0; i < 10; ++i)
- GetCaster()->CastSpell(GetCaster(), SPELL_TRIGGER_MISSILE, true);
- }
+ void HandleScript(SpellEffIndex effIndex)
+ {
+ PreventHitDefaultEffect(effIndex);
+ for (uint8 i = 0; i < 10; ++i)
+ GetCaster()->CastSpell(GetCaster(), SPELL_TRIGGER_MISSILE, true);
+ }
- void Register()
- {
- OnEffectHitTarget += SpellEffectFn(spell_ulduar_proximity_minesSpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
- }
- };
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_ulduar_proximity_minesSpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
- SpellScript* GetSpellScript() const
- {
- return new spell_ulduar_proximity_minesSpellScript();
- }
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_ulduar_proximity_minesSpellScript();
+ }
};
void AddSC_boss_mimiron()
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp
index e8e938dc06b..6038b7ed9d6 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp
@@ -369,7 +369,7 @@ class boss_razorscale : public CreatureScript
void MovementInform(uint32 type, uint32 id)
{
- if (type == POINT_MOTION_TYPE && id == 1)
+ if (type == EFFECT_MOTION_TYPE && id == 1)
{
phase = PHASE_GROUND;
events.SetPhase(PHASE_GROUND);
@@ -407,7 +407,7 @@ class boss_razorscale : public CreatureScript
if (HarpoonCounter == RAID_MODE(2, 4))
{
HarpoonCounter = 0;
- me->GetMotionMaster()->MovePoint(1, RazorGround);
+ me->GetMotionMaster()->MoveLand(1, RazorGround);
}
if (phase == PHASE_GROUND)
@@ -423,7 +423,7 @@ class boss_razorscale : public CreatureScript
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->SetReactState(REACT_PASSIVE);
me->AttackStop();
- me->GetMotionMaster()->MovePoint(0, RazorFlight);
+ me->GetMotionMaster()->MoveTakeoff(0, RazorFlight);
events.ScheduleEvent(EVENT_FIREBALL, 7000, 0, PHASE_FLIGHT);
events.ScheduleEvent(EVENT_DEVOURING, 10000, 0, PHASE_FLIGHT);
events.ScheduleEvent(EVENT_SUMMON, 5000, 0, PHASE_FLIGHT);
@@ -525,7 +525,7 @@ class boss_razorscale : public CreatureScript
phase = PHASE_PERMAGROUND;
events.SetPhase(PHASE_PERMAGROUND);
me->SetCanFly(false);
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_STUNNED | UNIT_FLAG_PACIFIED);
me->SetReactState(REACT_AGGRESSIVE);
me->RemoveAurasDueToSpell(SPELL_HARPOON_TRIGGER);
me->SetSpeed(MOVE_FLIGHT, 1.0f, true);
diff --git a/src/server/scripts/Spells/spell_paladin.cpp b/src/server/scripts/Spells/spell_paladin.cpp
index 3570c9e8d75..34a54f91a2e 100644
--- a/src/server/scripts/Spells/spell_paladin.cpp
+++ b/src/server/scripts/Spells/spell_paladin.cpp
@@ -627,7 +627,7 @@ class spell_pal_divine_sacrifice : public SpellScriptLoader
bool Load()
{
-
+
if (Unit* caster = GetCaster())
{
if (caster->GetTypeId() == TYPEID_PLAYER)
diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.cpp b/src/server/shared/Database/Implementation/CharacterDatabase.cpp
index 3004e3d4e21..0282776e573 100644
--- a/src/server/shared/Database/Implementation/CharacterDatabase.cpp
+++ b/src/server/shared/Database/Implementation/CharacterDatabase.cpp
@@ -443,7 +443,7 @@ void CharacterDatabaseConnection::DoPrepareStatements()
PREPARE_STATEMENT(CHAR_SEL_CHAR_GUID_NAME_BY_ACC, "SELECT guid, name FROM characters WHERE account = ?", CONNECTION_SYNCH);
PREPARE_STATEMENT(CHAR_SEL_POOL_QUEST_SAVE, "SELECT quest_id FROM pool_quest_save WHERE pool_id = ?", CONNECTION_SYNCH);
PREPARE_STATEMENT(CHAR_SEL_CHARACTER_AT_LOGIN, "SELECT at_login FROM characters WHERE guid = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_CHAR_CLASS_LVL_AT_LOGIN, "SELECT class, level, at_login FROM characters WHERE guid = ?", CONNECTION_SYNCH);
+ PREPARE_STATEMENT(CHAR_SEL_CHAR_CLASS_LVL_AT_LOGIN, "SELECT class, level, at_login, knownTitles FROM characters WHERE guid = ?", CONNECTION_SYNCH);
PREPARE_STATEMENT(CHAR_SEL_INSTANCE, "SELECT data, completedEncounters FROM instance WHERE map = ? AND id = ?", CONNECTION_SYNCH);
PREPARE_STATEMENT(CHAR_SEL_PET_SPELL_LIST, "SELECT DISTINCT pet_spell.spell FROM pet_spell, character_pet WHERE character_pet.owner = ? AND character_pet.id = pet_spell.guid AND character_pet.id <> ?", CONNECTION_SYNCH);
PREPARE_STATEMENT(CHAR_SEL_CHAR_PET, "SELECT id FROM character_pet WHERE owner = ? AND id <> ?", CONNECTION_SYNCH);
@@ -521,6 +521,8 @@ void CharacterDatabaseConnection::DoPrepareStatements()
PREPARE_STATEMENT(CHAR_UPD_CHAR_SPELL_FACTION_CHANGE, "UPDATE character_spell SET spell = ? where spell = ? AND guid = ?", CONNECTION_ASYNC);
PREPARE_STATEMENT(CHAR_DEL_CHAR_REP_BY_FACTION, "DELETE FROM character_reputation WHERE faction = ? AND guid = ?", CONNECTION_ASYNC);
PREPARE_STATEMENT(CHAR_UPD_CHAR_REP_FACTION_CHANGE, "UPDATE character_reputation SET faction = ? where faction = ? AND guid = ?", CONNECTION_ASYNC);
+ PREPARE_STATEMENT(CHAR_UPD_CHAR_TITLES_FACTION_CHANGE, "UPDATE characters SET knownTitles = ? WHERE guid = ?", CONNECTION_ASYNC);
+ PREPARE_STATEMENT(CHAR_RES_CHAR_TITLES_FACTION_CHANGE, "UPDATE characters SET chosenTitle = 0 WHERE guid = ?", CONNECTION_ASYNC);
PREPARE_STATEMENT(CHAR_DEL_CHAR_SPELL_COOLDOWN, "DELETE FROM character_spell_cooldown WHERE guid = ?", CONNECTION_ASYNC);
PREPARE_STATEMENT(CHAR_DEL_CHARACTER, "DELETE FROM characters WHERE guid = ?", CONNECTION_ASYNC);
PREPARE_STATEMENT(CHAR_DEL_CHAR_ACTION, "DELETE FROM character_action WHERE guid = ?", CONNECTION_ASYNC);
diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.h b/src/server/shared/Database/Implementation/CharacterDatabase.h
index 5eb17f513a9..00402e072b3 100755
--- a/src/server/shared/Database/Implementation/CharacterDatabase.h
+++ b/src/server/shared/Database/Implementation/CharacterDatabase.h
@@ -483,6 +483,8 @@ enum CharacterDatabaseStatements
CHAR_UPD_CHAR_SPELL_FACTION_CHANGE,
CHAR_DEL_CHAR_REP_BY_FACTION,
CHAR_UPD_CHAR_REP_FACTION_CHANGE,
+ CHAR_UPD_CHAR_TITLES_FACTION_CHANGE,
+ CHAR_RES_CHAR_TITLES_FACTION_CHANGE,
CHAR_DEL_CHAR_SPELL_COOLDOWN,
CHAR_DEL_CHARACTER,
CHAR_DEL_CHAR_ACTION,
diff --git a/src/server/shared/Logging/Log.cpp b/src/server/shared/Logging/Log.cpp
index ed65104d6ac..9f3c8f77739 100644
--- a/src/server/shared/Logging/Log.cpp
+++ b/src/server/shared/Logging/Log.cpp
@@ -281,9 +281,12 @@ void Log::vlog(LogFilterType filter, LogLevel level, char const* str, va_list ar
void Log::write(LogMessage* msg)
{
- msg->text.append("\n");
- Logger* logger = GetLoggerByType(msg->type);
- worker->enqueue(new LogOperation(logger, msg));
+ if (worker)
+ {
+ msg->text.append("\n");
+ Logger* logger = GetLoggerByType(msg->type);
+ worker->enqueue(new LogOperation(logger, msg));
+ }
}
std::string Log::GetTimestampStr()
@@ -481,6 +484,7 @@ void Log::Close()
void Log::LoadFromConfig()
{
Close();
+ worker = new LogWorker();
AppenderId = 0;
m_logsDir = ConfigMgr::GetStringDefault("LogsDir", "");
if (!m_logsDir.empty())
@@ -488,5 +492,4 @@ void Log::LoadFromConfig()
m_logsDir.push_back('/');
ReadAppendersFromConfig();
ReadLoggersFromConfig();
- worker = new LogWorker();
}