mirror of
https://github.com/mangosfour/server.git
synced 2025-12-28 04:37:04 +00:00
Initial project location adjustment
This commit is contained in:
parent
11641a8bd7
commit
9d20fe2b32
244 changed files with 0 additions and 0 deletions
644
src/game/Server/DBCEnums.h
Normal file
644
src/game/Server/DBCEnums.h
Normal file
|
|
@ -0,0 +1,644 @@
|
|||
/**
|
||||
* MaNGOS is a full featured server for World of Warcraft, supporting
|
||||
* the following clients: 1.12.x, 2.4.3, 3.3.5a, 4.3.4a and 5.4.8
|
||||
*
|
||||
* Copyright (C) 2005-2014 MaNGOS project <http://getmangos.eu>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* World of Warcraft, and all World of Warcraft or Warcraft art, images,
|
||||
* and lore are copyrighted by Blizzard Entertainment, Inc.
|
||||
*/
|
||||
|
||||
#ifndef DBCENUMS_H
|
||||
#define DBCENUMS_H
|
||||
|
||||
// Client expected level limitation, like as used in DBC item max levels for "until max player level"
|
||||
// use as default max player level, must be fit max level for used client
|
||||
// also see MAX_LEVEL and STRONG_MAX_LEVEL define
|
||||
#define DEFAULT_MAX_LEVEL 85
|
||||
|
||||
// client supported max level for player/pets/etc. Avoid overflow or client stability affected.
|
||||
// also see GT_MAX_LEVEL define
|
||||
#define MAX_LEVEL 100
|
||||
|
||||
// Server side limitation. Base at used code requirements.
|
||||
// also see MAX_LEVEL and GT_MAX_LEVEL define
|
||||
#define STRONG_MAX_LEVEL 255
|
||||
enum MountFlags
|
||||
{
|
||||
MOUNT_FLAG_CAN_PITCH = 0x4,
|
||||
MOUNT_FLAG_CAN_SWIM = 0x8
|
||||
};
|
||||
|
||||
enum BattleGroundBracketId // bracketId for level ranges
|
||||
{
|
||||
BG_BRACKET_ID_TEMPLATE = -1, // used to mark bg as template
|
||||
BG_BRACKET_ID_FIRST = 0,
|
||||
BG_BRACKET_ID_LAST = 15
|
||||
};
|
||||
|
||||
// must be max value in PvPDificulty slot+1
|
||||
#define MAX_BATTLEGROUND_BRACKETS 16
|
||||
|
||||
enum AreaTeams
|
||||
{
|
||||
AREATEAM_NONE = 0,
|
||||
AREATEAM_ALLY = 2,
|
||||
AREATEAM_HORDE = 4
|
||||
};
|
||||
|
||||
enum AchievementFactionFlags
|
||||
{
|
||||
ACHIEVEMENT_FACTION_FLAG_HORDE = 0x00000000,
|
||||
ACHIEVEMENT_FACTION_FLAG_ALLIANCE = 0x00000001,
|
||||
};
|
||||
|
||||
enum AchievementFlags
|
||||
{
|
||||
ACHIEVEMENT_FLAG_NONE = 0x00000000,
|
||||
ACHIEVEMENT_FLAG_COUNTER = 0x00000001, // ACHIEVEMENT_FLAG_STATISTIC Just count statistic (never stop and complete)
|
||||
ACHIEVEMENT_FLAG_UNK2 = 0x00000002, // ACHIEVEMENT_FLAG_HIDDEN not used
|
||||
ACHIEVEMENT_FLAG_STORE_MAX_VALUE = 0x00000004, // ACHIEVEMENT_FLAG_HIDDEN_TILL_AWARDED Store only max value? used only in "Reach level xx"
|
||||
ACHIEVEMENT_FLAG_SUMM = 0x00000008, // ACHIEVEMENT_FLAG_CUMULATIVE Use summ criteria value from all requirements (and calculate max value)
|
||||
ACHIEVEMENT_FLAG_MAX_USED = 0x00000010, // ACHIEVEMENT_FLAG_DISPLAY_HIGHEST Show max criteria (and calculate max value ??)
|
||||
ACHIEVEMENT_FLAG_REQ_COUNT = 0x00000020, // ACHIEVEMENT_FLAG_CRITERIA_COUNT Use not zero req count (and calculate max value)
|
||||
ACHIEVEMENT_FLAG_AVERAGE = 0x00000040, // ACHIEVEMENT_FLAG_AVG_PER_DAY Show as average value (value / time_in_days) depend from other flag (by def use last criteria value)
|
||||
ACHIEVEMENT_FLAG_BAR = 0x00000080, // ACHIEVEMENT_FLAG_HAS_PROGRESS_BAR Show as progress bar (value / max vale) depend from other flag (by def use last criteria value)
|
||||
ACHIEVEMENT_FLAG_REALM_FIRST_REACH = 0x00000100, // ACHIEVEMENT_FLAG_SERVER_FIRST
|
||||
ACHIEVEMENT_FLAG_REALM_FIRST_KILL = 0x00000200, //
|
||||
ACHIEVEMENT_FLAG_UNK3 = 0x00000400, // ACHIEVEMENT_FLAG_HIDE_NAME_IN_TIE
|
||||
ACHIEVEMENT_FLAG_REALM_FIRST_GUILD = 0x00000800, // first guild on realm done something
|
||||
ACHIEVEMENT_FLAG_UNK4 = 0x00001000, // as guild group?
|
||||
ACHIEVEMENT_FLAG_UNK5 = 0x00002000, // as guild group?
|
||||
ACHIEVEMENT_FLAG_GUILD = 0x00004000, //
|
||||
ACHIEVEMENT_FLAG_SHOW_GUILD_MEMBERS = 0x00008000, //
|
||||
ACHIEVEMENT_FLAG_SHOW_CRITERIA_MEMBERS = 0x00010000, //
|
||||
};
|
||||
|
||||
enum AchievementCriteriaCondition
|
||||
{
|
||||
ACHIEVEMENT_CRITERIA_CONDITION_NONE = 0,
|
||||
ACHIEVEMENT_CRITERIA_CONDITION_NO_DEATH = 1,
|
||||
ACHIEVEMENT_CRITERIA_CONDITION_UNK1 = 2, // only used in "Complete a daily quest every day for five consecutive days"
|
||||
ACHIEVEMENT_CRITERIA_CONDITION_MAP = 3, // requires you to be on specific map
|
||||
ACHIEVEMENT_CRITERIA_CONDITION_NO_LOOSE = 4, // only used in "Win 10 arenas without losing"
|
||||
ACHIEVEMENT_CRITERIA_CONDITION_UNK2 = 9, // unk
|
||||
ACHIEVEMENT_CRITERIA_CONDITION_UNK3 = 13, // unk
|
||||
};
|
||||
|
||||
enum AchievementCriteriaCompletionFlags
|
||||
{
|
||||
ACHIEVEMENT_CRITERIA_FLAG_PROGRESS_BAR = 0x00000001, // Show progress as bar
|
||||
ACHIEVEMENT_CRITERIA_FLAG_HIDDEN = 0x00000002, // Not show criteria in client
|
||||
ACHIEVEMENT_CRITERIA_FLAG_FAIL_ACHIEVEMENT = 0x00000004, // BG related??
|
||||
ACHIEVEMENT_CRITERIA_FLAG_RESET_ON_START = 0x00000008, //
|
||||
ACHIEVEMENT_CRITERIA_FLAG_IS_DATE = 0x00000010, // not used
|
||||
ACHIEVEMENT_CRITERIA_FLAG_IS_MONEY = 0x00000020, // Displays counter as money
|
||||
ACHIEVEMENT_CRITERIA_FLAG_IS_ACHIEVEMENT_ID = 0x00000040,
|
||||
};
|
||||
|
||||
enum AchievementCriteriaTypes
|
||||
{
|
||||
ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE = 0,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_WIN_BG = 1,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL = 5,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL = 7,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT = 8,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST_COUNT = 9,
|
||||
// you have to complete a daily quest x times in a row
|
||||
ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST_DAILY = 10,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE = 11,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_CURRENCY_EARNED = 12,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE = 13,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST = 14,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND = 15,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP = 16,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_DEATH = 17,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON = 18,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_RAID = 19,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE = 20,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER = 23,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING = 24,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_DEATHS_FROM = 26,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST = 27,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET = 28,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL = 29,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE = 30,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA = 31,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_WIN_ARENA = 32,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_PLAY_ARENA = 33,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL = 34,
|
||||
// TODO: this criteria has additional conditions which can not be found in the dbcs
|
||||
ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL = 35,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM = 36,
|
||||
// TODO: the archievements 1162 and 1163 requires a special rating which can't be found in the dbc
|
||||
ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA = 37,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_TEAM_RATING = 38,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_PERSONAL_RATING = 39,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL = 40,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM = 41,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM = 42,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA = 43,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_OWN_RANK = 44,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_BUY_BANK_SLOT = 45,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION = 46,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_GAIN_EXALTED_REPUTATION = 47,
|
||||
// noted: rewarded as soon as the player payed, not at taking place at the seat
|
||||
ACHIEVEMENT_CRITERIA_TYPE_VISIT_BARBER_SHOP = 48,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM = 49,
|
||||
// TODO: itemlevel is mentioned in text but not present in dbc
|
||||
ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED_ON_LOOT = 50,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED_ON_LOOT = 51,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS = 52,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_HK_RACE = 53,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE = 54,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE = 55,
|
||||
// TODO: in some cases map not present, and in some cases need do without die
|
||||
ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS = 56,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM = 57,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_VENDORS = 59,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TALENTS = 60,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_NUMBER_OF_TALENT_RESETS = 61,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_QUEST_REWARD = 62,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TRAVELLING = 63,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_AT_BARBER = 65,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_MAIL = 66,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_LOOT_MONEY = 67,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_USE_GAMEOBJECT = 68,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2 = 69,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL = 70,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_FISH_IN_GAMEOBJECT = 72,
|
||||
// TODO: title id is not mentioned in dbc
|
||||
ACHIEVEMENT_CRITERIA_TYPE_ON_LOGIN = 74,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS = 75,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_WIN_DUEL = 76,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_LOSE_DUEL = 77,
|
||||
// TODO: creature type (demon, undead etc.) is not stored in dbc
|
||||
ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE_TYPE = 78,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_GOLD_EARNED_BY_AUCTIONS = 80,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_CREATE_AUCTION = 82,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_BID = 83,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_WON_AUCTIONS = 84,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_SOLD = 85,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_GOLD_VALUE_OWNED = 86,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_GAIN_REVERED_REPUTATION = 87,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_GAIN_HONORED_REPUTATION = 88,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_KNOWN_FACTIONS = 89,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_LOOT_EPIC_ITEM = 90,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM = 91,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED = 93,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED = 94,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALTH = 95,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_POWER = 96,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_STAT = 97,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_SPELLPOWER = 98,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_ARMOR = 99,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_RATING = 100,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_DEALT = 101,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_RECEIVED = 102,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_TOTAL_DAMAGE_RECEIVED = 103,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEAL_CASTED = 104,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_TOTAL_HEALING_RECEIVED = 105,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALING_RECEIVED = 106,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_QUEST_ABANDONED = 107,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_FLIGHT_PATHS_TAKEN = 108,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE = 109,
|
||||
// TODO: target entry is missing
|
||||
ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2 = 110,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE = 112,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL = 113,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_ACCEPTED_SUMMONINGS = 114,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_EARN_ACHIEVEMENT_POINTS = 115,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_USE_LFD_TO_GROUP_WITH_PLAYERS = 119,
|
||||
// 120 unused
|
||||
// 121 unused
|
||||
// 122 unused
|
||||
// 123 unused
|
||||
ACHIEVEMENT_CRITERIA_TYPE_SPENT_GOLD_GUILD_REPAIRS = 124,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_REACH_GUILD_LEVEL = 125,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_CRAFT_ITEMS_GUILD = 126,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_CATCH_FROM_POOL = 127,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_BUY_GUILD_BANK_SLOTS = 128,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_EARN_GUILD_ACHIEVEMENT_POINTS = 129,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_BATTLEGROUND = 130,
|
||||
// 131 unused
|
||||
ACHIEVEMENT_CRITERIA_TYPE_REACH_BG_RATING = 132,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_BUY_GUILD_TABARD = 133,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_GUILD = 134,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILLS_GUILD = 135,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE_TYPE_GUILD = 136,
|
||||
// 137 no achievements
|
||||
ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_GUILD_CHALLENGE = 138,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_GUILD_CHALLENGE_2 = 139,
|
||||
// 140 no achievements
|
||||
// 141 no achievements
|
||||
// 142 no achievements
|
||||
// 143 no achievements
|
||||
// 144 no achievements
|
||||
// 145 no achievements
|
||||
// 146 no achievements
|
||||
// 147 no achievements
|
||||
// 148 no achievements
|
||||
// 149 no achievements
|
||||
// 150 no achievements
|
||||
// 0..150 => 151 criteria types total
|
||||
};
|
||||
|
||||
#define ACHIEVEMENT_CRITERIA_TYPE_TOTAL 151
|
||||
|
||||
enum AchievementCriteriaMoreReqType
|
||||
{
|
||||
ACHIEVEMENT_CRITERIA_MORE_REQ_TYPE_ITEM_LEVEL = 3,
|
||||
ACHIEVEMENT_CRITERIA_MORE_REQ_TYPE_CREATURE_ID = 4,
|
||||
ACHIEVEMENT_CRITERIA_MORE_REQ_TYPE_SPELL = 8,
|
||||
ACHIEVEMENT_CRITERIA_MORE_REQ_TYPE_SPELL_ON_TARGET = 10,
|
||||
ACHIEVEMENT_CRITERIA_MORE_REQ_TYPE_ITEM_QUALITY_EQUIPPED = 14,
|
||||
ACHIEVEMENT_CRITERIA_MORE_REQ_TYPE_ITEM_QUALITY_LOOTED = 15,
|
||||
ACHIEVEMENT_CRITERIA_MORE_REQ_TYPE_AREA_ID = 17,
|
||||
ACHIEVEMENT_CRITERIA_MORE_REQ_TYPE_AREA_ID2 = 18,
|
||||
ACHIEVEMENT_CRITERIA_MORE_REQ_TYPE_RAID_DIFFICULTY = 20,
|
||||
ACHIEVEMENT_CRITERIA_MORE_REQ_TYPE_ARENA_TYPE = 24,
|
||||
ACHIEVEMENT_CRITERIA_MORE_REQ_TYPE_PLAYER_CLASS = 26,
|
||||
ACHIEVEMENT_CRITERIA_MORE_REQ_TYPE_PLAYER_RACE = 27,
|
||||
ACHIEVEMENT_CRITERIA_MORE_REQ_TYPE_PLAYER_CLASS2 = 28,
|
||||
ACHIEVEMENT_CRITERIA_MORE_REQ_TYPE_CREATURE_TYPE = 30,
|
||||
ACHIEVEMENT_CRITERIA_MORE_REQ_TYPE_MAP_ID = 32,
|
||||
ACHIEVEMENT_CRITERIA_MORE_REQ_TYPE_TIMED_QUEST = 35,
|
||||
ACHIEVEMENT_CRITERIA_MORE_REQ_TYPE_PLAYER_TITLE = 38,
|
||||
ACHIEVEMENT_CRITERIA_MORE_REQ_TYPE_PLAYER_LEVEL = 39,
|
||||
ACHIEVEMENT_CRITERIA_MORE_REQ_TYPE_PLAYER_LEVEL2 = 40,
|
||||
ACHIEVEMENT_CRITERIA_MORE_REQ_TYPE_AREA_ID3 = 41,
|
||||
ACHIEVEMENT_CRITERIA_MORE_REQ_TYPE_GUILD_REP = 62,
|
||||
};
|
||||
|
||||
enum AreaFlags
|
||||
{
|
||||
AREA_FLAG_SNOW = 0x00000001, // wrong - snow (only Dun Morogh, Naxxramas, Razorfen Downs and Winterspring)
|
||||
AREA_FLAG_UNK1 = 0x00000002, // may be necropolis?
|
||||
AREA_FLAG_UNK2 = 0x00000004, // Only used for areas on map 571 (development before)
|
||||
AREA_FLAG_SLAVE_CAPITAL = 0x00000008, // city and city subsones
|
||||
AREA_FLAG_UNK3 = 0x00000010, // can't find common meaning
|
||||
AREA_FLAG_SLAVE_CAPITAL2 = 0x00000020, // slave capital city flag?
|
||||
AREA_FLAG_DUEL = 0x00000040, // zones where duels allowed
|
||||
AREA_FLAG_ARENA = 0x00000080, // arena, both instanced and world arenas
|
||||
AREA_FLAG_CAPITAL = 0x00000100, // main capital city flag
|
||||
AREA_FLAG_CITY = 0x00000200, // only for one zone named "City" (where it located?)
|
||||
AREA_FLAG_OUTLAND = 0x00000400, // Dragonshrines, The Verne, Pincer X2, Entryway of Time
|
||||
AREA_FLAG_SANCTUARY = 0x00000800, // sanctuary area (PvP disabled)
|
||||
AREA_FLAG_NEED_FLY = 0x00001000, // only Netherwing Ledge, Socrethar's Seat, Tempest Keep, The Arcatraz, The Botanica, The Mechanar, Sorrow Wing Point, Dragonspine Ridge, Netherwing Mines, Dragonmaw Base Camp, Dragonmaw Skyway, Naxxramas, Maelstrom zones
|
||||
AREA_FLAG_UNUSED1 = 0x00002000, // not used now (no area/zones with this flag set in 3.0.3)
|
||||
AREA_FLAG_OUTLAND2 = 0x00004000, // expansion zones? (only Circle of Blood Arena not have this flag, but have 0x00000400 flag)
|
||||
AREA_FLAG_PVP = 0x00008000, // pvp objective area? (Death's Door also has this flag although it's no pvp object area)
|
||||
AREA_FLAG_ARENA_INSTANCE = 0x00010000, // used by instanced arenas, Twin Peaks indoor areas, THe Lost Isles
|
||||
AREA_FLAG_UNUSED2 = 0x00020000, // not used now (no area/zones with this flag set in 3.0.3)
|
||||
AREA_FLAG_UNK5 = 0x00040000, // only used for Amani Pass, Hatchet Hills
|
||||
AREA_FLAG_UNK6 = 0x00080000, // Valgarde, Acherus: The Ebon Hold, Gilneas, Kezhan, The Maelstrom, Duskmist Shore, The Lost Isles
|
||||
AREA_FLAG_LOWLEVEL = 0x00100000, // used for some starting areas with area_level <=15
|
||||
AREA_FLAG_TOWN = 0x00200000, // small towns with Inn
|
||||
AREA_FLAG_UNK7 = 0x00400000, // Warsong Hold, Acherus: The Ebon Hold, New Agamand Inn, Vengeance Landing Inn
|
||||
AREA_FLAG_UNK8 = 0x00800000, // Westguard Inn, Acherus: The Ebon Hold, Valgarde
|
||||
AREA_FLAG_OUTDOOR_PVP = 0x01000000, // Wintergrasp, Twin peaks and it's subzones, Ironclad Garrison (Tol Barad)
|
||||
AREA_FLAG_INSIDE = 0x02000000, // used for determinating spell related inside/outside questions in Map::IsOutdoors
|
||||
AREA_FLAG_OUTSIDE = 0x04000000, // used for determinating spell related inside/outside questions in Map::IsOutdoors
|
||||
AREA_FLAG_CAN_HEARTH_AND_RES = 0x08000000, // Wintergrasp, Tol Barad and their subzones
|
||||
AREA_FLAG_TP = 0x20000000, // Twin Peaks areas
|
||||
AREA_FLAG_UNK9 = 0x40000000, // many world zones
|
||||
AREA_FLAG_BFG = 0x80000000, // Battle for Gilneas areas and one Twin Peaks area
|
||||
};
|
||||
|
||||
enum Difficulty
|
||||
{
|
||||
REGULAR_DIFFICULTY = 0,
|
||||
|
||||
DUNGEON_DIFFICULTY_NORMAL = 0,
|
||||
DUNGEON_DIFFICULTY_HEROIC = 1,
|
||||
// DUNGEON_DIFFICULTY_EPIC = 2, // not used, but exists
|
||||
|
||||
RAID_DIFFICULTY_10MAN_NORMAL = 0,
|
||||
RAID_DIFFICULTY_25MAN_NORMAL = 1,
|
||||
RAID_DIFFICULTY_10MAN_HEROIC = 2,
|
||||
RAID_DIFFICULTY_25MAN_HEROIC = 3,
|
||||
};
|
||||
|
||||
#define MAX_DUNGEON_DIFFICULTY 2
|
||||
#define MAX_RAID_DIFFICULTY 4
|
||||
#define MAX_DIFFICULTY 4
|
||||
|
||||
enum SpawnMask
|
||||
{
|
||||
SPAWNMASK_REGULAR = (1 << REGULAR_DIFFICULTY),// any maps without spawn modes (continents/subway) or in minimal spawnmode
|
||||
|
||||
SPAWNMASK_DUNGEON_NORMAL = (1 << DUNGEON_DIFFICULTY_NORMAL),
|
||||
SPAWNMASK_DUNGEON_HEROIC = (1 << DUNGEON_DIFFICULTY_HEROIC),
|
||||
SPAWNMASK_DUNGEON_ALL = (SPAWNMASK_DUNGEON_NORMAL | SPAWNMASK_DUNGEON_HEROIC),
|
||||
|
||||
SPAWNMASK_RAID_10MAN_NORMAL = (1 << RAID_DIFFICULTY_10MAN_NORMAL),
|
||||
SPAWNMASK_RAID_25MAN_NORMAL = (1 << RAID_DIFFICULTY_25MAN_NORMAL),
|
||||
SPAWNMASK_RAID_NORMAL_ALL = (SPAWNMASK_RAID_10MAN_NORMAL | SPAWNMASK_RAID_25MAN_NORMAL),
|
||||
|
||||
SPAWNMASK_RAID_10MAN_HEROIC = (1 << RAID_DIFFICULTY_10MAN_HEROIC),
|
||||
SPAWNMASK_RAID_25MAN_HEROIC = (1 << RAID_DIFFICULTY_25MAN_HEROIC),
|
||||
SPAWNMASK_RAID_HEROIC_ALL = (SPAWNMASK_RAID_10MAN_HEROIC | SPAWNMASK_RAID_25MAN_HEROIC),
|
||||
|
||||
SPAWNMASK_RAID_ALL = (SPAWNMASK_RAID_NORMAL_ALL | SPAWNMASK_RAID_HEROIC_ALL),
|
||||
};
|
||||
|
||||
enum FactionTemplateFlags
|
||||
{
|
||||
FACTION_TEMPLATE_FLAG_PVP = 0x00000800, // flagged for PvP
|
||||
FACTION_TEMPLATE_FLAG_CONTESTED_GUARD = 0x00001000, // faction will attack players that were involved in PvP combats
|
||||
};
|
||||
|
||||
enum FactionMasks
|
||||
{
|
||||
FACTION_MASK_PLAYER = 1, // any player
|
||||
FACTION_MASK_ALLIANCE = 2, // player or creature from alliance team
|
||||
FACTION_MASK_HORDE = 4, // player or creature from horde team
|
||||
FACTION_MASK_MONSTER = 8 // aggressive creature from monster team
|
||||
// if none flags set then non-aggressive creature
|
||||
};
|
||||
|
||||
enum MapTypes // Lua_IsInInstance
|
||||
{
|
||||
MAP_COMMON = 0, // none
|
||||
MAP_INSTANCE = 1, // party
|
||||
MAP_RAID = 2, // raid
|
||||
MAP_BATTLEGROUND = 3, // pvp
|
||||
MAP_ARENA = 4 // arena
|
||||
};
|
||||
|
||||
enum AbilytyLearnType
|
||||
{
|
||||
ABILITY_LEARNED_ON_GET_PROFESSION_SKILL = 1,
|
||||
ABILITY_LEARNED_ON_GET_RACE_OR_CLASS_SKILL = 2
|
||||
};
|
||||
|
||||
enum AbilitySkillFlags
|
||||
{
|
||||
ABILITY_SKILL_NONTRAINABLE = 0x100
|
||||
};
|
||||
|
||||
#define CURRENCY_PRECISION 100.0f
|
||||
|
||||
enum CurrencyCategory
|
||||
{
|
||||
CURRENCY_CATEGORY_ARCHAEOLOGY = 82,
|
||||
CURRENCY_CATEGORY_META = 89,
|
||||
};
|
||||
|
||||
enum CurrencyFlags
|
||||
{
|
||||
CURRENCY_FLAG_HAS_PRECISION = 0x08,
|
||||
CURRENCY_FLAG_HAS_SEASON_COUNT = 0x80, // guessed
|
||||
};
|
||||
|
||||
enum Currencies
|
||||
{
|
||||
CURRENCY_NONE = 0,
|
||||
CURRENCY_CONQUEST_POINTS = 390,
|
||||
CURRENCY_HONOR_POINTS = 392,
|
||||
CURRENCY_JUSTICE_POINTS = 395,
|
||||
CURRENCY_VALOR_POINTS = 396,
|
||||
CURRENCY_CONQUEST_ARENA_META = 483,
|
||||
CURRENCY_CONQUEST_BG_META = 484,
|
||||
};
|
||||
|
||||
enum ItemEnchantmentType
|
||||
{
|
||||
ITEM_ENCHANTMENT_TYPE_NONE = 0,
|
||||
ITEM_ENCHANTMENT_TYPE_COMBAT_SPELL = 1,
|
||||
ITEM_ENCHANTMENT_TYPE_DAMAGE = 2,
|
||||
ITEM_ENCHANTMENT_TYPE_EQUIP_SPELL = 3,
|
||||
ITEM_ENCHANTMENT_TYPE_RESISTANCE = 4,
|
||||
ITEM_ENCHANTMENT_TYPE_STAT = 5,
|
||||
ITEM_ENCHANTMENT_TYPE_TOTEM = 6,
|
||||
ITEM_ENCHANTMENT_TYPE_USE_SPELL = 7,
|
||||
ITEM_ENCHANTMENT_TYPE_PRISMATIC_SOCKET = 8
|
||||
};
|
||||
|
||||
enum ItemLimitCategoryMode
|
||||
{
|
||||
ITEM_LIMIT_CATEGORY_MODE_HAVE = 0, // limit applied to amount items in inventory/bank
|
||||
ITEM_LIMIT_CATEGORY_MODE_EQUIP = 1, // limit applied to amount equipped items (including used gems)
|
||||
};
|
||||
|
||||
// some used in code cases
|
||||
enum ItemLimitCategory
|
||||
{
|
||||
ITEM_LIMIT_CATEGORY_MANA_GEM = 4,
|
||||
};
|
||||
|
||||
enum TalentTreeRole
|
||||
{
|
||||
TALENT_ROLE_TANK = 0x2,
|
||||
TALENT_ROLE_HEALER = 0x4,
|
||||
TALENT_ROLE_DPS = 0x8,
|
||||
};
|
||||
|
||||
#define MAX_MASTERY_SPELLS 2
|
||||
|
||||
enum TotemCategoryType
|
||||
{
|
||||
TOTEM_CATEGORY_TYPE_KNIFE = 1,
|
||||
TOTEM_CATEGORY_TYPE_TOTEM = 2,
|
||||
TOTEM_CATEGORY_TYPE_ROD = 3,
|
||||
TOTEM_CATEGORY_TYPE_PICK = 21,
|
||||
TOTEM_CATEGORY_TYPE_STONE = 22,
|
||||
TOTEM_CATEGORY_TYPE_HAMMER = 23,
|
||||
TOTEM_CATEGORY_TYPE_SPANNER = 24
|
||||
};
|
||||
|
||||
// SummonProperties.dbc, col 0 == Id (m_id)
|
||||
// SummonProperties.dbc, col 1 == Group (m_control)
|
||||
enum SummonPropGroup
|
||||
{
|
||||
SUMMON_PROP_GROUP_WILD = 0,
|
||||
SUMMON_PROP_GROUP_FRIENDLY = 1,
|
||||
SUMMON_PROP_GROUP_PETS = 2,
|
||||
SUMMON_PROP_GROUP_CONTROLLABLE = 3,
|
||||
SUMMON_PROP_GROUP_VEHICLE = 4
|
||||
};
|
||||
|
||||
// SummonProperties.dbc, col 2 == FactionId (m_faction)
|
||||
// SummonProperties.dbc, col 3 == Title (m_title)
|
||||
enum UnitNameSummonTitle
|
||||
{
|
||||
UNITNAME_SUMMON_TITLE_NONE = 0, // no default title, different summons, 1330 spells in 3.0.3
|
||||
UNITNAME_SUMMON_TITLE_PET = 1, // 's Pet, generic summons, 49 spells in 3.0.3
|
||||
UNITNAME_SUMMON_TITLE_GUARDIAN = 2, // 's Guardian, summon guardian, 393 spells in 3.0.3
|
||||
UNITNAME_SUMMON_TITLE_MINION = 3, // 's Minion, summon army, 5 spells in 3.0.3
|
||||
UNITNAME_SUMMON_TITLE_TOTEM = 4, // 's Totem, summon totem, 169 spells in 3.0.3
|
||||
UNITNAME_SUMMON_TITLE_COMPANION = 5, // 's Companion, critter/minipet, 195 spells in 3.0.3
|
||||
UNITNAME_SUMMON_TITLE_RUNEBLADE = 6, // 's Runeblade, summon DRW/Ghoul, 2 spells in 3.0.3"
|
||||
UNITNAME_SUMMON_TITLE_CONSTRUCT = 7, // 's Construct, summon bot/bomb, 4 spells in 3.0.3
|
||||
UNITNAME_SUMMON_TITLE_OPPONENT = 8, // 's Opponent, something todo with DK prequest line, 2 spells in 3.0.3
|
||||
UNITNAME_SUMMON_TITLE_VEHICLE = 9, // 's Vehicle, summon different vehicles, 14 spells in 3.0.3
|
||||
UNITNAME_SUMMON_TITLE_MOUNT = 10, // 's Mount, summon drake (vehicle), 3 spells
|
||||
UNITNAME_SUMMON_TITLE_LIGHTWELL = 11, // 's Lightwell, summon lightwell, 6 spells in 3.0.3
|
||||
UNITNAME_SUMMON_TITLE_BUTLER = 12 // 's Butler, summon repair bot, 1 spells in 3.2.2a
|
||||
};
|
||||
|
||||
// SummonProperties.dbc, col 4 == Slot (m_slot)
|
||||
// SummonProperties.dbc, col 5 == Flags (m_flags)
|
||||
enum SummonPropFlags
|
||||
{
|
||||
SUMMON_PROP_FLAG_NONE = 0x0000, // 1342 spells in 3.0.3
|
||||
SUMMON_PROP_FLAG_UNK1 = 0x0001, // 75 spells in 3.0.3, something unfriendly
|
||||
SUMMON_PROP_FLAG_UNK2 = 0x0002, // 616 spells in 3.0.3, something friendly
|
||||
SUMMON_PROP_FLAG_UNK3 = 0x0004, // 22 spells in 3.0.3, no idea...
|
||||
SUMMON_PROP_FLAG_UNK4 = 0x0008, // 49 spells in 3.0.3, some mounts
|
||||
SUMMON_PROP_FLAG_UNK5 = 0x0010, // 25 spells in 3.0.3, quest related?
|
||||
SUMMON_PROP_FLAG_CANT_BE_DISMISSED = 0x0020, // 0 spells in 3.0.3, unused
|
||||
SUMMON_PROP_FLAG_UNK7 = 0x0040, // 12 spells in 3.0.3, no idea
|
||||
SUMMON_PROP_FLAG_UNK8 = 0x0080, // 4 spells in 3.0.3, no idea
|
||||
SUMMON_PROP_FLAG_UNK9 = 0x0100, // 51 spells in 3.0.3, no idea, many quest related
|
||||
SUMMON_PROP_FLAG_INHERIT_FACTION = 0x0200, // 51 spells in 3.0.3, something defensive
|
||||
SUMMON_PROP_FLAG_UNK11 = 0x0400, // 3 spells, requires something near?
|
||||
SUMMON_PROP_FLAG_UNK12 = 0x0800, // 30 spells in 3.0.3, no idea
|
||||
SUMMON_PROP_FLAG_UNK13 = 0x1000, // 8 spells in 3.0.3, siege vehicle
|
||||
SUMMON_PROP_FLAG_UNK14 = 0x2000, // 2 spells in 3.0.3, escort?
|
||||
};
|
||||
|
||||
// SpellEntry::Targets
|
||||
enum SpellCastTargetFlags
|
||||
{
|
||||
TARGET_FLAG_SELF = 0x00000000,
|
||||
TARGET_FLAG_UNUSED1 = 0x00000001, // not used in any spells as of 3.0.3 (can be set dynamically)
|
||||
TARGET_FLAG_UNIT = 0x00000002, // pguid
|
||||
TARGET_FLAG_UNUSED2 = 0x00000004, // not used in any spells as of 3.0.3 (can be set dynamically)
|
||||
TARGET_FLAG_UNUSED3 = 0x00000008, // not used in any spells as of 3.0.3 (can be set dynamically)
|
||||
TARGET_FLAG_ITEM = 0x00000010, // pguid
|
||||
TARGET_FLAG_SOURCE_LOCATION = 0x00000020, // pguid + 3 float
|
||||
TARGET_FLAG_DEST_LOCATION = 0x00000040, // pguid + 3 float
|
||||
TARGET_FLAG_OBJECT_UNK = 0x00000080, // used in 7 spells only
|
||||
TARGET_FLAG_UNIT_UNK = 0x00000100, // looks like self target (480 spells)
|
||||
TARGET_FLAG_PVP_CORPSE = 0x00000200, // pguid
|
||||
TARGET_FLAG_UNIT_CORPSE = 0x00000400, // 10 spells (gathering professions)
|
||||
TARGET_FLAG_OBJECT = 0x00000800, // pguid, 2 spells
|
||||
TARGET_FLAG_TRADE_ITEM = 0x00001000, // pguid, 0 spells
|
||||
TARGET_FLAG_STRING = 0x00002000, // string, 0 spells
|
||||
TARGET_FLAG_UNK1 = 0x00004000, // 199 spells, opening object/lock
|
||||
TARGET_FLAG_CORPSE = 0x00008000, // pguid, resurrection spells
|
||||
TARGET_FLAG_UNK2 = 0x00010000, // pguid, not used in any spells as of 3.0.3 (can be set dynamically)
|
||||
TARGET_FLAG_GLYPH = 0x00020000, // used in glyph spells
|
||||
TARGET_FLAG_UNK3 = 0x00040000, //
|
||||
TARGET_FLAG_VISUAL_CHAIN = 0x00080000 // uint32, loop { vec3, guid -> if guid == 0 break }
|
||||
};
|
||||
|
||||
enum SpellEffectIndex
|
||||
{
|
||||
EFFECT_INDEX_0 = 0,
|
||||
EFFECT_INDEX_1 = 1,
|
||||
EFFECT_INDEX_2 = 2
|
||||
};
|
||||
|
||||
#define MAX_EFFECT_INDEX 3
|
||||
|
||||
enum SpellFamily
|
||||
{
|
||||
SPELLFAMILY_GENERIC = 0,
|
||||
SPELLFAMILY_UNK1 = 1, // events, holidays
|
||||
// 2 - unused
|
||||
SPELLFAMILY_MAGE = 3,
|
||||
SPELLFAMILY_WARRIOR = 4,
|
||||
SPELLFAMILY_WARLOCK = 5,
|
||||
SPELLFAMILY_PRIEST = 6,
|
||||
SPELLFAMILY_DRUID = 7,
|
||||
SPELLFAMILY_ROGUE = 8,
|
||||
SPELLFAMILY_HUNTER = 9,
|
||||
SPELLFAMILY_PALADIN = 10,
|
||||
SPELLFAMILY_SHAMAN = 11,
|
||||
SPELLFAMILY_UNK2 = 12, // 2 spells (silence resistance)
|
||||
SPELLFAMILY_POTION = 13,
|
||||
// 14 - unused
|
||||
SPELLFAMILY_DEATHKNIGHT = 15,
|
||||
// 16 - unused
|
||||
SPELLFAMILY_PET = 17
|
||||
};
|
||||
|
||||
enum VehicleFlags
|
||||
{
|
||||
VEHICLE_FLAG_NO_STRAFE = 0x00000001, // Sets MOVEFLAG2_NO_STRAFE
|
||||
VEHICLE_FLAG_NO_JUMPING = 0x00000002, // Sets MOVEFLAG2_NO_JUMPING
|
||||
VEHICLE_FLAG_FULLSPEEDTURNING = 0x00000004, // Sets MOVEFLAG2_FULLSPEEDTURNING
|
||||
VEHICLE_FLAG_UNK1 = 0x00000008,
|
||||
VEHICLE_FLAG_ALLOW_PITCHING = 0x00000010, // Sets MOVEFLAG2_ALLOW_PITCHING
|
||||
VEHICLE_FLAG_FULLSPEEDPITCHING = 0x00000020, // Sets MOVEFLAG2_FULLSPEEDPITCHING
|
||||
VEHICLE_FLAG_CUSTOM_PITCH = 0x00000040, // If set use pitchMin and pitchMax from DBC, otherwise pitchMin = -pi/2, pitchMax = pi/2
|
||||
VEHICLE_FLAG_UNK2 = 0x00000080,
|
||||
VEHICLE_FLAG_UNK3 = 0x00000100,
|
||||
VEHICLE_FLAG_UNK4 = 0x00000200, // Vehicle is accessory?
|
||||
VEHICLE_FLAG_ADJUST_AIM_ANGLE = 0x00000400, // Lua_IsVehicleAimAngleAdjustable
|
||||
VEHICLE_FLAG_ADJUST_AIM_POWER = 0x00000800, // Lua_IsVehicleAimPowerAdjustable
|
||||
VEHICLE_FLAG_UNK5 = 0x00001000,
|
||||
VEHICLE_FLAG_UNK6 = 0x00002000,
|
||||
VEHICLE_FLAG_UNK7 = 0x00004000,
|
||||
VEHICLE_FLAG_UNK8 = 0x00008000,
|
||||
VEHICLE_FLAG_UNK9 = 0x00010000,
|
||||
VEHICLE_FLAG_UNK10 = 0x00020000,
|
||||
VEHICLE_FLAG_UNK11 = 0x00040000,
|
||||
VEHICLE_FLAG_UNK12 = 0x00080000,
|
||||
VEHICLE_FLAG_UNK13 = 0x00100000,
|
||||
VEHICLE_FLAG_UNK14 = 0x00200000,
|
||||
VEHICLE_FLAG_DISABLE_SWITCH = 0x00400000, // Can't change seats, VEHICLE_ID = 335 chopper
|
||||
VEHICLE_FLAG_UNK15 = 0x00800000,
|
||||
VEHICLE_FLAG_UNK16 = 0x01000000,
|
||||
VEHICLE_FLAG_UNK17 = 0x02000000,
|
||||
VEHICLE_FLAG_UNK18 = 0x04000000,
|
||||
VEHICLE_FLAG_UNK19 = 0x08000000,
|
||||
VEHICLE_FLAG_UNK20 = 0x10000000, // Vehicle not dismissed after eject passenger?
|
||||
VEHICLE_FLAG_UNK21 = 0x20000000,
|
||||
VEHICLE_FLAG_UNK22 = 0x40000000,
|
||||
VEHICLE_FLAG_UNK23 = 0x80000000,
|
||||
};
|
||||
|
||||
enum VehicleSeatFlags
|
||||
{
|
||||
SEAT_FLAG_UNK1 = 0x00000001, // "HasLowerAnimForEnter"
|
||||
SEAT_FLAG_UNK2 = 0x00000002, // "HasLowerAnimForRide"
|
||||
SEAT_FLAG_UNK3 = 0x00000004,
|
||||
SEAT_FLAG_UNK4 = 0x00000008, // "ShouldUseVehicleSeatExitAnimationOnVoluntaryExit"
|
||||
SEAT_FLAG_UNK5 = 0x00000010,
|
||||
SEAT_FLAG_UNK6 = 0x00000020,
|
||||
SEAT_FLAG_UNK7 = 0x00000040,
|
||||
SEAT_FLAG_UNK8 = 0x00000080,
|
||||
SEAT_FLAG_UNK9 = 0x00000100,
|
||||
SEAT_FLAG_HIDE_PASSENGER = 0x00000200, // Passenger is hidden
|
||||
SEAT_FLAG_UNK10 = 0x00000400, // "AllowsTurning"
|
||||
SEAT_FLAG_CAN_CONTROL = 0x00000800, // Lua_UnitInVehicleControlSeat
|
||||
SEAT_FLAG_UNK11 = 0x00001000, // "Can Cast Mount Spell"
|
||||
SEAT_FLAG_UNK12 = 0x00002000, // "Uncontrolled"
|
||||
SEAT_FLAG_CAN_ATTACK = 0x00004000, // Can attack, cast spells and use items from vehicle?
|
||||
SEAT_FLAG_UNK13 = 0x00008000, // "ShouldUseVehicleSeatExitAnimationOnForcedExit"
|
||||
SEAT_FLAG_UNK14 = 0x00010000,
|
||||
SEAT_FLAG_UNK15 = 0x00020000,
|
||||
SEAT_FLAG_UNK16 = 0x00040000, // "HasVehicleExitAnimForVoluntaryExit"
|
||||
SEAT_FLAG_UNK17 = 0x00080000, // "HasVehicleExitAnimForForcedExit"
|
||||
SEAT_FLAG_UNK18 = 0x00100000,
|
||||
SEAT_FLAG_UNK19 = 0x00200000,
|
||||
SEAT_FLAG_UNK20 = 0x00400000, // "RecHasVehicleEnterAnim"
|
||||
SEAT_FLAG_UNK21 = 0x00800000, // Lua_IsUsingVehicleControls
|
||||
SEAT_FLAG_UNK22 = 0x01000000, // "EnableVehicleZoom"
|
||||
SEAT_FLAG_USABLE = 0x02000000, // Lua_CanExitVehicle
|
||||
SEAT_FLAG_CAN_SWITCH = 0x04000000, // Lua_CanSwitchVehicleSeats
|
||||
SEAT_FLAG_UNK23 = 0x08000000, // "HasStartWaitingForVehicleTransitionAnimEnter"
|
||||
SEAT_FLAG_UNK24 = 0x10000000, // "HasStartWaitingForVehicleTransitionAnimExit"
|
||||
SEAT_FLAG_CAN_CAST = 0x20000000, // Lua_UnitHasVehicleUI
|
||||
SEAT_FLAG_UNK25 = 0x40000000,
|
||||
SEAT_FLAG_UNK26 = 0x80000000, // "AllowsInteraction"
|
||||
};
|
||||
|
||||
#endif
|
||||
1226
src/game/Server/DBCStores.cpp
Normal file
1226
src/game/Server/DBCStores.cpp
Normal file
File diff suppressed because it is too large
Load diff
270
src/game/Server/DBCStores.h
Normal file
270
src/game/Server/DBCStores.h
Normal file
|
|
@ -0,0 +1,270 @@
|
|||
/**
|
||||
* MaNGOS is a full featured server for World of Warcraft, supporting
|
||||
* the following clients: 1.12.x, 2.4.3, 3.3.5a, 4.3.4a and 5.4.8
|
||||
*
|
||||
* Copyright (C) 2005-2014 MaNGOS project <http://getmangos.eu>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* World of Warcraft, and all World of Warcraft or Warcraft art, images,
|
||||
* and lore are copyrighted by Blizzard Entertainment, Inc.
|
||||
*/
|
||||
|
||||
#ifndef MANGOS_DBCSTORES_H
|
||||
#define MANGOS_DBCSTORES_H
|
||||
|
||||
#include "Common.h"
|
||||
#include "Database/DBCStore.h"
|
||||
#include "DBCStructure.h"
|
||||
|
||||
#include <list>
|
||||
|
||||
bool IsAcceptableClientBuild(uint32 build);
|
||||
std::string AcceptableClientBuildsListStr();
|
||||
|
||||
typedef std::list<uint32> SimpleFactionsList;
|
||||
|
||||
SimpleFactionsList const* GetFactionTeamList(uint32 faction);
|
||||
char const* GetPetName(uint32 petfamily, uint32 dbclang);
|
||||
uint32 GetTalentSpellCost(uint32 spellId);
|
||||
uint32 GetTalentSpellCost(TalentSpellPos const* pos);
|
||||
TalentSpellPos const* GetTalentSpellPos(uint32 spellId);
|
||||
SpellEffectEntry const* GetSpellEffectEntry(uint32 spellId, SpellEffectIndex effect);
|
||||
|
||||
int32 GetAreaFlagByAreaID(uint32 area_id); // -1 if not found
|
||||
uint32 GetAreaFlagByMapId(uint32 mapid);
|
||||
|
||||
WMOAreaTableEntry const* GetWMOAreaTableEntryByTripple(int32 rootid, int32 adtid, int32 groupid);
|
||||
|
||||
MANGOS_DLL_SPEC AreaTableEntry const* GetAreaEntryByAreaID(uint32 area_id);
|
||||
MANGOS_DLL_SPEC AreaTableEntry const* GetAreaEntryByAreaFlagAndMap(uint32 area_flag, uint32 map_id);
|
||||
|
||||
uint32 GetVirtualMapForMapAndZone(uint32 mapid, uint32 zoneId);
|
||||
|
||||
enum ContentLevels
|
||||
{
|
||||
CONTENT_1_60 = 0,
|
||||
CONTENT_61_70,
|
||||
CONTENT_71_80,
|
||||
CONTENT_81_85,
|
||||
};
|
||||
|
||||
ContentLevels GetContentLevelsForMapAndZone(uint32 mapId, uint32 zoneId);
|
||||
|
||||
ChatChannelsEntry const* GetChannelEntryFor(uint32 channel_id);
|
||||
|
||||
bool IsTotemCategoryCompatiableWith(uint32 itemTotemCategoryId, uint32 requiredTotemCategoryId);
|
||||
|
||||
bool Zone2MapCoordinates(float& x, float& y, uint32 zone);
|
||||
bool Map2ZoneCoordinates(float& x, float& y, uint32 zone);
|
||||
|
||||
typedef std::map<uint32/*pair32(map,diff)*/, MapDifficultyEntry const*> MapDifficultyMap;
|
||||
MapDifficultyEntry const* GetMapDifficultyData(uint32 mapId, Difficulty difficulty);
|
||||
|
||||
// natural order for difficulties up-down iteration
|
||||
// difficulties for dungeons/battleground ordered in normal way
|
||||
// and if more high version not exist must be used lesser version
|
||||
// for raid order different:
|
||||
// 10 man normal version must be used instead nonexistent 10 man heroic version
|
||||
// 25 man normal version must be used instead nonexistent 25 man heroic version
|
||||
inline Difficulty GetPrevDifficulty(Difficulty diff, bool isRaid)
|
||||
{
|
||||
switch (diff)
|
||||
{
|
||||
default:
|
||||
case RAID_DIFFICULTY_10MAN_NORMAL: // == DUNGEON_DIFFICULTY_NORMAL == REGULAR_DIFFICULTY
|
||||
return REGULAR_DIFFICULTY; // return itself, caller code must properly check and not call for this case
|
||||
case RAID_DIFFICULTY_25MAN_NORMAL: // == DUNGEON_DIFFICULTY_HEROIC
|
||||
return RAID_DIFFICULTY_10MAN_NORMAL;
|
||||
case RAID_DIFFICULTY_10MAN_HEROIC:
|
||||
return isRaid ? RAID_DIFFICULTY_10MAN_NORMAL : DUNGEON_DIFFICULTY_HEROIC;
|
||||
case RAID_DIFFICULTY_25MAN_HEROIC:
|
||||
return isRaid ? RAID_DIFFICULTY_25MAN_NORMAL : RAID_DIFFICULTY_10MAN_HEROIC;
|
||||
}
|
||||
}
|
||||
|
||||
uint32 const* /*[3]*/ GetTalentTabPages(uint32 cls);
|
||||
std::vector<uint32> const* GetTalentTreeMasterySpells(uint32 talentTree);
|
||||
std::vector<uint32> const* GetTalentTreePrimarySpells(uint32 talentTree);
|
||||
uint32 GetTalentTreeRolesMask(uint32 talentTree);
|
||||
|
||||
bool IsPointInAreaTriggerZone(AreaTriggerEntry const* atEntry, uint32 mapid, float x, float y, float z, float delta = 0.0f);
|
||||
|
||||
PvPDifficultyEntry const* GetBattlegroundBracketByLevel(uint32 mapid, uint32 level);
|
||||
PvPDifficultyEntry const* GetBattlegroundBracketById(uint32 mapid, BattleGroundBracketId id);
|
||||
|
||||
MANGOS_DLL_SPEC uint32 GetCreatureModelRace(uint32 model_id);
|
||||
|
||||
float GetCurrencyPrecision(uint32 currencyId);
|
||||
|
||||
extern DBCStorage <AchievementEntry> sAchievementStore;
|
||||
extern DBCStorage <AchievementCriteriaEntry> sAchievementCriteriaStore;
|
||||
extern DBCStorage <AreaTableEntry> sAreaStore;// recommend access using functions
|
||||
extern DBCStorage <AreaGroupEntry> sAreaGroupStore;
|
||||
extern DBCStorage <AreaTriggerEntry> sAreaTriggerStore;
|
||||
extern DBCStorage <ArmorLocationEntry> sArmorLocationStore;
|
||||
extern DBCStorage <AuctionHouseEntry> sAuctionHouseStore;
|
||||
extern DBCStorage <BankBagSlotPricesEntry> sBankBagSlotPricesStore;
|
||||
extern DBCStorage <BarberShopStyleEntry> sBarberShopStyleStore;
|
||||
extern DBCStorage <BattlemasterListEntry> sBattlemasterListStore;
|
||||
// extern DBCStorage <ChatChannelsEntry> sChatChannelsStore; -- accessed using function, no usable index
|
||||
extern DBCStorage <CharStartOutfitEntry> sCharStartOutfitStore;
|
||||
extern DBCStorage <CharTitlesEntry> sCharTitlesStore;
|
||||
extern DBCStorage <ChrClassesEntry> sChrClassesStore;
|
||||
extern DBCStorage <ChrPowerTypesEntry> sChrPowerTypesStore;
|
||||
extern uint32 sChrClassXPowerTypesStore[MAX_CLASSES][MAX_POWERS];
|
||||
extern uint32 sChrClassXPowerIndexStore[MAX_CLASSES][MAX_STORED_POWERS];
|
||||
extern DBCStorage <ChrRacesEntry> sChrRacesStore;
|
||||
extern DBCStorage <CinematicSequencesEntry> sCinematicSequencesStore;
|
||||
extern DBCStorage <CreatureDisplayInfoEntry> sCreatureDisplayInfoStore;
|
||||
extern DBCStorage <CreatureDisplayInfoExtraEntry>sCreatureDisplayInfoExtraStore;
|
||||
extern DBCStorage <CreatureFamilyEntry> sCreatureFamilyStore;
|
||||
extern DBCStorage <CreatureSpellDataEntry> sCreatureSpellDataStore;
|
||||
extern DBCStorage <CreatureTypeEntry> sCreatureTypeStore;
|
||||
extern DBCStorage <CurrencyTypesEntry> sCurrencyTypesStore;
|
||||
extern DBCStorage <DestructibleModelDataEntry> sDestructibleModelDataStore;
|
||||
extern DBCStorage <DungeonEncounterEntry> sDungeonEncounterStore;
|
||||
extern DBCStorage <DurabilityCostsEntry> sDurabilityCostsStore;
|
||||
extern DBCStorage <DurabilityQualityEntry> sDurabilityQualityStore;
|
||||
extern DBCStorage <EmotesEntry> sEmotesStore;
|
||||
extern DBCStorage <EmotesTextEntry> sEmotesTextStore;
|
||||
extern DBCStorage <FactionEntry> sFactionStore;
|
||||
extern DBCStorage <FactionTemplateEntry> sFactionTemplateStore;
|
||||
extern DBCStorage <GameObjectDisplayInfoEntry> sGameObjectDisplayInfoStore;
|
||||
extern DBCStorage <GemPropertiesEntry> sGemPropertiesStore;
|
||||
extern DBCStorage <GlyphPropertiesEntry> sGlyphPropertiesStore;
|
||||
extern DBCStorage <GlyphSlotEntry> sGlyphSlotStore;
|
||||
|
||||
extern DBCStorage <GtBarberShopCostBaseEntry> sGtBarberShopCostBaseStore;
|
||||
extern DBCStorage <GtCombatRatingsEntry> sGtCombatRatingsStore;
|
||||
extern DBCStorage <GtChanceToMeleeCritBaseEntry> sGtChanceToMeleeCritBaseStore;
|
||||
extern DBCStorage <GtChanceToMeleeCritEntry> sGtChanceToMeleeCritStore;
|
||||
extern DBCStorage <GtChanceToSpellCritBaseEntry> sGtChanceToSpellCritBaseStore;
|
||||
extern DBCStorage <GtChanceToSpellCritEntry> sGtChanceToSpellCritStore;
|
||||
extern DBCStorage <GtOCTClassCombatRatingScalarEntry> sGtOCTClassCombatRatingScalarStore;
|
||||
// extern DBCStorage <GtOCTRegenMPEntry> sGtOCTRegenMPStore; -- not used currently
|
||||
extern DBCStorage <GtOCTHpPerStaminaEntry> sGtOCTHpPerStaminaStore;
|
||||
extern DBCStorage <GtRegenMPPerSptEntry> sGtRegenMPPerSptStore;
|
||||
extern DBCStorage <GtSpellScalingEntry> sGtSpellScalingStore;
|
||||
extern DBCStorage <GtOCTBaseHPByClassEntry> sGtOCTBaseHPByClassStore;
|
||||
extern DBCStorage <GtOCTBaseMPByClassEntry> sGtOCTBaseMPByClassStore;
|
||||
extern DBCStorage <HolidaysEntry> sHolidaysStore;
|
||||
extern DBCStorage <ItemArmorQualityEntry> sItemArmorQualityStore;
|
||||
extern DBCStorage <ItemArmorShieldEntry> sItemArmorShieldStore;
|
||||
extern DBCStorage <ItemArmorTotalEntry> sItemArmorTotalStore;
|
||||
extern DBCStorage <ItemBagFamilyEntry> sItemBagFamilyStore;
|
||||
extern DBCStorage <ItemClassEntry> sItemClassStore;
|
||||
extern DBCStorage <ItemDamageEntry> sItemDamageAmmoStore;
|
||||
extern DBCStorage <ItemDamageEntry> sItemDamageOneHandStore;
|
||||
extern DBCStorage <ItemDamageEntry> sItemDamageOneHandCasterStore;
|
||||
extern DBCStorage <ItemDamageEntry> sItemDamageRangedStore;
|
||||
extern DBCStorage <ItemDamageEntry> sItemDamageThrownStore;
|
||||
extern DBCStorage <ItemDamageEntry> sItemDamageTwoHandStore;
|
||||
extern DBCStorage <ItemDamageEntry> sItemDamageTwoHandCasterStore;
|
||||
extern DBCStorage <ItemDamageEntry> sItemDamageWandStore;
|
||||
// extern DBCStorage <ItemDisplayInfoEntry> sItemDisplayInfoStore; -- not used currently
|
||||
extern DBCStorage <ItemLimitCategoryEntry> sItemLimitCategoryStore;
|
||||
extern DBCStorage <ItemRandomPropertiesEntry> sItemRandomPropertiesStore;
|
||||
extern DBCStorage <ItemRandomSuffixEntry> sItemRandomSuffixStore;
|
||||
extern DBCStorage <ItemReforgeEntry> sItemReforgeStore;
|
||||
extern DBCStorage <ItemSetEntry> sItemSetStore;
|
||||
extern DBCStorage <LiquidTypeEntry> sLiquidTypeStore;
|
||||
extern DBCStorage <LockEntry> sLockStore;
|
||||
extern DBCStorage <MailTemplateEntry> sMailTemplateStore;
|
||||
extern DBCStorage <MapEntry> sMapStore;
|
||||
// extern DBCStorage <MapDifficultyEntry> sMapDifficultyStore; -- use GetMapDifficultyData insteed
|
||||
extern MapDifficultyMap sMapDifficultyMap;
|
||||
extern DBCStorage <MovieEntry> sMovieStore;
|
||||
extern DBCStorage <MountCapabilityEntry> sMountCapabilityStore;
|
||||
extern DBCStorage <MountTypeEntry> sMountTypeStore;
|
||||
extern DBCStorage <NumTalentsAtLevelEntry> sNumTalentsAtLevelStore;
|
||||
extern DBCStorage <OverrideSpellDataEntry> sOverrideSpellDataStore;
|
||||
extern DBCStorage <QuestFactionRewardEntry> sQuestFactionRewardStore;
|
||||
extern DBCStorage <QuestSortEntry> sQuestSortStore;
|
||||
extern DBCStorage <QuestXPLevel> sQuestXPLevelStore;
|
||||
extern DBCStorage <PhaseEntry> sPhaseStore;
|
||||
// extern DBCStorage <PvPDifficultyEntry> sPvPDifficultyStore; -- use GetBattlegroundSlotByLevel for access
|
||||
extern DBCStorage <RandomPropertiesPointsEntry> sRandomPropertiesPointsStore;
|
||||
extern DBCStorage <ScalingStatDistributionEntry> sScalingStatDistributionStore;
|
||||
extern DBCStorage <ScalingStatValuesEntry> sScalingStatValuesStore;
|
||||
extern DBCStorage <SkillLineEntry> sSkillLineStore;
|
||||
extern DBCStorage <SkillLineAbilityEntry> sSkillLineAbilityStore;
|
||||
extern DBCStorage <SkillRaceClassInfoEntry> sSkillRaceClassInfoStore;
|
||||
extern DBCStorage <SoundEntriesEntry> sSoundEntriesStore;
|
||||
extern DBCStorage <SpellCastTimesEntry> sSpellCastTimesStore;
|
||||
extern DBCStorage <SpellDifficultyEntry> sSpellDifficultyStore;
|
||||
extern DBCStorage <SpellDurationEntry> sSpellDurationStore;
|
||||
extern DBCStorage <SpellFocusObjectEntry> sSpellFocusObjectStore;
|
||||
extern DBCStorage <SpellItemEnchantmentEntry> sSpellItemEnchantmentStore;
|
||||
extern DBCStorage <SpellItemEnchantmentConditionEntry> sSpellItemEnchantmentConditionStore;
|
||||
extern SpellCategoryStore sSpellCategoryStore;
|
||||
extern PetFamilySpellsStore sPetFamilySpellsStore;
|
||||
extern DBCStorage <SpellRadiusEntry> sSpellRadiusStore;
|
||||
extern DBCStorage <SpellRangeEntry> sSpellRangeStore;
|
||||
extern DBCStorage <SpellRuneCostEntry> sSpellRuneCostStore;
|
||||
extern DBCStorage <SpellShapeshiftFormEntry> sSpellShapeshiftFormStore;
|
||||
extern DBCStorage <SpellEntry> sSpellStore;
|
||||
extern DBCStorage <SpellAuraOptionsEntry> sSpellAuraOptionsStore;
|
||||
extern DBCStorage <SpellAuraRestrictionsEntry> sSpellAuraRestrictionsStore;
|
||||
extern DBCStorage <SpellCastingRequirementsEntry> sSpellCastingRequirementsStore;
|
||||
extern DBCStorage <SpellCategoriesEntry> sSpellCategoriesStore;
|
||||
extern DBCStorage <SpellClassOptionsEntry> sSpellClassOptionsStore;
|
||||
extern DBCStorage <SpellCooldownsEntry> sSpellCooldownsStore;
|
||||
extern DBCStorage <SpellEffectEntry> sSpellEffectStore;
|
||||
extern DBCStorage <SpellEquippedItemsEntry> sSpellEquippedItemsStore;
|
||||
extern DBCStorage <SpellInterruptsEntry> sSpellInterruptsStore;
|
||||
extern DBCStorage <SpellLevelsEntry> sSpellLevelsStore;
|
||||
extern DBCStorage <SpellPowerEntry> sSpellPowerStore;
|
||||
extern DBCStorage <SpellReagentsEntry> sSpellReagentsStore;
|
||||
extern DBCStorage <SpellScalingEntry> sSpellScalingStore;
|
||||
extern DBCStorage <SpellShapeshiftEntry> sSpellShapeshiftStore;
|
||||
extern DBCStorage <SpellTargetRestrictionsEntry> sSpellTargetRestrictionsStore;
|
||||
extern DBCStorage <SpellTotemsEntry> sSpellTotemsStore;
|
||||
//extern DBCStorage <StableSlotPricesEntry> sStableSlotPricesStore;
|
||||
extern DBCStorage <SummonPropertiesEntry> sSummonPropertiesStore;
|
||||
extern DBCStorage <TalentEntry> sTalentStore;
|
||||
extern DBCStorage <TalentTabEntry> sTalentTabStore;
|
||||
extern DBCStorage <TaxiNodesEntry> sTaxiNodesStore;
|
||||
extern DBCStorage <TaxiPathEntry> sTaxiPathStore;
|
||||
extern TaxiMask sTaxiNodesMask;
|
||||
extern TaxiMask sOldContinentsNodesMask;
|
||||
extern TaxiMask sHordeTaxiNodesMask;
|
||||
extern TaxiMask sAllianceTaxiNodesMask;
|
||||
extern TaxiMask sDeathKnightTaxiNodesMask;
|
||||
extern TaxiPathSetBySource sTaxiPathSetBySource;
|
||||
extern TaxiPathNodesByPath sTaxiPathNodesByPath;
|
||||
extern DBCStorage <TotemCategoryEntry> sTotemCategoryStore;
|
||||
extern TransportAnimationsByEntry sTransportAnimationsByEntry;
|
||||
extern DBCStorage <TransportAnimationEntry> sTransportAnimationStore;
|
||||
extern DBCStorage <VehicleEntry> sVehicleStore;
|
||||
extern DBCStorage <VehicleSeatEntry> sVehicleSeatStore;
|
||||
extern DBCStorage <WMOAreaTableEntry> sWMOAreaTableStore;
|
||||
// extern DBCStorage <WorldMapAreaEntry> sWorldMapAreaStore; -- use Zone2MapCoordinates and Map2ZoneCoordinates
|
||||
extern DBCStorage <WorldMapOverlayEntry> sWorldMapOverlayStore;
|
||||
extern DBCStorage <WorldSafeLocsEntry> sWorldSafeLocsStore;
|
||||
extern DBCStorage <WorldPvPAreaEntry> sWorldPvPAreaStore;
|
||||
|
||||
void LoadDBCStores(const std::string& dataPath);
|
||||
|
||||
// script support functions
|
||||
MANGOS_DLL_SPEC DBCStorage <SoundEntriesEntry> const* GetSoundEntriesStore();
|
||||
MANGOS_DLL_SPEC DBCStorage <SpellEntry> const* GetSpellStore();
|
||||
MANGOS_DLL_SPEC DBCStorage <SpellRangeEntry> const* GetSpellRangeStore();
|
||||
MANGOS_DLL_SPEC DBCStorage <FactionEntry> const* GetFactionStore();
|
||||
MANGOS_DLL_SPEC DBCStorage <CreatureDisplayInfoEntry> const* GetCreatureDisplayStore();
|
||||
MANGOS_DLL_SPEC DBCStorage <EmotesEntry> const* GetEmotesStore();
|
||||
MANGOS_DLL_SPEC DBCStorage <EmotesTextEntry> const* GetEmotesTextStore();
|
||||
|
||||
#endif
|
||||
2553
src/game/Server/DBCStructure.h
Normal file
2553
src/game/Server/DBCStructure.h
Normal file
File diff suppressed because it is too large
Load diff
160
src/game/Server/DBCfmt.h
Normal file
160
src/game/Server/DBCfmt.h
Normal file
|
|
@ -0,0 +1,160 @@
|
|||
/**
|
||||
* MaNGOS is a full featured server for World of Warcraft, supporting
|
||||
* the following clients: 1.12.x, 2.4.3, 3.3.5a, 4.3.4a and 5.4.8
|
||||
*
|
||||
* Copyright (C) 2005-2014 MaNGOS project <http://getmangos.eu>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* World of Warcraft, and all World of Warcraft or Warcraft art, images,
|
||||
* and lore are copyrighted by Blizzard Entertainment, Inc.
|
||||
*/
|
||||
|
||||
#ifndef MANGOS_DBCSFRM_H
|
||||
#define MANGOS_DBCSFRM_H
|
||||
|
||||
const char Achievementfmt[]="niiissiiiiisii";
|
||||
const char AchievementCriteriafmt[]="niiiiiiiixsiiiiixxxxxxx";
|
||||
const char AreaTableEntryfmt[]="iiinixxxxxisiiiiixxxxxxxxx";
|
||||
const char AreaGroupEntryfmt[] = "niiiiiii";
|
||||
const char AreaTriggerEntryfmt[]="nifffxxxfffff";
|
||||
const char ArmorLocationfmt[]="nfffff";
|
||||
const char AuctionHouseEntryfmt[]="niiix";
|
||||
const char BankBagSlotPricesEntryfmt[] = "ni";
|
||||
const char BarberShopStyleEntryfmt[]="nixxxiii";
|
||||
const char BattlemasterListEntryfmt[]="niiiiiiiiixsiiiiiiii";
|
||||
const char CharStartOutfitEntryfmt[]="diiiiiiiiiiiiiiiiiiiiiiiiixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
|
||||
const char CharTitlesEntryfmt[]="nxsxix";
|
||||
const char ChatChannelsEntryfmt[]="iixsx";
|
||||
// ChatChannelsEntryfmt, index not used (more compact store)
|
||||
const char ChrClassesEntryfmt[]="nixsxxxixiiiii";
|
||||
const char ChrRacesEntryfmt[]="nxixiixixxxxixsxxxxxixxx";
|
||||
const char ChrClassesXPowerTypesfmt[]="nii";
|
||||
const char CinematicSequencesEntryfmt[] = "nxxxxxxxxx";
|
||||
const char CreatureDisplayInfofmt[]="nxxifxxxxxxxxxxxx";
|
||||
const char CreatureDisplayInfoExtrafmt[] = "nixxxxxxxxxxxxxxxxxxx";
|
||||
const char CreatureFamilyfmt[]="nfifiiiiixsx";
|
||||
const char CreatureSpellDatafmt[] = "niiiixxxx";
|
||||
const char DestructibleModelDataFmt[] = "nixxxixxxxixxxxixxxxxxxx";
|
||||
const char DungeonEncounterfmt[]="niiiisxx";
|
||||
const char CreatureTypefmt[]="nxx";
|
||||
const char CurrencyTypesfmt[]="nisxxxxiiix";
|
||||
const char DurabilityCostsfmt[] = "niiiiiiiiiiiiiiiiiiiiiiiiiiiii";
|
||||
const char DurabilityQualityfmt[] = "nf";
|
||||
const char EmotesEntryfmt[]="nxxiiixx";
|
||||
const char EmotesTextEntryfmt[] = "nxixxxxxxxxxxxxxxxx";
|
||||
const char FactionEntryfmt[]="niiiiiiiiiiiiiiiiiiffixsxx";
|
||||
const char FactionTemplateEntryfmt[] = "niiiiiiiiiiiii";
|
||||
const char GameObjectDisplayInfofmt[]="nsxxxxxxxxxxffffffxxx";
|
||||
const char GemPropertiesEntryfmt[]="nixxix";
|
||||
const char GlyphPropertiesfmt[] = "niii";
|
||||
const char GlyphSlotfmt[] = "nii";
|
||||
const char GtBarberShopCostBasefmt[]="xf";
|
||||
const char GtCombatRatingsfmt[]="xf";
|
||||
const char GtChanceToMeleeCritBasefmt[]="xf";
|
||||
const char GtChanceToMeleeCritfmt[]="xf";
|
||||
const char GtChanceToSpellCritBasefmt[]="xf";
|
||||
const char GtChanceToSpellCritfmt[]="xf";
|
||||
const char GtOCTClassCombatRatingScalarfmt[] = "df";
|
||||
|
||||
const char GtOCTHpPerStaminafmt[]="df";
|
||||
const char GtOCTRegenHPfmt[]="xf";
|
||||
const char GtRegenHPPerSptfmt[]="xf";
|
||||
const char GtRegenMPPerSptfmt[]="xf";
|
||||
const char GtSpellScalingfmt[]="df";
|
||||
const char GtOCTBaseHPByClassfmt[]="df";
|
||||
const char GtOCTBaseMPByClassfmt[]="df";
|
||||
const char Holidaysfmt[] = "nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
|
||||
const char ItemClassfmt[]="nixxfs";
|
||||
const char ItemArmorQualityfmt[]="nfffffffi";
|
||||
const char ItemArmorShieldfmt[]="nifffffff";
|
||||
const char ItemArmorTotalfmt[]="niffff";
|
||||
const char ItemBagFamilyfmt[]="nx";
|
||||
// const char ItemDisplayTemplateEntryfmt[]="nxxxxxxxxxxixxxxxxxxxxx";
|
||||
// const char ItemCondExtCostsEntryfmt[]="xiii";
|
||||
const char ItemDamagefmt[]="nfffffffi";
|
||||
const char ItemLimitCategoryEntryfmt[]="nxii";
|
||||
const char ItemRandomPropertiesfmt[]="nxiiiiis";
|
||||
const char ItemRandomSuffixfmt[]="nsxiiiiiiiiii";
|
||||
const char ItemReforgefmt[]="nifif";
|
||||
const char ItemSetEntryfmt[]="dsxxxxxxxxxxxxxxxxxiiiiiiiiiiiiiiiiii";
|
||||
const char LiquidTypefmt[] = "nxxixixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
|
||||
const char LockEntryfmt[] = "niiiiiiiiiiiiiiiiiiiiiiiixxxxxxxx";
|
||||
const char MailTemplateEntryfmt[]="nxs";
|
||||
const char MapEntryfmt[]="nsiiiisissififfiiiii";
|
||||
const char MapDifficultyEntryfmt[]="niisiis";
|
||||
const char MovieEntryfmt[]="nxxx";
|
||||
const char MountCapabilityfmt[]="niiiiiii";
|
||||
const char MountTypefmt[]="niiiiiiiiiiiiiiiiiiiiiiii";
|
||||
const char NumTalentsAtLevelfmt[]="df";
|
||||
const char OverrideSpellDatafmt[]="niiiiiiiiiixx";
|
||||
const char QuestFactionRewardfmt[] = "niiiiiiiiii";
|
||||
const char QuestSortEntryfmt[]="nx";
|
||||
const char QuestXPLevelfmt[] = "niiiiiiiiii";
|
||||
const char Phasefmt[]="nii";
|
||||
const char PvPDifficultyfmt[] = "diiiii";
|
||||
const char RandomPropertiesPointsfmt[] = "niiiiiiiiiiiiiii";
|
||||
const char ScalingStatDistributionfmt[]="niiiiiiiiiiiiiiiiiiiixi";
|
||||
const char ScalingStatValuesfmt[]="iniiiiiiiiiiiiiiiiiiiixxxxxxxxxxxxxxxxxxxxxxxxx";
|
||||
const char SkillLinefmt[]="nisxixi";
|
||||
const char SkillLineAbilityfmt[] = "niiiixxiiiiixx";
|
||||
const char SkillRaceClassInfofmt[]="diiiiixxx";
|
||||
const char SoundEntriesfmt[]="nissssssssssssssssssssssxxxxxxxxxxx";
|
||||
const char SpellCastTimefmt[]="niii";
|
||||
const char SpellDurationfmt[] = "niii";
|
||||
const char SpellDifficultyfmt[] = "niiii";
|
||||
const char SpellEntryfmt[]="niiiiiiiiiiiiiiifiiiissxxiixxixiiiiiiixiiiiiiiix";
|
||||
const char SpellAuraOptionsEntryfmt[]="diiii";
|
||||
const char SpellAuraRestrictionsEntryfmt[]="diiiiiiii";
|
||||
const char SpellCastingRequirementsEntryfmt[]="dixxixi";
|
||||
const char SpellCategoriesEntryfmt[]="diiiiii";
|
||||
const char SpellClassOptionsEntryfmt[]="dxiiiix";
|
||||
const char SpellCooldownsEntryfmt[]="diii";
|
||||
const char SpellEffectEntryfmt[]="difiiixfiiiiiifiifiiiiiiiix";
|
||||
const char SpellEquippedItemsEntryfmt[]="diii";
|
||||
const char SpellInterruptsEntryfmt[]="dixixi";
|
||||
const char SpellLevelsEntryfmt[]="diii";
|
||||
const char SpellPowerEntryfmt[]="diiiixxx";
|
||||
const char SpellReagentsEntryfmt[]="diiiiiiiiiiiiiiii";
|
||||
const char SpellScalingEntryfmt[]="diiiiffffffffffi";
|
||||
const char SpellShapeshiftEntryfmt[]="dixixx";
|
||||
const char SpellTargetRestrictionsEntryfmt[]="dfiiii";
|
||||
const char SpellTotemsEntryfmt[]="diiii";
|
||||
const char SpellFocusObjectfmt[]="nx";
|
||||
const char SpellItemEnchantmentfmt[]="nxiiiiiixxxiiisiiiixxxx";
|
||||
const char SpellItemEnchantmentConditionfmt[] = "nbbbbbxxxxxbbbbbbbbbbiiiiiXXXXX";
|
||||
const char SpellRadiusfmt[] = "nfxx";
|
||||
const char SpellRangefmt[]="nffffxxx";
|
||||
const char SpellRuneCostfmt[] = "niiii";
|
||||
const char SpellShapeshiftFormfmt[]="nxxiixiiixxiiiiiiiixx";
|
||||
//const char StableSlotPricesfmt[] = "ni"; // removed
|
||||
const char SummonPropertiesfmt[] = "niiiii";
|
||||
const char TalentEntryfmt[]="niiiiiiiiixxixxxxxx";
|
||||
const char TalentTabEntryfmt[]="nxxiiixxiii";
|
||||
const char TalentTreePrimarySpellsfmt[]="diix";
|
||||
const char TaxiNodesEntryfmt[]="nifffsiixxx";
|
||||
const char TaxiPathEntryfmt[] = "niii";
|
||||
const char TaxiPathNodeEntryfmt[] = "diiifffiiii";
|
||||
const char TotemCategoryEntryfmt[]="nxii";
|
||||
const char TransportAnimationEntryfmt[]="diixxxx";
|
||||
const char VehicleEntryfmt[]="niffffiiiiiiiifffffffffffffffssssfifiixx";
|
||||
const char VehicleSeatEntryfmt[]="niiffffffffffiiiiiifffffffiiifffiiiiiiiffiiiiixxxxxxxxxxxxxxxxxxxx";
|
||||
const char WMOAreaTableEntryfmt[]="niiixxxxxiixxxx";
|
||||
const char WorldMapAreaEntryfmt[]="xinxffffixxxxx";
|
||||
const char WorldMapOverlayEntryfmt[]="nxiiiixxxxxxxxx";
|
||||
const char WorldSafeLocsEntryfmt[]="nifffx";
|
||||
const char WorldPvPAreaEnrtyfmt[]="niiiiii";
|
||||
|
||||
#endif
|
||||
1422
src/game/Server/Opcodes.cpp
Normal file
1422
src/game/Server/Opcodes.cpp
Normal file
File diff suppressed because it is too large
Load diff
1482
src/game/Server/Opcodes.h
Normal file
1482
src/game/Server/Opcodes.h
Normal file
File diff suppressed because it is too large
Load diff
66
src/game/Server/SQLStorages.cpp
Normal file
66
src/game/Server/SQLStorages.cpp
Normal file
|
|
@ -0,0 +1,66 @@
|
|||
/**
|
||||
* MaNGOS is a full featured server for World of Warcraft, supporting
|
||||
* the following clients: 1.12.x, 2.4.3, 3.3.5a, 4.3.4a and 5.4.8
|
||||
*
|
||||
* Copyright (C) 2005-2014 MaNGOS project <http://getmangos.eu>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* World of Warcraft, and all World of Warcraft or Warcraft art, images,
|
||||
* and lore are copyrighted by Blizzard Entertainment, Inc.
|
||||
*/
|
||||
|
||||
#include "SQLStorages.h"
|
||||
|
||||
const char CreatureInfosrcfmt[] = "iiiiiiiiiisssiiiiiiiiiiifffiffiifiiiiiiiiiiiffiiiiiiiiiiiiiiisiiffliiiiiiiliiiiiis";
|
||||
const char CreatureInfodstfmt[] = "iiiiiiiiiisssiiiiiiiiiiifffiffiifiiiiiiiiiiiffiiiiiiiiiiiiiiisiiffliiiiiiiliiiiiii";
|
||||
const char CreatureDataAddonInfofmt[] = "iiibbiis";
|
||||
const char CreatureModelfmt[] = "iffbii";
|
||||
const char CreatureInfoAddonInfofmt[] = "iiibbiis";
|
||||
const char GameObjectInfoAddonInfofmt[] = "iffff";
|
||||
const char EquipmentInfofmt[] = "iiii";
|
||||
const char GameObjectInfosrcfmt[] = "iiissssiifiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiis";
|
||||
const char GameObjectInfodstfmt[] = "iiissssiifiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii";
|
||||
const char ItemPrototypesrcfmt[] = "iiiisiiiiffiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiifiiifiiiiiifiiiiiifiiiiiifiiiiiifiiiisiiiiiiiiiiiiiiiiiiiiiiiifiiisiifiiiii";
|
||||
const char ItemPrototypedstfmt[] = "iiiisiiiiffiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiifiiifiiiiiifiiiiiifiiiiiifiiiiiifiiiisiiiiiiiiiiiiiiiiiiiiiiiifiiiiiifiiiii";
|
||||
const char PageTextfmt[] = "isi";
|
||||
const char InstanceTemplatesrcfmt[] = "iiiis";
|
||||
const char InstanceTemplatedstfmt[] = "iiiii";
|
||||
const char WorldTemplatesrcfmt[] = "is";
|
||||
const char WorldTemplatedstfmt[] = "ii";
|
||||
const char ConditionsSrcFmt[] = "iiii";
|
||||
const char ConditionsDstFmt[] = "iiii";
|
||||
const char VehicleAccessorySrcFmt[] = "iiix";
|
||||
const char VehicleAccessoryDstFmt[] = "iii";
|
||||
const char CreatureTemplateSpellsFmt[] = "iiiiiiiiiii";
|
||||
const char SpellScriptTargetFmt[] = "iiii";
|
||||
|
||||
SQLStorage sCreatureStorage(CreatureInfosrcfmt, CreatureInfodstfmt, "entry", "creature_template");
|
||||
SQLStorage sCreatureDataAddonStorage(CreatureDataAddonInfofmt, "guid", "creature_addon");
|
||||
SQLStorage sCreatureModelStorage(CreatureModelfmt, "modelid", "creature_model_info");
|
||||
SQLStorage sCreatureInfoAddonStorage(CreatureInfoAddonInfofmt, "entry", "creature_template_addon");
|
||||
SQLStorage sEquipmentStorage(EquipmentInfofmt, "entry", "creature_equip_template");
|
||||
SQLStorage sItemStorage(ItemPrototypesrcfmt, ItemPrototypedstfmt, "entry", "item_template");
|
||||
SQLStorage sPageTextStore(PageTextfmt, "entry", "page_text");
|
||||
SQLStorage sInstanceTemplate(InstanceTemplatesrcfmt, InstanceTemplatedstfmt, "map", "instance_template");
|
||||
SQLStorage sWorldTemplate(WorldTemplatesrcfmt, WorldTemplatedstfmt, "map", "world_template");
|
||||
SQLStorage sConditionStorage(ConditionsSrcFmt, ConditionsDstFmt, "condition_entry", "conditions");
|
||||
|
||||
SQLHashStorage sGameObjectDataAddonStorage(GameObjectInfoAddonInfofmt, "guid", "gameobject_addon");
|
||||
SQLHashStorage sGOStorage(GameObjectInfosrcfmt, GameObjectInfodstfmt, "entry", "gameobject_template");
|
||||
SQLHashStorage sCreatureTemplateSpellsStorage(CreatureTemplateSpellsFmt, "entry", "creature_template_spells");
|
||||
|
||||
SQLMultiStorage sVehicleAccessoryStorage(VehicleAccessorySrcFmt, VehicleAccessoryDstFmt, "vehicle_entry", "vehicle_accessory");
|
||||
SQLMultiStorage sSpellScriptTargetStorage(SpellScriptTargetFmt, "entry", "spell_script_target");
|
||||
49
src/game/Server/SQLStorages.h
Normal file
49
src/game/Server/SQLStorages.h
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
/**
|
||||
* MaNGOS is a full featured server for World of Warcraft, supporting
|
||||
* the following clients: 1.12.x, 2.4.3, 3.3.5a, 4.3.4a and 5.4.8
|
||||
*
|
||||
* Copyright (C) 2005-2014 MaNGOS project <http://getmangos.eu>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* World of Warcraft, and all World of Warcraft or Warcraft art, images,
|
||||
* and lore are copyrighted by Blizzard Entertainment, Inc.
|
||||
*/
|
||||
|
||||
#ifndef MANGOS_SQLSTORAGES_H
|
||||
#define MANGOS_SQLSTORAGES_H
|
||||
|
||||
#include "Common.h"
|
||||
#include "Database/SQLStorage.h"
|
||||
|
||||
extern SQLStorage sCreatureStorage;
|
||||
extern SQLStorage sCreatureDataAddonStorage;
|
||||
extern SQLStorage sCreatureInfoAddonStorage;
|
||||
extern SQLStorage sCreatureModelStorage;
|
||||
extern SQLStorage sEquipmentStorage;
|
||||
extern SQLStorage sPageTextStore;
|
||||
extern SQLStorage sItemStorage;
|
||||
extern SQLStorage sInstanceTemplate;
|
||||
extern SQLStorage sWorldTemplate;
|
||||
extern SQLStorage sConditionStorage;
|
||||
|
||||
extern SQLHashStorage sGOStorage;
|
||||
extern SQLHashStorage sGameObjectDataAddonStorage;
|
||||
extern SQLHashStorage sCreatureTemplateSpellsStorage;
|
||||
|
||||
extern SQLMultiStorage sVehicleAccessoryStorage;
|
||||
extern SQLMultiStorage sSpellScriptTargetStorage;
|
||||
|
||||
#endif
|
||||
3317
src/game/Server/SharedDefines.h
Normal file
3317
src/game/Server/SharedDefines.h
Normal file
File diff suppressed because it is too large
Load diff
1037
src/game/Server/WorldSession.cpp
Normal file
1037
src/game/Server/WorldSession.cpp
Normal file
File diff suppressed because it is too large
Load diff
940
src/game/Server/WorldSession.h
Normal file
940
src/game/Server/WorldSession.h
Normal file
|
|
@ -0,0 +1,940 @@
|
|||
/**
|
||||
* MaNGOS is a full featured server for World of Warcraft, supporting
|
||||
* the following clients: 1.12.x, 2.4.3, 3.3.5a, 4.3.4a and 5.4.8
|
||||
*
|
||||
* Copyright (C) 2005-2014 MaNGOS project <http://getmangos.eu>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* World of Warcraft, and all World of Warcraft or Warcraft art, images,
|
||||
* and lore are copyrighted by Blizzard Entertainment, Inc.
|
||||
*/
|
||||
|
||||
/// \addtogroup u2w
|
||||
/// @{
|
||||
/// \file
|
||||
|
||||
#ifndef __WORLDSESSION_H
|
||||
#define __WORLDSESSION_H
|
||||
|
||||
#include "Common.h"
|
||||
#include "SharedDefines.h"
|
||||
#include "ObjectGuid.h"
|
||||
#include "AuctionHouseMgr.h"
|
||||
#include "Item.h"
|
||||
|
||||
struct ItemPrototype;
|
||||
struct AuctionEntry;
|
||||
struct AuctionHouseEntry;
|
||||
struct DeclinedName;
|
||||
|
||||
class ObjectGuid;
|
||||
class Creature;
|
||||
class Item;
|
||||
class Object;
|
||||
class Player;
|
||||
class Unit;
|
||||
class WorldPacket;
|
||||
class WorldSocket;
|
||||
class QueryResult;
|
||||
class LoginQueryHolder;
|
||||
class CharacterHandler;
|
||||
class GMTicket;
|
||||
class MovementInfo;
|
||||
class WorldSession;
|
||||
|
||||
struct OpcodeHandler;
|
||||
|
||||
enum AccountDataType
|
||||
{
|
||||
GLOBAL_CONFIG_CACHE = 0, // 0x01 g
|
||||
PER_CHARACTER_CONFIG_CACHE = 1, // 0x02 p
|
||||
GLOBAL_BINDINGS_CACHE = 2, // 0x04 g
|
||||
PER_CHARACTER_BINDINGS_CACHE = 3, // 0x08 p
|
||||
GLOBAL_MACROS_CACHE = 4, // 0x10 g
|
||||
PER_CHARACTER_MACROS_CACHE = 5, // 0x20 p
|
||||
PER_CHARACTER_LAYOUT_CACHE = 6, // 0x40 p
|
||||
PER_CHARACTER_CHAT_CACHE = 7, // 0x80 p
|
||||
NUM_ACCOUNT_DATA_TYPES = 8
|
||||
};
|
||||
|
||||
#define GLOBAL_CACHE_MASK 0x15
|
||||
#define PER_CHARACTER_CACHE_MASK 0xEA
|
||||
|
||||
#define DB2_REPLY_ITEM 1344507586
|
||||
#define DB2_REPLY_SPARSE 2442913102
|
||||
|
||||
struct AccountData
|
||||
{
|
||||
AccountData() : Time(0), Data("") {}
|
||||
|
||||
time_t Time;
|
||||
std::string Data;
|
||||
};
|
||||
|
||||
struct AddonInfo
|
||||
{
|
||||
AddonInfo(const std::string& name, uint8 enabled, uint32 crc) :
|
||||
Name(name),
|
||||
Enabled(enabled),
|
||||
CRC(crc)
|
||||
{
|
||||
}
|
||||
|
||||
std::string Name;
|
||||
uint8 Enabled;
|
||||
uint32 CRC;
|
||||
};
|
||||
|
||||
typedef std::list<AddonInfo> AddonsList;
|
||||
|
||||
enum PartyOperation
|
||||
{
|
||||
PARTY_OP_INVITE = 0,
|
||||
PARTY_OP_LEAVE = 2,
|
||||
PARTY_OP_SWAP = 4
|
||||
};
|
||||
|
||||
enum PartyResult
|
||||
{
|
||||
ERR_PARTY_RESULT_OK = 0,
|
||||
ERR_BAD_PLAYER_NAME_S = 1,
|
||||
ERR_TARGET_NOT_IN_GROUP_S = 2,
|
||||
ERR_TARGET_NOT_IN_INSTANCE_S = 3,
|
||||
ERR_GROUP_FULL = 4,
|
||||
ERR_ALREADY_IN_GROUP_S = 5,
|
||||
ERR_NOT_IN_GROUP = 6,
|
||||
ERR_NOT_LEADER = 7,
|
||||
ERR_PLAYER_WRONG_FACTION = 8,
|
||||
ERR_IGNORING_YOU_S = 9,
|
||||
ERR_LFG_PENDING = 12,
|
||||
ERR_INVITE_RESTRICTED = 13,
|
||||
ERR_GROUP_SWAP_FAILED = 14, // if (PartyOperation == PARTY_OP_SWAP) ERR_GROUP_SWAP_FAILED else ERR_INVITE_IN_COMBAT
|
||||
ERR_INVITE_UNKNOWN_REALM = 15,
|
||||
ERR_INVITE_NO_PARTY_SERVER = 16,
|
||||
ERR_INVITE_PARTY_BUSY = 17,
|
||||
ERR_PARTY_TARGET_AMBIGUOUS = 18,
|
||||
ERR_PARTY_LFG_INVITE_RAID_LOCKED = 19,
|
||||
ERR_PARTY_LFG_BOOT_LIMIT = 20,
|
||||
ERR_PARTY_LFG_BOOT_COOLDOWN_S = 21,
|
||||
ERR_PARTY_LFG_BOOT_IN_PROGRESS = 22,
|
||||
ERR_PARTY_LFG_BOOT_TOO_FEW_PLAYERS = 23,
|
||||
ERR_PARTY_LFG_BOOT_NOT_ELIGIBLE_S = 24,
|
||||
ERR_RAID_DISALLOWED_BY_LEVEL = 25,
|
||||
ERR_PARTY_LFG_BOOT_IN_COMBAT = 26,
|
||||
ERR_VOTE_KICK_REASON_NEEDED = 27,
|
||||
ERR_PARTY_LFG_BOOT_DUNGEON_COMPLETE = 28,
|
||||
ERR_PARTY_LFG_BOOT_LOOT_ROLLS = 29,
|
||||
ERR_PARTY_LFG_TELEPORT_IN_COMBAT = 30
|
||||
};
|
||||
|
||||
enum LfgJoinResult
|
||||
{
|
||||
ERR_LFG_OK = 0x00,
|
||||
ERR_LFG_ROLE_CHECK_FAILED = 0x01,
|
||||
ERR_LFG_GROUP_FULL = 0x02,
|
||||
ERR_LFG_NO_LFG_OBJECT = 0x04,
|
||||
ERR_LFG_NO_SLOTS_PLAYER = 0x05,
|
||||
ERR_LFG_NO_SLOTS_PARTY = 0x06,
|
||||
ERR_LFG_MISMATCHED_SLOTS = 0x07,
|
||||
ERR_LFG_PARTY_PLAYERS_FROM_DIFFERENT_REALMS = 0x08,
|
||||
ERR_LFG_MEMBERS_NOT_PRESENT = 0x09,
|
||||
ERR_LFG_GET_INFO_TIMEOUT = 0x0A,
|
||||
ERR_LFG_INVALID_SLOT = 0x0B,
|
||||
ERR_LFG_DESERTER_PLAYER = 0x0C,
|
||||
ERR_LFG_DESERTER_PARTY = 0x0D,
|
||||
ERR_LFG_RANDOM_COOLDOWN_PLAYER = 0x0E,
|
||||
ERR_LFG_RANDOM_COOLDOWN_PARTY = 0x0F,
|
||||
ERR_LFG_TOO_MANY_MEMBERS = 0x10,
|
||||
ERR_LFG_CANT_USE_DUNGEONS = 0x11,
|
||||
ERR_LFG_ROLE_CHECK_FAILED2 = 0x12,
|
||||
};
|
||||
|
||||
enum LfgUpdateType
|
||||
{
|
||||
LFG_UPDATE_JOIN = 5,
|
||||
LFG_UPDATE_LEAVE = 7,
|
||||
};
|
||||
|
||||
enum LfgType
|
||||
{
|
||||
LFG_TYPE_NONE = 0,
|
||||
LFG_TYPE_DUNGEON = 1,
|
||||
LFG_TYPE_RAID = 2,
|
||||
LFG_TYPE_QUEST = 3,
|
||||
LFG_TYPE_ZONE = 4,
|
||||
LFG_TYPE_HEROIC_DUNGEON = 5,
|
||||
LFG_TYPE_RANDOM_DUNGEON = 6
|
||||
};
|
||||
|
||||
enum ChatRestrictionType
|
||||
{
|
||||
ERR_CHAT_RESTRICTED = 0,
|
||||
ERR_CHAT_THROTTLED = 1,
|
||||
ERR_USER_SQUELCHED = 2,
|
||||
ERR_YELL_RESTRICTED = 3
|
||||
};
|
||||
|
||||
enum TutorialDataState
|
||||
{
|
||||
TUTORIALDATA_UNCHANGED = 0,
|
||||
TUTORIALDATA_CHANGED = 1,
|
||||
TUTORIALDATA_NEW = 2
|
||||
};
|
||||
|
||||
// class to deal with packet processing
|
||||
// allows to determine if next packet is safe to be processed
|
||||
class PacketFilter
|
||||
{
|
||||
public:
|
||||
explicit PacketFilter(WorldSession* pSession) : m_pSession(pSession) {}
|
||||
virtual ~PacketFilter() {}
|
||||
|
||||
virtual bool Process(WorldPacket* /*packet*/) { return true; }
|
||||
virtual bool ProcessLogout() const { return true; }
|
||||
|
||||
protected:
|
||||
WorldSession* const m_pSession;
|
||||
};
|
||||
|
||||
// process only thread-safe packets in Map::Update()
|
||||
class MapSessionFilter : public PacketFilter
|
||||
{
|
||||
public:
|
||||
explicit MapSessionFilter(WorldSession* pSession) : PacketFilter(pSession) {}
|
||||
~MapSessionFilter() {}
|
||||
|
||||
virtual bool Process(WorldPacket* packet) override;
|
||||
// in Map::Update() we do not process player logout!
|
||||
virtual bool ProcessLogout() const override { return false; }
|
||||
};
|
||||
|
||||
// class used to filer only thread-unsafe packets from queue
|
||||
// in order to update only be used in World::UpdateSessions()
|
||||
class WorldSessionFilter : public PacketFilter
|
||||
{
|
||||
public:
|
||||
explicit WorldSessionFilter(WorldSession* pSession) : PacketFilter(pSession) {}
|
||||
~WorldSessionFilter() {}
|
||||
|
||||
virtual bool Process(WorldPacket* packet) override;
|
||||
};
|
||||
|
||||
/// Player session in the World
|
||||
class MANGOS_DLL_SPEC WorldSession
|
||||
{
|
||||
friend class CharacterHandler;
|
||||
|
||||
public:
|
||||
WorldSession(uint32 id, WorldSocket* sock, AccountTypes sec, uint8 expansion, time_t mute_time, LocaleConstant locale);
|
||||
~WorldSession();
|
||||
|
||||
bool PlayerLoading() const { return m_playerLoading; }
|
||||
bool PlayerLogout() const { return m_playerLogout; }
|
||||
bool PlayerLogoutWithSave() const { return m_playerLogout && m_playerSave; }
|
||||
|
||||
void SizeError(WorldPacket const& packet, uint32 size) const;
|
||||
|
||||
void ReadAddonsInfo(ByteBuffer &data);
|
||||
void SendAddonsInfo();
|
||||
|
||||
void SendPacket(WorldPacket const* packet);
|
||||
void SendNotification(const char* format, ...) ATTR_PRINTF(2, 3);
|
||||
void SendNotification(int32 string_id, ...);
|
||||
void SendPetNameInvalid(uint32 error, const std::string& name, DeclinedName* declinedName);
|
||||
void SendLfgSearchResults(LfgType type, uint32 entry);
|
||||
void SendLfgJoinResult(LfgJoinResult result);
|
||||
void SendLfgUpdate(bool isGroup, LfgUpdateType updateType, uint32 id);
|
||||
void SendPartyResult(PartyOperation operation, const std::string& member, PartyResult res);
|
||||
void SendGroupInvite(Player* player, bool alreadyInGroup = false);
|
||||
void SendAreaTriggerMessage(const char* Text, ...) ATTR_PRINTF(2, 3);
|
||||
void SendTransferAborted(uint32 mapid, uint8 reason, uint8 arg = 0);
|
||||
void SendSetPhaseShift(std::set<uint32> const& phaseIds, std::set<uint32> const& terrainswaps);
|
||||
void SendQueryTimeResponse();
|
||||
void SendRedirectClient(std::string& ip, uint16 port);
|
||||
|
||||
AccountTypes GetSecurity() const { return _security; }
|
||||
uint32 GetAccountId() const { return _accountId; }
|
||||
Player* GetPlayer() const { return _player; }
|
||||
char const* GetPlayerName() const;
|
||||
void SetSecurity(AccountTypes security) { _security = security; }
|
||||
std::string const& GetRemoteAddress() { return m_Address; }
|
||||
void SetPlayer(Player* plr);
|
||||
uint8 Expansion() const { return m_expansion; }
|
||||
|
||||
/// Session in auth.queue currently
|
||||
void SetInQueue(bool state) { m_inQueue = state; }
|
||||
|
||||
/// Is the user engaged in a log out process?
|
||||
bool isLogingOut() const { return _logoutTime || m_playerLogout; }
|
||||
|
||||
/// Engage the logout process for the user
|
||||
void LogoutRequest(time_t requestTime)
|
||||
{
|
||||
_logoutTime = requestTime;
|
||||
}
|
||||
|
||||
/// Is logout cooldown expired?
|
||||
bool ShouldLogOut(time_t currTime) const
|
||||
{
|
||||
return (_logoutTime > 0 && currTime >= _logoutTime + 20);
|
||||
}
|
||||
|
||||
void LogoutPlayer(bool Save);
|
||||
void KickPlayer();
|
||||
|
||||
void QueuePacket(WorldPacket* new_packet);
|
||||
|
||||
bool Update(PacketFilter& updater);
|
||||
|
||||
/// Handle the authentication waiting queue (to be completed)
|
||||
void SendAuthWaitQue(uint32 position);
|
||||
|
||||
void SendNameQueryOpcode(Player* p);
|
||||
void SendNameQueryOpcodeFromDB(ObjectGuid guid);
|
||||
static void SendNameQueryOpcodeFromDBCallBack(QueryResult* result, uint32 accountId);
|
||||
|
||||
void SendTrainerList(ObjectGuid guid);
|
||||
void SendTrainerList(ObjectGuid guid, const std::string& strTitle);
|
||||
|
||||
void SendListInventory(ObjectGuid guid);
|
||||
bool CheckBanker(ObjectGuid guid);
|
||||
void SendShowBank(ObjectGuid guid);
|
||||
bool CheckMailBox(ObjectGuid guid);
|
||||
void SendShowMailBox(ObjectGuid guid);
|
||||
void SendTabardVendorActivate(ObjectGuid guid);
|
||||
void SendSpiritResurrect();
|
||||
void SendBindPoint(Creature* npc);
|
||||
void SendGMTicketGetTicket(uint32 status, GMTicket* ticket = NULL);
|
||||
void SendGMResponse(GMTicket* ticket);
|
||||
|
||||
void SendAttackStop(Unit const* enemy);
|
||||
|
||||
void SendBattlegGroundList(ObjectGuid guid, BattleGroundTypeId bgTypeId);
|
||||
|
||||
void SendTradeStatus(TradeStatus status);
|
||||
void SendUpdateTrade(bool trader_state = true);
|
||||
void SendCancelTrade();
|
||||
|
||||
void SendPetitionQueryOpcode(ObjectGuid petitionguid);
|
||||
|
||||
// pet
|
||||
void SendPetNameQuery(ObjectGuid guid, uint32 petnumber);
|
||||
void SendStablePet(ObjectGuid guid);
|
||||
void SendStableResult(uint8 res);
|
||||
bool CheckStableMaster(ObjectGuid guid);
|
||||
|
||||
// Account Data
|
||||
AccountData* GetAccountData(AccountDataType type) { return &m_accountData[type]; }
|
||||
void SetAccountData(AccountDataType type, time_t time_, std::string data);
|
||||
void SendAccountDataTimes(uint32 mask);
|
||||
void LoadGlobalAccountData();
|
||||
void LoadAccountData(QueryResult* result, uint32 mask);
|
||||
void LoadTutorialsData();
|
||||
void SendTutorialsData();
|
||||
void SaveTutorialsData();
|
||||
uint32 GetTutorialInt(uint32 intId)
|
||||
{
|
||||
return m_Tutorials[intId];
|
||||
}
|
||||
|
||||
void SetTutorialInt(uint32 intId, uint32 value)
|
||||
{
|
||||
if (m_Tutorials[intId] != value)
|
||||
{
|
||||
m_Tutorials[intId] = value;
|
||||
if (m_tutorialState == TUTORIALDATA_UNCHANGED)
|
||||
m_tutorialState = TUTORIALDATA_CHANGED;
|
||||
}
|
||||
}
|
||||
// used with item_page table
|
||||
bool SendItemInfo(uint32 itemid, WorldPacket data);
|
||||
|
||||
// auction
|
||||
void SendAuctionHello(Unit* unit);
|
||||
void SendAuctionCommandResult(AuctionEntry* auc, AuctionAction Action, AuctionError ErrorCode, InventoryResult invError = EQUIP_ERR_OK);
|
||||
void SendAuctionBidderNotification(AuctionEntry* auction);
|
||||
void SendAuctionOwnerNotification(AuctionEntry* auction);
|
||||
void SendAuctionRemovedNotification(AuctionEntry* auction);
|
||||
static void SendAuctionOutbiddedMail(AuctionEntry* auction);
|
||||
void SendAuctionCancelledToBidderMail(AuctionEntry* auction);
|
||||
void BuildListAuctionItems(std::vector<AuctionEntry*> const& auctions, WorldPacket& data, std::wstring const& searchedname, uint32 listfrom, uint32 levelmin,
|
||||
uint32 levelmax, uint32 usable, uint32 inventoryType, uint32 itemClass, uint32 itemSubClass, uint32 quality, uint32& count, uint32& totalcount, bool isFull);
|
||||
|
||||
AuctionHouseEntry const* GetCheckedAuctionHouseForAuctioneer(ObjectGuid guid);
|
||||
|
||||
// Item Enchantment
|
||||
void SendEnchantmentLog(ObjectGuid targetGuid, ObjectGuid casterGuid, uint32 itemId, uint32 spellId);
|
||||
void SendItemEnchantTimeUpdate(ObjectGuid playerGuid, ObjectGuid itemGuid, uint32 slot, uint32 duration);
|
||||
|
||||
// Taxi
|
||||
void SendTaxiStatus(ObjectGuid guid);
|
||||
void SendTaxiMenu(Creature* unit);
|
||||
void SendDoFlight(uint32 mountDisplayId, uint32 path, uint32 pathNode = 0);
|
||||
bool SendLearnNewTaxiNode(Creature* unit);
|
||||
void SendActivateTaxiReply(ActivateTaxiReply reply);
|
||||
|
||||
// Guild/Arena Team
|
||||
void SendGuildCommandResult(uint32 typecmd, const std::string& str, uint32 cmdresult);
|
||||
void SendArenaTeamCommandResult(uint32 team_action, const std::string& team, const std::string& player, uint32 error_id);
|
||||
void SendNotInArenaTeamPacket(uint8 type);
|
||||
void SendPetitionShowList(ObjectGuid guid);
|
||||
void SendSaveGuildEmblem(uint32 msg);
|
||||
|
||||
void BuildPartyMemberStatsChangedPacket(Player* player, WorldPacket* data);
|
||||
|
||||
void DoLootRelease(ObjectGuid lguid);
|
||||
|
||||
// Account mute time
|
||||
time_t m_muteTime;
|
||||
|
||||
// Locales
|
||||
LocaleConstant GetSessionDbcLocale() const { return m_sessionDbcLocale; }
|
||||
int GetSessionDbLocaleIndex() const { return m_sessionDbLocaleIndex; }
|
||||
const char* GetMangosString(int32 entry) const;
|
||||
|
||||
uint32 GetLatency() const { return m_latency; }
|
||||
void SetLatency(uint32 latency) { m_latency = latency; }
|
||||
uint32 getDialogStatus(Player* pPlayer, Object* questgiver, uint32 defstatus);
|
||||
|
||||
public: // opcodes handlers
|
||||
|
||||
void Handle_NULL(WorldPacket& recvPacket); // not used
|
||||
void Handle_EarlyProccess(WorldPacket& recvPacket); // just mark packets processed in WorldSocket::OnRead
|
||||
void Handle_ServerSide(WorldPacket& recvPacket); // sever side only, can't be accepted from client
|
||||
void Handle_Deprecated(WorldPacket& recvPacket); // never used anymore by client
|
||||
|
||||
void HandleCharEnumOpcode(WorldPacket& recvPacket);
|
||||
void HandleCharDeleteOpcode(WorldPacket& recvPacket);
|
||||
void HandleCharCreateOpcode(WorldPacket& recvPacket);
|
||||
void HandlePlayerLoginOpcode(WorldPacket& recvPacket);
|
||||
void HandleCharEnum(QueryResult* result);
|
||||
void HandlePlayerLogin(LoginQueryHolder* holder);
|
||||
void HandleReorderCharactersOpcode(WorldPacket& recvPacket);
|
||||
|
||||
// played time
|
||||
void HandlePlayedTime(WorldPacket& recvPacket);
|
||||
|
||||
// new
|
||||
void HandleMoveUnRootAck(WorldPacket& recvPacket);
|
||||
void HandleMoveRootAck(WorldPacket& recvPacket);
|
||||
|
||||
// new inspect
|
||||
void HandleInspectOpcode(WorldPacket& recvPacket);
|
||||
|
||||
// new party stats
|
||||
void HandleInspectHonorStatsOpcode(WorldPacket& recvPacket);
|
||||
|
||||
void HandleMoveWaterWalkAck(WorldPacket& recvPacket);
|
||||
void HandleFeatherFallAck(WorldPacket& recv_data);
|
||||
|
||||
void HandleMoveHoverAck(WorldPacket& recv_data);
|
||||
|
||||
void HandleMountSpecialAnimOpcode(WorldPacket& recvdata);
|
||||
|
||||
// character view
|
||||
void HandleShowingHelmOpcode(WorldPacket& recv_data);
|
||||
void HandleShowingCloakOpcode(WorldPacket& recv_data);
|
||||
|
||||
// repair
|
||||
void HandleRepairItemOpcode(WorldPacket& recvPacket);
|
||||
|
||||
// Knockback
|
||||
void HandleMoveKnockBackAck(WorldPacket& recvPacket);
|
||||
void SendKnockBack(float angle, float horizontalSpeed, float verticalSpeed);
|
||||
|
||||
void HandleMoveTeleportAckOpcode(WorldPacket& recvPacket);
|
||||
void HandleForceSpeedChangeAckOpcodes(WorldPacket& recv_data);
|
||||
|
||||
void HandlePingOpcode(WorldPacket& recvPacket);
|
||||
void HandleAuthSessionOpcode(WorldPacket& recvPacket);
|
||||
void HandleRepopRequestOpcode(WorldPacket& recvPacket);
|
||||
void HandleAutostoreLootItemOpcode(WorldPacket& recvPacket);
|
||||
void HandleLootMoneyOpcode(WorldPacket& recvPacket);
|
||||
void HandleLootOpcode(WorldPacket& recvPacket);
|
||||
void HandleLootReleaseOpcode(WorldPacket& recvPacket);
|
||||
void HandleLootMasterGiveOpcode(WorldPacket& recvPacket);
|
||||
void HandleWhoOpcode(WorldPacket& recvPacket);
|
||||
void HandleLogoutRequestOpcode(WorldPacket& recvPacket);
|
||||
void HandlePlayerLogoutOpcode(WorldPacket& recvPacket);
|
||||
void HandleLogoutCancelOpcode(WorldPacket& recvPacket);
|
||||
void HandleGMTicketGetTicketOpcode(WorldPacket& recvPacket);
|
||||
void HandleGMTicketCreateOpcode(WorldPacket& recvPacket);
|
||||
void HandleGMTicketSystemStatusOpcode(WorldPacket& recvPacket);
|
||||
|
||||
void HandleGMTicketDeleteTicketOpcode(WorldPacket& recvPacket);
|
||||
void HandleGMTicketUpdateTextOpcode(WorldPacket& recvPacket);
|
||||
|
||||
void HandleGMSurveySubmitOpcode(WorldPacket& recvPacket);
|
||||
void HandleGMResponseResolveOpcode(WorldPacket& recv_data);
|
||||
|
||||
void HandleTogglePvP(WorldPacket& recvPacket);
|
||||
|
||||
void HandleZoneUpdateOpcode(WorldPacket& recvPacket);
|
||||
void HandleSetTargetOpcode(WorldPacket& recvPacket);
|
||||
void HandleSetSelectionOpcode(WorldPacket& recvPacket);
|
||||
void HandleStandStateChangeOpcode(WorldPacket& recvPacket);
|
||||
void HandleEmoteOpcode(WorldPacket& recvPacket);
|
||||
void HandleContactListOpcode(WorldPacket& recvPacket);
|
||||
void HandleAddFriendOpcode(WorldPacket& recvPacket);
|
||||
static void HandleAddFriendOpcodeCallBack(QueryResult* result, uint32 accountId, std::string friendNote);
|
||||
void HandleDelFriendOpcode(WorldPacket& recvPacket);
|
||||
void HandleAddIgnoreOpcode(WorldPacket& recvPacket);
|
||||
static void HandleAddIgnoreOpcodeCallBack(QueryResult* result, uint32 accountId);
|
||||
void HandleDelIgnoreOpcode(WorldPacket& recvPacket);
|
||||
void HandleSetContactNotesOpcode(WorldPacket& recvPacket);
|
||||
void HandleBugOpcode(WorldPacket& recvPacket);
|
||||
void HandleSetAmmoOpcode(WorldPacket& recvPacket);
|
||||
|
||||
void HandleAreaTriggerOpcode(WorldPacket& recvPacket);
|
||||
|
||||
void HandleSetFactionAtWarOpcode(WorldPacket& recv_data);
|
||||
void HandleSetWatchedFactionOpcode(WorldPacket& recv_data);
|
||||
void HandleSetFactionInactiveOpcode(WorldPacket& recv_data);
|
||||
|
||||
void HandleUpdateAccountData(WorldPacket& recvPacket);
|
||||
void HandleRequestAccountData(WorldPacket& recvPacket);
|
||||
void HandleSetActionButtonOpcode(WorldPacket& recvPacket);
|
||||
|
||||
void HandleGameObjectUseOpcode(WorldPacket& recPacket);
|
||||
void HandleGameobjectReportUse(WorldPacket& recvPacket);
|
||||
|
||||
void HandleNameQueryOpcode(WorldPacket& recvPacket);
|
||||
|
||||
void HandleQueryTimeOpcode(WorldPacket& recvPacket);
|
||||
|
||||
void HandleCreatureQueryOpcode(WorldPacket& recvPacket);
|
||||
|
||||
void HandleGameObjectQueryOpcode(WorldPacket& recvPacket);
|
||||
|
||||
void HandleMoveWorldportAckOpcode(WorldPacket& recvPacket);
|
||||
void HandleMoveWorldportAckOpcode(); // for server-side calls
|
||||
|
||||
void HandleMovementOpcodes(WorldPacket& recvPacket);
|
||||
void HandleSetActiveMoverOpcode(WorldPacket& recv_data);
|
||||
void HandleMoveNotActiveMoverOpcode(WorldPacket& recv_data);
|
||||
void HandleMoveTimeSkippedOpcode(WorldPacket& recv_data);
|
||||
|
||||
void HandleDismissControlledVehicle(WorldPacket& recvPacket);
|
||||
void HandleRequestVehicleExit(WorldPacket& recvPacket);
|
||||
void HandleRequestVehicleSwitchSeat(WorldPacket& recvPacket);
|
||||
void HandleChangeSeatsOnControlledVehicle(WorldPacket& recvPacket);
|
||||
void HandleRideVehicleInteract(WorldPacket& recvPacket);
|
||||
void HandleEjectPassenger(WorldPacket& recvPacket);
|
||||
|
||||
void HandleRequestRaidInfoOpcode(WorldPacket& recv_data);
|
||||
|
||||
void HandleGroupInviteOpcode(WorldPacket& recvPacket);
|
||||
void HandleGroupInviteResponseOpcode(WorldPacket& recvPacket);
|
||||
void HandleGroupUninviteOpcode(WorldPacket& recvPacket);
|
||||
void HandleGroupUninviteGuidOpcode(WorldPacket& recvPacket);
|
||||
void HandleGroupSetLeaderOpcode(WorldPacket& recvPacket);
|
||||
void HandleGroupDisbandOpcode(WorldPacket& recvPacket);
|
||||
void HandleOptOutOfLootOpcode(WorldPacket& recv_data);
|
||||
void HandleSetAllowLowLevelRaidOpcode(WorldPacket& recv_data);
|
||||
void HandleLootMethodOpcode(WorldPacket& recvPacket);
|
||||
void HandleLootRoll(WorldPacket& recv_data);
|
||||
void HandleRequestPartyMemberStatsOpcode(WorldPacket& recv_data);
|
||||
void HandleRaidTargetUpdateOpcode(WorldPacket& recv_data);
|
||||
void HandleRaidReadyCheckOpcode(WorldPacket& recv_data);
|
||||
void HandleRaidReadyCheckFinishedOpcode(WorldPacket& recv_data);
|
||||
void HandleGroupRaidConvertOpcode(WorldPacket& recv_data);
|
||||
void HandleGroupChangeSubGroupOpcode(WorldPacket& recv_data);
|
||||
void HandleGroupAssistantLeaderOpcode(WorldPacket& recv_data);
|
||||
void HandlePartyAssignmentOpcode(WorldPacket& recv_data);
|
||||
|
||||
void HandlePetitionBuyOpcode(WorldPacket& recv_data);
|
||||
void HandlePetitionShowSignOpcode(WorldPacket& recv_data);
|
||||
void HandlePetitionQueryOpcode(WorldPacket& recv_data);
|
||||
void HandlePetitionRenameOpcode(WorldPacket& recv_data);
|
||||
void HandlePetitionSignOpcode(WorldPacket& recv_data);
|
||||
void HandlePetitionDeclineOpcode(WorldPacket& recv_data);
|
||||
void HandleOfferPetitionOpcode(WorldPacket& recv_data);
|
||||
void HandleTurnInPetitionOpcode(WorldPacket& recv_data);
|
||||
|
||||
void HandleGuildQueryOpcode(WorldPacket& recvPacket);
|
||||
void HandleGuildCreateOpcode(WorldPacket& recvPacket);
|
||||
void HandleGuildInviteOpcode(WorldPacket& recvPacket);
|
||||
void HandleGuildRemoveOpcode(WorldPacket& recvPacket);
|
||||
void HandleGuildAcceptOpcode(WorldPacket& recvPacket);
|
||||
void HandleGuildDeclineOpcode(WorldPacket& recvPacket);
|
||||
void HandleGuildInfoOpcode(WorldPacket& recvPacket);
|
||||
void HandleGuildEventLogQueryOpcode(WorldPacket& recvPacket);
|
||||
void HandleGuildRosterOpcode(WorldPacket& recvPacket);
|
||||
void HandleGuildPromoteOpcode(WorldPacket& recvPacket);
|
||||
void HandleGuildDemoteOpcode(WorldPacket& recvPacket);
|
||||
void HandleGuildSetRankOpcode(WorldPacket& recvPacket);
|
||||
void HandleGuildSwitchRankOpcode(WorldPacket& recvPacket);
|
||||
void HandleGuildLeaveOpcode(WorldPacket& recvPacket);
|
||||
void HandleGuildDisbandOpcode(WorldPacket& recvPacket);
|
||||
void HandleGuildLeaderOpcode(WorldPacket& recvPacket);
|
||||
void HandleGuildMOTDOpcode(WorldPacket& recvPacket);
|
||||
void HandleGuildSetNoteOpcode(WorldPacket& recvPacket);
|
||||
void HandleGuildRankOpcode(WorldPacket& recvPacket);
|
||||
void HandleGuildAddRankOpcode(WorldPacket& recvPacket);
|
||||
void HandleGuildDelRankOpcode(WorldPacket& recvPacket);
|
||||
void HandleGuildChangeInfoTextOpcode(WorldPacket& recvPacket);
|
||||
void HandleSaveGuildEmblemOpcode(WorldPacket& recvPacket);
|
||||
void HandleGuildQueryRanksOpcode(WorldPacket& recvPacket);
|
||||
void HandleGuildAutoDeclineToggleOpcode(WorldPacket& recvPacket);
|
||||
|
||||
void HandleTaxiNodeStatusQueryOpcode(WorldPacket& recvPacket);
|
||||
void HandleTaxiQueryAvailableNodes(WorldPacket& recvPacket);
|
||||
void HandleActivateTaxiOpcode(WorldPacket& recvPacket);
|
||||
void HandleActivateTaxiExpressOpcode(WorldPacket& recvPacket);
|
||||
void HandleMoveSplineDoneOpcode(WorldPacket& recvPacket);
|
||||
|
||||
void HandleTabardVendorActivateOpcode(WorldPacket& recvPacket);
|
||||
void HandleBankerActivateOpcode(WorldPacket& recvPacket);
|
||||
void HandleBuyBankSlotOpcode(WorldPacket& recvPacket);
|
||||
void HandleTrainerListOpcode(WorldPacket& recvPacket);
|
||||
void HandleTrainerBuySpellOpcode(WorldPacket& recvPacket);
|
||||
|
||||
void HandlePetitionShowListOpcode(WorldPacket& recvPacket);
|
||||
void HandleGossipHelloOpcode(WorldPacket& recvPacket);
|
||||
void HandleGossipSelectOptionOpcode(WorldPacket& recvPacket);
|
||||
void HandleSpiritHealerActivateOpcode(WorldPacket& recvPacket);
|
||||
void HandleNpcTextQueryOpcode(WorldPacket& recvPacket);
|
||||
void HandleBinderActivateOpcode(WorldPacket& recvPacket);
|
||||
void HandleListStabledPetsOpcode(WorldPacket& recvPacket);
|
||||
void HandleStablePet(WorldPacket& recvPacket);
|
||||
void HandleUnstablePet(WorldPacket& recvPacket);
|
||||
void HandleBuyStableSlot(WorldPacket& recvPacket);
|
||||
void HandleStableRevivePet(WorldPacket& recvPacket);
|
||||
void HandleStableSwapPet(WorldPacket& recvPacket);
|
||||
|
||||
void HandleDuelAcceptedOpcode(WorldPacket& recvPacket);
|
||||
void HandleDuelCancelledOpcode(WorldPacket& recvPacket);
|
||||
|
||||
void HandleAcceptTradeOpcode(WorldPacket& recvPacket);
|
||||
void HandleBeginTradeOpcode(WorldPacket& recvPacket);
|
||||
void HandleBusyTradeOpcode(WorldPacket& recvPacket);
|
||||
void HandleCancelTradeOpcode(WorldPacket& recvPacket);
|
||||
void HandleClearTradeItemOpcode(WorldPacket& recvPacket);
|
||||
void HandleIgnoreTradeOpcode(WorldPacket& recvPacket);
|
||||
void HandleInitiateTradeOpcode(WorldPacket& recvPacket);
|
||||
void HandleSetTradeGoldOpcode(WorldPacket& recvPacket);
|
||||
void HandleSetTradeItemOpcode(WorldPacket& recvPacket);
|
||||
void HandleUnacceptTradeOpcode(WorldPacket& recvPacket);
|
||||
|
||||
void HandleAuctionHelloOpcode(WorldPacket& recvPacket);
|
||||
void HandleAuctionListItems(WorldPacket& recv_data);
|
||||
void HandleAuctionListBidderItems(WorldPacket& recv_data);
|
||||
void HandleAuctionSellItem(WorldPacket& recv_data);
|
||||
|
||||
void HandleAuctionRemoveItem(WorldPacket& recv_data);
|
||||
void HandleAuctionListOwnerItems(WorldPacket& recv_data);
|
||||
void HandleAuctionPlaceBid(WorldPacket& recv_data);
|
||||
|
||||
void AuctionBind(uint32 price, AuctionEntry* auction, Player* pl, Player* auction_owner);
|
||||
void HandleAuctionListPendingSales(WorldPacket& recv_data);
|
||||
|
||||
void HandleGetMailList(WorldPacket& recv_data);
|
||||
void HandleSendMail(WorldPacket& recv_data);
|
||||
void HandleMailTakeMoney(WorldPacket& recv_data);
|
||||
void HandleMailTakeItem(WorldPacket& recv_data);
|
||||
void HandleMailMarkAsRead(WorldPacket& recv_data);
|
||||
void HandleMailReturnToSender(WorldPacket& recv_data);
|
||||
void HandleMailDelete(WorldPacket& recv_data);
|
||||
void HandleItemTextQuery(WorldPacket& recv_data);
|
||||
void HandleMailCreateTextItem(WorldPacket& recv_data);
|
||||
void HandleQueryNextMailTime(WorldPacket& recv_data);
|
||||
void HandleCancelChanneling(WorldPacket& recv_data);
|
||||
|
||||
void SendItemPageInfo(ItemPrototype* itemProto);
|
||||
void HandleSplitItemOpcode(WorldPacket& recvPacket);
|
||||
void HandleSwapInvItemOpcode(WorldPacket& recvPacket);
|
||||
void HandleDestroyItemOpcode(WorldPacket& recvPacket);
|
||||
void HandleAutoEquipItemOpcode(WorldPacket& recvPacket);
|
||||
void HandleSellItemOpcode(WorldPacket& recvPacket);
|
||||
void HandleBuyItemOpcode(WorldPacket& recvPacket);
|
||||
void HandleListInventoryOpcode(WorldPacket& recvPacket);
|
||||
void HandleAutoStoreBagItemOpcode(WorldPacket& recvPacket);
|
||||
void HandleReadItemOpcode(WorldPacket& recvPacket);
|
||||
void HandleAutoEquipItemSlotOpcode(WorldPacket& recvPacket);
|
||||
void HandleSwapItem(WorldPacket& recvPacket);
|
||||
void HandleBuybackItem(WorldPacket& recvPacket);
|
||||
void HandleAutoBankItemOpcode(WorldPacket& recvPacket);
|
||||
void HandleAutoStoreBankItemOpcode(WorldPacket& recvPacket);
|
||||
void HandleWrapItemOpcode(WorldPacket& recvPacket);
|
||||
|
||||
void HandleAttackSwingOpcode(WorldPacket& recvPacket);
|
||||
void HandleAttackStopOpcode(WorldPacket& recvPacket);
|
||||
void HandleSetSheathedOpcode(WorldPacket& recvPacket);
|
||||
|
||||
void HandleUseItemOpcode(WorldPacket& recvPacket);
|
||||
void HandleOpenItemOpcode(WorldPacket& recvPacket);
|
||||
void HandleCastSpellOpcode(WorldPacket& recvPacket);
|
||||
void HandleCancelCastOpcode(WorldPacket& recvPacket);
|
||||
void HandleCancelAuraOpcode(WorldPacket& recvPacket);
|
||||
void HandleCancelGrowthAuraOpcode(WorldPacket& recvPacket);
|
||||
void HandleCancelAutoRepeatSpellOpcode(WorldPacket& recvPacket);
|
||||
|
||||
void HandleLearnTalentOpcode(WorldPacket& recvPacket);
|
||||
void HandleLearnPreviewTalents(WorldPacket& recvPacket);
|
||||
void HandleTalentWipeConfirmOpcode(WorldPacket& recvPacket);
|
||||
void HandleUnlearnSkillOpcode(WorldPacket& recvPacket);
|
||||
|
||||
void HandleQuestgiverStatusQueryOpcode(WorldPacket& recvPacket);
|
||||
void HandleQuestgiverStatusMultipleQuery(WorldPacket& recvPacket);
|
||||
void HandleQuestgiverHelloOpcode(WorldPacket& recvPacket);
|
||||
void HandleQuestgiverAcceptQuestOpcode(WorldPacket& recvPacket);
|
||||
void HandleQuestgiverQueryQuestOpcode(WorldPacket& recvPacket);
|
||||
void HandleQuestgiverChooseRewardOpcode(WorldPacket& recvPacket);
|
||||
void HandleQuestgiverRequestRewardOpcode(WorldPacket& recvPacket);
|
||||
void HandleQuestQueryOpcode(WorldPacket& recvPacket);
|
||||
void HandleQuestgiverCancel(WorldPacket& recv_data);
|
||||
void HandleQuestLogSwapQuest(WorldPacket& recv_data);
|
||||
void HandleQuestLogRemoveQuest(WorldPacket& recv_data);
|
||||
void HandleQuestConfirmAccept(WorldPacket& recv_data);
|
||||
void HandleQuestgiverCompleteQuest(WorldPacket& recv_data);
|
||||
bool CanInteractWithQuestGiver(ObjectGuid guid, char const* descr);
|
||||
|
||||
void HandleQuestgiverQuestAutoLaunch(WorldPacket& recvPacket);
|
||||
void HandlePushQuestToParty(WorldPacket& recvPacket);
|
||||
void HandleQuestPushResult(WorldPacket& recvPacket);
|
||||
|
||||
bool processChatmessageFurtherAfterSecurityChecks(std::string&, uint32);
|
||||
void SendPlayerNotFoundNotice(std::string name);
|
||||
void SendPlayerAmbiguousNotice(std::string name);
|
||||
void SendWrongFactionNotice();
|
||||
void SendChatRestrictedNotice(ChatRestrictionType restriction);
|
||||
void HandleMessagechatOpcode(WorldPacket& recvPacket);
|
||||
void HandleAddonMessagechatOpcode(WorldPacket& recvPacket);
|
||||
void HandleTextEmoteOpcode(WorldPacket& recvPacket);
|
||||
void HandleChatIgnoredOpcode(WorldPacket& recvPacket);
|
||||
|
||||
void HandleReclaimCorpseOpcode(WorldPacket& recvPacket);
|
||||
void HandleCorpseQueryOpcode(WorldPacket& recvPacket);
|
||||
void HandleCorpseMapPositionQueryOpcode(WorldPacket& recvPacket);
|
||||
void HandleResurrectResponseOpcode(WorldPacket& recvPacket);
|
||||
void HandleReturnToGraveyard(WorldPacket& recvPacket);
|
||||
void HandleSummonResponseOpcode(WorldPacket& recv_data);
|
||||
|
||||
void HandleJoinChannelOpcode(WorldPacket& recvPacket);
|
||||
void HandleLeaveChannelOpcode(WorldPacket& recvPacket);
|
||||
void HandleChannelListOpcode(WorldPacket& recvPacket);
|
||||
void HandleChannelPasswordOpcode(WorldPacket& recvPacket);
|
||||
void HandleChannelSetOwnerOpcode(WorldPacket& recvPacket);
|
||||
void HandleChannelOwnerOpcode(WorldPacket& recvPacket);
|
||||
void HandleChannelModeratorOpcode(WorldPacket& recvPacket);
|
||||
void HandleChannelUnmoderatorOpcode(WorldPacket& recvPacket);
|
||||
void HandleChannelMuteOpcode(WorldPacket& recvPacket);
|
||||
void HandleChannelUnmuteOpcode(WorldPacket& recvPacket);
|
||||
void HandleChannelInviteOpcode(WorldPacket& recvPacket);
|
||||
void HandleChannelKickOpcode(WorldPacket& recvPacket);
|
||||
void HandleChannelBanOpcode(WorldPacket& recvPacket);
|
||||
void HandleChannelUnbanOpcode(WorldPacket& recvPacket);
|
||||
void HandleChannelAnnouncementsOpcode(WorldPacket& recvPacket);
|
||||
void HandleChannelModerateOpcode(WorldPacket& recvPacket);
|
||||
void HandleChannelDisplayListQueryOpcode(WorldPacket& recvPacket);
|
||||
void HandleGetChannelMemberCountOpcode(WorldPacket& recvPacket);
|
||||
void HandleSetChannelWatchOpcode(WorldPacket& recvPacket);
|
||||
|
||||
void HandleCompleteCinematic(WorldPacket& recvPacket);
|
||||
void HandleNextCinematicCamera(WorldPacket& recvPacket);
|
||||
|
||||
void HandlePageQuerySkippedOpcode(WorldPacket& recvPacket);
|
||||
void HandlePageTextQueryOpcode(WorldPacket& recvPacket);
|
||||
|
||||
void HandleTutorialFlagOpcode(WorldPacket& recv_data);
|
||||
void HandleTutorialClearOpcode(WorldPacket& recv_data);
|
||||
void HandleTutorialResetOpcode(WorldPacket& recv_data);
|
||||
|
||||
// Pet
|
||||
void HandlePetAction(WorldPacket& recv_data);
|
||||
void HandlePetStopAttack(WorldPacket& recv_data);
|
||||
void HandlePetNameQueryOpcode(WorldPacket& recv_data);
|
||||
void HandlePetSetAction(WorldPacket& recv_data);
|
||||
void HandlePetAbandon(WorldPacket& recv_data);
|
||||
void HandlePetRename(WorldPacket& recv_data);
|
||||
void HandlePetCancelAuraOpcode(WorldPacket& recvPacket);
|
||||
void HandlePetUnlearnOpcode(WorldPacket& recvPacket);
|
||||
void HandlePetSpellAutocastOpcode(WorldPacket& recvPacket);
|
||||
void HandlePetCastSpellOpcode(WorldPacket& recvPacket);
|
||||
void HandlePetLearnTalent(WorldPacket& recvPacket);
|
||||
void HandleLearnPreviewTalentsPet(WorldPacket& recvPacket);
|
||||
|
||||
void HandleSetActionBarTogglesOpcode(WorldPacket& recv_data);
|
||||
|
||||
void HandleCharRenameOpcode(WorldPacket& recv_data);
|
||||
static void HandleChangePlayerNameOpcodeCallBack(QueryResult* result, uint32 accountId, std::string newname);
|
||||
void HandleSetPlayerDeclinedNamesOpcode(WorldPacket& recv_data);
|
||||
|
||||
void HandleTotemDestroyed(WorldPacket& recv_data);
|
||||
|
||||
// BattleGround
|
||||
void HandleBattlemasterHelloOpcode(WorldPacket& recv_data);
|
||||
void HandleBattlemasterJoinOpcode(WorldPacket& recv_data);
|
||||
void HandleBattleGroundPlayerPositionsOpcode(WorldPacket& recv_data);
|
||||
void HandlePVPLogDataOpcode(WorldPacket& recv_data);
|
||||
void HandleBattlefieldStatusOpcode(WorldPacket& recv_data);
|
||||
void HandleBattleFieldPortOpcode(WorldPacket& recv_data);
|
||||
void HandleBattlefieldListOpcode(WorldPacket& recv_data);
|
||||
void HandleLeaveBattlefieldOpcode(WorldPacket& recv_data);
|
||||
void HandleBattlemasterJoinArena(WorldPacket& recv_data);
|
||||
void HandleReportPvPAFK(WorldPacket& recv_data);
|
||||
void HandleRequestPvPOptionsEnabledOpcode(WorldPacket& recv_data);
|
||||
void HandleRequestPvPRewardsOpcode(WorldPacket& recv_data);
|
||||
void HandleRequestRatedBGStatsOpcode(WorldPacket& recv_data);
|
||||
|
||||
void HandleWardenDataOpcode(WorldPacket& recv_data);
|
||||
void HandleWorldTeleportOpcode(WorldPacket& recv_data);
|
||||
void HandleMinimapPingOpcode(WorldPacket& recv_data);
|
||||
void HandleRandomRollOpcode(WorldPacket& recv_data);
|
||||
void HandleFarSightOpcode(WorldPacket& recv_data);
|
||||
void HandleSetDungeonDifficultyOpcode(WorldPacket& recv_data);
|
||||
void HandleSetRaidDifficultyOpcode(WorldPacket& recv_data);
|
||||
void HandleMoveSetCanFlyAckOpcode(WorldPacket& recv_data);
|
||||
void HandleLfgJoinOpcode(WorldPacket& recv_data);
|
||||
void HandleLfgLeaveOpcode(WorldPacket& recv_data);
|
||||
void HandleSearchLfgJoinOpcode(WorldPacket& recv_data);
|
||||
void HandleSearchLfgLeaveOpcode(WorldPacket& recv_data);
|
||||
void HandleSetLfgCommentOpcode(WorldPacket& recv_data);
|
||||
void HandleSetTitleOpcode(WorldPacket& recv_data);
|
||||
void HandleRealmSplitOpcode(WorldPacket& recv_data);
|
||||
void HandleTimeSyncResp(WorldPacket& recv_data);
|
||||
void HandleWhoisOpcode(WorldPacket& recv_data);
|
||||
void HandleResetInstancesOpcode(WorldPacket& recv_data);
|
||||
void HandleHearthandResurrect(WorldPacket& recv_data);
|
||||
|
||||
// Arena Team
|
||||
void HandleInspectArenaTeamsOpcode(WorldPacket& recv_data);
|
||||
void HandleArenaTeamQueryOpcode(WorldPacket& recv_data);
|
||||
void HandleArenaTeamRosterOpcode(WorldPacket& recv_data);
|
||||
void HandleArenaTeamCreateOpcode(WorldPacket& recv_data);
|
||||
void HandleArenaTeamInviteOpcode(WorldPacket& recv_data);
|
||||
void HandleArenaTeamAcceptOpcode(WorldPacket& recv_data);
|
||||
void HandleArenaTeamDeclineOpcode(WorldPacket& recv_data);
|
||||
void HandleArenaTeamLeaveOpcode(WorldPacket& recv_data);
|
||||
void HandleArenaTeamRemoveOpcode(WorldPacket& recv_data);
|
||||
void HandleArenaTeamDisbandOpcode(WorldPacket& recv_data);
|
||||
void HandleArenaTeamLeaderOpcode(WorldPacket& recv_data);
|
||||
|
||||
void HandleAreaSpiritHealerQueryOpcode(WorldPacket& recv_data);
|
||||
void HandleAreaSpiritHealerQueueOpcode(WorldPacket& recv_data);
|
||||
void HandleCancelMountAuraOpcode(WorldPacket& recv_data);
|
||||
void HandleSelfResOpcode(WorldPacket& recv_data);
|
||||
void HandleComplainOpcode(WorldPacket& recv_data);
|
||||
void HandleRequestPetInfoOpcode(WorldPacket& recv_data);
|
||||
|
||||
// Socket gem
|
||||
void HandleSocketOpcode(WorldPacket& recv_data);
|
||||
|
||||
void HandleCancelTempEnchantmentOpcode(WorldPacket& recv_data);
|
||||
void HandleItemRefundInfoRequest(WorldPacket& recv_data);
|
||||
|
||||
void HandleChannelVoiceOnOpcode(WorldPacket& recv_data);
|
||||
void HandleVoiceSessionEnableOpcode(WorldPacket& recv_data);
|
||||
void HandleSetActiveVoiceChannel(WorldPacket& recv_data);
|
||||
void HandleSetTaxiBenchmarkOpcode(WorldPacket& recv_data);
|
||||
|
||||
// Guild Bank
|
||||
void HandleGuildPermissions(WorldPacket& recv_data);
|
||||
void HandleGuildBankMoneyWithdrawn(WorldPacket& recv_data);
|
||||
void HandleGuildBankerActivate(WorldPacket& recv_data);
|
||||
void HandleGuildBankQueryTab(WorldPacket& recv_data);
|
||||
void HandleGuildBankLogQuery(WorldPacket& recv_data);
|
||||
void HandleGuildBankDepositMoney(WorldPacket& recv_data);
|
||||
void HandleGuildBankWithdrawMoney(WorldPacket& recv_data);
|
||||
void HandleGuildBankSwapItems(WorldPacket& recv_data);
|
||||
void HandleGuildBankUpdateTab(WorldPacket& recv_data);
|
||||
void HandleGuildBankBuyTab(WorldPacket& recv_data);
|
||||
void HandleQueryGuildBankTabText(WorldPacket& recv_data);
|
||||
void HandleSetGuildBankTabText(WorldPacket& recv_data);
|
||||
|
||||
// Calendar
|
||||
void HandleCalendarGetCalendar(WorldPacket& recv_data);
|
||||
void HandleCalendarGetEvent(WorldPacket& recv_data);
|
||||
void HandleCalendarGuildFilter(WorldPacket& recv_data);
|
||||
void HandleCalendarEventSignup(WorldPacket& recvData);
|
||||
void HandleCalendarArenaTeam(WorldPacket& recv_data);
|
||||
void HandleCalendarAddEvent(WorldPacket& recv_data);
|
||||
void HandleCalendarUpdateEvent(WorldPacket& recv_data);
|
||||
void HandleCalendarRemoveEvent(WorldPacket& recv_data);
|
||||
void HandleCalendarCopyEvent(WorldPacket& recv_data);
|
||||
void HandleCalendarEventInvite(WorldPacket& recv_data);
|
||||
void HandleCalendarEventRsvp(WorldPacket& recv_data);
|
||||
void HandleCalendarEventRemoveInvite(WorldPacket& recv_data);
|
||||
void HandleCalendarEventStatus(WorldPacket& recv_data);
|
||||
void HandleCalendarEventModeratorStatus(WorldPacket& recv_data);
|
||||
void HandleCalendarComplain(WorldPacket& recv_data);
|
||||
void HandleCalendarGetNumPending(WorldPacket& recv_data);
|
||||
|
||||
// Hotfix handlers
|
||||
void HandleRequestHotfix(WorldPacket& recv_data);
|
||||
void SendItemDb2Reply(uint32 entry);
|
||||
void SendItemSparseDb2Reply(uint32 entry);
|
||||
|
||||
void HandleObjectUpdateFailedOpcode(WorldPacket& recv_data);
|
||||
|
||||
void HandleSpellClick(WorldPacket& recv_data);
|
||||
void HandleGetMirrorimageData(WorldPacket& recv_data);
|
||||
void HandleAlterAppearanceOpcode(WorldPacket& recv_data);
|
||||
void HandleRemoveGlyphOpcode(WorldPacket& recv_data);
|
||||
void HandleCharCustomizeOpcode(WorldPacket& recv_data);
|
||||
void HandleQueryInspectAchievementsOpcode(WorldPacket& recv_data);
|
||||
void HandleEquipmentSetSaveOpcode(WorldPacket& recv_data);
|
||||
void HandleEquipmentSetDeleteOpcode(WorldPacket& recv_data);
|
||||
void HandleEquipmentSetUseOpcode(WorldPacket& recv_data);
|
||||
void HandleUITimeRequestOpcode(WorldPacket& recv_data);
|
||||
void HandleReadyForAccountDataTimesOpcode(WorldPacket& recv_data);
|
||||
void HandleQueryQuestsCompletedOpcode(WorldPacket& recv_data);
|
||||
void HandleQuestPOIQueryOpcode(WorldPacket& recv_data);
|
||||
void HandleSetCurrencyFlagsOpcode(WorldPacket& recv_data);
|
||||
|
||||
// Reforge
|
||||
void HandleReforgeItemOpcode(WorldPacket& recvData);
|
||||
void SendReforgeResult(bool success);
|
||||
|
||||
void HandleLoadScreenOpcode(WorldPacket& recvPacket);
|
||||
private:
|
||||
// private trade methods
|
||||
void moveItems(Item* myItems[], Item* hisItems[]);
|
||||
bool VerifyMovementInfo(MovementInfo const& movementInfo, ObjectGuid const& guid) const;
|
||||
void HandleMoverRelocation(MovementInfo& movementInfo);
|
||||
|
||||
void ExecuteOpcode(OpcodeHandler const& opHandle, WorldPacket* packet);
|
||||
|
||||
// logging helper
|
||||
void LogUnexpectedOpcode(WorldPacket* packet, const char* reason);
|
||||
void LogUnprocessedTail(WorldPacket* packet);
|
||||
|
||||
uint32 m_GUIDLow; // set logged or recently logout player (while m_playerRecentlyLogout set)
|
||||
Player* _player;
|
||||
WorldSocket* m_Socket;
|
||||
std::string m_Address;
|
||||
|
||||
AccountTypes _security;
|
||||
uint32 _accountId;
|
||||
uint8 m_expansion;
|
||||
|
||||
time_t _logoutTime;
|
||||
bool m_inQueue; // session wait in auth.queue
|
||||
bool m_playerLoading; // code processed in LoginPlayer
|
||||
bool m_playerLogout; // code processed in LogoutPlayer
|
||||
bool m_playerRecentlyLogout;
|
||||
bool m_playerSave; // code processed in LogoutPlayer with save request
|
||||
LocaleConstant m_sessionDbcLocale;
|
||||
int m_sessionDbLocaleIndex;
|
||||
uint32 m_latency;
|
||||
AccountData m_accountData[NUM_ACCOUNT_DATA_TYPES];
|
||||
uint32 m_Tutorials[8];
|
||||
TutorialDataState m_tutorialState;
|
||||
AddonsList m_addonsList;
|
||||
ACE_Based::LockedQueue<WorldPacket*, ACE_Thread_Mutex> _recvQueue;
|
||||
};
|
||||
#endif
|
||||
/// @}
|
||||
1071
src/game/Server/WorldSocket.cpp
Normal file
1071
src/game/Server/WorldSocket.cpp
Normal file
File diff suppressed because it is too large
Load diff
233
src/game/Server/WorldSocket.h
Normal file
233
src/game/Server/WorldSocket.h
Normal file
|
|
@ -0,0 +1,233 @@
|
|||
/**
|
||||
* MaNGOS is a full featured server for World of Warcraft, supporting
|
||||
* the following clients: 1.12.x, 2.4.3, 3.3.5a, 4.3.4a and 5.4.8
|
||||
*
|
||||
* Copyright (C) 2005-2014 MaNGOS project <http://getmangos.eu>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* World of Warcraft, and all World of Warcraft or Warcraft art, images,
|
||||
* and lore are copyrighted by Blizzard Entertainment, Inc.
|
||||
*/
|
||||
|
||||
/** \addtogroup u2w User to World Communication
|
||||
* @{
|
||||
* \file WorldSocket.h
|
||||
* \author Derex <derex101@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef _WORLDSOCKET_H
|
||||
#define _WORLDSOCKET_H
|
||||
|
||||
#include <ace/Basic_Types.h>
|
||||
#include <ace/Synch_Traits.h>
|
||||
#include <ace/Svc_Handler.h>
|
||||
#include <ace/SOCK_Stream.h>
|
||||
#include <ace/SOCK_Acceptor.h>
|
||||
#include <ace/Acceptor.h>
|
||||
#include <ace/Thread_Mutex.h>
|
||||
#include <ace/Guard_T.h>
|
||||
#include <ace/Unbounded_Queue.h>
|
||||
#include <ace/Message_Block.h>
|
||||
|
||||
#if !defined (ACE_LACKS_PRAGMA_ONCE)
|
||||
#pragma once
|
||||
#endif /* ACE_LACKS_PRAGMA_ONCE */
|
||||
|
||||
#include "Common.h"
|
||||
#include "Auth/AuthCrypt.h"
|
||||
#include "Auth/BigNumber.h"
|
||||
|
||||
class ACE_Message_Block;
|
||||
class WorldPacket;
|
||||
class WorldSession;
|
||||
|
||||
/// Handler that can communicate over stream sockets.
|
||||
typedef ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH> WorldHandler;
|
||||
|
||||
/**
|
||||
* WorldSocket.
|
||||
*
|
||||
* This class is responsible for the communication with
|
||||
* remote clients.
|
||||
* Most methods return -1 on failure.
|
||||
* The class uses reference counting.
|
||||
*
|
||||
* For output the class uses one buffer (64K usually) and
|
||||
* a queue where it stores packet if there is no place on
|
||||
* the queue. The reason this is done, is because the server
|
||||
* does really a lot of small-size writes to it, and it doesn't
|
||||
* scale well to allocate memory for every. When something is
|
||||
* written to the output buffer the socket is not immediately
|
||||
* activated for output (again for the same reason), there
|
||||
* is 10ms celling (thats why there is Update() override method).
|
||||
* This concept is similar to TCP_CORK, but TCP_CORK
|
||||
* uses 200ms celling. As result overhead generated by
|
||||
* sending packets from "producer" threads is minimal,
|
||||
* and doing a lot of writes with small size is tolerated.
|
||||
*
|
||||
* The calls to Update () method are managed by WorldSocketMgr
|
||||
* and ReactorRunnable.
|
||||
*
|
||||
* For input ,the class uses one 1024 bytes buffer on stack
|
||||
* to which it does recv() calls. And then received data is
|
||||
* distributed where its needed. 1024 matches pretty well the
|
||||
* traffic generated by client for now.
|
||||
*
|
||||
* The input/output do speculative reads/writes (AKA it tryes
|
||||
* to read all data available in the kernel buffer or tryes to
|
||||
* write everything available in userspace buffer),
|
||||
* which is ok for using with Level and Edge Triggered IO
|
||||
* notification.
|
||||
*
|
||||
*/
|
||||
class WorldSocket : protected WorldHandler
|
||||
{
|
||||
public:
|
||||
/// Declare some friends
|
||||
friend class ACE_Acceptor< WorldSocket, ACE_SOCK_ACCEPTOR >;
|
||||
friend class WorldSocketMgr;
|
||||
friend class ReactorRunnable;
|
||||
|
||||
/// Declare the acceptor for this class
|
||||
typedef ACE_Acceptor< WorldSocket, ACE_SOCK_ACCEPTOR > Acceptor;
|
||||
|
||||
/// Mutex type used for various synchronizations.
|
||||
typedef ACE_Thread_Mutex LockType;
|
||||
typedef ACE_Guard<LockType> GuardType;
|
||||
|
||||
/// Check if socket is closed.
|
||||
bool IsClosed(void) const;
|
||||
|
||||
/// Close the socket.
|
||||
void CloseSocket(void);
|
||||
|
||||
/// Get address of connected peer.
|
||||
const std::string& GetRemoteAddress(void) const;
|
||||
|
||||
/// Send A packet on the socket, this function is reentrant.
|
||||
/// @param pct packet to send
|
||||
/// @return -1 of failure
|
||||
int SendPacket(const WorldPacket& pct);
|
||||
|
||||
/// Add reference to this object.
|
||||
long AddReference(void);
|
||||
|
||||
/// Remove reference to this object.
|
||||
long RemoveReference(void);
|
||||
|
||||
/// Return the session key
|
||||
BigNumber& GetSessionKey() { return m_s; }
|
||||
|
||||
protected:
|
||||
/// things called by ACE framework.
|
||||
WorldSocket(void);
|
||||
virtual ~WorldSocket(void);
|
||||
|
||||
/// Called on open ,the void* is the acceptor.
|
||||
int HandleWowConnection(WorldPacket& recvPacket);
|
||||
|
||||
virtual int open(void*) override;
|
||||
|
||||
/// Called on failures inside of the acceptor, don't call from your code.
|
||||
virtual int close(int);
|
||||
|
||||
/// Called when we can read from the socket.
|
||||
virtual int handle_input(ACE_HANDLE = ACE_INVALID_HANDLE) override;
|
||||
|
||||
/// Called when the socket can write.
|
||||
virtual int handle_output(ACE_HANDLE = ACE_INVALID_HANDLE) override;
|
||||
|
||||
/// Called when connection is closed or error happens.
|
||||
virtual int handle_close(ACE_HANDLE = ACE_INVALID_HANDLE,
|
||||
ACE_Reactor_Mask = ACE_Event_Handler::ALL_EVENTS_MASK);
|
||||
|
||||
/// Called by WorldSocketMgr/ReactorRunnable.
|
||||
int Update(void);
|
||||
|
||||
private:
|
||||
/// Helper functions for processing incoming data.
|
||||
int handle_input_header(void);
|
||||
int handle_input_payload(void);
|
||||
int handle_input_missing_data(void);
|
||||
|
||||
/// Help functions to mark/unmark the socket for output.
|
||||
/// @param g the guard is for m_OutBufferLock, the function will release it
|
||||
int cancel_wakeup_output(GuardType& g);
|
||||
int schedule_wakeup_output(GuardType& g);
|
||||
|
||||
/// Drain the queue if its not empty.
|
||||
int handle_output_queue(GuardType& g);
|
||||
|
||||
/// process one incoming packet.
|
||||
/// @param new_pct received packet ,note that you need to delete it.
|
||||
int ProcessIncoming(WorldPacket* new_pct);
|
||||
|
||||
/// Called by ProcessIncoming() on CMSG_AUTH_SESSION.
|
||||
int HandleAuthSession(WorldPacket& recvPacket);
|
||||
|
||||
/// Called by ProcessIncoming() on CMSG_PING.
|
||||
int HandlePing(WorldPacket& recvPacket);
|
||||
|
||||
private:
|
||||
/// Time in which the last ping was received
|
||||
ACE_Time_Value m_LastPingTime;
|
||||
|
||||
/// Keep track of over-speed pings ,to prevent ping flood.
|
||||
uint32 m_OverSpeedPings;
|
||||
|
||||
/// Address of the remote peer
|
||||
std::string m_Address;
|
||||
|
||||
/// Class used for managing encryption of the headers
|
||||
AuthCrypt m_Crypt;
|
||||
|
||||
/// Mutex lock to protect m_Session
|
||||
LockType m_SessionLock;
|
||||
|
||||
/// Session to which received packets are routed
|
||||
WorldSession* m_Session;
|
||||
|
||||
/// here are stored the fragments of the received data
|
||||
WorldPacket* m_RecvWPct;
|
||||
|
||||
/// This block actually refers to m_RecvWPct contents,
|
||||
/// which allows easy and safe writing to it.
|
||||
/// It wont free memory when its deleted. m_RecvWPct takes care of freeing.
|
||||
ACE_Message_Block m_RecvPct;
|
||||
|
||||
/// Fragment of the received header.
|
||||
ACE_Message_Block m_Header;
|
||||
|
||||
/// Mutex for protecting output related data.
|
||||
LockType m_OutBufferLock;
|
||||
|
||||
/// Buffer used for writing output.
|
||||
ACE_Message_Block* m_OutBuffer;
|
||||
|
||||
/// Size of the m_OutBuffer.
|
||||
size_t m_OutBufferSize;
|
||||
|
||||
/// True if the socket is registered with the reactor for output
|
||||
bool m_OutActive;
|
||||
|
||||
uint32 m_Seed;
|
||||
|
||||
BigNumber m_s;
|
||||
};
|
||||
|
||||
#endif /* _WORLDSOCKET_H */
|
||||
|
||||
/// @}
|
||||
359
src/game/Server/WorldSocketMgr.cpp
Normal file
359
src/game/Server/WorldSocketMgr.cpp
Normal file
|
|
@ -0,0 +1,359 @@
|
|||
/**
|
||||
* MaNGOS is a full featured server for World of Warcraft, supporting
|
||||
* the following clients: 1.12.x, 2.4.3, 3.3.5a, 4.3.4a and 5.4.8
|
||||
*
|
||||
* Copyright (C) 2005-2014 MaNGOS project <http://getmangos.eu>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* World of Warcraft, and all World of Warcraft or Warcraft art, images,
|
||||
* and lore are copyrighted by Blizzard Entertainment, Inc.
|
||||
*/
|
||||
|
||||
/** \file WorldSocketMgr.cpp
|
||||
* \ingroup u2w
|
||||
* \author Derex <derex101@gmail.com>
|
||||
*/
|
||||
|
||||
#include "WorldSocketMgr.h"
|
||||
|
||||
#include <ace/ACE.h>
|
||||
#include <ace/Log_Msg.h>
|
||||
#include <ace/Reactor.h>
|
||||
#include <ace/Reactor_Impl.h>
|
||||
#include <ace/TP_Reactor.h>
|
||||
#include <ace/Dev_Poll_Reactor.h>
|
||||
#include <ace/Guard_T.h>
|
||||
#include <ace/Atomic_Op.h>
|
||||
#include <ace/os_include/arpa/os_inet.h>
|
||||
#include <ace/os_include/netinet/os_tcp.h>
|
||||
#include <ace/os_include/sys/os_types.h>
|
||||
#include <ace/os_include/sys/os_socket.h>
|
||||
|
||||
#include <set>
|
||||
|
||||
#include "Log.h"
|
||||
#include "Common.h"
|
||||
#include "Config/Config.h"
|
||||
#include "Database/DatabaseEnv.h"
|
||||
#include "WorldSocket.h"
|
||||
#include "Opcodes.h"
|
||||
|
||||
/**
|
||||
* This is a helper class to WorldSocketMgr ,that manages
|
||||
* network threads, and assigning connections from acceptor thread
|
||||
* to other network threads
|
||||
*/
|
||||
class ReactorRunnable : protected ACE_Task_Base
|
||||
{
|
||||
public:
|
||||
ReactorRunnable() :
|
||||
m_Reactor(0),
|
||||
m_Connections(0),
|
||||
m_ThreadId(-1)
|
||||
{
|
||||
ACE_Reactor_Impl* imp = 0;
|
||||
|
||||
#if defined (ACE_HAS_EVENT_POLL) || defined (ACE_HAS_DEV_POLL)
|
||||
|
||||
imp = new ACE_Dev_Poll_Reactor();
|
||||
|
||||
imp->max_notify_iterations(128);
|
||||
imp->restart(1);
|
||||
|
||||
#else
|
||||
|
||||
imp = new ACE_TP_Reactor();
|
||||
imp->max_notify_iterations(128);
|
||||
|
||||
#endif
|
||||
|
||||
m_Reactor = new ACE_Reactor(imp, 1);
|
||||
}
|
||||
|
||||
virtual ~ReactorRunnable()
|
||||
{
|
||||
Stop();
|
||||
Wait();
|
||||
|
||||
delete m_Reactor;
|
||||
}
|
||||
|
||||
void Stop()
|
||||
{
|
||||
m_Reactor->end_reactor_event_loop();
|
||||
}
|
||||
|
||||
int Start()
|
||||
{
|
||||
if (m_ThreadId != -1)
|
||||
return -1;
|
||||
|
||||
return (m_ThreadId = activate());
|
||||
}
|
||||
|
||||
void Wait() { ACE_Task_Base::wait(); }
|
||||
|
||||
long Connections()
|
||||
{
|
||||
return static_cast<long>(m_Connections.value());
|
||||
}
|
||||
|
||||
int AddSocket(WorldSocket* sock)
|
||||
{
|
||||
ACE_GUARD_RETURN(ACE_Thread_Mutex, Guard, m_NewSockets_Lock, -1);
|
||||
|
||||
++m_Connections;
|
||||
sock->AddReference();
|
||||
sock->reactor(m_Reactor);
|
||||
m_NewSockets.insert(sock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
ACE_Reactor* GetReactor()
|
||||
{
|
||||
return m_Reactor;
|
||||
}
|
||||
|
||||
protected:
|
||||
void AddNewSockets()
|
||||
{
|
||||
ACE_GUARD(ACE_Thread_Mutex, Guard, m_NewSockets_Lock);
|
||||
|
||||
if (m_NewSockets.empty())
|
||||
return;
|
||||
|
||||
for (SocketSet::const_iterator i = m_NewSockets.begin(); i != m_NewSockets.end(); ++i)
|
||||
{
|
||||
WorldSocket* sock = (*i);
|
||||
|
||||
if (sock->IsClosed())
|
||||
{
|
||||
sock->RemoveReference();
|
||||
--m_Connections;
|
||||
}
|
||||
else
|
||||
m_Sockets.insert(sock);
|
||||
}
|
||||
|
||||
m_NewSockets.clear();
|
||||
}
|
||||
|
||||
virtual int svc()
|
||||
{
|
||||
DEBUG_LOG("Network Thread Starting");
|
||||
|
||||
WorldDatabase.ThreadStart();
|
||||
|
||||
MANGOS_ASSERT(m_Reactor);
|
||||
|
||||
SocketSet::iterator i, t;
|
||||
|
||||
while (!m_Reactor->reactor_event_loop_done())
|
||||
{
|
||||
// dont be too smart to move this outside the loop
|
||||
// the run_reactor_event_loop will modify interval
|
||||
ACE_Time_Value interval(0, 10000);
|
||||
|
||||
if (m_Reactor->run_reactor_event_loop(interval) == -1)
|
||||
break;
|
||||
|
||||
AddNewSockets();
|
||||
|
||||
for (i = m_Sockets.begin(); i != m_Sockets.end();)
|
||||
{
|
||||
if ((*i)->Update() == -1)
|
||||
{
|
||||
t = i;
|
||||
++i;
|
||||
(*t)->CloseSocket();
|
||||
(*t)->RemoveReference();
|
||||
--m_Connections;
|
||||
m_Sockets.erase(t);
|
||||
}
|
||||
else
|
||||
++i;
|
||||
}
|
||||
}
|
||||
|
||||
WorldDatabase.ThreadEnd();
|
||||
|
||||
DEBUG_LOG("Network Thread Exitting");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
private:
|
||||
typedef ACE_Atomic_Op<ACE_SYNCH_MUTEX, long> AtomicInt;
|
||||
typedef std::set<WorldSocket*> SocketSet;
|
||||
|
||||
ACE_Reactor* m_Reactor;
|
||||
AtomicInt m_Connections;
|
||||
int m_ThreadId;
|
||||
|
||||
SocketSet m_Sockets;
|
||||
|
||||
SocketSet m_NewSockets;
|
||||
ACE_Thread_Mutex m_NewSockets_Lock;
|
||||
};
|
||||
|
||||
WorldSocketMgr::WorldSocketMgr():
|
||||
m_NetThreads(0),
|
||||
m_NetThreadsCount(0),
|
||||
m_SockOutKBuff(-1),
|
||||
m_SockOutUBuff(65536),
|
||||
m_UseNoDelay(true),
|
||||
m_Acceptor(0)
|
||||
{
|
||||
InitializeOpcodes();
|
||||
}
|
||||
|
||||
WorldSocketMgr::~WorldSocketMgr()
|
||||
{
|
||||
delete[] m_NetThreads;
|
||||
delete m_Acceptor;
|
||||
}
|
||||
|
||||
int WorldSocketMgr::StartReactiveIO(ACE_UINT16 port, const char* address)
|
||||
{
|
||||
m_UseNoDelay = sConfig.GetBoolDefault("Network.TcpNodelay", true);
|
||||
|
||||
int num_threads = sConfig.GetIntDefault("Network.Threads", 1);
|
||||
|
||||
if (num_threads <= 0)
|
||||
{
|
||||
sLog.outError("Network.Threads is wrong in your config file");
|
||||
return -1;
|
||||
}
|
||||
|
||||
m_NetThreadsCount = static_cast<size_t>(num_threads + 1);
|
||||
|
||||
m_NetThreads = new ReactorRunnable[m_NetThreadsCount];
|
||||
|
||||
BASIC_LOG("Max allowed socket connections %d", ACE::max_handles());
|
||||
|
||||
// -1 means use default
|
||||
m_SockOutKBuff = sConfig.GetIntDefault("Network.OutKBuff", -1);
|
||||
|
||||
m_SockOutUBuff = sConfig.GetIntDefault("Network.OutUBuff", 65536);
|
||||
|
||||
if (m_SockOutUBuff <= 0)
|
||||
{
|
||||
sLog.outError("Network.OutUBuff is wrong in your config file");
|
||||
return -1;
|
||||
}
|
||||
|
||||
WorldSocket::Acceptor* acc = new WorldSocket::Acceptor;
|
||||
m_Acceptor = acc;
|
||||
|
||||
ACE_INET_Addr listen_addr(port, address);
|
||||
|
||||
if (acc->open(listen_addr, m_NetThreads[0].GetReactor(), ACE_NONBLOCK) == -1)
|
||||
{
|
||||
sLog.outError("Failed to open acceptor, check if the port is free");
|
||||
return -1;
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < m_NetThreadsCount; ++i)
|
||||
m_NetThreads[i].Start();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int WorldSocketMgr::StartNetwork(ACE_UINT16 port, std::string& address)
|
||||
{
|
||||
m_addr = address;
|
||||
m_port = port;
|
||||
|
||||
if (!sLog.HasLogLevelOrHigher(LOG_LVL_DEBUG))
|
||||
ACE_Log_Msg::instance()->priority_mask(LM_ERROR, ACE_Log_Msg::PROCESS);
|
||||
|
||||
if (StartReactiveIO(port, address.c_str()) == -1)
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void WorldSocketMgr::StopNetwork()
|
||||
{
|
||||
if (m_Acceptor)
|
||||
{
|
||||
WorldSocket::Acceptor* acc = dynamic_cast<WorldSocket::Acceptor*>(m_Acceptor);
|
||||
|
||||
if (acc)
|
||||
acc->close();
|
||||
}
|
||||
|
||||
if (m_NetThreadsCount != 0)
|
||||
{
|
||||
for (size_t i = 0; i < m_NetThreadsCount; ++i)
|
||||
m_NetThreads[i].Stop();
|
||||
}
|
||||
|
||||
Wait();
|
||||
}
|
||||
|
||||
void WorldSocketMgr::Wait()
|
||||
{
|
||||
if (m_NetThreadsCount != 0)
|
||||
{
|
||||
for (size_t i = 0; i < m_NetThreadsCount; ++i)
|
||||
m_NetThreads[i].Wait();
|
||||
}
|
||||
}
|
||||
|
||||
int WorldSocketMgr::OnSocketOpen(WorldSocket* sock)
|
||||
{
|
||||
// set some options here
|
||||
if (m_SockOutKBuff >= 0)
|
||||
{
|
||||
if (sock->peer().set_option(SOL_SOCKET, SO_SNDBUF, (void*)&m_SockOutKBuff, sizeof(int)) == -1 && errno != ENOTSUP)
|
||||
{
|
||||
sLog.outError("WorldSocketMgr::OnSocketOpen set_option SO_SNDBUF");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
static const int ndoption = 1;
|
||||
|
||||
// Set TCP_NODELAY.
|
||||
if (m_UseNoDelay)
|
||||
{
|
||||
if (sock->peer().set_option(ACE_IPPROTO_TCP, TCP_NODELAY, (void*)&ndoption, sizeof(int)) == -1)
|
||||
{
|
||||
sLog.outError("WorldSocketMgr::OnSocketOpen: peer().set_option TCP_NODELAY errno = %s", ACE_OS::strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
sock->m_OutBufferSize = static_cast<size_t>(m_SockOutUBuff);
|
||||
|
||||
// we skip the Acceptor Thread
|
||||
size_t min = 1;
|
||||
|
||||
MANGOS_ASSERT(m_NetThreadsCount >= 1);
|
||||
|
||||
for (size_t i = 1; i < m_NetThreadsCount; ++i)
|
||||
if (m_NetThreads[i].Connections() < m_NetThreads[min].Connections())
|
||||
min = i;
|
||||
|
||||
return m_NetThreads[min].AddSocket(sock);
|
||||
}
|
||||
|
||||
WorldSocketMgr* WorldSocketMgr::Instance()
|
||||
{
|
||||
return ACE_Singleton<WorldSocketMgr, ACE_Thread_Mutex>::instance();
|
||||
}
|
||||
89
src/game/Server/WorldSocketMgr.h
Normal file
89
src/game/Server/WorldSocketMgr.h
Normal file
|
|
@ -0,0 +1,89 @@
|
|||
/**
|
||||
* MaNGOS is a full featured server for World of Warcraft, supporting
|
||||
* the following clients: 1.12.x, 2.4.3, 3.3.5a, 4.3.4a and 5.4.8
|
||||
*
|
||||
* Copyright (C) 2005-2014 MaNGOS project <http://getmangos.eu>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* World of Warcraft, and all World of Warcraft or Warcraft art, images,
|
||||
* and lore are copyrighted by Blizzard Entertainment, Inc.
|
||||
*/
|
||||
|
||||
/** \addtogroup u2w User to World Communication
|
||||
* @{
|
||||
* \file WorldSocketMgr.h
|
||||
* \author Derex <derex101@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __WORLDSOCKETMGR_H
|
||||
#define __WORLDSOCKETMGR_H
|
||||
|
||||
#include <ace/Basic_Types.h>
|
||||
#include <ace/Singleton.h>
|
||||
#include <ace/Thread_Mutex.h>
|
||||
|
||||
#include <string>
|
||||
|
||||
class WorldSocket;
|
||||
class ReactorRunnable;
|
||||
class ACE_Event_Handler;
|
||||
|
||||
/// Manages all sockets connected to peers and network threads
|
||||
class WorldSocketMgr
|
||||
{
|
||||
public:
|
||||
friend class WorldSocket;
|
||||
friend class ACE_Singleton<WorldSocketMgr, ACE_Thread_Mutex>;
|
||||
|
||||
/// Start network, listen at address:port .
|
||||
int StartNetwork(ACE_UINT16 port, std::string& address);
|
||||
|
||||
/// Stops all network threads, It will wait for all running threads .
|
||||
void StopNetwork();
|
||||
|
||||
/// Wait untill all network threads have "joined" .
|
||||
void Wait();
|
||||
|
||||
std::string& GetBindAddress() { return m_addr; }
|
||||
ACE_UINT16 GetBindPort() { return m_port; }
|
||||
|
||||
/// Make this class singleton .
|
||||
static WorldSocketMgr* Instance();
|
||||
|
||||
private:
|
||||
int OnSocketOpen(WorldSocket* sock);
|
||||
int StartReactiveIO(ACE_UINT16 port, const char* address);
|
||||
|
||||
WorldSocketMgr();
|
||||
virtual ~WorldSocketMgr();
|
||||
|
||||
ReactorRunnable* m_NetThreads;
|
||||
size_t m_NetThreadsCount;
|
||||
|
||||
int m_SockOutKBuff;
|
||||
int m_SockOutUBuff;
|
||||
bool m_UseNoDelay;
|
||||
|
||||
std::string m_addr;
|
||||
ACE_UINT16 m_port;
|
||||
|
||||
ACE_Event_Handler* m_Acceptor;
|
||||
};
|
||||
|
||||
#define sWorldSocketMgr WorldSocketMgr::Instance()
|
||||
|
||||
#endif
|
||||
/// @}
|
||||
Loading…
Add table
Add a link
Reference in a new issue