Cinderbrew and opcodes

This commit is contained in:
luis
2026-09-23 13:02:00 -03:00
parent 1cb0bb3f18
commit 01eaf563aa
19 changed files with 1351 additions and 11 deletions
@@ -26502,6 +26502,17 @@ void Player::SendInitialPacketsAfterAddToMap()
SendDirectMessage(setCompoundState.Write());
}
//WowCommunity
// Retail sends this on the instance connection once the player object exists. The client
// answers with CMSG_MOVE_INITIAL_OBJECT_UPDATE_COMPLETE_ACK and the same counter.
{
WorldPackets::Movement::MoveInitialObjectUpdateComplete initialUpdate;
initialUpdate.MoverGUID = GetGUID();
initialUpdate.SequenceIndex = m_movementCounter++;
SendDirectMessage(initialUpdate.Write());
}
//WowCommunity
if (HasUnitState(UNIT_STATE_FLEEING | UNIT_STATE_CONFUSED) || HasAuraType(SPELL_AURA_MOD_CONFUSE) || HasAuraType(SPELL_AURA_MOD_FEAR))
SetClientControl(this, false);
@@ -1813,3 +1813,15 @@ void WorldSession::HandleBattlePayCancelOpenCheckout(WorldPackets::BattlePay::Ba
// (the web overlay owns that state), so there is nothing to release; acknowledged by log only.
TC_LOG_DEBUG("network", "BattlePay: CancelOpenCheckout from {}.", GetPlayerInfo());
}
void WorldSession::HandleGetLastCatalogFetch(WorldPackets::BattlePay::GetLastCatalogFetch& /*packet*/)
{
WorldPackets::BattlePay::LastCatalogFetchResponse response;
response.LastFetchUnix = uint32(_lastCatalogFetch);
SendPacket(response.Write());
}
void WorldSession::HandleUpdateLastCatalogFetch(WorldPackets::BattlePay::UpdateLastCatalogFetch& /*packet*/)
{
_lastCatalogFetch = GameTime::GetGameTime();
}
@@ -3555,4 +3555,14 @@ void WorldSession::HandleEncounterJournalStartArathiRpe(WorldPackets::Character:
// play-testing shows retail force-grants it instead, add player->AddQuest(...) here.
}
void WorldSession::HandleGetRegionwideCharacterRestrictionAndMailData(WorldPackets::Character::GetRegionwideCharacterRestrictionAndMailData& packet)
{
WorldPackets::Character::RegionwideCharacterRestrictionsData restrictions;
SendPacket(restrictions.Write());
WorldPackets::Character::RegionwideCharacterMailData mail;
mail.Characters = std::move(packet.Characters);
SendPacket(mail.Write());
}
//WowCommunity
@@ -535,4 +535,11 @@ namespace WorldPackets::BattlePay
_worldPacket >> Token;
_worldPacket.rfinish(); // the remaining fields are not modelled (see header); consume them
}
WorldPacket const* LastCatalogFetchResponse::Write()
{
_worldPacket << uint32(LastFetchUnix);
_worldPacket << uint32(Result);
return &_worldPacket;
}
}
@@ -1019,6 +1019,36 @@ namespace WorldPackets
uint32 Token = 0;
};
// Empty in the 12.1.0.69587 housing and premade-group captures.
class GetLastCatalogFetch final : public ClientPacket
{
public:
explicit GetLastCatalogFetch(WorldPacket&& packet) : ClientPacket(CMSG_GET_LAST_CATALOG_FETCH, std::move(packet)) {}
void Read() override {}
};
class UpdateLastCatalogFetch final : public ClientPacket
{
public:
explicit UpdateLastCatalogFetch(WorldPacket&& packet) : ClientPacket(CMSG_UPDATE_LAST_CATALOG_FETCH, std::move(packet)) {}
void Read() override {}
};
// Two dwords. The first is the unix time of the last fetch (0x6A93069A and 0x6AA04047
// in two captures). The second dword is 0 in both.
class LastCatalogFetchResponse final : public ServerPacket
{
public:
explicit LastCatalogFetchResponse() : ServerPacket(SMSG_LAST_CATALOG_FETCH_RESPONSE, 8) {}
WorldPacket const* Write() override;
uint32 LastFetchUnix = 0;
uint32 Result = 0;
};
}
}
@@ -914,4 +914,38 @@ namespace WorldPackets::Character
_worldPacket >> RaceAndFaction;
}
void GetRegionwideCharacterRestrictionAndMailData::Read()
{
uint32 count = 0;
_worldPacket >> count;
if (count > 200)
{
_worldPacket.rfinish();
return;
}
Characters.resize(count);
for (ObjectGuid& character : Characters)
_worldPacket >> character;
}
WorldPacket const* RegionwideCharacterMailData::Write()
{
_worldPacket << Size<uint32>(Characters);
for (ObjectGuid const& character : Characters)
{
_worldPacket << uint8(0);
_worldPacket << character;
_worldPacket << uint32(0);
_worldPacket << uint32(0);
}
return &_worldPacket;
}
WorldPacket const* RegionwideCharacterRestrictionsData::Write()
{
_worldPacket << uint32(0);
return &_worldPacket;
}
}
@@ -943,6 +943,40 @@ namespace WorldPackets
void Read() override {}
};
// CMSG body verified on 12.1.0.69587: uint32 count, then that many packed guids.
class GetRegionwideCharacterRestrictionAndMailData final : public ClientPacket
{
public:
explicit GetRegionwideCharacterRestrictionAndMailData(WorldPacket&& packet)
: ClientPacket(CMSG_GET_REGIONWIDE_CHARACTER_RESTRICTION_AND_MAIL_DATA, std::move(packet)) {
}
void Read() override;
std::vector<ObjectGuid> Characters;
};
// Empty mail row verified in the same capture: one zero byte, the guid, then two zero counts.
// A non-empty row appends sender types and a 6-bit cstring; this server has no such rows to publish.
class RegionwideCharacterMailData final : public ServerPacket
{
public:
explicit RegionwideCharacterMailData() : ServerPacket(SMSG_REGIONWIDE_CHARACTER_MAIL_DATA, 4) {}
WorldPacket const* Write() override;
std::vector<ObjectGuid> Characters;
};
// Restriction rows are a separate list. No restricted characters are published.
class RegionwideCharacterRestrictionsData final : public ServerPacket
{
public:
explicit RegionwideCharacterRestrictionsData() : ServerPacket(SMSG_REGIONWIDE_CHARACTER_RESTRICTIONS_DATA, 4) {}
WorldPacket const* Write() override;
};
//WowCommunity
}
}
@@ -1256,4 +1256,11 @@ void DiscardedTimeSyncAcks::Read()
{
_worldPacket >> MaxSequenceIndex;
}
WorldPacket const* MoveInitialObjectUpdateComplete::Write()
{
_worldPacket << MoverGUID;
_worldPacket << uint32(SequenceIndex);
return &_worldPacket;
}
}
@@ -849,6 +849,19 @@ namespace WorldPackets
uint32 MaxSequenceIndex = 0;
};
// 12.1 captures are a packed guid plus the movement counter (13 bytes). The client acks
// with a normal movement ack whose AckIndex is that counter.
class MoveInitialObjectUpdateComplete final : public ServerPacket
{
public:
explicit MoveInitialObjectUpdateComplete() : ServerPacket(SMSG_MOVE_INITIAL_OBJECT_UPDATE_COMPLETE, 16 + 4) {}
WorldPacket const* Write() override;
ObjectGuid MoverGUID;
uint32 SequenceIndex = 0;
};
ByteBuffer& operator>>(ByteBuffer& data, MovementAck& ack);
}
}
+11 -11
View File
@@ -503,12 +503,12 @@ void OpcodeTable::InitializeClientOpcodes()
DEFINE_HANDLER(CMSG_GET_INITIATIVE_ACTIVITY_LOG_REQUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGetInitiativeActivityLogRequest);
DEFINE_HANDLER(CMSG_GET_ITEM_PURCHASE_DATA, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleGetItemPurchaseData);
DEFINE_HANDLER(CMSG_GET_LANDING_PAGE_SHIPMENTS, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleGetLandingPageShipments);
DEFINE_HANDLER(CMSG_GET_LAST_CATALOG_FETCH, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_GET_LAST_CATALOG_FETCH, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGetLastCatalogFetch);
DEFINE_HANDLER(CMSG_GET_MIRROR_IMAGE_DATA, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleMirrorImageDataRequest);
DEFINE_HANDLER(CMSG_GET_PLAYER_INITIATIVE_INFO_REQUEST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_GET_PVP_OPTIONS_ENABLED, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleGetPVPOptionsEnabled);
DEFINE_HANDLER(CMSG_GET_RAF_ACCOUNT_INFO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGetRafAccountInfo);
DEFINE_HANDLER(CMSG_GET_REGIONWIDE_CHARACTER_RESTRICTION_AND_MAIL_DATA, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_GET_REGIONWIDE_CHARACTER_RESTRICTION_AND_MAIL_DATA, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGetRegionwideCharacterRestrictionAndMailData);
DEFINE_HANDLER(CMSG_GET_REMAINING_GAME_TIME, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_GET_TROPHY_LIST, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleGetTrophyList);
DEFINE_HANDLER(CMSG_GET_UNDELETE_CHARACTER_COOLDOWN_STATUS, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleGetUndeleteCooldownStatus);
@@ -746,7 +746,7 @@ void OpcodeTable::InitializeClientOpcodes()
DEFINE_HANDLER(CMSG_MOVE_HOVER_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementAckMessage);
DEFINE_HANDLER(CMSG_MOVE_INERTIA_DISABLE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementAckMessage);
DEFINE_HANDLER(CMSG_MOVE_INERTIA_ENABLE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementAckMessage);
DEFINE_HANDLER(CMSG_MOVE_INITIAL_OBJECT_UPDATE_COMPLETE_ACK, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_MOVE_INITIAL_OBJECT_UPDATE_COMPLETE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementAckMessage);
DEFINE_HANDLER(CMSG_MOVE_INIT_ACTIVE_MOVER_COMPLETE, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveInitActiveMoverComplete);
DEFINE_HANDLER(CMSG_MOVE_JUMP, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes);
DEFINE_HANDLER(CMSG_MOVE_KNOCK_BACK_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveKnockBackAck);
@@ -770,7 +770,7 @@ void OpcodeTable::InitializeClientOpcodes()
DEFINE_HANDLER(CMSG_MOVE_SET_ALWAYS_ALLOW_PITCHING_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementAckMessage);
DEFINE_HANDLER(CMSG_MOVE_SET_CANNOT_SWIM_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementAckMessage);
DEFINE_HANDLER(CMSG_MOVE_SET_CAN_ADV_FLY_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementAckMessage);
DEFINE_HANDLER(CMSG_MOVE_SET_CAN_DRIVE_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_MOVE_SET_CAN_DRIVE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementAckMessage);
DEFINE_HANDLER(CMSG_MOVE_SET_CAN_FLY_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementAckMessage);
DEFINE_HANDLER(CMSG_MOVE_SET_CAN_TURN_WHILE_FALLING_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementAckMessage);
DEFINE_HANDLER(CMSG_MOVE_SET_COLLISION_HEIGHT_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleSetCollisionHeightAck);
@@ -842,7 +842,7 @@ void OpcodeTable::InitializeClientOpcodes()
DEFINE_HANDLER(CMSG_OPEN_SHIPMENT_NPC, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleOpenShipmentNpc);
DEFINE_HANDLER(CMSG_OPEN_TRADESKILL_NPC, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleOpenTradeskillNpc);
DEFINE_HANDLER(CMSG_OPT_OUT_OF_LOOT, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleOptOutOfLootOpcode);
DEFINE_HANDLER(CMSG_OVERRIDE_SCREEN_FLASH, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_OVERRIDE_SCREEN_FLASH, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleOverrideScreenFlash);
DEFINE_HANDLER(CMSG_PARTY_INVITE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandlePartyInviteOpcode);
DEFINE_HANDLER(CMSG_PARTY_INVITE_RESPONSE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandlePartyInviteResponseOpcode);
DEFINE_HANDLER(CMSG_PARTY_UNINVITE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandlePartyUninviteOpcode);
@@ -1146,7 +1146,7 @@ void OpcodeTable::InitializeClientOpcodes()
DEFINE_HANDLER(CMSG_UPDATE_ACCOUNT_DATA, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleUpdateAccountData);
DEFINE_HANDLER(CMSG_UPDATE_AREA_TRIGGER_VISUAL, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleUpdateAreaTriggerVisual);
DEFINE_HANDLER(CMSG_UPDATE_CRAFTING_NPC_RECIPES, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleUpdateCraftingNpcRecipesRequest);
DEFINE_HANDLER(CMSG_UPDATE_LAST_CATALOG_FETCH, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_UPDATE_LAST_CATALOG_FETCH, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleUpdateLastCatalogFetch);
DEFINE_HANDLER(CMSG_UPDATE_MISSILE_TRAJECTORY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleUpdateMissileTrajectory);
DEFINE_HANDLER(CMSG_UPDATE_RAID_TARGET, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleUpdateRaidTargetOpcode);
DEFINE_HANDLER(CMSG_UPDATE_SPELL_VISUAL, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleUpdateAuraVisual);
@@ -1657,7 +1657,7 @@ void OpcodeTable::InitializeServerOpcodes()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GET_INITIATIVE_ACTIVITY_LOG_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GET_INITIATIVE_REWARDS_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GET_LANDING_PAGE_SHIPMENTS_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GET_PLAYER_INITIATIVE_INFO_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GET_PLAYER_INITIATIVE_INFO_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GET_REALM_HIDDEN_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GET_REMAINING_GAME_TIME_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GET_SELECTED_TROPHY_ID_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM);
@@ -1877,7 +1877,7 @@ void OpcodeTable::InitializeServerOpcodes()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_PUSH_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_TIME_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_KICK_REASON, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LAST_CATALOG_FETCH_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LAST_CATALOG_FETCH_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LATENCY_REPORT_PING, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LEARNED_SPELLS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LEARN_PVP_TALENT_FAILED, STATUS_NEVER, CONNECTION_TYPE_REALM);
@@ -1983,7 +1983,7 @@ void OpcodeTable::InitializeServerOpcodes()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_ENABLE_JUMPING, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_ENABLE_STRAFING, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_ENABLE_TRANSITION_BETWEEN_SWIM_AND_FLY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_INITIAL_OBJECT_UPDATE_COMPLETE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_INITIAL_OBJECT_UPDATE_COMPLETE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_KNOCK_BACK, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_MARK_REMOTE_TIME_INVALID, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_REMOVE_INERTIA, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
@@ -2316,8 +2316,8 @@ void OpcodeTable::InitializeServerOpcodes()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_REFETCH_TACT_KEYS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_REFRESH_BLEEP_TOKENS_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_REFRESH_COMPONENT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_REGIONWIDE_CHARACTER_MAIL_DATA, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_REGIONWIDE_CHARACTER_RESTRICTIONS_DATA, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_REGIONWIDE_CHARACTER_MAIL_DATA, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_REGIONWIDE_CHARACTER_RESTRICTIONS_DATA, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_REMOVE_ITEM_PASSIVE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_REMOVE_SPELL_FROM_ACTION_BAR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_REPLACE_TROPHY_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+7
View File
@@ -139,6 +139,8 @@ namespace WorldPackets
class CharacterCheckUpgrade;
class CharacterUpgradeManualUnrevokeRequest;
class GetProductList;
class GetLastCatalogFetch;
class UpdateLastCatalogFetch;
class GetPurchaseList;
class StartPurchase;
class OpenCheckout;
@@ -363,6 +365,7 @@ namespace WorldPackets
class GetAccountCharacterList;
class ConvertTimerunningCharacter;
class EncounterJournalStartArathiRpe;
class GetRegionwideCharacterRestrictionAndMailData;
//WowCommunity
}
@@ -1647,6 +1650,7 @@ public:
//WowCommunity
void HandleSetupWarbandGroups(WorldPackets::Character::SetupWarbandGroups& setupWarbandGroups);
void HandleGetAccountCharListOpcode(WorldPackets::Character::GetAccountCharacterList& accountCharList);
void HandleGetRegionwideCharacterRestrictionAndMailData(WorldPackets::Character::GetRegionwideCharacterRestrictionAndMailData& packet);
void HandleGetRafAccountInfo(WorldPackets::RaF::GetRafAccountInfo& packet);
void HandleConvertTimerunningCharacter(WorldPackets::Character::ConvertTimerunningCharacter& convertTimerunningCharacter);
// Arathi Returning Player Experience: shared in-world entry point (Adventure Guide tile)
@@ -2222,6 +2226,8 @@ public:
// In-game Shop (BattlePay)
void HandleBattlePayGetProductList(WorldPackets::BattlePay::GetProductList& getProductList);
void HandleGetLastCatalogFetch(WorldPackets::BattlePay::GetLastCatalogFetch& packet);
void HandleUpdateLastCatalogFetch(WorldPackets::BattlePay::UpdateLastCatalogFetch& packet);
void HandleUpdateVasPurchaseStates(WorldPackets::BattlePay::UpdateVasPurchaseStates& packet);
void HandleVasGetServiceStatus(WorldPackets::BattlePay::VasGetServiceStatus& packet);
void HandleGetVasTransferTargetRealmList(WorldPackets::BattlePay::GetVasTransferTargetRealmList& packet);
@@ -2779,6 +2785,7 @@ public:
uint32 _battlenetRequestToken;
time_t _logoutTime;
time_t _lastCatalogFetch = 0;
bool m_inQueue; // session wait in auth.queue
ObjectGuid m_playerLoading; // code processed in LoginPlayer
bool m_playerLoginRPE = false; // CMSG_PLAYER_LOGIN.RPE - Returning Player ("Catch Up") Experience enter
@@ -0,0 +1,225 @@
/*
* Copyright (C) WowCommunity Project
*
* This SourceCode is NOT free a software. Please hold everything Private
* and read our Terms
*/
#include "cinderbrew_meadery.h"
#include "Containers.h"
#include "ScriptedCreature.h"
#include "ScriptMgr.h"
#include "TemporarySummon.h"
enum AldryrSpells
{
// Brew Master Aldryr (210271)
SPELL_KEG_SMASH = 432228, // ~432229 AoE damage helper
SPELL_KEG_SMASH_AOE = 432229, // Keg shatters dealing AoE + Hot Honey
SPELL_HOT_HONEY = 432186, // Scalding ground DoT
SPELL_THROW_CINDERBREW = 432183, // target DoT, leaves Hot Honey
SPELL_BLAZING_BELCH = 432203, // frontal cone
SPELL_BLAZING_BELCH_BC = 432198,
SPELL_HAPPY_HOUR = 442542, // intermission start
SPELL_HAPPY_HOUR_BC = 442525,
SPELL_DISREGARD = 442611, // 99% damage reduction during intermission
SPELL_CLEAR_THE_BAR = 454459, // end intermission helper
// Thirsty Patron (215819)
SPELL_ROWDY_YELL = 452418,
SPELL_ROWDY_YELL_BC = 431897,
// Mug of Cinderbrew (220830)
SPELL_MUG_ADVERT = 448069,
SPELL_MUG_HIGHLIGHT = 454452,
SPELL_TOSS_CINDERBREW = 431902,
SPELL_TOSS_CINDERBREW_ALT = 431906,
SPELL_CARRYING_CINDERBREW = 431895,
};
enum AldryrEvents
{
EVENT_KEG_SMASH = 1,
EVENT_THROW_CINDERBREW,
EVENT_BLAZING_BELCH,
EVENT_SERVE_PATRON,
EVENT_END_INTERMISSION,
EVENT_ROWDY_YELL,
};
enum AldryrMisc
{
HEALTH_PERCENT_HAPPY_HOUR_1 = 66,
HEALTH_PERCENT_HAPPY_HOUR_2 = 33,
PATRON_COUNT = 4,
};
// 210271 - Brew Master Aldryr
struct boss_brew_master_aldryr : public BossAI
{
boss_brew_master_aldryr(Creature* creature) : BossAI(creature, DATA_BREW_MASTER_ALDRYR) { }
void Reset() override
{
BossAI::Reset();
_intermission = false;
_removed66 = false;
_removed33 = false;
}
void JustEngagedWith(Unit* who) override
{
BossAI::JustEngagedWith(who);
events.ScheduleEvent(EVENT_KEG_SMASH, 10s);
events.ScheduleEvent(EVENT_THROW_CINDERBREW, 6s);
events.ScheduleEvent(EVENT_BLAZING_BELCH, 18s);
}
void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo*/) override
{
if (_intermission)
return;
uint8 pct = uint8(me->GetHealthPct());
if (!_removed66 && pct <= HEALTH_PERCENT_HAPPY_HOUR_1)
{
_removed66 = true;
StartHappyHour();
}
else if (!_removed33 && pct <= HEALTH_PERCENT_HAPPY_HOUR_2)
{
_removed33 = true;
StartHappyHour();
}
}
void JustDied(Unit* /*killer*/) override
{
_JustDied();
}
void EnterEvadeMode(EvadeReason why) override
{
_intermission = false;
summons.DespawnAll();
BossAI::EnterEvadeMode(why);
}
void ExecuteEvent(uint32 eventId) override
{
switch (eventId)
{
case EVENT_KEG_SMASH:
if (_intermission)
break;
if (Unit* victim = me->GetVictim())
{
DoCast(victim, SPELL_KEG_SMASH);
DoCastSelf(SPELL_KEG_SMASH_AOE, true);
}
events.Repeat(18s);
break;
case EVENT_THROW_CINDERBREW:
if (_intermission)
break;
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40.0f, true))
DoCast(target, SPELL_THROW_CINDERBREW);
events.Repeat(9s);
break;
case EVENT_BLAZING_BELCH:
if (_intermission)
break;
DoCastSelf(SPELL_BLAZING_BELCH);
events.Repeat(22s);
break;
case EVENT_SERVE_PATRON:
{
std::list<Creature*> patrons;
me->GetCreatureListWithEntryInGrid(patrons, NPC_THIRSTY_PATRON, 40.0f);
patrons.remove_if([](Creature* c) { return !c->IsAlive(); });
if (patrons.empty())
break;
Creature* patron = Trinity::Containers::SelectRandomContainerElement(patrons);
if (patron)
{
DoCast(patron, SPELL_TOSS_CINDERBREW, true);
patron->KillSelf();
}
events.Repeat(4s);
break;
}
case EVENT_END_INTERMISSION:
EndHappyHour();
break;
default:
break;
}
}
private:
void StartHappyHour()
{
_intermission = true;
DoCastSelf(SPELL_HAPPY_HOUR);
DoCastSelf(SPELL_DISREGARD, true);
for (uint8 i = 0; i < PATRON_COUNT; ++i)
{
Position pos = me->GetRandomNearPosition(10.0f);
if (Creature* patron = me->SummonCreature(NPC_THIRSTY_PATRON, pos, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30s))
patron->AI()->DoZoneInCombat();
}
for (uint8 i = 0; i < 2; ++i)
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40.0f, true))
DoCast(target, SPELL_THROW_CINDERBREW, true);
events.ScheduleEvent(EVENT_SERVE_PATRON, 5s);
events.ScheduleEvent(EVENT_END_INTERMISSION, 15s);
}
void EndHappyHour()
{
_intermission = false;
DoCastSelf(SPELL_HAPPY_HOUR_BC, true);
DoCastSelf(SPELL_CLEAR_THE_BAR, true);
me->RemoveAurasDueToSpell(SPELL_DISREGARD);
summons.DespawnEntry(NPC_THIRSTY_PATRON);
}
bool _intermission = false;
bool _removed66 = false;
bool _removed33 = false;
};
// 215819 - Thirsty Patron: yells during the Happy Hour intermission.
struct npc_thirsty_patron : public ScriptedAI
{
npc_thirsty_patron(Creature* creature) : ScriptedAI(creature) { }
void ScheduleTasks() override
{
events.ScheduleEvent(EVENT_ROWDY_YELL, 2s);
}
void ExecuteEvent(uint32 eventId) override
{
switch (eventId)
{
case EVENT_ROWDY_YELL:
DoCastSelf(SPELL_ROWDY_YELL);
events.Repeat(2s);
break;
default:
break;
}
}
};
void AddSC_boss_brew_master_aldryr()
{
RegisterCinderbrewMeaderyCreatureAI(boss_brew_master_aldryr);
RegisterCinderbrewMeaderyCreatureAI(npc_thirsty_patron);
}
@@ -0,0 +1,149 @@
/*
* Copyright (C) WowCommunity Project
*
* This SourceCode is NOT free a software. Please hold everything Private
* and read our Terms
*/
#include "cinderbrew_meadery.h"
#include "Containers.h"
#include "ScriptedCreature.h"
#include "ScriptMgr.h"
#include "TemporarySummon.h"
enum BenkSpells
{
SPELL_HONEY_MARINADE = 440134, // player honey debuff
SPELL_SUMMON_BEES_PASSIVE = 438663, // Honey Barrel bee spawning aura
SPELL_SUMMON_BEES_CAST = 438665,
SPELL_HONEY_BARREL_COS = 438585, // spawn cosmetic
SPELL_BEE_VENOM = 441397, // Bee-let sting
SPELL_BEE_SHREDDING_STING = 438971,
};
enum BenkEvents
{
EVENT_HONEY_MARINADE = 1,
EVENT_BEE_SWARM,
EVENT_SUMMON_BARREL,
};
// 218865 - Bee-let: harassing sting bot.
struct npc_bee_let : public ScriptedAI
{
npc_bee_let(Creature* creature) : ScriptedAI(creature) { }
void ScheduleTasks() override
{
me->SetCanFly(true);
me->SetDisableGravity(true);
events.ScheduleEvent(EVENT_BEE_STING, 2s);
}
void ExecuteEvent(uint32 eventId) override
{
switch (eventId)
{
case EVENT_BEE_STING:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f, true))
{
DoCast(target, SPELL_BEE_VENOM);
DoCast(target, SPELL_BEE_SHREDDING_STING, true);
}
events.Repeat(3s);
break;
default:
break;
}
}
private:
enum { EVENT_BEE_STING = 1 };
};
// 219005 - Honey Barrel: passively summons constant bee-let reinforcements.
struct npc_honey_barrel : public ScriptedAI
{
npc_honey_barrel(Creature* creature) : ScriptedAI(creature) { }
void ScheduleTasks() override
{
DoCastSelf(SPELL_HONEY_BARREL_COS, true);
DoCastSelf(SPELL_SUMMON_BEES_PASSIVE, true);
events.ScheduleEvent(EVENT_SUMMON_BARREL, 3s);
}
void ExecuteEvent(uint32 eventId) override
{
switch (eventId)
{
case EVENT_SUMMON_BARREL:
{
Position pos = me->GetRandomNearPosition(5.0f);
if (Creature* bee = me->SummonCreature(NPC_BEE_LET, pos, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10s))
{
DoCastSelf(SPELL_SUMMON_BEES_CAST, true);
bee->AI()->DoZoneInCombat();
}
events.Repeat(3s);
break;
}
default:
break;
}
}
private:
enum { EVENT_SUMMON_BARREL = 1 };
};
// 218002 - Benk Buzzbee
struct boss_benk_buzzbee : public BossAI
{
boss_benk_buzzbee(Creature* creature) : BossAI(creature, DATA_BENK_BUZZBEE) { }
void JustEngagedWith(Unit* who) override
{
BossAI::JustEngagedWith(who);
events.ScheduleEvent(EVENT_HONEY_MARINADE, 6s);
events.ScheduleEvent(EVENT_BEE_SWARM, 10s);
events.ScheduleEvent(EVENT_SUMMON_BARREL, 15s);
}
void ExecuteEvent(uint32 eventId) override
{
switch (eventId)
{
case EVENT_HONEY_MARINADE:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40.0f, true))
DoCast(target, SPELL_HONEY_MARINADE);
events.Repeat(14s);
break;
case EVENT_BEE_SWARM:
{
Position pos = me->GetRandomNearPosition(8.0f);
if (Creature* bee = me->SummonCreature(NPC_BEE_LET, pos, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20s))
bee->AI()->DoZoneInCombat();
events.Repeat(IsMythicPlus() ? 12s : 18s);
break;
}
case EVENT_SUMMON_BARREL:
{
Position pos = me->GetRandomNearPosition(12.0f);
if (Creature* barrel = me->SummonCreature(NPC_HONEY_BARREL, pos, TEMPSUMMON_MANUAL_DESPAWN))
barrel->AI()->DoZoneInCombat();
events.Repeat(30s);
break;
}
default:
break;
}
}
};
void AddSC_boss_benk_buzzbee()
{
RegisterCinderbrewMeaderyCreatureAI(boss_benk_buzzbee);
RegisterCinderbrewMeaderyCreatureAI(npc_bee_let);
RegisterCinderbrewMeaderyCreatureAI(npc_honey_barrel);
}
@@ -0,0 +1,177 @@
/*
* Copyright (C) WowCommunity Project
*
* This SourceCode is NOT free a software. Please hold everything Private
* and read our Terms
*/
#include "cinderbrew_meadery.h"
#include "Containers.h"
#include "ScriptedCreature.h"
#include "ScriptMgr.h"
#include "TemporarySummon.h"
enum GoldieSpells
{
SPELL_CASH_CANNON = 436600, // machine gun volley at a player
SPELL_CASH_CANNON_BC = 436598, // bullet damage
SPELL_LET_IT_HAIL = 442483, // coin hail aoe
SPELL_LET_IT_HAIL_BC = 442484,
SPELL_CINDER_BOOM = 436900, // bomb explosion
SPELL_CINDER_BOOM_BC = 435661,
SPELL_SPREAD_THE_LOVE = 439517, // heart spread aoe
SPELL_BURNING_RICOCHET = 436654, // bouncing bullet at player
SPELL_BOMB_JUMP = 439519, // Cinderbrew Bomb jump visual
SPELL_BOMB_EXPLODE = 435804, // bomb "Cinder-BOOM!"
SPELL_DESK_JUMP = 444267,
SPELL_ENERGY = 436590, // [DNT] Energy Controller
};
enum GoldieEvents
{
EVENT_ENERGY = 1,
EVENT_CASH_CANNON,
EVENT_LET_IT_HAIL,
EVENT_SPREAD_THE_LOVE,
EVENT_RICOCHET,
EVENT_SUMMON_BOMB,
EVENT_BOMB_EXPLODE,
};
enum GoldieMisc
{
MAX_ENERGY = 100,
ENERGY_GAIN_PER_SEC = 4,
HAIL_ENERGY = 100,
BOMB_EXPLOSION_MS = 8000,
};
// 217837 - Cinderbrew Bomb: lands, then blows up.
struct npc_cinderbrew_bomb : public ScriptedAI
{
npc_cinderbrew_bomb(Creature* creature) : ScriptedAI(creature) { }
void ScheduleTasks() override
{
DoCastSelf(SPELL_BOMB_JUMP, true);
events.ScheduleEvent(EVENT_BOMB_EXPLODE, 8s);
}
void ExecuteEvent(uint32 eventId) override
{
switch (eventId)
{
case EVENT_BOMB_EXPLODE:
DoCastSelf(SPELL_BOMB_EXPLODE, true);
me->KillSelf();
events.CancelEvent(EVENT_BOMB_EXPLODE);
break;
default:
break;
}
}
};
// 218523 - Goldie Baronbottom (desk): engages her combat form.
struct npc_goldie_desk : public ScriptedAI
{
npc_goldie_desk(Creature* creature) : ScriptedAI(creature) { }
void JustEngagedWith(Unit* who) override
{
auto const& pos = me->GetPosition();
if (Creature* boss = me->SummonCreature(BOSS_GOLDIE_BARONBOTTOM, pos, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 1min))
{
boss->AI()->DoZoneInCombat();
if (who->ToPlayer())
{
boss->SetInCombatWith(who);
who->SetInCombatWith(boss);
boss->Attack(who, true);
}
me->DespawnOrUnsummon(100ms);
}
}
};
// 214661 - Goldie Baronbottom
struct boss_goldie_baronbottom : public BossAI
{
boss_goldie_baronbottom(Creature* creature) : BossAI(creature, DATA_GOLDIE_BARONBOTTOM) { }
void JustEngagedWith(Unit* who) override
{
BossAI::JustEngagedWith(who);
_energy = 0;
DoCastSelf(SPELL_ENERGY, true);
DoCastSelf(SPELL_DESK_JUMP, true);
events.ScheduleEvent(EVENT_ENERGY, 1s);
events.ScheduleEvent(EVENT_CASH_CANNON, 8s);
events.ScheduleEvent(EVENT_SPREAD_THE_LOVE, 20s);
events.ScheduleEvent(EVENT_RICOCHET, 26s);
events.ScheduleEvent(EVENT_SUMMON_BOMB, 14s);
}
void ExecuteEvent(uint32 eventId) override
{
switch (eventId)
{
case EVENT_ENERGY:
_energy += ENERGY_GAIN_PER_SEC;
if (_energy >= HAIL_ENERGY && !me->HasUnitState(UNIT_STATE_CASTING))
{
_energy = 0;
DoCastSelf(SPELL_LET_IT_HAIL);
DoCastSelf(SPELL_LET_IT_HAIL_BC, true);
events.DelayEvents(6s);
}
events.Repeat(1s);
break;
case EVENT_CASH_CANNON:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40.0f, true))
{
DoCast(target, SPELL_CASH_CANNON);
DoCast(target, SPELL_CASH_CANNON_BC, true);
}
events.Repeat(16s);
break;
case EVENT_LET_IT_HAIL:
DoCastSelf(SPELL_LET_IT_HAIL);
events.Repeat(20s);
break;
case EVENT_SPREAD_THE_LOVE:
DoCastSelf(SPELL_SPREAD_THE_LOVE);
DoCastSelf(SPELL_CINDER_BOOM_BC, true);
events.Repeat(24s);
break;
case EVENT_RICOCHET:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40.0f, true))
DoCast(target, SPELL_BURNING_RICOCHET);
events.Repeat(18s);
break;
case EVENT_SUMMON_BOMB:
{
Position pos = me->GetRandomNearPosition(10.0f);
if (Creature* bomb = me->SummonCreature(NPC_CINDERBREW_BOMB, pos, TEMPSUMMON_MANUAL_DESPAWN))
bomb->SetFacingToObject(me);
events.Repeat(12s);
break;
}
default:
break;
}
}
private:
uint8 _energy = 0;
};
void AddSC_boss_goldie_baronbottom()
{
RegisterCinderbrewMeaderyCreatureAI(boss_goldie_baronbottom);
RegisterCinderbrewMeaderyCreatureAI(npc_cinderbrew_bomb);
RegisterCinderbrewMeaderyCreatureAI(npc_goldie_desk);
}
@@ -0,0 +1,156 @@
/*
* Copyright (C) WowCommunity Project
*
* This SourceCode is NOT free a software. Please hold everything Private
* and read our Terms
*/
#include "cinderbrew_meadery.h"
#include "Containers.h"
#include "ScriptedCreature.h"
#include "ScriptMgr.h"
#include "TemporarySummon.h"
enum IpaSpells
{
SPELL_ENERGY_GAIN = 440604, // [DNT] Energy Gain
SPELL_SPOUTING_STOUT = 439645, // main mead expulsion
SPELL_SPOUTING_STOUT_BC = 439657, // secondary damage casts
SPELL_BURNING_FERMENTATION = 439202,
SPELL_BURNING_FERMENTATION_BC = 439330,
SPELL_BOTTOMS_UPPERCUT = 439031,
SPELL_FILL_ER_UP = 442108, // I'pa shields from a Brew Drop
SPELL_FILL_ER_UP_DROP = 440104, // Brew Drop delivering the keg
SPELL_BREW_DROP_FROTHY = 442117, // energized running speed
};
enum IpaEvents
{
EVENT_ENERGY = 1,
EVENT_SPOUTING_STOUT,
EVENT_BURNING_FERMENTATION,
EVENT_BOTTOMS_UPPERCUT,
EVENT_SUMMON_BREW_DROP,
EVENT_RUN_TO_IPA,
EVENT_REACH_IPA,
};
enum IpaMisc
{
MAX_ENERGY = 100,
ENERGY_GAIN_PER_SEC = 3,
STOUT_ENERGY = 100,
BREW_DROP_COUNT = 3,
};
// Brew Drop (219301 / 223562): runs toward I'pa, delivers a keg, leaves honey when slain.
struct npc_brew_drop : public ScriptedAI
{
npc_brew_drop(Creature* creature) : ScriptedAI(creature) { }
void ScheduleTasks() override
{
if (Unit* ipa = me->ToTempSummon() ? me->ToTempSummon()->GetSummonerUnit() : nullptr)
{
_ipa = ipa;
me->GetMotionMaster()->MoveChase(_ipa, 1.0f);
}
events.ScheduleEvent(EVENT_RUN_TO_IPA, 1s);
}
void JustDied(Unit* /*killer*/) override
{
// Oozing honey remains where the drop was slain.
me->CastSpell(me, 441171, true);
}
void ExecuteEvent(uint32 eventId) override
{
switch (eventId)
{
case EVENT_RUN_TO_IPA:
if (_ipa && _ipa->IsAlive() && me->GetDistance(_ipa) <= 3.0f)
{
DoCast(_ipa, SPELL_FILL_ER_UP_DROP);
me->KillSelf();
break;
}
events.Repeat(1s);
break;
default:
break;
}
}
private:
Unit* _ipa = nullptr;
};
// 210267 - I'pa
struct boss_ipa : public BossAI
{
boss_ipa(Creature* creature) : BossAI(creature, DATA_IPA) { }
void JustEngagedWith(Unit* who) override
{
BossAI::JustEngagedWith(who);
_energy = 0;
DoCastSelf(SPELL_ENERGY_GAIN, true);
events.ScheduleEvent(EVENT_ENERGY, 1s);
events.ScheduleEvent(EVENT_BURNING_FERMENTATION, 8s);
events.ScheduleEvent(EVENT_BOTTOMS_UPPERCUT, 14s);
}
void ExecuteEvent(uint32 eventId) override
{
switch (eventId)
{
case EVENT_ENERGY:
if (_energy == 0)
{
_energy = STOUT_ENERGY;
DoCastSelf(SPELL_SPOUTING_STOUT);
for (uint8 i = 0; i < BREW_DROP_COUNT; ++i)
{
Position pos = me->GetRandomNearPosition(12.0f);
if (Creature* drop = me->SummonCreature(NPC_BREW_DROP, pos, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20s))
drop->AI()->DoZoneInCombat();
}
events.DelayEvents(6s);
}
else
_energy += ENERGY_GAIN_PER_SEC;
if (_energy >= MAX_ENERGY)
_energy = 0;
events.Repeat(1s);
break;
case EVENT_BURNING_FERMENTATION:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40.0f, true))
{
DoCast(target, SPELL_BURNING_FERMENTATION);
DoCast(target, SPELL_BURNING_FERMENTATION_BC, true);
}
events.Repeat(12s);
break;
case EVENT_BOTTOMS_UPPERCUT:
if (Unit* victim = me->GetVictim())
DoCast(victim, SPELL_BOTTOMS_UPPERCUT);
events.Repeat(15s);
break;
default:
break;
}
}
private:
uint8 _energy = 0;
};
void AddSC_boss_ipa()
{
RegisterCinderbrewMeaderyCreatureAI(boss_ipa);
RegisterCinderbrewMeaderyCreatureAI(npc_brew_drop);
}
@@ -0,0 +1,52 @@
/*
* Copyright (C) WowCommunity Project
*
* This SourceCode is NOT free a software. Please hold everything Private
* and read our Terms
*/
#ifndef DEF_CINDERBREW_MEADERY_H_
#define DEF_CINDERBREW_MEADERY_H_
#include "CreatureAIImpl.h"
#define CBMScriptName "instance_cinderbrew_meadery"
#define DataHeader "CinderbrewMeadery"
uint32 const EncounterCount = 4;
enum CinderbrewMeaderyDataTypes
{
DATA_BREW_MASTER_ALDRYR = 0,
DATA_IPA,
DATA_BENK_BUZZBEE,
DATA_GOLDIE_BARONBOTTOM,
};
enum CinderbrewMeaderyCreatureIds
{
BOSS_BREW_MASTER_ALDRYR = 210271,
BOSS_IPA = 210267,
BOSS_BENK_BUZZBEE = 218002,
BOSS_GOLDIE_BARONBOTTOM = 214661,
NPC_GOLDIE_DESK = 218523,
NPC_THIRSTY_PATRON = 215819,
NPC_MUG_OF_CINDERBREW = 220830,
NPC_BREW_DROP = 219301,
NPC_BREW_DROP_2 = 223562,
NPC_HONEY_BARREL = 219005,
NPC_BEE_LET = 218865,
NPC_CINDERBREW_BOMB = 217837,
NPC_GOLD_COIN = 218307,
};
template <class AI, class T>
inline AI* GetCinderbrewMeaderyAI(T* obj)
{
return GetInstanceAI<AI>(obj, CBMScriptName);
}
#define RegisterCinderbrewMeaderyCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetCinderbrewMeaderyAI)
#endif
@@ -0,0 +1,67 @@
/*
* Copyright (C) WowCommunity Project
*
* This SourceCode is NOT free a software. Please hold everything Private
* and read our Terms
*/
#include "InstanceScript.h"
#include "ScriptMgr.h"
#include "cinderbrew_meadery.h"
static constexpr ObjectData creatureData[] =
{
{ BOSS_BREW_MASTER_ALDRYR, DATA_BREW_MASTER_ALDRYR },
{ BOSS_IPA, DATA_IPA },
{ BOSS_BENK_BUZZBEE, DATA_BENK_BUZZBEE },
{ BOSS_GOLDIE_BARONBOTTOM, DATA_GOLDIE_BARONBOTTOM },
};
static constexpr DungeonEncounterData const encounters[] =
{
{ DATA_BREW_MASTER_ALDRYR, {{ 2900 }} },
{ DATA_IPA, {{ 2929 }} },
{ DATA_BENK_BUZZBEE, {{ 2931 }} },
{ DATA_GOLDIE_BARONBOTTOM, {{ 2930 }} },
};
class instance_cinderbrew_meadery : public InstanceMapScript
{
public:
instance_cinderbrew_meadery() : InstanceMapScript(CBMScriptName, 2661) { }
struct instance_cinderbrew_meadery_InstanceMapScript : public InstanceScript
{
instance_cinderbrew_meadery_InstanceMapScript(InstanceMap* map) : InstanceScript(map)
{
SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
LoadObjectData(creatureData, {});
LoadDungeonEncounterData(encounters);
}
void OnPlayerEnter(Player* player) override
{
InstanceScript::OnPlayerEnter(player);
if (player->GetGroup())
player->GetGroup()->AddFollowerModeBots(player);
}
void OnPlayerExit(Player* player)
{
if (player->GetGroup())
player->GetGroup()->DespawnFollowerModeBots(player);
}
};
InstanceScript* GetInstanceScript(InstanceMap* map) const override
{
return new instance_cinderbrew_meadery_InstanceMapScript(map);
}
};
void AddSC_instance_cinderbrew_meadery()
{
new instance_cinderbrew_meadery();
}
@@ -0,0 +1,334 @@
/*
* Copyright (C) WowCommunity Project
*
* This SourceCode is NOT free a software. Please hold everything Private
* and read our Terms
*/
#include "cinderbrew_meadery.h"
#include "Containers.h"
#include "ScriptedCreature.h"
#include "ScriptMgr.h"
#include "TemporarySummon.h"
enum TrashSpells
{
SPELL_MEAN_MUG = 434773, // Patron
SPELL_GUZZLE_CINDERBREW = 434505, // Patron / Muscle
SPELL_THIRSTY = 441408, // Patron
SPELL_BOILING_FLAMES = 453909, // Pyromaniac (channel)
SPELL_BOILING_FLAMES_DMG = 454318, // Pyromaniac periodic from channel
SPELL_ERUPTING_INFERNO = 437956, // Pyromaniac AoE on death / cast
SPELL_SWARMING_SURPRISE = 442995, // Honey Harvester
SPELL_SWARMING_SURPRISE_BC = 442641,
SPELL_RAIN_OF_HONEY = 440887, // Royal Jelly Purveyor
SPELL_BEE_ZOOKA = 441119, // Bee Wrangler
SPELL_BEE_STIAL_WRATH = 441351, // Bee Wrangler
SPELL_SHOOT = 456891, // Bee Wrangler ranged
SPELL_VOLATILE_KEG = 463223, // Hired Muscle
SPELL_THROW_CHAIR = 434756, // Hired Muscle
SPELL_RECKLESS_DELIVERY = 449090, // Careless Hopgoblin
SPELL_SPILL_DRINK = 441214, // Taste Tester
SPELL_FREE_SAMPLES = 441242, // Taste Tester
SPELL_FAILED_BATCH = 441434, // Flavor Scientist
SPELL_REJUVENATING_HONEY = 441627, // Flavor Scientist heals ally
};
enum TrashEvents
{
EVENT_MEAN_MUG = 1,
EVENT_BOILING_FLAMES,
EVENT_ERUPTING_INFERNO,
EVENT_SWARMING_SURPRISE,
EVENT_RAIN_OF_HONEY,
EVENT_BEE_ZOOKA,
EVENT_BEE_STIAL_WRATH,
EVENT_VOLATILE_KEG,
EVENT_THROW_CHAIR,
EVENT_RECKLESS_DELIVERY,
EVENT_SPILL_DRINK,
EVENT_FAILED_BATCH,
EVENT_REJUVENATING_HONEY,
};
// 218671 - Venture Co. Pyromaniac
struct npc_pyromaniac : public ScriptedAI
{
npc_pyromaniac(Creature* creature) : ScriptedAI(creature) { }
void ScheduleTasks() override
{
events.ScheduleEvent(EVENT_BOILING_FLAMES, 4s);
events.ScheduleEvent(EVENT_ERUPTING_INFERNO, 10s);
}
void ExecuteEvent(uint32 eventId) override
{
switch (eventId)
{
case EVENT_BOILING_FLAMES:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 20.0f, true))
{
DoCast(target, SPELL_BOILING_FLAMES);
DoCast(target, SPELL_BOILING_FLAMES_DMG, true);
}
events.Repeat(14s);
break;
case EVENT_ERUPTING_INFERNO:
DoCastSelf(SPELL_ERUPTING_INFERNO);
events.Repeat(20s);
break;
default:
break;
}
}
};
// 220946 - Honey Harvester
struct npc_honey_harvester : public ScriptedAI
{
npc_honey_harvester(Creature* creature) : ScriptedAI(creature) { }
void ScheduleTasks() override
{
events.ScheduleEvent(EVENT_SWARMING_SURPRISE, 6s);
}
void ExecuteEvent(uint32 eventId) override
{
switch (eventId)
{
case EVENT_SWARMING_SURPRISE:
DoCastSelf(SPELL_SWARMING_SURPRISE);
DoCastRandom(SPELL_SWARMING_SURPRISE_BC);
events.Repeat(16s);
break;
default:
break;
}
}
};
// 220141 - Royal Jelly Purveyor
struct npc_royal_jelly_purveyor : public ScriptedAI
{
npc_royal_jelly_purveyor(Creature* creature) : ScriptedAI(creature) { }
void ScheduleTasks() override
{
events.ScheduleEvent(EVENT_RAIN_OF_HONEY, 5s);
}
void ExecuteEvent(uint32 eventId) override
{
switch (eventId)
{
case EVENT_RAIN_OF_HONEY:
DoCastSelf(SPELL_RAIN_OF_HONEY);
events.Repeat(12s);
break;
default:
break;
}
}
};
// 210264 - Bee Wrangler
struct npc_bee_wrangler : public ScriptedAI
{
npc_bee_wrangler(Creature* creature) : ScriptedAI(creature) { }
void ScheduleTasks() override
{
events.ScheduleEvent(EVENT_BEE_ZOOKA, 4s);
events.ScheduleEvent(EVENT_BEE_STIAL_WRATH, 12s);
}
void ExecuteEvent(uint32 eventId) override
{
switch (eventId)
{
case EVENT_BEE_ZOOKA:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f, true))
DoCast(target, SPELL_BEE_ZOOKA);
events.Repeat(8s);
break;
case EVENT_BEE_STIAL_WRATH:
DoCastSelf(SPELL_BEE_STIAL_WRATH);
events.Repeat(18s);
break;
default:
break;
}
}
};
// 210269 - Hired Muscle
struct npc_hired_muscle : public ScriptedAI
{
npc_hired_muscle(Creature* creature) : ScriptedAI(creature) { }
void ScheduleTasks() override
{
events.ScheduleEvent(EVENT_VOLATILE_KEG, 7s);
events.ScheduleEvent(EVENT_THROW_CHAIR, 13s);
}
void ExecuteEvent(uint32 eventId) override
{
switch (eventId)
{
case EVENT_VOLATILE_KEG:
DoCastSelf(SPELL_VOLATILE_KEG);
events.Repeat(15s);
break;
case EVENT_THROW_CHAIR:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 25.0f, true))
DoCast(target, SPELL_THROW_CHAIR);
events.Repeat(18s);
break;
default:
break;
}
}
};
// 223423 - Careless Hopgoblin
struct npc_careless_hopgoblin : public ScriptedAI
{
npc_careless_hopgoblin(Creature* creature) : ScriptedAI(creature) { }
void ScheduleTasks() override
{
events.ScheduleEvent(EVENT_RECKLESS_DELIVERY, 6s);
}
void ExecuteEvent(uint32 eventId) override
{
switch (eventId)
{
case EVENT_RECKLESS_DELIVERY:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f, true))
{
DoCast(target, SPELL_RECKLESS_DELIVERY);
DoCast(target, 448619, true);
}
events.Repeat(9s);
break;
default:
break;
}
}
};
// 220060 - Taste Tester
struct npc_taste_tester : public ScriptedAI
{
npc_taste_tester(Creature* creature) : ScriptedAI(creature) { }
void ScheduleTasks() override
{
events.ScheduleEvent(EVENT_SPILL_DRINK, 8s);
}
void ExecuteEvent(uint32 eventId) override
{
switch (eventId)
{
case EVENT_SPILL_DRINK:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 20.0f, true))
{
DoCast(target, SPELL_SPILL_DRINK);
DoCast(target, SPELL_FREE_SAMPLES, true);
}
events.Repeat(12s);
break;
default:
break;
}
}
};
// 214673 - Flavor Scientist
struct npc_flavor_scientist : public ScriptedAI
{
npc_flavor_scientist(Creature* creature) : ScriptedAI(creature) { }
void ScheduleTasks() override
{
events.ScheduleEvent(EVENT_FAILED_BATCH, 6s);
events.ScheduleEvent(EVENT_REJUVENATING_HONEY, 14s);
}
void ExecuteEvent(uint32 eventId) override
{
switch (eventId)
{
case EVENT_FAILED_BATCH:
DoCastSelf(SPELL_FAILED_BATCH);
events.Repeat(14s);
break;
case EVENT_REJUVENATING_HONEY:
{
std::list<Creature*> allies;
me->GetCreatureListWithEntryInGrid(allies, me->GetEntry(), 20.0f);
if (!allies.empty())
{
Creature* ally = Trinity::Containers::SelectRandomContainerElement(allies);
if (ally && ally->IsAlive())
DoCast(ally, SPELL_REJUVENATING_HONEY);
}
events.Repeat(18s);
break;
}
default:
break;
}
}
};
// 214668 - Venture Co. Patron
struct npc_venture_patron : public ScriptedAI
{
npc_venture_patron(Creature* creature) : ScriptedAI(creature) { }
void ScheduleTasks() override
{
events.ScheduleEvent(EVENT_MEAN_MUG, 5s);
}
void ExecuteEvent(uint32 eventId) override
{
switch (eventId)
{
case EVENT_MEAN_MUG:
if (Unit* victim = me->GetVictim())
DoCast(victim, SPELL_MEAN_MUG);
events.Repeat(9s);
break;
default:
break;
}
}
};
void AddSC_cinderbrew_meadery_trash()
{
RegisterCinderbrewMeaderyCreatureAI(npc_pyromaniac);
RegisterCinderbrewMeaderyCreatureAI(npc_honey_harvester);
RegisterCinderbrewMeaderyCreatureAI(npc_royal_jelly_purveyor);
RegisterCinderbrewMeaderyCreatureAI(npc_bee_wrangler);
RegisterCinderbrewMeaderyCreatureAI(npc_hired_muscle);
RegisterCinderbrewMeaderyCreatureAI(npc_careless_hopgoblin);
RegisterCinderbrewMeaderyCreatureAI(npc_taste_tester);
RegisterCinderbrewMeaderyCreatureAI(npc_flavor_scientist);
RegisterCinderbrewMeaderyCreatureAI(npc_venture_patron);
}
@@ -30,6 +30,14 @@ void AddSC_boss_avanoxx();
void AddSC_boss_anubzekt();
void AddSC_boss_kikatal();
//Cinderbrew Meadery
void AddSC_instance_cinderbrew_meadery();
void AddSC_boss_brew_master_aldryr();
void AddSC_boss_ipa();
void AddSC_boss_benk_buzzbee();
void AddSC_boss_goldie_baronbottom();
void AddSC_cinderbrew_meadery_trash();
// The name of this function should match:
// void Add${NameOfDirectory}Scripts()
void AddWarWithinScripts()
@@ -55,4 +63,11 @@ void AddWarWithinScripts()
AddSC_boss_anubzekt();
AddSC_boss_kikatal();
//Cinderbrew Meadery
AddSC_instance_cinderbrew_meadery();
AddSC_boss_brew_master_aldryr();
AddSC_boss_ipa();
AddSC_boss_benk_buzzbee();
AddSC_boss_goldie_baronbottom();
AddSC_cinderbrew_meadery_trash();
}