Cinderbrew and opcodes
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user