Core/DataStores: Updated db2 structures to 9.0.2

Port From (https://github.com/TrinityCore/TrinityCore/commit/b82a3a557a7bf13d48342ea189325550059b622d)
This commit is contained in:
hondacrx
2020-12-12 23:20:41 -05:00
parent 18d2b7bb80
commit f0037ab99f
86 changed files with 12653 additions and 2811 deletions
+48 -8
View File
@@ -371,24 +371,50 @@ namespace Framework.Constants
//Unk265 = 265,
SelectedAzeriteEssenceRankLower = 266,
SelectedAzeriteEssenceRankGreater = 267,
//Unk268 = 268,
//Unk269 = 269,
SourceLevelInRangeCt = 268,
TargetLevelInRangeCt = 269,
//Unk270 = 270,
//Unk271 = 271,
//Unk272 = 272,
//Unk273 = 273,
SourceLevelGreaterCt = 272, // Compare Levels Using Content Tuning
TargetLevelGreaterCt = 273, // Compare Levels Using Content Tuning
//Unk274 = 274,
//Unk275 = 275,
//Unk276 = 276,
//Unk277 = 277,
RafRecruitInParty = 277, // NYI
//Unk278 = 278,
//Unk279 = 279,
MapOrCosmeticMap = 280,
//Unk281 = 281,
HasEntitlement = 282,
HasQuestSession = 283,
HasEntitlement = 282, // NYI
HasQuestSession = 283, // NYI
//Unk284 = 284,
//Unk285 = 285,
//Unk286 = 286,
//Unk287 = 287,
Covenant = 288,
//Unk289 = 289, // Related To Pvp Ranking
PermanentAnimaDiversionTalent = 290, // NYI
Soulbind = 291,
//Unk292 = 292,
SourceAreaOrZoneInGroup = 293,
//Unk294 = 294,
//Unk295 = 295,
//Unk296 = 296,
//Unk297 = 297,
//Unk298 = 298,
//Unk299 = 299,
SourceInSpecificChromieTime = 300,
SourceInAnyChromieTime = 301,
//Unk302 = 302,
SourceRuneforgeLegendaryKnown = 303,
//Unk304 = 304,
//Unk305 = 305,
//Unk306 = 306,
SoulbindConduitRank = 307, // NYI
ShapeshiftFormCustomizationDisplay = 308,
SoulbindMinConduitsAtRank = 309, // NYI
IsRestrictedAccount = 310, // NYI
SourceFlying = 311,
}
public enum CriteriaFlags
@@ -628,7 +654,21 @@ namespace Framework.Constants
ReachAccountHonorLevel = 213,
HeartOfAzerothArtifactPowerEarned = 214,
HeartOfAzerothLevelReached = 215,
TotalTypes = 219
MythicKeystoneCompleted = 216, // NYI
// 217 - 0 Criterias
CompleteQuestAccumulate = 218,
BoughtItemFromVendor = 219,
SoldItemToVendor = 220,
// 221 - 0 Criterias
// 222 - 0 Criterias
// 223 - 0 Criterias
// 224 - 0 Criterias
TravelledToArea = 225,
// 226 - 0 Criterias
// 227 - 0 Criterias
ApplyConduit = 228,
ConvertItemsToCurrency = 229,
TotalTypes = 230
}
public enum CriteriaDataType
+2 -1
View File
@@ -91,7 +91,8 @@ namespace Framework.Constants
Defense = 0x10000, // Localdefense, Worlddefense
GuildReq = 0x20000, // Guildrecruitment
Lfg = 0x40000, // Lfg
Unk1 = 0x80000 // General
Unk1 = 0x80000, // General
NoClientJoin = 0x200000
}
public enum ChannelMemberFlags
+43 -19
View File
@@ -938,7 +938,7 @@ namespace Framework.Constants
public enum AzeriteTierUnlockSetFlags
{
Default = 0x1
Default = 0x01
}
public enum BattlegroundBracketId // bracketId for level ranges
@@ -948,26 +948,14 @@ namespace Framework.Constants
Max
}
public enum CharBaseSectionVariation : byte
public enum ChrCustomizationOptionFlag
{
Skin = 0,
Face = 1,
FacialHair = 2,
Hair = 3,
Underwear = 4,
CustomDisplay1 = 5,
CustomDisplay2 = 6,
CustomDisplay3 = 7,
Max
Disabled = 0x04
}
public enum CharSectionFlags
public enum ChrCustomizationReqFlag
{
Player = 0x01,
DeathKnight = 0x04,
DemonHunter = 0x20,
Conditional = 0x400
HasRequirements = 0x01
}
public enum CharSectionType
@@ -992,7 +980,7 @@ namespace Framework.Constants
Max
}
public enum BattlemasterListFlags : sbyte
public enum BattlemasterListFlags : int
{
Disabled = 0x01,
SkipRoleCheck = 0x02,
@@ -1014,6 +1002,20 @@ namespace Framework.Constants
Recommended = 0x40,
}
public enum ContentTuningCalcType
{
Base = 0,
PlusOne = 1,
PlusMaxLevelForExpansion = 2
}
public enum ContentTuningFlag
{
DisabledForItem = 0x04,
Horde = 0x8,
Alliance = 0x10
}
public enum Curves
{
ArtifactRelicItemLevelBonus = 1718,
@@ -1852,12 +1854,34 @@ namespace Framework.Constants
CreatureSpellDamage = 9
}
public enum UiMapFlag
{
None = 0x00,
NoHighlight = 0x01,
ShowOverlays = 0x02,
ShowTaxiNodes = 0x04,
GarrisonMap = 0x08,
FallbackToParentMap = 0x10,
NoHighlightTexture = 0x20,
ShowTaskObjectives = 0x40,
NoWorldPositions = 0x80,
HideArchaeologyDigs = 0x100,
Deprecated = 0x200,
HideIcons = 0x400,
HideVignettes = 0x800,
ForceAllOverlayExplored = 0x1000,
FlightMapShowZoomOut = 0x2000,
FlightMapAutoZoom = 0x4000,
ForceOnNavbar = 0x8000
}
public enum UiMapSystem : sbyte
{
World = 0,
Taxi = 1,
Adventure = 2,
Max = 3
SystemMinimap = 3,
Max
}
public enum UiMapType
@@ -17,7 +17,7 @@
namespace Framework.Constants
{
public enum GameObjectTypes : byte
public enum GameObjectTypes : int
{
Door = 0,
Button = 1,
+13 -24
View File
@@ -78,42 +78,27 @@ namespace Framework.Constants
ItemModifier.TransmogAppearanceSpec1,
ItemModifier.TransmogAppearanceSpec2,
ItemModifier.TransmogAppearanceSpec3,
ItemModifier.TransmogAppearanceSpec4
ItemModifier.TransmogAppearanceSpec4,
ItemModifier.TransmogAppearanceSpec5
};
public const ulong AppearanceModifierMaskSpecSpecific =
(1ul << (int)ItemModifier.TransmogAppearanceSpec1) |
(1ul << (int)ItemModifier.TransmogAppearanceSpec2) |
(1ul << (int)ItemModifier.TransmogAppearanceSpec3) |
(1ul << (int)ItemModifier.TransmogAppearanceSpec4);
public static ItemModifier[] IllusionModifierSlotBySpec =
{
ItemModifier.EnchantIllusionSpec1,
ItemModifier.EnchantIllusionSpec2,
ItemModifier.EnchantIllusionSpec3,
ItemModifier.EnchantIllusionSpec4
ItemModifier.EnchantIllusionSpec4,
ItemModifier.EnchantIllusionSpec5
};
public const ulong IllusionModifierMaskSpecSpecific =
(1ul << (int)ItemModifier.EnchantIllusionSpec1) |
(1ul << (int)ItemModifier.EnchantIllusionSpec2) |
(1ul << (int)ItemModifier.EnchantIllusionSpec3) |
(1ul << (int)ItemModifier.EnchantIllusionSpec4);
public static ItemModifier[] SecondaryAppearanceModifierSlotBySpec =
{
ItemModifier.TransmogSecondaryAppearanceSpec1,
ItemModifier.TransmogSecondaryAppearanceSpec2,
ItemModifier.TransmogSecondaryAppearanceSpec3,
ItemModifier.TransmogSecondaryAppearanceSpec4
ItemModifier.TransmogSecondaryAppearanceSpec4,
ItemModifier.TransmogSecondaryAppearanceSpec5
};
public const ulong SecondaryAppearanceModifierMaskSpecSpecific =
(1ul << (int)ItemModifier.TransmogSecondaryAppearanceSpec1) |
(1ul << (int)ItemModifier.TransmogSecondaryAppearanceSpec2) |
(1ul << (int)ItemModifier.TransmogSecondaryAppearanceSpec3) |
(1ul << (int)ItemModifier.TransmogSecondaryAppearanceSpec4);
}
public struct InventorySlots
@@ -219,8 +204,8 @@ namespace Framework.Constants
CritSpellRating = 21,
Corruption = 22,
CorruptionResistance = 23,
HitTakenSpellRating = 24,
CritTakenMeleeRating = 25,
ModifiedCraftingStat1 = 24,
ModifiedCraftingStat2 = 25,
CritTakenRangedRating = 26,
CritTakenSpellRating = 27,
HasteMeleeRating = 28,
@@ -356,7 +341,7 @@ namespace Framework.Constants
ItemLevel = 1,
Stat = 2,
Quality = 3,
Description = 4,
NameSubtitle = 4, // Text under name
Suffix = 5,
Socket = 6,
Appearance = 7,
@@ -376,6 +361,10 @@ namespace Framework.Constants
OverrideCanDisenchant = 21,
OverrideCanScrap = 22,
ItemEffectId = 23,
ModifiedCraftingStat = 25,
RequiredLevelCurve = 27,
DescriptionText = 30, // Item Description
OverrideName = 31, // Itemnamedescription Id
}
public enum ItemContext : byte
@@ -1141,7 +1141,7 @@ namespace Framework.Constants
GameObjectPlaySpellVisualKit = 0x2c4a,
GameObjectResetState = 0x2723,
GameObjectSetStateLocal = 0x2806,
GameObjectUiLink = 0x271f,
GameObjectUILink = 0x271f,
GameSpeedSet = 0x267f,
GameTimeSet = 0x2711,
GameTimeUpdate = 0x2710,
+5 -2
View File
@@ -21,12 +21,15 @@ namespace Framework.Constants
{
public struct PlayerConst
{
public const Expansion CurrentExpansion = Expansion.ShadowLands;
public const int MaxTalentTiers = 7;
public const int MaxTalentColumns = 3;
public const int MaxTalentRank = 5;
public const int MaxPvpTalentSlots = 4;
public const int MinSpecializationLevel = 10;
public const int MaxSpecializations = 4;
public const int MaxSpecializations = 5;
public const int InitialSpecializationIndex = 4;
public const int MaxMasterySpells = 2;
public const int ReqPrimaryTreeTalents = 31;
@@ -42,7 +45,7 @@ namespace Framework.Constants
public const uint infinityCooldownDelayCheck = Time.Month / 2;
public const int MaxPlayerSummonDelay = 2 * Time.Minute;
public const int TaxiMaskSize = 319;
public const int TaxiMaskSize = 336;
// corpse reclaim times
public const int DeathExpireStep = (5 * Time.Minute);
+4 -6
View File
@@ -34,8 +34,8 @@ namespace Framework.Constants
public const int MaxHolidayDurations = 10;
public const int MaxHolidayDates = 26;
public const int MaxHolidayFlags = 10;
public const int DefaultMaxLevel = 120;
public const int MaxLevel = 120;
public const int DefaultMaxLevel = 60;
public const int MaxLevel = 123;
public const int StrongMaxLevel = 255;
public const int MaxOverrideSpell = 10;
public const int MaxWorldMapOverlayArea = 4;
@@ -48,7 +48,7 @@ namespace Framework.Constants
/// <summary>
/// BattlePets Const
/// </summary>
public const int MaxBattlePetSpeciesId = 2873;
public const int MaxBattlePetSpeciesId = 3084;
public const int MaxPetBattleSlots = 3;
public const int MaxBattlePetsPerSpecies = 3;
public const int BattlePetCageItemId = 82800;
@@ -587,9 +587,8 @@ namespace Framework.Constants
WarlordsOfDraenor = 5,
Legion = 6,
BattleForAzeroth = 7,
Max,
ShadowLands = 8,
Max,
MaxAccountExpansions
}
@@ -1140,7 +1139,6 @@ namespace Framework.Constants
DeathCorpseReclaimDelayPvp,
DeathSicknessLevel,
DeclinedNamesUsed,
DemonHuntersPerRealm,
DetectPosCollision,
DieCommandMode,
DisableBreathing,
@@ -515,6 +515,16 @@ namespace Framework.Constants
Unk491 = 491,
Unk492 = 492,
Unk493 = 493,
SetPowerPointCharge = 494, // NYI
TriggerSpellOnExpire = 495, // NYI
AllowChangingEquipmentInTorghast = 496, // NYI
ModAnimaGain = 497, // NYI
CurrencyLossPctOnDeath = 498, // NYI
ModRestedXpConsumption = 499,
IgnoreSpellChargeCooldown = 500, // NYI
ModCriticalDamageTakenFromCaster = 501,
ModVersatilityDamageDoneBenefit = 502, // NYI
ModVersatilityHealingDoneBenefit = 503, // NYI
Total
}
@@ -1852,6 +1852,10 @@ namespace Framework.Constants
Unk21 = 0x200000, // 21
Unk22 = 0x400000, // 22
Unk23 = 0x800000 // 23
}
public enum SpellAttr14
{
}
public enum SpellCustomAttributes
{
@@ -2156,6 +2160,18 @@ namespace Framework.Constants
UpgradeItem = 269,
Unk270 = 270,
ApplyAreaAuraPartyNonrandom = 271,
SetCovenant = 272,
CraftRuneforgeLegendary = 273,
Unk274 = 274,
Unk275 = 275,
LearnTransmogIllusion = 276,
SetChromieTime = 277,
Unk278 = 278,
LearnGarrTalent = 279,
Unk280 = 280,
LearnSoulbindConduit = 281,
ConvertItemsToCurrency = 282,
Unk283 = 283,
TotalSpellEffects
}
@@ -2463,6 +2479,7 @@ namespace Framework.Constants
Unk148 = 148,
Unk149 = 149,
UnitOwnCritter = 150, // own battle pet from UNIT_FIELD_CRITTER
Unk151 = 151,
TotalSpellTargets
}
public enum SpellTargetSelectionCategories
@@ -47,24 +47,29 @@ namespace Framework.Database
PrepareStatement(CharStatements.SEL_MAIL_LIST_INFO, "SELECT id, sender, (SELECT name FROM characters WHERE guid = sender) AS sendername, receiver, (SELECT name FROM characters WHERE guid = receiver) AS receivername, " +
"subject, deliver_time, expire_time, money, has_items FROM mail WHERE receiver = ? ");
PrepareStatement(CharStatements.SEL_MAIL_LIST_ITEMS, "SELECT itemEntry,count FROM item_instance WHERE guid = ?");
PrepareStatement(CharStatements.SEL_ENUM, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.skin, c.face, c.hairStyle, c.hairColor, c.facialStyle, c.customDisplay1, c.customDisplay2, c.customDisplay3, c.level, c.zone, c.map, c.position_x, c.position_y, c.position_z, " +
PrepareStatement(CharStatements.SEL_ENUM, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.level, c.zone, c.map, c.position_x, c.position_y, c.position_z, " +
"gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid, c.slot, c.logout_time, c.activeTalentGroup, c.lastLoginBuild " +
"FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? LEFT JOIN guild_member AS gm ON c.guid = gm.guid " +
"LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.account = ? AND c.deleteInfos_Name IS NULL");
PrepareStatement(CharStatements.SEL_ENUM_DECLINED_NAME, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.skin, c.face, c.hairStyle, c.hairColor, c.facialStyle, c.customDisplay1, c.customDisplay2, c.customDisplay3, c.level, c.zone, c.map, " +
PrepareStatement(CharStatements.SEL_ENUM_DECLINED_NAME, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.level, c.zone, c.map, " +
"c.position_x, c.position_y, c.position_z, gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, " +
"cb.guid, c.slot, c.logout_time, c.activeTalentGroup, c.lastLoginBuild, cd.genitive FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? " +
"LEFT JOIN character_declinedname AS cd ON c.guid = cd.guid LEFT JOIN guild_member AS gm ON c.guid = gm.guid " +
"LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.account = ? AND c.deleteInfos_Name IS NULL");
PrepareStatement(CharStatements.SEL_UNDELETE_ENUM, "SELECT c.guid, c.deleteInfos_Name, c.race, c.class, c.gender, c.skin, c.face, c.hairStyle, c.hairColor, c.facialStyle, c.customDisplay1, c.customDisplay2, c.customDisplay3, c.level, c.zone, c.map, c.position_x, c.position_y, c.position_z, " +
PrepareStatement(CharStatements.SEL_ENUM_CUSTOMIZATIONS, "SELECT cc.guid, cc.chrCustomizationOptionID, cc.chrCustomizationChoiceID FROM character_customizations cc " +
"LEFT JOIN characters c ON cc.guid = c.guid WHERE c.account = ? AND c.deleteInfos_Name IS NULL ORDER BY cc.guid, cc.chrCustomizationOptionID");
PrepareStatement(CharStatements.SEL_UNDELETE_ENUM, "SELECT c.guid, c.deleteInfos_Name, c.race, c.class, c.gender, c.level, c.zone, c.map, c.position_x, c.position_y, c.position_z, " +
"gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid, c.slot, c.logout_time, c.activeTalentGroup, c.lastLoginBuild " +
"FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? LEFT JOIN guild_member AS gm ON c.guid = gm.guid " +
"LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.deleteInfos_Account = ? AND c.deleteInfos_Name IS NOT NULL");
PrepareStatement(CharStatements.SEL_UNDELETE_ENUM_DECLINED_NAME, "SELECT c.guid, c.deleteInfos_Name, c.race, c.class, c.gender, c.skin, c.face, c.hairStyle, c.hairColor, c.facialStyle, c.customDisplay1, c.customDisplay2, c.customDisplay3, c.level, c.zone, c.map, " +
PrepareStatement(CharStatements.SEL_UNDELETE_ENUM_DECLINED_NAME, "SELECT c.guid, c.deleteInfos_Name, c.race, c.class, c.gender, c.level, c.zone, c.map, " +
"c.position_x, c.position_y, c.position_z, gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, " +
"cb.guid, c.slot, c.logout_time, c.activeTalentGroup, c.lastLoginBuild, cd.genitive FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? " +
"LEFT JOIN character_declinedname AS cd ON c.guid = cd.guid LEFT JOIN guild_member AS gm ON c.guid = gm.guid " +
"LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.deleteInfos_Account = ? AND c.deleteInfos_Name IS NOT NULL");
PrepareStatement(CharStatements.SEL_UNDELETE_ENUM_CUSTOMIZATIONS, "SELECT cc.guid, cc.chrCustomizationOptionID, cc.chrCustomizationChoiceID FROM character_customizations cc " +
"LEFT JOIN characters c ON cc.guid = c.guid WHERE c.deleteInfos_Account = ? AND c.deleteInfos_Name IS NOT NULL ORDER BY cc.guid, cc.chrCustomizationOptionID");
PrepareStatement(CharStatements.SEL_FREE_NAME, "SELECT name, at_login FROM characters WHERE guid = ? AND NOT EXISTS (SELECT NULL FROM characters WHERE name = ?)");
PrepareStatement(CharStatements.SEL_CHAR_ZONE, "SELECT zone FROM characters WHERE guid = ?");
PrepareStatement(CharStatements.SEL_CHAR_POSITION_XYZ, "SELECT map, position_x, position_y, position_z FROM characters WHERE guid = ?");
@@ -74,13 +79,14 @@ namespace Framework.Database
PrepareStatement(CharStatements.DEL_BATTLEGROUND_RANDOM, "DELETE FROM character_battleground_random WHERE guid = ?");
PrepareStatement(CharStatements.INS_BATTLEGROUND_RANDOM, "INSERT INTO character_battleground_random (guid) VALUES (?)");
PrepareStatement(CharStatements.SEL_CHARACTER, "SELECT c.guid, account, name, race, class, gender, level, xp, money, skin, face, hairStyle, hairColor, facialStyle, customDisplay1, customDisplay2, customDisplay3, inventorySlots, bankSlots, restState, playerFlags, playerFlagsEx, " +
PrepareStatement(CharStatements.SEL_CHARACTER, "SELECT c.guid, account, name, race, class, gender, level, xp, money, inventorySlots, bankSlots, restState, playerFlags, playerFlagsEx, " +
"position_x, position_y, position_z, map, orientation, taximask, cinematic, totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, " +
"resettalents_time, primarySpecialization, trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, stable_slots, at_login, zone, online, death_expire_time, taxi_path, dungeonDifficulty, " +
"totalKills, todayKills, yesterdayKills, chosenTitle, watchedFaction, drunk, health, power1, power2, power3, power4, power5, power6, instance_id, activeTalentGroup, lootSpecId, exploredZones, " +
"knownTitles, actionBars, raidDifficulty, legacyRaidDifficulty, fishingSteps, honor, honorLevel, honorRestState, honorRestBonus, numRespecs " +
"FROM characters c LEFT JOIN character_fishingsteps cfs ON c.guid = cfs.guid WHERE c.guid = ?");
PrepareStatement(CharStatements.SEL_CHARACTER_CUSTOMIZATIONS, "SELECT chrCustomizationOptionID, chrCustomizationChoiceID FROM character_customizations WHERE guid = ? ORDER BY chrCustomizationOptionID");
PrepareStatement(CharStatements.SEL_GROUP_MEMBER, "SELECT guid FROM group_member WHERE memberGuid = ?");
PrepareStatement(CharStatements.SEL_CHARACTER_INSTANCE, "SELECT id, permanent, map, difficulty, extendState, resettime, entranceId FROM character_instance LEFT JOIN instance ON instance = id WHERE guid = ?");
PrepareStatement(CharStatements.SEL_CHARACTER_AURAS, "SELECT casterGuid, itemGuid, spell, effectMask, recalculateMask, difficulty, stackCount, maxDuration, remainTime, remainCharges, castItemId, castItemLevel FROM character_aura WHERE guid = ?");
@@ -411,13 +417,16 @@ namespace Framework.Database
PrepareStatement(CharStatements.DEL_PLAYER_HOMEBIND, "DELETE FROM character_homebind WHERE guid = ?");
// Corpse
PrepareStatement(CharStatements.SEL_CORPSES, "SELECT posX, posY, posZ, orientation, mapId, displayId, itemCache, bytes1, bytes2, flags, dynFlags, time, corpseType, instanceId, guid FROM corpse WHERE mapId = ? AND instanceId = ?");
PrepareStatement(CharStatements.INS_CORPSE, "INSERT INTO corpse (guid, posX, posY, posZ, orientation, mapId, displayId, itemCache, bytes1, bytes2, flags, dynFlags, time, corpseType, instanceId) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
PrepareStatement(CharStatements.SEL_CORPSES, "SELECT posX, posY, posZ, orientation, mapId, displayId, itemCache, race, gender, flags, dynFlags, time, corpseType, instanceId, guid FROM corpse WHERE mapId = ? AND instanceId = ?");
PrepareStatement(CharStatements.INS_CORPSE, "INSERT INTO corpse (guid, posX, posY, posZ, orientation, mapId, displayId, itemCache, race, gender, flags, dynFlags, time, corpseType, instanceId) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
PrepareStatement(CharStatements.DEL_CORPSE, "DELETE FROM corpse WHERE guid = ?");
PrepareStatement(CharStatements.DEL_CORPSES_FROM_MAP, "DELETE cp, c FROM corpse_phases cp INNER JOIN corpse c ON cp.OwnerGuid = c.guid WHERE c.mapId = ? AND c.instanceId = ?");
PrepareStatement(CharStatements.SEL_CORPSE_PHASES, "SELECT cp.OwnerGuid, cp.PhaseId FROM corpse_phases cp LEFT JOIN corpse c ON cp.OwnerGuid = c.guid WHERE c.mapId = ? AND c.instanceId = ?");
PrepareStatement(CharStatements.INS_CORPSE_PHASES, "INSERT INTO corpse_phases (OwnerGuid, PhaseId) VALUES (?, ?)");
PrepareStatement(CharStatements.DEL_CORPSE_PHASES, "DELETE FROM corpse_phases WHERE OwnerGuid = ?");
PrepareStatement(CharStatements.SEL_CORPSE_CUSTOMIZATIONS, "SELECT cc.ownerGuid, cc.chrCustomizationOptionID, cc.chrCustomizationChoiceID FROM corpse_customizations cc LEFT JOIN corpse c ON cc.ownerGuid = c.guid WHERE c.mapId = ? AND c.instanceId = ? ORDER BY cc.ownerGuid, cc.chrCustomizationOptionID");
PrepareStatement(CharStatements.INS_CORPSE_CUSTOMIZATIONS, "INSERT INTO corpse_customizations (ownerGuid, chrCustomizationOptionID, chrCustomizationChoiceID) VALUES (?, ?, ?)");
PrepareStatement(CharStatements.DEL_CORPSE_CUSTOMIZATIONS, "DELETE FROM corpse_customizations WHERE ownerGuid = ?");
PrepareStatement(CharStatements.SEL_CORPSE_LOCATION, "SELECT mapId, posX, posY, posZ, orientation FROM corpse WHERE guid = ?");
// Creature respawn
@@ -459,13 +468,13 @@ namespace Framework.Database
PrepareStatement(CharStatements.DEL_LFG_DATA, "DELETE FROM lfg_data WHERE guid = ?");
// Player saving
PrepareStatement(CharStatements.INS_CHARACTER, "INSERT INTO characters (guid, account, name, race, class, gender, level, xp, money, skin, face, hairStyle, hairColor, facialStyle, customDisplay1, customDisplay2, customDisplay3, inventorySlots, bankSlots, restState, playerFlags, playerFlagsEx, " +
PrepareStatement(CharStatements.INS_CHARACTER, "INSERT INTO characters (guid, account, name, race, class, gender, level, xp, money, inventorySlots, bankSlots, restState, playerFlags, playerFlagsEx, " +
"map, instance_id, dungeonDifficulty, raidDifficulty, legacyRaidDifficulty, position_x, position_y, position_z, orientation, trans_x, trans_y, trans_z, trans_o, transguid, " +
"taximask, cinematic, totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, resettalents_time, primarySpecialization, " +
"extra_flags, stable_slots, at_login, zone, death_expire_time, taxi_path, totalKills, todayKills, yesterdayKills, chosenTitle, watchedFaction, drunk, health, power1, power2, power3, " +
"power4, power5, power6, latency, activeTalentGroup, lootSpecId, exploredZones, equipmentCache, knownTitles, actionBars, lastLoginBuild) VALUES " +
"(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
PrepareStatement(CharStatements.UPD_CHARACTER, "UPDATE characters SET name=?,race=?,class=?,gender=?,level=?,xp=?,money=?,skin=?,face=?,hairStyle=?,hairColor=?,facialStyle=?,customDisplay1=?,customDisplay2=?,customDisplay3=?,inventorySlots=?,bankSlots=?,restState=?,playerFlags=?,playerFlagsEx=?," +
"(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
PrepareStatement(CharStatements.UPD_CHARACTER, "UPDATE characters SET name=?,race=?,class=?,gender=?,level=?,xp=?,money=?,inventorySlots=?,bankSlots=?,restState=?,playerFlags=?,playerFlagsEx=?," +
"map=?,instance_id=?,dungeonDifficulty=?,raidDifficulty=?,legacyRaidDifficulty=?,position_x=?,position_y=?,position_z=?,orientation=?,trans_x=?,trans_y=?,trans_z=?,trans_o=?,transguid=?,taximask=?,cinematic=?,totaltime=?,leveltime=?,rest_bonus=?," +
"logout_time=?,is_logout_resting=?,resettalents_cost=?,resettalents_time=?,numRespecs=?,primarySpecialization=?,extra_flags=?,stable_slots=?,at_login=?,zone=?,death_expire_time=?,taxi_path=?," +
"totalKills=?,todayKills=?,yesterdayKills=?,chosenTitle=?," +
@@ -479,6 +488,8 @@ namespace Framework.Database
PrepareStatement(CharStatements.UPD_PETITION_NAME, "UPDATE petition SET name = ? WHERE petitionguid = ?");
PrepareStatement(CharStatements.INS_PETITION_SIGNATURE, "INSERT INTO petition_sign (ownerguid, petitionguid, playerguid, player_account) VALUES (?, ?, ?, ?)");
PrepareStatement(CharStatements.UPD_ACCOUNT_ONLINE, "UPDATE characters SET online = 0 WHERE account = ?");
PrepareStatement(CharStatements.INS_CHARACTER_CUSTOMIZATION, "INSERT INTO character_customizations (guid, chrCustomizationOptionID, chrCustomizationChoiceID) VALUES (?, ?, ?)");
PrepareStatement(CharStatements.DEL_CHARACTER_CUSTOMIZATIONS, "DELETE FROM character_customizations WHERE guid = ?");
PrepareStatement(CharStatements.INS_GROUP, "INSERT INTO groups (guid, leaderGuid, lootMethod, looterGuid, lootThreshold, icon1, icon2, icon3, icon4, icon5, icon6, icon7, icon8, groupType, difficulty, raidDifficulty, legacyRaidDifficulty, masterLooterGuid) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
PrepareStatement(CharStatements.INS_GROUP_MEMBER, "INSERT INTO group_member (guid, memberGuid, memberFlags, subgroup, roles) VALUES(?, ?, ?, ?, ?)");
PrepareStatement(CharStatements.DEL_GROUP_MEMBER, "DELETE FROM group_member WHERE memberGuid = ?");
@@ -513,7 +524,6 @@ namespace Framework.Database
PrepareStatement(CharStatements.DEL_CHAR_INSTANCE_BY_INSTANCE_GUID, "DELETE FROM character_instance WHERE guid = ? AND instance = ?");
PrepareStatement(CharStatements.UPD_CHAR_INSTANCE, "UPDATE character_instance SET instance = ?, permanent = ?, extendState = ? WHERE guid = ? AND instance = ?");
PrepareStatement(CharStatements.INS_CHAR_INSTANCE, "INSERT INTO character_instance (guid, instance, permanent, extendState) VALUES (?, ?, ?, ?)");
PrepareStatement(CharStatements.UPD_GENDER_AND_APPEARANCE, "UPDATE characters SET gender = ?, skin = ?, face = ?, hairStyle = ?, hairColor = ?, facialStyle = ?, customDisplay1 = ?, customDisplay2 = ?, customDisplay3 = ? WHERE guid = ?");
PrepareStatement(CharStatements.DEL_CHARACTER_SKILL, "DELETE FROM character_skills WHERE guid = ? AND skill = ?");
PrepareStatement(CharStatements.UPD_CHARACTER_SOCIAL_FLAGS, "UPDATE character_social SET flags = ? WHERE guid = ? AND friend = ?");
PrepareStatement(CharStatements.INS_CHARACTER_SOCIAL, "INSERT INTO character_social (guid, friend, flags) VALUES (?, ?, ?)");
@@ -808,8 +818,10 @@ namespace Framework.Database
SEL_MAIL_LIST_ITEMS,
SEL_ENUM,
SEL_ENUM_DECLINED_NAME,
SEL_ENUM_CUSTOMIZATIONS,
SEL_UNDELETE_ENUM,
SEL_UNDELETE_ENUM_DECLINED_NAME,
SEL_UNDELETE_ENUM_CUSTOMIZATIONS,
SEL_FREE_NAME,
SEL_CHAR_ZONE,
SEL_CHAR_POSITION_XYZ,
@@ -820,6 +832,7 @@ namespace Framework.Database
INS_BATTLEGROUND_RANDOM,
SEL_CHARACTER,
SEL_CHARACTER_CUSTOMIZATIONS,
SEL_GROUP_MEMBER,
SEL_CHARACTER_INSTANCE,
SEL_CHARACTER_AURAS,
@@ -1094,6 +1107,9 @@ namespace Framework.Database
SEL_CORPSE_PHASES,
INS_CORPSE_PHASES,
DEL_CORPSE_PHASES,
SEL_CORPSE_CUSTOMIZATIONS,
INS_CORPSE_CUSTOMIZATIONS,
DEL_CORPSE_CUSTOMIZATIONS,
SEL_CORPSE_LOCATION,
SEL_CREATURE_RESPAWNS,
@@ -1135,6 +1151,8 @@ namespace Framework.Database
UPD_PETITION_NAME,
INS_PETITION_SIGNATURE,
UPD_ACCOUNT_ONLINE,
INS_CHARACTER_CUSTOMIZATION,
DEL_CHARACTER_CUSTOMIZATIONS,
INS_GROUP,
INS_GROUP_MEMBER,
DEL_GROUP_MEMBER,
@@ -1169,7 +1187,6 @@ namespace Framework.Database
DEL_CHAR_INSTANCE_BY_INSTANCE_GUID,
UPD_CHAR_INSTANCE,
INS_CHAR_INSTANCE,
UPD_GENDER_AND_APPEARANCE,
DEL_CHARACTER_SKILL,
UPD_CHARACTER_SOCIAL_FLAGS,
INS_CHARACTER_SOCIAL,
@@ -23,7 +23,7 @@ namespace Framework.Database
{
// Achievement.db2
PrepareStatement(HotfixStatements.SEL_ACHIEVEMENT, "SELECT Description, Title, Reward, ID, InstanceID, Faction, Supercedes, Category, MinimumCriteria, " +
"Points, Flags, UiOrder, IconFileID, RewardItemID, CriteriaTree, SharesCriteria FROM achievement");
"Points, Flags, UiOrder, IconFileID, RewardItemID, CriteriaTree, SharesCriteria, CovenantID FROM achievement");
PrepareStatement(HotfixStatements.SEL_ACHIEVEMENT_LOCALE, "SELECT ID, Description_lang, Title_lang, Reward_lang FROM achievement_locale WHERE locale = ?");
// AnimationData.db2
@@ -37,8 +37,8 @@ namespace Framework.Database
// AreaTable.db2
PrepareStatement(HotfixStatements.SEL_AREA_TABLE, "SELECT ID, ZoneName, AreaName, ContinentID, ParentAreaID, AreaBit, SoundProviderPref, " +
"SoundProviderPrefUnderwater, AmbienceID, UwAmbience, ZoneMusic, UwZoneMusic, ExplorationLevel, IntroSound, UwIntroSound, FactionGroupMask, " +
"AmbientMultiplier, MountFlags, PvpCombatWorldStateID, WildBattlePetLevelMin, WildBattlePetLevelMax, WindSettingsID, Flags1, Flags2, " +
"SoundProviderPrefUnderwater, AmbienceID, UwAmbience, ZoneMusic, UwZoneMusic, IntroSound, UwIntroSound, FactionGroupMask, AmbientMultiplier, " +
"MountFlags, PvpCombatWorldStateID, WildBattlePetLevelMin, WildBattlePetLevelMax, WindSettingsID, ContentTuningID, Flags1, Flags2, " +
"LiquidTypeID1, LiquidTypeID2, LiquidTypeID3, LiquidTypeID4 FROM area_table");
PrepareStatement(HotfixStatements.SEL_AREA_TABLE_LOCALE, "SELECT ID, AreaName_lang FROM area_table_locale WHERE locale = ?");
@@ -47,8 +47,7 @@ namespace Framework.Database
"BoxWidth, BoxHeight, BoxYaw, ShapeType, ShapeID, AreaTriggerActionSetID, Flags FROM area_trigger");
// ArmorLocation.db2
PrepareStatement(HotfixStatements.SEL_ARMOR_LOCATION, "SELECT ID, Clothmodifier, Leathermodifier, Chainmodifier, Platemodifier, Modifier FROM armor_location" +
"");
PrepareStatement(HotfixStatements.SEL_ARMOR_LOCATION, "SELECT ID, Clothmodifier, Leathermodifier, Chainmodifier, Platemodifier, Modifier FROM armor_location");
// Artifact.db2
PrepareStatement(HotfixStatements.SEL_ARTIFACT, "SELECT Name, ID, UiTextureKitID, UiNameColor, UiBarOverlayColor, UiBarBackgroundColor, " +
@@ -93,8 +92,7 @@ namespace Framework.Database
"MinimumEmpowerKnowledge FROM artifact_tier");
// ArtifactUnlock.db2
PrepareStatement(HotfixStatements.SEL_ARTIFACT_UNLOCK, "SELECT ID, PowerID, PowerRank, ItemBonusListID, PlayerConditionID, ArtifactID FROM artifact_unlock" +
"");
PrepareStatement(HotfixStatements.SEL_ARTIFACT_UNLOCK, "SELECT ID, PowerID, PowerRank, ItemBonusListID, PlayerConditionID, ArtifactID FROM artifact_unlock");
// AuctionHouse.db2
PrepareStatement(HotfixStatements.SEL_AUCTION_HOUSE, "SELECT ID, Name, FactionID, DepositRate, ConsignmentRate FROM auction_house");
@@ -147,25 +145,22 @@ namespace Framework.Database
PrepareStatement(HotfixStatements.SEL_BANNED_ADDONS, "SELECT ID, Name, Version, Flags FROM banned_addons");
// BarberShopStyle.db2
PrepareStatement(HotfixStatements.SEL_BARBER_SHOP_STYLE, "SELECT DisplayName, Description, ID, Type, CostModifier, Race, Sex, Data FROM barber_shop_style" +
"");
PrepareStatement(HotfixStatements.SEL_BARBER_SHOP_STYLE, "SELECT DisplayName, Description, ID, Type, CostModifier, Race, Sex, Data FROM barber_shop_style");
PrepareStatement(HotfixStatements.SEL_BARBER_SHOP_STYLE_LOCALE, "SELECT ID, DisplayName_lang, Description_lang FROM barber_shop_style_locale WHERE locale = ?");
// BattlePetBreedQuality.db2
PrepareStatement(HotfixStatements.SEL_BATTLE_PET_BREED_QUALITY, "SELECT ID, StateMultiplier, QualityEnum FROM battle_pet_breed_quality");
// BattlePetBreedState.db2
PrepareStatement(HotfixStatements.SEL_BATTLE_PET_BREED_STATE, "SELECT ID, BattlePetStateID, Value, BattlePetBreedID FROM battle_pet_breed_state" +
"");
PrepareStatement(HotfixStatements.SEL_BATTLE_PET_BREED_STATE, "SELECT ID, BattlePetStateID, Value, BattlePetBreedID FROM battle_pet_breed_state");
// BattlePetSpecies.db2
PrepareStatement(HotfixStatements.SEL_BATTLE_PET_SPECIES, "SELECT Description, SourceText, ID, CreatureID, SummonSpellID, IconFileDataID, PetTypeEnum, " +
"Flags, SourceTypeEnum, CardUIModelSceneID, LoadoutUIModelSceneID FROM battle_pet_species");
"Flags, SourceTypeEnum, CardUIModelSceneID, LoadoutUIModelSceneID, CovenantID FROM battle_pet_species");
PrepareStatement(HotfixStatements.SEL_BATTLE_PET_SPECIES_LOCALE, "SELECT ID, Description_lang, SourceText_lang FROM battle_pet_species_locale WHERE locale = ?");
// BattlePetSpeciesState.db2
PrepareStatement(HotfixStatements.SEL_BATTLE_PET_SPECIES_STATE, "SELECT ID, BattlePetStateID, Value, BattlePetSpeciesID FROM battle_pet_species_state" +
"");
PrepareStatement(HotfixStatements.SEL_BATTLE_PET_SPECIES_STATE, "SELECT ID, BattlePetStateID, Value, BattlePetSpeciesID FROM battle_pet_species_state");
// BattlemasterList.db2
PrepareStatement(HotfixStatements.SEL_BATTLEMASTER_LIST, "SELECT ID, Name, GameType, ShortDescription, LongDescription, InstanceType, MinLevel, MaxLevel, " +
@@ -183,54 +178,82 @@ namespace Framework.Database
// CfgRegions.db2
PrepareStatement(HotfixStatements.SEL_CFG_REGIONS, "SELECT ID, Tag, RegionID, Raidorigin, RegionGroupMask, ChallengeOrigin FROM cfg_regions");
// CharacterFacialHairStyles.db2
PrepareStatement(HotfixStatements.SEL_CHARACTER_FACIAL_HAIR_STYLES, "SELECT ID, Geoset1, Geoset2, Geoset3, Geoset4, Geoset5, RaceID, SexID, VariationID" +
" FROM character_facial_hair_styles");
// CharBaseSection.db2
PrepareStatement(HotfixStatements.SEL_CHAR_BASE_SECTION, "SELECT ID, LayoutResType, VariationEnum, ResolutionVariationEnum FROM char_base_section" +
"");
// CharSections.db2
PrepareStatement(HotfixStatements.SEL_CHAR_SECTIONS, "SELECT ID, RaceID, SexID, BaseSection, VariationIndex, ColorIndex, Flags, MaterialResourcesID1, " +
"MaterialResourcesID2, MaterialResourcesID3 FROM char_sections");
// CharStartOutfit.db2
PrepareStatement(HotfixStatements.SEL_CHAR_START_OUTFIT, "SELECT ID, ClassID, SexID, OutfitID, PetDisplayID, PetFamilyID, ItemID1, ItemID2, ItemID3, " +
"ItemID4, ItemID5, ItemID6, ItemID7, ItemID8, ItemID9, ItemID10, ItemID11, ItemID12, ItemID13, ItemID14, ItemID15, ItemID16, ItemID17, " +
"ItemID18, ItemID19, ItemID20, ItemID21, ItemID22, ItemID23, ItemID24, RaceID FROM char_start_outfit");
// CharTitles.db2
PrepareStatement(HotfixStatements.SEL_CHAR_TITLES, "SELECT ID, Name, Name1, MaskID, Flags FROM char_titles");
PrepareStatement(HotfixStatements.SEL_CHAR_TITLES_LOCALE, "SELECT ID, Name_lang, Name1_lang FROM char_titles_locale WHERE locale = ?");
// CharacterLoadout.db2
PrepareStatement(HotfixStatements.SEL_CHARACTER_LOADOUT, "SELECT RaceMask, ID, ChrClassID, Purpose FROM character_loadout");
// CharacterLoadoutItem.db2
PrepareStatement(HotfixStatements.SEL_CHARACTER_LOADOUT_ITEM, "SELECT ID, CharacterLoadoutID, ItemID FROM character_loadout_item");
// ChatChannels.db2
PrepareStatement(HotfixStatements.SEL_CHAT_CHANNELS, "SELECT ID, Name, Shortcut, Flags, FactionGroup FROM chat_channels");
PrepareStatement(HotfixStatements.SEL_CHAT_CHANNELS, "SELECT Name, Shortcut, ID, Flags, FactionGroup, Ruleset FROM chat_channels");
PrepareStatement(HotfixStatements.SEL_CHAT_CHANNELS_LOCALE, "SELECT ID, Name_lang, Shortcut_lang FROM chat_channels_locale WHERE locale = ?");
// ChrClasses.db2
PrepareStatement(HotfixStatements.SEL_CHR_CLASSES, "SELECT Name, Filename, NameMale, NameFemale, PetNameToken, ID, CreateScreenFileDataID, " +
"SelectScreenFileDataID, IconFileDataID, LowResScreenFileDataID, StartingLevel, SpellTextureBlobFileDataID, Flags, CinematicSequenceID, " +
"DefaultSpec, PrimaryStatPriority, DisplayPower, RangedAttackPowerPerAgility, AttackPowerPerAgility, AttackPowerPerStrength, SpellClassSet" +
" FROM chr_classes");
PrepareStatement(HotfixStatements.SEL_CHR_CLASSES_LOCALE, "SELECT ID, Name_lang, NameMale_lang, NameFemale_lang FROM chr_classes_locale WHERE locale = ?");
PrepareStatement(HotfixStatements.SEL_CHR_CLASSES, "SELECT Name, Filename, NameMale, NameFemale, PetNameToken, Description, RoleInfoString, DisabledString, " +
"HyphenatedNameMale, HyphenatedNameFemale, ID, CreateScreenFileDataID, SelectScreenFileDataID, IconFileDataID, LowResScreenFileDataID, Flags, " +
"SpellTextureBlobFileDataID, RolesMask, ArmorTypeMask, CharStartKitUnknown901, MaleCharacterCreationVisualFallback, " +
"MaleCharacterCreationIdleVisualFallback, FemaleCharacterCreationVisualFallback, FemaleCharacterCreationIdleVisualFallback, " +
"CharacterCreationIdleGroundVisualFallback, CharacterCreationGroundVisualFallback, AlteredFormCharacterCreationIdleVisualFallback, " +
"CharacterCreationAnimLoopWaitTimeMsFallback, CinematicSequenceID, DefaultSpec, PrimaryStatPriority, DisplayPower, " +
"RangedAttackPowerPerAgility, AttackPowerPerAgility, AttackPowerPerStrength, SpellClassSet, ChatColorR, ChatColorG, ChatColorB FROM chr_classes");
PrepareStatement(HotfixStatements.SEL_CHR_CLASSES_LOCALE, "SELECT ID, Name_lang, NameMale_lang, NameFemale_lang, Description_lang, RoleInfoString_lang, " +
"DisabledString_lang, HyphenatedNameMale_lang, HyphenatedNameFemale_lang FROM chr_classes_locale WHERE locale = ?");
// ChrClassesXPowerTypes.db2
PrepareStatement(HotfixStatements.SEL_CHR_CLASSES_X_POWER_TYPES, "SELECT ID, PowerType, ClassID FROM chr_classes_x_power_types");
// ChrCustomizationChoice.db2
PrepareStatement(HotfixStatements.SEL_CHR_CUSTOMIZATION_CHOICE, "SELECT Name, ID, ChrCustomizationOptionID, ChrCustomizationReqID, SortOrder, SwatchColor1, " +
"SwatchColor2, UiOrderIndex, Flags FROM chr_customization_choice");
PrepareStatement(HotfixStatements.SEL_CHR_CUSTOMIZATION_CHOICE_LOCALE, "SELECT ID, Name_lang FROM chr_customization_choice_locale WHERE locale = ?");
// ChrCustomizationDisplayInfo.db2
PrepareStatement(HotfixStatements.SEL_CHR_CUSTOMIZATION_DISPLAY_INFO, "SELECT ID, ShapeshiftFormID, DisplayID, BarberShopMinCameraDistance, " +
"BarberShopHeightOffset FROM chr_customization_display_info");
// ChrCustomizationElement.db2
PrepareStatement(HotfixStatements.SEL_CHR_CUSTOMIZATION_ELEMENT, "SELECT ID, ChrCustomizationChoiceID, RelatedChrCustomizationChoiceID, " +
"ChrCustomizationGeosetID, ChrCustomizationSkinnedModelID, ChrCustomizationMaterialID, ChrCustomizationBoneSetID, " +
"ChrCustomizationCondModelID, ChrCustomizationDisplayInfoID FROM chr_customization_element");
// ChrCustomizationOption.db2
PrepareStatement(HotfixStatements.SEL_CHR_CUSTOMIZATION_OPTION, "SELECT Name, ID, SecondaryID, Flags, ChrModelID, SortIndex, ChrCustomizationCategoryID, " +
"OptionType, BarberShopCostModifier, ChrCustomizationID, ChrCustomizationReqID, UiOrderIndex FROM chr_customization_option");
PrepareStatement(HotfixStatements.SEL_CHR_CUSTOMIZATION_OPTION_LOCALE, "SELECT ID, Name_lang FROM chr_customization_option_locale WHERE locale = ?");
// ChrCustomizationReq.db2
PrepareStatement(HotfixStatements.SEL_CHR_CUSTOMIZATION_REQ, "SELECT ID, Flags, ClassMask, AchievementID, OverrideArchive, ItemModifiedAppearanceID FROM chr_customization_req");
// ChrCustomizationReqChoice.db2
PrepareStatement(HotfixStatements.SEL_CHR_CUSTOMIZATION_REQ_CHOICE, "SELECT ID, ChrCustomizationChoiceID, ChrCustomizationReqID FROM chr_customization_req_choice");
// ChrModel.db2
PrepareStatement(HotfixStatements.SEL_CHR_MODEL, "SELECT FaceCustomizationOffset1, FaceCustomizationOffset2, FaceCustomizationOffset3, CustomizeOffset1, " +
"CustomizeOffset2, CustomizeOffset3, ID, Sex, DisplayID, CharComponentTextureLayoutID, Flags, SkeletonFileDataID, ModelFallbackChrModelID, " +
"TextureFallbackChrModelID, HelmVisFallbackChrModelID, CustomizeScale, CustomizeFacing, CameraDistanceOffset, BarberShopCameraOffsetScale, " +
"BarberShopCameraRotationOffset FROM chr_model");
// ChrRaceXChrModel.db2
PrepareStatement(HotfixStatements.SEL_CHR_RACE_X_CHR_MODEL, "SELECT ID, ChrRacesID, ChrModelID FROM chr_race_x_chr_model");
// ChrRaces.db2
PrepareStatement(HotfixStatements.SEL_CHR_RACES, "SELECT ClientPrefix, ClientFileString, Name, NameFemale, NameLowercase, NameFemaleLowercase, ID, Flags, " +
"MaleDisplayId, FemaleDisplayId, HighResMaleDisplayId, HighResFemaleDisplayId, CreateScreenFileDataID, SelectScreenFileDataID, " +
"MaleCustomizeOffset1, MaleCustomizeOffset2, MaleCustomizeOffset3, FemaleCustomizeOffset1, FemaleCustomizeOffset2, FemaleCustomizeOffset3, " +
"LowResScreenFileDataID, AlteredFormStartVisualKitID1, AlteredFormStartVisualKitID2, AlteredFormStartVisualKitID3, " +
"AlteredFormFinishVisualKitID1, AlteredFormFinishVisualKitID2, AlteredFormFinishVisualKitID3, HeritageArmorAchievementID, StartingLevel, " +
"UiDisplayOrder, FemaleSkeletonFileDataID, MaleSkeletonFileDataID, HelmVisFallbackRaceID, TransmogrifyDisabledSlotMask, FactionID, " +
"CinematicSequenceID, ResSicknessSpellID, SplashSoundID, BaseLanguage, CreatureType, Alliance, RaceRelated, UnalteredVisualRaceID, " +
"CharComponentTextureLayoutID, CharComponentTexLayoutHiResID, DefaultClassID, NeutralRaceID, MaleModelFallbackRaceID, MaleModelFallbackSex, " +
"FemaleModelFallbackRaceID, FemaleModelFallbackSex, MaleTextureFallbackRaceID, MaleTextureFallbackSex, FemaleTextureFallbackRaceID, " +
"FemaleTextureFallbackSex FROM chr_races");
PrepareStatement(HotfixStatements.SEL_CHR_RACES_LOCALE, "SELECT ID, Name_lang, NameFemale_lang, NameLowercase_lang, NameFemaleLowercase_lang" +
" FROM chr_races_locale WHERE locale = ?");
PrepareStatement(HotfixStatements.SEL_CHR_RACES, "SELECT ClientPrefix, ClientFileString, Name, NameFemale, NameLowercase, NameFemaleLowercase, NameS, " +
"NameFemaleS, NameLowercaseS, NameFemaleLowercaseS, RaceFantasyDescription, NameL, NameFemaleL, NameLowercaseL, NameFemaleLowercaseL, ID, " +
"Flags, BaseLanguage, ResSicknessSpellID, SplashSoundID, CreateScreenFileDataID, SelectScreenFileDataID, LowResScreenFileDataID, " +
"AlteredFormStartVisualKitID1, AlteredFormStartVisualKitID2, AlteredFormStartVisualKitID3, AlteredFormFinishVisualKitID1, " +
"AlteredFormFinishVisualKitID2, AlteredFormFinishVisualKitID3, HeritageArmorAchievementID, StartingLevel, UiDisplayOrder, PlayableRaceBit, " +
"HelmetAnimScalingRaceID, TransmogrifyDisabledSlotMask, AlteredFormCustomizeOffsetFallback1, AlteredFormCustomizeOffsetFallback2, " +
"AlteredFormCustomizeOffsetFallback3, AlteredFormCustomizeRotationFallback, FactionID, CinematicSequenceID, CreatureType, Alliance, " +
"RaceRelated, UnalteredVisualRaceID, DefaultClassID, NeutralRaceID, MaleModelFallbackRaceID, MaleModelFallbackSex, FemaleModelFallbackRaceID, " +
"FemaleModelFallbackSex, MaleTextureFallbackRaceID, MaleTextureFallbackSex, FemaleTextureFallbackRaceID, FemaleTextureFallbackSex, " +
"UnalteredVisualCustomizationRaceID FROM chr_races");
PrepareStatement(HotfixStatements.SEL_CHR_RACES_LOCALE, "SELECT ID, Name_lang, NameFemale_lang, NameLowercase_lang, NameFemaleLowercase_lang, NameS_lang, " +
"NameFemaleS_lang, NameLowercaseS_lang, NameFemaleLowercaseS_lang, RaceFantasyDescription_lang, NameL_lang, NameFemaleL_lang, " +
"NameLowercaseL_lang, NameFemaleLowercaseL_lang FROM chr_races_locale WHERE locale = ?");
// ChrSpecialization.db2
PrepareStatement(HotfixStatements.SEL_CHR_SPECIALIZATION, "SELECT Name, FemaleName, Description, ID, ClassID, OrderIndex, PetTalentType, Role, Flags, " +
@@ -239,15 +262,14 @@ namespace Framework.Database
" WHERE locale = ?");
// CinematicCamera.db2
PrepareStatement(HotfixStatements.SEL_CINEMATIC_CAMERA, "SELECT ID, OriginX, OriginY, OriginZ, SoundID, OriginFacing, FileDataID FROM cinematic_camera" +
"");
PrepareStatement(HotfixStatements.SEL_CINEMATIC_CAMERA, "SELECT ID, OriginX, OriginY, OriginZ, SoundID, OriginFacing, FileDataID FROM cinematic_camera");
// CinematicSequences.db2
PrepareStatement(HotfixStatements.SEL_CINEMATIC_SEQUENCES, "SELECT ID, SoundID, Camera1, Camera2, Camera3, Camera4, Camera5, Camera6, Camera7, Camera8" +
" FROM cinematic_sequences");
PrepareStatement(HotfixStatements.SEL_CINEMATIC_SEQUENCES, "SELECT ID, SoundID, Camera1, Camera2, Camera3, Camera4, Camera5, Camera6, Camera7, Camera8 FROM cinematic_sequences");
// ContentTuning.db2
PrepareStatement(HotfixStatements.SEL_CONTENT_TUNING, "SELECT ID, MinLevel, MaxLevel, Flags, ExpansionID FROM content_tuning");
PrepareStatement(HotfixStatements.SEL_CONTENT_TUNING, "SELECT ID, Flags, ExpansionID, MinLevel, MaxLevel, MinLevelType, MaxLevelType, TargetLevelDelta, " +
"TargetLevelMaxDelta, TargetLevelMin, TargetLevelMax, MinItemLevel FROM content_tuning");
// ContentTuningXExpected.db2
PrepareStatement(HotfixStatements.SEL_CONTENT_TUNING_X_EXPECTED, "SELECT ID, ExpectedStatModID, MythicPlusSeasonID, ContentTuningID" +
@@ -268,9 +290,8 @@ namespace Framework.Database
"TextureVariationFileDataID3 FROM creature_display_info");
// CreatureDisplayInfoExtra.db2
PrepareStatement(HotfixStatements.SEL_CREATURE_DISPLAY_INFO_EXTRA, "SELECT ID, DisplayRaceID, DisplaySexID, DisplayClassID, SkinID, FaceID, HairStyleID, " +
"HairColorID, FacialHairID, Flags, BakeMaterialResourcesID, HDBakeMaterialResourcesID, CustomDisplayOption1, CustomDisplayOption2, " +
"CustomDisplayOption3 FROM creature_display_info_extra");
PrepareStatement(HotfixStatements.SEL_CREATURE_DISPLAY_INFO_EXTRA, "SELECT ID, DisplayRaceID, DisplaySexID, DisplayClassID, Flags, BakeMaterialResourcesID, " +
"HDBakeMaterialResourcesID FROM creature_display_info_extra");
// CreatureFamily.db2
PrepareStatement(HotfixStatements.SEL_CREATURE_FAMILY, "SELECT ID, Name, MinScale, MinScaleLevel, MaxScale, MaxScaleLevel, PetFoodMask, PetTalentType, " +
@@ -294,33 +315,29 @@ namespace Framework.Database
"EligibilityWorldStateID, EligibilityWorldStateValue FROM criteria");
// CriteriaTree.db2
PrepareStatement(HotfixStatements.SEL_CRITERIA_TREE, "SELECT ID, Description, Parent, Amount, Operator, CriteriaID, OrderIndex, Flags FROM criteria_tree" +
"");
PrepareStatement(HotfixStatements.SEL_CRITERIA_TREE, "SELECT ID, Description, Parent, Amount, Operator, CriteriaID, OrderIndex, Flags FROM criteria_tree");
PrepareStatement(HotfixStatements.SEL_CRITERIA_TREE_LOCALE, "SELECT ID, Description_lang FROM criteria_tree_locale WHERE locale = ?");
// CurrencyTypes.db2
PrepareStatement(HotfixStatements.SEL_CURRENCY_TYPES, "SELECT ID, Name, Description, CategoryID, InventoryIconFileID, SpellWeight, SpellCategory, MaxQty, " +
"MaxEarnablePerWeek, Flags, Quality, FactionID, ItemGroupSoundsID, ConvertToPlayerExperience, PlayerConditionID FROM currency_types" +
"");
"MaxEarnablePerWeek, Quality, FactionID, ItemGroupSoundsID, XpQuestDifficulty, AwardConditionID, MaxQtyWorldStateID, Flags1, Flags2 FROM currency_types");
PrepareStatement(HotfixStatements.SEL_CURRENCY_TYPES_LOCALE, "SELECT ID, Name_lang, Description_lang FROM currency_types_locale WHERE locale = ?");
// Curve.db2
PrepareStatement(HotfixStatements.SEL_CURVE, "SELECT ID, Type, Flags FROM curve");
// CurvePoint.db2
PrepareStatement(HotfixStatements.SEL_CURVE_POINT, "SELECT ID, PosX, PosY, CurveID, OrderIndex FROM curve_point");
PrepareStatement(HotfixStatements.SEL_CURVE_POINT, "SELECT ID, PosX, PosY, PosPreSquishX, PosPreSquishY, CurveID, OrderIndex FROM curve_point");
// DestructibleModelData.db2
PrepareStatement(HotfixStatements.SEL_DESTRUCTIBLE_MODEL_DATA, "SELECT ID, State0ImpactEffectDoodadSet, State0AmbientDoodadSet, State1Wmo, " +
"State1DestructionDoodadSet, State1ImpactEffectDoodadSet, State1AmbientDoodadSet, State2Wmo, State2DestructionDoodadSet, " +
"State2ImpactEffectDoodadSet, State2AmbientDoodadSet, State3Wmo, State3InitDoodadSet, State3AmbientDoodadSet, EjectDirection, DoNotHighlight, " +
"State0Wmo, HealEffect, HealEffectSpeed, State0NameSet, State1NameSet, State2NameSet, State3NameSet FROM destructible_model_data" +
"");
"State0Wmo, HealEffect, HealEffectSpeed, State0NameSet, State1NameSet, State2NameSet, State3NameSet FROM destructible_model_data");
// Difficulty.db2
PrepareStatement(HotfixStatements.SEL_DIFFICULTY, "SELECT ID, Name, InstanceType, OrderIndex, OldEnumValue, FallbackDifficultyID, MinPlayers, MaxPlayers, " +
"Flags, ItemContext, ToggleDifficultyID, GroupSizeHealthCurveID, GroupSizeDmgCurveID, GroupSizeSpellPointsCurveID FROM difficulty" +
"");
"Flags, ItemContext, ToggleDifficultyID, GroupSizeHealthCurveID, GroupSizeDmgCurveID, GroupSizeSpellPointsCurveID FROM difficulty");
PrepareStatement(HotfixStatements.SEL_DIFFICULTY_LOCALE, "SELECT ID, Name_lang FROM difficulty_locale WHERE locale = ?");
// DungeonEncounter.db2
@@ -407,8 +424,7 @@ namespace Framework.Database
"HordeCreatureID, AllianceCreatureID, HordeGarrFollRaceID, AllianceGarrFollRaceID, HordeGarrClassSpecID, AllianceGarrClassSpecID, Quality, " +
"FollowerLevel, ItemLevelWeapon, ItemLevelArmor, HordeSourceTypeEnum, AllianceSourceTypeEnum, HordeIconFileDataID, AllianceIconFileDataID, " +
"HordeGarrFollItemSetID, AllianceGarrFollItemSetID, HordeUITextureKitID, AllianceUITextureKitID, Vitality, HordeFlavorGarrStringID, " +
"AllianceFlavorGarrStringID, HordeSlottingBroadcastTextID, AllySlottingBroadcastTextID, ChrClassID, Flags, Gender FROM garr_follower" +
"");
"AllianceFlavorGarrStringID, HordeSlottingBroadcastTextID, AllySlottingBroadcastTextID, ChrClassID, Flags, Gender, AutoCombatantID, CovenantID FROM garr_follower");
PrepareStatement(HotfixStatements.SEL_GARR_FOLLOWER_LOCALE, "SELECT ID, HordeSourceText_lang, AllianceSourceText_lang, TitleName_lang FROM garr_follower_locale" +
" WHERE locale = ?");
@@ -435,14 +451,13 @@ namespace Framework.Database
" FROM garr_site_level_plot_inst");
// GemProperties.db2
PrepareStatement(HotfixStatements.SEL_GEM_PROPERTIES, "SELECT ID, EnchantId, Type, MinItemLevel FROM gem_properties");
PrepareStatement(HotfixStatements.SEL_GEM_PROPERTIES, "SELECT ID, EnchantId, Type FROM gem_properties");
// GlyphBindableSpell.db2
PrepareStatement(HotfixStatements.SEL_GLYPH_BINDABLE_SPELL, "SELECT ID, SpellID, GlyphPropertiesID FROM glyph_bindable_spell");
// GlyphProperties.db2
PrepareStatement(HotfixStatements.SEL_GLYPH_PROPERTIES, "SELECT ID, SpellID, GlyphType, GlyphExclusiveCategoryID, SpellIconFileDataID FROM glyph_properties" +
"");
PrepareStatement(HotfixStatements.SEL_GLYPH_PROPERTIES, "SELECT ID, SpellID, GlyphType, GlyphExclusiveCategoryID, SpellIconFileDataID FROM glyph_properties");
// GlyphRequiredSpec.db2
PrepareStatement(HotfixStatements.SEL_GLYPH_REQUIRED_SPEC, "SELECT ID, ChrSpecializationID, GlyphPropertiesID FROM glyph_required_spec");
@@ -470,12 +485,10 @@ namespace Framework.Database
"Duration1, Duration2, Duration3, Duration4, Duration5, Duration6, Duration7, Duration8, Duration9, Duration10, Date1, Date2, Date3, Date4, " +
"Date5, Date6, Date7, Date8, Date9, Date10, Date11, Date12, Date13, Date14, Date15, Date16, Date17, Date18, Date19, Date20, Date21, Date22, " +
"Date23, Date24, Date25, Date26, CalendarFlags1, CalendarFlags2, CalendarFlags3, CalendarFlags4, CalendarFlags5, CalendarFlags6, " +
"CalendarFlags7, CalendarFlags8, CalendarFlags9, CalendarFlags10, TextureFileDataID1, TextureFileDataID2, TextureFileDataID3 FROM holidays" +
"");
"CalendarFlags7, CalendarFlags8, CalendarFlags9, CalendarFlags10, TextureFileDataID1, TextureFileDataID2, TextureFileDataID3 FROM holidays");
// ImportPriceArmor.db2
PrepareStatement(HotfixStatements.SEL_IMPORT_PRICE_ARMOR, "SELECT ID, ClothModifier, LeatherModifier, ChainModifier, PlateModifier FROM import_price_armor" +
"");
PrepareStatement(HotfixStatements.SEL_IMPORT_PRICE_ARMOR, "SELECT ID, ClothModifier, LeatherModifier, ChainModifier, PlateModifier FROM import_price_armor");
// ImportPriceQuality.db2
PrepareStatement(HotfixStatements.SEL_IMPORT_PRICE_QUALITY, "SELECT ID, Data FROM import_price_quality");
@@ -488,11 +501,10 @@ namespace Framework.Database
// Item.db2
PrepareStatement(HotfixStatements.SEL_ITEM, "SELECT ID, ClassID, SubclassID, Material, InventoryType, SheatheType, SoundOverrideSubclassID, IconFileDataID, " +
"ItemGroupSoundsID FROM item");
"ItemGroupSoundsID, ModifiedCraftingReagentItemID FROM item");
// ItemAppearance.db2
PrepareStatement(HotfixStatements.SEL_ITEM_APPEARANCE, "SELECT ID, DisplayType, ItemDisplayInfoID, DefaultIconFileDataID, UiOrder FROM item_appearance" +
"");
PrepareStatement(HotfixStatements.SEL_ITEM_APPEARANCE, "SELECT ID, DisplayType, ItemDisplayInfoID, DefaultIconFileDataID, UiOrder, PlayerConditionID FROM item_appearance");
// ItemArmorQuality.db2
PrepareStatement(HotfixStatements.SEL_ITEM_ARMOR_QUALITY, "SELECT ID, Qualitymod1, Qualitymod2, Qualitymod3, Qualitymod4, Qualitymod5, Qualitymod6, " +
@@ -510,8 +522,7 @@ namespace Framework.Database
PrepareStatement(HotfixStatements.SEL_ITEM_BAG_FAMILY_LOCALE, "SELECT ID, Name_lang FROM item_bag_family_locale WHERE locale = ?");
// ItemBonus.db2
PrepareStatement(HotfixStatements.SEL_ITEM_BONUS, "SELECT ID, Value1, Value2, Value3, ParentItemBonusListID, Type, OrderIndex FROM item_bonus" +
"");
PrepareStatement(HotfixStatements.SEL_ITEM_BONUS, "SELECT ID, Value1, Value2, Value3, Value4, ParentItemBonusListID, Type, OrderIndex FROM item_bonus");
// ItemBonusListLevelDelta.db2
PrepareStatement(HotfixStatements.SEL_ITEM_BONUS_LIST_LEVEL_DELTA, "SELECT ItemLevelDelta, ID FROM item_bonus_list_level_delta");
@@ -521,8 +532,7 @@ namespace Framework.Database
"ParentItemBonusTreeID FROM item_bonus_tree_node");
// ItemChildEquipment.db2
PrepareStatement(HotfixStatements.SEL_ITEM_CHILD_EQUIPMENT, "SELECT ID, ParentItemID, ChildItemID, ChildItemEquipSlot FROM item_child_equipment" +
"");
PrepareStatement(HotfixStatements.SEL_ITEM_CHILD_EQUIPMENT, "SELECT ID, ParentItemID, ChildItemID, ChildItemEquipSlot FROM item_child_equipment");
// ItemClass.db2
PrepareStatement(HotfixStatements.SEL_ITEM_CLASS, "SELECT ID, ClassName, ClassID, PriceModifier, Flags FROM item_class");
@@ -603,8 +613,7 @@ namespace Framework.Database
// ItemSet.db2
PrepareStatement(HotfixStatements.SEL_ITEM_SET, "SELECT ID, Name, SetFlags, RequiredSkill, RequiredSkillRank, ItemID1, ItemID2, ItemID3, ItemID4, ItemID5, " +
"ItemID6, ItemID7, ItemID8, ItemID9, ItemID10, ItemID11, ItemID12, ItemID13, ItemID14, ItemID15, ItemID16, ItemID17 FROM item_set" +
"");
"ItemID6, ItemID7, ItemID8, ItemID9, ItemID10, ItemID11, ItemID12, ItemID13, ItemID14, ItemID15, ItemID16, ItemID17 FROM item_set");
PrepareStatement(HotfixStatements.SEL_ITEM_SET_LOCALE, "SELECT ID, Name_lang FROM item_set_locale WHERE locale = ?");
// ItemSetSpell.db2
@@ -617,19 +626,19 @@ namespace Framework.Database
"StatPercentageOfSocket9, StatPercentageOfSocket10, StatPercentEditor1, StatPercentEditor2, StatPercentEditor3, StatPercentEditor4, " +
"StatPercentEditor5, StatPercentEditor6, StatPercentEditor7, StatPercentEditor8, StatPercentEditor9, StatPercentEditor10, Stackable, " +
"MaxCount, RequiredAbility, SellPrice, BuyPrice, VendorStackCount, PriceVariance, PriceRandomValue, Flags1, Flags2, Flags3, Flags4, " +
"FactionRelated, ItemNameDescriptionID, RequiredTransmogHoliday, RequiredHoliday, LimitCategory, GemProperties, SocketMatchEnchantmentId, " +
"TotemCategoryID, InstanceBound, ZoneBound1, ZoneBound2, ItemSet, LockID, StartQuestID, PageID, ItemDelay, ScalingStatDistributionID, " +
"MinFactionID, RequiredSkillRank, RequiredSkill, ItemLevel, AllowableClass, ExpansionID, ArtifactID, SpellWeight, SpellWeightCategory, " +
"SocketType1, SocketType2, SocketType3, SheatheType, Material, PageMaterialID, LanguageID, Bonding, DamageDamageType, StatModifierBonusStat1, " +
"StatModifierBonusStat2, StatModifierBonusStat3, StatModifierBonusStat4, StatModifierBonusStat5, StatModifierBonusStat6, " +
"StatModifierBonusStat7, StatModifierBonusStat8, StatModifierBonusStat9, StatModifierBonusStat10, ContainerSlots, MinReputation, " +
"RequiredPVPMedal, RequiredPVPRank, RequiredLevel, InventoryType, OverallQualityID FROM item_sparse");
"FactionRelated, ModifiedCraftingReagentItemID, ContentTuningID, PlayerLevelToItemLevelCurveID, ItemNameDescriptionID, " +
"RequiredTransmogHoliday, RequiredHoliday, LimitCategory, GemProperties, SocketMatchEnchantmentId, TotemCategoryID, InstanceBound, " +
"ZoneBound1, ZoneBound2, ItemSet, LockID, StartQuestID, PageID, ItemDelay, MinFactionID, RequiredSkillRank, RequiredSkill, ItemLevel, " +
"AllowableClass, ExpansionID, ArtifactID, SpellWeight, SpellWeightCategory, SocketType1, SocketType2, SocketType3, SheatheType, Material, " +
"PageMaterialID, LanguageID, Bonding, DamageDamageType, StatModifierBonusStat1, StatModifierBonusStat2, StatModifierBonusStat3, " +
"StatModifierBonusStat4, StatModifierBonusStat5, StatModifierBonusStat6, StatModifierBonusStat7, StatModifierBonusStat8, " +
"StatModifierBonusStat9, StatModifierBonusStat10, ContainerSlots, MinReputation, RequiredPVPMedal, RequiredPVPRank, RequiredLevel, " +
"InventoryType, OverallQualityID FROM item_sparse");
PrepareStatement(HotfixStatements.SEL_ITEM_SPARSE_LOCALE, "SELECT ID, Description_lang, Display3_lang, Display2_lang, Display1_lang, Display_lang" +
" FROM item_sparse_locale WHERE locale = ?");
// ItemSpec.db2
PrepareStatement(HotfixStatements.SEL_ITEM_SPEC, "SELECT ID, MinLevel, MaxLevel, ItemType, PrimaryStat, SecondaryStat, SpecializationID FROM item_spec" +
"");
PrepareStatement(HotfixStatements.SEL_ITEM_SPEC, "SELECT ID, MinLevel, MaxLevel, ItemType, PrimaryStat, SecondaryStat, SpecializationID FROM item_spec");
// ItemSpecOverride.db2
PrepareStatement(HotfixStatements.SEL_ITEM_SPEC_OVERRIDE, "SELECT ID, SpecID, ItemID FROM item_spec_override");
@@ -639,20 +648,18 @@ namespace Framework.Database
// Keychain.db2
PrepareStatement(HotfixStatements.SEL_KEYCHAIN, "SELECT ID, Key1, Key2, Key3, Key4, Key5, Key6, Key7, Key8, Key9, Key10, Key11, Key12, Key13, Key14, Key15, " +
"Key16, Key17, Key18, Key19, Key20, Key21, Key22, Key23, Key24, Key25, Key26, Key27, Key28, Key29, Key30, Key31, Key32 FROM keychain" +
"");
"Key16, Key17, Key18, Key19, Key20, Key21, Key22, Key23, Key24, Key25, Key26, Key27, Key28, Key29, Key30, Key31, Key32 FROM keychain");
// LfgDungeons.db2
PrepareStatement(HotfixStatements.SEL_LFG_DUNGEONS, "SELECT ID, Name, Description, MinLevel, MaxLevel, TypeID, Subtype, Faction, IconTextureFileID, " +
"RewardsBgTextureFileID, PopupBgTextureFileID, ExpansionLevel, MapID, DifficultyID, MinGear, GroupID, OrderIndex, RequiredPlayerConditionId, " +
"TargetLevel, TargetLevelMin, TargetLevelMax, RandomID, ScenarioID, FinalEncounterID, CountTank, CountHealer, CountDamage, MinCountTank, " +
"MinCountHealer, MinCountDamage, BonusReputationAmount, MentorItemLevel, MentorCharLevel, Flags1, Flags2 FROM lfg_dungeons");
PrepareStatement(HotfixStatements.SEL_LFG_DUNGEONS, "SELECT ID, Name, Description, TypeID, Subtype, Faction, IconTextureFileID, RewardsBgTextureFileID, " +
"PopupBgTextureFileID, ExpansionLevel, MapID, DifficultyID, MinGear, GroupID, OrderIndex, RequiredPlayerConditionId, RandomID, ScenarioID, " +
"FinalEncounterID, CountTank, CountHealer, CountDamage, MinCountTank, MinCountHealer, MinCountDamage, BonusReputationAmount, MentorItemLevel, " +
"MentorCharLevel, ContentTuningID, Flags1, Flags2 FROM lfg_dungeons");
PrepareStatement(HotfixStatements.SEL_LFG_DUNGEONS_LOCALE, "SELECT ID, Name_lang, Description_lang FROM lfg_dungeons_locale WHERE locale = ?");
// Light.db2
PrepareStatement(HotfixStatements.SEL_LIGHT, "SELECT ID, GameCoordsX, GameCoordsY, GameCoordsZ, GameFalloffStart, GameFalloffEnd, ContinentID, " +
"LightParamsID1, LightParamsID2, LightParamsID3, LightParamsID4, LightParamsID5, LightParamsID6, LightParamsID7, LightParamsID8 FROM light" +
"");
"LightParamsID1, LightParamsID2, LightParamsID3, LightParamsID4, LightParamsID5, LightParamsID6, LightParamsID7, LightParamsID8 FROM light");
// LiquidType.db2
PrepareStatement(HotfixStatements.SEL_LIQUID_TYPE, "SELECT ID, Name, Texture1, Texture2, Texture3, Texture4, Texture5, Texture6, Flags, SoundBank, SoundID, " +
@@ -663,7 +670,7 @@ namespace Framework.Database
"Coefficient3, Coefficient4 FROM liquid_type");
// Lock.db2
PrepareStatement(HotfixStatements.SEL_LOCK, "SELECT ID, Index1, Index2, Index3, Index4, Index5, Index6, Index7, Index8, Skill1, Skill2, Skill3, Skill4, " +
PrepareStatement(HotfixStatements.SEL_LOCK, "SELECT ID, Flags, Index1, Index2, Index3, Index4, Index5, Index6, Index7, Index8, Skill1, Skill2, Skill3, Skill4, " +
"Skill5, Skill6, Skill7, Skill8, Type1, Type2, Type3, Type4, Type5, Type6, Type7, Type8, Action1, Action2, Action3, Action4, Action5, " +
"Action6, Action7, Action8 FROM `lock`");
@@ -672,9 +679,9 @@ namespace Framework.Database
PrepareStatement(HotfixStatements.SEL_MAIL_TEMPLATE_LOCALE, "SELECT ID, Body_lang FROM mail_template_locale WHERE locale = ?");
// Map.db2
PrepareStatement(HotfixStatements.SEL_MAP, "SELECT ID, Directory, MapName, MapDescription0, MapDescription1, PvpShortDescription, PvpLongDescription, " +
"CorpseX, CorpseY, MapType, InstanceType, ExpansionID, AreaTableID, LoadingScreenID, TimeOfDayOverride, ParentMapID, CosmeticParentMapID, " +
"TimeOffset, MinimapIconScale, CorpseMapID, MaxPlayers, WindSettingsID, ZmpFileDataID, WdtFileDataID, Flags1, Flags2 FROM map");
PrepareStatement(HotfixStatements.SEL_MAP, "SELECT ID, Directory, MapName, InternalName, MapDescription0, MapDescription1, PvpShortDescription, " +
"PvpLongDescription, CorpseX, CorpseY, MapType, InstanceType, ExpansionID, AreaTableID, LoadingScreenID, TimeOfDayOverride, ParentMapID, " +
"CosmeticParentMapID, TimeOffset, MinimapIconScale, CorpseMapID, MaxPlayers, WindSettingsID, ZmpFileDataID, WdtFileDataID, Flags1, Flags2 FROM map");
PrepareStatement(HotfixStatements.SEL_MAP_LOCALE, "SELECT ID, MapName_lang, MapDescription0_lang, MapDescription1_lang, PvpShortDescription_lang, " +
"PvpLongDescription_lang FROM map_locale WHERE locale = ?");
@@ -684,8 +691,7 @@ namespace Framework.Database
PrepareStatement(HotfixStatements.SEL_MAP_DIFFICULTY_LOCALE, "SELECT ID, Message_lang FROM map_difficulty_locale WHERE locale = ?");
// ModifierTree.db2
PrepareStatement(HotfixStatements.SEL_MODIFIER_TREE, "SELECT ID, Parent, Operator, Amount, Type, Asset, SecondaryAsset, TertiaryAsset FROM modifier_tree" +
"");
PrepareStatement(HotfixStatements.SEL_MODIFIER_TREE, "SELECT ID, Parent, Operator, Amount, Type, Asset, SecondaryAsset, TertiaryAsset FROM modifier_tree");
// Mount.db2
PrepareStatement(HotfixStatements.SEL_MOUNT, "SELECT Name, SourceText, Description, ID, MountTypeID, Flags, SourceTypeEnum, SourceSpellID, " +
@@ -697,8 +703,7 @@ namespace Framework.Database
"ReqMapID, PlayerConditionID FROM mount_capability");
// MountTypeXCapability.db2
PrepareStatement(HotfixStatements.SEL_MOUNT_TYPE_X_CAPABILITY, "SELECT ID, MountTypeID, MountCapabilityID, OrderIndex FROM mount_type_x_capability" +
"");
PrepareStatement(HotfixStatements.SEL_MOUNT_TYPE_X_CAPABILITY, "SELECT ID, MountTypeID, MountCapabilityID, OrderIndex FROM mount_type_x_capability");
// MountXDisplay.db2
PrepareStatement(HotfixStatements.SEL_MOUNT_X_DISPLAY, "SELECT ID, CreatureDisplayInfoID, PlayerConditionID, MountID FROM mount_x_display");
@@ -719,8 +724,7 @@ namespace Framework.Database
PrepareStatement(HotfixStatements.SEL_NAMES_RESERVED_LOCALE, "SELECT ID, Name, LocaleMask FROM names_reserved_locale");
// NumTalentsAtLevel.db2
PrepareStatement(HotfixStatements.SEL_NUM_TALENTS_AT_LEVEL, "SELECT ID, NumTalents, NumTalentsDeathKnight, NumTalentsDemonHunter FROM num_talents_at_level" +
"");
PrepareStatement(HotfixStatements.SEL_NUM_TALENTS_AT_LEVEL, "SELECT ID, NumTalents, NumTalentsDeathKnight, NumTalentsDemonHunter FROM num_talents_at_level");
// OverrideSpellData.db2
PrepareStatement(HotfixStatements.SEL_OVERRIDE_SPELL_DATA, "SELECT ID, Spells1, Spells2, Spells3, Spells4, Spells5, Spells6, Spells7, Spells8, Spells9, " +
@@ -733,23 +737,23 @@ namespace Framework.Database
PrepareStatement(HotfixStatements.SEL_PHASE_X_PHASE_GROUP, "SELECT ID, PhaseID, PhaseGroupID FROM phase_x_phase_group");
// PlayerCondition.db2
PrepareStatement(HotfixStatements.SEL_PLAYER_CONDITION, "SELECT RaceMask, FailureDescription, ID, MinLevel, MaxLevel, ClassMask, SkillLogic, LanguageID, " +
"MinLanguage, MaxLanguage, MaxFactionID, MaxReputation, ReputationLogic, CurrentPvpFaction, PvpMedal, PrevQuestLogic, CurrQuestLogic, " +
PrepareStatement(HotfixStatements.SEL_PLAYER_CONDITION, "SELECT RaceMask, FailureDescription, ID, ClassMask, SkillLogic, LanguageID, MinLanguage, " +
"MaxLanguage, MaxFactionID, MaxReputation, ReputationLogic, CurrentPvpFaction, PvpMedal, PrevQuestLogic, CurrQuestLogic, " +
"CurrentCompletedQuestLogic, SpellLogic, ItemLogic, ItemFlags, AuraSpellLogic, WorldStateExpressionID, WeatherID, PartyStatus, " +
"LifetimeMaxPVPRank, AchievementLogic, Gender, NativeGender, AreaLogic, LfgLogic, CurrencyLogic, QuestKillID, QuestKillLogic, " +
"MinExpansionLevel, MaxExpansionLevel, MinAvgItemLevel, MaxAvgItemLevel, MinAvgEquippedItemLevel, MaxAvgEquippedItemLevel, PhaseUseFlags, " +
"PhaseID, PhaseGroupID, Flags, ChrSpecializationIndex, ChrSpecializationRole, ModifierTreeID, PowerType, PowerTypeComp, PowerTypeValue, " +
"WeaponSubclassMask, MaxGuildLevel, MinGuildLevel, MaxExpansionTier, MinExpansionTier, MinPVPRank, MaxPVPRank, SkillID1, SkillID2, SkillID3, " +
"SkillID4, MinSkill1, MinSkill2, MinSkill3, MinSkill4, MaxSkill1, MaxSkill2, MaxSkill3, MaxSkill4, MinFactionID1, MinFactionID2, " +
"MinFactionID3, MinReputation1, MinReputation2, MinReputation3, PrevQuestID1, PrevQuestID2, PrevQuestID3, PrevQuestID4, CurrQuestID1, " +
"CurrQuestID2, CurrQuestID3, CurrQuestID4, CurrentCompletedQuestID1, CurrentCompletedQuestID2, CurrentCompletedQuestID3, " +
"CurrentCompletedQuestID4, SpellID1, SpellID2, SpellID3, SpellID4, ItemID1, ItemID2, ItemID3, ItemID4, ItemCount1, ItemCount2, ItemCount3, " +
"ItemCount4, Explored1, Explored2, Time1, Time2, AuraSpellID1, AuraSpellID2, AuraSpellID3, AuraSpellID4, AuraStacks1, AuraStacks2, " +
"AuraStacks3, AuraStacks4, Achievement1, Achievement2, Achievement3, Achievement4, AreaID1, AreaID2, AreaID3, AreaID4, LfgStatus1, " +
"LfgStatus2, LfgStatus3, LfgStatus4, LfgCompare1, LfgCompare2, LfgCompare3, LfgCompare4, LfgValue1, LfgValue2, LfgValue3, LfgValue4, " +
"CurrencyID1, CurrencyID2, CurrencyID3, CurrencyID4, CurrencyCount1, CurrencyCount2, CurrencyCount3, CurrencyCount4, QuestKillMonster1, " +
"QuestKillMonster2, QuestKillMonster3, QuestKillMonster4, QuestKillMonster5, QuestKillMonster6, MovementFlags1, MovementFlags2" +
" FROM player_condition");
"WeaponSubclassMask, MaxGuildLevel, MinGuildLevel, MaxExpansionTier, MinExpansionTier, MinPVPRank, MaxPVPRank, ContentTuningID, CovenantID, " +
"SkillID1, SkillID2, SkillID3, SkillID4, MinSkill1, MinSkill2, MinSkill3, MinSkill4, MaxSkill1, MaxSkill2, MaxSkill3, MaxSkill4, " +
"MinFactionID1, MinFactionID2, MinFactionID3, MinReputation1, MinReputation2, MinReputation3, PrevQuestID1, PrevQuestID2, PrevQuestID3, " +
"PrevQuestID4, CurrQuestID1, CurrQuestID2, CurrQuestID3, CurrQuestID4, CurrentCompletedQuestID1, CurrentCompletedQuestID2, " +
"CurrentCompletedQuestID3, CurrentCompletedQuestID4, SpellID1, SpellID2, SpellID3, SpellID4, ItemID1, ItemID2, ItemID3, ItemID4, ItemCount1, " +
"ItemCount2, ItemCount3, ItemCount4, Explored1, Explored2, Time1, Time2, AuraSpellID1, AuraSpellID2, AuraSpellID3, AuraSpellID4, AuraStacks1, " +
"AuraStacks2, AuraStacks3, AuraStacks4, Achievement1, Achievement2, Achievement3, Achievement4, AreaID1, AreaID2, AreaID3, AreaID4, " +
"LfgStatus1, LfgStatus2, LfgStatus3, LfgStatus4, LfgCompare1, LfgCompare2, LfgCompare3, LfgCompare4, LfgValue1, LfgValue2, LfgValue3, " +
"LfgValue4, CurrencyID1, CurrencyID2, CurrencyID3, CurrencyID4, CurrencyCount1, CurrencyCount2, CurrencyCount3, CurrencyCount4, " +
"QuestKillMonster1, QuestKillMonster2, QuestKillMonster3, QuestKillMonster4, QuestKillMonster5, QuestKillMonster6, MovementFlags1, " +
"MovementFlags2 FROM player_condition");
PrepareStatement(HotfixStatements.SEL_PLAYER_CONDITION_LOCALE, "SELECT ID, FailureDescription_lang FROM player_condition_locale WHERE locale = ?");
// PowerDisplay.db2
@@ -813,16 +817,11 @@ namespace Framework.Database
"TreasurePickerID FROM reward_pack");
// RewardPackXCurrencyType.db2
PrepareStatement(HotfixStatements.SEL_REWARD_PACK_X_CURRENCY_TYPE, "SELECT ID, CurrencyTypeID, Quantity, RewardPackID FROM reward_pack_x_currency_type" +
"");
PrepareStatement(HotfixStatements.SEL_REWARD_PACK_X_CURRENCY_TYPE, "SELECT ID, CurrencyTypeID, Quantity, RewardPackID FROM reward_pack_x_currency_type");
// RewardPackXItem.db2
PrepareStatement(HotfixStatements.SEL_REWARD_PACK_X_ITEM, "SELECT ID, ItemID, ItemQuantity, RewardPackID FROM reward_pack_x_item");
// ScalingStatDistribution.db2
PrepareStatement(HotfixStatements.SEL_SCALING_STAT_DISTRIBUTION, "SELECT ID, PlayerLevelToItemLevelCurveID, MinLevel, MaxLevel" +
" FROM scaling_stat_distribution");
// Scenario.db2
PrepareStatement(HotfixStatements.SEL_SCENARIO, "SELECT ID, Name, AreaTableID, Type, Flags, UiTextureKitID FROM scenario");
PrepareStatement(HotfixStatements.SEL_SCENARIO_LOCALE, "SELECT ID, Name_lang FROM scenario_locale WHERE locale = ?");
@@ -882,7 +881,7 @@ namespace Framework.Database
" FROM spell_aura_restrictions");
// SpellCastTimes.db2
PrepareStatement(HotfixStatements.SEL_SPELL_CAST_TIMES, "SELECT ID, Base, PerLevel, Minimum FROM spell_cast_times");
PrepareStatement(HotfixStatements.SEL_SPELL_CAST_TIMES, "SELECT ID, Base, Minimum FROM spell_cast_times");
// SpellCastingRequirements.db2
PrepareStatement(HotfixStatements.SEL_SPELL_CASTING_REQUIREMENTS, "SELECT ID, SpellID, FacingCasterFlags, MinFactionID, MinReputation, RequiredAreasID, " +
@@ -893,8 +892,7 @@ namespace Framework.Database
"StartRecoveryCategory, ChargeCategory, SpellID FROM spell_categories");
// SpellCategory.db2
PrepareStatement(HotfixStatements.SEL_SPELL_CATEGORY, "SELECT ID, Name, Flags, UsesPerWeek, MaxCharges, ChargeRecoveryTime, TypeMask FROM spell_category" +
"");
PrepareStatement(HotfixStatements.SEL_SPELL_CATEGORY, "SELECT ID, Name, Flags, UsesPerWeek, MaxCharges, ChargeRecoveryTime, TypeMask FROM spell_category");
PrepareStatement(HotfixStatements.SEL_SPELL_CATEGORY_LOCALE, "SELECT ID, Name_lang FROM spell_category_locale WHERE locale = ?");
// SpellClassOptions.db2
@@ -906,7 +904,7 @@ namespace Framework.Database
" FROM spell_cooldowns");
// SpellDuration.db2
PrepareStatement(HotfixStatements.SEL_SPELL_DURATION, "SELECT ID, Duration, DurationPerLevel, MaxDuration FROM spell_duration");
PrepareStatement(HotfixStatements.SEL_SPELL_DURATION, "SELECT ID, Duration, MaxDuration FROM spell_duration");
// SpellEffect.db2
PrepareStatement(HotfixStatements.SEL_SPELL_EFFECT, "SELECT ID, EffectAura, DifficultyID, EffectIndex, Effect, EffectAmplitude, EffectAttributes, " +
@@ -929,10 +927,10 @@ namespace Framework.Database
"ChannelInterruptFlags1, ChannelInterruptFlags2, SpellID FROM spell_interrupts");
// SpellItemEnchantment.db2
PrepareStatement(HotfixStatements.SEL_SPELL_ITEM_ENCHANTMENT, "SELECT ID, Name, HordeName, EffectArg1, EffectArg2, EffectArg3, EffectScalingPoints1, " +
"EffectScalingPoints2, EffectScalingPoints3, TransmogPlayerConditionID, TransmogCost, IconFileDataID, EffectPointsMin1, EffectPointsMin2, " +
"EffectPointsMin3, ItemVisual, Flags, RequiredSkillID, RequiredSkillRank, ItemLevel, Charges, Effect1, Effect2, Effect3, ScalingClass, " +
"ScalingClassRestricted, ConditionID, MinLevel, MaxLevel FROM spell_item_enchantment");
PrepareStatement(HotfixStatements.SEL_SPELL_ITEM_ENCHANTMENT, "SELECT Name, HordeName, ID, EffectArg1, EffectArg2, EffectArg3, EffectScalingPoints1, " +
"EffectScalingPoints2, EffectScalingPoints3, IconFileDataID, MinItemLevel, MaxItemLevel, TransmogUseConditionID, TransmogCost, " +
"EffectPointsMin1, EffectPointsMin2, EffectPointsMin3, ItemVisual, Flags, RequiredSkillID, RequiredSkillRank, ItemLevel, Charges, Effect1, " +
"Effect2, Effect3, ScalingClass, ScalingClassRestricted, ConditionID, MinLevel, MaxLevel FROM spell_item_enchantment");
PrepareStatement(HotfixStatements.SEL_SPELL_ITEM_ENCHANTMENT_LOCALE, "SELECT ID, Name_lang, HordeName_lang FROM spell_item_enchantment_locale WHERE locale = ?");
// SpellItemEnchantmentCondition.db2
@@ -945,14 +943,13 @@ namespace Framework.Database
PrepareStatement(HotfixStatements.SEL_SPELL_LEARN_SPELL, "SELECT ID, SpellID, LearnSpellID, OverridesSpellID FROM spell_learn_spell");
// SpellLevels.db2
PrepareStatement(HotfixStatements.SEL_SPELL_LEVELS, "SELECT ID, DifficultyID, BaseLevel, MaxLevel, SpellLevel, MaxPassiveAuraLevel, SpellID" +
" FROM spell_levels");
PrepareStatement(HotfixStatements.SEL_SPELL_LEVELS, "SELECT ID, DifficultyID, MaxLevel, MaxPassiveAuraLevel, BaseLevel, SpellLevel, SpellID FROM spell_levels");
// SpellMisc.db2
PrepareStatement(HotfixStatements.SEL_SPELL_MISC, "SELECT ID, Attributes1, Attributes2, Attributes3, Attributes4, Attributes5, Attributes6, Attributes7, " +
"Attributes8, Attributes9, Attributes10, Attributes11, Attributes12, Attributes13, Attributes14, DifficultyID, CastingTimeIndex, " +
"DurationIndex, RangeIndex, SchoolMask, Speed, LaunchDelay, MinDuration, SpellIconFileDataID, ActiveIconFileDataID, ContentTuningID, SpellID" +
" FROM spell_misc");
"Attributes8, Attributes9, Attributes10, Attributes11, Attributes12, Attributes13, Attributes14, Attributes15, DifficultyID, " +
"CastingTimeIndex, DurationIndex, RangeIndex, SchoolMask, Speed, LaunchDelay, MinDuration, SpellIconFileDataID, ActiveIconFileDataID, " +
"ContentTuningID, ShowFutureSpellPlayerConditionID, SpellVisualScript, ActiveSpellVisualScript, SpellID FROM spell_misc");
// SpellName.db2
PrepareStatement(HotfixStatements.SEL_SPELL_NAME, "SELECT ID, Name FROM spell_name");
@@ -969,8 +966,7 @@ namespace Framework.Database
PrepareStatement(HotfixStatements.SEL_SPELL_PROCS_PER_MINUTE, "SELECT ID, BaseProcRate, Flags FROM spell_procs_per_minute");
// SpellProcsPerMinuteMod.db2
PrepareStatement(HotfixStatements.SEL_SPELL_PROCS_PER_MINUTE_MOD, "SELECT ID, Type, Param, Coeff, SpellProcsPerMinuteID FROM spell_procs_per_minute_mod" +
"");
PrepareStatement(HotfixStatements.SEL_SPELL_PROCS_PER_MINUTE_MOD, "SELECT ID, Type, Param, Coeff, SpellProcsPerMinuteID FROM spell_procs_per_minute_mod");
// SpellRadius.db2
PrepareStatement(HotfixStatements.SEL_SPELL_RADIUS, "SELECT ID, Radius, RadiusPerLevel, RadiusMin, RadiusMax FROM spell_radius");
@@ -982,12 +978,10 @@ namespace Framework.Database
// SpellReagents.db2
PrepareStatement(HotfixStatements.SEL_SPELL_REAGENTS, "SELECT ID, SpellID, Reagent1, Reagent2, Reagent3, Reagent4, Reagent5, Reagent6, Reagent7, Reagent8, " +
"ReagentCount1, ReagentCount2, ReagentCount3, ReagentCount4, ReagentCount5, ReagentCount6, ReagentCount7, ReagentCount8 FROM spell_reagents" +
"");
"ReagentCount1, ReagentCount2, ReagentCount3, ReagentCount4, ReagentCount5, ReagentCount6, ReagentCount7, ReagentCount8 FROM spell_reagents");
// SpellScaling.db2
PrepareStatement(HotfixStatements.SEL_SPELL_SCALING, "SELECT ID, SpellID, Class, MinScalingLevel, MaxScalingLevel, ScalesFromItemLevel FROM spell_scaling" +
"");
PrepareStatement(HotfixStatements.SEL_SPELL_SCALING, "SELECT ID, SpellID, Class, MinScalingLevel, MaxScalingLevel, ScalesFromItemLevel FROM spell_scaling");
// SpellShapeshift.db2
PrepareStatement(HotfixStatements.SEL_SPELL_SHAPESHIFT, "SELECT ID, SpellID, StanceBarOrder, ShapeshiftExclude1, ShapeshiftExclude2, ShapeshiftMask1, " +
@@ -1012,7 +1006,7 @@ namespace Framework.Database
" FROM spell_visual_kit");
// SpellXSpellVisual.db2
PrepareStatement(HotfixStatements.SEL_SPELL_X_SPELL_VISUAL, "SELECT ID, DifficultyID, SpellVisualID, Probability, Flags, Priority, SpellIconFileID, " +
PrepareStatement(HotfixStatements.SEL_SPELL_X_SPELL_VISUAL, "SELECT ID, DifficultyID, SpellVisualID, Probability, Priority, SpellIconFileID, " +
"ActiveIconFileID, ViewerUnitConditionID, ViewerPlayerConditionID, CasterUnitConditionID, CasterPlayerConditionID, SpellID" +
" FROM spell_x_spell_visual");
@@ -1052,6 +1046,9 @@ namespace Framework.Database
// TransmogHoliday.db2
PrepareStatement(HotfixStatements.SEL_TRANSMOG_HOLIDAY, "SELECT ID, RequiredTransmogHoliday FROM transmog_holiday");
// TransmogIllusion.db2
PrepareStatement(HotfixStatements.SEL_TRANSMOG_ILLUSION, "SELECT ID, UnlockConditionID, TransmogCost, SpellItemEnchantmentID, Flags FROM transmog_illusion");
// TransmogSet.db2
PrepareStatement(HotfixStatements.SEL_TRANSMOG_SET, "SELECT Name, ID, ClassMask, TrackingQuestID, Flags, TransmogSetGroupID, ItemNameDescriptionID, " +
"ParentTransmogSetID, Unknown810, ExpansionID, PatchID, UiOrder, PlayerConditionID FROM transmog_set");
@@ -1065,16 +1062,14 @@ namespace Framework.Database
PrepareStatement(HotfixStatements.SEL_TRANSMOG_SET_ITEM, "SELECT ID, TransmogSetID, ItemModifiedAppearanceID, Flags FROM transmog_set_item");
// TransportAnimation.db2
PrepareStatement(HotfixStatements.SEL_TRANSPORT_ANIMATION, "SELECT ID, PosX, PosY, PosZ, SequenceID, TimeIndex, TransportID FROM transport_animation" +
"");
PrepareStatement(HotfixStatements.SEL_TRANSPORT_ANIMATION, "SELECT ID, PosX, PosY, PosZ, SequenceID, TimeIndex, TransportID FROM transport_animation");
// TransportRotation.db2
PrepareStatement(HotfixStatements.SEL_TRANSPORT_ROTATION, "SELECT ID, Rot1, Rot2, Rot3, Rot4, TimeIndex, GameObjectsID FROM transport_rotation" +
"");
PrepareStatement(HotfixStatements.SEL_TRANSPORT_ROTATION, "SELECT ID, Rot1, Rot2, Rot3, Rot4, TimeIndex, GameObjectsID FROM transport_rotation");
// UiMap.db2
PrepareStatement(HotfixStatements.SEL_UI_MAP, "SELECT Name, ID, ParentUiMapID, Flags, System, Type, LevelRangeMin, LevelRangeMax, BountySetID, " +
"BountyDisplayLocation, VisibilityPlayerConditionID, HelpTextPosition, BkgAtlasID, AlternateUiMapGroup FROM ui_map");
PrepareStatement(HotfixStatements.SEL_UI_MAP, "SELECT Name, ID, ParentUiMapID, Flags, `System`, Type, BountySetID, BountyDisplayLocation, " +
"VisibilityPlayerConditionID, HelpTextPosition, BkgAtlasID, AlternateUiMapGroup, ContentTuningID FROM ui_map");
PrepareStatement(HotfixStatements.SEL_UI_MAP_LOCALE, "SELECT ID, Name_lang FROM ui_map_locale WHERE locale = ?");
// UiMapAssignment.db2
@@ -1083,7 +1078,7 @@ namespace Framework.Database
// UiMapLink.db2
PrepareStatement(HotfixStatements.SEL_UI_MAP_LINK, "SELECT UiMinX, UiMinY, UiMaxX, UiMaxY, ID, ParentUiMapID, OrderIndex, ChildUiMapID, " +
"OverrideHighlightFileDataID, OverrideHighlightAtlasID FROM ui_map_link");
"OverrideHighlightFileDataID, OverrideHighlightAtlasID, Flags FROM ui_map_link");
// UiMapXMapArt.db2
PrepareStatement(HotfixStatements.SEL_UI_MAP_X_MAP_ART, "SELECT ID, PhaseID, UiMapArtID, UiMapID FROM ui_map_x_map_art");
@@ -1097,9 +1092,9 @@ namespace Framework.Database
// Vehicle.db2
PrepareStatement(HotfixStatements.SEL_VEHICLE, "SELECT ID, Flags, FlagsB, TurnSpeed, PitchSpeed, PitchMin, PitchMax, MouseLookOffsetPitch, " +
"CameraFadeDistScalarMin, CameraFadeDistScalarMax, CameraPitchOffset, FacingLimitRight, FacingLimitLeft, CameraYawOffset, UiLocomotionType, " +
"VehicleUIIndicatorID, MissileTargetingID, SeatID1, SeatID2, SeatID3, SeatID4, SeatID5, SeatID6, SeatID7, SeatID8, PowerDisplayID1, " +
"PowerDisplayID2, PowerDisplayID3 FROM vehicle");
"CameraFadeDistScalarMin, CameraFadeDistScalarMax, CameraPitchOffset, FacingLimitRight, FacingLimitLeft, CameraYawOffset, " +
"VehicleUIIndicatorID, MissileTargetingID, VehiclePOITypeID, SeatID1, SeatID2, SeatID3, SeatID4, SeatID5, SeatID6, SeatID7, SeatID8, " +
"PowerDisplayID1, PowerDisplayID2, PowerDisplayID3 FROM vehicle");
// VehicleSeat.db2
PrepareStatement(HotfixStatements.SEL_VEHICLE_SEAT, "SELECT ID, AttachmentOffsetX, AttachmentOffsetY, AttachmentOffsetZ, CameraOffsetX, CameraOffsetY, " +
@@ -1228,17 +1223,13 @@ namespace Framework.Database
SEL_CFG_REGIONS,
SEL_CHARACTER_FACIAL_HAIR_STYLES,
SEL_CHAR_BASE_SECTION,
SEL_CHAR_SECTIONS,
SEL_CHAR_START_OUTFIT,
SEL_CHAR_TITLES,
SEL_CHAR_TITLES_LOCALE,
SEL_CHARACTER_LOADOUT,
SEL_CHARACTER_LOADOUT_ITEM,
SEL_CHAT_CHANNELS,
SEL_CHAT_CHANNELS_LOCALE,
@@ -1247,6 +1238,24 @@ namespace Framework.Database
SEL_CHR_CLASSES_X_POWER_TYPES,
SEL_CHR_CUSTOMIZATION_CHOICE,
SEL_CHR_CUSTOMIZATION_CHOICE_LOCALE,
SEL_CHR_CUSTOMIZATION_DISPLAY_INFO,
SEL_CHR_CUSTOMIZATION_ELEMENT,
SEL_CHR_CUSTOMIZATION_OPTION,
SEL_CHR_CUSTOMIZATION_OPTION_LOCALE,
SEL_CHR_CUSTOMIZATION_REQ,
SEL_CHR_CUSTOMIZATION_REQ_CHOICE,
SEL_CHR_MODEL,
SEL_CHR_RACE_X_CHR_MODEL,
SEL_CHR_RACES,
SEL_CHR_RACES_LOCALE,
@@ -1544,8 +1553,6 @@ namespace Framework.Database
SEL_REWARD_PACK_X_ITEM,
SEL_SCALING_STAT_DISTRIBUTION,
SEL_SCENARIO,
SEL_SCENARIO_LOCALE,
@@ -1668,6 +1675,8 @@ namespace Framework.Database
SEL_TRANSMOG_HOLIDAY,
SEL_TRANSMOG_ILLUSION,
SEL_TRANSMOG_SET,
SEL_TRANSMOG_SET_LOCALE,
@@ -84,6 +84,12 @@ namespace Game.Achievements
return false;
}
if (achievement.CovenantID != 0 && referencePlayer.m_playerData.CovenantID != achievement.CovenantID)
{
Log.outTrace(LogFilter.Achievement, $"CanUpdateCriteriaTree: (Id: {criteria.Id} Type {criteria.Entry.Type} Achievement {achievement.Id}) Wrong covenant");
return false;
}
return base.CanUpdateCriteriaTree(criteria, tree, referencePlayer);
}
@@ -535,7 +541,7 @@ namespace Game.Achievements
//! Since no common attributes were found, (not even in titleRewardFlags field)
//! we explicitly check by ID. Maybe in the future we could move the achievement_reward
//! condition fields to the condition system.
uint titleId = reward.TitleId[achievement.Id == 1793 ? _owner.m_playerData.NativeSex : (_owner.GetTeam() == Team.Alliance ? 0 : 1)];
uint titleId = reward.TitleId[achievement.Id == 1793 ? (int)_owner.GetNativeSex() : (_owner.GetTeam() == Team.Alliance ? 0 : 1)];
if (titleId != 0)
{
CharTitlesRecord titleEntry = CliDB.CharTitlesStorage.LookupByKey(titleId);
+120 -2
View File
@@ -138,6 +138,10 @@ namespace Game.Achievements
case CriteriaTypes.OwnBattlePetCount:
case CriteriaTypes.HonorLevelReached:
case CriteriaTypes.PrestigeReached:
case CriteriaTypes.CompleteQuestAccumulate:
case CriteriaTypes.BoughtItemFromVendor:
case CriteriaTypes.SoldItemToVendor:
case CriteriaTypes.TravelledToArea:
SetCriteriaProgress(criteria, 1, referencePlayer, ProgressType.Accumulate);
break;
// std case: increment at miscValue1
@@ -437,6 +441,9 @@ namespace Game.Achievements
case CriteriaTypes.EarnHonorXp:
case CriteriaTypes.RelicTalentUnlocked:
case CriteriaTypes.ReachAccountHonorLevel:
case CriteriaTypes.MythicKeystoneCompleted:
case CriteriaTypes.ApplyConduit:
case CriteriaTypes.ConvertItemsToCurrency:
break; // Not implemented yet :(
}
@@ -812,6 +819,10 @@ namespace Game.Achievements
case CriteriaTypes.ReachAccountHonorLevel:
case CriteriaTypes.HeartOfAzerothArtifactPowerEarned:
case CriteriaTypes.HeartOfAzerothLevelReached:
case CriteriaTypes.CompleteQuestAccumulate:
case CriteriaTypes.BoughtItemFromVendor:
case CriteriaTypes.SoldItemToVendor:
case CriteriaTypes.TravelledToArea:
return progress.Counter >= requiredAmount;
case CriteriaTypes.CompleteAchievement:
case CriteriaTypes.CompleteQuest:
@@ -942,6 +953,9 @@ namespace Game.Achievements
case CriteriaTypes.WinDuel:
case CriteriaTypes.WinRatedArena:
case CriteriaTypes.WonAuctions:
case CriteriaTypes.CompleteQuestAccumulate:
case CriteriaTypes.BoughtItemFromVendor:
case CriteriaTypes.SoldItemToVendor:
if (miscValue1 == 0)
return false;
break;
@@ -1188,6 +1202,10 @@ namespace Game.Achievements
if (miscValue1 != criteria.Entry.Asset)
return false;
break;
case CriteriaTypes.TravelledToArea:
if (miscValue1 != criteria.Entry.Asset)
return false;
break;
default:
break;
}
@@ -1621,7 +1639,7 @@ namespace Game.Achievements
return false;
break;
case CriteriaAdditionalCondition.SourceNativeSex: // 98
if (referencePlayer.m_playerData.NativeSex != reqValue)
if (referencePlayer.GetNativeSex() != (Gender)reqValue)
return false;
break;
case CriteriaAdditionalCondition.Skill: // 99
@@ -2402,7 +2420,7 @@ namespace Game.Achievements
break;
}
case CriteriaAdditionalCondition.SourceLevel120: // 264
if (referencePlayer.GetLevel() != 120)
if (referencePlayer.GetLevel() != 60)
return false;
break;
case CriteriaAdditionalCondition.SelectedAzeriteEssenceRankLower: // 266
@@ -2441,8 +2459,54 @@ namespace Game.Achievements
}
}
}
return false;
}
case CriteriaAdditionalCondition.SourceLevelInRangeCt: // 268
{
uint level = referencePlayer.GetLevel();
var levels = Global.DB2Mgr.GetContentTuningData(reqValue, 0);
if (levels.HasValue)
{
if (secondaryAsset != 0)
return level >= levels.Value.MinLevelWithDelta && level <= levels.Value.MaxLevelWithDelta;
return level >= levels.Value.MinLevel && level <= levels.Value.MaxLevel;
}
return false;
}
case CriteriaAdditionalCondition.TargetLevelInRangeCt: // 269
{
if (!unit)
return false;
uint level = unit.GetLevel();
var levels = Global.DB2Mgr.GetContentTuningData(reqValue, 0);
if (levels.HasValue)
{
if (secondaryAsset != 0)
return level >= levels.Value.MinLevelWithDelta && level <= levels.Value.MaxLevelWithDelta;
return level >= levels.Value.MinLevel && level <= levels.Value.MaxLevel;
}
return false;
}
case CriteriaAdditionalCondition.SourceLevelGreaterCt: // 272
{
uint level = referencePlayer.GetLevel();
var levels = Global.DB2Mgr.GetContentTuningData(reqValue, 0);
if (levels.HasValue)
return secondaryAsset != 0 ? level >= levels.Value.MinLevelWithDelta : level >= levels.Value.MinLevel;
return false;
}
case CriteriaAdditionalCondition.TargetLevelGreaterCt: // 273
{
if (!unit)
return false;
uint level = unit.GetLevel();
var levels = Global.DB2Mgr.GetContentTuningData(reqValue, 0);
if (levels.HasValue)
return secondaryAsset != 0 ? level >= levels.Value.MinLevelWithDelta : level >= levels.Value.MinLevel;
return false;
}
case CriteriaAdditionalCondition.MapOrCosmeticMap: // 280
{
MapRecord map = referencePlayer.GetMap().GetEntry();
@@ -2450,6 +2514,60 @@ namespace Game.Achievements
return false;
break;
}
case CriteriaAdditionalCondition.Covenant: // 288
if (referencePlayer.m_playerData.CovenantID != reqValue)
return false;
break;
case CriteriaAdditionalCondition.Soulbind: // 291
if (referencePlayer.m_playerData.SoulbindID != reqValue)
return false;
break;
case CriteriaAdditionalCondition.SourceAreaOrZoneInGroup: // 293
{
var areas = Global.DB2Mgr.GetAreasForGroup(reqValue);
AreaTableRecord area = CliDB.AreaTableStorage.LookupByKey(referencePlayer.GetAreaId());
if (area != null)
foreach (uint areaInGroup in areas)
if (areaInGroup == area.Id || areaInGroup == area.ParentAreaID)
return true;
return false;
}
case CriteriaAdditionalCondition.SourceInSpecificChromieTime: // 300
if (referencePlayer.m_activePlayerData.UiChromieTimeExpansionID != reqValue)
return false;
break;
case CriteriaAdditionalCondition.SourceInAnyChromieTime: // 301
if (referencePlayer.m_activePlayerData.UiChromieTimeExpansionID == 0)
return false;
break;
case CriteriaAdditionalCondition.SourceRuneforgeLegendaryKnown: // 303
{
int block = (int)reqValue / 32;
if (block >= referencePlayer.m_activePlayerData.RuneforgePowers.Size())
return false;
uint bit = reqValue % 32;
return (referencePlayer.m_activePlayerData.RuneforgePowers[block] & (1u << (int)bit)) != 0;
}
case CriteriaAdditionalCondition.ShapeshiftFormCustomizationDisplay: // 308
{
ShapeshiftFormModelData formModelData = Global.DB2Mgr.GetShapeshiftFormModelData(referencePlayer.GetRace(), referencePlayer.GetNativeSex(), (ShapeShiftForm)secondaryAsset);
if (formModelData == null)
return false;
uint formChoice = referencePlayer.GetCustomizationChoice(formModelData.OptionID);
var choiceIndex = formModelData.Choices.FindIndex(choice => { return choice.Id == formChoice; });
if (choiceIndex == -1)
return false;
if (reqValue != formModelData.Displays[choiceIndex].DisplayID)
return false;
break;
}
case CriteriaAdditionalCondition.SourceFlying: // 311
if (!referencePlayer.IsFlying())
return false;
break;
default:
break;
}
+1 -1
View File
@@ -1552,7 +1552,7 @@ namespace Game.BattleGrounds
// creature.SetVisibleAura(0, SPELL_SPIRIT_HEAL_CHANNEL);
// casting visual effect
creature.SetChannelSpellId(BattlegroundConst.SpellSpiritHealChannel);
creature.SetChannelSpellXSpellVisualId(BattlegroundConst.SpellSpiritHealChannelVisual);
creature.SetChannelVisual(new SpellCastVisual(BattlegroundConst.SpellSpiritHealChannelVisual, 0));
//creature.CastSpell(creature, SPELL_SPIRIT_HEAL_CHANNEL, true);
return true;
}
+8
View File
@@ -85,6 +85,14 @@ namespace Game.Cache
_characterCacheByNameStore[name] = characterCacheEntry;
}
public void UpdateCharacterGender(ObjectGuid guid, byte gender)
{
if (!_characterCacheStore.ContainsKey(guid))
return;
_characterCacheStore[guid].Sex = (Gender)gender;
}
public void UpdateCharacterLevel(ObjectGuid guid, byte level)
{
if (!_characterCacheStore.ContainsKey(guid))
+27 -2
View File
@@ -23,6 +23,7 @@ using Game.Entities;
using Game.Spells;
using System;
using System.Text;
using System.Collections.Generic;
namespace Game.Chat
{
@@ -542,11 +543,23 @@ namespace Game.Chat
}
if (handler.GetSession() != null)
{
int maxLevel = 0;
var questLevels = Global.DB2Mgr.GetContentTuningData(qInfo.ContentTuningId, handler.GetSession().GetPlayer().m_playerData.CtrOptions.GetValue().ContentTuningConditionMask);
if (questLevels.HasValue)
maxLevel = questLevels.Value.MaxLevel;
int scalingFactionGroup = 0;
ContentTuningRecord contentTuning = CliDB.ContentTuningStorage.LookupByKey(qInfo.ContentTuningId);
if (contentTuning != null)
scalingFactionGroup = contentTuning.GetScalingFactionGroup();
handler.SendSysMessage(CypherStrings.QuestListChat, qInfo.Id, qInfo.Id,
handler.GetSession().GetPlayer().GetQuestLevel(qInfo),
handler.GetSession().GetPlayer().GetQuestMinLevel(qInfo),
qInfo.MaxScalingLevel, qInfo.ScalingFactionGroup,
maxLevel, scalingFactionGroup,
title, statusStr);
}
else
handler.SendSysMessage(CypherStrings.QuestListConsole, qInfo.Id, title, statusStr);
@@ -594,11 +607,23 @@ namespace Game.Chat
}
if (handler.GetSession() != null)
{
int maxLevel = 0;
var questLevels = Global.DB2Mgr.GetContentTuningData(qInfo.ContentTuningId, handler.GetSession().GetPlayer().m_playerData.CtrOptions.GetValue().ContentTuningConditionMask);
if (questLevels.HasValue)
maxLevel = questLevels.Value.MaxLevel;
int scalingFactionGroup = 0;
ContentTuningRecord contentTuning = CliDB.ContentTuningStorage.LookupByKey(qInfo.ContentTuningId);
if (contentTuning != null)
scalingFactionGroup = contentTuning.GetScalingFactionGroup();
handler.SendSysMessage(CypherStrings.QuestListChat, qInfo.Id, qInfo.Id,
handler.GetSession().GetPlayer().GetQuestLevel(qInfo),
handler.GetSession().GetPlayer().GetQuestMinLevel(qInfo),
qInfo.MaxScalingLevel, qInfo.ScalingFactionGroup,
maxLevel, scalingFactionGroup,
_title, statusStr);
}
else
handler.SendSysMessage(CypherStrings.QuestListConsole, qInfo.Id, _title, statusStr);
+3 -3
View File
@@ -591,7 +591,7 @@ namespace Game.Chat
if (spellInfo == null)
return false;
SpellNonMeleeDamage damageInfo = new SpellNonMeleeDamage(attacker, target, spellInfo, spellInfo.GetSpellXSpellVisualId(attacker), spellInfo.SchoolMask);
SpellNonMeleeDamage damageInfo = new SpellNonMeleeDamage(attacker, target, spellInfo, new Networking.Packets.SpellCastVisual(spellInfo.GetSpellXSpellVisualId(attacker), 0), spellInfo.SchoolMask);
damageInfo.damage = damage_;
attacker.DealDamageMods(damageInfo.target, ref damageInfo.damage, ref damageInfo.absorb);
target.DealSpellDamage(damageInfo, true);
@@ -1596,7 +1596,7 @@ namespace Game.Chat
mapId = target.GetMapId();
areaId = target.GetAreaId();
alive = target.IsAlive() ? handler.GetCypherString(CypherStrings.Yes) : handler.GetCypherString(CypherStrings.No);
gender = (Gender)(byte)target.m_playerData.NativeSex;
gender = target.GetNativeSex();
}
// get additional information from DB
else
@@ -2367,7 +2367,7 @@ namespace Game.Chat
if (caster)
{
ObjectGuid castId = ObjectGuid.Create(HighGuid.Cast, SpellCastSource.Normal, player.GetMapId(), SPELL_UNSTUCK_ID, player.GetMap().GenerateLowGuid(HighGuid.Cast));
Spell.SendCastResult(caster, spellInfo, SPELL_UNSTUCK_VISUAL, castId, SpellCastResult.CantDoThatRightNow);
Spell.SendCastResult(caster, spellInfo, new Networking.Packets.SpellCastVisual(SPELL_UNSTUCK_VISUAL, 0), castId, SpellCastResult.CantDoThatRightNow);
}
return false;
+25 -3
View File
@@ -1727,11 +1727,30 @@ namespace Game
public static bool IsPlayerMeetingCondition(Player player, PlayerConditionRecord condition)
{
if (condition.MinLevel != 0 && player.GetLevel() < condition.MinLevel)
ContentTuningLevels? levels = Global.DB2Mgr.GetContentTuningData(condition.ContentTuningID, player.m_playerData.CtrOptions.GetValue().ContentTuningConditionMask);
if (levels.HasValue)
{
byte minLevel = (byte)(condition.Flags.HasAnyFlag(0x800) ? levels.Value.MinLevelWithDelta : levels.Value.MinLevel);
byte maxLevel = 0;
if (!condition.Flags.HasAnyFlag(0x20))
maxLevel = (byte)(condition.Flags.HasAnyFlag(0x800) ? levels.Value.MaxLevelWithDelta : levels.Value.MaxLevel);
if (condition.Flags.HasAnyFlag(0x80))
{
if (minLevel != 0 && player.GetLevel() >= minLevel && (maxLevel == 0 || player.GetLevel() <= maxLevel))
return false;
if (condition.MaxLevel != 0 && player.GetLevel() > condition.MaxLevel)
if (maxLevel != 0 && player.GetLevel() <= maxLevel && (minLevel == 0 || player.GetLevel() >= minLevel))
return false;
}
else
{
if (minLevel != 0 && player.GetLevel() < minLevel)
return false;
if (maxLevel != 0 && player.GetLevel() > maxLevel)
return false;
}
}
if (condition.RaceMask != 0 && !Convert.ToBoolean(player.GetRaceMask() & condition.RaceMask))
return false;
@@ -1742,7 +1761,7 @@ namespace Game
if (condition.Gender >= 0 && (int)player.GetGender() != condition.Gender)
return false;
if (condition.NativeGender >= 0 && player.m_playerData.NativeSex != condition.NativeGender)
if (condition.NativeGender >= 0 && player.GetNativeSex() != (Gender)condition.NativeGender)
return false;
if (condition.PowerType != -1 && condition.PowerTypeComp != 0)
@@ -2140,6 +2159,9 @@ namespace Game
if (condition.ModifierTreeID != 0 && !player.ModifierTreeSatisfied(condition.ModifierTreeID))
return false;
if (condition.CovenantID != 0 && player.m_playerData.CovenantID != condition.CovenantID)
return false;
return true;
}
+22 -10
View File
@@ -91,14 +91,20 @@ namespace Game.DataStorage
BattlemasterListStorage = ReadDB2<BattlemasterListRecord>("BattlemasterList.db2", HotfixStatements.SEL_BATTLEMASTER_LIST, HotfixStatements.SEL_BATTLEMASTER_LIST_LOCALE);
BroadcastTextStorage = ReadDB2<BroadcastTextRecord>("BroadcastText.db2", HotfixStatements.SEL_BROADCAST_TEXT, HotfixStatements.SEL_BROADCAST_TEXT_LOCALE);
CfgRegionsStorage = ReadDB2<Cfg_RegionsRecord>("Cfg_Regions.db2", HotfixStatements.SEL_CFG_REGIONS);
CharacterFacialHairStylesStorage = ReadDB2<CharacterFacialHairStylesRecord>("CharacterFacialHairStyles.db2", HotfixStatements.SEL_CHARACTER_FACIAL_HAIR_STYLES);
CharBaseSectionStorage = ReadDB2<CharBaseSectionRecord>("CharBaseSection.db2", HotfixStatements.SEL_CHAR_BASE_SECTION);
CharSectionsStorage = ReadDB2<CharSectionsRecord>("CharSections.db2", HotfixStatements.SEL_CHAR_SECTIONS);
CharStartOutfitStorage = ReadDB2<CharStartOutfitRecord>("CharStartOutfit.db2", HotfixStatements.SEL_CHAR_START_OUTFIT);
CharTitlesStorage = ReadDB2<CharTitlesRecord>("CharTitles.db2", HotfixStatements.SEL_CHAR_TITLES, HotfixStatements.SEL_CHAR_TITLES_LOCALE);
CharacterLoadoutStorage = ReadDB2<CharacterLoadoutRecord>("CharacterLoadout.db2", HotfixStatements.SEL_CHARACTER_LOADOUT);
CharacterLoadoutItemStorage = ReadDB2<CharacterLoadoutItemRecord>("CharacterLoadoutItem.db2", HotfixStatements.SEL_CHARACTER_LOADOUT_ITEM);
ChatChannelsStorage = ReadDB2<ChatChannelsRecord>("ChatChannels.db2", HotfixStatements.SEL_CHAT_CHANNELS, HotfixStatements.SEL_CHAT_CHANNELS_LOCALE);
ChrClassesStorage = ReadDB2<ChrClassesRecord>("ChrClasses.db2", HotfixStatements.SEL_CHR_CLASSES, HotfixStatements.SEL_CHR_CLASSES_LOCALE);
ChrClassesXPowerTypesStorage = ReadDB2<ChrClassesXPowerTypesRecord>("ChrClassesXPowerTypes.db2", HotfixStatements.SEL_CHR_CLASSES_X_POWER_TYPES);
ChrCustomizationChoiceStorage= ReadDB2<ChrCustomizationChoiceRecord>("ChrCustomizationChoice.db2", HotfixStatements.SEL_CHR_CUSTOMIZATION_CHOICE, HotfixStatements.SEL_CHR_CUSTOMIZATION_CHOICE_LOCALE);
ChrCustomizationDisplayInfoStorage= ReadDB2<ChrCustomizationDisplayInfoRecord>("ChrCustomizationDisplayInfo.db2", HotfixStatements.SEL_CHR_CUSTOMIZATION_DISPLAY_INFO);
ChrCustomizationElementStorage =ReadDB2<ChrCustomizationElementRecord>("ChrCustomizationElement.db2", HotfixStatements.SEL_CHR_CUSTOMIZATION_ELEMENT);
ChrCustomizationOptionStorage =ReadDB2<ChrCustomizationOptionRecord>("ChrCustomizationOption.db2", HotfixStatements.SEL_CHR_CUSTOMIZATION_OPTION, HotfixStatements.SEL_CHR_CUSTOMIZATION_OPTION_LOCALE);
ChrCustomizationReqStorage =ReadDB2<ChrCustomizationReqRecord>("ChrCustomizationReq.db2", HotfixStatements.SEL_CHR_CUSTOMIZATION_REQ);
ChrCustomizationReqChoiceStorage =ReadDB2<ChrCustomizationReqChoiceRecord>("ChrCustomizationReqChoice.db2", HotfixStatements.SEL_CHR_CUSTOMIZATION_REQ_CHOICE);
ChrModelStorage =ReadDB2<ChrModelRecord>("ChrModel.db2", HotfixStatements.SEL_CHR_MODEL);
ChrRaceXChrModelStorage =ReadDB2<ChrRaceXChrModelRecord>("ChrRaceXChrModel.db2", HotfixStatements.SEL_CHR_RACE_X_CHR_MODEL);
ChrRacesStorage = ReadDB2<ChrRacesRecord>("ChrRaces.db2", HotfixStatements.SEL_CHR_RACES, HotfixStatements.SEL_CHR_RACES_LOCALE);
ChrSpecializationStorage = ReadDB2<ChrSpecializationRecord>("ChrSpecialization.db2", HotfixStatements.SEL_CHR_SPECIALIZATION, HotfixStatements.SEL_CHR_SPECIALIZATION_LOCALE);
CinematicCameraStorage = ReadDB2<CinematicCameraRecord>("CinematicCamera.db2", HotfixStatements.SEL_CINEMATIC_CAMERA);
@@ -232,7 +238,6 @@ namespace Game.DataStorage
RewardPackStorage = ReadDB2<RewardPackRecord>("RewardPack.db2", HotfixStatements.SEL_REWARD_PACK);
RewardPackXCurrencyTypeStorage = ReadDB2<RewardPackXCurrencyTypeRecord>("RewardPackXCurrencyType.db2", HotfixStatements.SEL_REWARD_PACK_X_CURRENCY_TYPE);
RewardPackXItemStorage = ReadDB2<RewardPackXItemRecord>("RewardPackXItem.db2", HotfixStatements.SEL_REWARD_PACK_X_ITEM);
ScalingStatDistributionStorage = ReadDB2<ScalingStatDistributionRecord>("ScalingStatDistribution.db2", HotfixStatements.SEL_SCALING_STAT_DISTRIBUTION);
ScenarioStorage = ReadDB2<ScenarioRecord>("Scenario.db2", HotfixStatements.SEL_SCENARIO, HotfixStatements.SEL_SCENARIO_LOCALE);
ScenarioStepStorage = ReadDB2<ScenarioStepRecord>("ScenarioStep.db2", HotfixStatements.SEL_SCENARIO_STEP, HotfixStatements.SEL_SCENARIO_STEP_LOCALE);
//SceneScriptStorage = ReadDB2<SceneScriptRecord>("SceneScript.db2", HotfixStatements.SEL_SCENE_SCRIPT);
@@ -287,6 +292,7 @@ namespace Game.DataStorage
TotemCategoryStorage = ReadDB2<TotemCategoryRecord>("TotemCategory.db2", HotfixStatements.SEL_TOTEM_CATEGORY, HotfixStatements.SEL_TOTEM_CATEGORY_LOCALE);
ToyStorage = ReadDB2<ToyRecord>("Toy.db2", HotfixStatements.SEL_TOY, HotfixStatements.SEL_TOY_LOCALE);
TransmogHolidayStorage = ReadDB2<TransmogHolidayRecord>("TransmogHoliday.db2", HotfixStatements.SEL_TRANSMOG_HOLIDAY);
TransmogIllusionStorage = ReadDB2<TransmogIllusionRecord>("TransmogIllusion.db2", HotfixStatements.SEL_TRANSMOG_ILLUSION);
TransmogSetStorage = ReadDB2<TransmogSetRecord>("TransmogSet.db2", HotfixStatements.SEL_TRANSMOG_SET, HotfixStatements.SEL_TRANSMOG_SET_LOCALE);
TransmogSetGroupStorage = ReadDB2<TransmogSetGroupRecord>("TransmogSetGroup.db2", HotfixStatements.SEL_TRANSMOG_SET_GROUP, HotfixStatements.SEL_TRANSMOG_SET_GROUP_LOCALE);
TransmogSetItemStorage = ReadDB2<TransmogSetItemRecord>("TransmogSetItem.db2", HotfixStatements.SEL_TRANSMOG_SET_ITEM);
@@ -440,14 +446,20 @@ namespace Game.DataStorage
public static DB6Storage<BattlemasterListRecord> BattlemasterListStorage;
public static DB6Storage<BroadcastTextRecord> BroadcastTextStorage;
public static DB6Storage<Cfg_RegionsRecord> CfgRegionsStorage;
public static DB6Storage<CharacterFacialHairStylesRecord> CharacterFacialHairStylesStorage;
public static DB6Storage<CharBaseSectionRecord> CharBaseSectionStorage;
public static DB6Storage<CharSectionsRecord> CharSectionsStorage;
public static DB6Storage<CharStartOutfitRecord> CharStartOutfitStorage;
public static DB6Storage<CharTitlesRecord> CharTitlesStorage;
public static DB6Storage<CharacterLoadoutRecord> CharacterLoadoutStorage;
public static DB6Storage<CharacterLoadoutItemRecord> CharacterLoadoutItemStorage;
public static DB6Storage<ChatChannelsRecord> ChatChannelsStorage;
public static DB6Storage<ChrClassesRecord> ChrClassesStorage;
public static DB6Storage<ChrClassesXPowerTypesRecord> ChrClassesXPowerTypesStorage;
public static DB6Storage<ChrCustomizationChoiceRecord> ChrCustomizationChoiceStorage;
public static DB6Storage<ChrCustomizationDisplayInfoRecord> ChrCustomizationDisplayInfoStorage;
public static DB6Storage<ChrCustomizationElementRecord> ChrCustomizationElementStorage;
public static DB6Storage<ChrCustomizationReqRecord> ChrCustomizationReqStorage;
public static DB6Storage<ChrCustomizationReqChoiceRecord> ChrCustomizationReqChoiceStorage;
public static DB6Storage<ChrModelRecord> ChrModelStorage;
public static DB6Storage<ChrRaceXChrModelRecord> ChrRaceXChrModelStorage;
public static DB6Storage<ChrCustomizationOptionRecord> ChrCustomizationOptionStorage;
public static DB6Storage<ChrRacesRecord> ChrRacesStorage;
public static DB6Storage<ChrSpecializationRecord> ChrSpecializationStorage;
public static DB6Storage<CinematicCameraRecord> CinematicCameraStorage;
@@ -581,7 +593,6 @@ namespace Game.DataStorage
public static DB6Storage<RewardPackRecord> RewardPackStorage;
public static DB6Storage<RewardPackXCurrencyTypeRecord> RewardPackXCurrencyTypeStorage;
public static DB6Storage<RewardPackXItemRecord> RewardPackXItemStorage;
public static DB6Storage<ScalingStatDistributionRecord> ScalingStatDistributionStorage;
public static DB6Storage<ScenarioRecord> ScenarioStorage;
public static DB6Storage<ScenarioStepRecord> ScenarioStepStorage;
//public static DB6Storage<SceneScriptRecord> SceneScriptStorage;
@@ -636,6 +647,7 @@ namespace Game.DataStorage
public static DB6Storage<TotemCategoryRecord> TotemCategoryStorage;
public static DB6Storage<ToyRecord> ToyStorage;
public static DB6Storage<TransmogHolidayRecord> TransmogHolidayStorage;
public static DB6Storage<TransmogIllusionRecord> TransmogIllusionStorage;
public static DB6Storage<TransmogSetRecord> TransmogSetStorage;
public static DB6Storage<TransmogSetGroupRecord> TransmogSetGroupStorage;
public static DB6Storage<TransmogSetItemRecord> TransmogSetItemStorage;
+155 -72
View File
@@ -23,6 +23,7 @@ using System;
using System.Collections.Generic;
using System.Linq;
using System.Collections;
using Framework.Dynamic;
namespace Game.DataStorage
{
@@ -123,41 +124,6 @@ namespace Game.DataStorage
}
}
foreach (CharacterFacialHairStylesRecord characterFacialStyle in CliDB.CharacterFacialHairStylesStorage.Values)
_characterFacialHairStyles.Add(Tuple.Create(characterFacialStyle.RaceID, characterFacialStyle.SexID, (uint)characterFacialStyle.VariationID));
CliDB.CharacterFacialHairStylesStorage.Clear();
CharBaseSectionVariation[] sectionToBase = new CharBaseSectionVariation[(int)CharSectionType.Max];
foreach (CharBaseSectionRecord charBaseSection in CliDB.CharBaseSectionStorage.Values)
{
Cypher.Assert(charBaseSection.ResolutionVariationEnum < (byte)CharSectionType.Max, $"SECTION_TYPE_MAX ({(byte)CharSectionType.Max}) must be equal to or greater than {charBaseSection.ResolutionVariationEnum + 1}");
Cypher.Assert(charBaseSection.VariationEnum < CharBaseSectionVariation.Max, $"CharBaseSectionVariation.Max {(byte)CharBaseSectionVariation.Max} must be equal to or greater than {charBaseSection.VariationEnum + 1}");
sectionToBase[charBaseSection.ResolutionVariationEnum] = charBaseSection.VariationEnum;
}
CliDB.CharBaseSectionStorage.Clear();
MultiMap<Tuple<byte, byte, CharBaseSectionVariation>, Tuple<byte, byte>> addedSections = new MultiMap<Tuple<byte, byte, CharBaseSectionVariation>, Tuple<byte, byte>>();
foreach (CharSectionsRecord charSection in CliDB.CharSectionsStorage.Values)
{
Cypher.Assert(charSection.BaseSection < (byte)CharSectionType.Max, $"SECTION_TYPE_MAX ({(byte)CharSectionType.Max}) must be equal to or greater than {charSection.BaseSection + 1}");
Tuple<byte, byte, CharBaseSectionVariation> sectionKey = Tuple.Create(charSection.RaceID, charSection.SexID, sectionToBase[charSection.BaseSection]);
Tuple<byte, byte> sectionCombination = Tuple.Create(charSection.VariationIndex, charSection.ColorIndex);
if (addedSections.Contains(sectionKey, sectionCombination))
continue;
addedSections.Add(sectionKey, sectionCombination);
_charSections.Add(sectionKey, charSection);
}
CliDB.CharSectionsStorage.Clear();
foreach (var outfit in CliDB.CharStartOutfitStorage.Values)
_charStartOutfits[(uint)((byte)outfit.RaceID | (outfit.ClassID << 8) | (outfit.SexID << 16))] = outfit;
var powers = new List<ChrClassesXPowerTypesRecord>();
foreach (var chrClasses in CliDB.ChrClassesXPowerTypesStorage.Values)
powers.Add(chrClasses);
@@ -175,6 +141,71 @@ namespace Game.DataStorage
_powersByClass[power.ClassID][power.PowerType] = index;
}
foreach (var customizationChoice in CliDB.ChrCustomizationChoiceStorage.Values)
_chrCustomizationChoicesByOption.Add(customizationChoice.ChrCustomizationOptionID, customizationChoice);
MultiMap<uint, Tuple<uint, byte>> shapeshiftFormByModel = new MultiMap<uint, Tuple<uint, byte>>();
Dictionary<uint, ChrCustomizationDisplayInfoRecord> displayInfoByCustomizationChoice = new Dictionary<uint, ChrCustomizationDisplayInfoRecord>();
// build shapeshift form model lookup
foreach (ChrCustomizationElementRecord customizationElement in CliDB.ChrCustomizationElementStorage.Values)
{
ChrCustomizationDisplayInfoRecord customizationDisplayInfo = CliDB.ChrCustomizationDisplayInfoStorage.LookupByKey(customizationElement.ChrCustomizationDisplayInfoID);
if (customizationDisplayInfo != null)
{
ChrCustomizationChoiceRecord customizationChoice = CliDB.ChrCustomizationChoiceStorage.LookupByKey(customizationElement.ChrCustomizationChoiceID);
if (customizationChoice != null)
{
displayInfoByCustomizationChoice[customizationElement.ChrCustomizationChoiceID] = customizationDisplayInfo;
ChrCustomizationOptionRecord customizationOption = CliDB.ChrCustomizationOptionStorage.LookupByKey(customizationChoice.ChrCustomizationOptionID);
if (customizationOption != null)
shapeshiftFormByModel.Add(customizationOption.ChrModelID, Tuple.Create(customizationOption.Id, (byte)customizationDisplayInfo.ShapeshiftFormID));
}
}
}
MultiMap<uint, ChrCustomizationOptionRecord> customizationOptionsByModel = new MultiMap<uint, ChrCustomizationOptionRecord>();
foreach (ChrCustomizationOptionRecord customizationOption in CliDB.ChrCustomizationOptionStorage.Values)
customizationOptionsByModel.Add(customizationOption.ChrModelID, customizationOption);
foreach (ChrCustomizationReqChoiceRecord reqChoice in CliDB.ChrCustomizationReqChoiceStorage.Values)
{
ChrCustomizationChoiceRecord customizationChoice = CliDB.ChrCustomizationChoiceStorage.LookupByKey(reqChoice.ChrCustomizationChoiceID);
if (customizationChoice != null)
{
if (!_chrCustomizationRequiredChoices.ContainsKey(reqChoice.ChrCustomizationReqID))
_chrCustomizationRequiredChoices[reqChoice.ChrCustomizationReqID] = new MultiMap<uint, uint>();
_chrCustomizationRequiredChoices[reqChoice.ChrCustomizationReqID].Add(customizationChoice.ChrCustomizationOptionID, reqChoice.ChrCustomizationChoiceID);
}
}
foreach (ChrRaceXChrModelRecord raceModel in CliDB.ChrRaceXChrModelStorage.Values)
{
ChrModelRecord model = CliDB.ChrModelStorage.LookupByKey(raceModel.ChrModelID);
if (model != null)
{
_chrModelsByRaceAndGender[Tuple.Create((byte)raceModel.ChrRacesID, (byte)model.Sex)] = model;
var customizationOptionsForModel = customizationOptionsByModel.LookupByKey(model.Id);
if (customizationOptionsForModel != null)
_chrCustomizationOptionsByRaceAndGender.AddRange(Tuple.Create((byte)raceModel.ChrRacesID, (byte)model.Sex), customizationOptionsForModel);
// link shapeshift displays to race/gender/form
foreach (var shapeshiftOptionsForModel in shapeshiftFormByModel.LookupByKey(model.Id))
{
ShapeshiftFormModelData data = _chrCustomizationChoicesForShapeshifts[Tuple.Create((byte)raceModel.ChrRacesID, (byte)model.Sex, shapeshiftOptionsForModel.Item2)];
data.OptionID = shapeshiftOptionsForModel.Item2;
data.Choices = _chrCustomizationChoicesByOption.LookupByKey(shapeshiftOptionsForModel.Item2);
if (!data.Choices.Empty())
{
for (int i = 0; i < data.Choices.Count; ++i)
data.Displays[i] = displayInfoByCustomizationChoice.LookupByKey(data.Choices[i].Id);
}
}
}
}
foreach (ChrSpecializationRecord chrSpec in CliDB.ChrSpecializationStorage.Values)
{
//ASSERT(chrSpec.ClassID < MAX_CLASSES);
@@ -190,9 +221,6 @@ namespace Game.DataStorage
_chrSpecializationsByIndex[storageIndex] = new ChrSpecializationRecord[PlayerConst.MaxSpecializations];
_chrSpecializationsByIndex[storageIndex][chrSpec.OrderIndex] = chrSpec;
if (chrSpec.Flags.HasAnyFlag(ChrSpecializationFlag.Recommended))
_defaultChrSpecializationsByClass[(uint)chrSpec.ClassID] = chrSpec;
}
foreach (ContentTuningXExpectedRecord contentTuningXExpectedStat in CliDB.ContentTuningXExpectedStorage.Values)
@@ -557,7 +585,7 @@ namespace Game.DataStorage
UiMapRecord parentUiMap = CliDB.UiMapStorage.LookupByKey(uiMap.ParentUiMapID);
if (parentUiMap != null)
{
if (Convert.ToBoolean(parentUiMap.Flags & 0x80))
if (parentUiMap.GetFlags().HasAnyFlag(UiMapFlag.NoWorldPositions))
continue;
UiMapAssignmentRecord uiMapAssignment = null;
UiMapAssignmentRecord parentUiMapAssignment = null;
@@ -744,9 +772,7 @@ namespace Game.DataStorage
public uint GetEmptyAnimStateID()
{
return 1484;
// TEMP: well... AnimationData.db2 in 8.3.0 has more rows than max hardcoded anim id in client
// return sAnimationDataStore.GetNumRows();
return (uint)CliDB.AnimationDataStorage.Count;
}
public List<uint> GetAreasForGroup(uint areaGroupId)
@@ -855,31 +881,6 @@ namespace Game.DataStorage
return broadcastText.Text[SharedConst.DefaultLocale];
}
public bool HasCharacterFacialHairStyle(Race race, Gender gender, uint variationId)
{
return _characterFacialHairStyles.Contains(Tuple.Create((byte)race, (byte)gender, variationId));
}
public bool HasCharSections(Race race, Gender gender, CharBaseSectionVariation variation)
{
return _charSections.ContainsKey(Tuple.Create((byte)race, (byte)gender, variation));
}
public CharSectionsRecord GetCharSectionEntry(Race race, Gender gender, CharBaseSectionVariation variation, byte variationIndex, byte colorIndex)
{
var list = _charSections.LookupByKey(Tuple.Create((byte)race, (byte)gender, variation));
foreach (var charSection in list)
if (charSection.VariationIndex == variationIndex && charSection.ColorIndex == colorIndex)
return charSection;
return null;
}
public CharStartOutfitRecord GetCharStartOutfitEntry(uint race, uint class_, uint gender)
{
return _charStartOutfits.LookupByKey(race | (class_ << 8) | (gender << 16));
}
public string GetClassName(Class class_, Locale locale = Locale.enUS)
{
ChrClassesRecord classEntry = CliDB.ChrClassesStorage.LookupByKey(class_);
@@ -897,6 +898,26 @@ namespace Game.DataStorage
return _powersByClass[(int)classId][(int)powerType];
}
public List<ChrCustomizationChoiceRecord> GetCustomiztionChoices(uint chrCustomizationOptionId)
{
return _chrCustomizationChoicesByOption.LookupByKey(chrCustomizationOptionId);
}
public List<ChrCustomizationOptionRecord> GetCustomiztionOptions(Race race, Gender gender)
{
return _chrCustomizationOptionsByRaceAndGender.LookupByKey(Tuple.Create(race, gender));
}
public MultiMap<uint, uint> GetRequiredCustomizationChoices(uint chrCustomizationReqId)
{
return _chrCustomizationRequiredChoices.LookupByKey(chrCustomizationReqId);
}
public ChrModelRecord GetChrModel(Race race, Gender gender)
{
return _chrModelsByRaceAndGender.LookupByKey(Tuple.Create(race, gender));
}
public string GetChrRaceName(Race race, Locale locale = Locale.enUS)
{
ChrRacesRecord raceEntry = CliDB.ChrRacesStorage.LookupByKey(race);
@@ -916,7 +937,46 @@ namespace Game.DataStorage
public ChrSpecializationRecord GetDefaultChrSpecializationForClass(Class class_)
{
return _defaultChrSpecializationsByClass.LookupByKey(class_);
return GetChrSpecializationByIndex(class_, PlayerConst.InitialSpecializationIndex);
}
public ContentTuningLevels? GetContentTuningData(uint contentTuningId, uint replacementConditionMask, bool forItem = false)
{
ContentTuningRecord contentTuning = CliDB.ContentTuningStorage.LookupByKey(contentTuningId);
if (contentTuning == null)
return null;
if (forItem && contentTuning.GetFlags().HasFlag(ContentTuningFlag.DisabledForItem))
return null;
int getLevelAdjustment(ContentTuningCalcType type) => type switch
{
ContentTuningCalcType.PlusOne => 1,
ContentTuningCalcType.PlusMaxLevelForExpansion => (int)Global.ObjectMgr.GetMaxLevelForExpansion((Expansion)WorldConfig.GetUIntValue(WorldCfg.Expansion)),
_ => 0
};
ContentTuningLevels levels = new ContentTuningLevels();
levels.MinLevel = (short)(contentTuning.MinLevel + getLevelAdjustment((ContentTuningCalcType)contentTuning.MinLevelType));
levels.MaxLevel = (short)(contentTuning.MaxLevel + getLevelAdjustment((ContentTuningCalcType)contentTuning.MaxLevelType));
levels.MinLevelWithDelta = (short)Math.Clamp(levels.MinLevel + contentTuning.TargetLevelDelta, 1, SharedConst.MaxLevel);
levels.MaxLevelWithDelta = (short)Math.Clamp(levels.MaxLevel + contentTuning.TargetLevelMaxDelta, 1, SharedConst.MaxLevel);
// clamp after calculating levels with delta (delta can bring "overflown" level back into correct range)
levels.MinLevel = (short)Math.Clamp((int)levels.MinLevel, 1, SharedConst.MaxLevel);
levels.MaxLevel = (short)Math.Clamp((int)levels.MaxLevel, 1, SharedConst.MaxLevel);
if (contentTuning.TargetLevelMin != 0)
levels.TargetLevelMin = (short)contentTuning.TargetLevelMin;
else
levels.TargetLevelMin = levels.MinLevelWithDelta;
if (contentTuning.TargetLevelMax != 0)
levels.TargetLevelMax = (short)contentTuning.TargetLevelMax;
else
levels.TargetLevelMax = levels.MaxLevelWithDelta;
return levels;
}
public string GetCreatureFamilyPetName(CreatureFamily petfamily, Locale locale)
@@ -1708,6 +1768,11 @@ namespace Game.DataStorage
return _rewardPackItems.LookupByKey(rewardPackID);
}
public ShapeshiftFormModelData GetShapeshiftFormModelData(Race race, Gender gender, ShapeShiftForm form)
{
return _chrCustomizationChoicesForShapeshifts.LookupByKey(Tuple.Create((byte)race, (byte)gender, (byte)form));
}
public List<SkillLineRecord> GetSkillLinesForParentSkill(uint parentSkillId)
{
return _skillLinesByParentSkillLine.LookupByKey(parentSkillId);
@@ -2091,12 +2156,13 @@ namespace Game.DataStorage
MultiMap<uint, AzeritePowerSetMemberRecord> _azeritePowers = new MultiMap<uint, AzeritePowerSetMemberRecord>();
Dictionary<(uint azeriteUnlockSetId, ItemContext itemContext), byte[]> _azeriteTierUnlockLevels = new Dictionary<(uint azeriteUnlockSetId, ItemContext itemContext), byte[]>();
Dictionary<(uint itemId, ItemContext itemContext), AzeriteUnlockMappingRecord> _azeriteUnlockMappings = new Dictionary<(uint itemId, ItemContext itemContext), AzeriteUnlockMappingRecord>();
List<Tuple<byte, byte, uint>> _characterFacialHairStyles = new List<Tuple<byte, byte, uint>>();
MultiMap<Tuple<byte, byte, CharBaseSectionVariation>, CharSectionsRecord> _charSections = new MultiMap<Tuple<byte, byte, CharBaseSectionVariation>, CharSectionsRecord>();
Dictionary<uint, CharStartOutfitRecord> _charStartOutfits = new Dictionary<uint, CharStartOutfitRecord>();
uint[][] _powersByClass = new uint[(int)Class.Max][];
MultiMap<uint, ChrCustomizationChoiceRecord> _chrCustomizationChoicesByOption = new MultiMap<uint, ChrCustomizationChoiceRecord>();
Dictionary<Tuple<byte, byte>, ChrModelRecord> _chrModelsByRaceAndGender = new Dictionary<Tuple<byte, byte>, ChrModelRecord>();
Dictionary<Tuple<byte, byte, byte>, ShapeshiftFormModelData> _chrCustomizationChoicesForShapeshifts = new Dictionary<Tuple<byte, byte, byte>, ShapeshiftFormModelData>();
MultiMap<Tuple<byte, byte>, ChrCustomizationOptionRecord> _chrCustomizationOptionsByRaceAndGender = new MultiMap<Tuple<byte, byte>, ChrCustomizationOptionRecord>();
Dictionary<uint, MultiMap<uint, uint>> _chrCustomizationRequiredChoices = new Dictionary<uint, MultiMap<uint, uint>>();
ChrSpecializationRecord[][] _chrSpecializationsByIndex = new ChrSpecializationRecord[(int)Class.Max + 1][];
Dictionary<uint, ChrSpecializationRecord> _defaultChrSpecializationsByClass = new Dictionary<uint, ChrSpecializationRecord>();
MultiMap<uint, CurvePointRecord> _curvePoints = new MultiMap<uint, CurvePointRecord>();
Dictionary<Tuple<uint, byte, byte, byte>, EmotesTextSoundRecord> _emoteTextSounds = new Dictionary<Tuple<uint, byte, byte, byte>, EmotesTextSoundRecord>();
Dictionary<Tuple<uint, int>, ExpectedStatRecord> _expectedStatsByLevel = new Dictionary<Tuple<uint, int>, ExpectedStatRecord>();
@@ -2363,6 +2429,23 @@ namespace Game.DataStorage
}
}
public struct ContentTuningLevels
{
public short MinLevel;
public short MaxLevel;
public short MinLevelWithDelta;
public short MaxLevelWithDelta;
public short TargetLevelMin;
public short TargetLevelMax;
}
public class ShapeshiftFormModelData
{
public uint OptionID;
public List<ChrCustomizationChoiceRecord> Choices = new List<ChrCustomizationChoiceRecord>();
public List<ChrCustomizationDisplayInfoRecord> Displays = new List<ChrCustomizationDisplayInfoRecord>();
}
enum CurveInterpolationMode
{
Linear = 0,
+2 -1
View File
@@ -39,6 +39,7 @@ namespace Game.DataStorage
public int RewardItemID;
public uint CriteriaTree;
public ushort SharesCriteria;
public int CovenantID;
}
public sealed class AnimationDataRecord
@@ -79,7 +80,6 @@ namespace Game.DataStorage
public ushort UwAmbience;
public ushort ZoneMusic;
public ushort UwZoneMusic;
public sbyte ExplorationLevel;
public ushort IntroSound;
public uint UwIntroSound;
public byte FactionGroupMask;
@@ -89,6 +89,7 @@ namespace Game.DataStorage
public byte WildBattlePetLevelMin;
public byte WildBattlePetLevelMax;
public byte WindSettingsID;
public uint ContentTuningID;
public AreaFlags[] Flags = new AreaFlags[2];
public ushort[] LiquidTypeID = new ushort[4];
+4 -3
View File
@@ -54,7 +54,7 @@ namespace Game.DataStorage
public sealed class BattlePetBreedStateRecord
{
public uint Id;
public byte BattlePetStateID;
public int BattlePetStateID;
public ushort Value;
public uint BattlePetBreedID;
}
@@ -72,6 +72,7 @@ namespace Game.DataStorage
public sbyte SourceTypeEnum;
public int CardUIModelSceneID;
public int LoadoutUIModelSceneID;
public int CovenantID;
}
public sealed class BattlePetSpeciesStateRecord
@@ -100,7 +101,7 @@ namespace Game.DataStorage
public ushort HolidayWorldState;
public BattlemasterListFlags Flags;
public int IconFileDataID;
public short RequiredPlayerConditionID;
public int RequiredPlayerConditionID;
public short[] MapId = new short[16];
}
@@ -109,7 +110,7 @@ namespace Game.DataStorage
public LocalizedString Text;
public LocalizedString Text1;
public uint Id;
public byte LanguageID;
public int LanguageID;
public int ConditionID;
public ushort EmotesID;
public byte Flags;
+182 -70
View File
@@ -30,47 +30,6 @@ namespace Game.DataStorage
public uint ChallengeOrigin;
}
public sealed class CharacterFacialHairStylesRecord
{
public uint Id;
public int[] Geoset = new int[5];
public byte RaceID;
public byte SexID;
public byte VariationID;
}
public sealed class CharBaseSectionRecord
{
public uint Id;
public byte LayoutResType;
public CharBaseSectionVariation VariationEnum;
public byte ResolutionVariationEnum;
}
public sealed class CharSectionsRecord
{
public uint Id;
public byte RaceID;
public byte SexID;
public sbyte BaseSection;
public byte VariationIndex;
public byte ColorIndex;
public short Flags;
public int[] MaterialResourcesID = new int[3];
}
public sealed class CharStartOutfitRecord
{
public uint Id;
public byte ClassID;
public byte SexID;
public byte OutfitID;
public uint PetDisplayID; // Pet Model ID for starting pet
public byte PetFamilyID; // Pet Family Entry for starting pet
public int[] ItemID = new int[24];
public uint RaceID;
}
public sealed class CharTitlesRecord
{
public uint Id;
@@ -80,13 +39,31 @@ namespace Game.DataStorage
public sbyte Flags;
}
public sealed class ChatChannelsRecord
public sealed class CharacterLoadoutRecord
{
public long RaceMask;
public uint Id;
public sbyte ChrClassID;
public sbyte Purpose;
public bool IsForNewCharacter() { return Purpose == 9; }
}
public sealed class CharacterLoadoutItemRecord
{
public uint Id;
public ushort CharacterLoadoutID;
public uint ItemID;
}
public sealed class ChatChannelsRecord
{
public LocalizedString Name;
public string Shortcut;
public uint Id;
public ChannelDBCFlags Flags;
public sbyte FactionGroup;
public int Ruleset;
}
public sealed class ChrClassesRecord
@@ -96,14 +73,29 @@ namespace Game.DataStorage
public string NameMale;
public string NameFemale;
public string PetNameToken;
public string Description;
public string RoleInfoString;
public string DisabledString;
public string HyphenatedNameMale;
public string HyphenatedNameFemale;
public uint Id;
public uint CreateScreenFileDataID;
public uint SelectScreenFileDataID;
public uint IconFileDataID;
public uint LowResScreenFileDataID;
public int StartingLevel;
public uint Flags;
public uint SpellTextureBlobFileDataID;
public ushort Flags;
public uint RolesMask;
public uint ArmorTypeMask;
public int CharStartKitUnknown901;
public int MaleCharacterCreationVisualFallback;
public int MaleCharacterCreationIdleVisualFallback;
public int FemaleCharacterCreationVisualFallback;
public int FemaleCharacterCreationIdleVisualFallback;
public int CharacterCreationIdleGroundVisualFallback;
public int CharacterCreationGroundVisualFallback;
public int AlteredFormCharacterCreationIdleVisualFallback;
public int CharacterCreationAnimLoopWaitTimeMsFallback;
public ushort CinematicSequenceID;
public ushort DefaultSpec;
public byte PrimaryStatPriority;
@@ -112,6 +104,9 @@ namespace Game.DataStorage
public byte AttackPowerPerAgility;
public byte AttackPowerPerStrength;
public byte SpellClassSet;
public byte ChatColorR;
public byte ChatColorG;
public byte ChatColorB;
}
public sealed class ChrClassesXPowerTypesRecord
@@ -121,6 +116,103 @@ namespace Game.DataStorage
public uint ClassID;
}
public sealed class ChrCustomizationChoiceRecord
{
public LocalizedString Name;
public uint Id;
public uint ChrCustomizationOptionID;
public uint ChrCustomizationReqID;
public ushort SortOrder;
public int SwatchColor1;
public int SwatchColor2;
public ushort UiOrderIndex;
public int Flags;
}
public sealed class ChrCustomizationDisplayInfoRecord
{
public uint Id;
public int ShapeshiftFormID;
public uint DisplayID;
public float BarberShopMinCameraDistance;
public float BarberShopHeightOffset;
}
public sealed class ChrCustomizationElementRecord
{
public uint Id;
public uint ChrCustomizationChoiceID;
public int RelatedChrCustomizationChoiceID;
public int ChrCustomizationGeosetID;
public int ChrCustomizationSkinnedModelID;
public int ChrCustomizationMaterialID;
public int ChrCustomizationBoneSetID;
public int ChrCustomizationCondModelID;
public int ChrCustomizationDisplayInfoID;
}
public sealed class ChrCustomizationOptionRecord
{
public LocalizedString Name;
public uint Id;
public ushort SecondaryID;
public int Flags;
public uint ChrModelID;
public int SortIndex;
public int ChrCustomizationCategoryID;
public int OptionType;
public float BarberShopCostModifier;
public int ChrCustomizationID;
public int ChrCustomizationReqID;
public int UiOrderIndex;
}
public sealed class ChrCustomizationReqRecord
{
public uint Id;
public int Flags;
public int ClassMask;
public int AchievementID;
public int OverrideArchive; // -1: allow any, otherwise must match OverrideArchive cvar
public uint ItemModifiedAppearanceID;
public ChrCustomizationReqFlag GetFlags() { return (ChrCustomizationReqFlag)Flags; }
}
public sealed class ChrCustomizationReqChoiceRecord
{
public uint Id;
public uint ChrCustomizationChoiceID;
public uint ChrCustomizationReqID;
}
public sealed class ChrModelRecord
{
public float[] FaceCustomizationOffset = new float[3];
public float[] CustomizeOffset = new float[3];
public uint Id;
public int Sex;
public uint DisplayID;
public int CharComponentTextureLayoutID;
public int Flags;
public int SkeletonFileDataID;
public int ModelFallbackChrModelID;
public int TextureFallbackChrModelID;
public int HelmVisFallbackChrModelID;
public float CustomizeScale;
public float CustomizeFacing;
public float CameraDistanceOffset;
public float BarberShopCameraOffsetScale;
public float BarberShopCameraRotationOffset;
}
public sealed class ChrRaceXChrModelRecord
{
public uint Id;
public int ChrRacesID;
public int ChrModelID;
}
public sealed class ChrRacesRecord
{
public string ClientPrefix;
@@ -129,37 +221,39 @@ namespace Game.DataStorage
public string NameFemale;
public string NameLowercase;
public string NameFemaleLowercase;
public string NameS;
public string NameFemaleS;
public string NameLowercaseS;
public string NameFemaleLowercaseS;
public string RaceFantasyDescription;
public string NameL;
public string NameFemaleL;
public string NameLowercaseL;
public string NameFemaleLowercaseL;
public uint Id;
public int Flags;
public uint MaleDisplayId;
public uint FemaleDisplayId;
public uint HighResMaleDisplayId;
public uint HighResFemaleDisplayId;
public int BaseLanguage;
public int ResSicknessSpellID;
public int SplashSoundID;
public int CreateScreenFileDataID;
public int SelectScreenFileDataID;
public float[] MaleCustomizeOffset = new float[3];
public float[] FemaleCustomizeOffset = new float[3];
public int LowResScreenFileDataID;
public uint[] AlteredFormStartVisualKitID = new uint[3];
public uint[] AlteredFormFinishVisualKitID = new uint[3];
public int HeritageArmorAchievementID;
public int StartingLevel;
public int UiDisplayOrder;
public int FemaleSkeletonFileDataID;
public int MaleSkeletonFileDataID;
public int HelmVisFallbackRaceID;
public int PlayableRaceBit;
public int HelmetAnimScalingRaceID;
public int TransmogrifyDisabledSlotMask;
public float[] AlteredFormCustomizeOffsetFallback = new float[3];
public float AlteredFormCustomizeRotationFallback;
public ushort FactionID;
public ushort CinematicSequenceID;
public short ResSicknessSpellID;
public short SplashSoundID;
public sbyte BaseLanguage;
public sbyte CreatureType;
public sbyte Alliance;
public sbyte RaceRelated;
public sbyte UnalteredVisualRaceID;
public sbyte CharComponentTextureLayoutID;
public sbyte CharComponentTexLayoutHiResID;
public sbyte DefaultClassID;
public sbyte NeutralRaceID;
public sbyte MaleModelFallbackRaceID;
@@ -170,6 +264,7 @@ namespace Game.DataStorage
public sbyte MaleTextureFallbackSex;
public sbyte FemaleTextureFallbackRaceID;
public sbyte FemaleTextureFallbackSex;
public sbyte UnalteredVisualCustomizationRaceID;
}
public sealed class ChrSpecializationRecord
@@ -213,10 +308,31 @@ namespace Game.DataStorage
public sealed class ContentTuningRecord
{
public uint Id;
public int MinLevel;
public int MaxLevel;
public int Flags;
public int ExpansionID;
public int MinLevel;
public int MaxLevel;
public int MinLevelType;
public int MaxLevelType;
public int TargetLevelDelta;
public int TargetLevelMaxDelta;
public int TargetLevelMin;
public int TargetLevelMax;
public int MinItemLevel;
public ContentTuningFlag GetFlags() { return (ContentTuningFlag)Flags; }
public int GetScalingFactionGroup()
{
ContentTuningFlag flags = GetFlags();
if (flags.HasFlag(ContentTuningFlag.Horde))
return 5;
if (flags.HasFlag(ContentTuningFlag.Alliance))
return 3;
return 0;
}
}
public sealed class ContentTuningXExpectedRecord
@@ -284,15 +400,9 @@ namespace Game.DataStorage
public sbyte DisplayRaceID;
public sbyte DisplaySexID;
public sbyte DisplayClassID;
public sbyte SkinID;
public sbyte FaceID;
public sbyte HairStyleID;
public sbyte HairColorID;
public sbyte FacialHairID;
public sbyte Flags;
public int BakeMaterialResourcesID;
public int HDBakeMaterialResourcesID;
public byte[] CustomDisplayOption = new byte[3];
}
public sealed class CreatureFamilyRecord
@@ -385,18 +495,19 @@ namespace Game.DataStorage
public uint Id;
public string Name;
public string Description;
public byte CategoryID;
public int CategoryID;
public int InventoryIconFileID;
public uint SpellWeight;
public byte SpellCategory;
public uint MaxQty;
public uint MaxEarnablePerWeek;
public uint Flags;
public sbyte Quality;
public int FactionID;
public int ItemGroupSoundsID;
public int ConvertToPlayerExperience;
public int PlayerConditionID;
public int XpQuestDifficulty;
public int AwardConditionID;
public int MaxQtyWorldStateID;
public int[] Flags = new int[2];
}
public sealed class CurveRecord
@@ -410,6 +521,7 @@ namespace Game.DataStorage
{
public uint Id;
public Vector2 Pos;
public Vector2 PosPreSquish;
public ushort CurveID;
public byte OrderIndex;
}
+5 -5
View File
@@ -24,20 +24,20 @@ namespace Game.DataStorage
public uint Id;
public sbyte State0ImpactEffectDoodadSet;
public byte State0AmbientDoodadSet;
public ushort State1Wmo;
public uint State1Wmo;
public sbyte State1DestructionDoodadSet;
public sbyte State1ImpactEffectDoodadSet;
public byte State1AmbientDoodadSet;
public ushort State2Wmo;
public uint State2Wmo;
public sbyte State2DestructionDoodadSet;
public sbyte State2ImpactEffectDoodadSet;
public byte State2AmbientDoodadSet;
public ushort State3Wmo;
public uint State3Wmo;
public byte State3InitDoodadSet;
public byte State3AmbientDoodadSet;
public byte EjectDirection;
public byte DoNotHighlight;
public ushort State0Wmo;
public uint State0Wmo;
public byte HealEffect;
public ushort HealEffectSpeed;
public byte State0NameSet;
@@ -69,7 +69,7 @@ namespace Game.DataStorage
public LocalizedString Name;
public uint Id;
public short MapID;
public sbyte DifficultyID;
public int DifficultyID;
public int OrderIndex;
public int CompleteWorldStateID;
public sbyte Bit;
+8 -7
View File
@@ -47,13 +47,13 @@ namespace Game.DataStorage
public Vector3 Pos;
public float[] Rot = new float[4];
public uint Id;
public ushort OwnerID;
public ushort DisplayID;
public uint OwnerID;
public uint DisplayID;
public float Scale;
public GameObjectTypes TypeID;
public byte PhaseUseFlags;
public ushort PhaseID;
public ushort PhaseGroupID;
public int PhaseUseFlags;
public int PhaseID;
public int PhaseGroupID;
public int[] PropValue = new int[8];
}
@@ -80,7 +80,7 @@ namespace Game.DataStorage
public byte BuildingType;
public uint HordeGameObjectID;
public uint AllianceGameObjectID;
public byte GarrSiteID;
public int GarrSiteID;
public byte UpgradeLevel;
public int BuildSeconds;
public ushort CurrencyTypeID;
@@ -153,6 +153,8 @@ namespace Game.DataStorage
public byte ChrClassID;
public byte Flags;
public byte Gender;
public int AutoCombatantID;
public int CovenantID;
}
public sealed class GarrFollowerXAbilityRecord
@@ -218,7 +220,6 @@ namespace Game.DataStorage
public uint Id;
public ushort EnchantId;
public SocketColor Type;
public ushort MinItemLevel;
}
public sealed class GlyphBindableSpellRecord
+8 -3
View File
@@ -57,6 +57,7 @@ namespace Game.DataStorage
public sbyte SoundOverrideSubclassID;
public int IconFileDataID;
public byte ItemGroupSoundsID;
public int ModifiedCraftingReagentItemID;
}
public sealed class ItemAppearanceRecord
@@ -66,6 +67,7 @@ namespace Game.DataStorage
public uint ItemDisplayInfoID;
public int DefaultIconFileDataID;
public int UiOrder;
public int PlayerConditionID;
}
public sealed class ItemArmorQualityRecord
@@ -100,7 +102,7 @@ namespace Game.DataStorage
public sealed class ItemBonusRecord
{
public uint Id;
public int[] Value = new int[3];
public int[] Value = new int[4];
public ushort ParentItemBonusListID;
public ItemBonusType BonusType;
public byte OrderIndex;
@@ -109,11 +111,12 @@ namespace Game.DataStorage
public sealed class ItemBonusListGroupEntryRecord
{
public uint Id;
public int ItemBonusListGroupID;
public int ItemBonusListID;
public int ItemLevelSelectorID;
public int OrderIndex;
public int ItemExtendedCostID;
public int ItemBonusListGroupID;
public int PlayerConditionID;
}
public sealed class ItemBonusListLevelDeltaRecord
@@ -345,6 +348,9 @@ namespace Game.DataStorage
public float PriceRandomValue;
public int[] Flags = new int[4];
public int FactionRelated;
public int ModifiedCraftingReagentItemID;
public uint ContentTuningID;
public uint PlayerLevelToItemLevelCurveID;
public ushort ItemNameDescriptionID;
public ushort RequiredTransmogHoliday;
public ushort RequiredHoliday;
@@ -359,7 +365,6 @@ namespace Game.DataStorage
public ushort StartQuestID;
public ushort PageID;
public ushort ItemDelay;
public ushort ScalingStatDistributionID;
public ushort MinFactionID;
public ushort RequiredSkillRank;
public ushort RequiredSkill;
+2 -5
View File
@@ -25,8 +25,6 @@ namespace Game.DataStorage
public uint Id;
public LocalizedString Name;
public string Description;
public byte MinLevel;
public ushort MaxLevel;
public LfgType TypeID;
public byte Subtype;
public sbyte Faction;
@@ -40,9 +38,6 @@ namespace Game.DataStorage
public byte GroupID;
public byte OrderIndex;
public uint RequiredPlayerConditionId;
public byte TargetLevel;
public byte TargetLevelMin;
public ushort TargetLevelMax;
public ushort RandomID;
public ushort ScenarioID;
public ushort FinalEncounterID;
@@ -55,6 +50,7 @@ namespace Game.DataStorage
public ushort BonusReputationAmount;
public ushort MentorItemLevel;
public byte MentorCharLevel;
public uint ContentTuningID;
public LfgFlags[] Flags = new LfgFlags[2];
// Helpers
@@ -100,6 +96,7 @@ namespace Game.DataStorage
public sealed class LockRecord
{
public uint Id;
public int Flags;
public int[] Index = new int[SharedConst.MaxLockCase];
public ushort[] Skill = new ushort[SharedConst.MaxLockCase];
public byte[] LockType = new byte[SharedConst.MaxLockCase];
@@ -30,6 +30,7 @@ namespace Game.DataStorage
public uint Id;
public string Directory;
public LocalizedString MapName;
public string InternalName;
public string MapDescription0; // Horde
public string MapDescription1; // Alliance
public string PvpShortDescription;
+9 -9
View File
@@ -37,11 +37,9 @@ namespace Game.DataStorage
public long RaceMask;
public string FailureDescription;
public uint Id;
public ushort MinLevel;
public ushort MaxLevel;
public int ClassMask;
public uint SkillLogic;
public byte LanguageID;
public int LanguageID;
public byte MinLanguage;
public int MaxLanguage;
public ushort MaxFactionID;
@@ -57,7 +55,7 @@ namespace Game.DataStorage
public byte ItemFlags;
public uint AuraSpellLogic;
public ushort WorldStateExpressionID;
public byte WeatherID;
public int WeatherID;
public byte PartyStatus;
public byte LifetimeMaxPVPRank;
public uint AchievementLogic;
@@ -66,7 +64,7 @@ namespace Game.DataStorage
public uint AreaLogic;
public uint LfgLogic;
public uint CurrencyLogic;
public ushort QuestKillID;
public uint QuestKillID;
public uint QuestKillLogic;
public sbyte MinExpansionLevel;
public sbyte MaxExpansionLevel;
@@ -77,7 +75,7 @@ namespace Game.DataStorage
public byte PhaseUseFlags;
public ushort PhaseID;
public uint PhaseGroupID;
public byte Flags;
public int Flags;
public sbyte ChrSpecializationIndex;
public sbyte ChrSpecializationRole;
public uint ModifierTreeID;
@@ -91,14 +89,16 @@ namespace Game.DataStorage
public sbyte MinExpansionTier;
public byte MinPVPRank;
public byte MaxPVPRank;
public uint ContentTuningID;
public int CovenantID;
public ushort[] SkillID = new ushort[4];
public ushort[] MinSkill = new ushort[4];
public ushort[] MaxSkill = new ushort[4];
public uint[] MinFactionID = new uint[3];
public byte[] MinReputation = new byte[3];
public ushort[] PrevQuestID = new ushort[4];
public ushort[] CurrQuestID = new ushort[4];
public ushort[] CurrentCompletedQuestID = new ushort[4];
public uint[] PrevQuestID = new uint[4];
public uint[] CurrQuestID = new uint[4];
public uint[] CurrentCompletedQuestID = new uint[4];
public uint[] SpellID = new uint[4];
public uint[] ItemID = new uint[4];
public uint[] ItemCount = new uint[4];
+14 -20
View File
@@ -21,14 +21,6 @@ using System;
namespace Game.DataStorage
{
public sealed class ScalingStatDistributionRecord
{
public uint Id;
public ushort PlayerLevelToItemLevelCurveID;
public int MinLevel;
public int MaxLevel;
}
public sealed class ScenarioRecord
{
public uint Id;
@@ -46,7 +38,7 @@ namespace Game.DataStorage
public string Title;
public ushort ScenarioID;
public uint CriteriaTreeId;
public ushort RewardQuestID;
public uint RewardQuestID;
public int RelatedStep; // Bonus step can only be completed if scenario is in the step specified in this field
public ushort Supersedes; // Used in conjunction with Proving Grounds scenarios, when sequencing steps (Not using step order?)
public byte OrderIndex;
@@ -117,7 +109,7 @@ namespace Game.DataStorage
public AbilityLearnType AcquireMethod;
public ushort TrivialSkillLineRankHigh;
public ushort TrivialSkillLineRankLow;
public sbyte Flags;
public int Flags;
public byte NumSkillUps;
public short UniqueBit;
public short TradeSkillCategoryID;
@@ -205,7 +197,6 @@ namespace Game.DataStorage
{
public uint Id;
public int Base;
public short PerLevel;
public int Minimum;
}
@@ -269,7 +260,6 @@ namespace Game.DataStorage
{
public uint Id;
public int Duration;
public uint DurationPerLevel;
public int MaxDuration;
}
@@ -333,14 +323,16 @@ namespace Game.DataStorage
public sealed class SpellItemEnchantmentRecord
{
public uint Id;
public string Name;
public string HordeName;
public uint Id;
public uint[] EffectArg = new uint[ItemConst.MaxItemEnchantmentEffects];
public float[] EffectScalingPoints = new float[ItemConst.MaxItemEnchantmentEffects];
public uint TransmogPlayerConditionID;
public uint TransmogCost;
public uint IconFileDataID;
public int MinItemLevel;
public int MaxItemLevel;
public uint TransmogUseConditionID;
public uint TransmogCost;
public ushort[] EffectPointsMin = new ushort[ItemConst.MaxItemEnchantmentEffects];
public ushort ItemVisual;
public EnchantmentSlotMask Flags;
@@ -379,17 +371,17 @@ namespace Game.DataStorage
{
public uint Id;
public byte DifficultyID;
public ushort BaseLevel;
public ushort MaxLevel;
public ushort SpellLevel;
public byte MaxPassiveAuraLevel;
public ushort BaseLevel;
public ushort SpellLevel;
public uint SpellID;
}
public sealed class SpellMiscRecord
{
public uint Id;
public int[] Attributes = new int[14];
public int[] Attributes = new int[15];
public byte DifficultyID;
public ushort CastingTimeIndex;
public ushort DurationIndex;
@@ -401,6 +393,9 @@ namespace Game.DataStorage
public uint SpellIconFileDataID;
public uint ActiveIconFileDataID;
public uint ContentTuningID;
public int ShowFutureSpellPlayerConditionID;
public int SpellVisualScript;
public int ActiveSpellVisualScript;
public uint SpellID;
}
@@ -447,7 +442,7 @@ namespace Game.DataStorage
{
public uint Id;
public SpellProcsPerMinuteModType Type;
public ushort Param;
public uint Param;
public float Coeff;
public uint SpellProcsPerMinuteID;
}
@@ -550,7 +545,6 @@ namespace Game.DataStorage
public byte DifficultyID;
public uint SpellVisualID;
public float Probability;
public byte Flags;
public byte Priority;
public int SpellIconFileID;
public int ActiveIconFileID;
@@ -103,6 +103,15 @@ namespace Game.DataStorage
public int RequiredTransmogHoliday;
}
public sealed class TransmogIllusionRecord
{
public uint Id;
public int UnlockConditionID;
public int TransmogCost;
public int SpellItemEnchantmentID;
public int Flags;
}
public sealed class TransmogSetRecord
{
public string Name;
+5 -3
View File
@@ -27,15 +27,16 @@ namespace Game.DataStorage
public int Flags;
public int System;
public UiMapType Type;
public uint LevelRangeMin;
public uint LevelRangeMax;
public int BountySetID;
public uint BountyDisplayLocation;
public int VisibilityPlayerConditionID;
public sbyte HelpTextPosition;
public int BkgAtlasID;
public int AlternateUiMapGroup;
}
public int ContentTuningID;
public UiMapFlag GetFlags() { return (UiMapFlag)Flags; }
}
public sealed class UiMapAssignmentRecord
{
@@ -61,6 +62,7 @@ namespace Game.DataStorage
public int ChildUiMapID;
public int OverrideHighlightFileDataID;
public int OverrideHighlightAtlasID;
public int Flags;
}
public sealed class UiMapXMapArtRecord
+1 -1
View File
@@ -37,9 +37,9 @@ namespace Game.DataStorage
public float FacingLimitRight;
public float FacingLimitLeft;
public float CameraYawOffset;
public byte UiLocomotionType;
public ushort VehicleUIIndicatorID;
public int MissileTargetingID;
public ushort VehiclePOITypeID;
public ushort[] SeatID = new ushort[8];
public ushort[] PowerDisplayID = new ushort[3];
}
+1 -1
View File
@@ -86,7 +86,7 @@ namespace Game.DataStorage
guildGuid = guild.GetGUID();
_whoListStorage.Add(new WhoListPlayerInfo(player.GetGUID(), player.GetTeam(), player.GetSession().GetSecurity(), player.GetLevel(),
player.GetClass(), player.GetRace(), player.GetZoneId(), player.m_playerData.NativeSex, player.IsVisible(),
player.GetClass(), player.GetRace(), player.GetZoneId(), (byte)player.GetNativeSex(), player.IsVisible(),
player.IsGameMaster(), playerName, guildName, guildGuid));
}
}
+25 -14
View File
@@ -1535,10 +1535,6 @@ namespace Game.DungeonFinding
lockStatus = LfgLockStatusType.RaidLocked;
else if (dungeon.difficulty > Difficulty.Normal && player.GetBoundInstance(dungeon.map, dungeon.difficulty) != null)
lockStatus = LfgLockStatusType.RaidLocked;
else if (dungeon.minlevel > level)
lockStatus = LfgLockStatusType.TooLowLevel;
else if (dungeon.maxlevel < level)
lockStatus = LfgLockStatusType.TooHighLevel;
else if (dungeon.seasonal && !IsSeasonActive(dungeon.id))
lockStatus = LfgLockStatusType.NotInSeason;
else if (dungeon.requiredItemLevel > player.GetAverageItemLevel())
@@ -1560,16 +1556,23 @@ namespace Game.DungeonFinding
else if (ar.item2 != 0 && !player.HasItemCount(ar.item2))
lockStatus = LfgLockStatusType.MissingItem;
}
else
{
var levels = Global.DB2Mgr.GetContentTuningData(dungeon.contentTuningId, player.m_playerData.CtrOptions.GetValue().ContentTuningConditionMask);
if (levels.HasValue)
{
if (levels.Value.MinLevel > level)
lockStatus = LfgLockStatusType.TooLowLevel;
if (levels.Value.MaxLevel < level)
lockStatus = LfgLockStatusType.TooHighLevel;
}
}
/* @todo VoA closed if WG is not under team control (LFG_LOCKSTATUS_RAID_LOCKED)
lockData = LFG_LOCKSTATUS_TOO_HIGH_GEAR_SCORE;
lockData = LFG_LOCKSTATUS_ATTUNEMENT_TOO_LOW_LEVEL;
lockData = LFG_LOCKSTATUS_ATTUNEMENT_TOO_HIGH_LEVEL;
*/
if (lockStatus == 0)
{
}
if (lockStatus != 0)
lockDic[dungeon.Entry()] = new LfgLockInfoData(lockStatus, dungeon.requiredItemLevel, player.GetAverageItemLevel());
}
@@ -1985,12 +1988,22 @@ namespace Game.DungeonFinding
return 0;
}
public List<uint> GetRandomAndSeasonalDungeons(uint level, uint expansion)
public List<uint> GetRandomAndSeasonalDungeons(uint level, uint expansion, uint contentTuningReplacementConditionMask)
{
List<uint> randomDungeons = new List<uint>();
foreach (var dungeon in LfgDungeonStore.Values)
{
if ((dungeon.seasonal && IsSeasonActive(dungeon.id) || !dungeon.seasonal && dungeon.type == LfgType.RandomDungeon) && dungeon.expansion <= expansion && dungeon.minlevel <= level && level <= dungeon.maxlevel)
if (!(dungeon.type == LfgType.RandomDungeon || (dungeon.seasonal && Global.LFGMgr.IsSeasonActive(dungeon.id))))
continue;
if (dungeon.expansion > expansion)
continue;
var levels = Global.DB2Mgr.GetContentTuningData(dungeon.contentTuningId, contentTuningReplacementConditionMask);
if (levels.HasValue)
if (levels.Value.MinLevel > level || level > levels.Value.MaxLevel)
continue;
randomDungeons.Add(dungeon.Entry());
}
return randomDungeons;
@@ -2184,8 +2197,7 @@ namespace Game.DungeonFinding
type = dbc.TypeID;
expansion = dbc.ExpansionLevel;
group = dbc.GroupID;
minlevel = dbc.MinLevel;
maxlevel = dbc.MaxLevel;
contentTuningId = dbc.ContentTuningID;
difficulty = dbc.DifficultyID;
seasonal = dbc.Flags[0].HasAnyFlag(LfgFlags.Seasonal);
}
@@ -2196,8 +2208,7 @@ namespace Game.DungeonFinding
public LfgType type;
public uint expansion;
public uint group;
public uint minlevel;
public uint maxlevel;
public uint contentTuningId;
public Difficulty difficulty;
public bool seasonal;
public float x, y, z, o;
@@ -78,7 +78,7 @@ namespace Game.Entities
}
}
bool Create(uint spellMiscId, Unit caster, Unit target, SpellInfo spell, Position pos, int duration, SpellCastVisual spellVisual, ObjectGuid castId, AuraEffect aurEff)
bool Create(uint spellMiscId, Unit caster, Unit target, SpellInfo spell, Position pos, int duration, SpellCastVisualField spellVisual, ObjectGuid castId, AuraEffect aurEff)
{
_targetGuid = target ? target.GetGUID() : ObjectGuid.Empty;
_aurEff = aurEff;
@@ -110,7 +110,11 @@ namespace Game.Entities
SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.SpellID), spell.Id);
SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.SpellForVisuals), spell.Id);
SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.SpellXSpellVisualID), spellVisual.SpellXSpellVisualID);
SpellCastVisualField spellCastVisual = m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.SpellVisual);
SetUpdateFieldValue(ref spellCastVisual.SpellXSpellVisualID, spellVisual.SpellXSpellVisualID);
SetUpdateFieldValue(ref spellCastVisual.ScriptVisualID, spellVisual.ScriptVisualID);
SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.TimeToTargetScale), GetMiscTemplate().TimeToTargetScale != 0 ? GetMiscTemplate().TimeToTargetScale : m_areaTriggerData.Duration);
SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.BoundsRadius2D), GetTemplate().MaxSearchRadius);
SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.DecalPropertiesID), GetMiscTemplate().DecalPropertiesId);
@@ -197,7 +201,7 @@ namespace Game.Entities
return true;
}
public static AreaTrigger CreateAreaTrigger(uint spellMiscId, Unit caster, Unit target, SpellInfo spell, Position pos, int duration, SpellCastVisual spellVisual, ObjectGuid castId = default, AuraEffect aurEff = null)
public static AreaTrigger CreateAreaTrigger(uint spellMiscId, Unit caster, Unit target, SpellInfo spell, Position pos, int duration, SpellCastVisualField spellVisual, ObjectGuid castId = default, AuraEffect aurEff = null)
{
AreaTrigger at = new AreaTrigger();
if (!at.Create(spellMiscId, caster, target, spell, pos, duration, spellVisual, castId, aurEff))
+1 -1
View File
@@ -174,7 +174,7 @@ namespace Game.Entities
foreach (ushort actorIndex in actorIndices)
{
ConversationActor actor = actorIndex < m_conversationData.Actors.Size() ? m_conversationData.Actors[actorIndex] : null;
if (actor == null || (actor.CreatureID == 0 && actor.ActorGUID.IsEmpty()))
if (actor == null || (actor.CreatureID == 0 && actor.ActorGUID.IsEmpty() && actor.NoActorObject == 0))
{
Log.outError(LogFilter.Conversation, $"Failed to create conversation (Id: {conversationEntry}) due to missing actor (Idx: {actorIndex}).");
return false;
+33 -22
View File
@@ -101,10 +101,6 @@ namespace Game.Entities
for (var i = 0; i < EquipmentSlot.End; ++i)
items.Append($"{m_corpseData.Items[i]} ");
uint bytes1 = ((uint)m_corpseData.RaceID << 8) | ((uint)m_corpseData.Sex << 16) | ((uint)m_corpseData.SkinID << 24);
uint bytes2 = ((uint)m_corpseData.FaceID) | ((uint)m_corpseData.HairStyleID << 8) | ((uint)m_corpseData.HairColorID << 16) | ((uint)m_corpseData.FacialHairStyleID << 24);
byte index = 0;
PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.INS_CORPSE);
stmt.AddValue(index++, GetOwnerGUID().GetCounter()); // guid
@@ -115,8 +111,8 @@ namespace Game.Entities
stmt.AddValue(index++, GetMapId()); // mapId
stmt.AddValue(index++, (uint)m_corpseData.DisplayID); // displayId
stmt.AddValue(index++, items.ToString()); // itemCache
stmt.AddValue(index++, bytes1); // bytes1
stmt.AddValue(index++, bytes2); // bytes2
stmt.AddValue(index++, m_corpseData.RaceID); // race
stmt.AddValue(index++, m_corpseData.Sex); // gender
stmt.AddValue(index++, (uint)m_corpseData.Flags); // flags
stmt.AddValue(index++, (uint)m_corpseData.DynamicFlags); // dynFlags
stmt.AddValue(index++, (uint)m_time); // time
@@ -132,6 +128,18 @@ namespace Game.Entities
stmt.AddValue(index++, phaseId); // PhaseId
trans.Append(stmt);
}
foreach (var customization in m_corpseData.Customizations)
{
index = 0;
stmt = DB.Characters.GetPreparedStatement(CharStatements.INS_CORPSE_CUSTOMIZATIONS);
stmt.AddValue(index++, GetOwnerGUID().GetCounter()); // OwnerGuid
stmt.AddValue(index++, customization.ChrCustomizationOptionID);
stmt.AddValue(index++, customization.ChrCustomizationChoiceID);
trans.Append(stmt);
}
DB.Characters.CommitTransaction(trans);
}
public void DeleteFromDB(SQLTransaction trans)
@@ -148,12 +156,16 @@ namespace Game.Entities
stmt = DB.Characters.GetPreparedStatement(CharStatements.DEL_CORPSE_PHASES);
stmt.AddValue(0, ownerGuid.GetCounter());
DB.Characters.ExecuteOrAppend(trans, stmt);
stmt = DB.Characters.GetPreparedStatement(CharStatements.DEL_CORPSE_CUSTOMIZATIONS);
stmt.AddValue(0, ownerGuid.GetCounter());
DB.Characters.ExecuteOrAppend(trans, stmt);
}
public bool LoadCorpseFromDB(ulong guid, SQLFields field)
{
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
// SELECT posX, posY, posZ, orientation, mapId, displayId, itemCache, bytes1, bytes2, flags, dynFlags, time, corpseType, instanceId, guid FROM corpse WHERE mapId = ? AND instanceId = ?
// SELECT posX, posY, posZ, orientation, mapId, displayId, itemCache, race, gender, flags, dynFlags, time, corpseType, instanceId, guid FROM corpse WHERE mapId = ? AND instanceId = ?
float posX = field.Read<float>(0);
float posY = field.Read<float>(1);
@@ -169,15 +181,8 @@ namespace Game.Entities
for (uint index = 0; index < EquipmentSlot.End; ++index)
SetItem(index, uint.Parse(items[(int)index]));
uint bytes1 = field.Read<uint>(7);
uint bytes2 = field.Read<uint>(8);
SetRace((Race)((bytes1 >> 8) & 0xFF));
SetSex((Gender)((bytes1 >> 16) & 0xFF));
SetSkin((byte)((bytes1 >> 24) & 0xFF));
SetFace((byte)(bytes2 & 0xFF));
SetHairStyle((byte)((bytes2 >> 8) & 0xFF));
SetHairColor((byte)((bytes2 >> 16) & 0xFF));
SetFacialHairStyle((byte)((bytes2 >> 24) & 0xFF));
SetRace((Race)field.Read<byte>(7));
SetSex((Gender)field.Read<byte>(8));
SetFlags((CorpseFlags)field.Read<byte>(9));
SetCorpseDynamicFlags((CorpseDynFlags)field.Read<byte>(10));
SetOwnerGUID(ObjectGuid.Create(HighGuid.Player, field.Read<ulong>(14)));
@@ -287,15 +292,21 @@ namespace Game.Entities
public void SetDisplayId(uint displayId) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.DisplayID), displayId); }
public void SetRace(Race race) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.RaceID), (byte)race); }
public void SetSex(Gender sex) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.Sex), (byte)sex); }
public void SetSkin(byte skin) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.SkinID), skin); }
public void SetFace(byte face) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.FaceID), face); }
public void SetHairStyle(byte hairStyle) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.HairStyleID), hairStyle); }
public void SetHairColor(byte hairColor) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.HairColorID), hairColor); }
public void SetFacialHairStyle(byte facialHairStyle) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.FacialHairStyleID), facialHairStyle); }
public void SetFlags(CorpseFlags flags) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.Flags), (uint)flags); }
public void SetFactionTemplate(int factionTemplate) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.FactionTemplate), factionTemplate); }
public void SetItem(uint slot, uint item) { SetUpdateFieldValue(ref m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.Items, (int)slot), item); }
public void SetCustomDisplayOption(uint slot, byte customDisplayOption) { SetUpdateFieldValue(ref m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.CustomDisplayOption, (int)slot), customDisplayOption); }
public void SetCustomizations(List<ChrCustomizationChoice> customizations)
{
ClearDynamicUpdateFieldValues(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.Customizations));
foreach (var customization in customizations)
{
var newChoice = new ChrCustomizationChoice();
newChoice.ChrCustomizationOptionID = customization.ChrCustomizationOptionID;
newChoice.ChrCustomizationChoiceID = customization.ChrCustomizationChoiceID;
AddDynamicUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.Customizations), newChoice);
}
}
public long GetGhostTime() { return m_time; }
public void ResetGhostTime() { m_time = Time.UnixTime; }
+6 -2
View File
@@ -77,7 +77,7 @@ namespace Game.Entities
}
}
public bool CreateDynamicObject(ulong guidlow, Unit caster, SpellInfo spell, Position pos, float radius, DynamicObjectType type, SpellCastVisual spellVisual)
public bool CreateDynamicObject(ulong guidlow, Unit caster, SpellInfo spell, Position pos, float radius, DynamicObjectType type, SpellCastVisualField spellVisual)
{
SetMap(caster.GetMap());
Relocate(pos);
@@ -95,7 +95,11 @@ namespace Game.Entities
SetUpdateFieldValue(m_values.ModifyValue(m_dynamicObjectData).ModifyValue(m_dynamicObjectData.Caster), caster.GetGUID());
SetUpdateFieldValue(m_values.ModifyValue(m_dynamicObjectData).ModifyValue(m_dynamicObjectData.Type), (byte)type);
SetUpdateFieldValue(m_values.ModifyValue(m_dynamicObjectData).ModifyValue(m_dynamicObjectData.SpellXSpellVisualID), spellVisual.SpellXSpellVisualID);
SpellCastVisualField spellCastVisual = m_values.ModifyValue(m_dynamicObjectData).ModifyValue(m_dynamicObjectData.SpellVisual);
SetUpdateFieldValue(ref spellCastVisual.SpellXSpellVisualID, spellVisual.SpellXSpellVisualID);
SetUpdateFieldValue(ref spellCastVisual.ScriptVisualID, spellVisual.ScriptVisualID);
SetUpdateFieldValue(m_values.ModifyValue(m_dynamicObjectData).ModifyValue(m_dynamicObjectData.SpellID), spell.Id);
SetUpdateFieldValue(m_values.ModifyValue(m_dynamicObjectData).ModifyValue(m_dynamicObjectData.Radius), radius);
SetUpdateFieldValue(m_values.ModifyValue(m_dynamicObjectData).ModifyValue(m_dynamicObjectData.CastTime), GameTime.GetGameTimeMS());
+2 -2
View File
@@ -82,7 +82,7 @@ namespace Game.Entities
for (int j = 0; j < SharedConst.MaxAzeriteEssenceSlot; ++j)
stmt.AddValue(5 + specIndex * 5 + j, m_azeriteItemData.SelectedEssences[specIndex].AzeriteEssenceID[j]);
}
for (; specIndex < PlayerConst.MaxSpecializations; ++specIndex)
for (; specIndex < 4; ++specIndex)
{
stmt.AddValue(4 + specIndex * 5, 0);
for (int j = 0; j < SharedConst.MaxAzeriteEssenceSlot; ++j)
@@ -557,6 +557,6 @@ namespace Game.Entities
public uint KnowledgeLevel;
public List<uint> AzeriteItemMilestonePowers = new List<uint>();
public List<AzeriteEssencePowerRecord> UnlockedAzeriteEssences = new List<AzeriteEssencePowerRecord>();
public AzeriteItemSelectedEssencesData[] SelectedAzeriteEssences = new AzeriteItemSelectedEssencesData[PlayerConst.MaxSpecializations];
public AzeriteItemSelectedEssencesData[] SelectedAzeriteEssences = new AzeriteItemSelectedEssencesData[4];
}
}
+90 -79
View File
@@ -1009,10 +1009,9 @@ namespace Game.Entities
gemBonus.AddBonusList(bonusListId);
uint gemBaseItemLevel = gemTemplate.GetBaseItemLevel();
ScalingStatDistributionRecord ssd = CliDB.ScalingStatDistributionStorage.LookupByKey(gemBonus.ScalingStatDistribution);
if (ssd != null)
if (gemBonus.PlayerLevelToItemLevelCurveId != 0)
{
uint scaledIlvl = (uint)Global.DB2Mgr.GetCurveValueAt(ssd.PlayerLevelToItemLevelCurveID, gemScalingLevel);
uint scaledIlvl = (uint)Global.DB2Mgr.GetCurveValueAt(gemBonus.PlayerLevelToItemLevelCurveId, gemScalingLevel);
if (scaledIlvl != 0)
gemBaseItemLevel = scaledIlvl;
}
@@ -1446,7 +1445,7 @@ namespace Game.Entities
Player owner = GetOwner();
for (byte i = 0; i < ItemConst.MaxStats; ++i)
{
if ((owner ? GetItemStatValue(i, owner) : proto.GetItemStatAllocation(i)) != 0)
if ((owner ? GetItemStatValue(i, owner) : proto.GetStatPercentEditor(i)) != 0)
return true;
}
@@ -1457,7 +1456,7 @@ namespace Game.Entities
{
for (byte i = 0; i < ItemConst.MaxStats; ++i)
{
if (bonus.ItemStatAllocation[i] != 0)
if (bonus.StatPercentEditor[i] != 0)
return true;
}
@@ -1767,22 +1766,18 @@ namespace Game.Entities
if (azeriteLevelInfo != null)
itemLevel = azeriteLevelInfo.ItemLevel;
ScalingStatDistributionRecord ssd = CliDB.ScalingStatDistributionStorage.LookupByKey(bonusData.ScalingStatDistribution);
if (ssd != null)
if (bonusData.PlayerLevelToItemLevelCurveId != 0)
{
if (fixedLevel != 0)
level = fixedLevel;
else
level = (uint)Math.Min(Math.Max(level, ssd.MinLevel), ssd.MaxLevel);
{
var levels = Global.DB2Mgr.GetContentTuningData(bonusData.ContentTuningId, 0, true);
if (levels.HasValue)
level = (uint)Math.Min(Math.Max((ushort)level, levels.Value.MinLevel), levels.Value.MaxLevel);
}
ContentTuningRecord contentTuning = CliDB.ContentTuningStorage.LookupByKey(bonusData.ContentTuningId);
if (contentTuning != null)
if ((Convert.ToBoolean(contentTuning.Flags & 2) || contentTuning.MinLevel != 0 || contentTuning.MaxLevel != 0) && !Convert.ToBoolean(contentTuning.Flags & 4))
level = (uint)Math.Min(Math.Max(level, contentTuning.MinLevel), contentTuning.MaxLevel);
uint heirloomIlvl = (uint)Global.DB2Mgr.GetCurveValueAt(ssd.PlayerLevelToItemLevelCurveID, level);
if (heirloomIlvl != 0)
itemLevel = heirloomIlvl;
itemLevel = (uint)Global.DB2Mgr.GetCurveValueAt(bonusData.PlayerLevelToItemLevelCurveId, level);
}
itemLevel += (uint)bonusData.ItemLevelBonus;
@@ -1814,7 +1809,7 @@ namespace Game.Entities
{
case ItemModType.Corruption:
case ItemModType.CorruptionResistance:
return _bonusData.ItemStatAllocation[index];
return _bonusData.StatPercentEditor[index];
default:
break;
}
@@ -1823,7 +1818,7 @@ namespace Game.Entities
uint randomPropPoints = ItemEnchantmentManager.GetRandomPropertyPoints(itemLevel, GetQuality(), GetTemplate().GetInventoryType(), GetTemplate().GetSubClass());
if (randomPropPoints != 0)
{
float statValue = (_bonusData.ItemStatAllocation[index] * randomPropPoints) * 0.0001f;
float statValue = (_bonusData.StatPercentEditor[index] * randomPropPoints) * 0.0001f;
GtItemSocketCostPerLevelRecord gtCost = CliDB.ItemSocketCostPerLevelGameTable.GetRow(itemLevel);
if (gtCost != null)
statValue -= (_bonusData.ItemStatSocketCostMultiplier[index] * gtCost.SocketCost);
@@ -1881,11 +1876,11 @@ namespace Game.Entities
public uint GetDisplayId(Player owner)
{
ItemModifier transmogModifier = ItemModifier.TransmogAppearanceAllSpecs;
if ((m_itemData.ModifiersMask & ItemConst.AppearanceModifierMaskSpecSpecific) != 0)
transmogModifier = ItemConst.AppearanceModifierSlotBySpec[owner.GetActiveTalentGroup()];
uint itemModifiedAppearanceId = GetModifier(ItemConst.AppearanceModifierSlotBySpec[owner.GetActiveTalentGroup()]);
if (itemModifiedAppearanceId == 0)
itemModifiedAppearanceId = GetModifier(ItemModifier.TransmogAppearanceAllSpecs);
ItemModifiedAppearanceRecord transmog = CliDB.ItemModifiedAppearanceStorage.LookupByKey(GetModifier(transmogModifier));
ItemModifiedAppearanceRecord transmog = CliDB.ItemModifiedAppearanceStorage.LookupByKey(itemModifiedAppearanceId);
if (transmog != null)
{
ItemAppearanceRecord itemAppearance = CliDB.ItemAppearanceStorage.LookupByKey(transmog.ItemAppearanceID);
@@ -1903,51 +1898,57 @@ namespace Game.Entities
public uint GetModifier(ItemModifier modifier)
{
if ((m_itemData.ModifiersMask & (1 << (int)modifier)) == 0)
int modifierIndex = m_itemData.Modifiers._value.Values.FindIndexIf(mod =>
{
return mod.Type == (byte)modifier;
});
if (modifierIndex != -1)
return m_itemData.Modifiers._value.Values[modifierIndex].Value;
return 0;
int valueIndex = 0;
uint mask = m_itemData.ModifiersMask;
for (int i = 0; i < (int)modifier; ++i)
if ((mask & (1 << i)) != 0)
++valueIndex;
return m_itemData.Modifiers[valueIndex];
}
public void SetModifier(ItemModifier modifier, uint value)
{
int valueIndex = 0;
uint mask = m_itemData.ModifiersMask;
for (int i = 0; i < (int)modifier; ++i)
if ((mask & (1 << i)) != 0)
++valueIndex;
int modifierIndex = m_itemData.Modifiers._value.Values.FindIndexIf(mod =>
{
return mod.Type == (byte)modifier;
});
if (value != 0)
{
if ((mask & (1 << (int)modifier)) != 0)
return;
if (modifierIndex == -1)
{
ItemMod mod = new ItemMod();
mod.Value = value;
mod.Type = (byte)modifier;
SetUpdateFieldFlagValue(m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.ModifiersMask), 1u << (int)modifier);
InsertDynamicUpdateFieldValue(m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.Modifiers), valueIndex, value);
AddDynamicUpdateFieldValue(m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.Modifiers)._value.ModifyValue(m_itemData.Modifiers._value.Values), mod);
}
else
{
if ((mask & (1 << (int)modifier)) == 0)
ItemModList itemModList = m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.Modifiers);
itemModList.ModifyValue(itemModList.Values, modifierIndex);
SetUpdateFieldValue(ref itemModList.ModifyValue(itemModList.Values, modifierIndex).GetValue().Value, value);
}
}
else
{
if (modifierIndex == -1)
return;
RemoveUpdateFieldFlagValue(m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.ModifiersMask), 1u << (int)modifier);
RemoveDynamicUpdateFieldValue(m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.Modifiers), valueIndex);
RemoveDynamicUpdateFieldValue(m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.Modifiers)._value.ModifyValue(m_itemData.Modifiers._value.Values), modifierIndex);
}
}
public uint GetVisibleEntry(Player owner)
{
ItemModifier transmogModifier = ItemModifier.TransmogAppearanceAllSpecs;
if ((m_itemData.ModifiersMask & ItemConst.AppearanceModifierMaskSpecSpecific) != 0)
transmogModifier = ItemConst.AppearanceModifierSlotBySpec[owner.GetActiveTalentGroup()];
uint itemModifiedAppearanceId = GetModifier(ItemConst.AppearanceModifierSlotBySpec[owner.GetActiveTalentGroup()]);
if (itemModifiedAppearanceId == 0)
itemModifiedAppearanceId = GetModifier(ItemModifier.TransmogAppearanceAllSpecs);
ItemModifiedAppearanceRecord transmog = CliDB.ItemModifiedAppearanceStorage.LookupByKey(GetModifier(transmogModifier));
ItemModifiedAppearanceRecord transmog = CliDB.ItemModifiedAppearanceStorage.LookupByKey(itemModifiedAppearanceId);
if (transmog != null)
return transmog.ItemID;
@@ -1956,11 +1957,11 @@ namespace Game.Entities
public ushort GetVisibleAppearanceModId(Player owner)
{
ItemModifier transmogModifier = ItemModifier.TransmogAppearanceAllSpecs;
if ((m_itemData.ModifiersMask & ItemConst.AppearanceModifierMaskSpecSpecific) != 0)
transmogModifier = ItemConst.AppearanceModifierSlotBySpec[owner.GetActiveTalentGroup()];
uint itemModifiedAppearanceId = GetModifier(ItemConst.AppearanceModifierSlotBySpec[owner.GetActiveTalentGroup()]);
if (itemModifiedAppearanceId == 0)
itemModifiedAppearanceId = GetModifier(ItemModifier.TransmogAppearanceAllSpecs);
ItemModifiedAppearanceRecord transmog = CliDB.ItemModifiedAppearanceStorage.LookupByKey(GetModifier(transmogModifier));
ItemModifiedAppearanceRecord transmog = CliDB.ItemModifiedAppearanceStorage.LookupByKey(itemModifiedAppearanceId);
if (transmog != null)
return transmog.ItemAppearanceModifierID;
@@ -1969,15 +1970,14 @@ namespace Game.Entities
public uint GetVisibleEnchantmentId(Player owner)
{
ItemModifier illusionModifier = ItemModifier.EnchantIllusionAllSpecs;
if ((m_itemData.ModifiersMask & ItemConst.IllusionModifierMaskSpecSpecific) != 0)
illusionModifier = ItemConst.IllusionModifierSlotBySpec[owner.GetActiveTalentGroup()];
uint enchantmentId = GetModifier(ItemConst.IllusionModifierSlotBySpec[owner.GetActiveTalentGroup()]);
if (enchantmentId == 0)
enchantmentId = GetModifier(ItemModifier.EnchantIllusionAllSpecs);
uint enchantIllusion = GetModifier(illusionModifier);
if (enchantIllusion != 0)
return enchantIllusion;
if (enchantmentId == 0)
enchantmentId = GetEnchantmentId(EnchantmentSlot.Perm);
return (uint)GetEnchantmentId(EnchantmentSlot.Perm);
return enchantmentId;
}
public ushort GetVisibleItemVisual(Player owner)
@@ -2255,15 +2255,11 @@ namespace Game.Entities
if (!_bonusData.HasFixedLevel || GetModifier(ItemModifier.TimewalkerLevel) != 0)
return;
ScalingStatDistributionRecord ssd = CliDB.ScalingStatDistributionStorage.LookupByKey(_bonusData.ScalingStatDistribution);
if (ssd != null)
if (_bonusData.PlayerLevelToItemLevelCurveId != 0)
{
level = (uint)Math.Min(Math.Max(level, ssd.MinLevel), ssd.MaxLevel);
ContentTuningRecord contentTuning = CliDB.ContentTuningStorage.LookupByKey(_bonusData.ContentTuningId);
if (contentTuning != null)
if ((contentTuning.Flags.HasAnyFlag(2) || contentTuning.MinLevel != 0 || contentTuning.MaxLevel != 0) && !contentTuning.Flags.HasAnyFlag(4))
level = (uint)Math.Min(Math.Max(level, contentTuning.MinLevel), contentTuning.MaxLevel);
var levels = Global.DB2Mgr.GetContentTuningData(_bonusData.ContentTuningId, 0, true);
if (levels.HasValue)
level = (uint)Math.Min(Math.Max((short)level, levels.Value.MinLevel), levels.Value.MaxLevel);
SetModifier(ItemModifier.TimewalkerLevel, level);
}
@@ -2271,11 +2267,13 @@ namespace Game.Entities
public int GetRequiredLevel()
{
int fixedLevel = (int)GetModifier(ItemModifier.TimewalkerLevel);
if (_bonusData.RequiredLevelCurve != 0)
return (int)Global.DB2Mgr.GetCurveValueAt(_bonusData.RequiredLevelCurve, fixedLevel);
if (_bonusData.RequiredLevelOverride != 0)
return _bonusData.RequiredLevelOverride;
else if (_bonusData.HasFixedLevel)
return (int)GetModifier(ItemModifier.TimewalkerLevel);
else
if (_bonusData.HasFixedLevel && _bonusData.PlayerLevelToItemLevelCurveId != 0)
return fixedLevel;
return _bonusData.RequiredLevel;
}
@@ -2515,7 +2513,7 @@ namespace Game.Entities
public uint GetAppearanceModId() { return m_itemData.ItemAppearanceModID; }
public void SetAppearanceModId(uint appearanceModId) { SetUpdateFieldValue(m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.ItemAppearanceModID), (byte)appearanceModId); }
public float GetRepairCostMultiplier() { return _bonusData.RepairCostMultiplier; }
public uint GetScalingStatDistribution() { return _bonusData.ScalingStatDistribution; }
public uint GetScalingContentTuningId() { return _bonusData.ContentTuningId; }
public void SetRefundRecipient(ObjectGuid guid) { m_refundRecipient = guid; }
public void SetPaidMoney(ulong money) { m_paidMoney = money; }
@@ -2685,13 +2683,13 @@ namespace Game.Entities
ItemLevelBonus = 0;
RequiredLevel = proto.GetBaseRequiredLevel();
for (uint i = 0; i < ItemConst.MaxStats; ++i)
ItemStatType[i] = proto.GetItemStatType(i);
ItemStatType[i] = proto.GetStatModifierBonusStat(i);
for (uint i = 0; i < ItemConst.MaxStats; ++i)
ItemStatAllocation[i] = proto.GetItemStatAllocation(i);
StatPercentEditor[i] = proto.GetStatPercentEditor(i);
for (uint i = 0; i < ItemConst.MaxStats; ++i)
ItemStatSocketCostMultiplier[i] = proto.GetItemStatSocketCostMultiplier(i);
ItemStatSocketCostMultiplier[i] = proto.GetStatPercentageOfSocket(i);
for (uint i = 0; i < ItemConst.MaxGemSockets; ++i)
{
@@ -2705,7 +2703,8 @@ namespace Game.Entities
AppearanceModID = 0;
RepairCostMultiplier = 1.0f;
ScalingStatDistribution = proto.GetScalingStatDistribution();
ContentTuningId = proto.GetScalingStatContentTuning();
PlayerLevelToItemLevelCurveId = proto.GetPlayerLevelToItemLevelCurveId();
RelicType = -1;
HasFixedLevel = false;
RequiredLevelOverride = 0;
@@ -2729,6 +2728,7 @@ namespace Game.Entities
_state.AppearanceModPriority = int.MaxValue;
_state.ScalingStatDistributionPriority = int.MaxValue;
_state.AzeriteTierUnlockSetPriority = int.MaxValue;
_state.RequiredLevelCurvePriority = int.MaxValue;
_state.HasQualityBonus = false;
}
@@ -2766,7 +2766,7 @@ namespace Game.Entities
if (statIndex < ItemConst.MaxStats)
{
ItemStatType[statIndex] = values[0];
ItemStatAllocation[statIndex] += values[1];
StatPercentEditor[statIndex] += values[1];
}
break;
}
@@ -2816,8 +2816,8 @@ namespace Game.Entities
case ItemBonusType.ScalingStatDistributionFixed:
if (values[1] < _state.ScalingStatDistributionPriority)
{
ScalingStatDistribution = (uint)values[0];
ContentTuningId = (uint)values[2];
PlayerLevelToItemLevelCurveId = (uint)values[3];
_state.ScalingStatDistributionPriority = values[1];
HasFixedLevel = type == ItemBonusType.ScalingStatDistributionFixed;
}
@@ -2849,6 +2849,15 @@ namespace Game.Entities
if (itemEffect != null)
Effects[EffectCount++] = itemEffect;
break;
case ItemBonusType.RequiredLevelCurve:
if (values[2] < _state.RequiredLevelCurvePriority)
{
RequiredLevelCurve = (uint)values[0];
_state.RequiredLevelCurvePriority = values[2];
if (values[1] != 0)
ContentTuningId = (uint)values[1];
}
break;
}
}
@@ -2856,14 +2865,14 @@ namespace Game.Entities
public int ItemLevelBonus;
public int RequiredLevel;
public int[] ItemStatType = new int[ItemConst.MaxStats];
public int[] ItemStatAllocation = new int[ItemConst.MaxStats];
public int[] StatPercentEditor = new int[ItemConst.MaxStats];
public float[] ItemStatSocketCostMultiplier = new float[ItemConst.MaxStats];
public SocketColor[] socketColor = new SocketColor[ItemConst.MaxGemSockets];
public ItemBondingType Bonding;
public uint AppearanceModID;
public float RepairCostMultiplier;
public uint ScalingStatDistribution;
public uint ContentTuningId;
public uint PlayerLevelToItemLevelCurveId;
public uint DisenchantLootId;
public uint[] GemItemLevelBonus = new uint[ItemConst.MaxGemSockets];
public int[] GemRelicType = new int[ItemConst.MaxGemSockets];
@@ -2872,6 +2881,7 @@ namespace Game.Entities
public int RequiredLevelOverride;
public uint AzeriteTierUnlockSetId;
public uint Suffix;
public uint RequiredLevelCurve;
public ItemEffectRecord[] Effects = new ItemEffectRecord[13];
public int EffectCount;
public bool CanDisenchant;
@@ -2885,6 +2895,7 @@ namespace Game.Entities
public int AppearanceModPriority;
public int ScalingStatDistributionPriority;
public int AzeriteTierUnlockSetPriority;
public int RequiredLevelCurvePriority;
public bool HasQualityBonus;
}
}
@@ -2972,7 +2983,7 @@ namespace Game.Entities
info.AzeriteItem.Xp = azeriteItemResult.Read<ulong>(1);
info.AzeriteItem.Level = azeriteItemResult.Read<uint>(2);
info.AzeriteItem.KnowledgeLevel = azeriteItemResult.Read<uint>(3);
for (int i = 0; i < PlayerConst.MaxSpecializations; ++i)
for (int i = 0; i < info.AzeriteItem.SelectedAzeriteEssences.Length; ++i)
{
uint specializationId = azeriteItemResult.Read<uint>(4 + i * 4);
if (!CliDB.ChrSpecializationStorage.ContainsKey(specializationId))
+5 -16
View File
@@ -277,22 +277,11 @@ namespace Game.Entities
public uint GetRequiredReputationRank() { return ExtendedData.MinReputation; }
public uint GetMaxCount() { return ExtendedData.MaxCount; }
public uint GetContainerSlots() { return ExtendedData.ContainerSlots; }
public int GetItemStatType(uint index)
{
Cypher.Assert(index < ItemConst.MaxStats);
return ExtendedData.StatModifierBonusStat[index];
}
public int GetItemStatAllocation(uint index)
{
Cypher.Assert(index < ItemConst.MaxStats);
return ExtendedData.StatPercentEditor[index];
}
public float GetItemStatSocketCostMultiplier(uint index)
{
Cypher.Assert(index < ItemConst.MaxStats);
return ExtendedData.StatPercentageOfSocket[index];
}
public uint GetScalingStatDistribution() { return ExtendedData.ScalingStatDistributionID; }
public int GetStatModifierBonusStat(uint index) { Cypher.Assert(index < ItemConst.MaxStats); return ExtendedData.StatModifierBonusStat[index]; }
public int GetStatPercentEditor(uint index) { Cypher.Assert(index < ItemConst.MaxStats); return ExtendedData.StatPercentEditor[index]; }
public float GetStatPercentageOfSocket(uint index) { Cypher.Assert(index < ItemConst.MaxStats); return ExtendedData.StatPercentageOfSocket[index]; }
public uint GetScalingStatContentTuning() { return ExtendedData.ContentTuningID; }
public uint GetPlayerLevelToItemLevelCurveId() { return ExtendedData.PlayerLevelToItemLevelCurveID; }
public uint GetDamageType() { return ExtendedData.DamageType; }
public uint GetDelay() { return ExtendedData.ItemDelay; }
public float GetRangedModRange() { return ExtendedData.ItemRange; }
File diff suppressed because it is too large Load Diff
+207 -131
View File
@@ -1832,6 +1832,38 @@ namespace Game.Entities
pair.Value.state = PlayerCurrencyState.Unchanged;
}
}
public static void SavePlayerCustomizations(SQLTransaction trans, ulong guid, List<ChrCustomizationChoice> customizations)
{
PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.DEL_CHARACTER_CUSTOMIZATIONS);
stmt.AddValue(0, guid);
trans.Append(stmt);
foreach (var customization in customizations)
{
stmt = DB.Characters.GetPreparedStatement(CharStatements.INS_CHARACTER_CUSTOMIZATION);
stmt.AddValue(0, guid);
stmt.AddValue(1, customization.ChrCustomizationOptionID);
stmt.AddValue(2, customization.ChrCustomizationChoiceID);
trans.Append(stmt);
}
}
public static void SaveCustomizations(SQLTransaction trans, ulong guid, List<ChrCustomizationChoice> customizations)
{
SavePlayerCustomizations(trans, guid, customizations);
}
void _SaveCustomizations(SQLTransaction trans)
{
if (!m_customizationsChanged)
return;
m_customizationsChanged = false;
SavePlayerCustomizations(trans, GetGUID().GetCounter(), m_playerData.Customizations);
}
void _SaveActions(SQLTransaction trans)
{
PreparedStatement stmt = null;
@@ -2418,19 +2450,86 @@ namespace Game.Entities
SQLResult result = holder.GetResult(PlayerLoginQueryLoad.From);
if (result.IsEmpty())
{
string name;
Global.CharacterCacheStorage.GetCharacterNameByGuid(guid, out name);
Log.outError(LogFilter.Player, "Player {0} {1} not found in table `characters`, can't load. ", name, guid.ToString());
Global.CharacterCacheStorage.GetCharacterNameByGuid(guid, out string cacheName);
Log.outError(LogFilter.Player, "Player {0} {1} not found in table `characters`, can't load. ", cacheName, guid.ToString());
return false;
}
uint dbAccountId = result.Read<uint>(1);
int fieldIndex = 1;
uint accountId = result.Read<uint>(fieldIndex++);
string name = result.Read<string>(fieldIndex++);
Race race = (Race)result.Read<byte>(fieldIndex++);
Class class_ = (Class)result.Read<byte>(fieldIndex++);
Gender gender = (Gender)result.Read<byte>(fieldIndex++);
byte level = result.Read<byte>(fieldIndex++);
uint xp = result.Read<uint>(fieldIndex++);
ulong money = result.Read<ulong>(fieldIndex++);
byte inventorySlots = result.Read<byte>(fieldIndex++);
byte bankSlots = result.Read<byte>(fieldIndex++);
PlayerRestState restState = (PlayerRestState)result.Read<byte>(fieldIndex++);
PlayerFlags playerFlags = (PlayerFlags)result.Read<uint>(fieldIndex++);
PlayerFlagsEx playerFlagsEx = (PlayerFlagsEx)result.Read<uint>(fieldIndex++);
float position_x = result.Read<float>(fieldIndex++);
float position_y = result.Read<float>(fieldIndex++);
float position_z = result.Read<float>(fieldIndex++);
uint mapId = result.Read<ushort>(fieldIndex++);
float orientation = result.Read<float>(fieldIndex++);
string taximask = result.Read<string>(fieldIndex++);
byte cinematic = result.Read<byte>(fieldIndex++);
uint totaltime = result.Read<uint> (fieldIndex++);
uint leveltime = result.Read<uint>(fieldIndex++);
float rest_bonus = result.Read<float>(fieldIndex++);
uint logout_time = result.Read<uint>(fieldIndex++);
byte is_logout_resting = result.Read<byte>(fieldIndex++);
uint resettalents_cost = result.Read<uint>(fieldIndex++);
uint resettalents_time = result.Read<uint>(fieldIndex++);
uint primarySpecialization = result.Read<uint>(fieldIndex++);
float trans_x = result.Read<float>(fieldIndex++);
float trans_y = result.Read<float>(fieldIndex++);
float trans_z = result.Read<float>(fieldIndex++);
float trans_o = result.Read<float>(fieldIndex++);
ulong transguid = result.Read<ulong>(fieldIndex++);
PlayerExtraFlags extra_flags = (PlayerExtraFlags)result.Read<ushort>(fieldIndex++);
byte stable_slots = result.Read<byte>(fieldIndex++);
ushort at_login = result.Read<ushort>(fieldIndex++);
ushort zone = result.Read<ushort>(fieldIndex++);
byte online = result.Read<byte>(fieldIndex++);
uint death_expire_time = result.Read<uint>(fieldIndex++);
string taxi_path = result.Read<string>(fieldIndex++);
Difficulty dungeonDifficulty = (Difficulty)result.Read<byte>(fieldIndex++);
uint totalKills = result.Read<uint>(fieldIndex++);
ushort todayKills = result.Read<ushort>(fieldIndex++);
ushort yesterdayKills = result.Read<ushort>(fieldIndex++);
uint chosenTitle = result.Read<uint>(fieldIndex++);
uint watchedFaction = result.Read<uint>(fieldIndex++);
byte drunk = result.Read<byte>(fieldIndex++);
uint health = result.Read<uint>(fieldIndex++);
uint[] powers = new uint[(int)PowerType.MaxPerClass];
for (var i = 0; fieldIndex < powers.Length; ++i)
powers[i] = result.Read<uint>(fieldIndex++);
uint instance_id = result.Read<uint>(fieldIndex++);
byte activeTalentGroup = result.Read<byte>(fieldIndex++);
uint lootSpecId = result.Read<uint>(fieldIndex++);
string exploredZones = result.Read<string>(fieldIndex++);
string knownTitles = result.Read<string>(fieldIndex++);
byte actionBars = result.Read<byte>(fieldIndex++);
Difficulty raidDifficulty = (Difficulty)result.Read<byte>(fieldIndex++);
Difficulty legacyRaidDifficulty = (Difficulty)result.Read<byte>(fieldIndex++);
byte fishingSteps = result.Read<byte>(fieldIndex++);
uint honor = result.Read<uint>(fieldIndex++);
uint honorLevel = result.Read<uint>(fieldIndex++);
PlayerRestState honorRestState = (PlayerRestState)result.Read<byte>(fieldIndex++);
float honorRestBonus = result.Read<float>(fieldIndex++);
byte numRespecs = result.Read<byte>(fieldIndex++);
// check if the character's account in the db and the logged in account match.
// player should be able to load/delete character only with correct account!
if (dbAccountId != GetSession().GetAccountId())
if (accountId != GetSession().GetAccountId())
{
Log.outError(LogFilter.Player, "Player (GUID: {0}) loading from wrong account (is: {1}, should be: {2})", GetGUID().ToString(), GetSession().GetAccountId(), dbAccountId);
Log.outError(LogFilter.Player, "Player (GUID: {0}) loading from wrong account (is: {1}, should be: {2})", GetGUID().ToString(), GetSession().GetAccountId(), accountId);
return false;
}
@@ -2443,7 +2542,7 @@ namespace Game.Entities
_Create(guid);
SetName(result.Read<string>(2));
SetName(name);
// check name limitations
if (ObjectManager.CheckPlayerName(GetName(), GetSession().GetSessionDbcLocale()) != ResponseCodes.CharNameSuccess ||
@@ -2456,18 +2555,18 @@ namespace Game.Entities
return false;
}
// overwrite possible wrong/corrupted guid
SetUpdateFieldValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.WowAccount), GetSession().GetAccountGUID());
Gender gender = (Gender)result.Read<byte>(5);
SetUpdateFieldValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.WowAccount), GetSession().GetAccountGUID());
SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.BnetAccount), GetSession().GetBattlenetAccountGUID());
if (gender >= Gender.None)
{
Log.outError(LogFilter.Player, "Player {0} has wrong gender ({1}), can't be loaded.", guid.ToString(), gender);
return false;
}
SetRace((Race)result.Read<byte>(3));
SetClass((Class)result.Read<byte>(4));
SetRace(race);
SetClass(class_);
SetGender(gender);
// check if race/class combination is valid
@@ -2478,19 +2577,19 @@ namespace Game.Entities
return false;
}
SetLevel(result.Read<uint>(6));
SetXP(result.Read<uint>(7));
SetLevel(level);
SetXP(xp);
StringArray exploredZones = new StringArray(result.Read<string>(66), ' ');
if (exploredZones.Length == PlayerConst.ExploredZonesSize * 2)
for (int i = 0; i < exploredZones.Length; ++i)
SetUpdateFieldFlagValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.ExploredZones, i / 2), (ulong)((long.Parse(exploredZones[i])) << (32 * (i % 2))));
StringArray exploredZonesStrings = new StringArray(exploredZones, ' ');
if (exploredZonesStrings.Length == PlayerConst.ExploredZonesSize * 2)
for (int i = 0; i < exploredZonesStrings.Length; ++i)
SetUpdateFieldFlagValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.ExploredZones, i / 2), (ulong)((long.Parse(exploredZonesStrings[i])) << (32 * (i % 2))));
StringArray knownTitles = new StringArray(result.Read<string>(67), ' ');
if ((knownTitles.Length % 2) == 0)
StringArray knownTitlesStrings = new StringArray(knownTitles, ' ');
if ((knownTitlesStrings.Length % 2) == 0)
{
for (int i = 0; i < knownTitles.Length; ++i)
SetUpdateFieldFlagValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.KnownTitles, i / 2), (ulong)((long.Parse(knownTitles[i])) << (32 * (i % 2))));
for (int i = 0; i < knownTitlesStrings.Length; ++i)
SetUpdateFieldFlagValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.KnownTitles, i / 2), (ulong)((long.Parse(knownTitlesStrings[i])) << (32 * (i % 2))));
}
SetObjectScale(1.0f);
@@ -2500,42 +2599,42 @@ namespace Game.Entities
m_achievementSys.LoadFromDB(holder.GetResult(PlayerLoginQueryLoad.Achievements), holder.GetResult(PlayerLoginQueryLoad.CriteriaProgress));
m_questObjectiveCriteriaMgr.LoadFromDB(holder.GetResult(PlayerLoginQueryLoad.QuestStatusObjectivesCriteria), holder.GetResult(PlayerLoginQueryLoad.QuestStatusObjectivesCriteriaProgress));
ulong money = result.Read<ulong>(8);
if (money > PlayerConst.MaxMoneyAmount)
money = PlayerConst.MaxMoneyAmount;
SetMoney(money);
SetMoney(Math.Min(money, PlayerConst.MaxMoneyAmount));
Array<byte> customDisplay = new Array<byte>(PlayerConst.CustomDisplaySize);
customDisplay[0] = result.Read<byte>(14);
customDisplay[1] = result.Read<byte>(15);
customDisplay[2] = result.Read<byte>(16);
List<ChrCustomizationChoice> customizations = new List<ChrCustomizationChoice>();
SQLResult customizationsResult = holder.GetResult(PlayerLoginQueryLoad.Customizations);
if (!customizationsResult.IsEmpty())
{
do
{
SetSkinId(result.Read<byte>(9));
SetFaceId(result.Read<byte>(10));
SetHairStyleId(result.Read<byte>(11));
SetHairColorId(result.Read<byte>(12));
SetFacialHairStyleId(result.Read<byte>(13));
for (byte i = 0; i < PlayerConst.CustomDisplaySize; ++i)
SetCustomDisplayOption(i, customDisplay[i]);
SetInventorySlotCount(result.Read<byte>(17));
SetBankBagSlotCount(result.Read<byte>(18));
ChrCustomizationChoice choice;
choice.ChrCustomizationOptionID = customizationsResult.Read<uint>(0);
choice.ChrCustomizationChoiceID = customizationsResult.Read<uint>(1);
customizations.Add(choice);
} while (customizationsResult.NextRow());
}
SetCustomizations(customizations, false);
SetInventorySlotCount(inventorySlots);
SetBankBagSlotCount(bankSlots);
SetNativeSex(gender);
SetUpdateFieldValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.Inebriation), result.Read<byte>(55));
SetPlayerFlags((PlayerFlags)result.Read<uint>(20));
SetPlayerFlagsEx((PlayerFlagsEx)result.Read<uint>(21));
SetWatchedFactionIndex(result.Read<uint>(54));
SetUpdateFieldValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.Inebriation), drunk);
SetPlayerFlags(playerFlags);
SetPlayerFlagsEx(playerFlagsEx);
SetWatchedFactionIndex(watchedFaction);
if (!ValidateAppearance((Race)result.Read<byte>(3), (Class)result.Read<byte>(4), (Gender)gender,
m_playerData.HairStyleID, m_playerData.HairColorID, m_playerData.FaceID, m_playerData.FacialHairStyleID, m_playerData.SkinID, customDisplay))
if (!GetSession().ValidateAppearance(GetRace(), GetClass(), gender, customizations))
{
Log.outError(LogFilter.Player, "Player {0} has wrong Appearance values (Hair/Skin/Color), can't be loaded.", guid.ToString());
return false;
}
// set which actionbars the client has active - DO NOT REMOVE EVER AGAIN (can be changed though, if it does change fieldwise)
SetMultiActionBars(result.Read<byte>(68));
SetMultiActionBars(actionBars);
m_fishingSteps = result.Read<byte>(71);
m_fishingSteps = fishingSteps;
InitDisplayIds();
@@ -2560,27 +2659,20 @@ namespace Game.Entities
InitPrimaryProfessions(); // to max set before any spell loaded
// init saved position, and fix it later if problematic
ulong transLowGUID = result.Read<ulong>(41);
Relocate(position_x, position_y, position_z, orientation);
Relocate(result.Read<float>(22), result.Read<float>(23), result.Read<float>(24), result.Read<float>(26));
SetDungeonDifficultyID(CheckLoadedDungeonDifficultyID(dungeonDifficulty));
SetRaidDifficultyID(CheckLoadedRaidDifficultyID(raidDifficulty));
SetLegacyRaidDifficultyID(CheckLoadedLegacyRaidDifficultyID(legacyRaidDifficulty));
uint mapId = result.Read<uint>(25);
uint instanceId = result.Read<uint>(63);
var RelocateToHomebind = new Action(() => { mapId = homebind.GetMapId(); instanceId = 0; Relocate(homebind); });
SetDungeonDifficultyID(CheckLoadedDungeonDifficultyID((Difficulty)result.Read<byte>(49)));
SetRaidDifficultyID(CheckLoadedRaidDifficultyID((Difficulty)result.Read<byte>(69)));
SetLegacyRaidDifficultyID(CheckLoadedLegacyRaidDifficultyID((Difficulty)result.Read<byte>(70)));
string taxi_nodes = result.Read<string>(48);
var RelocateToHomebind = new Action(() => { mapId = (ushort)homebind.GetMapId(); instance_id = 0; Relocate(homebind); });
_LoadGroup(holder.GetResult(PlayerLoginQueryLoad.Group));
_LoadCurrency(holder.GetResult(PlayerLoginQueryLoad.Currency));
SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.LifetimeHonorableKills), result.Read<uint>(50));
SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.TodayHonorableKills), result.Read<ushort>(51));
SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.YesterdayHonorableKills), result.Read<ushort>(52));
SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.LifetimeHonorableKills), totalKills);
SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.TodayHonorableKills), todayKills);
SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.YesterdayHonorableKills), yesterdayKills);
_LoadBoundInstances(holder.GetResult(PlayerLoginQueryLoad.BoundInstances));
_LoadInstanceTimeRestrictions(holder.GetResult(PlayerLoginQueryLoad.InstanceLockTimes));
@@ -2632,7 +2724,7 @@ namespace Game.Entities
// Do not look for instance if bg not found
WorldLocation _loc = GetBattlegroundEntryPoint();
mapId = _loc.GetMapId();
instanceId = 0;
instance_id = 0;
if (mapId == 0xFFFFFFFF) // BattlegroundEntry Point not found (???)
{
@@ -2647,9 +2739,9 @@ namespace Game.Entities
}
}
// currently we do not support transport in bg
else if (transLowGUID != 0)
else if (transguid != 0)
{
ObjectGuid transGUID = ObjectGuid.Create(HighGuid.Transport, transLowGUID);
ObjectGuid transGUID = ObjectGuid.Create(HighGuid.Transport, transguid);
Transport transport = null;
Transport go = Global.ObjAccessor.FindTransport(transGUID);
@@ -2658,10 +2750,11 @@ namespace Game.Entities
if (transport)
{
float x = result.Read<float>(37);
float y = result.Read<float>(38);
float z = result.Read<float>(39);
float o = result.Read<float>(40);
float x = trans_x;
float y = trans_y;
float z = trans_z;
float o = trans_o;
m_movementInfo.transport.pos = new Position(x, y, z, o);
transport.CalculatePassengerPosition(ref x, ref y, ref z, ref o);
@@ -2671,8 +2764,7 @@ namespace Game.Entities
Math.Abs(m_movementInfo.transport.pos.posY) > 250.0f ||
Math.Abs(m_movementInfo.transport.pos.posZ) > 250.0f)
{
Log.outError(LogFilter.Player, "Player (guidlow {0}) have invalid transport coordinates (X: {1} Y: {2} Z: {3} O: {4}). Teleport to bind location.",
guid.ToString(), x, y, z, o);
Log.outError(LogFilter.Player, "Player (guidlow {0}) have invalid transport coordinates (X: {1} Y: {2} Z: {3} O: {4}). Teleport to bind location.", guid.ToString(), x, y, z, o);
m_movementInfo.transport.Reset();
RelocateToHomebind();
@@ -2687,16 +2779,15 @@ namespace Game.Entities
}
else
{
Log.outError(LogFilter.Player, "Player (guidlow {0}) have problems with transport guid ({1}). Teleport to bind location.",
guid.ToString(), transLowGUID);
Log.outError(LogFilter.Player, "Player (guidlow {0}) have problems with transport guid ({1}). Teleport to bind location.", guid.ToString(), transguid);
RelocateToHomebind();
}
}
// currently we do not support taxi in instance
else if (!string.IsNullOrEmpty(taxi_nodes))
else if (!taxi_path.IsEmpty())
{
instanceId = 0;
instance_id = 0;
// Not finish taxi flight path
if (m_bgData.HasTaxiPath())
@@ -2704,7 +2795,7 @@ namespace Game.Entities
for (int i = 0; i < 2; ++i)
m_taxi.AddTaxiDestination(m_bgData.taxiPath[i]);
}
if (!m_taxi.LoadTaxiDestinationsFromString(taxi_nodes, GetTeam()))
if (!m_taxi.LoadTaxiDestinationsFromString(taxi_path, GetTeam()))
{
// problems with taxi path loading
TaxiNodesRecord nodeEntry = null;
@@ -2753,19 +2844,20 @@ namespace Game.Entities
}
// fix crash (because of if (Map* map = _FindMap(instanceId)) in MapInstanced.CreateInstance)
if (instanceId != 0)
if (instance_id != 0)
{
InstanceSave save = GetInstanceSave(mapId);
if (save != null)
if (save.GetInstanceId() != instanceId)
instanceId = 0;
if (save.GetInstanceId() != instance_id)
instance_id = 0;
}
}
// NOW player must have valid map
// load the player's map here if it's not already loaded
if (!map)
map = Global.MapMgr.CreateMap(mapId, this, instanceId);
map = Global.MapMgr.CreateMap(mapId, this, instance_id);
AreaTriggerStruct areaTrigger = null;
bool check = false;
@@ -2802,7 +2894,7 @@ namespace Game.Entities
areaTrigger = Global.ObjectMgr.GetGoBackTrigger(mapId);
check = true;
}
else if (instanceId != 0 && Global.InstanceSaveMgr.GetInstanceSave(instanceId) == null) // ... and instance is reseted then look for entrance.
else if (instance_id != 0 && Global.InstanceSaveMgr.GetInstanceSave(instance_id) == null) // ... and instance is reseted then look for entrance.
{
areaTrigger = Global.ObjectMgr.GetMapEntranceTrigger(mapId);
check = true;
@@ -2857,7 +2949,7 @@ namespace Game.Entities
SaveRecallPosition();
long now = Time.UnixTime;
long logoutTime = result.Read<int>(32);
long logoutTime = logout_time;
// since last logout (in seconds)
uint time_diff = (uint)(now - logoutTime);
@@ -2870,32 +2962,30 @@ namespace Game.Entities
SetDrunkValue(newDrunkValue);
m_cinematic = result.Read<byte>(28);
m_PlayedTimeTotal = result.Read<uint>(29);
m_PlayedTimeLevel = result.Read<uint>(30);
m_cinematic = cinematic;
m_PlayedTimeTotal = totaltime;
m_PlayedTimeLevel = leveltime;
SetTalentResetCost(result.Read<uint>(34));
SetTalentResetTime(result.Read<uint>(35));
SetTalentResetCost(resettalents_cost);
SetTalentResetTime(resettalents_time);
m_taxi.LoadTaxiMask(result.Read<string>(27)); // must be before InitTaxiNodesForLevel
m_taxi.LoadTaxiMask(taximask); // must be before InitTaxiNodesForLevel
PlayerExtraFlags extraflags = (PlayerExtraFlags)result.Read<uint>(42);
m_stableSlots = result.Read<byte>(43);
m_stableSlots = stable_slots;
if (m_stableSlots > 4)
{
Log.outError(LogFilter.Player, "Player can have not more {0} stable slots, but have in DB {1}", 4, m_stableSlots);
m_stableSlots = 4;
}
atLoginFlags = (AtLoginFlags)result.Read<uint>(44);
atLoginFlags = (AtLoginFlags)at_login;
// Honor system
// Update Honor kills data
m_lastHonorUpdateTime = logoutTime;
UpdateHonorFields();
m_deathExpireTime = result.Read<uint>(47);
m_deathExpireTime = death_expire_time;
if (m_deathExpireTime > now + PlayerConst.MaxDeathCount * PlayerConst.DeathExpireStep)
m_deathExpireTime = now + PlayerConst.MaxDeathCount * PlayerConst.DeathExpireStep - 1;
@@ -2910,20 +3000,19 @@ namespace Game.Entities
InitRunes();
// rest bonus can only be calculated after InitStatsForLevel()
_restMgr.LoadRestBonus(RestTypes.XP, (PlayerRestState)result.Read<byte>(19), result.Read<float>(31));
_restMgr.LoadRestBonus(RestTypes.XP, restState, rest_bonus);
// load skills after InitStatsForLevel because it triggering aura apply also
_LoadSkills(holder.GetResult(PlayerLoginQueryLoad.Skills));
UpdateSkillsForLevel();
SetNumRespecs(result.Read<byte>(76));
SetPrimarySpecialization(result.Read<uint>(36));
SetActiveTalentGroup(result.Read<byte>(64));
SetNumRespecs(numRespecs);
SetPrimarySpecialization(primarySpecialization);
SetActiveTalentGroup(activeTalentGroup);
ChrSpecializationRecord primarySpec = CliDB.ChrSpecializationStorage.LookupByKey(GetPrimarySpecialization());
if (primarySpec == null || primarySpec.ClassID != (byte)GetClass() || GetActiveTalentGroup() >= PlayerConst.MaxSpecializations)
ResetTalentSpecialization();
uint lootSpecId = result.Read<byte>(65);
ChrSpecializationRecord chrSpec = CliDB.ChrSpecializationStorage.LookupByKey(lootSpecId);
if (chrSpec != null)
{
@@ -2986,11 +3075,10 @@ namespace Game.Entities
// check PLAYER_CHOSEN_TITLE compatibility with PLAYER__FIELD_KNOWN_TITLES
// note: PLAYER__FIELD_KNOWN_TITLES updated at quest status loaded
uint curTitle = result.Read<uint>(53);
if (curTitle != 0 && !HasTitle(curTitle))
curTitle = 0;
if (chosenTitle != 0 && !HasTitle(chosenTitle))
chosenTitle = 0;
SetChosenTitle(curTitle);
SetChosenTitle(chosenTitle);
// has to be called after last Relocate() in Player.LoadFromDB
SetFallInformation(0, GetPositionZ());
@@ -3009,14 +3097,13 @@ namespace Game.Entities
UpdateAllStats();
// restore remembered power/health values (but not more max values)
uint savedHealth = result.Read<uint>(56);
SetHealth(savedHealth > GetMaxHealth() ? GetMaxHealth() : savedHealth);
SetHealth(health > GetMaxHealth() ? GetMaxHealth() : health);
int loadedPowers = 0;
for (PowerType i = 0; i < PowerType.Max; ++i)
{
if (Global.DB2Mgr.GetPowerIndexByClass(i, GetClass()) != (int)PowerType.Max)
{
uint savedPower = result.Read<uint>(56 + loadedPowers);
uint savedPower = powers[loadedPowers];
uint maxPower = m_unitData.MaxPower[loadedPowers];
SetPower(i, (int)(savedPower > maxPower ? maxPower : savedPower));
if (++loadedPowers >= (int)PowerType.MaxPerClass)
@@ -3025,7 +3112,7 @@ namespace Game.Entities
}
for (; loadedPowers < (int)PowerType.MaxPerClass; ++loadedPowers)
SetUpdateFieldValue(ref m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.Power, (int)loadedPowers), 0);
SetUpdateFieldValue(ref m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.Power, loadedPowers), 0);
SetPower(PowerType.LunarPower, 0);
// Init rune recharge
@@ -3054,7 +3141,7 @@ namespace Game.Entities
case 1: SetGameMaster(true);
break; // enable
case 2: // save state
if (extraflags.HasAnyFlag(PlayerExtraFlags.GMOn))
if (extra_flags.HasAnyFlag(PlayerExtraFlags.GMOn))
SetGameMaster(true);
break;
}
@@ -3067,7 +3154,7 @@ namespace Game.Entities
case 1:
break; // visible
case 2: // save state
if (extraflags.HasAnyFlag(PlayerExtraFlags.GMInvisible))
if (extra_flags.HasAnyFlag(PlayerExtraFlags.GMInvisible))
SetGMVisible(false);
break;
}
@@ -3080,7 +3167,7 @@ namespace Game.Entities
case 1: SetGMChat(true);
break; // enable
case 2: // save state
if (extraflags.HasAnyFlag(PlayerExtraFlags.GMChat))
if (extra_flags.HasAnyFlag(PlayerExtraFlags.GMChat))
SetGMChat(true);
break;
}
@@ -3093,7 +3180,7 @@ namespace Game.Entities
case 1: SetAcceptWhispers(true);
break; // enable
case 2: // save state
if (extraflags.HasAnyFlag(PlayerExtraFlags.AcceptWhispers))
if (extra_flags.HasAnyFlag(PlayerExtraFlags.AcceptWhispers))
SetAcceptWhispers(true);
break;
}
@@ -3118,16 +3205,16 @@ namespace Game.Entities
holder.GetResult(PlayerLoginQueryLoad.GarrisonFollowerAbilities)))
_garrison = garrison;
_InitHonorLevelOnLoadFromDB(result.Read<uint>(72), result.Read<uint>(73));
_InitHonorLevelOnLoadFromDB(honor, honorLevel);
_restMgr.LoadRestBonus(RestTypes.Honor, (PlayerRestState)result.Read<byte>(74), result.Read<float>(75));
_restMgr.LoadRestBonus(RestTypes.Honor, honorRestState, honorRestBonus);
if (time_diff > 0)
{
//speed collect rest bonus in offline, in logout, far from tavern, city (section/in hour)
float bubble0 = 0.031f;
//speed collect rest bonus in offline, in logout, in tavern, city (section/in hour)
float bubble1 = 0.125f;
float bubble = result.Read<byte>(33) > 0
float bubble = is_logout_resting > 0
? bubble1 * WorldConfig.GetFloatValue(WorldCfg.RateRestOfflineInTavernOrCity)
: bubble0 * WorldConfig.GetFloatValue(WorldCfg.RateRestOfflineInWilderness);
@@ -3191,15 +3278,8 @@ namespace Game.Entities
stmt.AddValue(index++, (byte)GetClass());
stmt.AddValue(index++, (byte)m_playerData.NativeSex); // save gender from PLAYER_BYTES_3, UNIT_BYTES_0 changes with every transform effect
stmt.AddValue(index++, GetLevel());
stmt.AddValue(index++, (uint)m_activePlayerData.XP);
stmt.AddValue(index++, (uint)GetNativeSex());
stmt.AddValue(index++, GetMoney());
stmt.AddValue(index++, (byte)m_playerData.SkinID);
stmt.AddValue(index++, (byte)m_playerData.FaceID);
stmt.AddValue(index++, (byte)m_playerData.HairStyleID);
stmt.AddValue(index++, (byte)m_playerData.HairColorID);
stmt.AddValue(index++, (byte)m_playerData.FacialHairStyleID);
for (int i = 0; i < PlayerConst.CustomDisplaySize; ++i)
stmt.AddValue(index++, m_playerData.CustomDisplayOption[i]);
stmt.AddValue(index++, GetInventorySlotCount());
stmt.AddValue(index++, GetBankBagSlotCount());
stmt.AddValue(index++, (byte)m_activePlayerData.RestInfo[(int)RestTypes.XP].StateID);
@@ -3321,17 +3401,8 @@ namespace Game.Entities
stmt.AddValue(index++, (byte)GetClass());
stmt.AddValue(index++, (byte)m_playerData.NativeSex); // save gender from PLAYER_BYTES_3, UNIT_BYTES_0 changes with every transform effect
stmt.AddValue(index++, GetLevel());
stmt.AddValue(index++, (uint)m_activePlayerData.XP);
stmt.AddValue(index++, (uint)GetNativeSex());
stmt.AddValue(index++, GetMoney());
stmt.AddValue(index++, (byte)m_playerData.SkinID);
stmt.AddValue(index++, (byte)m_playerData.FaceID);
stmt.AddValue(index++, (byte)m_playerData.HairStyleID);
stmt.AddValue(index++, (byte)m_playerData.HairColorID);
stmt.AddValue(index++, (byte)m_playerData.FacialHairStyleID);
for (int i = 0; i < PlayerConst.CustomDisplaySize; ++i)
stmt.AddValue(index++, m_playerData.CustomDisplayOption[i]);
stmt.AddValue(index++, GetInventorySlotCount());
stmt.AddValue(index++, GetBankBagSlotCount());
stmt.AddValue(index++, (byte)m_activePlayerData.RestInfo[(int)RestTypes.XP].StateID);
@@ -3485,6 +3556,7 @@ namespace Game.Entities
if (m_mailsUpdated) //save mails only when needed
_SaveMail(characterTransaction);
_SaveCustomizations(characterTransaction);
_SaveBGData(characterTransaction);
_SaveInventory(characterTransaction);
_SaveVoidStorage(characterTransaction);
@@ -3807,6 +3879,10 @@ namespace Game.Entities
stmt.AddValue(0, guid);
trans.Append(stmt);
stmt = DB.Characters.GetPreparedStatement(CharStatements.DEL_CHARACTER_CUSTOMIZATIONS);
stmt.AddValue(0, guid);
trans.Append(stmt);
stmt = DB.Characters.GetPreparedStatement(CharStatements.DEL_PLAYER_ACCOUNT_DATA);
stmt.AddValue(0, guid);
trans.Append(stmt);
@@ -196,6 +196,7 @@ namespace Game.Entities
byte m_cinematic;
uint m_movie;
bool m_customizationsChanged;
SpecializationInfo _specializationInfo;
public List<ObjectGuid> m_clientGUIDs = new List<ObjectGuid>();
+8 -2
View File
@@ -32,6 +32,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using Game.BattleFields;
using Framework.Dynamic;
namespace Game.Entities
{
@@ -3848,6 +3849,8 @@ namespace Game.Entities
if (guild != null)
guild.AddGuildNews(GuildNews.ItemPurchased, GetGUID(), 0, item);
}
UpdateCriteria(CriteriaTypes.BoughtItemFromVendor, 1);
return true;
}
@@ -5186,9 +5189,12 @@ namespace Game.Entities
return InventoryResult.ClientLockedOut;
}
ScalingStatDistributionRecord ssd = CliDB.ScalingStatDistributionStorage.LookupByKey(pItem.GetScalingStatDistribution());
ContentTuningLevels? requiredLevels = null;
// check allowed level (extend range to upper values if MaxLevel more or equal max player level, this let GM set high level with 1...max range items)
if (ssd != null && ssd.MaxLevel < WorldConfig.GetIntValue(WorldCfg.MaxPlayerLevel) && ssd.MaxLevel < GetLevel() && Global.DB2Mgr.GetHeirloomByItemId(pProto.GetId()) == null)
if (pItem.GetQuality() == ItemQuality.Heirloom)
requiredLevels = Global.DB2Mgr.GetContentTuningData(pItem.GetScalingContentTuningId(), 0, true);
if (requiredLevels.HasValue && requiredLevels.Value.MaxLevel < SharedConst.DefaultMaxLevel && requiredLevels.Value.MaxLevel < GetLevel() && Global.DB2Mgr.GetHeirloomByItemId(pProto.GetId()) == null)
return InventoryResult.NotEquippable;
byte eslot = FindEquipSlot(pProto, slot, swap);
@@ -144,6 +144,8 @@ namespace Game.Entities
_restMgr.SetRestFlag(RestFlag.FactionArea);
else
_restMgr.RemoveRestFlag(RestFlag.FactionArea);
UpdateCriteria(CriteriaTypes.TravelledToArea, newArea);
}
public void UpdateZone(uint newZone, uint newArea)
+14 -7
View File
@@ -49,14 +49,18 @@ namespace Game.Entities
public int GetQuestMinLevel(Quest quest)
{
if (quest.Level == -1 && quest.ScalingFactionGroup != 0)
var questLevels = Global.DB2Mgr.GetContentTuningData(quest.ContentTuningId, m_playerData.CtrOptions.GetValue().ContentTuningConditionMask);
if (questLevels.HasValue)
{
ChrRacesRecord race = CliDB.ChrRacesStorage.LookupByKey(GetRace());
FactionTemplateRecord raceFaction = CliDB.FactionTemplateStorage.LookupByKey(race.FactionID);
if (raceFaction == null || raceFaction.FactionGroup != quest.ScalingFactionGroup)
return quest.MaxScalingLevel;
if (raceFaction == null || raceFaction.FactionGroup != CliDB.ContentTuningStorage.LookupByKey(quest.ContentTuningId).GetScalingFactionGroup())
return questLevels.Value.MaxLevel;
return questLevels.Value.MinLevelWithDelta;
}
return quest.MinLevel;
return 0;
}
public int GetQuestLevel(Quest quest)
@@ -64,16 +68,18 @@ namespace Game.Entities
if (quest == null)
return 0;
if (quest.Level == -1)
var questLevels = Global.DB2Mgr.GetContentTuningData(quest.ContentTuningId, m_playerData.CtrOptions.GetValue().ContentTuningConditionMask);
if (questLevels.HasValue)
{
int minLevel = GetQuestMinLevel(quest);
int maxLevel = quest.MaxScalingLevel;
int maxLevel = questLevels.Value.MaxLevel;
int level = (int)GetLevel();
if (level >= minLevel)
return Math.Min(level, maxLevel);
return minLevel;
}
return quest.Level;
return 0;
}
public int GetRewardedQuestCount() { return m_RewardedQuests.Count; }
@@ -1153,6 +1159,7 @@ namespace Game.Entities
UpdateCriteria(CriteriaTypes.CompleteQuestCount);
UpdateCriteria(CriteriaTypes.CompleteQuest, quest.Id);
UpdateCriteria(CriteriaTypes.CompleteQuestAccumulate, 1);
// make full db save
SaveToDB(false);
+77 -244
View File
@@ -59,6 +59,7 @@ namespace Game.Entities
m_zoneUpdateId = 0xffffffff;
m_nextSave = WorldConfig.GetUIntValue(WorldCfg.IntervalSave);
m_customizationsChanged = false;
SetGroupInvite(null);
@@ -184,7 +185,7 @@ namespace Game.Entities
return false;
}
if (!ValidateAppearance(createInfo.RaceId, createInfo.ClassId, createInfo.Sex, createInfo.HairStyle, createInfo.HairColor, createInfo.Face, createInfo.FacialHairStyle, createInfo.Skin, createInfo.CustomDisplay, true))
if (!GetSession().ValidateAppearance(createInfo.RaceId, createInfo.ClassId, createInfo.Sex, createInfo.Customizations))
{
Log.outError(LogFilter.Player, "Player.Create: Possible hacking-attempt: Account {0} tried creating a character named '{1}' with invalid appearance attributes - refusing to do so",
GetSession().GetAccountId(), GetName());
@@ -223,14 +224,7 @@ namespace Game.Entities
SetWatchedFactionIndex(0xFFFFFFFF);
SetSkinId(createInfo.Skin);
SetFaceId(createInfo.Face);
SetHairStyleId(createInfo.HairStyle);
SetHairColorId(createInfo.HairColor);
SetFacialHairStyleId(createInfo.FacialHairStyle);
for (byte i = 0; i < PlayerConst.CustomDisplaySize; ++i)
SetCustomDisplayOption(i, createInfo.CustomDisplay[i]);
SetCustomizations(createInfo.Customizations);
SetRestState(RestTypes.XP, ((GetSession().IsARecruiter() || GetSession().GetRecruiterId() != 0) ? PlayerRestState.RAFLinked : PlayerRestState.NotRAFLinked));
SetRestState(RestTypes.Honor, PlayerRestState.NotRAFLinked);
SetNativeSex(createInfo.Sex);
@@ -308,46 +302,8 @@ namespace Game.Entities
}
// original items
CharStartOutfitRecord oEntry = Global.DB2Mgr.GetCharStartOutfitEntry((byte)createInfo.RaceId, (byte)createInfo.ClassId, (byte)createInfo.Sex);
if (oEntry != null)
{
for (int j = 0; j < ItemConst.MaxOutfitItems - 1; ++j)
{
if (oEntry.ItemID[j] <= 0)
continue;
uint itemId = (uint)oEntry.ItemID[j];
ItemTemplate iProto = Global.ObjectMgr.GetItemTemplate(itemId);
if (iProto == null)
continue;
// BuyCount by default
uint count = iProto.GetBuyCount();
// special amount for food/drink
if (iProto.GetClass() == ItemClass.Consumable && iProto.GetSubClass() == (uint)ItemSubClassConsumable.FoodDrink)
{
if (!iProto.Effects.Empty())
{
switch (iProto.Effects[0].SpellCategoryID)
{
case 11: // food
count = (uint)(GetClass() == Class.Deathknight ? 10 : 4);
break;
case 59: // drink
count = 2;
break;
}
}
if (iProto.GetMaxStackSize() < count)
count = iProto.GetMaxStackSize();
}
StoreNewItemInBestSlots(itemId, count);
}
}
foreach (var item in info.item)
StoreNewItemInBestSlots(item.item_id, item.item_amount);
foreach (PlayerCreateInfoItem initialItem in info.item)
StoreNewItemInBestSlots(initialItem.item_id, initialItem.item_amount);
// bags and main-hand weapon must equipped at this moment
// now second pass for not equipped (offhand weapon/shield if it attempt equipped before main-hand weapon)
@@ -1193,7 +1149,7 @@ namespace Game.Entities
FactionRecord factionEntry = CliDB.FactionStorage.LookupByKey(currency.FactionID);
if (factionEntry != null)
{
if (currency.Flags.HasAnyFlag((uint)CurrencyFlags.HighPrecision))
if (currency.Flags[0].HasAnyFlag((int)CurrencyFlags.HighPrecision))
count /= 100;
GetReputationMgr().ModifyReputation(factionEntry, count, false, true);
return;
@@ -1582,10 +1538,14 @@ namespace Game.Entities
{
LFGDungeonsRecord dungeon = Global.DB2Mgr.GetLfgDungeon(map.GetId(), map.GetDifficultyID());
if (dungeon != null)
if (dungeon.TargetLevel == 80)
{
var dungeonLevels = Global.DB2Mgr.GetContentTuningData(dungeon.ContentTuningID, m_playerData.CtrOptions.GetValue().ContentTuningConditionMask);
if (dungeonLevels.HasValue)
if (dungeonLevels.Value.TargetLevelMax == Global.ObjectMgr.GetMaxLevelForExpansion(Expansion.WrathOfTheLichKing))
ChampioningFaction = GetChampioningFaction();
}
}
}
Team team = GetTeam();
@@ -2613,6 +2573,9 @@ namespace Game.Entities
if (channel.Flags.HasAnyFlag(ChannelDBCFlags.GuildReq) && GetGuildId() != 0)
return false;
if (channel.Flags.HasAnyFlag(ChannelDBCFlags.NoClientJoin))
return false;
return true;
}
public void JoinedChannel(Channel c)
@@ -2658,6 +2621,9 @@ namespace Game.Entities
foreach (var channelEntry in CliDB.ChatChannelsStorage.Values)
{
if (!channelEntry.Flags.HasAnyFlag(ChannelDBCFlags.Initial))
continue;
Channel usedChannel = null;
foreach (var channel in m_channels)
{
@@ -3467,51 +3433,27 @@ namespace Game.Entities
SendBattlefieldWorldStates();
}
public uint GetBarberShopCost(BarberShopStyleRecord newHairStyle, uint newHairColor, BarberShopStyleRecord newFacialHair, BarberShopStyleRecord newSkin, BarberShopStyleRecord newFace, Array<BarberShopStyleRecord> newCustomDisplay)
public long GetBarberShopCost(List<ChrCustomizationChoice> newCustomizations)
{
byte hairstyle = m_playerData.HairStyleID;
byte haircolor = m_playerData.HairColorID;
byte facialhair = m_playerData.FacialHairStyleID;
byte skincolor = m_playerData.SkinID;
byte face = m_playerData.FaceID;
Array<byte> customDisplay = new Array<byte>(PlayerConst.CustomDisplaySize);
for (int i = 0; i < PlayerConst.CustomDisplaySize; ++i)
customDisplay[i] = m_playerData.CustomDisplayOption[i];
if ((hairstyle == newHairStyle.Data) &&
(haircolor == newHairColor) &&
(facialhair == newFacialHair.Data) &&
(newSkin == null || (newSkin.Data == skincolor)) &&
(newFace == null || (newFace.Data == face)) &&
(newCustomDisplay[0] == null || (newCustomDisplay[0].Data == customDisplay[0])) &&
(newCustomDisplay[1] == null || (newCustomDisplay[1].Data == customDisplay[1])) &&
(newCustomDisplay[2] == null || (newCustomDisplay[2].Data == customDisplay[2])))
return 0;
GtBarberShopCostBaseRecord bsc = CliDB.BarberShopCostBaseGameTable.GetRow(GetLevel());
if (bsc == null) // shouldn't happen
return 0xFFFFFFFF;
return 0;
uint cost = 0;
if (hairstyle != newHairStyle.Data)
cost += (uint)(bsc.Cost * newHairStyle.CostModifier);
long cost = 0;
foreach (ChrCustomizationChoice newChoice in newCustomizations)
{
int currentCustomizationIndex = m_playerData.Customizations.FindIndexIf(currentCustomization =>
{
return currentCustomization.ChrCustomizationOptionID == newChoice.ChrCustomizationOptionID;
});
if ((haircolor != newHairColor) && (hairstyle == newHairStyle.Data))
cost += (uint)(bsc.Cost * 0.5f); // +1/2 of price
if (facialhair != newFacialHair.Data)
cost += (uint)(bsc.Cost * newFacialHair.CostModifier);
if (newSkin != null && skincolor != newSkin.Data)
cost += (uint)(bsc.Cost * newSkin.CostModifier);
if (newFace != null && face != newFace.Data)
cost += (uint)(bsc.Cost * newFace.CostModifier);
for (int i = 0; i < PlayerConst.CustomDisplaySize; ++i)
if (newCustomDisplay[i] != null && customDisplay[i] != newCustomDisplay[i].Data)
cost += (uint)(bsc.Cost * newCustomDisplay[i].CostModifier);
if (currentCustomizationIndex == -1 || m_playerData.Customizations[currentCustomizationIndex].ChrCustomizationChoiceID != newChoice.ChrCustomizationChoiceID)
{
ChrCustomizationOptionRecord customizationOption = CliDB.ChrCustomizationOptionStorage.LookupByKey(newChoice.ChrCustomizationOptionID);
if (customizationOption != null)
cost += (long)(bsc.Cost * customizationOption.BarberShopCostModifier);
}
}
return cost;
}
@@ -3950,139 +3892,10 @@ namespace Game.Entities
return null;
}
static uint GetSelectionFromContext(uint context, Class playerClass)
{
switch (context)
{
case 1:
if (playerClass == Class.Deathknight)
return 1;
if (playerClass == Class.DemonHunter)
return 3;
return 0;
case 2:
if (playerClass == Class.Deathknight)
return 5;
if (playerClass == Class.DemonHunter)
return 6;
return 4;
case 3:
return 7;
case 4:
if (playerClass == Class.Deathknight)
return 9;
if (playerClass == Class.DemonHunter)
return 10;
return 8;
default:
if (playerClass == Class.Deathknight)
return 1;
if (playerClass == Class.DemonHunter)
return 2;
return 0;
}
}
static bool ComponentFlagsMatch(CharSectionsRecord entry, uint selection)
{
switch (selection)
{
case 0:
if (!entry.Flags.HasAnyFlag((short)1))
return false;
return !entry.Flags.HasAnyFlag((short)0x2C);
case 1:
if (!entry.Flags.HasAnyFlag((short)1))
return false;
if (!entry.Flags.HasAnyFlag((short)0x94))
return false;
return !entry.Flags.HasAnyFlag((short)8);
case 2:
if (!entry.Flags.HasAnyFlag((short)1))
return false;
if (!entry.Flags.HasAnyFlag((short)0x70))
return false;
return !entry.Flags.HasAnyFlag((short)8);
case 3:
if (!entry.Flags.HasAnyFlag((short)1))
return false;
if (!entry.Flags.HasAnyFlag((short)0x20))
return false;
return !entry.Flags.HasAnyFlag((short)8);
case 4:
case 8:
if (!entry.Flags.HasAnyFlag((short)3))
return false;
return !entry.Flags.HasAnyFlag((short)0x2C);
case 5:
case 9:
if (!entry.Flags.HasAnyFlag((short)3))
return false;
if (!entry.Flags.HasAnyFlag((short)0x94))
return false;
return !entry.Flags.HasAnyFlag((short)8);
case 6:
case 10:
if (!entry.Flags.HasAnyFlag((short)3))
return false;
if (!entry.Flags.HasAnyFlag((short)0x70))
return false;
return !entry.Flags.HasAnyFlag((short)8);
case 7:
return true;
default:
break;
}
return false;
}
static bool IsSectionFlagValid(CharSectionsRecord entry, Class class_, bool create)
{
if (create)
return ComponentFlagsMatch(entry, GetSelectionFromContext(0, class_));
return ComponentFlagsMatch(entry, GetSelectionFromContext(2, class_));
}
static bool IsSectionValid(Race race, Class class_, Gender gender, CharBaseSectionVariation variation, byte variationIndex, byte colorIndex, bool create)
{
CharSectionsRecord section = Global.DB2Mgr.GetCharSectionEntry(race, gender, variation, variationIndex, colorIndex);
if (section != null)
return IsSectionFlagValid(section, class_, create);
return false;
}
public static bool IsValidGender(Gender _gender) { return _gender <= Gender.Female; }
public static bool IsValidClass(Class _class) { return Convert.ToBoolean((1 << ((int)_class - 1)) & (int)Class.ClassMaskAllPlayable); }
public static bool IsValidRace(Race _race) { return Convert.ToBoolean((1 << ((int)_race - 1)) & (int)Race.RaceMaskAllPlayable); }
public static bool ValidateAppearance(Race race, Class class_, Gender gender, byte hairID, byte hairColor, byte faceID, byte facialHairId, byte skinColor, Array<byte> customDisplay, bool create = false)
{
if (!IsSectionValid(race, class_, gender, CharBaseSectionVariation.Skin, 0, skinColor, create))
return false;
if (!IsSectionValid(race, class_, gender, CharBaseSectionVariation.Face, faceID, skinColor, create))
return false;
if (!IsSectionValid(race, class_, gender, CharBaseSectionVariation.Hair, hairID, hairColor, create))
return false;
if (!IsSectionValid(race, class_, gender, CharBaseSectionVariation.FacialHair, facialHairId, hairColor, create))
if (Global.DB2Mgr.HasCharSections(race, gender, CharBaseSectionVariation.FacialHair) || !Global.DB2Mgr.HasCharacterFacialHairStyle(race, gender, facialHairId))
return false;
if (!IsSectionValid(race, class_, gender, CharBaseSectionVariation.CustomDisplay1, customDisplay[0], 0, create))
return false;
if (!IsSectionValid(race, class_, gender, CharBaseSectionVariation.CustomDisplay2, customDisplay[1], 0, create))
return false;
if (!IsSectionValid(race, class_, gender, CharBaseSectionVariation.CustomDisplay3, customDisplay[2], 0, create))
return false;
return true;
}
public void OnCombatExit()
{
UpdatePotionCooldown();
@@ -4594,12 +4407,8 @@ namespace Game.Entities
flags |= CorpseFlags.FFAPvP;
corpse.SetRace(GetRace());
corpse.SetSex((Gender)(byte)m_playerData.NativeSex);
corpse.SetSkin(m_playerData.SkinID);
corpse.SetFace(m_playerData.FaceID);
corpse.SetHairStyle(m_playerData.HairStyleID);
corpse.SetHairColor(m_playerData.HairColorID);
corpse.SetFacialHairStyle(m_playerData.FacialHairStyleID);
corpse.SetSex(GetNativeSex());
corpse.SetCustomizations(m_playerData.Customizations);
corpse.SetFlags(flags);
corpse.SetDisplayId(GetNativeDisplayId());
corpse.SetFactionTemplate(CliDB.ChrRacesStorage.LookupByKey(GetRace()).FactionID);
@@ -5475,8 +5284,7 @@ namespace Game.Entities
return;
}
byte gender = m_playerData.NativeSex;
switch ((Gender)gender)
switch (GetNativeSex())
{
case Gender.Female:
SetDisplayId(info.DisplayId_f);
@@ -5487,7 +5295,7 @@ namespace Game.Entities
SetNativeDisplayId(info.DisplayId_m);
break;
default:
Log.outError(LogFilter.Player, "Player {0} ({1}) has invalid gender {2}", GetName(), GetGUID().ToString(), (Gender)gender);
Log.outError(LogFilter.Player, "Player {0} ({1}) has invalid gender {2}", GetName(), GetGUID().ToString(), GetNativeSex());
return;
}
@@ -5883,13 +5691,13 @@ namespace Game.Entities
SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.ModHealingDonePos), 0);
SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.ModHealingPercent), 1.0f);
SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.ModHealingDonePercent), 1.0f);
SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.ModPeriodicHealingDonePercent), 1.0f);
for (byte i = 0; i < 7; ++i)
for (byte i = 0; i < (int)SpellSchools.Max; ++i)
{
SetUpdateFieldValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.ModDamageDoneNeg, i), 0);
SetUpdateFieldValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.ModDamageDonePos, i), 0);
SetUpdateFieldValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.ModDamageDonePercent, i), 1.0f);
SetUpdateFieldValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.ModHealingDonePercent, i), 1.0f);
}
SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.ModSpellPowerPercent), 1.0f);
@@ -6324,7 +6132,8 @@ namespace Game.Entities
UpdateCriteria(CriteriaTypes.ExploreArea, GetAreaId());
if (areaEntry.ExplorationLevel > 0)
var areaLevels = Global.DB2Mgr.GetContentTuningData(areaEntry.ContentTuningID, m_playerData.CtrOptions.GetValue().ContentTuningConditionMask);
if (areaLevels.HasValue)
{
if (GetLevel() >= WorldConfig.GetIntValue(WorldCfg.MaxPlayerLevel))
{
@@ -6332,7 +6141,8 @@ namespace Game.Entities
}
else
{
int diff = (int)(GetLevel() - areaEntry.ExplorationLevel);
ushort areaLevel = (ushort)Math.Min(Math.Max((ushort)GetLevel(), areaLevels.Value.MinLevel), areaLevels.Value.MaxLevel);
int diff = (int)(GetLevel()) - areaLevel;
uint XP = 0;
if (diff < -5)
{
@@ -6344,11 +6154,11 @@ namespace Game.Entities
if (exploration_percent < 0)
exploration_percent = 0;
XP = (uint)(Global.ObjectMgr.GetBaseXP((byte)areaEntry.ExplorationLevel) * exploration_percent / 100 * WorldConfig.GetFloatValue(WorldCfg.RateXpExplore));
XP = (uint)(Global.ObjectMgr.GetBaseXP(areaLevel) * exploration_percent / 100 * WorldConfig.GetFloatValue(WorldCfg.RateXpExplore));
}
else
{
XP = (uint)(Global.ObjectMgr.GetBaseXP((byte)areaEntry.ExplorationLevel) * WorldConfig.GetFloatValue(WorldCfg.RateXpExplore));
XP = (uint)(Global.ObjectMgr.GetBaseXP(areaLevel) * WorldConfig.GetFloatValue(WorldCfg.RateXpExplore));
}
GiveXP(XP, null);
@@ -7477,17 +7287,40 @@ namespace Game.Entities
public void RemovePlayerFlagEx(PlayerFlagsEx flags) { RemoveUpdateFieldFlagValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.PlayerFlagsEx), (uint)flags); }
public void SetPlayerFlagsEx(PlayerFlagsEx flags) { SetUpdateFieldValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.PlayerFlagsEx), (uint)flags); }
public void SetSkinId(byte skinId) { SetUpdateFieldValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.SkinID), skinId); }
public void SetFaceId(byte faceId) { SetUpdateFieldValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.FaceID), faceId); }
public void SetHairStyleId(byte hairStyleId) { SetUpdateFieldValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.HairStyleID), hairStyleId); }
public void SetHairColorId(byte hairColorId) { SetUpdateFieldValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.HairColorID), hairColorId); }
public void SetFacialHairStyleId(byte facialHairStyleId) { SetUpdateFieldValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.FacialHairStyleID), facialHairStyleId); }
public uint GetCustomizationChoice(uint chrCustomizationOptionId)
{
int choiceIndex = m_playerData.Customizations.FindIndexIf(choice =>
{
return choice.ChrCustomizationOptionID == chrCustomizationOptionId;
});
if (choiceIndex >= 0)
return m_playerData.Customizations[choiceIndex].ChrCustomizationChoiceID;
return 0;
}
public void SetCustomizations(List<ChrCustomizationChoice> customizations, bool markChanged = true)
{
if (markChanged)
m_customizationsChanged = true;
ClearDynamicUpdateFieldValues(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.Customizations));
foreach (var customization in customizations)
{
ChrCustomizationChoice newChoice = new ChrCustomizationChoice();
newChoice.ChrCustomizationOptionID = customization.ChrCustomizationOptionID;
newChoice.ChrCustomizationChoiceID = customization.ChrCustomizationChoiceID;
AddDynamicUpdateFieldValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.Customizations), newChoice);
}
}
public Gender GetNativeSex() { return (Gender)(byte)m_playerData.NativeSex; }
public void SetNativeSex(Gender sex) { SetUpdateFieldValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.NativeSex), (byte)sex); }
public void SetPvpTitle(byte pvpTitle) { SetUpdateFieldValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.PvpTitle), pvpTitle); }
public void SetArenaFaction(byte arenaFaction) { SetUpdateFieldValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.ArenaFaction), arenaFaction); }
public void ApplyModFakeInebriation(int mod, bool apply) { ApplyModUpdateFieldValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.FakeInebriation), mod, apply); }
public void SetVirtualPlayerRealm(uint virtualRealmAddress) { SetUpdateFieldValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.VirtualPlayerRealm), virtualRealmAddress); }
public void SetCustomDisplayOption(int slot, byte customDisplayOption) { SetUpdateFieldValue(ref m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.CustomDisplayOption, slot), customDisplayOption); }
public void AddHeirloom(uint itemId, uint flags)
{
@@ -7537,9 +7370,9 @@ namespace Game.Entities
public void ApplyModOverrideAPBySpellPowerPercent(float mod, bool apply) { ApplyModUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.OverrideAPBySpellPowerPercent), mod, apply); }
public bool HasPlayerLocalFlag(PlayerLocalFlags flags) { return (m_activePlayerData.LocalFlags & (int)flags) != 0; }
public void AddPlayerLocalFlag(PlayerLocalFlags flags) { SetUpdateFieldFlagValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.LocalFlags), (int)flags); }
public void RemovePlayerLocalFlag(PlayerLocalFlags flags) { RemoveUpdateFieldFlagValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.LocalFlags), (int)flags); }
public void SetPlayerLocalFlags(PlayerLocalFlags flags) { SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.LocalFlags), (int)flags); }
public void AddPlayerLocalFlag(PlayerLocalFlags flags) { SetUpdateFieldFlagValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.LocalFlags), (uint)flags); }
public void RemovePlayerLocalFlag(PlayerLocalFlags flags) { RemoveUpdateFieldFlagValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.LocalFlags), (uint)flags); }
public void SetPlayerLocalFlags(PlayerLocalFlags flags) { SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.LocalFlags), (uint)flags); }
public byte GetNumRespecs() { return m_activePlayerData.NumRespecs; }
public void SetNumRespecs(byte numRespecs) { SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.NumRespecs), numRespecs); }
+5 -1
View File
@@ -114,7 +114,11 @@ namespace Game.Entities
if (rested_bonus > xp) // max rested_bonus == xp or (r+x) = 200% xp
rested_bonus = xp;
SetRestBonus(restType, GetRestBonus(restType) - rested_bonus);
uint rested_loss = rested_bonus;
if (restType == RestTypes.XP)
MathFunctions.AddPct(ref rested_loss, _player.GetTotalAuraModifier(AuraType.ModRestedXpConsumption));
SetRestBonus(restType, GetRestBonus(restType) - rested_loss);
Log.outDebug(LogFilter.Player, "RestMgr.GetRestBonus: Player '{0}' ({1}) gain {2} xp (+{3} Rested Bonus). Rested points={4}",
_player.GetGUID().ToString(), _player.GetName(), xp + rested_bonus, rested_bonus, GetRestBonus(restType));
+2 -1
View File
@@ -1493,7 +1493,8 @@ namespace Game.Entities
foreach (AuraEffect auraEffect in GetAuraEffectsByType(AuraType.ModHealingDonePercent))
MathFunctions.AddPct(ref value, auraEffect.GetAmount());
SetUpdateFieldStatValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.ModHealingDonePercent), value);
for (int i = 0; i < (int)SpellSchools.Max; ++i)
SetUpdateFieldStatValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.ModHealingDonePercent, i), value);
}
void UpdateCorruption()
+1 -1
View File
@@ -77,7 +77,7 @@ namespace Game.Entities
// Get spell cast by totem
SpellInfo totemSpell = Global.SpellMgr.GetSpellInfo(GetSpell(), GetMap().GetDifficultyID());
if (totemSpell != null)
if (totemSpell.CalcCastTime(GetLevel()) != 0) // If spell has cast time . its an active totem
if (totemSpell.CalcCastTime() != 0) // If spell has cast time -> its an active totem
m_type = TotemType.Active;
m_duration = duration;
+19 -17
View File
@@ -516,7 +516,14 @@ namespace Game.Entities
Player thisPlayer = ToPlayer();
if (thisPlayer != null)
return thisPlayer.m_activePlayerData.ModHealingDonePercent;
{
float maxModDamagePercentSchool = 0.0f;
for (int i = 0; i < (int)SpellSchools.Max; ++i)
if (((int)spellProto.GetSchoolMask() & (1 << i)) != 0)
maxModDamagePercentSchool = Math.Max(maxModDamagePercentSchool, thisPlayer.m_activePlayerData.ModHealingDonePercent[i]);
return maxModDamagePercentSchool;
}
float DoneTotalMod = 1.0f;
@@ -1201,8 +1208,10 @@ namespace Game.Entities
{
// mainly for DoTs which are 3500 here otherwise
int OriginalCastTime = spellProto.CalcCastTime();
if (OriginalCastTime > 7000) OriginalCastTime = 7000;
if (OriginalCastTime < 1500) OriginalCastTime = 1500;
if (OriginalCastTime > 7000)
OriginalCastTime = 7000;
if (OriginalCastTime < 1500)
OriginalCastTime = 1500;
// Portion to Over Time
float PtOT = (overTime / 15000.0f) / ((overTime / 15000.0f) + (OriginalCastTime / 3500.0f));
@@ -2068,7 +2077,7 @@ namespace Game.Entities
InterruptSpell(CurrentSpellTypes.AutoRepeat);
m_AutoRepeatFirstCast = true;
}
if (pSpell.m_spellInfo.CalcCastTime(GetLevel()) > 0)
if (pSpell.m_spellInfo.CalcCastTime() > 0)
AddUnitState(UnitState.Casting);
break;
@@ -2152,26 +2161,19 @@ namespace Game.Entities
public uint SpellCriticalDamageBonus(SpellInfo spellProto, uint damage, Unit victim = null)
{
// Calculate critical bonus
int crit_bonus = (int)damage;
int crit_bonus = (int)damage * 2;
float crit_mod = 0.0f;
switch (spellProto.DmgClass)
{
case SpellDmgClass.Melee: // for melee based spells is 100%
case SpellDmgClass.Ranged:
// @todo write here full calculation for melee/ranged spells
crit_bonus += (int)damage;
break;
default:
crit_bonus += (int)damage / 2; // for spells is 50%
break;
}
crit_mod += (GetTotalAuraMultiplierByMiscMask(AuraType.ModCritDamageBonus, (uint)spellProto.GetSchoolMask()) - 1.0f) * 100;
if (crit_bonus != 0)
MathFunctions.AddPct(ref crit_bonus, (int)crit_mod);
MathFunctions.AddPct(ref crit_bonus, victim.GetTotalAuraModifier(AuraType.ModCriticalDamageTakenFromCaster, aurEff =>
{
return aurEff.GetCasterGUID() == GetGUID();
}));
crit_bonus -= (int)damage;
if (damage > crit_bonus)
+64 -377
View File
@@ -1207,7 +1207,7 @@ namespace Game.Entities
if (artifactAura != null)
{
Item artifact = ToPlayer().GetItemByGuid(artifactAura.GetCastItemGUID());
if (artifact)
if (artifact != null)
{
ArtifactAppearanceRecord artifactAppearance = CliDB.ArtifactAppearanceStorage.LookupByKey(artifact.GetModifier(ItemModifier.ArtifactAppearanceId));
if (artifactAppearance != null)
@@ -1216,398 +1216,84 @@ namespace Game.Entities
}
}
byte hairColor = thisPlayer.m_playerData.HairColorID;
byte skinColor = thisPlayer.m_playerData.SkinID;
ShapeshiftFormModelData formModelData = Global.DB2Mgr.GetShapeshiftFormModelData(GetRace(), thisPlayer.GetNativeSex(), form);
if (formModelData != null)
{
bool useRandom = false;
switch (form)
{
case ShapeShiftForm.CatForm:
{
if (GetRace() == Race.NightElf)
{
if (HasAura(210333)) // Glyph of the Feral Chameleon
hairColor = (byte)RandomHelper.URand(0, 10);
switch (hairColor)
{
case 7: // Violet
case 8:
return 29405;
case 3: // Light Blue
return 29406;
case 0: // Green
case 1: // Light Green
case 2: // Dark Green
return 29407;
case 4: // White
return 29408;
default: // original - Dark Blue
return 892;
}
}
else if (GetRace() == Race.Troll)
{
if (HasAura(210333)) // Glyph of the Feral Chameleon
hairColor = (byte)RandomHelper.URand(0, 12);
switch (hairColor)
{
case 0: // Red
case 1:
return 33668;
case 2: // Yellow
case 3:
return 33667;
case 4: // Blue
case 5:
case 6:
return 33666;
case 7: // Purple
case 10:
return 33665;
default: // original - white
return 33669;
}
}
else if (GetRace() == Race.Worgen)
{
if (HasAura(210333)) // Glyph of the Feral Chameleon
skinColor = (byte)RandomHelper.URand(0, 9);
// Male
if (GetGender() == Gender.Male)
{
switch (skinColor)
{
case 1: // Brown
return 33662;
case 2: // Black
case 7:
return 33661;
case 4: // yellow
return 33664;
case 3: // White
case 5:
return 33663;
default: // original - Gray
return 33660;
}
}
// Female
else
{
switch (skinColor)
{
case 5: // Brown
case 6:
return 33662;
case 7: // Black
case 8:
return 33661;
case 3: // yellow
case 4:
return 33664;
case 2: // White
return 33663;
default: // original - Gray
return 33660;
}
}
}
else if (GetRace() == Race.Tauren)
{
if (HasAura(210333)) // Glyph of the Feral Chameleon
skinColor = (byte)RandomHelper.URand(0, 20);
if (GetGender() == Gender.Male)
{
switch (skinColor)
{
case 12: // White
case 13:
case 14:
case 18: // Completly White
return 29409;
case 9: // Light Brown
case 10:
case 11:
return 29410;
case 6: // Brown
case 7:
case 8:
return 29411;
case 0: // Dark
case 1:
case 2:
case 3: // Dark Grey
case 4:
case 5:
return 29412;
default: // original - Grey
return 8571;
}
}
// Female
else
{
switch (skinColor)
{
case 10: // White
return 29409;
case 6: // Light Brown
case 7:
return 29410;
case 4: // Brown
case 5:
return 29411;
case 0: // Dark
case 1:
case 2:
case 3:
return 29412;
default: // original - Grey
return 8571;
}
}
}
else if (Player.TeamForRace(GetRace()) == Team.Alliance)
return 892;
else
return 8571;
}
case ShapeShiftForm.BearForm:
{
if (GetRace() == Race.NightElf)
{
if (HasAura(210333)) // Glyph of the Feral Chameleon
hairColor = (byte)RandomHelper.URand(0, 8);
switch (hairColor)
{
case 0: // Green
case 1: // Light Green
case 2: // Dark Green
return 29413; // 29415?
case 6: // Dark Blue
return 29414;
case 4: // White
return 29416;
case 3: // Light Blue
return 29417;
default: // original - Violet
return 29415;
}
}
else if (GetRace() == Race.Troll)
{
if (HasAura(210333)) // Glyph of the Feral Chameleon
hairColor = (byte)RandomHelper.URand(0, 14);
switch (hairColor)
{
case 0: // Red
case 1:
return 33657;
case 2: // Yellow
case 3:
return 33659;
case 7: // Purple
case 10:
return 33656;
case 8: // White
case 9:
case 11:
case 12:
return 33658;
default: // original - Blue
return 33655;
}
}
else if (GetRace() == Race.Worgen)
{
if (HasAura(210333)) // Glyph of the Feral Chameleon
skinColor = (byte)RandomHelper.URand(0, 8);
// Male
if (GetGender() == Gender.Male)
{
switch (skinColor)
{
case 1: // Brown
return 33652;
case 2: // Black
case 7:
return 33651;
case 4: // Yellow
return 33653;
case 3: // White
case 5:
return 33654;
default: // original - Gray
return 33650;
}
}
// Female
else
{
switch (skinColor)
{
case 5: // Brown
case 6:
return 33652;
case 7: // Black
case 8:
return 33651;
case 3: // yellow
case 4:
return 33654;
case 2: // White
return 33653;
default: // original - Gray
return 33650;
}
}
}
else if (GetRace() == Race.Tauren)
{
if (HasAura(210333)) // Glyph of the Feral Chameleon
skinColor = (byte)RandomHelper.URand(0, 20);
if (GetGender() == Gender.Male)
{
switch (skinColor)
{
case 0: // Dark (Black)
case 1:
case 2:
return 29418;
case 3: // White
case 4:
case 5:
case 12:
case 13:
case 14:
return 29419;
case 9: // Light Brown/Grey
case 10:
case 11:
case 15:
case 16:
case 17:
return 29420;
case 18: // Completly White
return 29421;
default: // original - Brown
return 2289;
}
}
// Female
else
{
switch (skinColor)
{
case 0: // Dark (Black)
case 1:
return 29418;
case 2: // White
case 3:
return 29419;
case 6: // Light Brown/Grey
case 7:
case 8:
case 9:
return 29420;
case 10: // Completly White
return 29421;
default: // original - Brown
return 2289;
}
}
}
else if (Player.TeamForRace(GetRace()) == Team.Alliance)
return 29415;
else
return 2289;
}
case ShapeShiftForm.FlightForm:
if (Player.TeamForRace(GetRace()) == Team.Alliance)
return 20857;
return 20872;
case ShapeShiftForm.FlightFormEpic:
if (HasAura(219062)) // Glyph of the Sentinel
{
switch (GetRace())
{
case Race.NightElf: // Blue
return 64328;
case Race.Tauren: // Brown
return 64329;
case Race.Worgen: // Purple
return 64330;
case Race.Troll: // White
return 64331;
default:
break;
}
}
if (Player.TeamForRace(GetRace()) == Team.Alliance)
return (GetRace() == Race.Worgen ? 37729 : 21243u);
if (GetRace() == Race.Troll)
return 37730;
return 21244;
case ShapeShiftForm.MoonkinForm:
switch (GetRace())
{
case Race.NightElf:
return 15374;
case Race.Tauren:
return 15375;
case Race.Worgen:
return 37173;
case Race.Troll:
return 37174;
default:
break;
}
break;
case ShapeShiftForm.AquaticForm:
if (HasAura(114333)) // Glyph of the Orca
return 4591;
return 2428;
useRandom = HasAura(210333);
break; // Glyph of the Feral Chameleon
case ShapeShiftForm.TravelForm:
{
if (HasAura(131113)) // Glyph of the Cheetah
return 1043;
if (HasAura(224122)) // Glyph of the Doe
return 70450;
switch (GetRace())
{
case Race.NightElf:
case Race.Worgen:
return 40816;
case Race.Troll:
case Race.Tauren:
return 45339;
useRandom = HasAura(344336);
break; // Glyph of the Swift Chameleon
case ShapeShiftForm.AquaticForm:
useRandom = HasAura(344338);
break; // Glyph of the Aquatic Chameleon
case ShapeShiftForm.BearForm:
useRandom = HasAura(107059);
break; // Glyph of the Ursol Chameleon
case ShapeShiftForm.FlightForm:
useRandom = HasAura(344342);
break; // Glyph of the Aerial Chameleon
default:
break;
}
break;
if (useRandom)
{
List<uint> displayIds = new List<uint>();
for (var i = 0; i < formModelData.Choices.Count; ++i)
{
ChrCustomizationDisplayInfoRecord displayInfo = formModelData.Displays[i];
if (displayInfo != null)
{
ChrCustomizationReqRecord choiceReq = CliDB.ChrCustomizationReqStorage.LookupByKey(formModelData.Choices[i].ChrCustomizationReqID);
if (choiceReq == null || thisPlayer.GetSession().MeetsChrCustomizationReq(choiceReq, GetClass(), false, thisPlayer.m_playerData.Customizations))
displayIds.Add(displayInfo.DisplayID);
}
}
if (!displayIds.Empty())
return displayIds.SelectRandom();
}
else
{
uint formChoice = thisPlayer.GetCustomizationChoice(formModelData.OptionID);
if (formChoice != 0)
{
var choiceIndex = formModelData.Choices.FindIndex(choice =>
{
return choice.Id == formChoice;
});
if (choiceIndex != -1)
{
ChrCustomizationDisplayInfoRecord displayInfo = formModelData.Displays[choiceIndex];
if (displayInfo != null)
return displayInfo.DisplayID;
}
}
}
}
switch (form)
{
case ShapeShiftForm.GhostWolf:
if (HasAura(58135)) // Glyph of Spectral Wolf
return 60247;
break;
default:
break;
}
}
uint modelid = 0;
SpellShapeshiftFormRecord formEntry = CliDB.SpellShapeshiftFormStorage.LookupByKey((uint)form);
SpellShapeshiftFormRecord formEntry = CliDB.SpellShapeshiftFormStorage.LookupByKey(form);
if (formEntry != null && formEntry.CreatureDisplayID[0] != 0)
{
// Take the alliance modelid as default
if (!IsTypeId(TypeId.Player))
if (GetTypeId() != TypeId.Player)
return formEntry.CreatureDisplayID[0];
else
{
@@ -2673,11 +2359,12 @@ namespace Game.Entities
{
SetUpdateFieldValue(ref m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.ChannelData)._value.SpellID, channelSpellId);
}
public uint GetChannelSpellXSpellVisualId() { return ((UnitChannel)m_unitData.ChannelData).SpellXSpellVisualID; }
public void SetChannelSpellXSpellVisualId(SpellCastVisual channelVisual)
public uint GetChannelSpellXSpellVisualId() { return m_unitData.ChannelData.GetValue().SpellVisual.SpellXSpellVisualID; }
public uint GetChannelScriptVisualId() { return m_unitData.ChannelData.GetValue().SpellVisual.ScriptVisualID; }
public void SetChannelVisual(SpellCastVisualField channelVisual)
{
UnitChannel unitChannel = m_unitData.ModifyValue(m_unitData.ChannelData);
SetUpdateFieldValue(ref unitChannel.SpellXSpellVisualID, channelVisual.SpellXSpellVisualID);
SetUpdateFieldValue(ref unitChannel.SpellVisual, channelVisual);
}
public void AddChannelObject(ObjectGuid guid) { AddDynamicUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.ChannelObjects), guid); }
public void SetChannelObject(int slot, ObjectGuid guid) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.ChannelObjects, slot), guid); }
+101 -65
View File
@@ -4589,25 +4589,6 @@ namespace Game
itemTemplate.Effects.Add(effectEntry);
}
// Check if item templates for DBC referenced character start outfit are present
List<uint> notFoundOutfit = new List<uint>();
foreach (var entry in CliDB.CharStartOutfitStorage.Values)
{
for (int j = 0; j < ItemConst.MaxOutfitItems; ++j)
{
if (entry.ItemID[j] <= 0)
continue;
uint item_id = (uint)entry.ItemID[j];
if (GetItemTemplate(item_id) == null)
notFoundOutfit.Add(item_id);
}
}
foreach (var id in notFoundOutfit)
Log.outError(LogFilter.Sql, "Item (Entry: {0}) item does not exist but is referenced in `CharStartOutfit.dbc`", id);
Log.outInfo(LogFilter.ServerLoading, "Loaded {0} item templates in {1} ms", sparseCount, Time.GetMSTimeDiffToNow(oldMSTime));
}
@@ -5510,28 +5491,42 @@ namespace Game
float positionZ = result.Read<float>(6);
float orientation = result.Read<float>(7);
if (currentrace >= (int)Race.Max)
if (CliDB.ChrRacesStorage.ContainsKey(currentrace))
{
Log.outError(LogFilter.Sql, "Wrong race {0} in `playercreateinfo` table, ignoring.", currentrace);
Log.outError(LogFilter.Sql, $"Wrong race {currentrace} in `playercreateinfo` table, ignoring.");
continue;
}
var rEntry = CliDB.ChrRacesStorage.LookupByKey(currentrace);
if (rEntry == null)
if (CliDB.ChrClassesStorage.ContainsKey(currentclass))
{
Log.outError(LogFilter.Sql, "Wrong race {0} in `playercreateinfo` table, ignoring.", currentrace);
Log.outError(LogFilter.Sql, $"Wrong class {currentclass} in `playercreateinfo` table, ignoring.");
continue;
}
if (currentclass >= (int)Class.Max)
// accept DB data only for valid position (and non instanceable)
if (!GridDefines.IsValidMapCoord(mapId, positionX, positionY, positionZ, orientation))
{
Log.outError(LogFilter.Sql, "Wrong class {0} in `playercreateinfo` table, ignoring.", currentclass);
Log.outError(LogFilter.Sql, $"Wrong home position for class {currentclass} race {currentrace} pair in `playercreateinfo` table, ignoring.");
continue;
}
if (CliDB.ChrClassesStorage.LookupByKey(currentclass) == null)
if (CliDB.MapStorage.LookupByKey(mapId).Instanceable())
{
Log.outError(LogFilter.Sql, "Wrong class {0} in `playercreateinfo` table, ignoring.", currentclass);
Log.outError(LogFilter.Sql, $"Home position in instanceable map for class {currentclass} race {currentrace} pair in `playercreateinfo` table, ignoring.");
continue;
}
ChrModelRecord maleModel = Global.DB2Mgr.GetChrModel((Race)currentrace, Gender.Male);
if (maleModel == null)
{
Log.outError(LogFilter.Sql, $"Missing male model for race {currentrace}, ignoring.");
continue;
}
ChrModelRecord femaleModel = Global.DB2Mgr.GetChrModel((Race)currentrace, Gender.Female);
if (femaleModel == null)
{
Log.outError(LogFilter.Sql, $"Missing female model for race {currentrace}, ignoring.");
continue;
}
@@ -5543,8 +5538,8 @@ namespace Game
pInfo.PositionZ = positionZ;
pInfo.Orientation = orientation;
pInfo.DisplayId_m = rEntry.MaleDisplayId;
pInfo.DisplayId_f = rEntry.FemaleDisplayId;
pInfo.DisplayId_m = maleModel.DisplayID;
pInfo.DisplayId_f = femaleModel.DisplayID;
_playerInfo[currentrace][currentclass] = pInfo;
@@ -5556,6 +5551,63 @@ namespace Game
time = Time.GetMSTime();
// Load playercreate items
Log.outInfo(LogFilter.ServerLoading, "Loading Player Create Items Data...");
{
MultiMap<uint, ItemTemplate> itemsByCharacterLoadout = new MultiMap<uint, ItemTemplate>();
foreach (CharacterLoadoutItemRecord characterLoadoutItem in CliDB.CharacterLoadoutItemStorage.Values)
{
ItemTemplate itemTemplate = GetItemTemplate(characterLoadoutItem.ItemID);
if (itemTemplate != null)
itemsByCharacterLoadout.Add(characterLoadoutItem.CharacterLoadoutID, itemTemplate);
}
foreach (CharacterLoadoutRecord characterLoadout in CliDB.CharacterLoadoutStorage.Values)
{
if (!characterLoadout.IsForNewCharacter())
continue;
var items = itemsByCharacterLoadout.LookupByKey(characterLoadout.Id);
if (items.Empty())
continue;
for (uint raceIndex = (int)Race.Human; raceIndex < (int)Race.Max; ++raceIndex)
{
if (!characterLoadout.RaceMask.HasAnyFlag(raceIndex))
continue;
PlayerInfo playerInfo = _playerInfo[raceIndex][characterLoadout.ChrClassID];
if (playerInfo != null)
{
foreach (ItemTemplate itemTemplate in items)
{
// BuyCount by default
uint count = itemTemplate.GetBuyCount();
// special amount for food/drink
if (itemTemplate.GetClass() == ItemClass.Consumable && (ItemSubClassConsumable)itemTemplate.GetSubClass() == ItemSubClassConsumable.FoodDrink)
{
if (!itemTemplate.Effects.Empty())
{
switch ((SpellCategories)itemTemplate.Effects[0].SpellCategoryID)
{
case SpellCategories.Food: // food
count = characterLoadout.ChrClassID == (int)Class.Deathknight ? 10 : 4u;
break;
case SpellCategories.Drink: // drink
count = 2;
break;
}
}
if (itemTemplate.GetMaxStackSize() < count)
count = itemTemplate.GetMaxStackSize();
}
playerInfo.item.Add(new PlayerCreateInfoItem(itemTemplate.GetId(), count));
}
}
}
}
}
Log.outInfo(LogFilter.ServerLoading, "Loading Player Create Items Override Data...");
{
// 0 1 2 3
SQLResult result = DB.World.Query("SELECT race, class, itemid, amount FROM playercreateinfo_item");
@@ -5986,38 +6038,20 @@ namespace Game
Log.outInfo(LogFilter.ServerLoading, "Loaded {0} xp for level definition(s) from database in {1} ms", count, Time.GetMSTimeDiffToNow(time));
}
}
void PlayerCreateInfoAddItemHelper(uint race, uint _class, uint itemId, int count)
void PlayerCreateInfoAddItemHelper(uint race, uint class_, uint itemId, int count)
{
if (_playerInfo[race][_class] == null)
if (_playerInfo[race][class_] == null)
return;
if (count > 0)
_playerInfo[race][_class].item.Add(new PlayerCreateInfoItem(itemId, (uint)count));
_playerInfo[race][class_].item.Add(new PlayerCreateInfoItem(itemId, (uint)count));
else
{
if (count < -1)
Log.outError(LogFilter.Sql, "Invalid count {0} specified on item {1} be removed from original player create info (use -1)!", count, itemId);
for (byte gender = 0; gender < (int)Gender.None; ++gender)
{
CharStartOutfitRecord entry = Global.DB2Mgr.GetCharStartOutfitEntry(race, _class, gender);
if (entry != null)
{
bool found = false;
for (var x = 0; x < ItemConst.MaxOutfitItems; ++x)
{
if (entry.ItemID[x] > 0 && entry.ItemID[x] == itemId)
{
found = true;
entry.ItemID[x] = 0;
break;
}
}
if (!found)
Log.outError(LogFilter.Sql, "Item {0} specified to be removed from original create info not found in dbc!", itemId);
}
}
var items = _playerInfo[race][class_].item;
items.RemoveAll(item => { return item.item_id == itemId; });
}
}
@@ -9416,9 +9450,9 @@ namespace Game
int responseId = rewardItems.Read<int>(1);
uint itemId = rewardItems.Read<uint>(2);
StringArray bonusListIDsTok = new StringArray(rewardItems.Read<string>(3), ' ');
List<int> bonusListIds = new List<int>();
List<uint> bonusListIds = new List<uint>();
foreach (string token in bonusListIDsTok)
bonusListIds.Add(int.Parse(token));
bonusListIds.Add(uint.Parse(token));
int quantity = rewardItems.Read<int>(4);
@@ -9448,7 +9482,7 @@ namespace Game
continue;
}
response.Reward.ItemChoices.Add(itemId, bonusListIds, quantity);
response.Reward.Value.ItemChoices.Add(new PlayerChoiceResponseRewardItem(itemId, bonusListIds, quantity));
itemChoiceRewardCount++;
} while (rewards.NextRow());
@@ -9482,7 +9516,7 @@ namespace Game
mawPower.RarityColor = mawPowersResult.Read<uint>(4);
mawPower.SpellID = mawPowersResult.Read<int>(5);
mawPower.MaxStacks = mawPowersResult.Read<int>(6);
response.MawPower.Add(mawPower);
response.MawPower.Set(mawPower);
++mawPowersCount;
@@ -9757,21 +9791,23 @@ namespace Game
switch (expansion)
{
case Expansion.Classic:
return 60;
return 30;
case Expansion.BurningCrusade:
return 70;
return 30;
case Expansion.WrathOfTheLichKing:
return 80;
return 30;
case Expansion.Cataclysm:
return 85;
return 35;
case Expansion.MistsOfPandaria:
return 90;
return 35;
case Expansion.WarlordsOfDraenor:
return 100;
return 40;
case Expansion.Legion:
return 110;
return 45;
case Expansion.BattleForAzeroth:
return 120;
return 50;
case Expansion.ShadowLands:
return 60;
default:
break;
}
+1 -1
View File
@@ -2505,7 +2505,7 @@ namespace Game.Guilds
m_name = player.GetName();
m_level = (byte)player.GetLevel();
m_class = player.GetClass();
_gender = (Gender)(byte)player.m_playerData.NativeSex;
_gender = player.GetNativeSex();
m_zoneId = player.GetZoneId();
m_accountId = player.GetSession().GetAccountId();
m_achievementPoints = player.GetAchievementPoints();
+2 -2
View File
@@ -108,7 +108,7 @@ namespace Game
Global.CalendarMgr.SendCalendarCommandResult(GetPlayer().GetGUID(), CalendarError.EventInvalid);
}
[WorldPacketHandler(ClientOpcodes.CalendarCommunityInviteRequest)]
[WorldPacketHandler(ClientOpcodes.CalendarCommunityInvite)]
void HandleCalendarCommunityInvite(CalendarCommunityInviteRequest calendarCommunityInvite)
{
Guild guild = Global.GuildMgr.GetGuildById(GetPlayer().GetGuildId());
@@ -423,7 +423,7 @@ namespace Game
Global.CalendarMgr.SendCalendarCommandResult(guid, CalendarError.EventInvalid);
}
[WorldPacketHandler(ClientOpcodes.CalendarEventModeratorStatus)]
[WorldPacketHandler(ClientOpcodes.CalendarModeratorStatus)]
void HandleCalendarModeratorStatus(CalendarModeratorStatusQuery calendarModeratorStatus)
{
ObjectGuid guid = GetPlayer().GetGUID();
+192 -123
View File
@@ -28,6 +28,7 @@ using Game.Networking;
using Game.Networking.Packets;
using System;
using System.Collections.Generic;
using System.Linq;
namespace Game
{
@@ -41,43 +42,62 @@ namespace Game
DB.Characters.Execute(stmt);
// get all the data necessary for loading all characters (along with their pets) on the account
if (WorldConfig.GetBoolValue(WorldCfg.DeclinedNamesUsed))
stmt = DB.Characters.GetPreparedStatement(CharStatements.SEL_ENUM_DECLINED_NAME);
else
stmt = DB.Characters.GetPreparedStatement(CharStatements.SEL_ENUM);
stmt.AddValue(0, PetSaveMode.AsCurrent);
stmt.AddValue(1, GetAccountId());
_queryProcessor.AddCallback(DB.Characters.AsyncQuery(stmt).WithCallback(HandleCharEnumCallback));
EnumCharactersQueryHolder holder = new EnumCharactersQueryHolder();
if (!holder.Initialize(GetAccountId(), WorldConfig.GetBoolValue(WorldCfg.DeclinedNamesUsed), false))
{
HandleCharEnum(holder);
return;
}
void HandleCharEnumCallback(SQLResult result)
_charEnumCallback = DB.Characters.DelayQueryHolder(holder);
}
void HandleCharEnum(EnumCharactersQueryHolder holder)
{
EnumCharactersResult charResult = new EnumCharactersResult();
charResult.Success = true;
charResult.IsDeletedCharacters = false;
charResult.IsDeletedCharacters = holder.IsDeletedCharacters();
charResult.DisabledClassesMask.Set(WorldConfig.GetUIntValue(WorldCfg.CharacterCreatingDisabledClassmask));
if (!charResult.IsDeletedCharacters)
_legitCharacters.Clear();
MultiMap<ulong, ChrCustomizationChoice> customizations = new MultiMap<ulong, ChrCustomizationChoice>();
SQLResult customizationsResult = holder.GetResult(EnumCharacterQueryLoad.Customizations);
if (!customizationsResult.IsEmpty())
{
do
{
var customizationsForCharacter = customizations[customizationsResult.Read<ulong>(0)];
ChrCustomizationChoice choice = new ChrCustomizationChoice();
choice.ChrCustomizationOptionID = customizationsResult.Read<uint>(1);
choice.ChrCustomizationChoiceID = customizationsResult.Read<uint>(2);
customizationsForCharacter.Add(choice);
} while (customizationsResult.NextRow());
}
SQLResult result = holder.GetResult(EnumCharacterQueryLoad.Characters);
if (!result.IsEmpty())
{
do
{
EnumCharactersResult.CharacterInfo charInfo = new EnumCharactersResult.CharacterInfo(result.GetFields());
var customizationsForChar = customizations.LookupByKey(charInfo.Guid.GetCounter());
if (!customizationsForChar.Empty())
charInfo.Customizations = (Array<ChrCustomizationChoice>)customizationsForChar.ToList();
Log.outInfo(LogFilter.Network, "Loading Character {0} from account {1}.", charInfo.Guid.ToString(), GetAccountId());
if (!Player.ValidateAppearance((Race)charInfo.RaceId, charInfo.ClassId, (Gender)charInfo.SexId, charInfo.HairStyle, charInfo.HairColor, charInfo.FaceId, charInfo.FacialHair, charInfo.SkinId, charInfo.CustomDisplay))
if (!charResult.IsDeletedCharacters)
{
if (!ValidateAppearance((Race)charInfo.RaceId, charInfo.ClassId, (Gender)charInfo.SexId, charInfo.Customizations))
{
Log.outError(LogFilter.Player, "Player {0} has wrong Appearance values (Hair/Skin/Color), forcing recustomize", charInfo.Guid.ToString());
// Make sure customization always works properly - send all zeroes instead
charInfo.SkinId = 0;
charInfo.FaceId = 0;
charInfo.HairStyle = 0;
charInfo.HairColor = 0;
charInfo.FacialHair = 0;
charInfo.Customizations.Clear();
if (charInfo.Flags2 != CharacterCustomizeFlags.Customize)
{
@@ -92,6 +112,7 @@ namespace Game
// Do not allow locked characters to login
if (!charInfo.Flags.HasAnyFlag(CharacterFlags.CharacterLockedForTransfer | CharacterFlags.LockedByBilling))
_legitCharacters.Add(charInfo.Guid);
}
if (!Global.CharacterCacheStorage.HasCharacterCacheEntry(charInfo.Guid)) // This can happen if characters are inserted into the database manually. Core hasn't loaded name data yet.
Global.CharacterCacheStorage.AddCharacterCacheEntry(charInfo.Guid, GetAccountId(), charInfo.Name, charInfo.SexId, charInfo.RaceId, (byte)charInfo.ClassId, charInfo.ExperienceLevel, false);
@@ -120,16 +141,14 @@ namespace Game
void HandleCharUndeleteEnum(EnumCharacters enumCharacters)
{
// get all the data necessary for loading all undeleted characters (along with their pets) on the account
PreparedStatement stmt;
if (WorldConfig.GetBoolValue(WorldCfg.DeclinedNamesUsed))
stmt = DB.Characters.GetPreparedStatement(CharStatements.SEL_UNDELETE_ENUM_DECLINED_NAME);
else
stmt = DB.Characters.GetPreparedStatement(CharStatements.SEL_UNDELETE_ENUM);
EnumCharactersQueryHolder holder = new EnumCharactersQueryHolder();
if (!holder.Initialize(GetAccountId(), WorldConfig.GetBoolValue(WorldCfg.DeclinedNamesUsed), true))
{
HandleCharEnum(holder);
return;
}
stmt.AddValue(0, (uint)PetSaveMode.AsCurrent);
stmt.AddValue(1, GetAccountId());
_queryProcessor.AddCallback(DB.Characters.AsyncQuery(stmt).WithCallback(HandleCharUndeleteEnumCallback));
_charEnumCallback = DB.Characters.DelayQueryHolder(holder);
}
void HandleCharUndeleteEnumCallback(SQLResult result)
@@ -158,6 +177,94 @@ namespace Game
SendPacket(charEnum);
}
public bool MeetsChrCustomizationReq(ChrCustomizationReqRecord req, Class playerClass, bool checkRequiredDependentChoices, List<ChrCustomizationChoice> selectedChoices)
{
if (!req.GetFlags().HasFlag(ChrCustomizationReqFlag.HasRequirements))
return true;
if (req.ClassMask != 0 && (req.ClassMask & (1 << ((int)playerClass - 1))) == 0)
return false;
if (req.AchievementID != 0 /*&& !HasAchieved(req->AchievementID)*/)
return false;
if (req.ItemModifiedAppearanceID != 0 && !GetCollectionMgr().HasItemAppearance(req.ItemModifiedAppearanceID).PermAppearance)
return false;
if (checkRequiredDependentChoices)
{
var requiredChoices = Global.DB2Mgr.GetRequiredCustomizationChoices(req.Id);
if (!requiredChoices.Empty())
{
foreach (var key in requiredChoices.Keys)
{
bool hasRequiredChoiceForOption = false;
foreach (uint requiredChoice in requiredChoices[key])
{
if (selectedChoices.Any(choice => choice.ChrCustomizationChoiceID == requiredChoice))
{
hasRequiredChoiceForOption = true;
break;
}
}
if (!hasRequiredChoiceForOption)
return false;
}
}
}
return true;
}
public bool ValidateAppearance(Race race, Class playerClass, Gender gender, List<ChrCustomizationChoice> customizations)
{
var options = Global.DB2Mgr.GetCustomiztionOptions(race, gender);
if (options.Empty())
return false;
uint previousOption = 0;
foreach (var playerChoice in customizations)
{
// check uniqueness of options
if (playerChoice.ChrCustomizationOptionID == previousOption)
return false;
previousOption = playerChoice.ChrCustomizationOptionID;
// check if we can use this option
var customizationOptionData = options.Find(option => { return option.Id == playerChoice.ChrCustomizationOptionID; });
// option not found for race/gender combination
if (customizationOptionData == null)
return false;
ChrCustomizationReqRecord req = CliDB.ChrCustomizationReqStorage.LookupByKey(customizationOptionData.ChrCustomizationReqID);
if (req != null)
if (!MeetsChrCustomizationReq(req, playerClass, false, customizations))
return false;
var choicesForOption = Global.DB2Mgr.GetCustomiztionChoices(playerChoice.ChrCustomizationOptionID);
if (choicesForOption.Empty())
return false;
var customizationChoiceData = choicesForOption.Find(choice => { return choice.Id == playerChoice.ChrCustomizationChoiceID; });
// choice not found for option
if (customizationChoiceData == null)
return false;
ChrCustomizationReqRecord reqEntry = CliDB.ChrCustomizationReqStorage.LookupByKey(customizationChoiceData.ChrCustomizationReqID);
if (reqEntry != null)
if (!MeetsChrCustomizationReq(reqEntry, playerClass, true, customizations))
return false;
}
return true;
}
[WorldPacketHandler(ClientOpcodes.CreateCharacter, Status = SessionStatus.Authed)]
void HandleCharCreate(CreateCharacter charCreate)
{
@@ -386,19 +493,6 @@ namespace Game
if (checkDemonHunterReqs)
{
byte acc_class = result1.Read<byte>(2);
if (acc_class == (byte)Class.DemonHunter)
{
if (freeDemonHunterSlots > 0)
--freeDemonHunterSlots;
if (freeDemonHunterSlots == 0)
{
SendCharCreate(ResponseCodes.CharCreateFailed);
return;
}
}
if (!hasDemonHunterReqLevel)
{
byte acc_level = result1.Read<byte>(0);
@@ -457,7 +551,7 @@ namespace Game
{
Log.outInfo(LogFilter.Player, "Account: {0} (IP: {1}) Create Character: {2} {3}", GetAccountId(), GetRemoteAddress(), createInfo.Name, newChar.GetGUID().ToString());
Global.ScriptMgr.OnPlayerCreate(newChar);
Global.CharacterCacheStorage.AddCharacterCacheEntry(newChar.GetGUID(), GetAccountId(), newChar.GetName(), newChar.m_playerData.NativeSex, (byte)newChar.GetRace(), (byte)newChar.GetClass(), (byte)newChar.GetLevel(), false);
Global.CharacterCacheStorage.AddCharacterCacheEntry(newChar.GetGUID(), GetAccountId(), newChar.GetName(), (byte)newChar.GetNativeSex(), (byte)newChar.GetRace(), (byte)newChar.GetClass(), (byte)newChar.GetLevel(), false);
SendCharCreate(ResponseCodes.CharCreateSuccess, newChar.GetGUID());
}
@@ -474,7 +568,7 @@ namespace Game
stmt = DB.Characters.GetPreparedStatement(CharStatements.SEL_CHAR_CREATE_INFO);
stmt.AddValue(0, GetAccountId());
stmt.AddValue(1, (skipCinematics == 1 || createInfo.ClassId == Class.DemonHunter) ? 12 : 1);
stmt.AddValue(1, (skipCinematics == 1 || createInfo.ClassId == Class.DemonHunter) ? 1200 : 1); // 200 (max chars per realm) + 1000 (max deleted chars per realm)
queryCallback.WithCallback(finalizeCharacterCreation).SetNextQuery(DB.Characters.AsyncQuery(stmt));
}));
}
@@ -1227,37 +1321,7 @@ namespace Game
[WorldPacketHandler(ClientOpcodes.AlterAppearance)]
void HandleAlterAppearance(AlterApperance packet)
{
BarberShopStyleRecord bs_hair = CliDB.BarberShopStyleStorage.LookupByKey(packet.NewHairStyle);
if (bs_hair == null || bs_hair.Type != 0 || bs_hair.Race != (byte)GetPlayer().GetRace() || bs_hair.Sex != GetPlayer().m_playerData.NativeSex)
return;
BarberShopStyleRecord bs_facialHair = CliDB.BarberShopStyleStorage.LookupByKey(packet.NewFacialHair);
if (bs_facialHair == null || bs_facialHair.Type != 2 || bs_facialHair.Race != (byte)GetPlayer().GetRace() || bs_facialHair.Sex != GetPlayer().m_playerData.NativeSex)
return;
BarberShopStyleRecord bs_skinColor = CliDB.BarberShopStyleStorage.LookupByKey(packet.NewSkinColor);
if (bs_skinColor != null && (bs_skinColor.Type != 3 || bs_skinColor.Race != (byte)GetPlayer().GetRace() || bs_skinColor.Sex != GetPlayer().m_playerData.NativeSex))
return;
BarberShopStyleRecord bs_face = CliDB.BarberShopStyleStorage.LookupByKey(packet.NewFace);
if (bs_face != null && (bs_face.Type != 4 || bs_face.Race != (byte)GetPlayer().GetRace() || bs_face.Sex != GetPlayer().m_playerData.NativeSex))
return;
Array<BarberShopStyleRecord> customDisplayEntries = new Array<BarberShopStyleRecord>(PlayerConst.CustomDisplaySize);
Array<byte> customDisplay = new Array<byte>(PlayerConst.CustomDisplaySize);
for (int i = 0; i < PlayerConst.CustomDisplaySize; ++i)
{
BarberShopStyleRecord bs_customDisplay = CliDB.BarberShopStyleStorage.LookupByKey(packet.NewCustomDisplay[i]);
if (bs_customDisplay != null && (bs_customDisplay.Type != 5 + i || bs_customDisplay.Race != (byte)_player.GetRace() || bs_customDisplay.Sex != _player.m_playerData.NativeSex))
return;
customDisplayEntries[i] = bs_customDisplay;
customDisplay[i] = (byte)(bs_customDisplay != null ? bs_customDisplay.Data : 0);
}
if (!Player.ValidateAppearance(GetPlayer().GetRace(), GetPlayer().GetClass(), (Gender)(byte)GetPlayer().m_playerData.NativeSex,
bs_hair.Data, (byte)packet.NewHairColor, bs_face != null ? bs_face.Data : GetPlayer().m_playerData.FaceID,
bs_facialHair.Data, bs_skinColor != null ? bs_skinColor.Data : GetPlayer().m_playerData.SkinID, customDisplay))
if (!ValidateAppearance(_player.GetRace(), _player.GetClass(), (Gender)packet.NewSex, packet.Customizations))
return;
GameObject go = GetPlayer().FindNearestGameObjectOfType(GameObjectTypes.BarberChair, 5.0f);
@@ -1273,8 +1337,8 @@ namespace Game
return;
}
uint cost = GetPlayer().GetBarberShopCost(bs_hair, packet.NewHairColor, bs_facialHair, bs_skinColor, bs_face, customDisplayEntries);
if (!GetPlayer().HasEnoughMoney((ulong)cost))
long cost = GetPlayer().GetBarberShopCost(packet.Customizations);
if (!GetPlayer().HasEnoughMoney(cost))
{
SendPacket(new BarberShopResult(BarberShopResult.ResultEnum.NoMoney));
return;
@@ -1283,22 +1347,16 @@ namespace Game
SendPacket(new BarberShopResult(BarberShopResult.ResultEnum.Success));
_player.ModifyMoney(-cost);
_player.UpdateCriteria(CriteriaTypes.GoldSpentAtBarber, cost);
_player.UpdateCriteria(CriteriaTypes.GoldSpentAtBarber, (ulong)cost);
_player.SetHairStyleId(bs_hair.Data);
_player.SetHairColorId((byte)packet.NewHairColor);
_player.SetFacialHairStyleId(bs_facialHair.Data);
if (bs_skinColor != null)
GetPlayer().SetSkinId(bs_skinColor.Data);
if (bs_face != null)
_player.SetFaceId(bs_face.Data);
for (int i = 0; i < PlayerConst.CustomDisplaySize; ++i)
_player.SetCustomDisplayOption(i, customDisplay[i]);
_player.SetNativeSex((Gender)packet.NewSex);
_player.SetCustomizations(packet.Customizations);
_player.UpdateCriteria(CriteriaTypes.VisitBarberShop, 1);
_player.SetStandState(UnitStandStateType.Stand);
Global.CharacterCacheStorage.UpdateCharacterGender(_player.GetGUID(), packet.NewSex);
}
[WorldPacketHandler(ClientOpcodes.CharCustomize, Status = SessionStatus.Authed)]
@@ -1327,13 +1385,12 @@ namespace Game
}
string oldName = result.Read<string>(0);
byte plrRace = result.Read<byte>(1);
byte plrClass = result.Read<byte>(2);
byte plrGender = result.Read<byte>(3);
Race plrRace = (Race)result.Read<byte>(1);
Class plrClass = (Class)result.Read<byte>(2);
Gender plrGender = (Gender)result.Read<byte>(3);
AtLoginFlags atLoginFlags = (AtLoginFlags)result.Read<ushort>(4);
if (!Player.ValidateAppearance((Race)plrRace, (Class)plrClass, (Gender)plrGender, customizeInfo.HairStyleID, customizeInfo.HairColorID, customizeInfo.FaceID,
customizeInfo.FacialHairStyleID, customizeInfo.SkinID, customizeInfo.CustomDisplay))
if (!ValidateAppearance(plrRace, plrClass, plrGender, customizeInfo.Customizations))
{
SendCharCustomize(ResponseCodes.CharCreateError, customizeInfo);
return;
@@ -1392,22 +1449,7 @@ namespace Game
ulong lowGuid = customizeInfo.CharGUID.GetCounter();
// Customize
{
stmt = DB.Characters.GetPreparedStatement(CharStatements.UPD_GENDER_AND_APPEARANCE);
stmt.AddValue(0, customizeInfo.SexID);
stmt.AddValue(1, customizeInfo.SkinID);
stmt.AddValue(2, customizeInfo.FaceID);
stmt.AddValue(3, customizeInfo.HairStyleID);
stmt.AddValue(4, customizeInfo.HairColorID);
stmt.AddValue(5, customizeInfo.FacialHairStyleID);
stmt.AddValue(6, customizeInfo.CustomDisplay[0]);
stmt.AddValue(7, customizeInfo.CustomDisplay[1]);
stmt.AddValue(8, customizeInfo.CustomDisplay[2]);
stmt.AddValue(9, lowGuid);
trans.Append(stmt);
}
Player.SaveCustomizations(trans, lowGuid, customizeInfo.Customizations);
// Name Change and update atLogin flags
{
@@ -1505,7 +1547,7 @@ namespace Game
if (illusion.ItemVisual == 0 || !illusion.Flags.HasAnyFlag(EnchantmentSlotMask.Collectable))
return false;
PlayerConditionRecord condition = CliDB.PlayerConditionStorage.LookupByKey(illusion.TransmogPlayerConditionID);
PlayerConditionRecord condition = CliDB.PlayerConditionStorage.LookupByKey(illusion.TransmogUseConditionID);
if (condition != null)
if (!ConditionManager.IsPlayerMeetingCondition(_player, condition))
return false;
@@ -1735,21 +1777,7 @@ namespace Game
}
// Customize
{
stmt = DB.Characters.GetPreparedStatement(CharStatements.UPD_GENDER_AND_APPEARANCE);
stmt.AddValue(0, factionChangeInfo.SexID);
stmt.AddValue(1, factionChangeInfo.SkinID);
stmt.AddValue(2, factionChangeInfo.FaceID);
stmt.AddValue(3, factionChangeInfo.HairStyleID);
stmt.AddValue(4, factionChangeInfo.HairColorID);
stmt.AddValue(5, factionChangeInfo.FacialHairStyleID);
stmt.AddValue(6, factionChangeInfo.CustomDisplay[0]);
stmt.AddValue(7, factionChangeInfo.CustomDisplay[1]);
stmt.AddValue(8, factionChangeInfo.CustomDisplay[2]);
stmt.AddValue(9, lowGuid);
trans.Append(stmt);
}
Player.SaveCustomizations(trans, lowGuid, factionChangeInfo.Customizations);
// Race Change
{
@@ -2511,6 +2539,10 @@ namespace Game
stmt.AddValue(0, lowGuid);
SetQuery(PlayerLoginQueryLoad.From, stmt);
stmt = DB.Characters.GetPreparedStatement(CharStatements.SEL_CHARACTER_CUSTOMIZATIONS);
stmt.AddValue(0, lowGuid);
SetQuery(PlayerLoginQueryLoad.Customizations, stmt);
stmt = DB.Characters.GetPreparedStatement(CharStatements.SEL_GROUP_MEMBER);
stmt.AddValue(0, lowGuid);
SetQuery(PlayerLoginQueryLoad.Group, stmt);
@@ -2736,10 +2768,41 @@ namespace Game
ObjectGuid m_guid;
}
class EnumCharactersQueryHolder : SQLQueryHolder<EnumCharacterQueryLoad>
{
public bool Initialize(uint accountId, bool withDeclinedNames, bool isDeletedCharacters)
{
_isDeletedCharacters = isDeletedCharacters;
CharStatements[][] statements =
{
new [] { CharStatements.SEL_ENUM, CharStatements.SEL_ENUM_DECLINED_NAME, CharStatements.SEL_ENUM_CUSTOMIZATIONS },
new [] { CharStatements.SEL_UNDELETE_ENUM, CharStatements.SEL_UNDELETE_ENUM_DECLINED_NAME, CharStatements.SEL_UNDELETE_ENUM_CUSTOMIZATIONS }
};
bool result = true;
PreparedStatement stmt = DB.Characters.GetPreparedStatement(statements[isDeletedCharacters ? 1 : 0][withDeclinedNames ? 1 : 0]);
stmt.AddValue(0, (byte)PetSaveMode.AsCurrent);
stmt.AddValue(1, accountId);
SetQuery(EnumCharacterQueryLoad.Characters, stmt);
stmt = DB.Characters.GetPreparedStatement(statements[isDeletedCharacters ? 1 : 0][2]);
stmt.AddValue(0, accountId);
SetQuery(EnumCharacterQueryLoad.Customizations, stmt);
return result;
}
public bool IsDeletedCharacters() { return _isDeletedCharacters; }
bool _isDeletedCharacters = false;
}
// used at player loading query list preparing, and later result selection
public enum PlayerLoginQueryLoad
{
From,
Customizations,
Group,
BoundInstances,
Auras,
@@ -2795,4 +2858,10 @@ namespace Game
GarrisonFollowerAbilities,
Max
}
enum EnumCharacterQueryLoad
{
Characters,
Customizations
}
}
+1
View File
@@ -451,6 +451,7 @@ namespace Game
}
_player.UpdateCriteria(CriteriaTypes.MoneyFromVendors, money);
_player.UpdateCriteria(CriteriaTypes.SoldItemToVendor, 1);
if (packet.Amount < pItem.GetCount()) // need split items
{
+2 -1
View File
@@ -144,7 +144,8 @@ namespace Game
{
// Get Random dungeons that can be done at a certain level and expansion
uint level = GetPlayer().GetLevel();
List<uint> randomDungeons = Global.LFGMgr.GetRandomAndSeasonalDungeons(level, (uint)GetExpansion());
uint contentTuningReplacementConditionMask = GetPlayer().m_playerData.CtrOptions.GetValue().ContentTuningConditionMask;
var randomDungeons = Global.LFGMgr.GetRandomAndSeasonalDungeons(level, (uint)GetExpansion(), contentTuningReplacementConditionMask);
LfgPlayerInfo lfgPlayerInfo = new LfgPlayerInfo();
+2 -2
View File
@@ -250,7 +250,7 @@ namespace Game
ItemTemplate rewardProto = Global.ObjectMgr.GetItemTemplate(packet.Choice.Item.ItemID);
if (rewardProto == null)
{
Log.outError(LogFilter.Network, "Error in CMSG_QUESTGIVER_CHOOSE_REWARD: player {0} ({1}) tried to get invalid reward item (Item Entry: {2}) for quest {3} (possible packet-hacking detected)", GetPlayer().GetName(), GetPlayer().GetGUID().ToString(), packet.ItemChoiceID, packet.QuestID);
Log.outError(LogFilter.Network, "Error in CMSG_QUESTGIVER_CHOOSE_REWARD: player {0} ({1}) tried to get invalid reward item (Item Entry: {2}) for quest {3} (possible packet-hacking detected)", GetPlayer().GetName(), GetPlayer().GetGUID().ToString(), packet.Choice.Item.ItemID, packet.QuestID);
return;
}
@@ -301,7 +301,7 @@ namespace Game
if (!itemValid)
{
Log.outError(LogFilter.Network, "Error in CMSG_QUESTGIVER_CHOOSE_REWARD: player {0} ({1}) tried to get reward item (Item Entry: {2}) wich is not a reward for quest {3} (possible packet-hacking detected)", GetPlayer().GetName(), GetPlayer().GetGUID().ToString(), packet.ItemChoiceID, packet.QuestID);
Log.outError(LogFilter.Network, "Error in CMSG_QUESTGIVER_CHOOSE_REWARD: player {0} ({1}) tried to get reward item (Item Entry: {2}) wich is not a reward for quest {3} (possible packet-hacking detected)", GetPlayer().GetName(), GetPlayer().GetGUID().ToString(), packet.Choice.Item.ItemID, packet.QuestID);
return;
}
break;
+2 -2
View File
@@ -529,10 +529,10 @@ namespace Game
mirrorImageComponentedData.Gender = (byte)creator.GetGender();
mirrorImageComponentedData.ClassID = (byte)creator.GetClass();
Guild guild = player.GetGuild();
foreach (var customization in player.m_playerData.Customizations)
mirrorImageComponentedData.Customizations.Add(new ChrCustomizationChoice(customization.ChrCustomizationOptionID, customization.ChrCustomizationChoiceID));
Guild guild = player.GetGuild();
mirrorImageComponentedData.GuildGUID = (guild ? guild.GetGUID() : ObjectGuid.Empty);
byte[] itemSlots =
@@ -149,12 +149,12 @@ namespace Game
return;
}
PlayerConditionRecord condition = CliDB.PlayerConditionStorage.LookupByKey(illusion.TransmogPlayerConditionID);
PlayerConditionRecord condition = CliDB.PlayerConditionStorage.LookupByKey(illusion.TransmogUseConditionID);
if (condition != null)
{
if (!ConditionManager.IsPlayerMeetingCondition(player, condition))
{
Log.outDebug(LogFilter.Network, "WORLD: HandleTransmogrifyItems - {0}, Name: {1} tried to transmogrify illusion using not collected enchant ({2}).", player.GetGUID().ToString(), player.GetName(), transmogItem.SpellItemEnchantmentID);
Log.outDebug(LogFilter.Network, "WORLD: HandleTransmogrifyItems - {0}, Name: {1} tried to transmogrify illusion using not allowed enchant ({2}).", player.GetGUID().ToString(), player.GetName(), transmogItem.SpellItemEnchantmentID);
return;
}
}
+31 -18
View File
@@ -3290,9 +3290,20 @@ namespace Game.Maps
public void LoadCorpseData()
{
MultiMap<ulong, uint> phases = new MultiMap<ulong, uint>();
PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.SEL_CORPSES);
stmt.AddValue(0, GetId());
stmt.AddValue(1, GetInstanceId());
PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.SEL_CORPSE_PHASES);
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
// SELECT posX, posY, posZ, orientation, mapId, displayId, itemCache, bytes1, bytes2, flags, dynFlags, time, corpseType, instanceId, guid FROM corpse WHERE mapId = ? AND instanceId = ?
SQLResult result = DB.Characters.Query(stmt);
if (result.IsEmpty())
return;
MultiMap<ulong, uint> phases = new MultiMap<ulong, uint>();
MultiMap<ulong, ChrCustomizationChoice> customizations = new MultiMap<ulong, ChrCustomizationChoice>();
stmt = DB.Characters.GetPreparedStatement(CharStatements.SEL_CORPSE_PHASES);
stmt.AddValue(0, GetId());
stmt.AddValue(1, GetInstanceId());
@@ -3311,15 +3322,22 @@ namespace Game.Maps
} while (phaseResult.NextRow());
}
stmt = DB.Characters.GetPreparedStatement(CharStatements.SEL_CORPSES);
stmt.AddValue(0, GetId());
stmt.AddValue(1, GetInstanceId());
// 0 1 2
// SELECT cc.ownerGuid, cc.chrCustomizationOptionID, cc.chrCustomizationChoiceID FROM corpse_customizations cc LEFT JOIN corpse c ON cc.ownerGuid = c.guid WHERE c.mapId = ? AND c.instanceId = ?
SQLResult customizationResult = DB.Characters.Query(stmt);
if (!customizationResult.IsEmpty())
{
do
{
ulong guid = customizationResult.Read<ulong>(0);
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
// SELECT posX, posY, posZ, orientation, mapId, displayId, itemCache, bytes1, bytes2, flags, dynFlags, time, corpseType, instanceId, guid FROM corpse WHERE mapId = ? AND instanceId = ?
SQLResult result = DB.Characters.Query(stmt);
if (result.IsEmpty())
return;
ChrCustomizationChoice choice = new ChrCustomizationChoice();
choice.ChrCustomizationOptionID = customizationResult.Read<uint>(1);
choice.ChrCustomizationChoiceID = customizationResult.Read<uint>(2);
customizations.Add(guid, choice);
} while (customizationResult.NextRow());
}
do
{
@@ -3338,6 +3356,8 @@ namespace Game.Maps
foreach (var phaseId in phases[guid])
PhasingHandler.AddPhase(corpse, phaseId, false);
corpse.SetCustomizations(customizations[guid]);
AddCorpse(corpse);
} while (result.NextRow());
}
@@ -3414,19 +3434,12 @@ namespace Game.Maps
bones.SetDisplayId(corpse.m_corpseData.DisplayID);
bones.SetRace((Race)(byte)corpse.m_corpseData.RaceID);
bones.SetSex((Gender)(byte)corpse.m_corpseData.Sex);
bones.SetSkin(corpse.m_corpseData.SkinID);
bones.SetFace(corpse.m_corpseData.FaceID);
bones.SetHairStyle(corpse.m_corpseData.HairStyleID);
bones.SetHairColor(corpse.m_corpseData.HairColorID);
bones.SetFacialHairStyle(corpse.m_corpseData.FacialHairStyleID);
bones.SetCustomizations(corpse.m_corpseData.Customizations);
bones.SetFlags((CorpseFlags)(corpse.m_corpseData.Flags | (uint)CorpseFlags.Bones));
bones.SetFactionTemplate(corpse.m_corpseData.FactionTemplate);
for (int i = 0; i < EquipmentSlot.End; ++i)
bones.SetItem((uint)i, corpse.m_corpseData.Items[i]);
for (int i = 0; i < PlayerConst.CustomDisplaySize; ++i)
bones.SetCustomDisplayOption((uint)i, corpse.m_corpseData.CustomDisplayOption[i]);
bones.SetCellCoord(corpse.GetCellCoord());
bones.Relocate(corpse.GetPositionX(), corpse.GetPositionY(), corpse.GetPositionZ(), corpse.GetOrientation());
+2 -2
View File
@@ -285,8 +285,8 @@ namespace Game.Movement
public void SetAnimation(AnimType anim)
{
args.time_perc = 0.0f;
args.animTier.emplace();
args.animTier.AnimTier = anim;
args.animTier.HasValue = true;
args.animTier.Value.AnimTier = (byte)anim;
args.flags.EnableAnimation();
}
@@ -80,41 +80,22 @@ namespace Game.Networking.Packets
{
public CharacterInfo(SQLFields fields)
{
// 0 1 2 3 4 5 6 7
// "SELECT characters.guid, characters.name, characters.race, characters.class, characters.gender, characters.skin, characters.face, characters.hairStyle, "
// 8 9 10 11 12 13
// "characters.hairColor, characters.facialStyle, characters.customDisplay1, characters.customDisplay2, characters.customDisplay3, characters.level, "
// 14 15 16 17 18
// "characters.zone, characters.map, characters.position_x, characters.position_y, characters.position_z, "
// 19 20 21 22 23 24 25
// "guild_member.guildid, characters.playerFlags, characters.at_login, character_pet.entry, character_pet.modelid, character_pet.level, characters.equipmentCache, "
// 26 27 28 29 30 31
// "character_banned.guid, characters.slot, characters.logout_time, characters.activeTalentGroup, characters.lastLoginBuild, character_declinedname.genitive"
Guid = ObjectGuid.Create(HighGuid.Player, fields.Read<ulong>(0));
Name = fields.Read<string>(1);
RaceId = fields.Read<byte>(2);
ClassId = (Class)fields.Read<byte>(3);
SexId = fields.Read<byte>(4);
SkinId = fields.Read<byte>(5);
FaceId = fields.Read<byte>(6);
HairStyle = fields.Read<byte>(7);
HairColor = fields.Read<byte>(8);
FacialHair = fields.Read<byte>(9);
CustomDisplay[0] = fields.Read<byte>(10);
CustomDisplay[1] = fields.Read<byte>(11);
CustomDisplay[2] = fields.Read<byte>(12);
ExperienceLevel = fields.Read<byte>(13);
ZoneId = fields.Read<uint>(14);
MapId = fields.Read<uint>(15);
PreloadPos = new Vector3(fields.Read<float>(16), fields.Read<float>(17), fields.Read<float>(18));
ExperienceLevel = fields.Read<byte>(5);
ZoneId = fields.Read<uint>(6);
MapId = fields.Read<uint>(7);
PreloadPos = new Vector3(fields.Read<float>(8), fields.Read<float>(9), fields.Read<float>(10));
ulong guildId = fields.Read<ulong>(19);
ulong guildId = fields.Read<ulong>(11);
if (guildId != 0)
GuildGuid = ObjectGuid.Create(HighGuid.Guild, guildId);
PlayerFlags playerFlags = (PlayerFlags)fields.Read<uint>(20);
AtLoginFlags atLoginFlags = (AtLoginFlags)fields.Read<ushort>(21);
PlayerFlags playerFlags = (PlayerFlags)fields.Read<uint>(12);
AtLoginFlags atLoginFlags = (AtLoginFlags)fields.Read<ushort>(13);
if (atLoginFlags.HasAnyFlag(AtLoginFlags.Resurrect))
playerFlags &= ~PlayerFlags.Ghost;
@@ -125,10 +106,10 @@ namespace Game.Networking.Packets
if (atLoginFlags.HasAnyFlag(AtLoginFlags.Rename))
Flags |= CharacterFlags.Rename;
if (fields.Read<uint>(26) != 0)
if (fields.Read<uint>(18) != 0)
Flags |= CharacterFlags.LockedByBilling;
if (WorldConfig.GetBoolValue(WorldCfg.DeclinedNamesUsed) && !string.IsNullOrEmpty(fields.Read<string>(31)))
if (WorldConfig.GetBoolValue(WorldCfg.DeclinedNamesUsed) && !string.IsNullOrEmpty(fields.Read<string>(23)))
Flags |= CharacterFlags.Declined;
if (atLoginFlags.HasAnyFlag(AtLoginFlags.Customize))
@@ -145,11 +126,11 @@ namespace Game.Networking.Packets
// show pet at selection character in character list only for non-ghost character
if (!playerFlags.HasAnyFlag(PlayerFlags.Ghost) && (ClassId == Class.Warlock || ClassId == Class.Hunter || ClassId == Class.Deathknight))
{
CreatureTemplate creatureInfo = Global.ObjectMgr.GetCreatureTemplate(fields.Read<uint>(22));
CreatureTemplate creatureInfo = Global.ObjectMgr.GetCreatureTemplate(fields.Read<uint>(14));
if (creatureInfo != null)
{
PetCreatureDisplayId = fields.Read<uint>(23);
PetExperienceLevel = fields.Read<ushort>(24);
PetCreatureDisplayId = fields.Read<uint>(15);
PetExperienceLevel = fields.Read<ushort>(16);
PetCreatureFamilyId = (uint)creatureInfo.Family;
}
}
@@ -158,15 +139,15 @@ namespace Game.Networking.Packets
ProfessionIds[0] = 0;
ProfessionIds[1] = 0;
StringArguments equipment = new StringArguments(fields.Read<string>(25));
ListPosition = fields.Read<byte>(27);
LastPlayedTime = fields.Read<uint>(28);
StringArguments equipment = new StringArguments(fields.Read<string>(17));
ListPosition = fields.Read<byte>(19);
LastPlayedTime = fields.Read<uint>(20);
var spec = Global.DB2Mgr.GetChrSpecializationByIndex(ClassId, fields.Read<byte>(29));
var spec = Global.DB2Mgr.GetChrSpecializationByIndex(ClassId, fields.Read<byte>(21));
if (spec != null)
SpecID = (ushort)spec.Id;
LastLoginVersion = fields.Read<uint>(30);
LastLoginVersion = fields.Read<uint>(22);
for (byte slot = 0; slot < InventorySlots.BagEnd; ++slot)
{
@@ -214,7 +195,10 @@ namespace Game.Networking.Packets
data.WriteUInt32(OverrideSelectScreenFileDataID);
foreach (ChrCustomizationChoice customization in Customizations)
customization.Write(data);
{
data.WriteUInt32(customization.ChrCustomizationOptionID);
data.WriteUInt32(customization.ChrCustomizationChoiceID);
}
data.WriteBits(Name.GetByteCount(), 6);
data.WriteBit(FirstLogin);
@@ -340,7 +324,7 @@ namespace Game.Networking.Packets
public uint SequenceIndex;
public ResponseCodes Result;
public CheckCharacterNameAvailabilityResult(uint sequenceIndex, ResponseCodes result) : base(ServerOpcodes.SMSG_CHECK_CHARACTER_NAME_AVAILABILITY_RESULT)
public CheckCharacterNameAvailabilityResult(uint sequenceIndex, ResponseCodes result) : base(ServerOpcodes.CheckCharacterNameAvailabilityResult)
{
SequenceIndex = sequenceIndex;
Result = result;
@@ -375,7 +359,15 @@ namespace Game.Networking.Packets
CreateInfo.TemplateSet.Set(_worldPacket.ReadUInt32());
for (var i = 0; i < customizationCount; ++i)
CreateInfo.Customizations[i].Read(_worldPacket);
{
CreateInfo.Customizations[i] = new ChrCustomizationChoice()
{
ChrCustomizationOptionID = _worldPacket.ReadUInt32(),
ChrCustomizationChoiceID = _worldPacket.ReadUInt32()
};
}
CreateInfo.Customizations.Sort();
}
public CharacterCreateInfo CreateInfo;
@@ -470,7 +462,15 @@ namespace Game.Networking.Packets
var customizationCount = _worldPacket.ReadUInt32();
for (var i = 0; i < customizationCount; ++i)
CustomizeInfo.Customizations[i].Read(_worldPacket);
{
CustomizeInfo.Customizations[i] = new ChrCustomizationChoice()
{
ChrCustomizationOptionID = _worldPacket.ReadUInt32(),
ChrCustomizationChoiceID = _worldPacket.ReadUInt32()
};
}
CustomizeInfo.Customizations.Sort();
CustomizeInfo.CharName = _worldPacket.ReadString(_worldPacket.ReadBits<uint>(6));
}
@@ -499,7 +499,15 @@ namespace Game.Networking.Packets
RaceOrFactionChangeInfo.Name = _worldPacket.ReadString(nameLength);
for (var i = 0; i < customizationCount; ++i)
RaceOrFactionChangeInfo.Customizations[i].Read(_worldPacket);
{
RaceOrFactionChangeInfo.Customizations[i] = new ChrCustomizationChoice()
{
ChrCustomizationOptionID = _worldPacket.ReadUInt32(),
ChrCustomizationChoiceID = _worldPacket.ReadUInt32()
};
}
RaceOrFactionChangeInfo.Customizations.Sort();
}
public CharRaceOrFactionChangeInfo RaceOrFactionChangeInfo;
@@ -527,7 +535,10 @@ namespace Game.Networking.Packets
_worldPacket.WriteString(Display.Value.Name);
foreach (ChrCustomizationChoice customization in Display.Value.Customizations)
customization.Write(_worldPacket);
{
_worldPacket.WriteUInt32(customization.ChrCustomizationOptionID);
_worldPacket.WriteUInt32(customization.ChrCustomizationChoiceID);
}
}
}
@@ -839,7 +850,15 @@ namespace Game.Networking.Packets
NewSex = _worldPacket.ReadUInt8();
for (var i = 0; i < customizationCount; ++i)
Customizations[i].Read(_worldPacket);
{
Customizations[i] = new ChrCustomizationChoice()
{
ChrCustomizationOptionID = _worldPacket.ReadUInt32(),
ChrCustomizationChoiceID = _worldPacket.ReadUInt32()
};
}
Customizations.Sort();
}
public byte NewSex;
@@ -981,7 +1000,10 @@ namespace Game.Networking.Packets
_worldPacket.WriteUInt8(SexID);
_worldPacket.WriteInt32(Customizations.Count);
foreach (ChrCustomizationChoice customization in Customizations)
customization.Write(_worldPacket);
{
_worldPacket.WriteUInt32(customization.ChrCustomizationOptionID);
_worldPacket.WriteUInt32(customization.ChrCustomizationChoiceID);
}
_worldPacket.WriteBits(CharName.GetByteCount(), 6);
_worldPacket.FlushBits();
@@ -1047,30 +1069,6 @@ namespace Game.Networking.Packets
}
//Structs
public struct ChrCustomizationChoice
{
public uint ChrCustomizationOptionID;
public uint ChrCustomizationChoiceID;
public ChrCustomizationChoice(uint chrCustomizationOptionID, uint chrCustomizationChoiceID)
{
ChrCustomizationOptionID = chrCustomizationOptionID;
ChrCustomizationChoiceID = chrCustomizationChoiceID;
}
public void Write(WorldPacket data)
{
data.WriteUInt32(ChrCustomizationOptionID);
data.WriteUInt32(ChrCustomizationChoiceID);
}
public void Read(WorldPacket data)
{
ChrCustomizationOptionID = data.ReadUInt32();
ChrCustomizationChoiceID = data.ReadUInt32();
}
}
public class CharacterCreateInfo
{
// User specified variables
@@ -233,7 +233,7 @@ namespace Game.Networking.Packets
class GarrisonMapDataResponse : ServerPacket
{
public GarrisonMapDataResponse() : base(ServerOpcodes.GarrisonBuildingLandmarks, ConnectionType.Instance) { }
public GarrisonMapDataResponse() : base(ServerOpcodes.GarrisonMapDataResponse, ConnectionType.Instance) { }
public override void Write()
{
@@ -280,7 +280,7 @@ namespace Game.Networking.Packets
public class GuildEventStatusChange : ServerPacket
{
public GuildEventStatusChange() : base(ServerOpcodes.GuildEventAwayChange) { }
public GuildEventStatusChange() : base(ServerOpcodes.GuildEventStatusChange) { }
public override void Write()
{
@@ -233,12 +233,12 @@ namespace Game.Networking.Packets
GUID = player.GetGUID();
SpecializationID = player.GetPrimarySpecialization();
Name = player.GetName();
GenderID = player.m_playerData.NativeSex;
GenderID = (byte)player.GetNativeSex();
Race = (byte)player.GetRace();
ClassID = (byte)player.GetClass();
foreach (var customization in player.m_playerData.Customizations)
Customizations.Add(new ChrCustomizationChoice(customization.ChrCustomizationOptionID, customization.ChrCustomizationChoiceID));
Customizations.Add(customization);
for (byte i = 0; i < EquipmentSlot.End; ++i)
{
@@ -261,7 +261,10 @@ namespace Game.Networking.Packets
data.WriteString(Name);
foreach (var customization in Customizations)
customization.Write(data);
{
data.WriteUInt32(customization.ChrCustomizationOptionID);
data.WriteUInt32(customization.ChrCustomizationChoiceID);
}
foreach (InspectItemData item in Items)
item.Write(data);
@@ -790,7 +790,7 @@ namespace Game.Networking.Packets
public class ItemModList
{
public Array<ItemMod> Values = new Array<ItemMod>(ItemModifier.Max);
public Array<ItemMod> Values = new Array<ItemMod>((int)ItemModifier.Max);
public void Read(WorldPacket data)
{
@@ -859,8 +859,8 @@ namespace Game.Networking.Packets
ItemBonus.Value.Context = item.GetContext();
}
foreach (var mod in item.m_itemData.Modifiers.Values)
Modifications.Values.Add(mod.Value, (ItemModifier)mod.Type);
foreach (var mod in item.m_itemData.Modifiers.GetValue().Values)
Modifications.Values.Add(new ItemMod(mod.Value, (ItemModifier)mod.Type));
}
public ItemInstance(Loots.LootItem lootItem)
+2 -2
View File
@@ -328,7 +328,7 @@ namespace Game.Networking.Packets
public class ClientGossipText
{
public uint QuestID;
public int ContentTuningID;
public uint ContentTuningID;
public int QuestType;
public bool Repeatable;
public string QuestTitle;
@@ -338,7 +338,7 @@ namespace Game.Networking.Packets
public void Write(WorldPacket data)
{
data.WriteUInt32(QuestID);
data.WriteInt32(ContentTuningID);
data.WriteUInt32(ContentTuningID);
data.WriteInt32(QuestType);
data.WriteUInt32(QuestFlags);
data.WriteUInt32(QuestFlagsEx);
@@ -616,7 +616,7 @@ namespace Game.Networking.Packets
BnetAccountID = player.GetSession().GetBattlenetAccountGUID();
Name = player.GetName();
RaceID = player.GetRace();
Sex = (Gender)(byte)player.m_playerData.NativeSex;
Sex = player.GetNativeSex();
ClassID = player.GetClass();
Level = (byte)player.GetLevel();
+13 -7
View File
@@ -116,7 +116,7 @@ namespace Game.Networking.Packets
_worldPacket.WriteUInt32(Info.QuestID);
_worldPacket.WriteInt32(Info.QuestType);
_worldPacket.WriteUInt32(Info.QuestPackageID);
_worldPacket.WriteInt32(Info.ContentTuningID);
_worldPacket.WriteUInt32(Info.ContentTuningID);
_worldPacket.WriteInt32(Info.QuestSortID);
_worldPacket.WriteUInt32(Info.QuestInfoID);
_worldPacket.WriteUInt32(Info.SuggestedGroupNum);
@@ -350,7 +350,7 @@ namespace Game.Networking.Packets
{
QuestGiverGUID = _worldPacket.ReadPackedGuid();
QuestID = _worldPacket.ReadUInt32();
ItemChoiceID = _worldPacket.ReadUInt32();
Choice.Read(_worldPacket);
}
public ObjectGuid QuestGiverGUID;
@@ -887,13 +887,19 @@ namespace Game.Networking.Packets
public struct QuestCompleteDisplaySpell
{
public int SpellID;
public int PlayerConditionID;
public uint SpellID;
public uint PlayerConditionID;
public QuestCompleteDisplaySpell(uint spellID, uint playerConditionID)
{
SpellID = spellID;
PlayerConditionID = playerConditionID;
}
public void Write(WorldPacket data)
{
data.WriteInt32(SpellID);
data.WriteInt32(PlayerConditionID);
data.WriteUInt32(SpellID);
data.WriteUInt32(PlayerConditionID);
}
}
@@ -914,7 +920,7 @@ namespace Game.Networking.Packets
public uint QuestID;
public int QuestType; // Accepted values: 0, 1 or 2. 0 == IsAutoComplete() (skip objectives/details)
public int ContentTuningID;
public uint ContentTuningID;
public uint QuestPackageID;
public int QuestSortID; // zone or sort to display in quest log
public uint QuestInfoID;
+16 -5
View File
@@ -933,7 +933,10 @@ namespace Game.Networking.Packets
_worldPacket.WriteInt32(ItemDisplayID.Count);
foreach (ChrCustomizationChoice customization in Customizations)
customization.Write(_worldPacket);
{
_worldPacket.WriteUInt32(customization.ChrCustomizationOptionID);
_worldPacket.WriteUInt32(customization.ChrCustomizationChoiceID);
}
foreach (var itemDisplayId in ItemDisplayID)
_worldPacket.WriteInt32(itemDisplayId);
@@ -1352,9 +1355,9 @@ namespace Game.Networking.Packets
public struct SpellCastVisual
{
public uint SpellXSpellVisualID;
public int ScriptVisualID;
public uint ScriptVisualID;
public SpellCastVisual(uint spellXSpellVisualID, int scriptVisualID)
public SpellCastVisual(uint spellXSpellVisualID, uint scriptVisualID)
{
SpellXSpellVisualID = spellXSpellVisualID;
ScriptVisualID = scriptVisualID;
@@ -1363,13 +1366,21 @@ namespace Game.Networking.Packets
public void Read(WorldPacket data)
{
SpellXSpellVisualID = data.ReadUInt32();
ScriptVisualID = data.ReadInt32();
ScriptVisualID = data.ReadUInt32();
}
public void Write(WorldPacket data)
{
data.WriteUInt32(SpellXSpellVisualID);
data.WriteInt32(ScriptVisualID);
data.WriteUInt32(ScriptVisualID);
}
public static implicit operator SpellCastVisualField(SpellCastVisual spellCastVisual)
{
SpellCastVisualField visual;
visual.SpellXSpellVisualID = spellCastVisual.SpellXSpellVisualID;
visual.ScriptVisualID = spellCastVisual.ScriptVisualID;
return visual;
}
}
+12 -25
View File
@@ -284,17 +284,16 @@ namespace Game
if (questXp == null || RewardXPDifficulty >= 10)
return 0;
float multiplier = 1.0f;
if (questLevel != player.GetLevel())
multiplier = CliDB.XpGameTable.GetRow(Math.Min(player.GetLevel(), questLevel)).Divisor / CliDB.XpGameTable.GetRow(player.GetLevel()).Divisor;
int diffFactor = (int)(2 * (questLevel + (Level == -1 ? 0 : 5) - player.GetLevel()) + 10);
int diffFactor = (int)(2 * (questLevel - player.GetLevel()) + 12);
if (diffFactor < 1)
diffFactor = 1;
else if (diffFactor > 10)
diffFactor = 10;
uint xp = (uint)(diffFactor * questXp.Difficulty[RewardXPDifficulty] * RewardXPMultiplier / 10 * multiplier);
uint xp = (uint)(diffFactor * questXp.Difficulty[RewardXPDifficulty] * RewardXPMultiplier / 10);
if (player.GetLevel() >= Global.ObjectMgr.GetMaxLevelForExpansion(PlayerConst.CurrentExpansion - 1) && player.GetSession().GetExpansion() == PlayerConst.CurrentExpansion && Expansion < (int)PlayerConst.CurrentExpansion)
xp = (uint)(xp / 9.0f);
if (xp <= 100)
xp = 5 * ((xp + 2) / 5);
else if (xp <= 500)
@@ -329,7 +328,7 @@ namespace Game
rewards.Title = RewardTitleId;
rewards.FactionFlags = RewardReputationMask;
var displaySpellItr = rewards.SpellCompletionDisplayID.begin();
var displaySpellIndex = 0;
foreach (QuestRewardDisplaySpell displaySpell in RewardDisplaySpell)
{
PlayerConditionRecord playerCondition = CliDB.PlayerConditionStorage.LookupByKey(displaySpell.PlayerConditionId);
@@ -337,8 +336,8 @@ namespace Game
if (!ConditionManager.IsPlayerMeetingCondition(player, playerCondition))
continue;
displaySpellItr = displaySpell.SpellId;
if (++displaySpellItr == null)
rewards.SpellCompletionDisplayID[displaySpellIndex] = (int)displaySpell.SpellId;
if (++displaySpellIndex >= rewards.SpellCompletionDisplayID.Length)
break;
}
@@ -456,11 +455,8 @@ namespace Game
QueryData.Info.QuestID = Id;
QueryData.Info.QuestType = (int)Type;
QueryData.Info.QuestLevel = Level;
QueryData.Info.QuestScalingFactionGroup = ScalingFactionGroup;
QueryData.Info.QuestMaxScalingLevel = MaxScalingLevel;
QueryData.Info.ContentTuningID = ContentTuningId;
QueryData.Info.QuestPackageID = PackageID;
QueryData.Info.QuestMinLevel = MinLevel;
QueryData.Info.QuestSortID = QuestSortID;
QueryData.Info.QuestInfoID = QuestInfoID;
QueryData.Info.SuggestedGroupNum = SuggestedPlayers;
@@ -474,8 +470,8 @@ namespace Game
QueryData.Info.RewardMoneyDifficulty = RewardMoneyDifficulty;
QueryData.Info.RewardMoneyMultiplier = RewardMoneyMultiplier;
QueryData.Info.RewardBonusMoney = RewardBonusMoney;
for (byte i = 0; i < SharedConst.QuestRewardDisplaySpellCount; ++i)
QueryData.Info.RewardDisplaySpell[i] = RewardDisplaySpell[i];
foreach (QuestRewardDisplaySpell displaySpell in RewardDisplaySpell)
QueryData.Info.RewardDisplaySpell.Add(new QuestCompleteDisplaySpell(displaySpell.SpellId, displaySpell.PlayerConditionId));
QueryData.Info.RewardSpell = RewardSpell;
@@ -581,15 +577,6 @@ namespace Game
public void SetEventIdForQuest(ushort eventId) { _eventIdForQuest = eventId; }
public ushort GetEventIdForQuest() { return _eventIdForQuest; }
[Obsolete]
public int MinLevel;
[Obsolete]
public int Level;
[Obsolete]
public int ScalingFactionGroup;
[Obsolete]
public int MaxScalingLevel;
#region Fields
public uint Id;
public QuestType Type;
@@ -699,7 +686,7 @@ namespace Game
public uint ScriptId;
public List<uint> DependentPreviousQuests = new List<uint>();
public QueryQuestInfoResponse[] QueryData = new QueryQuestInfoResponse[(int)Locale.Total];
public QueryQuestInfoResponse QueryData;
uint _rewChoiceItemsCount;
uint _rewItemsCount;
+5 -12
View File
@@ -355,11 +355,11 @@ namespace Game
Values[WorldCfg.CharacterCreatingDisabledRacemask] = GetDefaultValue("CharacterCreating.Disabled.RaceMask", 0);
Values[WorldCfg.CharacterCreatingDisabledClassmask] = GetDefaultValue("CharacterCreating.Disabled.ClassMask", 0);
Values[WorldCfg.CharactersPerRealm] = GetDefaultValue("CharactersPerRealm", 16);
if ((int)Values[WorldCfg.CharactersPerRealm] < 1 || (int)Values[WorldCfg.CharactersPerRealm] > 16)
Values[WorldCfg.CharactersPerRealm] = GetDefaultValue("CharactersPerRealm", 50);
if ((int)Values[WorldCfg.CharactersPerRealm] < 1 || (int)Values[WorldCfg.CharactersPerRealm] > 200)
{
Log.outError(LogFilter.ServerLoading, "CharactersPerRealm ({0}) must be in range 1..16. Set to 16.", Values[WorldCfg.CharactersPerRealm]);
Values[WorldCfg.CharactersPerRealm] = 16;
Log.outError(LogFilter.ServerLoading, "CharactersPerRealm ({0}) must be in range 1..200. Set to 200.", Values[WorldCfg.CharactersPerRealm]);
Values[WorldCfg.CharactersPerRealm] = 200;
}
// must be after CharactersPerRealm
@@ -370,14 +370,7 @@ namespace Game
Values[WorldCfg.CharactersPerAccount] = Values[WorldCfg.CharactersPerRealm];
}
Values[WorldCfg.DemonHuntersPerRealm] = GetDefaultValue("DemonHuntersPerRealm", 1);
if ((int)Values[WorldCfg.DemonHuntersPerRealm] < 0 || (int)Values[WorldCfg.DemonHuntersPerRealm] > 12)
{
Log.outError(LogFilter.ServerLoading, "DemonHuntersPerRealm ({0}) must be in range 0..12. Set to 1.", Values[WorldCfg.DemonHuntersPerRealm]);
Values[WorldCfg.DemonHuntersPerRealm] = 1;
}
Values[WorldCfg.CharacterCreatingMinLevelForDemonHunter] = GetDefaultValue("CharacterCreating.MinLevelForDemonHunter", 70);
Values[WorldCfg.CharacterCreatingMinLevelForDemonHunter] = GetDefaultValue("CharacterCreating.MinLevelForDemonHunter", 0);
Values[WorldCfg.SkipCinematics] = GetDefaultValue("SkipCinematics", 0);
if ((int)Values[WorldCfg.SkipCinematics] < 0 || (int)Values[WorldCfg.SkipCinematics] > 2)
+7
View File
@@ -663,6 +663,12 @@ namespace Game
HandlePlayerLogin((LoginQueryHolder)_charLoginCallback.Result);
_charLoginCallback = null;
}
if (_charEnumCallback != null && _charEnumCallback.IsCompleted)
{
HandleCharEnum((EnumCharactersQueryHolder)_charEnumCallback.Result);
_charEnumCallback = null;
}
}
TransactionCallback AddTransactionCallback(TransactionCallback callback)
@@ -909,6 +915,7 @@ namespace Game
Task<SQLQueryHolder<AccountInfoQueryLoad>> _realmAccountLoginCallback;
Task<SQLQueryHolder<AccountInfoQueryLoad>> _accountLoginCallback;
Task<SQLQueryHolder<PlayerLoginQueryLoad>> _charLoginCallback;
Task<SQLQueryHolder<EnumCharacterQueryLoad>> _charEnumCallback;
AsyncCallbackProcessor<QueryCallback> _queryProcessor = new AsyncCallbackProcessor<QueryCallback>();
AsyncCallbackProcessor<TransactionCallback> _transactionCallbacks = new AsyncCallbackProcessor<TransactionCallback>();
+6 -6
View File
@@ -2501,13 +2501,13 @@ namespace Game.Spells
if (!m_caster.ToPlayer().GetCommandStatus(PlayerCommandStates.Casttime))
{
// calculate cast time (calculated after first CheckCast check to prevent charge counting for first CheckCast fail)
m_casttime = m_spellInfo.CalcCastTime(m_caster.GetLevel(), this);
m_casttime = m_spellInfo.CalcCastTime(this);
}
else
m_casttime = 0;
}
else
m_casttime = m_spellInfo.CalcCastTime(m_caster.GetLevel(), this);
m_casttime = m_spellInfo.CalcCastTime(this);
// don't allow channeled spells / spells with cast time to be casted while moving
// exception are only channeled spells that have no casttime and SPELL_ATTR5_CAN_CHANNEL_WHEN_MOVING
@@ -3547,7 +3547,7 @@ namespace Game.Spells
owner.ToPlayer().SendPacket(petCastFailed);
}
public static void SendCastResult(Player caster, SpellInfo spellInfo, SpellCastVisual spellVisual, ObjectGuid cast_count, SpellCastResult result, SpellCustomErrors customError = SpellCustomErrors.None, uint? param1 = null, uint? param2 = null)
public static void SendCastResult(Player caster, SpellInfo spellInfo, Networking.Packets.SpellCastVisual spellVisual, ObjectGuid cast_count, SpellCastResult result, SpellCustomErrors customError = SpellCustomErrors.None, uint? param1 = null, uint? param2 = null)
{
if (result == SpellCastResult.SpellCastOk)
return;
@@ -4038,7 +4038,7 @@ namespace Game.Spells
{
m_caster.ClearChannelObjects();
m_caster.SetChannelSpellId(0);
m_caster.SetChannelSpellXSpellVisualId(default);
m_caster.SetChannelVisual(default);
}
SpellChannelUpdate spellChannelUpdate = new SpellChannelUpdate();
@@ -4087,7 +4087,7 @@ namespace Game.Spells
m_caster.AddChannelObject(target.targetGUID);
m_caster.SetChannelSpellId(m_spellInfo.Id);
m_caster.SetChannelSpellXSpellVisualId(m_SpellVisual);
m_caster.SetChannelVisual(m_SpellVisual);
}
void SendResurrectRequest(Player target)
@@ -7404,7 +7404,7 @@ namespace Game.Spells
public bool m_fromClient;
public SpellCastFlagsEx m_castFlagsEx;
public SpellMisc m_misc;
public SpellCastVisual m_SpellVisual;
public Networking.Packets.SpellCastVisual m_SpellVisual;
public SpellCastTargets m_targets;
public sbyte m_comboPointGain;
public SpellCustomErrors m_customError;
+20 -24
View File
@@ -63,6 +63,7 @@ namespace Game.Spells
AttributesEx11 = (SpellAttr11)_misc.Attributes[11];
AttributesEx12 = (SpellAttr12)_misc.Attributes[12];
AttributesEx13 = (SpellAttr13)_misc.Attributes[13];
AttributesEx14 = (SpellAttr14)_misc.Attributes[14];
CastTimeEntry = CliDB.SpellCastTimesStorage.LookupByKey(_misc.CastingTimeIndex);
DurationEntry = CliDB.SpellDurationStorage.LookupByKey(_misc.DurationIndex);
RangeIndex = _misc.RangeIndex;
@@ -2608,31 +2609,11 @@ namespace Game.Spells
return (DurationEntry.MaxDuration == -1) ? -1 : Math.Abs(DurationEntry.MaxDuration);
}
public int CalcCastTime(uint level = 0, Spell spell = null)
public int CalcCastTime(Spell spell = null)
{
int castTime = 0;
if (CastTimeEntry != null)
{
int calcLevel = spell != null ? (int)spell.GetCaster().GetLevel() : 0;
if (MaxLevel != 0 && calcLevel > MaxLevel)
calcLevel = (int)MaxLevel;
if (HasAttribute(SpellAttr13.Unk17))
calcLevel *= 5;
if (MaxLevel != 0 && calcLevel > MaxLevel)
calcLevel = (int)MaxLevel;
if (BaseLevel != 0)
calcLevel -= (int)BaseLevel;
if (calcLevel < 0)
calcLevel = 0;
castTime = (int)(CastTimeEntry.Base + CastTimeEntry.PerLevel * level);
if (castTime < CastTimeEntry.Minimum)
castTime = CastTimeEntry.Minimum;
}
castTime = Math.Max(CastTimeEntry.Base, CastTimeEntry.Minimum);
if (castTime <= 0)
return 0;
@@ -2963,7 +2944,7 @@ namespace Game.Spells
}
case SpellProcsPerMinuteModType.Class:
{
if (caster.GetClassMask().HasAnyFlag(mod.Param))
if (caster.GetClassMask().HasAnyFlag((uint)mod.Param))
ppm *= 1.0f + mod.Coeff;
break;
}
@@ -3513,6 +3494,7 @@ namespace Game.Spells
public bool HasAttribute(SpellAttr11 attribute) { return Convert.ToBoolean(AttributesEx11 & attribute); }
public bool HasAttribute(SpellAttr12 attribute) { return Convert.ToBoolean(AttributesEx12 & attribute); }
public bool HasAttribute(SpellAttr13 attribute) { return Convert.ToBoolean(AttributesEx13 & attribute); }
public bool HasAttribute(SpellAttr14 attribute) { return Convert.ToBoolean(AttributesEx14 & attribute); }
public bool HasAttribute(SpellCustomAttributes attribute) { return Convert.ToBoolean(AttributesCu & attribute); }
public bool HasAnyAuraInterruptFlag() { return AuraInterruptFlags.Any(flag => flag != 0); }
@@ -3542,6 +3524,7 @@ namespace Game.Spells
public SpellAttr11 AttributesEx11 { get; set; }
public SpellAttr12 AttributesEx12 { get; set; }
public SpellAttr13 AttributesEx13 { get; set; }
public SpellAttr14 AttributesEx14 { get; set; }
public SpellCustomAttributes AttributesCu { get; set; }
public BitSet NegativeEffects { get; set; } = new BitSet(SpellConst.MaxEffects);
public ulong Stances { get; set; }
@@ -4359,6 +4342,18 @@ namespace Game.Spells
new StaticData(SpellEffectImplicitTargetTypes.None, SpellTargetObjectTypes.None), // 269 SPELL_EFFECT_UPGRADE_ITEM
new StaticData(SpellEffectImplicitTargetTypes.None, SpellTargetObjectTypes.None), // 270 SPELL_EFFECT_270
new StaticData(SpellEffectImplicitTargetTypes.None, SpellTargetObjectTypes.None), // 271 SPELL_EFFECT_APPLY_AREA_AURA_PARTY_NONRANDOM
new StaticData(SpellEffectImplicitTargetTypes.None, SpellTargetObjectTypes.None), // 272 SPELL_EFFECT_SET_COVENANT
new StaticData(SpellEffectImplicitTargetTypes.Caster, SpellTargetObjectTypes.Unit), // 273 SPELL_EFFECT_CRAFT_RUNEFORGE_LEGENDARY
new StaticData(SpellEffectImplicitTargetTypes.None, SpellTargetObjectTypes.None), // 274 SPELL_EFFECT_274
new StaticData(SpellEffectImplicitTargetTypes.None, SpellTargetObjectTypes.None), // 275 SPELL_EFFECT_275
new StaticData(SpellEffectImplicitTargetTypes.None, SpellTargetObjectTypes.None), // 276 SPELL_EFFECT_LEARN_TRANSMOG_ILLUSION
new StaticData(SpellEffectImplicitTargetTypes.None, SpellTargetObjectTypes.None), // 277 SPELL_EFFECT_SET_CHROMIE_TIME
new StaticData(SpellEffectImplicitTargetTypes.None, SpellTargetObjectTypes.None), // 278 SPELL_EFFECT_270
new StaticData(SpellEffectImplicitTargetTypes.None, SpellTargetObjectTypes.None), // 279 SPELL_EFFECT_LEARN_GARR_TALENT
new StaticData(SpellEffectImplicitTargetTypes.None, SpellTargetObjectTypes.None), // 280 SPELL_EFFECT_270
new StaticData(SpellEffectImplicitTargetTypes.None, SpellTargetObjectTypes.None), // 281 SPELL_EFFECT_LEARN_SOULBIND_CONDUIT
new StaticData(SpellEffectImplicitTargetTypes.None, SpellTargetObjectTypes.None), // 282 SPELL_EFFECT_CONVERT_ITEMS_TO_CURRENCY
new StaticData(SpellEffectImplicitTargetTypes.None, SpellTargetObjectTypes.None), // 283 SPELL_EFFECT_283
};
#region Fields
@@ -4726,7 +4721,8 @@ namespace Game.Spells
new StaticData(SpellTargetObjectTypes.None, SpellTargetReferenceTypes.None, SpellTargetSelectionCategories.Nyi, SpellTargetCheckTypes.Default, SpellTargetDirectionTypes.None), // 147
new StaticData(SpellTargetObjectTypes.None, SpellTargetReferenceTypes.None, SpellTargetSelectionCategories.Nyi, SpellTargetCheckTypes.Default, SpellTargetDirectionTypes.None), // 148
new StaticData(SpellTargetObjectTypes.Dest, SpellTargetReferenceTypes.Caster, SpellTargetSelectionCategories.Default, SpellTargetCheckTypes.Default, SpellTargetDirectionTypes.Random), // 149
new StaticData(SpellTargetObjectTypes.Unit, SpellTargetReferenceTypes.Caster, SpellTargetSelectionCategories.Default, SpellTargetCheckTypes.Default, SpellTargetDirectionTypes.None), // 150
new StaticData(SpellTargetObjectTypes.Unit, SpellTargetReferenceTypes.Caster, SpellTargetSelectionCategories.Default, SpellTargetCheckTypes.Default, SpellTargetDirectionTypes.None), // 150 TARGET_UNIT_OWN_CRITTER
new StaticData(SpellTargetObjectTypes.Unit, SpellTargetReferenceTypes.Caster, SpellTargetSelectionCategories.Area, SpellTargetCheckTypes.Enemy, SpellTargetDirectionTypes.None), // 151
};
}
+1 -1
View File
@@ -263,7 +263,7 @@ namespace Scripts.Spells.DeathKnight
return;
int amount = (int)(damageInfo.GetDamage() / 2);
SpellNonMeleeDamage log = new SpellNonMeleeDamage(drw, drw.GetVictim(), spellInfo, spellInfo.GetSpellXSpellVisualId(drw), spellInfo.GetSchoolMask());
SpellNonMeleeDamage log = new SpellNonMeleeDamage(drw, drw.GetVictim(), spellInfo, new Game.Networking.Packets.SpellCastVisual(spellInfo.GetSpellXSpellVisualId(drw), 0), spellInfo.GetSchoolMask());
log.damage = (uint)amount;
drw.DealDamage(drw.GetVictim(), (uint)amount, null, DamageEffectType.Direct, spellInfo.GetSchoolMask(), spellInfo, true);
drw.SendSpellNonMeleeDamageLog(log);
+2 -2
View File
@@ -128,7 +128,7 @@ namespace Scripts.World
case 34475:
SpellInfo spellInfo = Global.SpellMgr.GetSpellInfo(ItemScriptConst.SpellArcaneCharges, player.GetMap().GetDifficultyID());
if (spellInfo != null)
Spell.SendCastResult(player, spellInfo, 0, castId, SpellCastResult.NotOnGround);
Spell.SendCastResult(player, spellInfo, default, castId, SpellCastResult.NotOnGround);
break;
}
@@ -277,7 +277,7 @@ namespace Scripts.World
{
SpellInfo spellInfo = Global.SpellMgr.GetSpellInfo(ItemScriptConst.SpellPetrovBomb, Difficulty.None);
if (spellInfo != null)
Spell.SendCastResult(player, spellInfo, 0, castId, SpellCastResult.NotHere);
Spell.SendCastResult(player, spellInfo, default, castId, SpellCastResult.NotHere);
return true;
}
+8 -17
View File
@@ -791,28 +791,19 @@ CharactersPerAccount = 50
#
# CharactersPerRealm
# Description: Limit number of characters per account on this realm.
# Range: 1-16
# Default: 16 - (Client limitation)
# Range: 1-200
# Default: 50
CharactersPerRealm = 16
#
# DemonHuntersPerRealm
# Description: Limit number of demon hunter characters per account on this realm.
# Range: 1-12
# Default: 1
DemonHuntersPerRealm = 1
CharactersPerRealm = 50
#
# CharacterCreating.MinLevelForDemonHunter
# Description: Limit creating demon hunters only for account with another
# character of specific level.
# Default: 70 - (Enabled, Requires at least another level 70 character)
# 0 - (Disabled)
# Default: 0 - (Disabled, No requirement)
# 1 - (Enabled, Requires at least another level 1 character)
CharacterCreating.MinLevelForDemonHunter = 70
CharacterCreating.MinLevelForDemonHunter = 0
#
# SkipCinematics
@@ -827,11 +818,11 @@ SkipCinematics = 0
#
# MaxPlayerLevel
# Description: Maximum level that can be reached by players.
# Important: Levels beyond 100 are not recommended at all.
# Important: Levels beyond 110 are not recommended at all.
# Range: 1-255
# Default: 120
# Default: 60
MaxPlayerLevel = 120
MaxPlayerLevel = 60
#
# MinDualSpecLevel
+51 -11
View File
@@ -704,6 +704,29 @@ LOCK TABLES `character_currency` WRITE;
/*!40000 ALTER TABLE `character_currency` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `character_customizations`
--
DROP TABLE IF EXISTS `character_customizations`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `character_customizations` (
`guid` bigint(20) unsigned NOT NULL,
`chrCustomizationOptionID` int(10) unsigned NOT NULL,
`chrCustomizationChoiceID` int(10) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`guid`,`chrCustomizationOptionID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `character_customizations`
--
LOCK TABLES `character_customizations` WRITE;
/*!40000 ALTER TABLE `character_customizations` DISABLE KEYS */;
/*!40000 ALTER TABLE `character_customizations` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `character_declinedname`
--
@@ -1736,14 +1759,6 @@ CREATE TABLE `characters` (
`level` tinyint(3) unsigned NOT NULL DEFAULT '0',
`xp` int(10) unsigned NOT NULL DEFAULT '0',
`money` bigint(20) unsigned NOT NULL DEFAULT '0',
`skin` tinyint(3) unsigned NOT NULL DEFAULT '0',
`face` tinyint(3) unsigned NOT NULL DEFAULT '0',
`hairStyle` tinyint(3) unsigned NOT NULL DEFAULT '0',
`hairColor` tinyint(3) unsigned NOT NULL DEFAULT '0',
`facialStyle` tinyint(3) unsigned NOT NULL DEFAULT '0',
`customDisplay1` tinyint(3) unsigned NOT NULL DEFAULT '0',
`customDisplay2` tinyint(3) unsigned NOT NULL DEFAULT '0',
`customDisplay3` tinyint(3) unsigned NOT NULL DEFAULT '0',
`inventorySlots` tinyint(3) unsigned NOT NULL DEFAULT '16',
`bankSlots` tinyint(3) unsigned NOT NULL DEFAULT '0',
`restState` tinyint(3) unsigned NOT NULL DEFAULT '0',
@@ -1841,8 +1856,8 @@ CREATE TABLE `corpse` (
`mapId` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Map Identifier',
`displayId` int(10) unsigned NOT NULL DEFAULT '0',
`itemCache` text NOT NULL,
`bytes1` int(10) unsigned NOT NULL DEFAULT '0',
`bytes2` int(10) unsigned NOT NULL DEFAULT '0',
`race` tinyint(3) unsigned NOT NULL DEFAULT '0',
`gender` tinyint(3) unsigned NOT NULL DEFAULT '0',
`flags` tinyint(3) unsigned NOT NULL DEFAULT '0',
`dynFlags` tinyint(3) unsigned NOT NULL DEFAULT '0',
`time` int(10) unsigned NOT NULL DEFAULT '0',
@@ -1864,6 +1879,30 @@ LOCK TABLES `corpse` WRITE;
/*!40000 ALTER TABLE `corpse` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `corpse_customizations`
--
DROP TABLE IF EXISTS `corpse_customizations`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `corpse_customizations` (
`ownerGuid` bigint(20) unsigned NOT NULL,
`chrCustomizationOptionID` int(10) unsigned NOT NULL,
`chrCustomizationChoiceID` int(10) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`ownerGuid`,`chrCustomizationOptionID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `corpse_customizations`
--
LOCK TABLES `corpse_customizations` WRITE;
/*!40000 ALTER TABLE `corpse_customizations` DISABLE KEYS */;
/*!40000 ALTER TABLE `corpse_customizations` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `corpse_phases`
--
@@ -3780,7 +3819,8 @@ INSERT INTO `updates` VALUES
('2020_06_12_00_characters.sql','DF16C99EFACA4DFADDDF35644AAC63F9B4AA2BD6','ARCHIVED','2020-06-11 16:24:56',0),
('2020_06_17_00_characters.sql','C3EE0D751E4B97CDF15F3BE27AAAE3646514A358','ARCHIVED','2020-06-17 17:04:56',0),
('2020_08_14_00_characters.sql','355685FF86EE64E2ED9D4B7D1311D53A9C2E0FA5','ARCHIVED','2020-08-14 21:41:24',0),
('2020_10_20_00_characters.sql','744F2A36865761920CE98A6DDE3A3BADF44D1E77','ARCHIVED','2020-10-20 21:36:49',0);
('2020_10_20_00_characters.sql','744F2A36865761920CE98A6DDE3A3BADF44D1E77','ARCHIVED','2020-10-20 21:36:49',0),
('2020_11_16_00_characters.sql','33D5C7539E239132923D01F4B6EAD5F3EF3EEB69','RELEASED','2020-11-16 19:16:31',0);
/*!40000 ALTER TABLE `updates` ENABLE KEYS */;
UNLOCK TABLES;
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,489 @@
ALTER TABLE `achievement` ADD `CovenantID` int(11) NOT NULL DEFAULT '0' AFTER `SharesCriteria`;
ALTER TABLE `area_table` ADD `ContentTuningID` int(11) NOT NULL DEFAULT '0' AFTER `WindSettingsID`;
ALTER TABLE `area_table` DROP `ExplorationLevel`;
ALTER TABLE `battle_pet_breed_state` MODIFY `BattlePetStateID` int(11) NOT NULL DEFAULT '0' AFTER `ID`;
ALTER TABLE `battle_pet_species` ADD `CovenantID` int(11) NOT NULL DEFAULT '0' AFTER `LoadoutUIModelSceneID`;
ALTER TABLE `battlemaster_list` MODIFY `Flags` int(11) NOT NULL DEFAULT '0' AFTER `HolidayWorldState`;
ALTER TABLE `battlemaster_list` MODIFY `RequiredPlayerConditionID` int(11) NOT NULL DEFAULT '0' AFTER `IconFileDataID`;
ALTER TABLE `broadcast_text` MODIFY `LanguageID` int(11) NOT NULL DEFAULT '0' AFTER `ID`;
--
-- Table structure for table `character_loadout`
--
DROP TABLE IF EXISTS `character_loadout`;
CREATE TABLE `character_loadout` (
`RaceMask` bigint(20) NOT NULL DEFAULT '0',
`ID` int(10) unsigned NOT NULL DEFAULT '0',
`ChrClassID` tinyint(4) NOT NULL DEFAULT '0',
`Purpose` tinyint(4) NOT NULL DEFAULT '0',
`VerifiedBuild` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`,`VerifiedBuild`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
--
-- Table structure for table `character_loadout_item`
--
DROP TABLE IF EXISTS `character_loadout_item`;
CREATE TABLE `character_loadout_item` (
`ID` int(10) unsigned NOT NULL DEFAULT '0',
`CharacterLoadoutID` smallint(5) unsigned NOT NULL DEFAULT '0',
`ItemID` int(10) unsigned NOT NULL DEFAULT '0',
`VerifiedBuild` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`,`VerifiedBuild`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
ALTER TABLE `chat_channels` ADD `Ruleset` int(11) NOT NULL DEFAULT '0' AFTER `FactionGroup`;
ALTER TABLE `chat_channels` MODIFY `ID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Shortcut`;
ALTER TABLE `chr_classes`
ADD `Description` text AFTER `PetNameToken`,
ADD `RoleInfoString` text AFTER `Description`,
ADD `DisabledString` text AFTER `RoleInfoString`,
ADD `HyphenatedNameMale` text AFTER `DisabledString`,
ADD `HyphenatedNameFemale` text AFTER `HyphenatedNameMale`,
ADD `RolesMask` int(10) unsigned NOT NULL DEFAULT '0' AFTER `SpellTextureBlobFileDataID`,
ADD `ArmorTypeMask` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RolesMask`,
ADD `CharStartKitUnknown901` int(11) NOT NULL DEFAULT '0' AFTER `ArmorTypeMask`,
ADD `MaleCharacterCreationVisualFallback` int(11) NOT NULL DEFAULT '0' AFTER `CharStartKitUnknown901`,
ADD `MaleCharacterCreationIdleVisualFallback` int(11) NOT NULL DEFAULT '0' AFTER `MaleCharacterCreationVisualFallback`,
ADD `FemaleCharacterCreationVisualFallback` int(11) NOT NULL DEFAULT '0' AFTER `MaleCharacterCreationIdleVisualFallback`,
ADD `FemaleCharacterCreationIdleVisualFallback` int(11) NOT NULL DEFAULT '0' AFTER `FemaleCharacterCreationVisualFallback`,
ADD `CharacterCreationIdleGroundVisualFallback` int(11) NOT NULL DEFAULT '0' AFTER `FemaleCharacterCreationIdleVisualFallback`,
ADD `CharacterCreationGroundVisualFallback` int(11) NOT NULL DEFAULT '0' AFTER `CharacterCreationIdleGroundVisualFallback`,
ADD `AlteredFormCharacterCreationIdleVisualFallback` int(11) NOT NULL DEFAULT '0' AFTER `CharacterCreationGroundVisualFallback`,
ADD `CharacterCreationAnimLoopWaitTimeMsFallback` int(11) NOT NULL DEFAULT '0' AFTER `AlteredFormCharacterCreationIdleVisualFallback`,
ADD `ChatColorR` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `SpellClassSet`,
ADD `ChatColorG` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ChatColorR`,
ADD `ChatColorB` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ChatColorG`;
ALTER TABLE `chr_classes` MODIFY `Flags` int(10) unsigned NOT NULL DEFAULT '0' AFTER `LowResScreenFileDataID`;
ALTER TABLE `chr_classes` DROP `StartingLevel`;
ALTER TABLE `chr_classes_locale`
ADD `Description_lang` text AFTER `NameFemale_lang`,
ADD `RoleInfoString_lang` text AFTER `Description_lang`,
ADD `DisabledString_lang` text AFTER `RoleInfoString_lang`,
ADD `HyphenatedNameMale_lang` text AFTER `DisabledString_lang`,
ADD `HyphenatedNameFemale_lang` text AFTER `HyphenatedNameMale_lang`;
--
-- Table structure for table `chr_customization_choice`
--
DROP TABLE IF EXISTS `chr_customization_choice`;
CREATE TABLE `chr_customization_choice` (
`Name` text,
`ID` int(10) unsigned NOT NULL DEFAULT '0',
`ChrCustomizationOptionID` int(11) NOT NULL DEFAULT '0',
`ChrCustomizationReqID` int(11) NOT NULL DEFAULT '0',
`SortOrder` smallint(5) unsigned NOT NULL DEFAULT '0',
`SwatchColor1` int(11) NOT NULL DEFAULT '0',
`SwatchColor2` int(11) NOT NULL DEFAULT '0',
`UiOrderIndex` smallint(5) unsigned NOT NULL DEFAULT '0',
`Flags` int(11) NOT NULL DEFAULT '0',
`VerifiedBuild` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`,`VerifiedBuild`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
--
-- Table structure for table `chr_customization_choice_locale`
--
DROP TABLE IF EXISTS `chr_customization_choice_locale`;
CREATE TABLE `chr_customization_choice_locale` (
`ID` int(10) unsigned NOT NULL DEFAULT '0',
`locale` varchar(4) NOT NULL,
`Name_lang` text,
`VerifiedBuild` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`,`locale`,`VerifiedBuild`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
/*!50500 PARTITION BY LIST COLUMNS(locale)
(PARTITION deDE VALUES IN ('deDE') ENGINE = InnoDB,
PARTITION esES VALUES IN ('esES') ENGINE = InnoDB,
PARTITION esMX VALUES IN ('esMX') ENGINE = InnoDB,
PARTITION frFR VALUES IN ('frFR') ENGINE = InnoDB,
PARTITION itIT VALUES IN ('itIT') ENGINE = InnoDB,
PARTITION koKR VALUES IN ('koKR') ENGINE = InnoDB,
PARTITION ptBR VALUES IN ('ptBR') ENGINE = InnoDB,
PARTITION ruRU VALUES IN ('ruRU') ENGINE = InnoDB,
PARTITION zhCN VALUES IN ('zhCN') ENGINE = InnoDB,
PARTITION zhTW VALUES IN ('zhTW') ENGINE = InnoDB) */;
--
-- Table structure for table `chr_customization_display_info`
--
DROP TABLE IF EXISTS `chr_customization_display_info`;
CREATE TABLE `chr_customization_display_info` (
`ID` int(10) unsigned NOT NULL DEFAULT '0',
`ShapeshiftFormID` int(11) NOT NULL DEFAULT '0',
`DisplayID` int(11) NOT NULL DEFAULT '0',
`BarberShopMinCameraDistance` float NOT NULL DEFAULT '0',
`BarberShopHeightOffset` float NOT NULL DEFAULT '0',
`VerifiedBuild` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`,`VerifiedBuild`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
--
-- Table structure for table `chr_customization_element`
--
DROP TABLE IF EXISTS `chr_customization_element`;
CREATE TABLE `chr_customization_element` (
`ID` int(10) unsigned NOT NULL DEFAULT '0',
`ChrCustomizationChoiceID` int(11) NOT NULL DEFAULT '0',
`RelatedChrCustomizationChoiceID` int(11) NOT NULL DEFAULT '0',
`ChrCustomizationGeosetID` int(11) NOT NULL DEFAULT '0',
`ChrCustomizationSkinnedModelID` int(11) NOT NULL DEFAULT '0',
`ChrCustomizationMaterialID` int(11) NOT NULL DEFAULT '0',
`ChrCustomizationBoneSetID` int(11) NOT NULL DEFAULT '0',
`ChrCustomizationCondModelID` int(11) NOT NULL DEFAULT '0',
`ChrCustomizationDisplayInfoID` int(11) NOT NULL DEFAULT '0',
`VerifiedBuild` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`,`VerifiedBuild`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
--
-- Table structure for table `chr_customization_option`
--
DROP TABLE IF EXISTS `chr_customization_option`;
CREATE TABLE `chr_customization_option` (
`Name` text,
`ID` int(10) unsigned NOT NULL DEFAULT '0',
`SecondaryID` smallint(5) unsigned NOT NULL DEFAULT '0',
`Flags` int(11) NOT NULL DEFAULT '0',
`ChrModelID` int(11) NOT NULL DEFAULT '0',
`SortIndex` int(11) NOT NULL DEFAULT '0',
`ChrCustomizationCategoryID` int(11) NOT NULL DEFAULT '0',
`OptionType` int(11) NOT NULL DEFAULT '0',
`BarberShopCostModifier` float NOT NULL DEFAULT '0',
`ChrCustomizationID` int(11) NOT NULL DEFAULT '0',
`ChrCustomizationReqID` int(11) NOT NULL DEFAULT '0',
`UiOrderIndex` int(11) NOT NULL DEFAULT '0',
`VerifiedBuild` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`,`VerifiedBuild`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
--
-- Table structure for table `chr_customization_option_locale`
--
DROP TABLE IF EXISTS `chr_customization_option_locale`;
CREATE TABLE `chr_customization_option_locale` (
`ID` int(10) unsigned NOT NULL DEFAULT '0',
`locale` varchar(4) NOT NULL,
`Name_lang` text,
`VerifiedBuild` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`,`locale`,`VerifiedBuild`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
/*!50500 PARTITION BY LIST COLUMNS(locale)
(PARTITION deDE VALUES IN ('deDE') ENGINE = InnoDB,
PARTITION esES VALUES IN ('esES') ENGINE = InnoDB,
PARTITION esMX VALUES IN ('esMX') ENGINE = InnoDB,
PARTITION frFR VALUES IN ('frFR') ENGINE = InnoDB,
PARTITION itIT VALUES IN ('itIT') ENGINE = InnoDB,
PARTITION koKR VALUES IN ('koKR') ENGINE = InnoDB,
PARTITION ptBR VALUES IN ('ptBR') ENGINE = InnoDB,
PARTITION ruRU VALUES IN ('ruRU') ENGINE = InnoDB,
PARTITION zhCN VALUES IN ('zhCN') ENGINE = InnoDB,
PARTITION zhTW VALUES IN ('zhTW') ENGINE = InnoDB) */;
--
-- Table structure for table `chr_customization_req`
--
DROP TABLE IF EXISTS `chr_customization_req`;
CREATE TABLE `chr_customization_req` (
`ID` int(10) unsigned NOT NULL DEFAULT '0',
`Flags` int(11) NOT NULL DEFAULT '0',
`ClassMask` int(11) NOT NULL DEFAULT '0',
`AchievementID` int(11) NOT NULL DEFAULT '0',
`OverrideArchive` int(11) NOT NULL DEFAULT '0',
`ItemModifiedAppearanceID` int(11) NOT NULL DEFAULT '0',
`VerifiedBuild` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`,`VerifiedBuild`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
--
-- Table structure for table `chr_customization_req_choice`
--
DROP TABLE IF EXISTS `chr_customization_req_choice`;
CREATE TABLE `chr_customization_req_choice` (
`ID` int(10) unsigned NOT NULL DEFAULT '0',
`ChrCustomizationChoiceID` int(11) NOT NULL DEFAULT '0',
`ChrCustomizationReqID` int(10) unsigned NOT NULL DEFAULT '0',
`VerifiedBuild` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`,`VerifiedBuild`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
--
-- Table structure for table `chr_model`
--
DROP TABLE IF EXISTS `chr_model`;
CREATE TABLE `chr_model` (
`FaceCustomizationOffset1` float NOT NULL DEFAULT '0',
`FaceCustomizationOffset2` float NOT NULL DEFAULT '0',
`FaceCustomizationOffset3` float NOT NULL DEFAULT '0',
`CustomizeOffset1` float NOT NULL DEFAULT '0',
`CustomizeOffset2` float NOT NULL DEFAULT '0',
`CustomizeOffset3` float NOT NULL DEFAULT '0',
`ID` int(10) unsigned NOT NULL DEFAULT '0',
`Sex` int(11) NOT NULL DEFAULT '0',
`DisplayID` int(11) NOT NULL DEFAULT '0',
`CharComponentTextureLayoutID` int(11) NOT NULL DEFAULT '0',
`Flags` int(11) NOT NULL DEFAULT '0',
`SkeletonFileDataID` int(11) NOT NULL DEFAULT '0',
`ModelFallbackChrModelID` int(11) NOT NULL DEFAULT '0',
`TextureFallbackChrModelID` int(11) NOT NULL DEFAULT '0',
`HelmVisFallbackChrModelID` int(11) NOT NULL DEFAULT '0',
`CustomizeScale` float NOT NULL DEFAULT '0',
`CustomizeFacing` float NOT NULL DEFAULT '0',
`CameraDistanceOffset` float NOT NULL DEFAULT '0',
`BarberShopCameraOffsetScale` float NOT NULL DEFAULT '0',
`BarberShopCameraRotationOffset` float NOT NULL DEFAULT '0',
`VerifiedBuild` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`,`VerifiedBuild`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
--
-- Table structure for table `chr_race_x_chr_model`
--
DROP TABLE IF EXISTS `chr_race_x_chr_model`;
CREATE TABLE `chr_race_x_chr_model` (
`ID` int(10) unsigned NOT NULL DEFAULT '0',
`ChrRacesID` int(11) NOT NULL DEFAULT '0',
`ChrModelID` int(11) NOT NULL DEFAULT '0',
`VerifiedBuild` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`,`VerifiedBuild`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
ALTER TABLE `chr_races`
ADD `NameS` text AFTER `NameFemaleLowercase`,
ADD `NameFemaleS` text AFTER `NameS`,
ADD `NameLowercaseS` text AFTER `NameFemaleS`,
ADD `NameFemaleLowercaseS` text AFTER `NameLowercaseS`,
ADD `RaceFantasyDescription` text AFTER `NameFemaleLowercaseS`,
ADD `NameL` text AFTER `RaceFantasyDescription`,
ADD `NameFemaleL` text AFTER `NameL`,
ADD `NameLowercaseL` text AFTER `NameFemaleL`,
ADD `NameFemaleLowercaseL` text AFTER `NameLowercaseL`,
ADD `PlayableRaceBit` int(11) NOT NULL DEFAULT '0' AFTER `UiDisplayOrder`,
ADD `HelmetAnimScalingRaceID` int(11) NOT NULL DEFAULT '0' AFTER `PlayableRaceBit`,
ADD `AlteredFormCustomizeOffsetFallback1` float NOT NULL DEFAULT '0' AFTER `TransmogrifyDisabledSlotMask`,
ADD `AlteredFormCustomizeOffsetFallback2` float NOT NULL DEFAULT '0' AFTER `AlteredFormCustomizeOffsetFallback1`,
ADD `AlteredFormCustomizeOffsetFallback3` float NOT NULL DEFAULT '0' AFTER `AlteredFormCustomizeOffsetFallback2`,
ADD `AlteredFormCustomizeRotationFallback` float NOT NULL DEFAULT '0' AFTER `AlteredFormCustomizeOffsetFallback3`,
ADD `UnalteredVisualCustomizationRaceID` tinyint(3) NOT NULL DEFAULT '0' AFTER `FemaleTextureFallbackSex`;
ALTER TABLE `chr_races`
MODIFY `BaseLanguage` int(11) NOT NULL DEFAULT '0' AFTER `Flags`,
MODIFY `ResSicknessSpellID` int(11) NOT NULL DEFAULT '0' AFTER `BaseLanguage`,
MODIFY `SplashSoundID` int(11) NOT NULL DEFAULT '0' AFTER `ResSicknessSpellID`;
ALTER TABLE `chr_races`
DROP `MaleDisplayId`,
DROP `FemaleDisplayId`,
DROP `HighResMaleDisplayId`,
DROP `HighResFemaleDisplayId`,
DROP `MaleCustomizeOffset1`,
DROP `MaleCustomizeOffset2`,
DROP `MaleCustomizeOffset3`,
DROP `FemaleCustomizeOffset1`,
DROP `FemaleCustomizeOffset2`,
DROP `FemaleCustomizeOffset3`,
DROP `FemaleSkeletonFileDataID`,
DROP `MaleSkeletonFileDataID`,
DROP `HelmVisFallbackRaceID`,
DROP `CharComponentTextureLayoutID`,
DROP `CharComponentTexLayoutHiResID`;
ALTER TABLE `chr_races_locale`
ADD `NameS_lang` text AFTER `NameFemaleLowercase_lang`,
ADD `NameFemaleS_lang` text AFTER `NameS_lang`,
ADD `NameLowercaseS_lang` text AFTER `NameFemaleS_lang`,
ADD `NameFemaleLowercaseS_lang` text AFTER `NameLowercaseS_lang`,
ADD `RaceFantasyDescription_lang` text AFTER `NameFemaleLowercaseS_lang`,
ADD `NameL_lang` text AFTER `RaceFantasyDescription_lang`,
ADD `NameFemaleL_lang` text AFTER `NameL_lang`,
ADD `NameLowercaseL_lang` text AFTER `NameFemaleL_lang`,
ADD `NameFemaleLowercaseL_lang` text AFTER `NameLowercaseL_lang`;
ALTER TABLE `content_tuning`
ADD `MinLevelType` int(11) NOT NULL DEFAULT '0' AFTER `MaxLevel`,
ADD `MaxLevelType` int(11) NOT NULL DEFAULT '0' AFTER `MinLevelType`,
ADD `TargetLevelDelta` int(11) NOT NULL DEFAULT '0' AFTER `MaxLevelType`,
ADD `TargetLevelMaxDelta` int(11) NOT NULL DEFAULT '0' AFTER `TargetLevelDelta`,
ADD `TargetLevelMin` int(11) NOT NULL DEFAULT '0' AFTER `TargetLevelMaxDelta`,
ADD `TargetLevelMax` int(11) NOT NULL DEFAULT '0' AFTER `TargetLevelMin`,
ADD `MinItemLevel` int(11) NOT NULL DEFAULT '0' AFTER `TargetLevelMax`;
ALTER TABLE `content_tuning`
MODIFY `Flags` int(11) NOT NULL DEFAULT '0' AFTER `ID`,
MODIFY `ExpansionID` int(11) NOT NULL DEFAULT '0' AFTER `Flags`;
ALTER TABLE `creature_display_info_extra`
DROP `SkinID`,
DROP `FaceID`,
DROP `HairStyleID`,
DROP `HairColorID`,
DROP `FacialHairID`,
DROP `CustomDisplayOption1`,
DROP `CustomDisplayOption2`,
DROP `CustomDisplayOption3`;
ALTER TABLE `currency_types` CHANGE `ConvertToPlayerExperience` `XpQuestDifficulty` int(11) NOT NULL DEFAULT '0' AFTER `ItemGroupSoundsID`;
ALTER TABLE `currency_types` CHANGE `PlayerConditionID` `AwardConditionID` int(11) NOT NULL DEFAULT '0' AFTER `XpQuestDifficulty`;
ALTER TABLE `currency_types` ADD `MaxQtyWorldStateID` int(11) NOT NULL DEFAULT '0' AFTER `AwardConditionID`;
ALTER TABLE `currency_types` CHANGE `Flags` `Flags1` int(11) NOT NULL DEFAULT '0' AFTER `MaxQtyWorldStateID`;
ALTER TABLE `currency_types` ADD `Flags2` int(11) NOT NULL DEFAULT '0' AFTER `Flags1`;
ALTER TABLE `currency_types` MODIFY `CategoryID` int(11) NOT NULL DEFAULT '0' AFTER `Description`;
ALTER TABLE `curve_point`
ADD `PosPreSquishX` float NOT NULL DEFAULT '0' AFTER `PosY`,
ADD `PosPreSquishY` float NOT NULL DEFAULT '0' AFTER `PosPreSquishX`;
ALTER TABLE `destructible_model_data`
MODIFY `State1Wmo` int(11) NOT NULL DEFAULT '0' AFTER `State0AmbientDoodadSet`,
MODIFY `State2Wmo` int(11) NOT NULL DEFAULT '0' AFTER `State1AmbientDoodadSet`,
MODIFY `State3Wmo` int(11) NOT NULL DEFAULT '0' AFTER `State2AmbientDoodadSet`,
MODIFY `State0Wmo` int(11) NOT NULL DEFAULT '0' AFTER `DoNotHighlight`;
ALTER TABLE `dungeon_encounter` MODIFY `DifficultyID` int(11) NOT NULL DEFAULT '0' AFTER `MapID`;
ALTER TABLE `gameobjects`
MODIFY `OwnerID` int(11) NOT NULL DEFAULT '0' AFTER `ID`,
MODIFY `DisplayID` int(11) NOT NULL DEFAULT '0' AFTER `OwnerID`,
MODIFY `TypeID` int(11) NOT NULL DEFAULT '0' AFTER `Scale`,
MODIFY `PhaseUseFlags` int(11) NOT NULL DEFAULT '0' AFTER `TypeID`,
MODIFY `PhaseID` int(11) NOT NULL DEFAULT '0' AFTER `PhaseUseFlags`,
MODIFY `PhaseGroupID` int(11) NOT NULL DEFAULT '0' AFTER `PhaseID`;
ALTER TABLE `garr_building` MODIFY `GarrSiteID` int(11) NOT NULL DEFAULT '0' AFTER `AllianceGameObjectID`;
ALTER TABLE `garr_follower`
ADD `AutoCombatantID` int(11) NOT NULL DEFAULT '0' AFTER `Gender`,
ADD `CovenantID` int(11) NOT NULL DEFAULT '0' AFTER `AutoCombatantID`;
ALTER TABLE `gem_properties` DROP `MinItemLevel`;
ALTER TABLE `item` ADD `ModifiedCraftingReagentItemID` int(11) NOT NULL DEFAULT '0' AFTER `ItemGroupSoundsID`;
ALTER TABLE `item_appearance` ADD `PlayerConditionID` int(11) NOT NULL DEFAULT '0' AFTER `UiOrder`;
ALTER TABLE `item_bonus` ADD `Value4` int(11) NOT NULL DEFAULT '0' AFTER `Value3`;
ALTER TABLE `item_sparse`
ADD `ModifiedCraftingReagentItemID` int(11) NOT NULL DEFAULT '0' AFTER `FactionRelated`,
ADD `ContentTuningID` int(11) NOT NULL DEFAULT '0' AFTER `ModifiedCraftingReagentItemID`,
ADD `PlayerLevelToItemLevelCurveID` int(11) NOT NULL DEFAULT '0' AFTER `ContentTuningID`;
ALTER TABLE `item_sparse` DROP `ScalingStatDistributionID`;
ALTER TABLE `lfg_dungeons` ADD `ContentTuningID` int(11) NOT NULL DEFAULT '0' AFTER `MentorCharLevel`;
ALTER TABLE `lfg_dungeons`
DROP `MinLevel`,
DROP `MaxLevel`,
DROP `TargetLevel`,
DROP `TargetLevelMin`,
DROP `TargetLevelMax`;
ALTER TABLE `lock` ADD `Flags` int(11) NOT NULL DEFAULT '0' AFTER `ID`;
ALTER TABLE `map` ADD `InternalName` text AFTER `MapName`;
ALTER TABLE `player_condition`
ADD `ContentTuningID` int(11) NOT NULL DEFAULT '0' AFTER `MaxPVPRank`,
ADD `CovenantID` int(11) NOT NULL DEFAULT '0' AFTER `ContentTuningID`;
ALTER TABLE `player_condition`
MODIFY `LanguageID` int(11) NOT NULL DEFAULT '0' AFTER `SkillLogic`,
MODIFY `WeatherID` int(11) NOT NULL DEFAULT '0' AFTER `WorldStateExpressionID`,
MODIFY `QuestKillID` int(11) NOT NULL DEFAULT '0' AFTER `CurrencyLogic`,
MODIFY `Flags` int(11) NOT NULL DEFAULT '0' AFTER `PhaseGroupID`,
MODIFY `PrevQuestID1` int(11) NOT NULL DEFAULT '0' AFTER `MinReputation3`,
MODIFY `PrevQuestID2` int(11) NOT NULL DEFAULT '0' AFTER `PrevQuestID1`,
MODIFY `PrevQuestID3` int(11) NOT NULL DEFAULT '0' AFTER `PrevQuestID2`,
MODIFY `PrevQuestID4` int(11) NOT NULL DEFAULT '0' AFTER `PrevQuestID3`,
MODIFY `CurrQuestID1` int(11) NOT NULL DEFAULT '0' AFTER `PrevQuestID4`,
MODIFY `CurrQuestID2` int(11) NOT NULL DEFAULT '0' AFTER `CurrQuestID1`,
MODIFY `CurrQuestID3` int(11) NOT NULL DEFAULT '0' AFTER `CurrQuestID2`,
MODIFY `CurrQuestID4` int(11) NOT NULL DEFAULT '0' AFTER `CurrQuestID3`,
MODIFY `CurrentCompletedQuestID1` int(11) NOT NULL DEFAULT '0' AFTER `CurrQuestID4`,
MODIFY `CurrentCompletedQuestID2` int(11) NOT NULL DEFAULT '0' AFTER `CurrentCompletedQuestID1`,
MODIFY `CurrentCompletedQuestID3` int(11) NOT NULL DEFAULT '0' AFTER `CurrentCompletedQuestID2`,
MODIFY `CurrentCompletedQuestID4` int(11) NOT NULL DEFAULT '0' AFTER `CurrentCompletedQuestID3`;
ALTER TABLE `player_condition`
DROP `MinLevel`,
DROP `MaxLevel`;
ALTER TABLE `scenario_step` MODIFY `RewardQuestID` int(11) NOT NULL DEFAULT '0' AFTER `Criteriatreeid`;
ALTER TABLE `skill_line_ability` MODIFY `Flags` int(11) NOT NULL DEFAULT '0' AFTER `TrivialSkillLineRankLow`;
ALTER TABLE `spell_cast_times` DROP `PerLevel`;
ALTER TABLE `spell_duration` DROP `DurationPerLevel`;
ALTER TABLE `spell_effect` MODIFY `Effect` int(11) NOT NULL DEFAULT '0' AFTER `EffectIndex`;
ALTER TABLE `spell_item_enchantment`
ADD `MinItemLevel` int(11) NOT NULL DEFAULT '0' AFTER `IconFileDataID`,
ADD `MaxItemLevel` int(11) NOT NULL DEFAULT '0' AFTER `MinItemLevel`,
ADD `TransmogUseConditionID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `MaxItemLevel`;
ALTER TABLE `spell_item_enchantment`
MODIFY `ID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `HordeName`,
MODIFY `IconFileDataID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `EffectScalingPoints3`;
ALTER TABLE `spell_item_enchantment` DROP `TransmogPlayerConditionID`;
ALTER TABLE `spell_levels`
MODIFY `MaxPassiveAuraLevel` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MaxLevel`,
MODIFY `BaseLevel` int(11) NOT NULL DEFAULT '0' AFTER `MaxPassiveAuraLevel`,
MODIFY `SpellLevel` int(11) NOT NULL DEFAULT '0' AFTER `BaseLevel`;
ALTER TABLE `spell_misc`
ADD `Attributes15` int(11) NOT NULL DEFAULT '0' AFTER `Attributes14`,
ADD `ShowFutureSpellPlayerConditionID` int(11) NOT NULL DEFAULT '0' AFTER `ContentTuningID`,
ADD `SpellVisualScript` int(11) NOT NULL DEFAULT '0' AFTER `ShowFutureSpellPlayerConditionID`,
ADD `ActiveSpellVisualScript` int(11) NOT NULL DEFAULT '0' AFTER `SpellVisualScript`;
ALTER TABLE `spell_procs_per_minute_mod` MODIFY `Param` int(11) NOT NULL DEFAULT '0' AFTER `Type`;
ALTER TABLE `spell_x_spell_visual` DROP `Flags`;
--
-- Table structure for table `transmog_illusion`
--
DROP TABLE IF EXISTS `transmog_illusion`;
CREATE TABLE `transmog_illusion` (
`ID` int(10) unsigned NOT NULL DEFAULT '0',
`UnlockConditionID` int(11) NOT NULL DEFAULT '0',
`TransmogCost` int(11) NOT NULL DEFAULT '0',
`SpellItemEnchantmentID` int(11) NOT NULL DEFAULT '0',
`Flags` int(11) NOT NULL DEFAULT '0',
`VerifiedBuild` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`,`VerifiedBuild`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
ALTER TABLE `ui_map` ADD `ContentTuningID` int(11) NOT NULL DEFAULT '0' AFTER `AlternateUiMapGroup`;
ALTER TABLE `ui_map`
DROP `LevelRangeMin`,
DROP `LevelRangeMax`;
ALTER TABLE `ui_map_link` ADD `Flags` int(11) NOT NULL DEFAULT '0' AFTER `OverrideHighlightAtlasID`;
ALTER TABLE `vehicle` ADD `VehiclePOITypeID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MissileTargetingID`;
ALTER TABLE `vehicle` DROP `UiLocomotionType`;
DROP TABLE `char_base_section`;
DROP TABLE `char_sections`;
DROP TABLE `char_start_outfit`;
DROP TABLE `character_facial_hair_styles`;
DROP TABLE `scaling_stat_distribution`;