diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index c2f6aad4e49..a00cd07caf8 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -782,7 +782,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u if (e.action.removeAura.charges) { if (Aura* aur = (*itr)->ToUnit()->GetAura(e.action.removeAura.spell)) - aur->ModCharges(-e.action.removeAura.charges, AURA_REMOVE_BY_EXPIRE); + aur->ModCharges(-static_cast(e.action.removeAura.charges), AURA_REMOVE_BY_EXPIRE); } else (*itr)->ToUnit()->RemoveAurasDueToSpell(e.action.removeAura.spell); diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 49716bf19c1..889f82c8a51 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -24874,7 +24874,7 @@ Player* Player::GetNextRandomRaidMember(float radius) return nearMembers[randTarget]; } -PartyResult Player::CanUninviteFromGroup() const +PartyResult Player::CanUninviteFromGroup(ObjectGuid guidMember) const { Group const* grp = GetGroup(); if (!grp) @@ -24916,6 +24916,9 @@ PartyResult Player::CanUninviteFromGroup() const if (InBattleground()) return ERR_INVITE_RESTRICTED; + + if (grp->IsLeader(guidMember)) + return ERR_NOT_LEADER; } return ERR_PARTY_RESULT_OK; diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 5b117d8cb81..834aeee5d93 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -2472,7 +2472,7 @@ class Player : public Unit, public GridObject uint64 GetAuraUpdateMaskForRaid() const { return m_auraRaidUpdateMask; } void SetAuraUpdateMaskForRaid(uint8 slot) { m_auraRaidUpdateMask |= (uint64(1) << slot); } Player* GetNextRandomRaidMember(float radius); - PartyResult CanUninviteFromGroup() const; + PartyResult CanUninviteFromGroup(ObjectGuid guidMember = ObjectGuid::Empty) const; // Battleground / Battlefield Group System void SetBattlegroundOrBattlefieldRaid(Group* group, int8 subgroup = -1); diff --git a/src/server/game/Handlers/GroupHandler.cpp b/src/server/game/Handlers/GroupHandler.cpp index 6ab681592d5..e337180f5fd 100644 --- a/src/server/game/Handlers/GroupHandler.cpp +++ b/src/server/game/Handlers/GroupHandler.cpp @@ -416,7 +416,7 @@ void WorldSession::HandleGroupUninviteGuidOpcode(WorldPacket& recvData) return; } - PartyResult res = GetPlayer()->CanUninviteFromGroup(); + PartyResult res = GetPlayer()->CanUninviteFromGroup(guid); if (res != ERR_PARTY_RESULT_OK) { SendPartyResult(PARTY_OP_UNINVITE, "", res); @@ -424,14 +424,8 @@ void WorldSession::HandleGroupUninviteGuidOpcode(WorldPacket& recvData) } Group* grp = GetPlayer()->GetGroup(); - if (!grp) - return; - - if (grp->IsLeader(guid)) - { - SendPartyResult(PARTY_OP_UNINVITE, "", ERR_NOT_LEADER); - return; - } + // grp is checked already above in CanUninviteFromGroup() + ASSERT(grp); if (grp->IsMember(guid)) { diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp index c5487ff58f6..14be8c51bc2 100644 --- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp @@ -887,7 +887,7 @@ class go_loosely_turned_soil : public GameObjectScript public: go_loosely_turned_soil() : GameObjectScript("go_loosely_turned_soil") { } - bool OnGossipHello(Player* player, GameObject* go) override + bool OnGossipHello(Player* player, GameObject* /*go*/) override { if (InstanceScript* instance = player->GetInstanceScript()) if (instance->GetBossState(DATA_HORSEMAN_EVENT) == IN_PROGRESS || player->GetQuestStatus(QUEST_CALL_THE_HEADLESS_HORSEMAN) != QUEST_STATUS_COMPLETE) diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp index 604cb6c48d1..952e35642d0 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp @@ -83,6 +83,7 @@ class instance_ulduar : public InstanceMapScript IsDriveMeCrazyEligible = true; _algalonSummoned = false; _summonAlgalon = false; + _CoUAchivePlayerDeathMask = 0; memset(_summonObservationRingKeeper, 0, sizeof(_summonObservationRingKeeper)); memset(_summonYSKeeper, 0, sizeof(_summonYSKeeper)); @@ -592,6 +593,19 @@ class instance_ulduar : public InstanceMapScript void OnUnitDeath(Unit* unit) override { + // Champion/Conqueror of Ulduar + if (unit->GetTypeId() == TYPEID_PLAYER) + { + for (uint8 i = 0; i < BOSS_ALGALON; i++) + { + if (GetBossState(i) == IN_PROGRESS) + { + _CoUAchivePlayerDeathMask |= (1 << i); + SaveToDB(); + } + } + } + Creature* creature = unit->ToCreature(); if (!creature) return; @@ -1007,6 +1021,45 @@ class instance_ulduar : public InstanceMapScript case CRITERIA_ALONE_IN_THE_DARKNESS_10: case CRITERIA_ALONE_IN_THE_DARKNESS_25: return keepersCount == 0; + case CRITERIA_C_O_U_LEVIATHAN_10: + case CRITERIA_C_O_U_LEVIATHAN_25: + return (_CoUAchivePlayerDeathMask & (1 << BOSS_LEVIATHAN)) == 0; + case CRITERIA_C_O_U_IGNIS_10: + case CRITERIA_C_O_U_IGNIS_25: + return (_CoUAchivePlayerDeathMask & (1 << BOSS_IGNIS)) == 0; + case CRITERIA_C_O_U_RAZORSCALE_10: + case CRITERIA_C_O_U_RAZORSCALE_25: + return (_CoUAchivePlayerDeathMask & (1 << BOSS_RAZORSCALE)) == 0; + case CRITERIA_C_O_U_XT002_10: + case CRITERIA_C_O_U_XT002_25: + return (_CoUAchivePlayerDeathMask & (1 << BOSS_XT002)) == 0; + case CRITERIA_C_O_U_IRON_COUNCIL_10: + case CRITERIA_C_O_U_IRON_COUNCIL_25: + return (_CoUAchivePlayerDeathMask & (1 << BOSS_ASSEMBLY_OF_IRON)) == 0; + case CRITERIA_C_O_U_KOLOGARN_10: + case CRITERIA_C_O_U_KOLOGARN_25: + return (_CoUAchivePlayerDeathMask & (1 << BOSS_KOLOGARN)) == 0; + case CRITERIA_C_O_U_AURIAYA_10: + case CRITERIA_C_O_U_AURIAYA_25: + return (_CoUAchivePlayerDeathMask & (1 << BOSS_AURIAYA)) == 0; + case CRITERIA_C_O_U_HODIR_10: + case CRITERIA_C_O_U_HODIR_25: + return (_CoUAchivePlayerDeathMask & (1 << BOSS_HODIR)) == 0; + case CRITERIA_C_O_U_THORIM_10: + case CRITERIA_C_O_U_THORIM_25: + return (_CoUAchivePlayerDeathMask & (1 << BOSS_THORIM)) == 0; + case CRITERIA_C_O_U_FREYA_10: + case CRITERIA_C_O_U_FREYA_25: + return (_CoUAchivePlayerDeathMask & (1 << BOSS_FREYA)) == 0; + case CRITERIA_C_O_U_MIMIRON_10: + case CRITERIA_C_O_U_MIMIRON_25: + return (_CoUAchivePlayerDeathMask & (1 << BOSS_MIMIRON)) == 0; + case CRITERIA_C_O_U_VEZAX_10: + case CRITERIA_C_O_U_VEZAX_25: + return (_CoUAchivePlayerDeathMask & (1 << BOSS_VEZAX)) == 0; + case CRITERIA_C_O_U_YOGG_SARON_10: + case CRITERIA_C_O_U_YOGG_SARON_25: + return (_CoUAchivePlayerDeathMask & (1 << BOSS_YOGG_SARON)) == 0; } return false; @@ -1018,6 +1071,8 @@ class instance_ulduar : public InstanceMapScript for (uint8 i = 0; i < 4; ++i) data << ' ' << uint32(KeeperGUIDs[i] ? 1 : 0); + + data << ' ' << _CoUAchivePlayerDeathMask; } void ReadSaveDataMore(std::istringstream& data) override @@ -1056,6 +1111,8 @@ class instance_ulduar : public InstanceMapScript _summonObservationRingKeeper[2] = true; if (GetBossState(BOSS_MIMIRON) == DONE && !_summonYSKeeper[3]) _summonObservationRingKeeper[3] = true; + + data >> _CoUAchivePlayerDeathMask; } void Update(uint32 diff) override @@ -1095,6 +1152,7 @@ class instance_ulduar : public InstanceMapScript bool _summonYSKeeper[4]; uint32 _maxArmorItemLevel; uint32 _maxWeaponItemLevel; + uint32 _CoUAchivePlayerDeathMask; }; InstanceScript* GetInstanceScript(InstanceMap* map) const override diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h b/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h index b3b17cb0f11..ddf293dd8b8 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h @@ -36,16 +36,16 @@ enum UlduarBosses BOSS_ASSEMBLY_OF_IRON = 4, BOSS_KOLOGARN = 5, BOSS_AURIAYA = 6, - BOSS_MIMIRON = 7, - BOSS_HODIR = 8, - BOSS_THORIM = 9, - BOSS_FREYA = 10, - BOSS_BRIGHTLEAF = 11, - BOSS_IRONBRANCH = 12, - BOSS_STONEBARK = 13, - BOSS_VEZAX = 14, - BOSS_YOGG_SARON = 15, - BOSS_ALGALON = 16, + BOSS_HODIR = 7, + BOSS_THORIM = 8, + BOSS_FREYA = 9, + BOSS_MIMIRON = 10, + BOSS_VEZAX = 11, + BOSS_YOGG_SARON = 12, + BOSS_ALGALON = 13, + BOSS_BRIGHTLEAF = 14, + BOSS_IRONBRANCH = 15, + BOSS_STONEBARK = 16, }; enum UlduarNPCs @@ -295,6 +295,35 @@ enum UlduarAchievementCriteriaIds CRITERIA_ALONE_IN_THE_DARKNESS_10 = 10412, CRITERIA_ALONE_IN_THE_DARKNESS_25 = 10417, CRITERIA_HERALD_OF_TITANS = 10678, + + // Champion of Ulduar + CRITERIA_C_O_U_LEVIATHAN_10 = 10042, + CRITERIA_C_O_U_IGNIS_10 = 10342, + CRITERIA_C_O_U_RAZORSCALE_10 = 10340, + CRITERIA_C_O_U_XT002_10 = 10341, + CRITERIA_C_O_U_IRON_COUNCIL_10 = 10598, + CRITERIA_C_O_U_KOLOGARN_10 = 10348, + CRITERIA_C_O_U_AURIAYA_10 = 10351, + CRITERIA_C_O_U_HODIR_10 = 10439, + CRITERIA_C_O_U_THORIM_10 = 10403, + CRITERIA_C_O_U_FREYA_10 = 10582, + CRITERIA_C_O_U_MIMIRON_10 = 10347, + CRITERIA_C_O_U_VEZAX_10 = 10349, + CRITERIA_C_O_U_YOGG_SARON_10 = 10350, + // Conqueror of Ulduar + CRITERIA_C_O_U_LEVIATHAN_25 = 10352, + CRITERIA_C_O_U_IGNIS_25 = 10355, + CRITERIA_C_O_U_RAZORSCALE_25 = 10353, + CRITERIA_C_O_U_XT002_25 = 10354, + CRITERIA_C_O_U_IRON_COUNCIL_25 = 10599, + CRITERIA_C_O_U_KOLOGARN_25 = 10357, + CRITERIA_C_O_U_AURIAYA_25 = 10363, + CRITERIA_C_O_U_HODIR_25 = 10719, + CRITERIA_C_O_U_THORIM_25 = 10404, + CRITERIA_C_O_U_FREYA_25 = 10583, + CRITERIA_C_O_U_MIMIRON_25 = 10361, + CRITERIA_C_O_U_VEZAX_25 = 10362, + CRITERIA_C_O_U_YOGG_SARON_25 = 10364 }; enum UlduarData