Ported .Net Core commits:

hondacrx:
- Initial commit: Switch to .Net Core 2.0
- Fix build and removed not needed files
Fabi:
- Updated solution platforms.
- Changed folder structure.
- Change library target framework to netstandard2.0.
- Updated solution platforms again...
- Removed windows specific kernel32 function usage (Ctrl-C handler).
This commit is contained in:
Fabian
2017-10-26 17:23:44 +02:00
parent 227702e19c
commit a3dc7b3f48
844 changed files with 26064 additions and 1824 deletions
@@ -0,0 +1,218 @@
/*
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
using Framework.Constants;
using Framework.Database;
using Framework.GameMath;
using Game.Entities;
using System;
using System.Collections.Generic;
namespace Game.DataStorage
{
public class AreaTriggerDataStorage : Singleton<AreaTriggerDataStorage>
{
AreaTriggerDataStorage() { }
public void LoadAreaTriggerTemplates()
{
uint oldMSTime = Time.GetMSTime();
MultiMap<uint, Vector2> verticesByAreaTrigger = new MultiMap<uint, Vector2>();
MultiMap<uint, Vector2> verticesTargetByAreaTrigger = new MultiMap<uint, Vector2>();
MultiMap<uint, Vector3> splinesBySpellMisc = new MultiMap<uint, Vector3>();
MultiMap<uint, AreaTriggerAction> actionsByAreaTrigger = new MultiMap<uint, AreaTriggerAction>();
// 0 1 2 3
SQLResult templateActions = DB.World.Query("SELECT AreaTriggerId, ActionType, ActionParam, TargetType FROM `areatrigger_template_actions`");
if (!templateActions.IsEmpty())
{
do
{
uint areaTriggerId = templateActions.Read<uint>(0);
AreaTriggerAction action;
action.Param = templateActions.Read<uint>(2);
action.ActionType = (AreaTriggerActionTypes)templateActions.Read<uint>(1);
action.TargetType = (AreaTriggerActionUserTypes)templateActions.Read<uint>(3);
if (action.ActionType >= AreaTriggerActionTypes.Max)
{
Log.outError(LogFilter.Sql, "Table `areatrigger_template_actions` has invalid ActionType ({0}) for AreaTriggerId {1} and Param {2}", action.ActionType, areaTriggerId, action.Param);
continue;
}
if (action.TargetType >= AreaTriggerActionUserTypes.Max)
{
Log.outError(LogFilter.Sql, "Table `areatrigger_template_actions` has invalid TargetType ({0}) for AreaTriggerId {1} and Param {2}", action.TargetType, areaTriggerId, action.Param);
continue;
}
actionsByAreaTrigger.Add(areaTriggerId, action);
}
while (templateActions.NextRow());
}
else
{
Log.outInfo(LogFilter.ServerLoading, "Loaded 0 AreaTrigger templates actions. DB table `areatrigger_template_actions` is empty.");
}
// 0 1 2 3 4 5
SQLResult vertices = DB.World.Query("SELECT AreaTriggerId, Idx, VerticeX, VerticeY, VerticeTargetX, VerticeTargetY FROM `areatrigger_template_polygon_vertices` ORDER BY `AreaTriggerId`, `Idx`");
if (!vertices.IsEmpty())
{
do
{
uint areaTriggerId = vertices.Read<uint>(0);
verticesByAreaTrigger.Add(areaTriggerId, new Vector2(vertices.Read<float>(2), vertices.Read<float>(3)));
if (!vertices.IsNull(4) && !vertices.IsNull(5))
verticesTargetByAreaTrigger.Add(areaTriggerId, new Vector2(vertices.Read<float>(4), vertices.Read<float>(5)));
else if (vertices.IsNull(4) != vertices.IsNull(5))
Log.outError(LogFilter.Sql, "Table `areatrigger_template_polygon_vertices` has listed invalid target vertices (AreaTrigger: {0}, Index: {1}).", areaTriggerId, vertices.Read<uint>(1));
}
while (vertices.NextRow());
}
else
{
Log.outInfo(LogFilter.ServerLoading, "Loaded 0 AreaTrigger templates polygon vertices. DB table `areatrigger_template_polygon_vertices` is empty.");
}
// 0 1 2 3
SQLResult splines = DB.World.Query("SELECT SpellMiscId, X, Y, Z FROM `spell_areatrigger_splines` ORDER BY `SpellMiscId`, `Idx`");
if (!splines.IsEmpty())
{
do
{
uint spellMiscId = splines.Read<uint>(0);
Vector3 spline = new Vector3(splines.Read<float>(1), splines.Read<float>(2), splines.Read<float>(3));
splinesBySpellMisc.Add(spellMiscId, spline);
}
while (splines.NextRow());
}
else
{
Log.outInfo(LogFilter.ServerLoading, "Loaded 0 AreaTrigger templates splines. DB table `spell_areatrigger_splines` is empty.");
}
// 0 1 2 3 4 5 6 7 8 9
SQLResult templates = DB.World.Query("SELECT Id, Type, Flags, Data0, Data1, Data2, Data3, Data4, Data5, ScriptName FROM `areatrigger_template`");
if (!templates.IsEmpty())
{
do
{
AreaTriggerTemplate areaTriggerTemplate = new AreaTriggerTemplate();
areaTriggerTemplate.Id = templates.Read<uint>(0);
AreaTriggerTypes type = (AreaTriggerTypes)templates.Read<byte>(1);
if (type >= AreaTriggerTypes.Max)
{
Log.outError(LogFilter.Sql, "Table `areatrigger_template` has listed areatrigger (Id: {0}) with invalid type {1}.", areaTriggerTemplate.Id, type);
continue;
}
areaTriggerTemplate.TriggerType = type;
areaTriggerTemplate.Flags = (AreaTriggerFlags)templates.Read<uint>(2);
unsafe
{
fixed (float* b = areaTriggerTemplate.DefaultDatas.Data)
{
for (byte i = 0; i < SharedConst.MaxAreatriggerEntityData; ++i)
b[i] = templates.Read<float>(3 + i);
}
}
areaTriggerTemplate.ScriptId = Global.ObjectMgr.GetScriptId(templates.Read<string>(9));
areaTriggerTemplate.PolygonVertices = verticesByAreaTrigger[areaTriggerTemplate.Id];
areaTriggerTemplate.PolygonVerticesTarget = verticesTargetByAreaTrigger[areaTriggerTemplate.Id];
areaTriggerTemplate.Actions = actionsByAreaTrigger[areaTriggerTemplate.Id];
areaTriggerTemplate.InitMaxSearchRadius();
_areaTriggerTemplateStore[areaTriggerTemplate.Id] = areaTriggerTemplate;
}
while (templates.NextRow());
}
// 0 1 2 3 4 5 6 7 8
SQLResult areatriggerSpellMiscs = DB.World.Query("SELECT SpellMiscId, AreaTriggerId, MoveCurveId, ScaleCurveId, MorphCurveId, FacingCurveId, DecalPropertiesId, TimeToTarget, TimeToTargetScale FROM `spell_areatrigger`");
if (!areatriggerSpellMiscs.IsEmpty())
{
do
{
AreaTriggerMiscTemplate miscTemplate = new AreaTriggerMiscTemplate();
miscTemplate.MiscId = areatriggerSpellMiscs.Read<uint>(0);
uint areatriggerId = areatriggerSpellMiscs.Read<uint>(1);
miscTemplate.Template = GetAreaTriggerTemplate(areatriggerId);
if (miscTemplate.Template == null)
{
Log.outError(LogFilter.Sql, "Table `spell_areatrigger` reference invalid AreaTriggerId {0} for miscId {1}", areatriggerId, miscTemplate.MiscId);
continue;
}
Func<uint, uint> ValidateAndSetCurve = value =>
{
if (value != 0 && !CliDB.CurveStorage.ContainsKey(value))
{
Log.outError(LogFilter.Sql, "Table `spell_areatrigger` has listed areatrigger (MiscId: {0}, Id: {1}) with invalid Curve ({2}), set to 0!", miscTemplate.MiscId, areatriggerId, value);
return 0;
}
return value;
};
miscTemplate.MoveCurveId = ValidateAndSetCurve(areatriggerSpellMiscs.Read<uint>(2));
miscTemplate.ScaleCurveId = ValidateAndSetCurve(areatriggerSpellMiscs.Read<uint>(3));
miscTemplate.MorphCurveId = ValidateAndSetCurve(areatriggerSpellMiscs.Read<uint>(4));
miscTemplate.FacingCurveId = ValidateAndSetCurve(areatriggerSpellMiscs.Read<uint>(5));
miscTemplate.DecalPropertiesId = areatriggerSpellMiscs.Read<uint>(6);
miscTemplate.TimeToTarget = areatriggerSpellMiscs.Read<uint>(7);
miscTemplate.TimeToTargetScale = areatriggerSpellMiscs.Read<uint>(8);
miscTemplate.SplinePoints = splinesBySpellMisc[miscTemplate.MiscId];
_areaTriggerTemplateSpellMisc[miscTemplate.MiscId] = miscTemplate;
}
while (areatriggerSpellMiscs.NextRow());
}
else
{
Log.outInfo(LogFilter.ServerLoading, "Loaded 0 Spell AreaTrigger templates. DB table `spell_areatrigger` is empty.");
}
Log.outInfo(LogFilter.ServerLoading, "Loaded {0} spell areatrigger templates in {1} ms.", _areaTriggerTemplateStore.Count, Time.GetMSTimeDiffToNow(oldMSTime));
}
public AreaTriggerTemplate GetAreaTriggerTemplate(uint areaTriggerId)
{
return _areaTriggerTemplateStore.LookupByKey(areaTriggerId);
}
public AreaTriggerMiscTemplate GetAreaTriggerMiscTemplate(uint spellMiscValue)
{
return _areaTriggerTemplateSpellMisc.LookupByKey(spellMiscValue);
}
Dictionary<uint, AreaTriggerTemplate> _areaTriggerTemplateStore = new Dictionary<uint, AreaTriggerTemplate>();
Dictionary<uint, AreaTriggerMiscTemplate> _areaTriggerTemplateSpellMisc = new Dictionary<uint, AreaTriggerMiscTemplate>();
}
}
@@ -0,0 +1,127 @@
/*
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
using Framework.Constants;
using Framework.Database;
using System.Collections.Generic;
namespace Game.DataStorage
{
public class CharacterTemplateDataStorage : Singleton<CharacterTemplateDataStorage>
{
CharacterTemplateDataStorage() { }
public void LoadCharacterTemplates()
{
uint oldMSTime = Time.GetMSTime();
_characterTemplateStore.Clear();
MultiMap<uint, CharacterTemplateClass> characterTemplateClasses = new MultiMap<uint, CharacterTemplateClass>();
SQLResult classesResult = DB.World.Query("SELECT TemplateId, FactionGroup, Class FROM character_template_class");
if (!classesResult.IsEmpty())
{
do
{
uint templateId = classesResult.Read<uint>(0);
FactionMasks factionGroup = (FactionMasks)classesResult.Read<byte>(1);
byte classID = classesResult.Read<byte>(2);
if (!((factionGroup & (FactionMasks.Player | FactionMasks.Alliance)) == (FactionMasks.Player | FactionMasks.Alliance)) &&
!((factionGroup & (FactionMasks.Player | FactionMasks.Horde)) == (FactionMasks.Player | FactionMasks.Horde)))
{
Log.outError(LogFilter.Sql, "Faction group {0} defined for character template {1} in `character_template_class` is invalid. Skipped.", factionGroup, templateId);
continue;
}
if (!CliDB.ChrClassesStorage.ContainsKey(classID))
{
Log.outError(LogFilter.Sql, "Class {0} defined for character template {1} in `character_template_class` does not exists, skipped.", classID, templateId);
continue;
}
characterTemplateClasses.Add(templateId, new CharacterTemplateClass(factionGroup, classID));
}
while (classesResult.NextRow());
}
else
{
Log.outInfo(LogFilter.ServerLoading, "Loaded 0 character template classes. DB table `character_template_class` is empty.");
}
SQLResult templates = DB.World.Query("SELECT Id, Name, Description, Level FROM character_template");
if (templates.IsEmpty())
{
Log.outInfo(LogFilter.ServerLoading, "Loaded 0 character templates. DB table `character_template` is empty.");
return;
}
do
{
CharacterTemplate templ = new CharacterTemplate();
templ.TemplateSetId = templates.Read<uint>(0);
templ.Name = templates.Read<string>(1);
templ.Description = templates.Read<string>(2);
templ.Level = templates.Read<byte>(3);
templ.Classes = characterTemplateClasses[templ.TemplateSetId];
if (templ.Classes.Empty())
{
Log.outError(LogFilter.Sql, "Character template {0} does not have any classes defined in `character_template_class`. Skipped.", templ.TemplateSetId);
continue;
}
_characterTemplateStore[templ.TemplateSetId] = templ;
}
while (templates.NextRow());
Log.outInfo(LogFilter.ServerLoading, "Loaded {0} character templates in {1} ms.", _characterTemplateStore.Count, Time.GetMSTimeDiffToNow(oldMSTime));
}
public Dictionary<uint, CharacterTemplate> GetCharacterTemplates()
{
return _characterTemplateStore;
}
public CharacterTemplate GetCharacterTemplate(uint templateId)
{
return _characterTemplateStore.LookupByKey(templateId);
}
Dictionary<uint, CharacterTemplate> _characterTemplateStore = new Dictionary<uint, CharacterTemplate>();
}
public struct CharacterTemplateClass
{
public CharacterTemplateClass(FactionMasks factionGroup, byte classID)
{
FactionGroup = factionGroup;
ClassID = classID;
}
public FactionMasks FactionGroup;
public byte ClassID;
}
public class CharacterTemplate
{
public uint TemplateSetId;
public List<CharacterTemplateClass> Classes;
public string Name;
public string Description;
public byte Level;
}
}
+697
View File
@@ -0,0 +1,697 @@
/*
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
using Framework.Constants;
using Framework.Database;
using System;
using System.Collections.Generic;
using System.Linq;
namespace Game.DataStorage
{
public class CliDB
{
internal static int LoadedFileCount;
internal static string DataPath;
public static void LoadStores(string dataPath, LocaleConstant defaultLocale)
{
uint oldMSTime = Time.GetMSTime();
LoadedFileCount = 0;
DataPath = dataPath + "/dbc/" + defaultLocale + "/";
AchievementStorage = DB6Reader.Read<AchievementRecord>("Achievement.db2", DB6Metas.AchievementMeta, HotfixStatements.SEL_ACHIEVEMENT, HotfixStatements.SEL_ACHIEVEMENT_LOCALE);
AnimKitStorage = DB6Reader.Read<AnimKitRecord>("AnimKit.db2", DB6Metas.AnimKitMeta, HotfixStatements.SEL_ANIM_KIT);
AreaGroupMemberStorage = DB6Reader.Read<AreaGroupMemberRecord>("AreaGroupMember.db2", DB6Metas.AreaGroupMemberMeta, HotfixStatements.SEL_AREA_GROUP_MEMBER);
AreaTableStorage = DB6Reader.Read<AreaTableRecord>("AreaTable.db2", DB6Metas.AreaTableMeta, HotfixStatements.SEL_AREA_TABLE, HotfixStatements.SEL_AREA_TABLE_LOCALE);
AreaTriggerStorage = DB6Reader.Read<AreaTriggerRecord>("AreaTrigger.db2", DB6Metas.AreaTriggerMeta, HotfixStatements.SEL_AREA_TRIGGER);
ArmorLocationStorage = DB6Reader.Read<ArmorLocationRecord>("ArmorLocation.db2", DB6Metas.ArmorLocationMeta, HotfixStatements.SEL_ARMOR_LOCATION);
ArtifactStorage = DB6Reader.Read<ArtifactRecord>("Artifact.db2", DB6Metas.ArtifactMeta, HotfixStatements.SEL_ARTIFACT, HotfixStatements.SEL_ARTIFACT_APPEARANCE_LOCALE);
ArtifactAppearanceStorage = DB6Reader.Read<ArtifactAppearanceRecord>("ArtifactAppearance.db2", DB6Metas.ArtifactAppearanceMeta, HotfixStatements.SEL_ARTIFACT_APPEARANCE, HotfixStatements.SEL_ARTIFACT_APPEARANCE_LOCALE);
ArtifactAppearanceSetStorage = DB6Reader.Read<ArtifactAppearanceSetRecord>("ArtifactAppearanceSet.db2", DB6Metas.ArtifactAppearanceSetMeta, HotfixStatements.SEL_ARTIFACT_APPEARANCE_SET, HotfixStatements.SEL_ARTIFACT_APPEARANCE_SET_LOCALE);
ArtifactCategoryStorage = DB6Reader.Read<ArtifactCategoryRecord>("ArtifactCategory.db2", DB6Metas.ArtifactCategoryMeta, HotfixStatements.SEL_ARTIFACT_CATEGORY);
ArtifactPowerStorage = DB6Reader.Read<ArtifactPowerRecord>("ArtifactPower.db2", DB6Metas.ArtifactPowerMeta, HotfixStatements.SEL_ARTIFACT_POWER);
ArtifactPowerLinkStorage = DB6Reader.Read<ArtifactPowerLinkRecord>("ArtifactPowerLink.db2", DB6Metas.ArtifactPowerLinkMeta, HotfixStatements.SEL_ARTIFACT_POWER_LINK);
ArtifactPowerPickerStorage = DB6Reader.Read<ArtifactPowerPickerRecord>("ArtifactPowerPicker.db2", DB6Metas.ArtifactPowerPickerMeta, HotfixStatements.SEL_ARTIFACT_POWER_PICKER);
ArtifactPowerRankStorage = DB6Reader.Read<ArtifactPowerRankRecord>("ArtifactPowerRank.db2", DB6Metas.ArtifactPowerRankMeta, HotfixStatements.SEL_ARTIFACT_POWER_RANK);
//ArtifactQuestXPStorage = DB6Reader.Read<ArtifactQuestXPRecord>("ArtifactQuestXP.db2", DB6Metas.ArtifactQuestXPMeta, HotfixStatements.SEL_ARTIFACT_QUEST_XP);
AuctionHouseStorage = DB6Reader.Read<AuctionHouseRecord>("AuctionHouse.db2", DB6Metas.AuctionHouseMeta, HotfixStatements.SEL_AUCTION_HOUSE, HotfixStatements.SEL_AUCTION_HOUSE_LOCALE);
BankBagSlotPricesStorage = DB6Reader.Read<BankBagSlotPricesRecord>("BankBagSlotPrices.db2", DB6Metas.BankBagSlotPricesMeta, HotfixStatements.SEL_BANK_BAG_SLOT_PRICES);
//BannedAddOnsStorage = DB6Reader.Read<BannedAddOnsRecord>("BannedAddOns.db2", DB6Metas.BannedAddOnsMeta, HotfixStatements.SEL_BANNED_ADDONS);
BarberShopStyleStorage = DB6Reader.Read<BarberShopStyleRecord>("BarberShopStyle.db2", DB6Metas.BarberShopStyleMeta, HotfixStatements.SEL_BARBER_SHOP_STYLE, HotfixStatements.SEL_BARBER_SHOP_STYLE_LOCALE);
BattlePetBreedQualityStorage = DB6Reader.Read<BattlePetBreedQualityRecord>("BattlePetBreedQuality.db2", DB6Metas.BattlePetBreedQualityMeta, HotfixStatements.SEL_BATTLE_PET_BREED_QUALITY);
BattlePetBreedStateStorage = DB6Reader.Read<BattlePetBreedStateRecord>("BattlePetBreedState.db2", DB6Metas.BattlePetBreedStateMeta, HotfixStatements.SEL_BATTLE_PET_BREED_STATE);
BattlePetSpeciesStorage = DB6Reader.Read<BattlePetSpeciesRecord>("BattlePetSpecies.db2", DB6Metas.BattlePetSpeciesMeta, HotfixStatements.SEL_BATTLE_PET_SPECIES, HotfixStatements.SEL_BATTLE_PET_SPECIES_LOCALE);
BattlePetSpeciesStateStorage = DB6Reader.Read<BattlePetSpeciesStateRecord>("BattlePetSpeciesState.db2", DB6Metas.BattlePetSpeciesStateMeta, HotfixStatements.SEL_BATTLE_PET_SPECIES_STATE);
BattlemasterListStorage = DB6Reader.Read<BattlemasterListRecord>("BattlemasterList.db2", DB6Metas.BattlemasterListMeta, HotfixStatements.SEL_BATTLEMASTER_LIST, HotfixStatements.SEL_BATTLEMASTER_LIST_LOCALE);
BroadcastTextStorage = DB6Reader.Read<BroadcastTextRecord>("BroadcastText.db2", DB6Metas.BroadcastTextMeta, HotfixStatements.SEL_BROADCAST_TEXT, HotfixStatements.SEL_BROADCAST_TEXT_LOCALE);
CharacterFacialHairStylesStorage = DB6Reader.Read<CharacterFacialHairStylesRecord>("CharacterFacialHairStyles.db2", DB6Metas.CharacterFacialHairStylesMeta, HotfixStatements.SEL_CHARACTER_FACIAL_HAIR_STYLES);
CharBaseSectionStorage = DB6Reader.Read<CharBaseSectionRecord>("CharBaseSection.db2", DB6Metas.CharBaseSectionMeta, HotfixStatements.SEL_CHAR_BASE_SECTION);
CharSectionsStorage = DB6Reader.Read<CharSectionsRecord>("CharSections.db2", DB6Metas.CharSectionsMeta, HotfixStatements.SEL_CHAR_SECTIONS);
CharStartOutfitStorage = DB6Reader.Read<CharStartOutfitRecord>("CharStartOutfit.db2", DB6Metas.CharStartOutfitMeta, HotfixStatements.SEL_CHAR_START_OUTFIT);
CharTitlesStorage = DB6Reader.Read<CharTitlesRecord>("CharTitles.db2", DB6Metas.CharTitlesMeta, HotfixStatements.SEL_CHAR_TITLES, HotfixStatements.SEL_CHAR_TITLES_LOCALE);
ChatChannelsStorage = DB6Reader.Read<ChatChannelsRecord>("ChatChannels.db2", DB6Metas.ChatChannelsMeta, HotfixStatements.SEL_CHAT_CHANNELS, HotfixStatements.SEL_CHAT_CHANNELS_LOCALE);
ChrClassesStorage = DB6Reader.Read<ChrClassesRecord>("ChrClasses.db2", DB6Metas.ChrClassesMeta, HotfixStatements.SEL_CHR_CLASSES, HotfixStatements.SEL_CHR_CLASSES_LOCALE);
ChrClassesXPowerTypesStorage = DB6Reader.Read<ChrClassesXPowerTypesRecord>("ChrClassesXPowerTypes.db2", DB6Metas.ChrClassesXPowerTypesMeta, HotfixStatements.SEL_CHR_CLASSES_X_POWER_TYPES);
ChrRacesStorage = DB6Reader.Read<ChrRacesRecord>("ChrRaces.db2", DB6Metas.ChrRacesMeta, HotfixStatements.SEL_CHR_RACES, HotfixStatements.SEL_CHR_RACES_LOCALE);
ChrSpecializationStorage = DB6Reader.Read<ChrSpecializationRecord>("ChrSpecialization.db2", DB6Metas.ChrSpecializationMeta, HotfixStatements.SEL_CHR_SPECIALIZATION, HotfixStatements.SEL_CHR_SPECIALIZATION_LOCALE);
CinematicCameraStorage = DB6Reader.Read<CinematicCameraRecord>("CinematicCamera.db2", DB6Metas.CinematicCameraMeta, HotfixStatements.SEL_CINEMATIC_CAMERA);
CinematicSequencesStorage = DB6Reader.Read<CinematicSequencesRecord>("CinematicSequences.db2", DB6Metas.CinematicSequencesMeta, HotfixStatements.SEL_CINEMATIC_SEQUENCES);
ConversationLineStorage = DB6Reader.Read<ConversationLineRecord>("ConversationLine.db2", DB6Metas.ConversationLineMeta, HotfixStatements.SEL_CONVERSATION_LINE);
CreatureDisplayInfoStorage = DB6Reader.Read<CreatureDisplayInfoRecord>("CreatureDisplayInfo.db2", DB6Metas.CreatureDisplayInfoMeta, HotfixStatements.SEL_CREATURE_DISPLAY_INFO);
CreatureDisplayInfoExtraStorage = DB6Reader.Read<CreatureDisplayInfoExtraRecord>("CreatureDisplayInfoExtra.db2", DB6Metas.CreatureDisplayInfoExtraMeta, HotfixStatements.SEL_CREATURE_DISPLAY_INFO_EXTRA);
CreatureFamilyStorage = DB6Reader.Read<CreatureFamilyRecord>("CreatureFamily.db2", DB6Metas.CreatureFamilyMeta, HotfixStatements.SEL_CREATURE_FAMILY, HotfixStatements.SEL_CREATURE_FAMILY_LOCALE);
CreatureModelDataStorage = DB6Reader.Read<CreatureModelDataRecord>("CreatureModelData.db2", DB6Metas.CreatureModelDataMeta, HotfixStatements.SEL_CREATURE_MODEL_DATA);
CreatureTypeStorage = DB6Reader.Read<CreatureTypeRecord>("CreatureType.db2", DB6Metas.CreatureTypeMeta, HotfixStatements.SEL_CREATURE_TYPE, HotfixStatements.SEL_CREATURE_TYPE_LOCALE);
CriteriaStorage = DB6Reader.Read<CriteriaRecord>("Criteria.db2", DB6Metas.CriteriaMeta, HotfixStatements.SEL_CRITERIA);
CriteriaTreeStorage = DB6Reader.Read<CriteriaTreeRecord>("CriteriaTree.db2", DB6Metas.CriteriaTreeMeta, HotfixStatements.SEL_CRITERIA_TREE, HotfixStatements.SEL_CRITERIA_TREE_LOCALE);
CurrencyTypesStorage = DB6Reader.Read<CurrencyTypesRecord>("CurrencyTypes.db2", DB6Metas.CurrencyTypesMeta, HotfixStatements.SEL_CURRENCY_TYPES, HotfixStatements.SEL_CURRENCY_TYPES_LOCALE);
CurveStorage = DB6Reader.Read<CurveRecord>("Curve.db2", DB6Metas.CurveMeta, HotfixStatements.SEL_CURVE);
CurvePointStorage = DB6Reader.Read<CurvePointRecord>("CurvePoint.db2", DB6Metas.CurvePointMeta, HotfixStatements.SEL_CURVE_POINT);
DestructibleModelDataStorage = DB6Reader.Read<DestructibleModelDataRecord>("DestructibleModelData.db2", DB6Metas.DestructibleModelDataMeta, HotfixStatements.SEL_DESTRUCTIBLE_MODEL_DATA);
DifficultyStorage = DB6Reader.Read<DifficultyRecord>("Difficulty.db2", DB6Metas.DifficultyMeta, HotfixStatements.SEL_DIFFICULTY, HotfixStatements.SEL_DIFFICULTY_LOCALE);
DungeonEncounterStorage = DB6Reader.Read<DungeonEncounterRecord>("DungeonEncounter.db2", DB6Metas.DungeonEncounterMeta, HotfixStatements.SEL_DUNGEON_ENCOUNTER, HotfixStatements.SEL_DUNGEON_ENCOUNTER_LOCALE);
DurabilityCostsStorage = DB6Reader.Read<DurabilityCostsRecord>("DurabilityCosts.db2", DB6Metas.DurabilityCostsMeta, HotfixStatements.SEL_DURABILITY_COSTS);
DurabilityQualityStorage = DB6Reader.Read<DurabilityQualityRecord>("DurabilityQuality.db2", DB6Metas.DurabilityQualityMeta, HotfixStatements.SEL_DURABILITY_QUALITY);
EmotesStorage = DB6Reader.Read<EmotesRecord>("Emotes.db2", DB6Metas.EmotesMeta, HotfixStatements.SEL_EMOTES);
EmotesTextStorage = DB6Reader.Read<EmotesTextRecord>("EmotesText.db2", DB6Metas.EmotesTextMeta, HotfixStatements.SEL_EMOTES_TEXT, HotfixStatements.SEL_EMOTES_TEXT_LOCALE);
EmotesTextSoundStorage = DB6Reader.Read<EmotesTextSoundRecord>("EmotesTextSound.db2", DB6Metas.EmotesTextSoundMeta, HotfixStatements.SEL_EMOTES_TEXT_SOUND);
FactionStorage = DB6Reader.Read<FactionRecord>("Faction.db2", DB6Metas.FactionMeta, HotfixStatements.SEL_FACTION, HotfixStatements.SEL_FACTION_LOCALE);
FactionTemplateStorage = DB6Reader.Read<FactionTemplateRecord>("FactionTemplate.db2", DB6Metas.FactionTemplateMeta, HotfixStatements.SEL_FACTION_TEMPLATE);
GameObjectsStorage = DB6Reader.Read<GameObjectsRecord>("GameObjects.db2", DB6Metas.GameObjectsMeta, HotfixStatements.SEL_GAMEOBJECTS, HotfixStatements.SEL_GAMEOBJECTS_LOCALE);
GameObjectDisplayInfoStorage = DB6Reader.Read<GameObjectDisplayInfoRecord>("GameObjectDisplayInfo.db2", DB6Metas.GameObjectDisplayInfoMeta, HotfixStatements.SEL_GAMEOBJECT_DISPLAY_INFO);
GarrAbilityStorage = DB6Reader.Read<GarrAbilityRecord>("GarrAbility.db2", DB6Metas.GarrAbilityMeta, HotfixStatements.SEL_GARR_ABILITY, HotfixStatements.SEL_GARR_ABILITY_LOCALE);
GarrBuildingStorage = DB6Reader.Read<GarrBuildingRecord>("GarrBuilding.db2", DB6Metas.GarrBuildingMeta, HotfixStatements.SEL_GARR_BUILDING, HotfixStatements.SEL_GARR_BUILDING_LOCALE);
GarrBuildingPlotInstStorage = DB6Reader.Read<GarrBuildingPlotInstRecord>("GarrBuildingPlotInst.db2", DB6Metas.GarrBuildingPlotInstMeta, HotfixStatements.SEL_GARR_BUILDING_PLOT_INST);
GarrClassSpecStorage = DB6Reader.Read<GarrClassSpecRecord>("GarrClassSpec.db2", DB6Metas.GarrClassSpecMeta, HotfixStatements.SEL_GARR_CLASS_SPEC, HotfixStatements.SEL_GARR_CLASS_SPEC_LOCALE);
GarrFollowerStorage = DB6Reader.Read<GarrFollowerRecord>("GarrFollower.db2", DB6Metas.GarrFollowerMeta, HotfixStatements.SEL_GARR_FOLLOWER, HotfixStatements.SEL_GARR_FOLLOWER_LOCALE);
GarrFollowerXAbilityStorage = DB6Reader.Read<GarrFollowerXAbilityRecord>("GarrFollowerXAbility.db2", DB6Metas.GarrFollowerXAbilityMeta, HotfixStatements.SEL_GARR_FOLLOWER_X_ABILITY);
GarrPlotBuildingStorage = DB6Reader.Read<GarrPlotBuildingRecord>("GarrPlotBuilding.db2", DB6Metas.GarrPlotBuildingMeta, HotfixStatements.SEL_GARR_PLOT_BUILDING);
GarrPlotStorage = DB6Reader.Read<GarrPlotRecord>("GarrPlot.db2", DB6Metas.GarrPlotMeta, HotfixStatements.SEL_GARR_PLOT, HotfixStatements.SEL_GARR_PLOT_LOCALE);
GarrPlotInstanceStorage = DB6Reader.Read<GarrPlotInstanceRecord>("GarrPlotInstance.db2", DB6Metas.GarrPlotInstanceMeta, HotfixStatements.SEL_GARR_PLOT_INSTANCE, HotfixStatements.SEL_GARR_PLOT_INSTANCE_LOCALE);
GarrSiteLevelStorage = DB6Reader.Read<GarrSiteLevelRecord>("GarrSiteLevel.db2", DB6Metas.GarrSiteLevelMeta, HotfixStatements.SEL_GARR_SITE_LEVEL);
GarrSiteLevelPlotInstStorage = DB6Reader.Read<GarrSiteLevelPlotInstRecord>("GarrSiteLevelPlotInst.db2", DB6Metas.GarrSiteLevelPlotInstMeta, HotfixStatements.SEL_GARR_SITE_LEVEL_PLOT_INST);
GemPropertiesStorage = DB6Reader.Read<GemPropertiesRecord>("GemProperties.db2", DB6Metas.GemPropertiesMeta, HotfixStatements.SEL_GEM_PROPERTIES);
GlyphBindableSpellStorage = DB6Reader.Read<GlyphBindableSpellRecord>("GlyphBindableSpell.db2", DB6Metas.GlyphBindableSpellMeta, HotfixStatements.SEL_GLYPH_BINDABLE_SPELL);
GlyphPropertiesStorage = DB6Reader.Read<GlyphPropertiesRecord>("GlyphProperties.db2", DB6Metas.GlyphPropertiesMeta, HotfixStatements.SEL_GLYPH_PROPERTIES);
GlyphRequiredSpecStorage = DB6Reader.Read<GlyphRequiredSpecRecord>("GlyphRequiredSpec.db2", DB6Metas.GlyphRequiredSpecMeta, HotfixStatements.SEL_GLYPH_REQUIRED_SPEC);
GuildColorBackgroundStorage = DB6Reader.Read<GuildColorBackgroundRecord>("GuildColorBackground.db2", DB6Metas.GuildColorBackgroundMeta, HotfixStatements.SEL_GUILD_COLOR_BACKGROUND);
GuildColorBorderStorage = DB6Reader.Read<GuildColorBorderRecord>("GuildColorBorder.db2", DB6Metas.GuildColorBorderMeta, HotfixStatements.SEL_GUILD_COLOR_BORDER);
GuildColorEmblemStorage = DB6Reader.Read<GuildColorEmblemRecord>("GuildColorEmblem.db2", DB6Metas.GuildColorEmblemMeta, HotfixStatements.SEL_GUILD_COLOR_EMBLEM);
GuildPerkSpellsStorage = DB6Reader.Read<GuildPerkSpellsRecord>("GuildPerkSpells.db2", DB6Metas.GuildPerkSpellsMeta, HotfixStatements.SEL_GUILD_PERK_SPELLS);
HeirloomStorage = DB6Reader.Read<HeirloomRecord>("Heirloom.db2", DB6Metas.HeirloomMeta, HotfixStatements.SEL_HEIRLOOM, HotfixStatements.SEL_HEIRLOOM_LOCALE);
HolidaysStorage = DB6Reader.Read<HolidaysRecord>("Holidays.db2", DB6Metas.HolidaysMeta, HotfixStatements.SEL_HOLIDAYS);
ImportPriceArmorStorage = DB6Reader.Read<ImportPriceArmorRecord>("ImportPriceArmor.db2", DB6Metas.ImportPriceArmorMeta, HotfixStatements.SEL_IMPORT_PRICE_ARMOR);
ImportPriceQualityStorage = DB6Reader.Read<ImportPriceQualityRecord>("ImportPriceQuality.db2", DB6Metas.ImportPriceQualityMeta, HotfixStatements.SEL_IMPORT_PRICE_QUALITY);
ImportPriceShieldStorage = DB6Reader.Read<ImportPriceShieldRecord>("ImportPriceShield.db2", DB6Metas.ImportPriceShieldMeta, HotfixStatements.SEL_IMPORT_PRICE_SHIELD);
ImportPriceWeaponStorage = DB6Reader.Read<ImportPriceWeaponRecord>("ImportPriceWeapon.db2", DB6Metas.ImportPriceWeaponMeta, HotfixStatements.SEL_IMPORT_PRICE_WEAPON);
ItemAppearanceStorage = DB6Reader.Read<ItemAppearanceRecord>("ItemAppearance.db2", DB6Metas.ItemAppearanceMeta, HotfixStatements.SEL_ITEM_APPEARANCE);
ItemArmorQualityStorage = DB6Reader.Read<ItemArmorQualityRecord>("ItemArmorQuality.db2", DB6Metas.ItemArmorQualityMeta, HotfixStatements.SEL_ITEM_ARMOR_QUALITY);
ItemArmorShieldStorage = DB6Reader.Read<ItemArmorShieldRecord>("ItemArmorShield.db2", DB6Metas.ItemArmorShieldMeta, HotfixStatements.SEL_ITEM_ARMOR_SHIELD);
ItemArmorTotalStorage = DB6Reader.Read<ItemArmorTotalRecord>("ItemArmorTotal.db2", DB6Metas.ItemArmorTotalMeta, HotfixStatements.SEL_ITEM_ARMOR_TOTAL);
//ItemBagFamilyStorage = DB6Reader.Read<ItemBagFamilyRecord>("ItemBagFamily.db2", DB6Metas.ItemBagFamilyMeta, HotfixStatements.SEL_ITEM_BAG_FAMILY, HotfixStatements.SEL_ITEM_BAG_FAMILY_LOCALE);
ItemBonusStorage = DB6Reader.Read<ItemBonusRecord>("ItemBonus.db2", DB6Metas.ItemBonusMeta, HotfixStatements.SEL_ITEM_BONUS);
ItemBonusListLevelDeltaStorage = DB6Reader.Read<ItemBonusListLevelDeltaRecord>("ItemBonusListLevelDelta.db2", DB6Metas.ItemBonusListLevelDeltaMeta, HotfixStatements.SEL_ITEM_BONUS_LIST_LEVEL_DELTA);
ItemBonusTreeNodeStorage = DB6Reader.Read<ItemBonusTreeNodeRecord>("ItemBonusTreeNode.db2", DB6Metas.ItemBonusTreeNodeMeta, HotfixStatements.SEL_ITEM_BONUS_TREE_NODE);
ItemChildEquipmentStorage = DB6Reader.Read<ItemChildEquipmentRecord>("ItemChildEquipment.db2", DB6Metas.ItemChildEquipmentMeta, HotfixStatements.SEL_ITEM_CHILD_EQUIPMENT);
ItemClassStorage = DB6Reader.Read<ItemClassRecord>("ItemClass.db2", DB6Metas.ItemClassMeta, HotfixStatements.SEL_ITEM_CLASS, HotfixStatements.SEL_ITEM_CLASS_LOCALE);
ItemCurrencyCostStorage = DB6Reader.Read<ItemCurrencyCostRecord>("ItemCurrencyCost.db2", DB6Metas.ItemCurrencyCostMeta, HotfixStatements.SEL_ITEM_CURRENCY_COST);
ItemDamageAmmoStorage = DB6Reader.Read<ItemDamageRecord>("ItemDamageAmmo.db2", DB6Metas.ItemDamageAmmoMeta, HotfixStatements.SEL_ITEM_DAMAGE_AMMO);
ItemDamageOneHandStorage = DB6Reader.Read<ItemDamageRecord>("ItemDamageOneHand.db2", DB6Metas.ItemDamageOneHandMeta, HotfixStatements.SEL_ITEM_DAMAGE_ONE_HAND);
ItemDamageOneHandCasterStorage = DB6Reader.Read<ItemDamageRecord>("ItemDamageOneHandCaster.db2", DB6Metas.ItemDamageOneHandCasterMeta, HotfixStatements.SEL_ITEM_DAMAGE_ONE_HAND_CASTER);
ItemDamageTwoHandStorage = DB6Reader.Read<ItemDamageRecord>("ItemDamageTwoHand.db2", DB6Metas.ItemDamageTwoHandMeta, HotfixStatements.SEL_ITEM_DAMAGE_TWO_HAND);
ItemDamageTwoHandCasterStorage = DB6Reader.Read<ItemDamageRecord>("ItemDamageTwoHandCaster.db2", DB6Metas.ItemDamageTwoHandCasterMeta, HotfixStatements.SEL_ITEM_DAMAGE_TWO_HAND_CASTER);
ItemDisenchantLootStorage = DB6Reader.Read<ItemDisenchantLootRecord>("ItemDisenchantLoot.db2", DB6Metas.ItemDisenchantLootMeta, HotfixStatements.SEL_ITEM_DISENCHANT_LOOT);
ItemEffectStorage = DB6Reader.Read<ItemEffectRecord>("ItemEffect.db2", DB6Metas.ItemEffectMeta, HotfixStatements.SEL_ITEM_EFFECT);
ItemStorage = DB6Reader.Read<ItemRecord>("Item.db2", DB6Metas.ItemMeta, HotfixStatements.SEL_ITEM);
ItemExtendedCostStorage = DB6Reader.Read<ItemExtendedCostRecord>("ItemExtendedCost.db2", DB6Metas.ItemExtendedCostMeta, HotfixStatements.SEL_ITEM_EXTENDED_COST);
ItemLevelSelectorStorage = DB6Reader.Read<ItemLevelSelectorRecord>("ItemLevelSelector.db2", DB6Metas.ItemLevelSelectorMeta, HotfixStatements.SEL_ITEM_LEVEL_SELECTOR);
ItemLimitCategoryStorage = DB6Reader.Read<ItemLimitCategoryRecord>("ItemLimitCategory.db2", DB6Metas.ItemLimitCategoryMeta, HotfixStatements.SEL_ITEM_LIMIT_CATEGORY, HotfixStatements.SEL_ITEM_LIMIT_CATEGORY_LOCALE);
ItemModifiedAppearanceStorage = DB6Reader.Read<ItemModifiedAppearanceRecord>("ItemModifiedAppearance.db2", DB6Metas.ItemModifiedAppearanceMeta, HotfixStatements.SEL_ITEM_MODIFIED_APPEARANCE);
ItemPriceBaseStorage = DB6Reader.Read<ItemPriceBaseRecord>("ItemPriceBase.db2", DB6Metas.ItemPriceBaseMeta, HotfixStatements.SEL_ITEM_PRICE_BASE);
ItemRandomPropertiesStorage = DB6Reader.Read<ItemRandomPropertiesRecord>("ItemRandomProperties.db2", DB6Metas.ItemRandomPropertiesMeta, HotfixStatements.SEL_ITEM_RANDOM_PROPERTIES, HotfixStatements.SEL_ITEM_RANDOM_PROPERTIES_LOCALE);
ItemRandomSuffixStorage = DB6Reader.Read<ItemRandomSuffixRecord>("ItemRandomSuffix.db2", DB6Metas.ItemRandomSuffixMeta, HotfixStatements.SEL_ITEM_RANDOM_SUFFIX, HotfixStatements.SEL_ITEM_RANDOM_SUFFIX_LOCALE);
ItemSearchNameStorage = DB6Reader.Read<ItemSearchNameRecord>("ItemSearchName.db2", DB6Metas.ItemSearchNameMeta, HotfixStatements.SEL_ITEM_SEARCH_NAME, HotfixStatements.SEL_ITEM_SEARCH_NAME_LOCALE);
ItemSetStorage = DB6Reader.Read<ItemSetRecord>("ItemSet.db2", DB6Metas.ItemSetMeta, HotfixStatements.SEL_ITEM_SET, HotfixStatements.SEL_ITEM_SET_LOCALE);
ItemSetSpellStorage = DB6Reader.Read<ItemSetSpellRecord>("ItemSetSpell.db2", DB6Metas.ItemSetSpellMeta, HotfixStatements.SEL_ITEM_SET_SPELL);
ItemSparseStorage = DB6Reader.Read<ItemSparseRecord>("ItemSparse.db2", DB6Metas.ItemSparseMeta, HotfixStatements.SEL_ITEM_SPARSE, HotfixStatements.SEL_ITEM_SPARSE_LOCALE);
ItemSpecStorage = DB6Reader.Read<ItemSpecRecord>("ItemSpec.db2", DB6Metas.ItemSpecMeta, HotfixStatements.SEL_ITEM_SPEC);
ItemSpecOverrideStorage = DB6Reader.Read<ItemSpecOverrideRecord>("ItemSpecOverride.db2", DB6Metas.ItemSpecOverrideMeta, HotfixStatements.SEL_ITEM_SPEC_OVERRIDE);
ItemUpgradeStorage = DB6Reader.Read<ItemUpgradeRecord>("ItemUpgrade.db2", DB6Metas.ItemUpgradeMeta, HotfixStatements.SEL_ITEM_UPGRADE);
ItemXBonusTreeStorage = DB6Reader.Read<ItemXBonusTreeRecord>("ItemXBonusTree.db2", DB6Metas.ItemXBonusTreeMeta, HotfixStatements.SEL_ITEM_X_BONUS_TREE);
//KeyChainStorage = DB6Reader.Read<KeyChainRecord>("KeyChain.db2", DB6Metas.KeyChainMeta, HotfixStatements.SEL_KEY_CHAIN);
LfgDungeonsStorage = DB6Reader.Read<LfgDungeonsRecord>("LfgDungeons.db2", DB6Metas.LfgDungeonsMeta, HotfixStatements.SEL_LFG_DUNGEONS, HotfixStatements.SEL_LFG_DUNGEONS_LOCALE);
LightStorage = DB6Reader.Read<LightRecord>("Light.db2", DB6Metas.LightMeta, HotfixStatements.SEL_LIGHT);
LiquidTypeStorage = DB6Reader.Read<LiquidTypeRecord>("LiquidType.db2", DB6Metas.LiquidTypeMeta, HotfixStatements.SEL_LIQUID_TYPE, HotfixStatements.SEL_LIQUID_TYPE_LOCALE);
LockStorage = DB6Reader.Read<LockRecord>("Lock.db2", DB6Metas.LockMeta, HotfixStatements.SEL_LOCK);
MailTemplateStorage = DB6Reader.Read<MailTemplateRecord>("MailTemplate.db2", DB6Metas.MailTemplateMeta, HotfixStatements.SEL_MAIL_TEMPLATE, HotfixStatements.SEL_MAIL_TEMPLATE_LOCALE);
MapStorage = DB6Reader.Read<MapRecord>("Map.db2", DB6Metas.MapMeta, HotfixStatements.SEL_MAP, HotfixStatements.SEL_MAP_LOCALE);
MapDifficultyStorage = DB6Reader.Read<MapDifficultyRecord>("MapDifficulty.db2", DB6Metas.MapDifficultyMeta, HotfixStatements.SEL_MAP_DIFFICULTY, HotfixStatements.SEL_MAP_DIFFICULTY_LOCALE);
ModifierTreeStorage = DB6Reader.Read<ModifierTreeRecord>("ModifierTree.db2", DB6Metas.ModifierTreeMeta, HotfixStatements.SEL_MODIFIER_TREE);
MountCapabilityStorage = DB6Reader.Read<MountCapabilityRecord>("MountCapability.db2", DB6Metas.MountCapabilityMeta, HotfixStatements.SEL_MOUNT_CAPABILITY);
MountStorage = DB6Reader.Read<MountRecord>("Mount.db2", DB6Metas.MountMeta, HotfixStatements.SEL_MOUNT, HotfixStatements.SEL_MOUNT_LOCALE);
MountTypeXCapabilityStorage = DB6Reader.Read<MountTypeXCapabilityRecord>("MountTypeXCapability.db2", DB6Metas.MountTypeXCapabilityMeta, HotfixStatements.SEL_MOUNT_TYPE_X_CAPABILITY);
MountXDisplayStorage = DB6Reader.Read<MountXDisplayRecord>("MountXDisplay.db2", DB6Metas.MountXDisplayMeta, HotfixStatements.SEL_MOUNT_X_DISPLAY);
MovieStorage = DB6Reader.Read<MovieRecord>("Movie.db2", DB6Metas.MovieMeta, HotfixStatements.SEL_MOVIE);
NameGenStorage = DB6Reader.Read<NameGenRecord>("NameGen.db2", DB6Metas.NameGenMeta, HotfixStatements.SEL_NAME_GEN, HotfixStatements.SEL_NAME_GEN_LOCALE);
NamesProfanityStorage = DB6Reader.Read<NamesProfanityRecord>("NamesProfanity.db2", DB6Metas.NamesProfanityMeta, HotfixStatements.SEL_NAMES_PROFANITY);
NamesReservedStorage = DB6Reader.Read<NamesReservedRecord>("NamesReserved.db2", DB6Metas.NamesReservedMeta, HotfixStatements.SEL_NAMES_RESERVED, HotfixStatements.SEL_NAMES_RESERVED_LOCALE);
NamesReservedLocaleStorage = DB6Reader.Read<NamesReservedLocaleRecord>("NamesReservedLocale.db2", DB6Metas.NamesReservedLocaleMeta, HotfixStatements.SEL_NAMES_RESERVED_LOCALE);
OverrideSpellDataStorage = DB6Reader.Read<OverrideSpellDataRecord>("OverrideSpellData.db2", DB6Metas.OverrideSpellDataMeta, HotfixStatements.SEL_OVERRIDE_SPELL_DATA);
PhaseStorage = DB6Reader.Read<PhaseRecord>("Phase.db2", DB6Metas.PhaseMeta, HotfixStatements.SEL_PHASE);
PhaseXPhaseGroupStorage = DB6Reader.Read<PhaseXPhaseGroupRecord>("PhaseXPhaseGroup.db2", DB6Metas.PhaseXPhaseGroupMeta, HotfixStatements.SEL_PHASE_X_PHASE_GROUP);
PlayerConditionStorage = DB6Reader.Read<PlayerConditionRecord>("PlayerCondition.db2", DB6Metas.PlayerConditionMeta, HotfixStatements.SEL_PLAYER_CONDITION, HotfixStatements.SEL_PLAYER_CONDITION_LOCALE);
PowerDisplayStorage = DB6Reader.Read<PowerDisplayRecord>("PowerDisplay.db2", DB6Metas.PowerDisplayMeta, HotfixStatements.SEL_POWER_DISPLAY);
PowerTypeStorage = DB6Reader.Read<PowerTypeRecord>("PowerType.db2", DB6Metas.PowerTypeMeta, HotfixStatements.SEL_POWER_TYPE);
PrestigeLevelInfoStorage = DB6Reader.Read<PrestigeLevelInfoRecord>("PrestigeLevelInfo.db2", DB6Metas.PrestigeLevelInfoMeta, HotfixStatements.SEL_PRESTIGE_LEVEL_INFO, HotfixStatements.SEL_PRESTIGE_LEVEL_INFO_LOCALE);
PvpDifficultyStorage = DB6Reader.Read<PvpDifficultyRecord>("PvpDifficulty.db2", DB6Metas.PvpDifficultyMeta, HotfixStatements.SEL_PVP_DIFFICULTY);
PvpRewardStorage = DB6Reader.Read<PvpRewardRecord>("PvpReward.db2", DB6Metas.PvpRewardMeta, HotfixStatements.SEL_PVP_REWARD);
QuestFactionRewardStorage = DB6Reader.Read<QuestFactionRewardRecord>("QuestFactionReward.db2", DB6Metas.QuestFactionRewardMeta, HotfixStatements.SEL_QUEST_FACTION_REWARD);
QuestMoneyRewardStorage = DB6Reader.Read<QuestMoneyRewardRecord>("QuestMoneyReward.db2", DB6Metas.QuestMoneyRewardMeta, HotfixStatements.SEL_QUEST_MONEY_REWARD);
QuestPackageItemStorage = DB6Reader.Read<QuestPackageItemRecord>("QuestPackageItem.db2", DB6Metas.QuestPackageItemMeta, HotfixStatements.SEL_QUEST_PACKAGE_ITEM);
QuestSortStorage = DB6Reader.Read<QuestSortRecord>("QuestSort.db2", DB6Metas.QuestSortMeta, HotfixStatements.SEL_QUEST_SORT, HotfixStatements.SEL_QUEST_SORT_LOCALE);
QuestV2Storage = DB6Reader.Read<QuestV2Record>("QuestV2.db2", DB6Metas.QuestV2Meta, HotfixStatements.SEL_QUEST_V2);
QuestXPStorage = DB6Reader.Read<QuestXPRecord>("QuestXP.db2", DB6Metas.QuestXPMeta, HotfixStatements.SEL_QUEST_XP);
RandPropPointsStorage = DB6Reader.Read<RandPropPointsRecord>("RandPropPoints.db2", DB6Metas.RandPropPointsMeta, HotfixStatements.SEL_RAND_PROP_POINTS);
RewardPackStorage = DB6Reader.Read<RewardPackRecord>("RewardPack.db2", DB6Metas.RewardPackMeta, HotfixStatements.SEL_REWARD_PACK);
RewardPackXItemStorage = DB6Reader.Read<RewardPackXItemRecord>("RewardPackXItem.db2", DB6Metas.RewardPackXItemMeta, HotfixStatements.SEL_REWARD_PACK_X_ITEM);
RulesetItemUpgradeStorage = DB6Reader.Read<RulesetItemUpgradeRecord>("RulesetItemUpgrade.db2", DB6Metas.RulesetItemUpgradeMeta, HotfixStatements.SEL_RULESET_ITEM_UPGRADE);
ScalingStatDistributionStorage = DB6Reader.Read<ScalingStatDistributionRecord>("ScalingStatDistribution.db2", DB6Metas.ScalingStatDistributionMeta, HotfixStatements.SEL_SCALING_STAT_DISTRIBUTION);
ScenarioStorage = DB6Reader.Read<ScenarioRecord>("Scenario.db2", DB6Metas.ScenarioMeta, HotfixStatements.SEL_SCENARIO, HotfixStatements.SEL_SCENARIO_LOCALE);
ScenarioStepStorage = DB6Reader.Read<ScenarioStepRecord>("ScenarioStep.db2", DB6Metas.ScenarioStepMeta, HotfixStatements.SEL_SCENARIO_STEP, HotfixStatements.SEL_SCENARIO_STEP_LOCALE);
//SceneScriptStorage = DB6Reader.Read<SceneScriptRecord>("SceneScript.db2", DB6Metas.SceneScriptMeta, HotfixStatements.SEL_SCENE_SCRIPT);
SceneScriptPackageStorage = DB6Reader.Read<SceneScriptPackageRecord>("SceneScriptPackage.db2", DB6Metas.SceneScriptPackageMeta, HotfixStatements.SEL_SCENE_SCRIPT_PACKAGE);
SkillLineStorage = DB6Reader.Read<SkillLineRecord>("SkillLine.db2", DB6Metas.SkillLineMeta, HotfixStatements.SEL_SKILL_LINE, HotfixStatements.SEL_SKILL_LINE_LOCALE);
SkillLineAbilityStorage = DB6Reader.Read<SkillLineAbilityRecord>("SkillLineAbility.db2", DB6Metas.SkillLineAbilityMeta, HotfixStatements.SEL_SKILL_LINE_ABILITY);
SkillRaceClassInfoStorage = DB6Reader.Read<SkillRaceClassInfoRecord>("SkillRaceClassInfo.db2", DB6Metas.SkillRaceClassInfoMeta, HotfixStatements.SEL_SKILL_RACE_CLASS_INFO);
SoundKitStorage = DB6Reader.Read<SoundKitRecord>("SoundKit.db2", DB6Metas.SoundKitMeta, HotfixStatements.SEL_SOUND_KIT, HotfixStatements.SEL_SOUND_KIT_LOCALE);
SpecializationSpellsStorage = DB6Reader.Read<SpecializationSpellsRecord>("SpecializationSpells.db2", DB6Metas.SpecializationSpellsMeta, HotfixStatements.SEL_SPECIALIZATION_SPELLS, HotfixStatements.SEL_SPECIALIZATION_SPELLS_LOCALE);
SpellStorage = DB6Reader.Read<SpellRecord>("Spell.db2", DB6Metas.SpellMeta, HotfixStatements.SEL_SPELL, HotfixStatements.SEL_SPELL_LOCALE);
SpellAuraOptionsStorage = DB6Reader.Read<SpellAuraOptionsRecord>("SpellAuraOptions.db2", DB6Metas.SpellAuraOptionsMeta, HotfixStatements.SEL_SPELL_AURA_OPTIONS);
SpellAuraRestrictionsStorage = DB6Reader.Read<SpellAuraRestrictionsRecord>("SpellAuraRestrictions.db2", DB6Metas.SpellAuraRestrictionsMeta, HotfixStatements.SEL_SPELL_AURA_RESTRICTIONS);
SpellCastTimesStorage = DB6Reader.Read<SpellCastTimesRecord>("SpellCastTimes.db2", DB6Metas.SpellCastTimesMeta, HotfixStatements.SEL_SPELL_CAST_TIMES);
SpellCastingRequirementsStorage = DB6Reader.Read<SpellCastingRequirementsRecord>("SpellCastingRequirements.db2", DB6Metas.SpellCastingRequirementsMeta, HotfixStatements.SEL_SPELL_CASTING_REQUIREMENTS);
SpellCategoriesStorage = DB6Reader.Read<SpellCategoriesRecord>("SpellCategories.db2", DB6Metas.SpellCategoriesMeta, HotfixStatements.SEL_SPELL_CATEGORIES);
SpellCategoryStorage = DB6Reader.Read<SpellCategoryRecord>("SpellCategory.db2", DB6Metas.SpellCategoryMeta, HotfixStatements.SEL_SPELL_CATEGORY, HotfixStatements.SEL_SPELL_CATEGORY_LOCALE);
SpellClassOptionsStorage = DB6Reader.Read<SpellClassOptionsRecord>("SpellClassOptions.db2", DB6Metas.SpellClassOptionsMeta, HotfixStatements.SEL_SPELL_CLASS_OPTIONS);
SpellCooldownsStorage = DB6Reader.Read<SpellCooldownsRecord>("SpellCooldowns.db2", DB6Metas.SpellCooldownsMeta, HotfixStatements.SEL_SPELL_COOLDOWNS);
SpellDurationStorage = DB6Reader.Read<SpellDurationRecord>("SpellDuration.db2", DB6Metas.SpellDurationMeta, HotfixStatements.SEL_SPELL_DURATION);
SpellEffectStorage = DB6Reader.Read<SpellEffectRecord>("SpellEffect.db2", DB6Metas.SpellEffectMeta, HotfixStatements.SEL_SPELL_EFFECT);
SpellEffectScalingStorage = DB6Reader.Read<SpellEffectScalingRecord>("SpellEffectScaling.db2", DB6Metas.SpellEffectScalingMeta, HotfixStatements.SEL_SPELL_EFFECT_SCALING);
SpellEquippedItemsStorage = DB6Reader.Read<SpellEquippedItemsRecord>("SpellEquippedItems.db2", DB6Metas.SpellEquippedItemsMeta, HotfixStatements.SEL_SPELL_EQUIPPED_ITEMS);
SpellFocusObjectStorage = DB6Reader.Read<SpellFocusObjectRecord>("SpellFocusObject.db2", DB6Metas.SpellFocusObjectMeta, HotfixStatements.SEL_SPELL_FOCUS_OBJECT, HotfixStatements.SEL_SPELL_FOCUS_OBJECT_LOCALE);
SpellInterruptsStorage = DB6Reader.Read<SpellInterruptsRecord>("SpellInterrupts.db2", DB6Metas.SpellInterruptsMeta, HotfixStatements.SEL_SPELL_INTERRUPTS);
SpellItemEnchantmentStorage = DB6Reader.Read<SpellItemEnchantmentRecord>("SpellItemEnchantment.db2", DB6Metas.SpellItemEnchantmentMeta, HotfixStatements.SEL_SPELL_ITEM_ENCHANTMENT, HotfixStatements.SEL_SPELL_ITEM_ENCHANTMENT_LOCALE);
SpellItemEnchantmentConditionStorage = DB6Reader.Read<SpellItemEnchantmentConditionRecord>("SpellItemEnchantmentCondition.db2", DB6Metas.SpellItemEnchantmentConditionMeta, HotfixStatements.SEL_SPELL_ITEM_ENCHANTMENT_CONDITION);
SpellLearnSpellStorage = DB6Reader.Read<SpellLearnSpellRecord>("SpellLearnSpell.db2", DB6Metas.SpellLearnSpellMeta, HotfixStatements.SEL_SPELL_LEARN_SPELL);
SpellLevelsStorage = DB6Reader.Read<SpellLevelsRecord>("SpellLevels.db2", DB6Metas.SpellLevelsMeta, HotfixStatements.SEL_SPELL_LEVELS);
SpellMiscStorage = DB6Reader.Read<SpellMiscRecord>("SpellMisc.db2", DB6Metas.SpellMiscMeta, HotfixStatements.SEL_SPELL_MISC);
SpellPowerStorage = DB6Reader.Read<SpellPowerRecord>("SpellPower.db2", DB6Metas.SpellPowerMeta, HotfixStatements.SEL_SPELL_POWER);
SpellPowerDifficultyStorage = DB6Reader.Read<SpellPowerDifficultyRecord>("SpellPowerDifficulty.db2", DB6Metas.SpellPowerDifficultyMeta, HotfixStatements.SEL_SPELL_POWER_DIFFICULTY);
SpellProcsPerMinuteStorage = DB6Reader.Read<SpellProcsPerMinuteRecord>("SpellProcsPerMinute.db2", DB6Metas.SpellProcsPerMinuteMeta, HotfixStatements.SEL_SPELL_PROCS_PER_MINUTE);
SpellProcsPerMinuteModStorage = DB6Reader.Read<SpellProcsPerMinuteModRecord>("SpellProcsPerMinuteMod.db2", DB6Metas.SpellProcsPerMinuteModMeta, HotfixStatements.SEL_SPELL_PROCS_PER_MINUTE_MOD);
SpellRadiusStorage = DB6Reader.Read<SpellRadiusRecord>("SpellRadius.db2", DB6Metas.SpellRadiusMeta, HotfixStatements.SEL_SPELL_RADIUS);
SpellRangeStorage = DB6Reader.Read<SpellRangeRecord>("SpellRange.db2", DB6Metas.SpellRangeMeta, HotfixStatements.SEL_SPELL_RANGE, HotfixStatements.SEL_SPELL_RANGE_LOCALE);
SpellReagentsStorage = DB6Reader.Read<SpellReagentsRecord>("SpellReagents.db2", DB6Metas.SpellReagentsMeta, HotfixStatements.SEL_SPELL_REAGENTS);
SpellScalingStorage = DB6Reader.Read<SpellScalingRecord>("SpellScaling.db2", DB6Metas.SpellScalingMeta, HotfixStatements.SEL_SPELL_SCALING);
SpellShapeshiftStorage = DB6Reader.Read<SpellShapeshiftRecord>("SpellShapeshift.db2", DB6Metas.SpellShapeshiftMeta, HotfixStatements.SEL_SPELL_SHAPESHIFT);
SpellShapeshiftFormStorage = DB6Reader.Read<SpellShapeshiftFormRecord>("SpellShapeshiftForm.db2", DB6Metas.SpellShapeshiftFormMeta, HotfixStatements.SEL_SPELL_SHAPESHIFT_FORM, HotfixStatements.SEL_SPELL_SHAPESHIFT_FORM_LOCALE);
SpellTargetRestrictionsStorage = DB6Reader.Read<SpellTargetRestrictionsRecord>("SpellTargetRestrictions.db2", DB6Metas.SpellTargetRestrictionsMeta, HotfixStatements.SEL_SPELL_TARGET_RESTRICTIONS);
SpellTotemsStorage = DB6Reader.Read<SpellTotemsRecord>("SpellTotems.db2", DB6Metas.SpellTotemsMeta, HotfixStatements.SEL_SPELL_TOTEMS);
SpellXSpellVisualStorage = DB6Reader.Read<SpellXSpellVisualRecord>("SpellXSpellVisual.db2", DB6Metas.SpellXSpellVisualMeta, HotfixStatements.SEL_SPELL_X_SPELL_VISUAL);
SummonPropertiesStorage = DB6Reader.Read<SummonPropertiesRecord>("SummonProperties.db2", DB6Metas.SummonPropertiesMeta, HotfixStatements.SEL_SUMMON_PROPERTIES);
//TactKeyStorage = DB6Reader.Read<TactKeyRecord>("TactKey.db2", DB6Metas.TactKeyMeta, HotfixStatements.SEL_TACT_KEY);
TalentStorage = DB6Reader.Read<TalentRecord>("Talent.db2", DB6Metas.TalentMeta, HotfixStatements.SEL_TALENT, HotfixStatements.SEL_TALENT_LOCALE);
TaxiNodesStorage = DB6Reader.Read<TaxiNodesRecord>("TaxiNodes.db2", DB6Metas.TaxiNodesMeta, HotfixStatements.SEL_TAXI_NODES, HotfixStatements.SEL_TAXI_NODES_LOCALE);
TaxiPathStorage = DB6Reader.Read<TaxiPathRecord>("TaxiPath.db2", DB6Metas.TaxiPathMeta, HotfixStatements.SEL_TAXI_PATH);
TaxiPathNodeStorage = DB6Reader.Read<TaxiPathNodeRecord>("TaxiPathNode.db2", DB6Metas.TaxiPathNodeMeta, HotfixStatements.SEL_TAXI_PATH_NODE);
TotemCategoryStorage = DB6Reader.Read<TotemCategoryRecord>("TotemCategory.db2", DB6Metas.TotemCategoryMeta, HotfixStatements.SEL_TOTEM_CATEGORY, HotfixStatements.SEL_TOTEM_CATEGORY_LOCALE);
ToyStorage = DB6Reader.Read<ToyRecord>("Toy.db2", DB6Metas.ToyMeta, HotfixStatements.SEL_TOY, HotfixStatements.SEL_TOY_LOCALE);
TransmogHolidayStorage = DB6Reader.Read<TransmogHolidayRecord>("TransmogHoliday.db2", DB6Metas.TransmogHolidayMeta, HotfixStatements.SEL_TRANSMOG_HOLIDAY);
TransmogSetStorage = DB6Reader.Read<TransmogSetRecord>("TransmogSet.db2", DB6Metas.TransmogSetMeta, HotfixStatements.SEL_TRANSMOG_SET, HotfixStatements.SEL_TRANSMOG_SET_LOCALE);
TransmogSetGroupStorage = DB6Reader.Read<TransmogSetGroupRecord>("TransmogSetGroup.db2", DB6Metas.TransmogSetGroupMeta, HotfixStatements.SEL_TRANSMOG_SET_GROUP, HotfixStatements.SEL_TRANSMOG_SET_GROUP_LOCALE);
TransmogSetItemStorage = DB6Reader.Read<TransmogSetItemRecord>("TransmogSetItem.db2", DB6Metas.TransmogSetItemMeta, HotfixStatements.SEL_TRANSMOG_SET_ITEM);
TransportAnimationStorage = DB6Reader.Read<TransportAnimationRecord>("TransportAnimation.db2", DB6Metas.TransportAnimationMeta, HotfixStatements.SEL_TRANSPORT_ANIMATION);
TransportRotationStorage = DB6Reader.Read<TransportRotationRecord>("TransportRotation.db2", DB6Metas.TransportRotationMeta, HotfixStatements.SEL_TRANSPORT_ROTATION);
UnitPowerBarStorage = DB6Reader.Read<UnitPowerBarRecord>("UnitPowerBar.db2", DB6Metas.UnitPowerBarMeta, HotfixStatements.SEL_UNIT_POWER_BAR, HotfixStatements.SEL_UNIT_POWER_BAR_LOCALE);
VehicleStorage = DB6Reader.Read<VehicleRecord>("Vehicle.db2", DB6Metas.VehicleMeta, HotfixStatements.SEL_VEHICLE);
VehicleSeatStorage = DB6Reader.Read<VehicleSeatRecord>("VehicleSeat.db2", DB6Metas.VehicleSeatMeta, HotfixStatements.SEL_VEHICLE_SEAT);
WMOAreaTableStorage = DB6Reader.Read<WMOAreaTableRecord>("WMOAreaTable.db2", DB6Metas.WMOAreaTableMeta, HotfixStatements.SEL_WMO_AREA_TABLE, HotfixStatements.SEL_WMO_AREA_TABLE_LOCALE);
WorldMapAreaStorage = DB6Reader.Read<WorldMapAreaRecord>("WorldMapArea.db2", DB6Metas.WorldMapAreaMeta, HotfixStatements.SEL_WORLD_MAP_AREA);
WorldMapOverlayStorage = DB6Reader.Read<WorldMapOverlayRecord>("WorldMapOverlay.db2", DB6Metas.WorldMapOverlayMeta, HotfixStatements.SEL_WORLD_MAP_OVERLAY);
WorldMapTransformsStorage = DB6Reader.Read<WorldMapTransformsRecord>("WorldMapTransforms.db2", DB6Metas.WorldMapTransformsMeta, HotfixStatements.SEL_WORLD_MAP_TRANSFORMS);
WorldSafeLocsStorage = DB6Reader.Read<WorldSafeLocsRecord>("WorldSafeLocs.db2", DB6Metas.WorldSafeLocsMeta, HotfixStatements.SEL_WORLD_SAFE_LOCS, HotfixStatements.SEL_WORLD_SAFE_LOCS_LOCALE);
foreach (var entry in TaxiPathStorage.Values)
{
if (!TaxiPathSetBySource.ContainsKey(entry.From))
TaxiPathSetBySource.Add(entry.From, new Dictionary<uint, TaxiPathBySourceAndDestination>());
TaxiPathSetBySource[entry.From][entry.To] = new TaxiPathBySourceAndDestination(entry.Id, entry.Cost);
}
uint pathCount = TaxiPathStorage.Keys.Max() + 1;
// Calculate path nodes count
uint[] pathLength = new uint[pathCount]; // 0 and some other indexes not used
foreach (TaxiPathNodeRecord entry in CliDB.TaxiPathNodeStorage.Values)
if (pathLength[entry.PathID] < entry.NodeIndex + 1)
pathLength[entry.PathID] = entry.NodeIndex + 1u;
// Set path length
for (uint i = 0; i < pathCount; ++i)
TaxiPathNodesByPath[i] = new TaxiPathNodeRecord[pathLength[i]];
// fill data
foreach (var entry in TaxiPathNodeStorage.Values)
TaxiPathNodesByPath[entry.PathID][entry.NodeIndex] = entry;
TaxiPathNodeStorage = null;
foreach (var node in TaxiNodesStorage.Values)
{
if (!node.Flags.HasAnyFlag(TaxiNodeFlags.Alliance | TaxiNodeFlags.Horde))
continue;
// valid taxi network node
byte field = (byte)((node.Id - 1) / 8);
byte submask = (byte)(1 << (int)((node.Id - 1) % 8));
TaxiNodesMask[field] |= submask;
if (node.Flags.HasAnyFlag(TaxiNodeFlags.Horde))
HordeTaxiNodesMask[field] |= submask;
if (node.Flags.HasAnyFlag(TaxiNodeFlags.Alliance))
AllianceTaxiNodesMask[field] |= submask;
uint nodeMap;
Global.DB2Mgr.DeterminaAlternateMapPosition(node.MapID, node.Pos.X, node.Pos.Y, node.Pos.Z, out nodeMap);
if (nodeMap < 2)
OldContinentsNodesMask[field] |= submask;
}
Global.DB2Mgr.LoadStores();
// Check loaded DB2 files proper version
if (!AreaTableStorage.ContainsKey(8485) || // last area (areaflag) added in 7.0.3 (22594)
!CharTitlesStorage.ContainsKey(486) || // last char title added in 7.0.3 (22594)
!GemPropertiesStorage.ContainsKey(3363) || // last gem property added in 7.0.3 (22594)
!ItemStorage.ContainsKey(142526) || // last item added in 7.0.3 (22594)
!ItemExtendedCostStorage.ContainsKey(6125) || // last item extended cost added in 7.0.3 (22594)
!MapStorage.ContainsKey(1670) || // last map added in 7.0.3 (22594)
!SpellStorage.ContainsKey(231371)) // last spell added in 7.0.3 (22594)
{
Log.outError(LogFilter.Misc, "You have _outdated_ DB2 files. Please extract correct versions from current using client.");
Global.WorldMgr.ShutdownServ(10, ShutdownMask.Force, ShutdownExitCode.Error);
}
Log.outInfo(LogFilter.ServerLoading, "Initialized {0} DB2 data storages in {1} ms", LoadedFileCount, Time.GetMSTimeDiffToNow(oldMSTime));
}
public static void LoadGameTables(string dataPath)
{
uint oldMSTime = Time.GetMSTime();
LoadedFileCount = 0;
DataPath = dataPath + "/gt/";
ArmorMitigationByLvlGameTable = GameTableReader.Read<GtArmorMitigationByLvlRecord>("ArmorMitigationByLvl.txt");
ArtifactKnowledgeMultiplierGameTable = GameTableReader.Read<GtArtifactKnowledgeMultiplierRecord>("ArtifactKnowledgeMultiplier.txt");
ArtifactLevelXPGameTable = GameTableReader.Read<GtArtifactLevelXPRecord>("artifactLevelXP.txt");
BarberShopCostBaseGameTable = GameTableReader.Read<GtBarberShopCostBaseRecord>("BarberShopCostBase.txt");
BaseMPGameTable = GameTableReader.Read<GtBaseMPRecord>("BaseMp.txt");
CombatRatingsGameTable = GameTableReader.Read<GtCombatRatingsRecord>("CombatRatings.txt");
CombatRatingsMultByILvlGameTable = GameTableReader.Read<GtCombatRatingsMultByILvlRecord>("CombatRatingsMultByILvl.txt");
ItemSocketCostPerLevelGameTable = GameTableReader.Read<GtItemSocketCostPerLevelRecord>("ItemSocketCostPerLevel.txt");
HonorLevelGameTable = GameTableReader.Read<GtHonorLevelRecord>("HonorLevel.txt");
HpPerStaGameTable = GameTableReader.Read<GtHpPerStaRecord>("HpPerSta.txt");
NpcDamageByClassGameTable[0] = GameTableReader.Read<GtNpcDamageByClassRecord>("NpcDamageByClass.txt");
NpcDamageByClassGameTable[1] = GameTableReader.Read<GtNpcDamageByClassRecord>("NpcDamageByClassExp1.txt");
NpcDamageByClassGameTable[2] = GameTableReader.Read<GtNpcDamageByClassRecord>("NpcDamageByClassExp2.txt");
NpcDamageByClassGameTable[3] = GameTableReader.Read<GtNpcDamageByClassRecord>("NpcDamageByClassExp3.txt");
NpcDamageByClassGameTable[4] = GameTableReader.Read<GtNpcDamageByClassRecord>("NpcDamageByClassExp4.txt");
NpcDamageByClassGameTable[5] = GameTableReader.Read<GtNpcDamageByClassRecord>("NpcDamageByClassExp5.txt");
NpcDamageByClassGameTable[6] = GameTableReader.Read<GtNpcDamageByClassRecord>("NpcDamageByClassExp6.txt");
NpcManaCostScalerGameTable = GameTableReader.Read<GtNpcManaCostScalerRecord>("NPCManaCostScaler.txt");
NpcTotalHpGameTable[0] = GameTableReader.Read<GtNpcTotalHpRecord>("NpcTotalHp.txt");
NpcTotalHpGameTable[1] = GameTableReader.Read<GtNpcTotalHpRecord>("NpcTotalHpExp1.txt");
NpcTotalHpGameTable[2] = GameTableReader.Read<GtNpcTotalHpRecord>("NpcTotalHpExp2.txt");
NpcTotalHpGameTable[3] = GameTableReader.Read<GtNpcTotalHpRecord>("NpcTotalHpExp3.txt");
NpcTotalHpGameTable[4] = GameTableReader.Read<GtNpcTotalHpRecord>("NpcTotalHpExp4.txt");
NpcTotalHpGameTable[5] = GameTableReader.Read<GtNpcTotalHpRecord>("NpcTotalHpExp5.txt");
NpcTotalHpGameTable[6] = GameTableReader.Read<GtNpcTotalHpRecord>("NpcTotalHpExp6.txt");
SpellScalingGameTable = GameTableReader.Read<GtSpellScalingRecord>("SpellScaling.txt");
XpGameTable = GameTableReader.Read<GtXpRecord>("xp.txt");
Log.outInfo(LogFilter.ServerLoading, "Initialized {0} DBC GameTables data stores in {1} ms", LoadedFileCount, Time.GetMSTimeDiffToNow(oldMSTime));
}
#region Main Collections
public static DB6Storage<AchievementRecord> AchievementStorage;
public static DB6Storage<AnimKitRecord> AnimKitStorage;
public static DB6Storage<AreaGroupMemberRecord> AreaGroupMemberStorage;
public static DB6Storage<AreaTableRecord> AreaTableStorage;
public static DB6Storage<AreaTriggerRecord> AreaTriggerStorage;
public static DB6Storage<ArmorLocationRecord> ArmorLocationStorage;
public static DB6Storage<ArtifactRecord> ArtifactStorage;
public static DB6Storage<ArtifactAppearanceRecord> ArtifactAppearanceStorage;
public static DB6Storage<ArtifactAppearanceSetRecord> ArtifactAppearanceSetStorage;
public static DB6Storage<ArtifactCategoryRecord> ArtifactCategoryStorage;
public static DB6Storage<ArtifactPowerRecord> ArtifactPowerStorage;
public static DB6Storage<ArtifactPowerLinkRecord> ArtifactPowerLinkStorage;
public static DB6Storage<ArtifactPowerPickerRecord> ArtifactPowerPickerStorage;
public static DB6Storage<ArtifactPowerRankRecord> ArtifactPowerRankStorage;
//public static DB6Storage<ArtifactQuestXPRecord> ArtifactQuestXPStorage;
public static DB6Storage<AuctionHouseRecord> AuctionHouseStorage;
public static DB6Storage<BankBagSlotPricesRecord> BankBagSlotPricesStorage;
//public static DB6Storage<BannedAddOnsRecord> BannedAddOnsStorage;
public static DB6Storage<BarberShopStyleRecord> BarberShopStyleStorage;
public static DB6Storage<BattlePetBreedQualityRecord> BattlePetBreedQualityStorage;
public static DB6Storage<BattlePetBreedStateRecord> BattlePetBreedStateStorage;
public static DB6Storage<BattlePetSpeciesRecord> BattlePetSpeciesStorage;
public static DB6Storage<BattlePetSpeciesStateRecord> BattlePetSpeciesStateStorage;
public static DB6Storage<BattlemasterListRecord> BattlemasterListStorage;
public static DB6Storage<BroadcastTextRecord> BroadcastTextStorage;
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<ChatChannelsRecord> ChatChannelsStorage;
public static DB6Storage<ChrClassesRecord> ChrClassesStorage;
public static DB6Storage<ChrClassesXPowerTypesRecord> ChrClassesXPowerTypesStorage;
public static DB6Storage<ChrRacesRecord> ChrRacesStorage;
public static DB6Storage<ChrSpecializationRecord> ChrSpecializationStorage;
public static DB6Storage<CinematicCameraRecord> CinematicCameraStorage;
public static DB6Storage<CinematicSequencesRecord> CinematicSequencesStorage;
public static DB6Storage<ConversationLineRecord> ConversationLineStorage;
public static DB6Storage<CreatureDisplayInfoRecord> CreatureDisplayInfoStorage;
public static DB6Storage<CreatureDisplayInfoExtraRecord> CreatureDisplayInfoExtraStorage;
public static DB6Storage<CreatureFamilyRecord> CreatureFamilyStorage;
public static DB6Storage<CreatureModelDataRecord> CreatureModelDataStorage;
public static DB6Storage<CreatureTypeRecord> CreatureTypeStorage;
public static DB6Storage<CriteriaRecord> CriteriaStorage;
public static DB6Storage<CriteriaTreeRecord> CriteriaTreeStorage;
public static DB6Storage<CurrencyTypesRecord> CurrencyTypesStorage;
public static DB6Storage<CurveRecord> CurveStorage;
public static DB6Storage<CurvePointRecord> CurvePointStorage;
public static DB6Storage<DestructibleModelDataRecord> DestructibleModelDataStorage;
public static DB6Storage<DifficultyRecord> DifficultyStorage;
public static DB6Storage<DungeonEncounterRecord> DungeonEncounterStorage;
public static DB6Storage<DurabilityCostsRecord> DurabilityCostsStorage;
public static DB6Storage<DurabilityQualityRecord> DurabilityQualityStorage;
public static DB6Storage<EmotesRecord> EmotesStorage;
public static DB6Storage<EmotesTextRecord> EmotesTextStorage;
public static DB6Storage<EmotesTextSoundRecord> EmotesTextSoundStorage;
public static DB6Storage<FactionRecord> FactionStorage;
public static DB6Storage<FactionTemplateRecord> FactionTemplateStorage;
public static DB6Storage<GameObjectsRecord> GameObjectsStorage;
public static DB6Storage<GameObjectDisplayInfoRecord> GameObjectDisplayInfoStorage;
public static DB6Storage<GarrAbilityRecord> GarrAbilityStorage;
public static DB6Storage<GarrBuildingRecord> GarrBuildingStorage;
public static DB6Storage<GarrBuildingPlotInstRecord> GarrBuildingPlotInstStorage;
public static DB6Storage<GarrClassSpecRecord> GarrClassSpecStorage;
public static DB6Storage<GarrFollowerRecord> GarrFollowerStorage;
public static DB6Storage<GarrFollowerXAbilityRecord> GarrFollowerXAbilityStorage;
public static DB6Storage<GarrPlotBuildingRecord> GarrPlotBuildingStorage;
public static DB6Storage<GarrPlotRecord> GarrPlotStorage;
public static DB6Storage<GarrPlotInstanceRecord> GarrPlotInstanceStorage;
public static DB6Storage<GarrSiteLevelRecord> GarrSiteLevelStorage;
public static DB6Storage<GarrSiteLevelPlotInstRecord> GarrSiteLevelPlotInstStorage;
public static DB6Storage<GemPropertiesRecord> GemPropertiesStorage;
public static DB6Storage<GlyphBindableSpellRecord> GlyphBindableSpellStorage;
public static DB6Storage<GlyphPropertiesRecord> GlyphPropertiesStorage;
public static DB6Storage<GlyphRequiredSpecRecord> GlyphRequiredSpecStorage;
public static DB6Storage<GuildColorBackgroundRecord> GuildColorBackgroundStorage;
public static DB6Storage<GuildColorBorderRecord> GuildColorBorderStorage;
public static DB6Storage<GuildColorEmblemRecord> GuildColorEmblemStorage;
public static DB6Storage<GuildPerkSpellsRecord> GuildPerkSpellsStorage;
public static DB6Storage<HeirloomRecord> HeirloomStorage;
public static DB6Storage<HolidaysRecord> HolidaysStorage;
public static DB6Storage<ImportPriceArmorRecord> ImportPriceArmorStorage;
public static DB6Storage<ImportPriceQualityRecord> ImportPriceQualityStorage;
public static DB6Storage<ImportPriceShieldRecord> ImportPriceShieldStorage;
public static DB6Storage<ImportPriceWeaponRecord> ImportPriceWeaponStorage;
public static DB6Storage<ItemAppearanceRecord> ItemAppearanceStorage;
public static DB6Storage<ItemArmorQualityRecord> ItemArmorQualityStorage;
public static DB6Storage<ItemArmorShieldRecord> ItemArmorShieldStorage;
public static DB6Storage<ItemArmorTotalRecord> ItemArmorTotalStorage;
//public static DB6Storage<ItemBagFamilyRecord> ItemBagFamilyStorage;
public static DB6Storage<ItemBonusRecord> ItemBonusStorage;
public static DB6Storage<ItemBonusListLevelDeltaRecord> ItemBonusListLevelDeltaStorage;
public static DB6Storage<ItemBonusTreeNodeRecord> ItemBonusTreeNodeStorage;
public static DB6Storage<ItemClassRecord> ItemClassStorage;
public static DB6Storage<ItemChildEquipmentRecord> ItemChildEquipmentStorage;
public static DB6Storage<ItemCurrencyCostRecord> ItemCurrencyCostStorage;
public static DB6Storage<ItemDamageRecord> ItemDamageAmmoStorage;
public static DB6Storage<ItemDamageRecord> ItemDamageOneHandStorage;
public static DB6Storage<ItemDamageRecord> ItemDamageOneHandCasterStorage;
public static DB6Storage<ItemDamageRecord> ItemDamageTwoHandStorage;
public static DB6Storage<ItemDamageRecord> ItemDamageTwoHandCasterStorage;
public static DB6Storage<ItemDisenchantLootRecord> ItemDisenchantLootStorage;
public static DB6Storage<ItemEffectRecord> ItemEffectStorage;
public static DB6Storage<ItemRecord> ItemStorage;
public static DB6Storage<ItemExtendedCostRecord> ItemExtendedCostStorage;
public static DB6Storage<ItemLevelSelectorRecord> ItemLevelSelectorStorage;
public static DB6Storage<ItemLimitCategoryRecord> ItemLimitCategoryStorage;
public static DB6Storage<ItemModifiedAppearanceRecord> ItemModifiedAppearanceStorage;
public static DB6Storage<ItemPriceBaseRecord> ItemPriceBaseStorage;
public static DB6Storage<ItemRandomPropertiesRecord> ItemRandomPropertiesStorage;
public static DB6Storage<ItemRandomSuffixRecord> ItemRandomSuffixStorage;
public static DB6Storage<ItemSearchNameRecord> ItemSearchNameStorage;
public static DB6Storage<ItemSetRecord> ItemSetStorage;
public static DB6Storage<ItemSetSpellRecord> ItemSetSpellStorage;
public static DB6Storage<ItemSparseRecord> ItemSparseStorage;
public static DB6Storage<ItemSpecRecord> ItemSpecStorage;
public static DB6Storage<ItemSpecOverrideRecord> ItemSpecOverrideStorage;
public static DB6Storage<ItemUpgradeRecord> ItemUpgradeStorage;
public static DB6Storage<ItemXBonusTreeRecord> ItemXBonusTreeStorage;
//public static DB6Storage<KeyChainRecord> KeyChainStorage;
public static DB6Storage<LfgDungeonsRecord> LfgDungeonsStorage;
public static DB6Storage<LightRecord> LightStorage;
public static DB6Storage<LiquidTypeRecord> LiquidTypeStorage;
public static DB6Storage<LockRecord> LockStorage;
public static DB6Storage<MailTemplateRecord> MailTemplateStorage;
public static DB6Storage<MapRecord> MapStorage;
public static DB6Storage<MapDifficultyRecord> MapDifficultyStorage;
public static DB6Storage<ModifierTreeRecord> ModifierTreeStorage;
public static DB6Storage<MountCapabilityRecord> MountCapabilityStorage;
public static DB6Storage<MountRecord> MountStorage;
public static DB6Storage<MountTypeXCapabilityRecord> MountTypeXCapabilityStorage;
public static DB6Storage<MountXDisplayRecord> MountXDisplayStorage;
public static DB6Storage<MovieRecord> MovieStorage;
public static DB6Storage<NameGenRecord> NameGenStorage;
public static DB6Storage<NamesProfanityRecord> NamesProfanityStorage;
public static DB6Storage<NamesReservedRecord> NamesReservedStorage;
public static DB6Storage<NamesReservedLocaleRecord> NamesReservedLocaleStorage;
public static DB6Storage<OverrideSpellDataRecord> OverrideSpellDataStorage;
public static DB6Storage<PhaseRecord> PhaseStorage;
public static DB6Storage<PhaseXPhaseGroupRecord> PhaseXPhaseGroupStorage;
public static DB6Storage<PlayerConditionRecord> PlayerConditionStorage;
public static DB6Storage<PowerDisplayRecord> PowerDisplayStorage;
public static DB6Storage<PowerTypeRecord> PowerTypeStorage;
public static DB6Storage<PrestigeLevelInfoRecord> PrestigeLevelInfoStorage;
public static DB6Storage<PvpDifficultyRecord> PvpDifficultyStorage;
public static DB6Storage<PvpRewardRecord> PvpRewardStorage;
public static DB6Storage<QuestFactionRewardRecord> QuestFactionRewardStorage;
public static DB6Storage<QuestMoneyRewardRecord> QuestMoneyRewardStorage;
public static DB6Storage<QuestPackageItemRecord> QuestPackageItemStorage;
public static DB6Storage<QuestSortRecord> QuestSortStorage;
public static DB6Storage<QuestV2Record> QuestV2Storage;
public static DB6Storage<QuestXPRecord> QuestXPStorage;
public static DB6Storage<RandPropPointsRecord> RandPropPointsStorage;
public static DB6Storage<RewardPackRecord> RewardPackStorage;
public static DB6Storage<RewardPackXItemRecord> RewardPackXItemStorage;
public static DB6Storage<RulesetItemUpgradeRecord> RulesetItemUpgradeStorage;
public static DB6Storage<ScalingStatDistributionRecord> ScalingStatDistributionStorage;
public static DB6Storage<ScenarioRecord> ScenarioStorage;
public static DB6Storage<ScenarioStepRecord> ScenarioStepStorage;
//public static DB6Storage<SceneScriptRecord> SceneScriptStorage;
public static DB6Storage<SceneScriptPackageRecord> SceneScriptPackageStorage;
public static DB6Storage<SkillLineRecord> SkillLineStorage;
public static DB6Storage<SkillLineAbilityRecord> SkillLineAbilityStorage;
public static DB6Storage<SkillRaceClassInfoRecord> SkillRaceClassInfoStorage;
public static DB6Storage<SoundKitRecord> SoundKitStorage;
public static DB6Storage<SpecializationSpellsRecord> SpecializationSpellsStorage;
public static DB6Storage<SpellRecord> SpellStorage;
public static DB6Storage<SpellAuraOptionsRecord> SpellAuraOptionsStorage;
public static DB6Storage<SpellAuraRestrictionsRecord> SpellAuraRestrictionsStorage;
public static DB6Storage<SpellCastTimesRecord> SpellCastTimesStorage;
public static DB6Storage<SpellCastingRequirementsRecord> SpellCastingRequirementsStorage;
public static DB6Storage<SpellCategoriesRecord> SpellCategoriesStorage;
public static DB6Storage<SpellCategoryRecord> SpellCategoryStorage;
public static DB6Storage<SpellClassOptionsRecord> SpellClassOptionsStorage;
public static DB6Storage<SpellCooldownsRecord> SpellCooldownsStorage;
public static DB6Storage<SpellDurationRecord> SpellDurationStorage;
public static DB6Storage<SpellEffectRecord> SpellEffectStorage;
public static DB6Storage<SpellEffectScalingRecord> SpellEffectScalingStorage;
public static DB6Storage<SpellEquippedItemsRecord> SpellEquippedItemsStorage;
public static DB6Storage<SpellFocusObjectRecord> SpellFocusObjectStorage;
public static DB6Storage<SpellInterruptsRecord> SpellInterruptsStorage;
public static DB6Storage<SpellItemEnchantmentRecord> SpellItemEnchantmentStorage;
public static DB6Storage<SpellItemEnchantmentConditionRecord> SpellItemEnchantmentConditionStorage;
public static DB6Storage<SpellLearnSpellRecord> SpellLearnSpellStorage;
public static DB6Storage<SpellLevelsRecord> SpellLevelsStorage;
public static DB6Storage<SpellMiscRecord> SpellMiscStorage;
public static DB6Storage<SpellPowerRecord> SpellPowerStorage;
public static DB6Storage<SpellPowerDifficultyRecord> SpellPowerDifficultyStorage;
public static DB6Storage<SpellProcsPerMinuteRecord> SpellProcsPerMinuteStorage;
public static DB6Storage<SpellProcsPerMinuteModRecord> SpellProcsPerMinuteModStorage;
public static DB6Storage<SpellRadiusRecord> SpellRadiusStorage;
public static DB6Storage<SpellRangeRecord> SpellRangeStorage;
public static DB6Storage<SpellReagentsRecord> SpellReagentsStorage;
public static DB6Storage<SpellScalingRecord> SpellScalingStorage;
public static DB6Storage<SpellShapeshiftRecord> SpellShapeshiftStorage;
public static DB6Storage<SpellShapeshiftFormRecord> SpellShapeshiftFormStorage;
public static DB6Storage<SpellTargetRestrictionsRecord> SpellTargetRestrictionsStorage;
public static DB6Storage<SpellTotemsRecord> SpellTotemsStorage;
public static DB6Storage<SpellXSpellVisualRecord> SpellXSpellVisualStorage;
public static DB6Storage<SummonPropertiesRecord> SummonPropertiesStorage;
//public static DB6Storage<TactKeyRecord> TactKeyStorage;
public static DB6Storage<TalentRecord> TalentStorage;
public static DB6Storage<TaxiNodesRecord> TaxiNodesStorage;
public static DB6Storage<TaxiPathRecord> TaxiPathStorage;
public static DB6Storage<TaxiPathNodeRecord> TaxiPathNodeStorage;
public static DB6Storage<TotemCategoryRecord> TotemCategoryStorage;
public static DB6Storage<ToyRecord> ToyStorage;
public static DB6Storage<TransmogHolidayRecord> TransmogHolidayStorage;
public static DB6Storage<TransmogSetRecord> TransmogSetStorage;
public static DB6Storage<TransmogSetGroupRecord> TransmogSetGroupStorage;
public static DB6Storage<TransmogSetItemRecord> TransmogSetItemStorage;
public static DB6Storage<TransportAnimationRecord> TransportAnimationStorage;
public static DB6Storage<TransportRotationRecord> TransportRotationStorage;
public static DB6Storage<UnitPowerBarRecord> UnitPowerBarStorage;
public static DB6Storage<VehicleRecord> VehicleStorage;
public static DB6Storage<VehicleSeatRecord> VehicleSeatStorage;
public static DB6Storage<WMOAreaTableRecord> WMOAreaTableStorage;
public static DB6Storage<WorldMapAreaRecord> WorldMapAreaStorage;
public static DB6Storage<WorldMapOverlayRecord> WorldMapOverlayStorage;
public static DB6Storage<WorldMapTransformsRecord> WorldMapTransformsStorage;
public static DB6Storage<WorldSafeLocsRecord> WorldSafeLocsStorage;
#endregion
#region GameTables
public static GameTable<GtArmorMitigationByLvlRecord> ArmorMitigationByLvlGameTable;
public static GameTable<GtArtifactKnowledgeMultiplierRecord> ArtifactKnowledgeMultiplierGameTable;
public static GameTable<GtArtifactLevelXPRecord> ArtifactLevelXPGameTable;
public static GameTable<GtBarberShopCostBaseRecord> BarberShopCostBaseGameTable;
public static GameTable<GtBaseMPRecord> BaseMPGameTable;
public static GameTable<GtCombatRatingsRecord> CombatRatingsGameTable;
public static GameTable<GtCombatRatingsMultByILvlRecord> CombatRatingsMultByILvlGameTable;
public static GameTable<GtHonorLevelRecord> HonorLevelGameTable;
public static GameTable<GtHpPerStaRecord> HpPerStaGameTable;
public static GameTable<GtItemSocketCostPerLevelRecord> ItemSocketCostPerLevelGameTable;
public static GameTable<GtNpcDamageByClassRecord>[] NpcDamageByClassGameTable = new GameTable<GtNpcDamageByClassRecord>[(int)Expansion.Max];
public static GameTable<GtNpcManaCostScalerRecord> NpcManaCostScalerGameTable;
public static GameTable<GtNpcTotalHpRecord>[] NpcTotalHpGameTable = new GameTable<GtNpcTotalHpRecord>[(int)Expansion.Max];
public static GameTable<GtSpellScalingRecord> SpellScalingGameTable;
public static GameTable<GtXpRecord> XpGameTable;
#endregion
#region Taxi Collections
public static byte[] TaxiNodesMask = new byte[PlayerConst.TaxiMaskSize];
public static byte[] OldContinentsNodesMask = new byte[PlayerConst.TaxiMaskSize];
public static byte[] HordeTaxiNodesMask = new byte[PlayerConst.TaxiMaskSize];
public static byte[] AllianceTaxiNodesMask = new byte[PlayerConst.TaxiMaskSize];
public static Dictionary<uint, Dictionary<uint, TaxiPathBySourceAndDestination>> TaxiPathSetBySource = new Dictionary<uint, Dictionary<uint, TaxiPathBySourceAndDestination>>();
public static Dictionary<uint, TaxiPathNodeRecord[]> TaxiPathNodesByPath = new Dictionary<uint, TaxiPathNodeRecord[]>();
#endregion
#region Helper Methods
public static float GetGameTableColumnForClass(dynamic row, Class class_)
{
switch (class_)
{
case Class.Warrior:
return row.Warrior;
case Class.Paladin:
return row.Paladin;
case Class.Hunter:
return row.Hunter;
case Class.Rogue:
return row.Rogue;
case Class.Priest:
return row.Priest;
case Class.Deathknight:
return row.DeathKnight;
case Class.Shaman:
return row.Shaman;
case Class.Mage:
return row.Mage;
case Class.Warlock:
return row.Warlock;
case Class.Monk:
return row.Monk;
case Class.Druid:
return row.Druid;
case Class.DemonHunter:
return row.DemonHunter;
default:
break;
}
return 0.0f;
}
public static float GetSpellScalingColumnForClass(GtSpellScalingRecord row, int class_)
{
switch (class_)
{
case (int)Class.Warrior:
return row.Warrior;
case (int)Class.Paladin:
return row.Paladin;
case (int)Class.Hunter:
return row.Hunter;
case (int)Class.Rogue:
return row.Rogue;
case (int)Class.Priest:
return row.Priest;
case (int)Class.Deathknight:
return row.DeathKnight;
case (int)Class.Shaman:
return row.Shaman;
case (int)Class.Mage:
return row.Mage;
case (int)Class.Warlock:
return row.Warlock;
case (int)Class.Monk:
return row.Monk;
case (int)Class.Druid:
return row.Druid;
case (int)Class.DemonHunter:
return row.DemonHunter;
case -1:
return row.Item;
case -2:
return row.Consumable;
case -3:
return row.Gem1;
case -4:
return row.Gem2;
case -5:
return row.Gem3;
case -6:
return row.Health;
default:
break;
}
return 0.0f;
}
#endregion
}
}
@@ -0,0 +1,760 @@
/*
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
using Framework.Collections;
using Framework.Constants;
using Framework.Database;
using Framework.Dynamic;
using Framework.GameMath;
using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
namespace Game.DataStorage
{
public class DB6Reader
{
internal static DB6Storage<T> Read<T>(string fileName, DB6Meta meta, HotfixStatements preparedStatement, HotfixStatements preparedStatementLocale = 0) where T : new()
{
DB6Storage<T> storage = new DB6Storage<T>();
if (!File.Exists(CliDB.DataPath + fileName))
{
Log.outError(LogFilter.ServerLoading, "File {0} not found.", fileName);
return storage;
}
//First lets load field Info
var fields = typeof(T).GetFields();
DBClientHelper[] fieldsInfo = new DBClientHelper[fields.Length];
for (var i = 0; i < fields.Length; ++i)
fieldsInfo[i] = new DBClientHelper(fields[i]);
using (var fileReader = new BinaryReader(new MemoryStream(File.ReadAllBytes(CliDB.DataPath + fileName))))
{
_header = ReadHeader(fileReader);
var data = LoadData(fileReader);
int commonDataFieldIndex = 0;
foreach (var pair in data)
{
var dataReader = new DB6BinaryReader(pair.Value);
var obj = new T();
int fieldIndex = 0;
for (var x = 0; x < _header.FieldCount; ++x)
{
int arrayLength = meta.ArraySizes[x];
if (arrayLength > 1)
{
for (var z = 0; z < arrayLength; ++z)
{
var fieldInfo = fieldsInfo[fieldIndex++];
if (fieldInfo.IsArray)
{
//Field is Array
Array array = (Array)fieldInfo.Getter(obj);
for (var y = 0; y < array.Length; ++y)
SetArrayValue(array, y, fieldInfo, dataReader, x);
arrayLength -= array.Length;
}
else
{
//Only Data is Array
if (Type.GetTypeCode(fieldInfo.FieldType) == TypeCode.Object)
{
switch (fieldInfo.FieldType.Name)
{
case "Vector2":
fieldInfo.SetValue(obj, new Vector2(dataReader.ReadSingle(), dataReader.ReadSingle()));
arrayLength -= 2;
break;
case "Vector3":
fieldInfo.SetValue(obj, new Vector3(dataReader.ReadSingle(), dataReader.ReadSingle(), dataReader.ReadSingle()));
arrayLength -= 3;
break;
case "LocalizedString":
LocalizedString locString = new LocalizedString();
locString[Global.WorldMgr.GetDefaultDbcLocale()] = GetString(dataReader, x);
fieldInfo.SetValue(obj, locString);
arrayLength -= 1;
break;
case "FlagArray128":
FlagArray128 flagArray128 = new FlagArray128(dataReader.GetUInt32(_header.GetFieldBytes(x)), dataReader.GetUInt32(_header.GetFieldBytes(x)), dataReader.GetUInt32(_header.GetFieldBytes(x)), dataReader.GetUInt32(_header.GetFieldBytes(x)));
fieldInfo.SetValue(obj, flagArray128);
arrayLength -= 4;
break;
default:
Log.outError(LogFilter.ServerLoading, "Unknown Array Type {0} in DBClient File", fieldInfo.FieldType.Name, nameof(T));
break;
}
}
else
SetValue(obj, fieldInfo, dataReader, x);
}
}
}
else
{
var fieldInfo = fieldsInfo[fieldIndex++];
if (fieldInfo.IsArray)
{
Array array = (Array)fieldInfo.Getter(obj);
for (var y = 0; y < array.Length; ++y)
SetArrayValue(array, y, fieldInfo, dataReader, x + y);
x += array.Length - 1;
}
else
SetValue(obj, fieldInfo, dataReader, x);
}
}
commonDataFieldIndex = fieldIndex;
storage.Add((uint)pair.Key, obj);
}
//Get DB field Index
uint index = 0;
for (uint i = 0; i < _header.FieldCount && i < _header.IndexField; ++i)
index += meta.ArraySizes[i];
ReadCommonData(commonDataFieldIndex, storage, meta, fieldsInfo);
storage.LoadData(index, fieldsInfo, preparedStatement, preparedStatementLocale);
}
Global.DB2Mgr.AddDB2(_header.TableHash, storage);
CliDB.LoadedFileCount++;
return storage;
}
static void ReadCommonData<T>(int fieldIndex, DB6Storage<T> storage, DB6Meta meta, DBClientHelper[] helper) where T : new()
{
for (int x = (int)_header.FieldCount; x < _header.TotalFieldCount; ++x)
{
var fieldInfo = helper[fieldIndex++];
int arrayLength = meta.ArraySizes[x];
foreach (var recordId in _commandData[x])
{
var dataReader = new DB6BinaryReader(recordId.Value);
var record = storage.LookupByKey(recordId.Key);
if (arrayLength > 1)
{
for (var z = 0; z < arrayLength; ++z)
{
if (fieldInfo.IsArray)
{
//Field is Array
Array array = (Array)fieldInfo.Getter(record);
for (var y = 0; y < array.Length; ++y)
SetArrayValue(array, y, fieldInfo, dataReader, x);
arrayLength -= array.Length;
}
else
{
//Only Data is Array
if (Type.GetTypeCode(fieldInfo.FieldType) == TypeCode.Object)
{
Log.outError(LogFilter.Server, "We should not have custom classes in common data");
switch (fieldInfo.FieldType.Name)
{
case "Vector2":
fieldInfo.SetValue(record, new Vector2(dataReader.ReadSingle(), dataReader.ReadSingle()));
arrayLength -= 2;
break;
case "Vector3":
fieldInfo.SetValue(record, new Vector3(dataReader.ReadSingle(), dataReader.ReadSingle(), dataReader.ReadSingle()));
arrayLength -= 3;
break;
case "LocalizedString":
LocalizedString locString = new LocalizedString();
locString[Global.WorldMgr.GetDefaultDbcLocale()] = GetString(dataReader, x);
fieldInfo.SetValue(record, locString);
arrayLength -= 1;
break;
case "FlagArray128":
FlagArray128 flagArray128 = new FlagArray128(dataReader.ReadUInt32(), dataReader.ReadUInt32(), dataReader.ReadUInt32(), dataReader.ReadUInt32());
fieldInfo.SetValue(record, flagArray128);
arrayLength -= 4;
break;
default:
Log.outError(LogFilter.ServerLoading, "Unknown Array Type {0} in DBClient File", fieldInfo.FieldType.Name, nameof(T));
break;
}
}
else
SetValue(record, fieldInfo, dataReader, x);
}
}
}
else
{
if (fieldInfo.IsArray)
{
Array array = (Array)fieldInfo.Getter(record);
for (var y = 0; y < array.Length; ++y)
SetArrayValue(array, y, fieldInfo, dataReader, x + y);
x += array.Length - 1;
}
else
SetValue(record, fieldInfo, dataReader, x);
}
}
}
}
static void SetArrayValue(Array array, int arrayIndex, DBClientHelper helper, DB6BinaryReader reader, int field)
{
switch (Type.GetTypeCode(helper.RealType))
{
case TypeCode.SByte:
helper.SetValue(array, reader.ReadSByte(), arrayIndex);
break;
case TypeCode.Byte:
helper.SetValue(array, reader.ReadByte(), arrayIndex);
break;
case TypeCode.Int16:
helper.SetValue(array, reader.ReadInt16(), arrayIndex);
break;
case TypeCode.UInt16:
helper.SetValue(array, reader.ReadUInt16(), arrayIndex);
break;
case TypeCode.Int32:
helper.SetValue(array, reader.GetInt32(_header.GetFieldBytes(field)), arrayIndex);
break;
case TypeCode.UInt32:
helper.SetValue(array, reader.GetUInt32(_header.GetFieldBytes(field)), arrayIndex);
break;
case TypeCode.Single:
helper.SetValue(array, reader.ReadSingle(), arrayIndex);
break;
case TypeCode.String:
helper.SetValue(array, GetString(reader, field), arrayIndex);
break;
default:
Log.outError(LogFilter.ServerLoading, "Wrong Array Type: {0}", helper.FieldType.Name);
break;
}
}
static void SetValue(object obj, DBClientHelper helper, DB6BinaryReader reader, int field)
{
switch (Type.GetTypeCode(helper.RealType))
{
case TypeCode.SByte:
helper.SetValue(obj, reader.ReadSByte());
break;
case TypeCode.Byte:
helper.SetValue(obj, reader.ReadByte());
break;
case TypeCode.Int16:
helper.SetValue(obj, reader.ReadInt16());
break;
case TypeCode.UInt16:
helper.SetValue(obj, reader.ReadUInt16());
break;
case TypeCode.Int32:
helper.SetValue(obj, reader.GetInt32(_header.GetFieldBytes(field)));
break;
case TypeCode.UInt32:
helper.SetValue(obj, reader.GetUInt32(_header.GetFieldBytes(field)));
break;
case TypeCode.Single:
helper.SetValue(obj, reader.ReadSingle());
break;
case TypeCode.String:
string str = GetString(reader, field);
helper.SetValue(obj, str);
break;
case TypeCode.Object:
switch (helper.FieldType.Name)
{
case "Vector2":
helper.SetValue(obj, new Vector2(reader.ReadSingle(), reader.ReadSingle()));
break;
case "Vector3":
helper.SetValue(obj, new Vector3(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()));
break;
case "LocalizedString":
LocalizedString locString = new LocalizedString();
locString[Global.WorldMgr.GetDefaultDbcLocale()] = GetString(reader, field);
helper.SetValue(obj, locString);
break;
default:
Log.outError(LogFilter.ServerLoading, "Wrong Array Type: {0}", helper.FieldType.Name);
break;
}
break;
default:
Log.outError(LogFilter.ServerLoading, "Wrong Array Type: {0}", helper.FieldType.Name);
break;
}
}
static string GetString(DB6BinaryReader reader, int field)
{
if (_stringTable != null)
return _stringTable.LookupByKey(reader.GetUInt32(_header.GetFieldBytes(field)));
return reader.ReadCString();
}
static DB6Header ReadHeader(BinaryReader reader)
{
DB6Header header = new DB6Header();
header.Signature = reader.ReadStringFromChars(4);
header.RecordCount = reader.ReadUInt32();
header.FieldCount = reader.ReadUInt32();
header.RecordSize = reader.ReadUInt32();
header.StringTableSize = reader.ReadUInt32(); // also offset for sparse table
header.TableHash = reader.ReadUInt32();
header.LayoutHash = reader.ReadUInt32(); // 21737: changed from build number to layoutHash
header.MinId = reader.ReadInt32();
header.MaxId = reader.ReadInt32();
header.Locale = reader.ReadInt32();
header.CopyTableSize = reader.ReadInt32();
header.Flags = reader.ReadUInt16();
header.IndexField = reader.ReadUInt16();
header.TotalFieldCount = reader.ReadUInt32();
header.CommonDataSize = reader.ReadUInt32();
for (int i = 0; i < header.FieldCount; i++)
{
header.columnMeta.Add(new DB6Header.FieldEntry() { UnusedBits = reader.ReadInt16(), Offset = (short)(reader.ReadInt16() + (header.HasIndexTable() ? 4 : 0)) });
}
if (header.HasIndexTable())
{
header.FieldCount++;
header.columnMeta.Insert(0, new DB6Header.FieldEntry());
}
return header;
}
static Dictionary<int, byte[]> LoadData(BinaryReader reader)
{
Dictionary<int, byte[]> Data = new Dictionary<int, byte[]>();
_stringTable = null;
// headerSize
long recordsOffset = 56 + (_header.HasIndexTable() ? _header.FieldCount - 1 : _header.FieldCount) * 4;
long eof = reader.BaseStream.Length;
long commonDataPos = eof - _header.CommonDataSize;
long copyTablePos = commonDataPos - _header.CopyTableSize;
long indexTablePos = copyTablePos - (_header.HasIndexTable() ? _header.RecordCount * 4 : 0);
long stringTablePos = indexTablePos - (_header.IsSparseTable() ? 0 : _header.StringTableSize);
// Index table
int[] m_indexes = null;
if (_header.HasIndexTable())
{
reader.BaseStream.Position = indexTablePos;
m_indexes = new int[_header.RecordCount];
for (int i = 0; i < _header.RecordCount; i++)
m_indexes[i] = reader.ReadInt32();
}
if (_header.IsSparseTable())
{
// Records table
reader.BaseStream.Position = _header.StringTableSize;
int ofsTableSize = _header.MaxId - _header.MinId + 1;
for (int i = 0; i < ofsTableSize; i++)
{
int offset = reader.ReadInt32();
int length = reader.ReadInt16();
if (offset == 0 || length == 0)
continue;
int id = _header.MinId + i;
long oldPos = reader.BaseStream.Position;
reader.BaseStream.Position = offset;
byte[] recordBytes = reader.ReadBytes(length);
byte[] newRecordBytes = new byte[recordBytes.Length + 4];
Array.Copy(BitConverter.GetBytes(id), newRecordBytes, 4);
Array.Copy(recordBytes, 0, newRecordBytes, 4, recordBytes.Length);
Data.Add(id, newRecordBytes);
reader.BaseStream.Position = oldPos;
}
}
else
{
// Records table
reader.BaseStream.Position = recordsOffset;
for (int i = 0; i < _header.RecordCount; i++)
{
reader.BaseStream.Position = recordsOffset + i * _header.RecordSize;
byte[] recordBytes = reader.ReadBytes((int)_header.RecordSize);
if (_header.HasIndexTable())
{
byte[] newRecordBytes = new byte[_header.RecordSize + 4];
Array.Copy(BitConverter.GetBytes(m_indexes[i]), newRecordBytes, 4);
Array.Copy(recordBytes, 0, newRecordBytes, 4, recordBytes.Length);
Data.Add(m_indexes[i], newRecordBytes);
}
else
{
int numBytes = (32 - _header.columnMeta[_header.IndexField].UnusedBits) >> 3;
int offset = _header.columnMeta[_header.IndexField].Offset;
int id = 0;
for (int j = 0; j < numBytes; j++)
id |= (recordBytes[offset + j] << (j * 8));
Data.Add(id, recordBytes);
}
}
// Strings table
reader.BaseStream.Position = stringTablePos;
_stringTable = new Dictionary<int, string>();
while (reader.BaseStream.Position != stringTablePos + _header.StringTableSize)
{
int index = (int)(reader.BaseStream.Position - stringTablePos);
_stringTable[index] = reader.ReadCString();
}
}
// Copy index table
if (copyTablePos != reader.BaseStream.Length && _header.CopyTableSize != 0)
{
reader.BaseStream.Position = copyTablePos;
while (reader.BaseStream.Position != reader.BaseStream.Length)
{
int id = reader.ReadInt32();
int idcopy = reader.ReadInt32();
byte[] copyRow = Data[idcopy];
byte[] newRow = new byte[copyRow.Length];
Array.Copy(copyRow, newRow, newRow.Length);
Array.Copy(BitConverter.GetBytes(id), newRow, 4);
Data.Add(id, newRow);
}
}
if (_header.CommonDataSize != 0)
{
reader.BaseStream.Position = commonDataPos;
int fieldsCount = reader.ReadInt32();
_commandData = new Dictionary<int, byte[]>[fieldsCount];
for (int i = 0; i < fieldsCount; i++)
{
int count = reader.ReadInt32();
byte type = reader.ReadByte();
_commandData[i] = new Dictionary<int, byte[]>();
for (int j = 0; j < count; j++)
{
int id = reader.ReadInt32();
switch (type)
{
case 1: // 2 bytes
_commandData[i].Add(id, reader.ReadBytes(2));
break;
case 2: // 1 bytes
_commandData[i].Add(id, reader.ReadBytes(1));
break;
case 3: // 4 bytes
case 4:
_commandData[i].Add(id, reader.ReadBytes(4));
break;
default:
throw new Exception("Invalid data type " + type);
}
}
}
}
return Data;
}
static DB6Header _header;
static Dictionary<int, string> _stringTable;
static Dictionary<int, byte[]>[] _commandData;
}
public class GameTableReader
{
internal static GameTable<T> Read<T>(string fileName) where T : new()
{
GameTable<T> storage = new GameTable<T>();
if (!File.Exists(CliDB.DataPath + fileName))
{
Log.outError(LogFilter.ServerLoading, "File {0} not found.", fileName);
return storage;
}
using (var reader = new StreamReader(CliDB.DataPath + fileName))
{
string headers = reader.ReadLine();
if (headers.IsEmpty())
{
Log.outError(LogFilter.ServerLoading, "GameTable file {0} is empty.", fileName);
return storage;
}
var columnDefs = new StringArray(headers, '\t');
List<T> data = new List<T>();
data.Add(new T()); // row id 0, unused
string line;
while (!(line = reader.ReadLine()).IsEmpty())
{
var values = new StringArray(line, '\t');
if (values.Length == 0)
break;
var obj = new T();
var fields = obj.GetType().GetFields();
for (int fieldIndex = 0, valueIndex = 1; fieldIndex < fields.Length && valueIndex < values.Length; ++fieldIndex, ++valueIndex)
{
var field = fields[fieldIndex];
if (field.FieldType.IsArray)
{
Array array = (Array)field.GetValue(obj);
for (var i = 0; i < array.Length; ++i)
array.SetValue(float.Parse(values[valueIndex++]), i);
}
else
fields[fieldIndex].SetValue(obj, float.Parse(values[valueIndex]));
}
data.Add(obj);
}
storage.SetData(data);
}
CliDB.LoadedFileCount++;
return storage;
}
}
public struct DBClientHelper
{
public DBClientHelper(FieldInfo fieldInfo)
{
IsArray = false;
FieldType = RealType = fieldInfo.FieldType;
if (fieldInfo.FieldType.IsArray)
{
FieldType = RealType = fieldInfo.FieldType.GetElementType();
IsArray = true;
}
IsEnum = FieldType.IsEnum;
if (IsEnum)
{
IsEnum = FieldType.IsEnum;
RealType = FieldType.GetEnumUnderlyingType();
}
Setter = fieldInfo.CompileSetter();
Getter = fieldInfo.CompileGetter();
}
public void SetValue(Array array, object value, int arrayIndex)
{
if (!IsEnum)
array.SetValue(Convert.ChangeType(value, FieldType), arrayIndex % array.Length);
else
array.SetValue(Enum.ToObject(FieldType, value), arrayIndex % array.Length);
}
public void SetValue(object obj, object value)
{
if (!IsEnum)
Setter(obj, Convert.ChangeType(value, FieldType));
else
Setter(obj, Enum.ToObject(FieldType, value));
}
public Type FieldType;
public Type RealType;
public bool IsArray;
bool IsEnum;
Action<object, object> Setter;
public Func<object, object> Getter;
}
class DB6Header
{
public bool IsValidDB6File()
{
return Signature == "WDB6";
}
public bool IsSparseTable()
{
return Convert.ToBoolean(Flags & 0x1);
}
public bool HasIndexTable()
{
return Convert.ToBoolean(Flags & 0x4);
}
public int GetFieldBytes(int field)
{
if (columnMeta.Count <= field)
return 4;
return 4 - columnMeta[field].UnusedBits / 8;
}
public string Signature;
public uint RecordCount;
public uint FieldCount;
public uint RecordSize;
public uint StringTableSize;
public uint TableHash;
public uint LayoutHash;
public int MinId;
public int MaxId;
public int Locale;
public int CopyTableSize;
public uint Flags;
public int IndexField;
public uint TotalFieldCount;
public uint CommonDataSize;
public List<FieldEntry> columnMeta = new List<FieldEntry>();
public struct FieldEntry
{
public short UnusedBits;
public short Offset;
}
}
class DB6BinaryReader : BinaryReader
{
public DB6BinaryReader(byte[] data) : base(new MemoryStream(data)) { }
public int GetInt32(int fieldBytes)
{
switch (fieldBytes)
{
case 1:
return ReadSByte();
case 2:
return ReadInt16();
case 3:
byte[] bytes = ReadBytes(fieldBytes);
return bytes[0] | (bytes[1] << 8) | (bytes[2] << 16);
default:
return ReadInt32();
}
}
public uint GetUInt32(int fieldBytes)
{
switch (fieldBytes)
{
case 1:
return ReadByte();
case 2:
return ReadUInt16();
case 3:
byte[] bytes = ReadBytes(fieldBytes);
return bytes[0] | ((uint)bytes[1] << 8) | ((uint)bytes[2] << 16);
default:
return ReadUInt32();
}
}
public float GetSingle(int fieldBytes)
{
switch (fieldBytes)
{
case 1:
return ReadByte();
case 2:
return ReadUInt16();
case 3:
byte[] bytes = ReadBytes(fieldBytes);
return bytes[0] | ((uint)bytes[1] << 8) | ((uint)bytes[2] << 16);
default:
return ReadSingle();
}
}
}
public class LocalizedString
{
public bool HasString(LocaleConstant locale = SharedConst.DefaultLocale)
{
return !string.IsNullOrEmpty(stringStorage[(int)locale]);
}
public string this[LocaleConstant locale]
{
get
{
return stringStorage[(int)locale] ?? "";
}
set
{
stringStorage[(int)locale] = value;
}
}
StringArray stringStorage = new StringArray((int)LocaleConstant.Total);
}
}
@@ -0,0 +1,630 @@
/*
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
namespace Game.DataStorage
{
public struct DB6Meta
{
public DB6Meta(int indexField, byte[] arraySizes)
{
IndexField = indexField;
ArraySizes = arraySizes;
}
int IndexField;
public byte[] ArraySizes;
}
public struct DB6Metas
{
public static DB6Meta AchievementMeta = new DB6Meta(13, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta AchievementCategoryMeta = new DB6Meta(3, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta AdventureJournalMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1 });
public static DB6Meta AdventureMapPOIMeta = new DB6Meta(-1, new byte[] { 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta AnimKitMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta AnimKitBoneSetMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1 });
public static DB6Meta AnimKitBoneSetAliasMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta AnimKitConfigMeta = new DB6Meta(-1, new byte[] { 1, 1 });
public static DB6Meta AnimKitConfigBoneSetMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta AnimKitPriorityMeta = new DB6Meta(-1, new byte[] { 1, 1 });
public static DB6Meta AnimKitReplacementMeta = new DB6Meta(4, new byte[] { 1, 1, 1, 1 });
public static DB6Meta AnimKitSegmentMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta AnimReplacementMeta = new DB6Meta(4, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta AnimReplacementSetMeta = new DB6Meta(-1, new byte[] { 1, 1 });
public static DB6Meta AnimationDataMeta = new DB6Meta(0, new byte[] { 1, 1, 1, 1, 1, 1 });
public static DB6Meta AreaGroupMemberMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta AreaPOIMeta = new DB6Meta(-1, new byte[] { 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta AreaPOIStateMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1 });
public static DB6Meta AreaTableMeta = new DB6Meta(-1, new byte[] { 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta AreaTriggerMeta = new DB6Meta(14, new byte[] { 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta AreaTriggerActionSetMeta = new DB6Meta(-1, new byte[] { 1, 1 });
public static DB6Meta AreaTriggerBoxMeta = new DB6Meta(-1, new byte[] { 1, 3 });
public static DB6Meta AreaTriggerCylinderMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta AreaTriggerSphereMeta = new DB6Meta(-1, new byte[] { 1, 1 });
public static DB6Meta ArmorLocationMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1 });
public static DB6Meta ArtifactMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta ArtifactAppearanceMeta = new DB6Meta(11, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta ArtifactAppearanceSetMeta = new DB6Meta(8, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta ArtifactCategoryMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta ArtifactPowerMeta = new DB6Meta(5, new byte[] { 2, 1, 1, 1, 1, 1, 1 });
public static DB6Meta ArtifactPowerLinkMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta ArtifactPowerPickerMeta = new DB6Meta(-1, new byte[] { 1, 1 });
public static DB6Meta ArtifactPowerRankMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1 });
public static DB6Meta ArtifactQuestXPMeta = new DB6Meta(-1, new byte[] { 1, 10 });
public static DB6Meta ArtifactTierMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1 });
public static DB6Meta ArtifactUnlockMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1 });
public static DB6Meta AuctionHouseMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta BankBagSlotPricesMeta = new DB6Meta(-1, new byte[] { 1, 1 });
public static DB6Meta BannedAddOnsMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta BarberShopStyleMeta = new DB6Meta(7, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta BattlePetAbilityMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta BattlePetAbilityEffectMeta = new DB6Meta(6, new byte[] { 1, 1, 1, 1, 6, 1, 1 });
public static DB6Meta BattlePetAbilityStateMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta BattlePetAbilityTurnMeta = new DB6Meta(5, new byte[] { 1, 1, 1, 1, 1, 1 });
public static DB6Meta BattlePetBreedQualityMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta BattlePetBreedStateMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta BattlePetEffectPropertiesMeta = new DB6Meta(-1, new byte[] { 1, 6, 1, 6 });
public static DB6Meta BattlePetNPCTeamMemberMeta = new DB6Meta(-1, new byte[] { 1, 1 });
public static DB6Meta BattlePetSpeciesMeta = new DB6Meta(8, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta BattlePetSpeciesStateMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta BattlePetSpeciesXAbilityMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta BattlePetStateMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta BattlePetVisualMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta BattlemasterListMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 16, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta BeamEffectMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta BoneWindModifierModelMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta BoneWindModifiersMeta = new DB6Meta(-1, new byte[] { 1, 3, 1 });
public static DB6Meta BountyMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta BountySetMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta BroadcastTextMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 3, 3, 1, 1, 1, 2, 1 });
public static DB6Meta CameraEffectMeta = new DB6Meta(-1, new byte[] { 1, 1 });
public static DB6Meta CameraEffectEntryMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta CameraModeMeta = new DB6Meta(-1, new byte[] { 1, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta CameraShakesMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta CastableRaidBuffsMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta CelestialBodyMeta = new DB6Meta(14, new byte[] { 1, 1, 2, 1, 1, 2, 2, 2, 1, 2, 1, 3, 1, 1, 1 });
public static DB6Meta Cfg_CategoriesMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1 });
public static DB6Meta Cfg_ConfigsMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta Cfg_RegionsMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1 });
public static DB6Meta CharBaseInfoMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta CharBaseSectionMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta CharComponentTextureLayoutsMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta CharComponentTextureSectionsMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta CharHairGeosetsMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta CharSectionsMeta = new DB6Meta(-1, new byte[] { 1, 3, 1, 1, 1, 1, 1, 1 });
public static DB6Meta CharShipmentMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta CharShipmentContainerMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta CharStartOutfitMeta = new DB6Meta(-1, new byte[] { 1, 24, 1, 1, 1, 1, 1, 1 });
public static DB6Meta CharTitlesMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta CharacterFaceBoneSetMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta CharacterFacialHairStylesMeta = new DB6Meta(-1, new byte[] { 1, 5, 1, 1, 1 });
public static DB6Meta CharacterLoadoutMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta CharacterLoadoutItemMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta ChatChannelsMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta ChatProfanityMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta ChrClassRaceSexMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta ChrClassTitleMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta ChrClassUIDisplayMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta ChrClassVillainMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta ChrClassesMeta = new DB6Meta(18, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta ChrClassesXPowerTypesMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta ChrRacesMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3 });
public static DB6Meta ChrSpecializationMeta = new DB6Meta(9, new byte[] { 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta ChrUpgradeBucketMeta = new DB6Meta(2, new byte[] { 1, 1, 1 });
public static DB6Meta ChrUpgradeBucketSpellMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta ChrUpgradeTierMeta = new DB6Meta(3, new byte[] { 1, 1, 1, 1 });
public static DB6Meta CinematicCameraMeta = new DB6Meta(-1, new byte[] { 1, 1, 3, 1, 1 });
public static DB6Meta CinematicSequencesMeta = new DB6Meta(-1, new byte[] { 1, 1, 8 });
public static DB6Meta CloakDampeningMeta = new DB6Meta(-1, new byte[] { 1, 5, 5, 2, 2, 1, 1, 1 });
public static DB6Meta CombatConditionMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 2, 2, 2, 2, 1, 2, 2, 1 });
public static DB6Meta CommentatorStartLocationMeta = new DB6Meta(-1, new byte[] { 1, 3, 1 });
public static DB6Meta CommentatorTrackedCooldownMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta ComponentModelFileDataMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta ComponentTextureFileDataMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta ContributionMeta = new DB6Meta(0, new byte[] { 1, 1, 1, 1, 4, 1 });
public static DB6Meta ConversationLineMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta CreatureMeta = new DB6Meta(-1, new byte[] { 1, 3, 1, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta CreatureDifficultyMeta = new DB6Meta(-1, new byte[] { 1, 1, 7, 1, 1, 1, 1 });
public static DB6Meta CreatureDispXUiCameraMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta CreatureDisplayInfoMeta = new DB6Meta(0, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta CreatureDisplayInfoCondMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3 });
public static DB6Meta CreatureDisplayInfoEvtMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta CreatureDisplayInfoExtraMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1 });
public static DB6Meta CreatureDisplayInfoTrnMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta CreatureFamilyMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 2, 1, 1, 1, 1 });
public static DB6Meta CreatureImmunitiesMeta = new DB6Meta(-1, new byte[] { 1, 2, 1, 1, 1, 1, 1, 1, 8, 16 });
public static DB6Meta CreatureModelDataMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta CreatureMovementInfoMeta = new DB6Meta(-1, new byte[] { 1, 1 });
public static DB6Meta CreatureSoundDataMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta CreatureTypeMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta CreatureXContributionMeta = new DB6Meta(0, new byte[] { 1, 1, 1 });
public static DB6Meta CriteriaMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta CriteriaTreeMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta CriteriaTreeXEffectMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta CurrencyCategoryMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta CurrencyTypesMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta CurveMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta CurvePointMeta = new DB6Meta(-1, new byte[] { 1, 2, 1, 1 });
public static DB6Meta DeathThudLookupsMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta DecalPropertiesMeta = new DB6Meta(0, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta DeclinedWordMeta = new DB6Meta(1, new byte[] { 1, 1 });
public static DB6Meta DeclinedWordCasesMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta DestructibleModelDataMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta DeviceBlacklistMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta DeviceDefaultSettingsMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta DifficultyMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta DissolveEffectMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta DriverBlacklistMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta DungeonEncounterMeta = new DB6Meta(6, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta DungeonMapMeta = new DB6Meta(7, new byte[] { 2, 2, 1, 1, 1, 1, 1 });
public static DB6Meta DungeonMapChunkMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1 });
public static DB6Meta DurabilityCostsMeta = new DB6Meta(-1, new byte[] { 1, 21, 8 });
public static DB6Meta DurabilityQualityMeta = new DB6Meta(-1, new byte[] { 1, 1 });
public static DB6Meta EdgeGlowEffectMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta EmotesMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta EmotesTextMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta EmotesTextDataMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta EmotesTextSoundMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1 });
public static DB6Meta EnvironmentalDamageMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta ExhaustionMeta = new DB6Meta(7, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta FactionMeta = new DB6Meta(0, new byte[] { 1, 4, 4, 2, 1, 1, 4, 1, 4, 4, 1, 1, 2, 1, 1, 1 });
public static DB6Meta FactionGroupMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1 });
public static DB6Meta FactionTemplateMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 4, 4, 1, 1, 1 });
public static DB6Meta FootprintTexturesMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta FootstepTerrainLookupMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta FriendshipRepReactionMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta FriendshipReputationMeta = new DB6Meta(3, new byte[] { 1, 1, 1, 1 });
public static DB6Meta FullScreenEffectMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta GMSurveyAnswersMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta GMSurveyCurrentSurveyMeta = new DB6Meta(-1, new byte[] { 1, 1 });
public static DB6Meta GMSurveyQuestionsMeta = new DB6Meta(-1, new byte[] { 1, 1 });
public static DB6Meta GMSurveySurveysMeta = new DB6Meta(-1, new byte[] { 1, 15 });
public static DB6Meta GameObjectArtKitMeta = new DB6Meta(-1, new byte[] { 1, 3, 4 });
public static DB6Meta GameObjectDiffAnimMapMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta GameObjectDisplayInfoMeta = new DB6Meta(-1, new byte[] { 1, 1, 6, 1, 1, 1 });
public static DB6Meta GameObjectDisplayInfoXSoundKitMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta GameObjectsMeta = new DB6Meta(11, new byte[] { 3, 4, 1, 8, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta GameTipsMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta GarrAbilityMeta = new DB6Meta(7, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta GarrAbilityCategoryMeta = new DB6Meta(-1, new byte[] { 1, 1 });
public static DB6Meta GarrAbilityEffectMeta = new DB6Meta(11, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta GarrBuildingMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta GarrBuildingDoodadSetMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1 });
public static DB6Meta GarrBuildingPlotInstMeta = new DB6Meta(4, new byte[] { 2, 1, 1, 1, 1 });
public static DB6Meta GarrClassSpecMeta = new DB6Meta(7, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta GarrClassSpecPlayerCondMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta GarrEncounterMeta = new DB6Meta(5, new byte[] { 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta GarrEncounterSetXEncounterMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta GarrEncounterXMechanicMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta GarrFollItemSetMemberMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta GarrFollSupportSpellMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta GarrFollowerMeta = new DB6Meta(31, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta GarrFollowerLevelXPMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta GarrFollowerQualityMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta GarrFollowerSetXFollowerMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta GarrFollowerTypeMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta GarrFollowerUICreatureMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta GarrFollowerXAbilityMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta GarrItemLevelUpgradeDataMeta = new DB6Meta(0, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta GarrMechanicMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta GarrMechanicSetXMechanicMeta = new DB6Meta(1, new byte[] { 1, 1, 1 });
public static DB6Meta GarrMechanicTypeMeta = new DB6Meta(4, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta GarrMissionMeta = new DB6Meta(19, new byte[] { 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta GarrMissionTextureMeta = new DB6Meta(-1, new byte[] { 1, 2, 1 });
public static DB6Meta GarrMissionTypeMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta GarrMissionXEncounterMeta = new DB6Meta(1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta GarrMissionXFollowerMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta GarrMssnBonusAbilityMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1 });
public static DB6Meta GarrPlotMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 2 });
public static DB6Meta GarrPlotBuildingMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta GarrPlotInstanceMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta GarrPlotUICategoryMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta GarrSiteLevelMeta = new DB6Meta(-1, new byte[] { 1, 2, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta GarrSiteLevelPlotInstMeta = new DB6Meta(-1, new byte[] { 1, 2, 1, 1, 1 });
public static DB6Meta GarrSpecializationMeta = new DB6Meta(-1, new byte[] { 1, 1, 2, 1, 1, 1, 1, 1 });
public static DB6Meta GarrStringMeta = new DB6Meta(-1, new byte[] { 1, 1 });
public static DB6Meta GarrTalentMeta = new DB6Meta(7, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta GarrTalentTreeMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1 });
public static DB6Meta GarrTypeMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1 });
public static DB6Meta GarrUiAnimClassInfoMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta GarrUiAnimRaceInfoMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta GemPropertiesMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta GlobalStringsMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta GlyphBindableSpellMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta GlyphExclusiveCategoryMeta = new DB6Meta(-1, new byte[] { 1, 1 });
public static DB6Meta GlyphPropertiesMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta GlyphRequiredSpecMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta GroundEffectDoodadMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta GroundEffectTextureMeta = new DB6Meta(-1, new byte[] { 1, 4, 4, 1, 1 });
public static DB6Meta GroupFinderActivityMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta GroupFinderActivityGrpMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta GroupFinderCategoryMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta GuildColorBackgroundMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta GuildColorBorderMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta GuildColorEmblemMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta GuildPerkSpellsMeta = new DB6Meta(-1, new byte[] { 1, 1 });
public static DB6Meta HeirloomMeta = new DB6Meta(9, new byte[] { 1, 1, 1, 1, 1, 3, 3, 1, 1, 1 });
public static DB6Meta HelmetAnimScalingMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta HelmetGeosetVisDataMeta = new DB6Meta(-1, new byte[] { 1, 9 });
public static DB6Meta HighlightColorMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1 });
public static DB6Meta HolidayDescriptionsMeta = new DB6Meta(-1, new byte[] { 1, 1 });
public static DB6Meta HolidayNamesMeta = new DB6Meta(-1, new byte[] { 1, 1 });
public static DB6Meta HolidaysMeta = new DB6Meta(-1, new byte[] { 1, 16, 10, 1, 1, 10, 1, 1, 1, 1, 1, 3 });
public static DB6Meta HotfixMeta = new DB6Meta(0, new byte[] { 1, 1, 1 });
public static DB6Meta ImportPriceArmorMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta ImportPriceQualityMeta = new DB6Meta(-1, new byte[] { 1, 1 });
public static DB6Meta ImportPriceShieldMeta = new DB6Meta(-1, new byte[] { 1, 1 });
public static DB6Meta ImportPriceWeaponMeta = new DB6Meta(-1, new byte[] { 1, 1 });
public static DB6Meta InvasionClientDataMeta = new DB6Meta(2, new byte[] { 1, 2, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta ItemMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta ItemAppearanceMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta ItemAppearanceXUiCameraMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta ItemArmorQualityMeta = new DB6Meta(-1, new byte[] { 1, 7, 1 });
public static DB6Meta ItemArmorShieldMeta = new DB6Meta(-1, new byte[] { 1, 7, 1 });
public static DB6Meta ItemArmorTotalMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1 });
public static DB6Meta ItemBagFamilyMeta = new DB6Meta(-1, new byte[] { 1, 1 });
public static DB6Meta ItemBonusMeta = new DB6Meta(-1, new byte[] { 1, 2, 1, 1, 1 });
public static DB6Meta ItemBonusListLevelDeltaMeta = new DB6Meta(1, new byte[] { 1, 1 });
public static DB6Meta ItemBonusTreeNodeMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1 });
public static DB6Meta ItemChildEquipmentMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta ItemClassMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta ItemContextPickerEntryMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1 });
public static DB6Meta ItemCurrencyCostMeta = new DB6Meta(-1, new byte[] { 1, 1 });
public static DB6Meta ItemDamageAmmoMeta = new DB6Meta(-1, new byte[] { 1, 7, 1 });
public static DB6Meta ItemDamageOneHandMeta = new DB6Meta(-1, new byte[] { 1, 7, 1 });
public static DB6Meta ItemDamageOneHandCasterMeta = new DB6Meta(-1, new byte[] { 1, 7, 1 });
public static DB6Meta ItemDamageTwoHandMeta = new DB6Meta(-1, new byte[] { 1, 7, 1 });
public static DB6Meta ItemDamageTwoHandCasterMeta = new DB6Meta(-1, new byte[] { 1, 7, 1 });
public static DB6Meta ItemDisenchantLootMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta ItemDisplayInfoMeta = new DB6Meta(-1, new byte[] { 1, 2, 2, 3, 3, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta ItemDisplayInfoMaterialResMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta ItemDisplayXUiCameraMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta ItemEffectMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta ItemExtendedCostMeta = new DB6Meta(-1, new byte[] { 1, 5, 5, 5, 1, 5, 1, 1, 1, 1, 1 });
public static DB6Meta ItemGroupSoundsMeta = new DB6Meta(-1, new byte[] { 1, 4 });
public static DB6Meta ItemLevelSelectorMeta = new DB6Meta(-1, new byte[] { 1, 1 });
public static DB6Meta ItemLimitCategoryMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta ItemLimitCategoryConditionMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta ItemModifiedAppearanceMeta = new DB6Meta(5, new byte[] { 1, 1, 1, 1, 1, 1 });
public static DB6Meta ItemModifiedAppearanceExtraMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1 });
public static DB6Meta ItemNameDescriptionMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta ItemPetFoodMeta = new DB6Meta(-1, new byte[] { 1, 1 });
public static DB6Meta ItemPriceBaseMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta ItemRandomPropertiesMeta = new DB6Meta(-1, new byte[] { 1, 1, 5 });
public static DB6Meta ItemRandomSuffixMeta = new DB6Meta(-1, new byte[] { 1, 1, 5, 5 });
public static DB6Meta ItemRangedDisplayInfoMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta ItemSearchNameMeta = new DB6Meta(-1, new byte[] { 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta ItemSetMeta = new DB6Meta(-1, new byte[] { 1, 1, 17, 1, 1, 1 });
public static DB6Meta ItemSetSpellMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta ItemSparseMeta = new DB6Meta(-1, new byte[] { 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 10, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 10, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1 });
public static DB6Meta ItemSpecMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta ItemSpecOverrideMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta ItemSubClassMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta ItemSubClassMaskMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta ItemUpgradeMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1 });
public static DB6Meta ItemVisualEffectsMeta = new DB6Meta(-1, new byte[] { 1, 1 });
public static DB6Meta ItemVisualsMeta = new DB6Meta(-1, new byte[] { 1, 5 });
public static DB6Meta ItemXBonusTreeMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta JournalEncounterMeta = new DB6Meta(-1, new byte[] { 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta JournalEncounterCreatureMeta = new DB6Meta(6, new byte[] { 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta JournalEncounterItemMeta = new DB6Meta(5, new byte[] { 1, 1, 1, 1, 1, 1 });
public static DB6Meta JournalEncounterSectionMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta JournalEncounterXDifficultyMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta JournalInstanceMeta = new DB6Meta(10, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta JournalItemXDifficultyMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta JournalSectionXDifficultyMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta JournalTierMeta = new DB6Meta(-1, new byte[] { 1, 1 });
public static DB6Meta JournalTierXInstanceMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta KeyChainMeta = new DB6Meta(-1, new byte[] { 1, 32 });
public static DB6Meta KeystoneAffixMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta LanguageWordsMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta LanguagesMeta = new DB6Meta(1, new byte[] { 1, 1 });
public static DB6Meta LfgDungeonExpansionMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta LfgDungeonGroupMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta LfgDungeonsMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta LfgDungeonsGroupingMapMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta LfgRoleRequirementMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta LightMeta = new DB6Meta(-1, new byte[] { 1, 3, 1, 1, 1, 8 });
public static DB6Meta LightDataMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta LightParamsMeta = new DB6Meta(10, new byte[] { 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1 });
public static DB6Meta LightSkyboxMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta LiquidMaterialMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta LiquidObjectMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1 });
public static DB6Meta LiquidTypeMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 6, 2, 18, 4, 1, 1, 1, 1, 1, 1, 6, 1 });
public static DB6Meta LoadingScreenTaxiSplinesMeta = new DB6Meta(-1, new byte[] { 1, 10, 10, 1, 1, 1 });
public static DB6Meta LoadingScreensMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta LocaleMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta LocationMeta = new DB6Meta(-1, new byte[] { 1, 3, 3 });
public static DB6Meta LockMeta = new DB6Meta(-1, new byte[] { 1, 8, 8, 8, 8 });
public static DB6Meta LockTypeMeta = new DB6Meta(4, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta LookAtControllerMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta MailTemplateMeta = new DB6Meta(-1, new byte[] { 1, 1 });
public static DB6Meta ManagedWorldStateMeta = new DB6Meta(9, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta ManagedWorldStateBuffMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta ManagedWorldStateInputMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta ManifestInterfaceActionIconMeta = new DB6Meta(0, new byte[] { 1 });
public static DB6Meta ManifestInterfaceDataMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta ManifestInterfaceItemIconMeta = new DB6Meta(0, new byte[] { 1 });
public static DB6Meta ManifestInterfaceTOCDataMeta = new DB6Meta(-1, new byte[] { 1, 1 });
public static DB6Meta ManifestMP3Meta = new DB6Meta(0, new byte[] { 1 });
public static DB6Meta MapMeta = new DB6Meta(-1, new byte[] { 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta MapCelestialBodyMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta MapChallengeModeMeta = new DB6Meta(0, new byte[] { 1, 1, 1, 3, 1 });
public static DB6Meta MapDifficultyMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta MapDifficultyXConditionMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta MarketingPromotionsXLocaleMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta MaterialMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta MinorTalentMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta ModelAnimCloakDampeningMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta ModelFileDataMeta = new DB6Meta(1, new byte[] { 1, 1, 1 });
public static DB6Meta ModelRibbonQualityMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta ModifierTreeMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta MountMeta = new DB6Meta(8, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta MountCapabilityMeta = new DB6Meta(6, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta MountTypeXCapabilityMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta MountXDisplayMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta MovieMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta MovieFileDataMeta = new DB6Meta(-1, new byte[] { 1, 1 });
public static DB6Meta MovieVariationMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta NPCSoundsMeta = new DB6Meta(-1, new byte[] { 1, 4 });
public static DB6Meta NameGenMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta NamesProfanityMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta NamesReservedMeta = new DB6Meta(-1, new byte[] { 1, 1 });
public static DB6Meta NamesReservedLocaleMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta NpcModelItemSlotDisplayInfoMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta ObjectEffectMeta = new DB6Meta(-1, new byte[] { 1, 1, 3, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta ObjectEffectGroupMeta = new DB6Meta(-1, new byte[] { 1, 1 });
public static DB6Meta ObjectEffectModifierMeta = new DB6Meta(-1, new byte[] { 1, 4, 1, 1, 1 });
public static DB6Meta ObjectEffectPackageMeta = new DB6Meta(-1, new byte[] { 1, 1 });
public static DB6Meta ObjectEffectPackageElemMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta OutlineEffectMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta OverrideSpellDataMeta = new DB6Meta(-1, new byte[] { 1, 10, 1, 1 });
public static DB6Meta PageTextMaterialMeta = new DB6Meta(-1, new byte[] { 1, 1 });
public static DB6Meta PaperDollItemFrameMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta ParagonReputationMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta ParticleColorMeta = new DB6Meta(-1, new byte[] { 1, 3, 3, 3 });
public static DB6Meta PathMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta PathNodeMeta = new DB6Meta(0, new byte[] { 1, 1, 1, 1 });
public static DB6Meta PathNodePropertyMeta = new DB6Meta(3, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta PathPropertyMeta = new DB6Meta(3, new byte[] { 1, 1, 1, 1 });
public static DB6Meta PhaseMeta = new DB6Meta(-1, new byte[] { 1, 1 });
public static DB6Meta PhaseShiftZoneSoundsMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta PhaseXPhaseGroupMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta PlayerConditionMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 4, 1, 1, 1, 1, 1, 1, 4, 4, 4, 1, 4, 4, 4, 2, 1, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 4, 4, 4, 1, 4, 1, 4, 6, 1, 1, 1, 2, 1 });
public static DB6Meta PositionerMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta PositionerStateMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta PositionerStateEntryMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta PowerDisplayMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1 });
public static DB6Meta PowerTypeMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta PrestigeLevelInfoMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta PvpBracketTypesMeta = new DB6Meta(-1, new byte[] { 1, 1, 4 });
public static DB6Meta PvpDifficultyMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta PvpItemMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta PvpRewardMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta PvpScalingEffectMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta PvpScalingEffectTypeMeta = new DB6Meta(-1, new byte[] { 1, 1 });
public static DB6Meta PvpTalentMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta PvpTalentUnlockMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta QuestFactionRewardMeta = new DB6Meta(-1, new byte[] { 1, 10 });
public static DB6Meta QuestFeedbackEffectMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta QuestInfoMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta QuestLineMeta = new DB6Meta(-1, new byte[] { 1, 1 });
public static DB6Meta QuestLineXQuestMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta QuestMoneyRewardMeta = new DB6Meta(-1, new byte[] { 1, 10 });
public static DB6Meta QuestObjectiveMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta QuestPOIBlobMeta = new DB6Meta(0, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta QuestPOIPointMeta = new DB6Meta(3, new byte[] { 1, 1, 1, 1 });
public static DB6Meta QuestPOIPointCliTaskMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta QuestPackageItemMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta QuestSortMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta QuestV2Meta = new DB6Meta(-1, new byte[] { 1, 1 });
public static DB6Meta QuestV2CliTaskMeta = new DB6Meta(20, new byte[] { 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta QuestXGroupActivityMeta = new DB6Meta(-1, new byte[] { 1, 1 });
public static DB6Meta QuestXPMeta = new DB6Meta(-1, new byte[] { 1, 10 });
public static DB6Meta RandPropPointsMeta = new DB6Meta(-1, new byte[] { 1, 5, 5, 5 });
public static DB6Meta ResearchBranchMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1 });
public static DB6Meta ResearchFieldMeta = new DB6Meta(2, new byte[] { 1, 1, 1 });
public static DB6Meta ResearchProjectMeta = new DB6Meta(7, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta ResearchSiteMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta ResistancesMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta RewardPackMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta RewardPackXCurrencyTypeMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta RewardPackXItemMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta RibbonQualityMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta RulesetItemUpgradeMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta ScalingStatDistributionMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta ScenarioMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta ScenarioEventEntryMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta ScenarioStepMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta SceneScriptMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta SceneScriptPackageMeta = new DB6Meta(-1, new byte[] { 1, 1 });
public static DB6Meta SceneScriptPackageMemberMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta ScheduledIntervalMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1 });
public static DB6Meta ScheduledWorldStateMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta ScheduledWorldStateGroupMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1 });
public static DB6Meta ScheduledWorldStateXUniqCatMeta = new DB6Meta(0, new byte[] { 1, 1, 1 });
public static DB6Meta ScreenEffectMeta = new DB6Meta(-1, new byte[] { 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta ScreenLocationMeta = new DB6Meta(-1, new byte[] { 1, 1 });
public static DB6Meta SeamlessSiteMeta = new DB6Meta(-1, new byte[] { 1, 1 });
public static DB6Meta ServerMessagesMeta = new DB6Meta(-1, new byte[] { 1, 1 });
public static DB6Meta ShadowyEffectMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta SkillLineMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta SkillLineAbilityMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta SkillRaceClassInfoMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta SoundAmbienceMeta = new DB6Meta(-1, new byte[] { 1, 1, 2, 1, 1 });
public static DB6Meta SoundAmbienceFlavorMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta SoundBusMeta = new DB6Meta(7, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta SoundBusOverrideMeta = new DB6Meta(0, new byte[] { 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta SoundEmitterPillPointsMeta = new DB6Meta(-1, new byte[] { 1, 3, 1 });
public static DB6Meta SoundEmittersMeta = new DB6Meta(9, new byte[] { 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta SoundFilterMeta = new DB6Meta(-1, new byte[] { 1, 1 });
public static DB6Meta SoundFilterElemMeta = new DB6Meta(-1, new byte[] { 1, 9, 1, 1 });
public static DB6Meta SoundKitMeta = new DB6Meta(16, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta SoundKitAdvancedMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta SoundKitChildMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta SoundKitEntryMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta SoundKitFallbackMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta SoundOverrideMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta SoundProviderPreferencesMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta SourceInfoMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta SpamMessagesMeta = new DB6Meta(-1, new byte[] { 1, 1 });
public static DB6Meta SpecializationSpellsMeta = new DB6Meta(5, new byte[] { 1, 1, 1, 1, 1, 1 });
public static DB6Meta SpellMeta = new DB6Meta(5, new byte[] { 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta SpellActionBarPrefMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta SpellActivationOverlayMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 4, 1, 1, 1 });
public static DB6Meta SpellAuraOptionsMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta SpellAuraRestrictionsMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta SpellAuraVisXChrSpecMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta SpellAuraVisibilityMeta = new DB6Meta(3, new byte[] { 1, 1, 1, 1 });
public static DB6Meta SpellCastTimesMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta SpellCastingRequirementsMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta SpellCategoriesMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta SpellCategoryMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta SpellChainEffectsMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3 });
public static DB6Meta SpellClassOptionsMeta = new DB6Meta(-1, new byte[] { 1, 1, 4, 1, 1 });
public static DB6Meta SpellCooldownsMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1 });
public static DB6Meta SpellDescriptionVariablesMeta = new DB6Meta(-1, new byte[] { 1, 1 });
public static DB6Meta SpellDispelTypeMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta SpellDurationMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta SpellEffectMeta = new DB6Meta(1, new byte[] { 4, 1, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta SpellEffectEmissionMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta SpellEffectGroupSizeMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta SpellEffectScalingMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta SpellEquippedItemsMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta SpellFlyoutMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta SpellFlyoutItemMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta SpellFocusObjectMeta = new DB6Meta(-1, new byte[] { 1, 1 });
public static DB6Meta SpellInterruptsMeta = new DB6Meta(-1, new byte[] { 1, 1, 2, 2, 1, 1 });
public static DB6Meta SpellItemEnchantmentMeta = new DB6Meta(-1, new byte[] { 1, 3, 1, 3, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1 });
public static DB6Meta SpellItemEnchantmentConditionMeta = new DB6Meta(-1, new byte[] { 1, 5, 5, 5, 5, 5, 5 });
public static DB6Meta SpellKeyboundOverrideMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta SpellLabelMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta SpellLearnSpellMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta SpellLevelsMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta SpellMechanicMeta = new DB6Meta(-1, new byte[] { 1, 1 });
public static DB6Meta SpellMiscMeta = new DB6Meta(-1, new byte[] { 1, 14, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta SpellMiscDifficultyMeta = new DB6Meta(2, new byte[] { 1, 1, 1 });
public static DB6Meta SpellMissileMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta SpellMissileMotionMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta SpellPowerMeta = new DB6Meta(8, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta SpellPowerDifficultyMeta = new DB6Meta(2, new byte[] { 1, 1, 1 });
public static DB6Meta SpellProceduralEffectMeta = new DB6Meta(2, new byte[] { 4, 1, 1 });
public static DB6Meta SpellProcsPerMinuteMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta SpellProcsPerMinuteModMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta SpellRadiusMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta SpellRangeMeta = new DB6Meta(-1, new byte[] { 1, 2, 2, 1, 1, 1 });
public static DB6Meta SpellReagentsMeta = new DB6Meta(-1, new byte[] { 1, 1, 8, 8 });
public static DB6Meta SpellReagentsCurrencyMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta SpellScalingMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1 });
public static DB6Meta SpellShapeshiftMeta = new DB6Meta(-1, new byte[] { 1, 1, 2, 2, 1 });
public static DB6Meta SpellShapeshiftFormMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 8 });
public static DB6Meta SpellSpecialUnitEffectMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta SpellTargetRestrictionsMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta SpellTotemsMeta = new DB6Meta(-1, new byte[] { 1, 1, 2, 2 });
public static DB6Meta SpellVisualMeta = new DB6Meta(7, new byte[] { 1, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta SpellVisualAnimMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta SpellVisualColorEffectMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta SpellVisualEffectNameMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta SpellVisualKitMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1 });
public static DB6Meta SpellVisualKitAreaModelMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta SpellVisualKitEffectMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta SpellVisualKitModelAttachMeta = new DB6Meta(6, new byte[] { 1, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta SpellVisualMissileMeta = new DB6Meta(13, new byte[] { 1, 1, 1, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta SpellXSpellVisualMeta = new DB6Meta(2, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta StartupFilesMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta Startup_StringsMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta StationeryMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta StringLookupsMeta = new DB6Meta(-1, new byte[] { 1, 1 });
public static DB6Meta SummonPropertiesMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1 });
public static DB6Meta TactKeyMeta = new DB6Meta(-1, new byte[] { 1, 16 });
public static DB6Meta TactKeyLookupMeta = new DB6Meta(-1, new byte[] { 1, 8 });
public static DB6Meta TalentMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 2, 1 });
public static DB6Meta TaxiNodesMeta = new DB6Meta(8, new byte[] { 3, 1, 2, 2, 1, 1, 1, 1, 1 });
public static DB6Meta TaxiPathMeta = new DB6Meta(2, new byte[] { 1, 1, 1, 1 });
public static DB6Meta TaxiPathNodeMeta = new DB6Meta(8, new byte[] { 3, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta TerrainMaterialMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta TerrainTypeMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1 });
public static DB6Meta TerrainTypeSoundsMeta = new DB6Meta(-1, new byte[] { 1, 1 });
public static DB6Meta TextureBlendSetMeta = new DB6Meta(-1, new byte[] { 1, 3, 3, 3, 3, 3, 4, 1, 1, 1, 1 });
public static DB6Meta TextureFileDataMeta = new DB6Meta(2, new byte[] { 1, 1 });
public static DB6Meta TotemCategoryMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta ToyMeta = new DB6Meta(4, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta TradeSkillCategoryMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1 });
public static DB6Meta TradeSkillItemMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta TransformMatrixMeta = new DB6Meta(-1, new byte[] { 1, 3, 1, 1, 1, 1 });
public static DB6Meta TransmogHolidayMeta = new DB6Meta(0, new byte[] { 1, 1 });
public static DB6Meta TransmogSetMeta = new DB6Meta(4, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta TransmogSetGroupMeta = new DB6Meta(1, new byte[] { 1, 1 });
public static DB6Meta TransmogSetItemMeta = new DB6Meta(0, new byte[] { 1, 1, 1, 1 });
public static DB6Meta TransportAnimationMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 3, 1 });
public static DB6Meta TransportPhysicsMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta TransportRotationMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 4 });
public static DB6Meta TrophyMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta UiCamFbackTransmogChrRaceMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1 });
public static DB6Meta UiCamFbackTransmogWeaponMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta UiCameraMeta = new DB6Meta(-1, new byte[] { 1, 1, 3, 3, 3, 1, 1, 1, 1, 1 });
public static DB6Meta UiCameraTypeMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta UiMapPOIMeta = new DB6Meta(6, new byte[] { 1, 3, 1, 1, 1, 1, 1 });
public static DB6Meta UiModelSceneMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta UiModelSceneActorMeta = new DB6Meta(7, new byte[] { 1, 3, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta UiModelSceneActorDisplayMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1 });
public static DB6Meta UiModelSceneCameraMeta = new DB6Meta(14, new byte[] { 1, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta UiTextureAtlasMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta UiTextureAtlasMemberMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta UiTextureKitMeta = new DB6Meta(-1, new byte[] { 1, 1 });
public static DB6Meta UnitBloodMeta = new DB6Meta(-1, new byte[] { 1, 5, 1, 1, 1, 1, 1, 1 });
public static DB6Meta UnitBloodLevelsMeta = new DB6Meta(-1, new byte[] { 1, 3 });
public static DB6Meta UnitConditionMeta = new DB6Meta(-1, new byte[] { 1, 8, 1, 8, 8 });
public static DB6Meta UnitPowerBarMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta UnitTestMeta = new DB6Meta(2, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta VehicleMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 8, 1, 3, 1, 1 });
public static DB6Meta VehicleSeatMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta VehicleUIIndSeatMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta VehicleUIIndicatorMeta = new DB6Meta(-1, new byte[] { 1, 1 });
public static DB6Meta VideoHardwareMeta = new DB6Meta(14, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta VignetteMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta VocalUISoundsMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 2 });
public static DB6Meta WMOAreaTableMeta = new DB6Meta(13, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta WbAccessControlListMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1 });
public static DB6Meta WbCertWhitelistMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta WeaponImpactSoundsMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 11, 11, 11, 11 });
public static DB6Meta WeaponSwingSounds2Meta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta WeaponTrailMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 3, 3, 3, 3, 3 });
public static DB6Meta WeaponTrailModelDefMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta WeaponTrailParamMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta WeatherMeta = new DB6Meta(-1, new byte[] { 1, 2, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta WindSettingsMeta = new DB6Meta(-1, new byte[] { 1, 1, 3, 1, 1, 3, 1, 3, 1, 1, 1 });
public static DB6Meta WmoMinimapTextureMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1 });
public static DB6Meta WorldBossLockoutMeta = new DB6Meta(-1, new byte[] { 1, 1, 1 });
public static DB6Meta WorldChunkSoundsMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta WorldEffectMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta WorldElapsedTimerMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta WorldMapAreaMeta = new DB6Meta(15, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta WorldMapContinentMeta = new DB6Meta(-1, new byte[] { 1, 2, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta WorldMapOverlayMeta = new DB6Meta(0, new byte[] { 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta WorldMapTransformsMeta = new DB6Meta(-1, new byte[] { 1, 6, 2, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta WorldSafeLocsMeta = new DB6Meta(-1, new byte[] { 1, 3, 1, 1, 1 });
public static DB6Meta WorldStateExpressionMeta = new DB6Meta(-1, new byte[] { 1, 1 });
public static DB6Meta WorldStateUIMeta = new DB6Meta(15, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1 });
public static DB6Meta WorldStateZoneSoundsMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta World_PVP_AreaMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1, 1, 1, 1 });
public static DB6Meta ZoneIntroMusicTableMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1, 1 });
public static DB6Meta ZoneLightMeta = new DB6Meta(-1, new byte[] { 1, 1, 1, 1 });
public static DB6Meta ZoneLightPointMeta = new DB6Meta(-1, new byte[] { 1, 2, 1, 1 });
public static DB6Meta ZoneMusicMeta = new DB6Meta(-1, new byte[] { 1, 1, 2, 2, 2 });
}
}
@@ -0,0 +1,346 @@
/*
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
using Framework.Constants;
using Framework.Database;
using Framework.GameMath;
using Framework.IO;
using System;
using System.Collections.Generic;
using System.Reflection;
namespace Game.DataStorage
{
public interface IDB2Storage
{
bool HasRecord(uint id);
void WriteRecord(uint id, LocaleConstant locale, ByteBuffer buffer);
void EraseRecord(uint id);
}
[Serializable]
public class DB6Storage<T> : Dictionary<uint, T>, IDB2Storage where T : new()
{
public void LoadData(uint indexField, DBClientHelper[] helpers, HotfixStatements preparedStatement, HotfixStatements preparedStatementLocale)
{
SQLResult result = DB.Hotfix.Query(DB.Hotfix.GetPreparedStatement(preparedStatement));
if (!result.IsEmpty())
{
do
{
var idValue = result.Read<uint>((int)indexField);
var obj = new T();
int index = 0;
for (var fieldIndex = 0; fieldIndex < helpers.Length; fieldIndex++)
{
var helper = helpers[fieldIndex];
if (helper.IsArray)
{
Array array = (Array)helper.Getter(obj);
for (var i = 0; i < array.Length; ++i)
{
switch (Type.GetTypeCode(helper.RealType))
{
case TypeCode.SByte:
helper.SetValue(array, result.Read<sbyte>(index++), i);
break;
case TypeCode.Byte:
helper.SetValue(array, result.Read<byte>(index++), i);
break;
case TypeCode.Int16:
helper.SetValue(array, result.Read<short>(index++), i);
break;
case TypeCode.UInt16:
helper.SetValue(array, result.Read<ushort>(index++), i);
break;
case TypeCode.Int32:
helper.SetValue(array, result.Read<int>(index++), i);
break;
case TypeCode.UInt32:
helper.SetValue(array, result.Read<uint>(index++), i);
break;
case TypeCode.Single:
helper.SetValue(array, result.Read<float>(index++), i);
break;
case TypeCode.String:
helper.SetValue(array, result.Read<string>(index++), i);
break;
case TypeCode.Object:
switch (helper.FieldType.Name)
{
case "Vector2":
var vector2 = new Vector2();
vector2.X = result.Read<float>(index++);
vector2.Y = result.Read<float>(index++);
helper.SetValue(array, vector2, i);
break;
case "Vector3":
var vector3 = new Vector3();
vector3.X = result.Read<float>(index++);
vector3.Y = result.Read<float>(index++);
vector3.Z = result.Read<float>(index++);
helper.SetValue(array, vector3, i);
break;
case "LocalizedString":
LocalizedString locString = new LocalizedString();
locString[Global.WorldMgr.GetDefaultDbcLocale()] = result.Read<string>(index++);
helper.SetValue(array, locString, i);
break;
default:
Log.outError(LogFilter.ServerLoading, "Wrong Array Type: {0}", helper.FieldType.Name);
break;
}
break;
default:
Log.outError(LogFilter.ServerLoading, "Wrong Array Type: {0}", helper.FieldType.Name);
break;
}
}
}
else
{
switch (Type.GetTypeCode(helper.RealType))
{
case TypeCode.SByte:
helper.SetValue(obj, result.Read<sbyte>(index++));
break;
case TypeCode.Byte:
helper.SetValue(obj, result.Read<byte>(index++));
break;
case TypeCode.Int16:
helper.SetValue(obj, result.Read<short>(index++));
break;
case TypeCode.UInt16:
helper.SetValue(obj, result.Read<ushort>(index++));
break;
case TypeCode.Int32:
helper.SetValue(obj, result.Read<int>(index++));
break;
case TypeCode.UInt32:
helper.SetValue(obj, result.Read<uint>(index++));
break;
case TypeCode.Single:
helper.SetValue(obj, result.Read<float>(index++));
break;
case TypeCode.String:
string str = result.Read<string>(index++);
helper.SetValue(obj, str);
break;
case TypeCode.Object:
switch (helper.FieldType.Name)
{
case "Vector2":
var vector2 = new Vector2();
vector2.X = result.Read<float>(index++);
vector2.Y = result.Read<float>(index++);
helper.SetValue(obj, vector2);
break;
case "Vector3":
var vector3 = new Vector3();
vector3.X = result.Read<float>(index++);
vector3.Y = result.Read<float>(index++);
vector3.Z = result.Read<float>(index++);
helper.SetValue(obj, vector3);
break;
case "LocalizedString":
LocalizedString locString = new LocalizedString();
locString[Global.WorldMgr.GetDefaultDbcLocale()] = result.Read<string>(index++);
helper.SetValue(obj, locString);
break;
default:
Log.outError(LogFilter.ServerLoading, "Wrong Array Type: {0}", helper.FieldType.Name);
break;
}
break;
default:
Log.outError(LogFilter.ServerLoading, "Wrong Array Type: {0}", helper.FieldType.Name);
break;
}
}
}
base[idValue] = obj;
}
while (result.NextRow());
}
if (preparedStatementLocale == 0)
return;
for (LocaleConstant locale = 0; locale < LocaleConstant.OldTotal; ++locale)
{
if (Global.WorldMgr.GetDefaultDbcLocale() == locale || locale == LocaleConstant.None)
continue;
PreparedStatement stmt = DB.Hotfix.GetPreparedStatement(preparedStatementLocale);
stmt.AddValue(0, locale.ToString());
SQLResult localeResult = DB.Hotfix.Query(stmt);
if (localeResult.IsEmpty())
continue;
do
{
int index = 0;
var obj = this.LookupByKey(localeResult.Read<uint>(index++));
if (obj == null)
continue;
for (var i = 0; i < helpers.Length; i++)
{
var fieldInfo = helpers[i];
if (fieldInfo.FieldType != typeof(LocalizedString))
continue;
LocalizedString locString = (LocalizedString)fieldInfo.Getter(obj);
locString[locale] = localeResult.Read<string>(index++);
}
} while (localeResult.NextRow());
}
}
public bool HasRecord(uint id)
{
return ContainsKey(id);
}
public void WriteRecord(uint id, LocaleConstant locale, ByteBuffer buffer)
{
T entry = this.LookupByKey(id);
foreach (var fieldInfo in entry.GetType().GetFields())
{
if (fieldInfo.Name == "Id")
continue;
var type = fieldInfo.FieldType;
if (type.IsArray)
{
WriteArrayValues(entry, fieldInfo, buffer);
continue;
}
switch (Type.GetTypeCode(type))
{
case TypeCode.Boolean:
buffer.WriteUInt8(fieldInfo.GetValue(entry));
break;
case TypeCode.SByte:
buffer.WriteInt8(fieldInfo.GetValue(entry));
break;
case TypeCode.Byte:
buffer.WriteUInt8(fieldInfo.GetValue(entry));
break;
case TypeCode.Int16:
buffer.WriteInt16(fieldInfo.GetValue(entry));
break;
case TypeCode.UInt16:
buffer.WriteUInt16(fieldInfo.GetValue(entry));
break;
case TypeCode.Int32:
buffer.WriteInt32(fieldInfo.GetValue(entry));
break;
case TypeCode.UInt32:
buffer.WriteUInt32(fieldInfo.GetValue(entry));
break;
case TypeCode.Int64:
buffer.WriteInt64(fieldInfo.GetValue(entry));
break;
case TypeCode.UInt64:
buffer.WriteUInt64(fieldInfo.GetValue(entry));
break;
case TypeCode.Single:
buffer.WriteFloat(fieldInfo.GetValue(entry));
break;
case TypeCode.Object:
switch (type.Name)
{
case "LocalizedString":
LocalizedString locStr = (LocalizedString)fieldInfo.GetValue(entry);
if (!locStr.HasString(locale))
{
locale = 0;
if (!locStr.HasString(locale))
{
buffer.WriteUInt16(0);
break;
}
}
string str = locStr[locale];
buffer.WriteCString(str);
break;
}
break;
}
}
}
void WriteArrayValues(object entry, FieldInfo fieldInfo, ByteBuffer buffer)
{
var type = fieldInfo.FieldType.GetElementType();
var array = (Array)fieldInfo.GetValue(entry);
for (var i = 0; i < array.Length; ++i)
{
switch (Type.GetTypeCode(type))
{
case TypeCode.Boolean:
buffer.WriteUInt8(array.GetValue(i));
break;
case TypeCode.SByte:
buffer.WriteInt8(array.GetValue(i));
break;
case TypeCode.Byte:
buffer.WriteUInt8(array.GetValue(i));
break;
case TypeCode.Int16:
buffer.WriteInt16(array.GetValue(i));
break;
case TypeCode.UInt16:
buffer.WriteUInt16(array.GetValue(i));
break;
case TypeCode.Int32:
buffer.WriteInt32(array.GetValue(i));
break;
case TypeCode.UInt32:
buffer.WriteUInt32(array.GetValue(i));
break;
case TypeCode.Int64:
buffer.WriteInt64(array.GetValue(i));
break;
case TypeCode.UInt64:
buffer.WriteUInt64(array.GetValue(i));
break;
case TypeCode.Single:
buffer.WriteFloat(array.GetValue(i));
break;
case TypeCode.String:
var str = (string)array.GetValue(i);
buffer.WriteCString(str);
break;
}
}
}
public void EraseRecord(uint id)
{
Remove(id);
}
}
}
@@ -0,0 +1,38 @@
/*
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
using System.Collections.Generic;
namespace Game.DataStorage
{
public class GameTable<T> where T : new()
{
public T GetRow(uint row)
{
if (row >= _data.Count)
return default(T);
return _data[(int)row];
}
public int GetTableRowCount() { return _data.Count; }
public void SetData(List<T> data) { _data = data; }
List<T> _data = new List<T>();
}
}
@@ -0,0 +1,212 @@
/*
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
using Framework.Database;
using System;
using System.Collections.Generic;
using System.Linq;
namespace Game.DataStorage
{
public class ConversationDataStorage : Singleton<ConversationDataStorage>
{
ConversationDataStorage() { }
public void LoadConversationTemplates()
{
_conversationActorTemplateStorage.Clear();
_conversationLineTemplateStorage.Clear();
_conversationTemplateStorage.Clear();
Dictionary<uint, ConversationActorTemplate[]> actorsByConversation = new Dictionary<uint, ConversationActorTemplate[]>();
SQLResult actorTemplates = DB.World.Query("SELECT Id, CreatureId, CreatureModelId FROM conversation_actor_template");
if (!actorTemplates.IsEmpty())
{
uint oldMSTime = Time.GetMSTime();
do
{
uint id = actorTemplates.Read<uint>(0);
ConversationActorTemplate conversationActor = new ConversationActorTemplate();
conversationActor.Id = id;
conversationActor.CreatureId = actorTemplates.Read<uint>(1);
conversationActor.CreatureModelId = actorTemplates.Read<uint>(2);
_conversationActorTemplateStorage[id] = conversationActor;
}
while (actorTemplates.NextRow());
Log.outInfo(LogFilter.ServerLoading, "Loaded {0} Conversation actor templates in {1} ms", _conversationActorTemplateStorage.Count, Time.GetMSTimeDiffToNow(oldMSTime));
}
else
{
Log.outInfo(LogFilter.ServerLoading, "Loaded 0 Conversation actor templates. DB table `conversation_actor_template` is empty.");
}
SQLResult lineTemplates = DB.World.Query("SELECT Id, StartTime, UiCameraID, ActorIdx, Unk FROM conversation_line_template");
if (!lineTemplates.IsEmpty())
{
uint oldMSTime = Time.GetMSTime();
do
{
uint id = lineTemplates.Read<uint>(0);
if (!CliDB.ConversationLineStorage.ContainsKey(id))
{
Log.outError(LogFilter.Sql, "Table `conversation_line_template` has template for non existing ConversationLine (ID: {0}), skipped", id);
continue;
}
ConversationLineTemplate conversationLine = new ConversationLineTemplate();
conversationLine.Id = id;
conversationLine.StartTime = lineTemplates.Read<uint>(1);
conversationLine.UiCameraID = lineTemplates.Read<uint>(2);
conversationLine.ActorIdx = lineTemplates.Read<ushort>(3);
conversationLine.Unk = lineTemplates.Read<ushort>(4);
_conversationLineTemplateStorage[id] = conversationLine;
}
while (lineTemplates.NextRow());
Log.outInfo(LogFilter.ServerLoading, "Loaded {0} Conversation line templates in {1} ms", _conversationLineTemplateStorage.Count, Time.GetMSTimeDiffToNow(oldMSTime));
}
else
{
Log.outInfo(LogFilter.ServerLoading, "Loaded 0 Conversation line templates. DB table `conversation_line_template` is empty.");
}
SQLResult actorResult = DB.World.Query("SELECT ConversationId, ConversationActorId, Idx FROM conversation_actors");
if (!actorResult.IsEmpty())
{
uint oldMSTime = Time.GetMSTime();
uint count = 0;
do
{
uint conversationId = actorResult.Read<uint>(0);
uint actorId = actorResult.Read<uint>(1);
ushort idx = actorResult.Read<ushort>(2);
ConversationActorTemplate conversationActorTemplate = _conversationActorTemplateStorage.LookupByKey(actorId);
if (conversationActorTemplate != null)
{
if (!actorsByConversation.ContainsKey(conversationId))
actorsByConversation[conversationId] = new ConversationActorTemplate[idx + 1];
ConversationActorTemplate[] actors = actorsByConversation[conversationId];
if (actors.Length <= idx)
Array.Resize(ref actors, idx + 1);
actors[idx] = conversationActorTemplate;
++count;
}
else
Log.outError(LogFilter.Sql, "Table `conversation_actors` references an invalid actor (ID: {0}) for Conversation {1}, skipped", actorId, conversationId);
}
while (actorResult.NextRow());
Log.outInfo(LogFilter.ServerLoading, "Loaded {0} Conversation actors in {1} ms", count, Time.GetMSTimeDiffToNow(oldMSTime));
}
else
{
Log.outInfo(LogFilter.ServerLoading, "Loaded 0 Conversation actors. DB table `conversation_actors` is empty.");
}
SQLResult templateResult = DB.World.Query("SELECT Id, FirstLineId, LastLineEndTime, VerifiedBuild FROM conversation_template");
if (!templateResult.IsEmpty())
{
uint oldMSTime = Time.GetMSTime();
do
{
ConversationTemplate conversationTemplate = new ConversationTemplate();
conversationTemplate.Id = templateResult.Read<uint>(0);
conversationTemplate.FirstLineId = templateResult.Read<uint>(1);
conversationTemplate.LastLineEndTime = templateResult.Read<uint>(2);
conversationTemplate.Actors = actorsByConversation[conversationTemplate.Id].ToList();
ConversationLineRecord currentConversationLine = CliDB.ConversationLineStorage.LookupByKey(conversationTemplate.FirstLineId);
if (currentConversationLine == null)
Log.outError(LogFilter.Sql, "Table `conversation_template` references an invalid line (ID: {0}) for Conversation {1}, skipped", conversationTemplate.FirstLineId, conversationTemplate.Id);
while (currentConversationLine != null)
{
ConversationLineTemplate conversationLineTemplate = _conversationLineTemplateStorage.LookupByKey(currentConversationLine.Id);
if (conversationLineTemplate != null)
conversationTemplate.Lines.Add(conversationLineTemplate);
else
Log.outError(LogFilter.Sql, "Table `conversation_line_template` has missing template for line (ID: {0}) in Conversation {1}, skipped", currentConversationLine.Id, conversationTemplate.Id);
if (currentConversationLine.NextLineID == 0)
break;
currentConversationLine = CliDB.ConversationLineStorage.LookupByKey(currentConversationLine.NextLineID);
}
_conversationTemplateStorage[conversationTemplate.Id] = conversationTemplate;
}
while (templateResult.NextRow());
Log.outInfo(LogFilter.ServerLoading, "Loaded {0} Conversation templates in {1} ms", _conversationTemplateStorage.Count, Time.GetMSTimeDiffToNow(oldMSTime));
}
else
{
Log.outInfo(LogFilter.ServerLoading, "Loaded 0 Conversation templates. DB table `conversation_template` is empty.");
}
}
public ConversationTemplate GetConversationTemplate(uint conversationId)
{
return _conversationTemplateStorage.LookupByKey(conversationId);
}
Dictionary<uint, ConversationTemplate> _conversationTemplateStorage = new Dictionary<uint, ConversationTemplate>();
Dictionary<uint, ConversationActorTemplate> _conversationActorTemplateStorage = new Dictionary<uint, ConversationActorTemplate>();
Dictionary<uint, ConversationLineTemplate> _conversationLineTemplateStorage = new Dictionary<uint, ConversationLineTemplate>();
}
public class ConversationActorTemplate
{
public uint Id;
public uint CreatureId;
public uint CreatureModelId;
}
public class ConversationLineTemplate
{
public uint Id; // Link to ConversationLine.db2
public uint StartTime; // Time in ms after conversation creation the line is displayed
public uint UiCameraID; // Link to UiCamera.db2
public ushort ActorIdx; // Index from conversation_actors
public ushort Unk;
}
public class ConversationTemplate
{
public uint Id;
public uint FirstLineId; // Link to ConversationLine.db2
public uint LastLineEndTime; // Time in ms after conversation creation the last line fades out
public List<ConversationActorTemplate> Actors = new List<ConversationActorTemplate>();
public List<ConversationLineTemplate> Lines = new List<ConversationLineTemplate>();
}
}
File diff suppressed because it is too large Load Diff
+227
View File
@@ -0,0 +1,227 @@
/*
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
using Framework.GameMath;
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.InteropServices;
namespace Game.DataStorage
{
public class M2Storage
{
// Convert the geomoetry from a spline value, to an actual WoW XYZ
static Vector3 translateLocation(Vector4 dbcLocation, Vector3 basePosition, Vector3 splineVector)
{
Vector3 work = new Vector3();
float x = basePosition.X + splineVector.X;
float y = basePosition.Y + splineVector.Y;
float z = basePosition.Z + splineVector.Z;
float distance = (float)Math.Sqrt((x * x) + (y * y));
float angle = (float)Math.Atan2(x, y) - dbcLocation.W;
if (angle < 0)
angle += 2 * MathFunctions.PI;
work.X = dbcLocation.X + (distance * (float)Math.Sin(angle));
work.Y = dbcLocation.Y + (distance * (float)Math.Cos(angle));
work.Z = dbcLocation.Z + z;
return work;
}
// Number of cameras not used. Multiple cameras never used in 7.1.5
static void readCamera(M2Camera cam, uint buffSize, BinaryReader buffer, CinematicCameraRecord dbcentry)
{
List<FlyByCamera> cameras = new List<FlyByCamera>();
List<FlyByCamera> targetcam = new List<FlyByCamera>();
Vector4 dbcData = new Vector4(dbcentry.Origin.X, dbcentry.Origin.Y, dbcentry.Origin.Z, dbcentry.OriginFacing);
// Read target locations, only so that we can calculate orientation
for (uint k = 0; k < cam.target_positions.timestamps.number; ++k)
{
// Extract Target positions
M2Array targTsArray = new M2Array(buffer, cam.target_positions.timestamps.offset_elements);
buffer.BaseStream.Position = targTsArray.offset_elements;
uint[] targTimestamps = new uint[targTsArray.number];
for (var i = 0; i < targTsArray.number; ++i)
targTimestamps[i] = buffer.ReadUInt32();
M2Array targArray = new M2Array(buffer, cam.target_positions.values.offset_elements);
buffer.BaseStream.Position = targArray.offset_elements;
M2SplineKey[] targPositions = new M2SplineKey[targArray.number];
for (var i = 0; i < targArray.number; ++i)
targPositions[i] = new M2SplineKey(buffer);
// Read the data for this set
uint currPos = targArray.offset_elements;
for (uint i = 0; i < targTsArray.number; ++i)
{
// Translate co-ordinates
Vector3 newPos = translateLocation(dbcData, cam.target_position_base, targPositions[i].p0);
// Add to vector
FlyByCamera thisCam = new FlyByCamera();
thisCam.timeStamp = targTimestamps[i];
thisCam.locations = new Vector4(newPos.X, newPos.Y, newPos.Z, 0.0f);
targetcam.Add(thisCam);
currPos += (uint)Marshal.SizeOf<M2SplineKey>();
}
}
// Read camera positions and timestamps (translating first position of 3 only, we don't need to translate the whole spline)
for (uint k = 0; k < cam.positions.timestamps.number; ++k)
{
// Extract Camera positions for this set
M2Array posTsArray = buffer.ReadStruct<M2Array>(cam.positions.timestamps.offset_elements);
buffer.BaseStream.Position = posTsArray.offset_elements;
uint[] posTimestamps = new uint[posTsArray.number];
for (var i = 0; i < posTsArray.number; ++i)
posTimestamps[i] = buffer.ReadUInt32();
M2Array posArray = new M2Array(buffer, cam.positions.values.offset_elements);
buffer.BaseStream.Position = posArray.offset_elements;
M2SplineKey[] positions = new M2SplineKey[posTsArray.number];
for (var i = 0; i < posTsArray.number; ++i)
positions[i] = new M2SplineKey(buffer);
// Read the data for this set
uint currPos = posArray.offset_elements;
for (uint i = 0; i < posTsArray.number; ++i)
{
// Translate co-ordinates
Vector3 newPos = translateLocation(dbcData, cam.position_base, positions[i].p0);
// Add to vector
FlyByCamera thisCam = new FlyByCamera();
thisCam.timeStamp = posTimestamps[i];
thisCam.locations = new Vector4(newPos.X, newPos.Y, newPos.Z, 0);
if (targetcam.Count > 0)
{
// Find the target camera before and after this camera
FlyByCamera lastTarget;
FlyByCamera nextTarget;
// Pre-load first item
lastTarget = targetcam[0];
nextTarget = targetcam[0];
for (int j = 0; j < targetcam.Count; ++j)
{
nextTarget = targetcam[j];
if (targetcam[j].timeStamp > posTimestamps[i])
break;
lastTarget = targetcam[j];
}
float x = lastTarget.locations.X;
float y = lastTarget.locations.Y;
float z = lastTarget.locations.Z;
// Now, the timestamps for target cam and position can be different. So, if they differ we interpolate
if (lastTarget.timeStamp != posTimestamps[i])
{
uint timeDiffTarget = nextTarget.timeStamp - lastTarget.timeStamp;
uint timeDiffThis = posTimestamps[i] - lastTarget.timeStamp;
float xDiff = nextTarget.locations.X - lastTarget.locations.X;
float yDiff = nextTarget.locations.Y - lastTarget.locations.Y;
float zDiff = nextTarget.locations.Z - lastTarget.locations.Z;
x = lastTarget.locations.X + (xDiff * (timeDiffThis / timeDiffTarget));
y = lastTarget.locations.Y + (yDiff * (timeDiffThis / timeDiffTarget));
z = lastTarget.locations.Z + (zDiff * (timeDiffThis / timeDiffTarget));
}
float xDiff1 = x - thisCam.locations.X;
float yDiff1 = y - thisCam.locations.Y;
thisCam.locations.W = (float)Math.Atan2(yDiff1, xDiff1);
if (thisCam.locations.W < 0)
thisCam.locations.W += 2 * MathFunctions.PI;
}
cameras.Add(thisCam);
currPos += (uint)Marshal.SizeOf<M2SplineKey>();
}
}
FlyByCameraStorage[dbcentry.ID] = cameras;
}
public static void LoadM2Cameras(string dataPath)
{
FlyByCameraStorage.Clear();
Log.outInfo(LogFilter.ServerLoading, "Loading Cinematic Camera files");
uint oldMSTime = Time.GetMSTime();
foreach (CinematicCameraRecord cameraEntry in CliDB.CinematicCameraStorage.Values)
{
string filename = dataPath + "/cameras/" + string.Format("FILE{0:x8}.xxx", cameraEntry.ModelFileDataID);
try
{
using (BinaryReader m2file = new BinaryReader(new FileStream(filename, FileMode.Open, FileAccess.Read)))
{
// Check file has correct magic (MD21)
if (m2file.ReadStringFromChars(4) != "MD21")
{
Log.outError(LogFilter.ServerLoading, "Camera file {0} is damaged. File identifier not found.", filename);
continue;
}
var unknownSize = m2file.ReadUInt32(); //unknown size
// Read header
M2Header header = m2file.ReadStruct<M2Header>();
var buffer = new BinaryReader(new MemoryStream(m2file.ToByteArray(), 8, (int)(m2file.BaseStream.Length - 8)));
// Get camera(s) - Main header, then dump them.
M2Camera cam = m2file.ReadStruct<M2Camera>(8 + header.ofsCameras);
readCamera(cam, (uint)m2file.BaseStream.Length - 8, buffer, cameraEntry);
}
}
catch (EndOfStreamException)
{
Log.outError(LogFilter.ServerLoading, "Camera file {0} is damaged. Camera references position beyond file end", filename);
}
catch (FileNotFoundException)
{
Log.outError(LogFilter.ServerLoading, "File {0} not found!!!!", filename);
}
}
Log.outInfo(LogFilter.ServerLoading, "Loaded {0} cinematic waypoint sets in {1} ms", FlyByCameraStorage.Count, Time.GetMSTimeDiffToNow(oldMSTime));
}
public static List<FlyByCamera> GetFlyByCameras(uint cameraId)
{
return FlyByCameraStorage.LookupByKey(cameraId);
}
static MultiMap<uint, FlyByCamera> FlyByCameraStorage = new MultiMap<uint, FlyByCamera>();
}
public class FlyByCamera
{
public uint timeStamp;
public Vector4 locations;
}
}
@@ -0,0 +1,221 @@
/*
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
using Framework.Constants;
using Framework.GameMath;
using System;
namespace Game.DataStorage
{
public class AchievementRecord
{
public LocalizedString Title;
public LocalizedString Description;
public AchievementFlags Flags;
public LocalizedString Reward;
public short MapID;
public ushort Supercedes;
public ushort Category;
public ushort UiOrder;
public ushort SharesCriteria;
public ushort CriteriaTree;
public AchievementFaction Faction;
public byte Points;
public byte MinimumCriteria;
public uint Id;
public uint IconFileDataID;
}
public sealed class AnimKitRecord
{
public uint Id;
public uint OneShotDuration;
public ushort OneShotStopAnimKitID;
public ushort LowDefAnimKitID;
}
public sealed class AreaGroupMemberRecord
{
public uint Id;
public ushort AreaGroupID;
public ushort AreaID;
}
public sealed class AreaTableRecord
{
public uint Id;
public AreaFlags[] Flags = new AreaFlags[2];
public string ZoneName;
public float AmbientMultiplier;
public LocalizedString AreaName;
public ushort MapId;
public ushort ParentAreaID;
public short AreaBit;
public ushort AmbienceID;
public ushort ZoneMusic;
public ushort IntroSound;
public ushort[] LiquidTypeID = new ushort[4];
public ushort UWZoneMusic;
public ushort UWAmbience;
public ushort PvPCombastWorldStateID;
public byte SoundProviderPref;
public byte SoundProviderPrefUnderwater;
public byte ExplorationLevel;
public byte FactionGroupMask;
public byte MountFlags;
public byte WildBattlePetLevelMin;
public byte WildBattlePetLevelMax;
public byte WindSettingsID;
public byte[] UWIntroSound = new byte[2];
public bool IsSanctuary()
{
if (MapId == 609)
return true;
return Flags[0].HasAnyFlag(AreaFlags.Sanctuary);
}
}
public sealed class AreaTriggerRecord
{
public Vector3 Pos;
public float Radius;
public float BoxLength;
public float BoxWidth;
public float BoxHeight;
public float BoxYaw;
public ushort MapID;
public ushort PhaseID;
public ushort PhaseGroupID;
public ushort ShapeID;
public ushort AreaTriggerActionSetID;
public byte PhaseUseFlags;
public byte ShapeType;
public byte Flags;
public uint Id;
}
public sealed class ArmorLocationRecord
{
public uint Id;
public float[] Modifier = new float[5];
}
public sealed class ArtifactRecord
{
public uint Id;
public LocalizedString Name;
public uint BarConnectedColor;
public uint BarDisconnectedColor;
public uint TitleColor;
public ushort ClassUiTextureKitID;
public ushort SpecID;
public byte ArtifactCategoryID;
public byte Flags;
public uint UiModelSceneID;
public uint SpellVisualKitID;
}
public sealed class ArtifactAppearanceRecord
{
public LocalizedString Name;
public uint SwatchColor;
public float ModelDesaturation;
public float ModelAlpha;
public uint ShapeshiftDisplayID;
public ushort ArtifactAppearanceSetID;
public ushort Unknown;
public byte DisplayIndex;
public byte AppearanceModID;
public byte Flags;
public byte ModifiesShapeshiftFormDisplay;
public uint Id;
public uint PlayerConditionID;
public uint ItemAppearanceID;
public uint AltItemAppearanceID;
}
public sealed class ArtifactAppearanceSetRecord
{
public LocalizedString Name;
public LocalizedString Name2;
public ushort UiCameraID;
public ushort AltHandUICameraID;
public byte ArtifactID;
public byte DisplayIndex;
public byte AttachmentPoint;
public byte Flags;
public uint Id;
}
public sealed class ArtifactCategoryRecord
{
public uint Id;
public ushort ArtifactKnowledgeCurrencyID;
public ushort ArtifactKnowledgeMultiplierCurveID;
}
public sealed class ArtifactPowerRecord
{
public Vector2 Pos;
public byte ArtifactID;
public ArtifactPowerFlag Flags;
public byte MaxRank;
public byte ArtifactTier;
public uint Id;
public int RelicType;
}
public sealed class ArtifactPowerLinkRecord
{
public uint Id;
public ushort FromArtifactPowerID;
public ushort ToArtifactPowerID;
}
public sealed class ArtifactPowerPickerRecord
{
public uint Id;
public uint PlayerConditionID;
}
public sealed class ArtifactPowerRankRecord
{
public uint Id;
public uint SpellID;
public float Value;
public ushort ArtifactPowerID;
public ushort Unknown;
public byte Rank;
}
public sealed class ArtifactQuestXPRecord
{
public uint Id;
public uint[] Exp = new uint[10];
}
public sealed class AuctionHouseRecord
{
public uint Id;
public LocalizedString Name;
public ushort FactionID;
public byte DepositRate;
public byte ConsignmentRate;
}
}
@@ -0,0 +1,119 @@
/*
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
namespace Game.DataStorage
{
public sealed class BankBagSlotPricesRecord
{
public uint Id;
public uint Cost;
}
public sealed class BannedAddOnsRecord
{
public uint Id;
public string Name;
public string Version;
public byte[] Flags = new byte[4];
}
public sealed class BarberShopStyleRecord
{
public LocalizedString DisplayName;
public LocalizedString Description;
public float CostModifier;
public byte Type;
public byte Race;
public byte Sex;
public byte Data;
public uint Id;
}
public sealed class BattlePetBreedQualityRecord
{
public uint Id;
public float Modifier;
public byte Quality;
}
public sealed class BattlePetBreedStateRecord
{
public uint Id;
public short Value;
public byte BreedID;
public byte State;
}
public sealed class BattlePetSpeciesRecord
{
public uint CreatureID;
public uint IconFileID;
public uint SummonSpellID;
public LocalizedString SourceText;
public LocalizedString Description;
public ushort Flags;
public byte PetType;
public sbyte Source;
public uint Id;
public uint CardModelSceneID;
public uint LoadoutModelSceneID;
}
public sealed class BattlePetSpeciesStateRecord
{
public uint Id;
public int Value;
public ushort SpeciesID;
public byte State;
}
public sealed class BattlemasterListRecord
{
public uint Id;
public LocalizedString Name;
public uint IconFileDataID;
public LocalizedString GameType;
public LocalizedString ShortDescription;
public LocalizedString LongDescription;
public short[] MapId = new short[16];
public ushort HolidayWorldState;
public ushort PlayerConditionId;
public byte InstanceType;
public byte GroupsAllowed;
public byte MaxGroupSize;
public byte MinLevel;
public byte MaxLevel;
public byte RatedPlayers;
public byte MinPlayers;
public byte MaxPlayers;
public byte Flags;
}
public sealed class BroadcastTextRecord
{
public uint Id;
public LocalizedString MaleText;
public LocalizedString FemaleText;
public ushort[] EmoteID = new ushort[3];
public ushort[] EmoteDelay = new ushort[3];
public ushort UnkEmoteID;
public byte Language;
public byte Type;
public uint[] SoundID = new uint[2];
public uint PlayerConditionID;
}
}
@@ -0,0 +1,357 @@
/*
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
using Framework.Constants;
using Framework.GameMath;
namespace Game.DataStorage
{
public sealed class CharacterFacialHairStylesRecord
{
public uint ID;
public uint[] Geoset = new uint[5];
public byte RaceID;
public byte SexID;
public byte VariationID;
}
public sealed class CharBaseSectionRecord
{
public uint ID;
public CharBaseSectionVariation Variation;
public byte ResolutionVariation;
public byte Resolution;
}
public sealed class CharSectionsRecord
{
public uint Id;
public uint[] TextureFileDataID = new uint[3];
public ushort Flags;
public byte RaceID;
public byte SexID;
public byte BaseSection;
public byte VariationIndex;
public byte ColorIndex;
}
public sealed class CharStartOutfitRecord
{
public uint Id;
public int[] ItemID = new int[24];
public uint PetDisplayID;
public byte RaceID;
public byte ClassID;
public byte GenderID;
public byte OutfitID;
public byte PetFamilyID;
}
public sealed class CharTitlesRecord
{
public uint Id;
public LocalizedString NameMale;
public LocalizedString NameFemale;
public ushort MaskID;
public byte Flags;
}
public sealed class ChatChannelsRecord
{
public uint Id;
public ChannelDBCFlags Flags;
public LocalizedString Name;
public LocalizedString Shortcut;
public byte FactionGroup;
}
public sealed class ChrClassesRecord
{
public string PetNameToken;
public LocalizedString Name;
public LocalizedString NameFemale;
public LocalizedString NameMale;
public uint FileName;
public uint CreateScreenFileDataID;
public uint SelectScreenFileDataID;
public uint IconFileDataID;
public uint LowResScreenFileDataID;
public ushort Flags;
public ushort CinematicSequenceID;
public ushort DefaultSpec;
public PowerType PowerType;
public byte SpellClassSet;
public byte AttackPowerPerStrength;
public byte AttackPowerPerAgility;
public byte RangedAttackPowerPerAgility;
public byte Unk1;
public uint Id;
}
public sealed class ChrClassesXPowerTypesRecord
{
public uint Id;
public byte ClassID;
public byte PowerType;
}
public sealed class ChrRacesRecord
{
public uint Id;
public uint Flags;
public uint ClientPrefix;
public uint ClientFileString;
public LocalizedString Name;
public LocalizedString NameFemale;
public LocalizedString NameMale;
public string[] FacialHairCustomization = new string[2];
public string HairCustomization;
public uint CreateScreenFileDataID;
public uint SelectScreenFileDataID;
public uint[] MaleCustomizeOffset = new uint[3];
public uint[] FemaleCustomizeOffset = new uint[3];
public uint LowResScreenFileDataID;
public ushort FactionID;
public ushort MaleDisplayID;
public ushort FemaleDisplayID;
public ushort ResSicknessSpellID;
public ushort SplashSoundID;
public ushort CinematicSequenceID;
public byte BaseLanguage;
public byte CreatureType;
public byte TeamID;
public byte RaceRelated;
public byte UnalteredVisualRaceID;
public byte CharComponentTextureLayoutID;
public byte DefaultClassID;
public byte NeutralRaceID;
public byte ItemAppearanceFrameRaceID;
public byte CharComponentTexLayoutHiResID;
public uint HighResMaleDisplayID;
public uint HighResFemaleDisplayID;
public uint[] Unk = new uint[3];
}
public sealed class ChrSpecializationRecord
{
public uint[] MasterySpellID = new uint[PlayerConst.MaxMasterySpells];
public LocalizedString Name;
public LocalizedString Name2;
public LocalizedString Description;
public byte ClassID;
public byte OrderIndex;
public byte PetTalentType;
public byte Role;
public byte PrimaryStatOrder;
public uint Id;
public uint IconFileDataID;
public ChrSpecializationFlag Flags;
public uint AnimReplacementSetID;
public bool IsPetSpecialization()
{
return ClassID == 0;
}
}
public sealed class CinematicCameraRecord
{
public uint ID;
public uint SoundID;
public Vector3 Origin;
public float OriginFacing;
public uint ModelFileDataID;
}
public sealed class CinematicSequencesRecord
{
public uint Id;
public uint SoundID;
public ushort[] Camera = new ushort[8];
}
public sealed class ConversationLineRecord
{
public uint Id;
public uint BroadcastTextID;
public uint SpellVisualKitID;
public uint Duration;
public ushort NextLineID;
public ushort Unk1;
public byte Yell;
public byte Unk2;
public byte Unk3;
}
public sealed class CreatureDisplayInfoRecord
{
public uint Id;
public float CreatureModelScale;
public ushort ModelID;
public ushort NPCSoundID;
public byte SizeClass;
public byte Flags;
public sbyte Gender;
public uint ExtendedDisplayInfoID;
public uint[] TextureVariation = new uint[3];
public uint PortraitTextureFileDataID;
public byte CreatureModelAlpha;
public ushort SoundID;
public float PlayerModelScale;
public uint PortraitCreatureDisplayInfoID;
public byte BloodID;
public ushort ParticleColorID;
public uint CreatureGeosetData;
public ushort ObjectEffectPackageID;
public ushort AnimReplacementSetID;
public sbyte UnarmedWeaponSubclass;
public uint StateSpellVisualKitID;
public float InstanceOtherPlayerPetScale; // scale of not own player pets inside dungeons/raids/scenarios
public uint MountSpellVisualKitID;
}
public sealed class CreatureDisplayInfoExtraRecord
{
public uint Id;
public uint FileDataID;
public uint HDFileDataID;
public byte DisplayRaceID;
public byte DisplaySexID;
public byte DisplayClassID;
public byte SkinID;
public byte FaceID;
public byte HairStyleID;
public byte HairColorID;
public byte FacialHairID;
public byte[] CustomDisplayOption = new byte[3];
public byte Flags;
}
public sealed class CreatureFamilyRecord
{
public uint Id;
public float MinScale;
public float MaxScale;
public LocalizedString Name;
public uint IconFileDataID;
public ushort[] SkillLine = new ushort[2];
public ushort PetFoodMask;
public byte MinScaleLevel;
public byte MaxScaleLevel;
public byte PetTalentType;
}
public sealed class CreatureModelDataRecord
{
public uint Id;
public float ModelScale;
public float FootprintTextureLength;
public float FootprintTextureWidth;
public float FootprintParticleScale;
public float CollisionWidth;
public float CollisionHeight;
public float MountHeight;
public float[] GeoBoxMin = new float[3];
public float[] GeoBoxMax = new float[3];
public float WorldEffectScale;
public float AttachedEffectScale;
public float MissileCollisionRadius;
public float MissileCollisionPush;
public float MissileCollisionRaise;
public float OverrideLootEffectScale;
public float OverrideNameScale;
public float OverrideSelectionRadius;
public float TamedPetBaseScale;
public float HoverHeight;
public uint Flags;
public uint FileDataID;
public uint SizeClass;
public uint BloodID;
public uint FootprintTextureID;
public uint FoleyMaterialID;
public uint FootstepEffectID;
public uint DeathThudEffectID;
public uint SoundID;
public uint CreatureGeosetDataID;
}
public sealed class CreatureTypeRecord
{
public uint Id;
public LocalizedString Name;
public byte Flags;
}
public sealed class CriteriaRecord
{
public uint Id;
public uint Asset;
public uint StartAsset;
public uint FailAsset;
public ushort StartTimer;
public ushort ModifierTreeId;
public ushort EligibilityWorldStateID;
public CriteriaTypes Type;
public CriteriaTimedTypes StartEvent;
public byte FailEvent;
public byte Flags;
public byte EligibilityWorldStateValue;
}
public sealed class CriteriaTreeRecord
{
public uint Id;
public uint Amount;
public LocalizedString Description;
public ushort Parent;
public CriteriaTreeFlags Flags;
public byte Operator;
public uint CriteriaID;
public int OrderIndex;
}
public sealed class CurrencyTypesRecord
{
public uint Id;
public LocalizedString Name;
public uint MaxQty;
public uint MaxEarnablePerWeek;
public CurrencyFlags Flags;
public LocalizedString Description;
public byte CategoryID;
public byte SpellCategory;
public byte Quality;
public uint InventoryIconFileDataID;
public uint SpellWeight;
}
public sealed class CurveRecord
{
public uint ID;
public byte Type;
public byte Unused;
}
public sealed class CurvePointRecord
{
public uint Id;
public float X;
public float Y;
public ushort CurveID;
public byte Index;
}
}
@@ -0,0 +1,92 @@
/*
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
using Framework.Constants;
namespace Game.DataStorage
{
public sealed class DestructibleModelDataRecord
{
public uint Id;
public ushort StateDamagedDisplayID;
public ushort StateDestroyedDisplayID;
public ushort StateRebuildingDisplayID;
public ushort StateSmokeDisplayID;
public ushort HealEffectSpeed;
public byte StateDamagedImpactEffectDoodadSet;
public byte StateDamagedAmbientDoodadSet;
public byte StateDamagedNameSet;
public byte StateDestroyedDestructionDoodadSet;
public byte StateDestroyedImpactEffectDoodadSet;
public byte StateDestroyedAmbientDoodadSet;
public byte StateDestroyedNameSet;
public byte StateRebuildingDestructionDoodadSet;
public byte StateRebuildingImpactEffectDoodadSet;
public byte StateRebuildingAmbientDoodadSet;
public byte StateRebuildingNameSet;
public byte StateSmokeInitDoodadSet;
public byte StateSmokeAmbientDoodadSet;
public byte StateSmokeNameSet;
public byte EjectDirection;
public byte DoNotHighlight;
public byte HealEffect;
}
public sealed class DifficultyRecord
{
public uint Id;
public LocalizedString Name;
public ushort GroupSizeHealthCurveID;
public ushort GroupSizeDmgCurveID;
public ushort GroupSizeSpellPointsCurveID;
public byte FallbackDifficultyID;
public MapTypes InstanceType;
public byte MinPlayers;
public byte MaxPlayers;
public sbyte OldEnumValue;
public DifficultyFlags Flags;
public byte ToggleDifficultyID;
public byte ItemBonusTreeModID;
public byte OrderIndex;
}
public sealed class DungeonEncounterRecord
{
public LocalizedString Name;
public uint CreatureDisplayID;
public ushort MapID;
public byte DifficultyID;
public byte Bit;
public byte Flags;
public uint Id;
public uint OrderIndex;
public uint TextureFileDataID;
}
public sealed class DurabilityCostsRecord
{
public uint Id;
public ushort[] WeaponSubClassCost = new ushort[21];
public ushort[] ArmorSubClassCost = new ushort[8];
}
public sealed class DurabilityQualityRecord
{
public uint Id;
public float QualityMod;
}
}
@@ -0,0 +1,50 @@
/*
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
namespace Game.DataStorage
{
public sealed class EmotesRecord
{
public uint Id;
public uint EmoteSlashCommand;
public uint SpellVisualKitID;
public uint EmoteFlags;
public int RaceMask;
public ushort AnimID;
public byte EmoteSpecProc;
public uint EmoteSpecProcParam;
public uint EmoteSoundID;
public int ClassMask;
}
public sealed class EmotesTextRecord
{
public uint Id;
public LocalizedString Name;
public ushort EmoteID;
}
public sealed class EmotesTextSoundRecord
{
public uint Id;
public ushort EmotesTextId;
public byte RaceId;
public byte SexId;
public byte ClassId;
public uint SoundId;
}
}
@@ -0,0 +1,103 @@
/*
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
using Framework.Constants;
using System;
namespace Game.DataStorage
{
public sealed class FactionRecord
{
public uint Id;
public uint[] ReputationRaceMask = new uint[4];
public int[] ReputationBase = new int[4];
public float ParentFactionModIn; // Faction gains incoming rep * ParentFactionModIn
public float ParentFactionModOut; // Faction outputs rep * ParentFactionModOut as spillover reputation
public LocalizedString Name;
public LocalizedString Description;
public uint[] ReputationMax = new uint[4];
public short ReputationIndex;
public ushort[] ReputationClassMask = new ushort[4];
public ushort[] ReputationFlags = new ushort[4];
public ushort ParentFactionID;
public ushort ParagonFactionID;
public byte ParentFactionCapIn; // The highest rank the faction will profit from incoming spillover
public byte ParentFactionCapOut;
public byte Expansion;
public byte Flags;
public byte FriendshipRepID;
public bool CanHaveReputation()
{
return ReputationIndex >= 0;
}
}
public sealed class FactionTemplateRecord
{
public uint Id;
public ushort Faction;
public ushort Flags;
public ushort[] Enemies = new ushort[4];
public ushort[] Friends = new ushort[4];
public byte Mask;
public byte FriendMask;
public byte EnemyMask;
public bool IsFriendlyTo(FactionTemplateRecord entry)
{
if (Id == entry.Id)
return true;
if (entry.Faction != 0)
{
for (int i = 0; i < 4; ++i)
if (Enemies[i] == entry.Faction)
return false;
for (int i = 0; i < 4; ++i)
if (Friends[i] == entry.Faction)
return true;
}
return Convert.ToBoolean(FriendMask & entry.Mask) || Convert.ToBoolean(Mask & entry.FriendMask);
}
public bool IsHostileTo(FactionTemplateRecord entry)
{
if (Id == entry.Id)
return false;
if (entry.Faction != 0)
{
for (int i = 0; i < 4; ++i)
if (Enemies[i] == entry.Faction)
return true;
for (int i = 0; i < 4; ++i)
if (Friends[i] == entry.Faction)
return false;
}
return (EnemyMask & entry.Mask) != 0;
}
public bool IsHostileToPlayers() { return (EnemyMask & (uint)FactionMasks.Player) != 0; }
public bool IsNeutralToAll()
{
for (int i = 0; i < 4; ++i)
if (Enemies[i] != 0)
return false;
return EnemyMask == 0 && FriendMask == 0;
}
public bool IsContestedGuardFaction() { return Flags.HasAnyFlag((ushort)FactionTemplateFlags.ContestedGuard); }
public bool ShouldSparAttack() { return Flags.HasAnyFlag((ushort)FactionTemplateFlags.EnemySpar); }
}
}
@@ -0,0 +1,270 @@
/*
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
using Framework.Constants;
using Framework.GameMath;
namespace Game.DataStorage
{
public sealed class GameObjectsRecord
{
public Vector3 Position;
public float RotationX;
public float RotationY;
public float RotationZ;
public float RotationW;
public float Size;
public int[] Data = new int[8];
public LocalizedString Name;
public ushort MapID;
public ushort DisplayID;
public ushort PhaseID;
public ushort PhaseGroupID;
public byte PhaseUseFlags;
public GameObjectTypes Type;
public uint Id;
}
public sealed class GameObjectDisplayInfoRecord
{
public uint Id;
public uint FileDataID;
public Vector3 GeoBoxMin;
public Vector3 GeoBoxMax;
public float OverrideLootEffectScale;
public float OverrideNameScale;
public ushort ObjectEffectPackageID;
}
public sealed class GarrAbilityRecord
{
public LocalizedString Name;
public LocalizedString Description;
public uint IconFileDataID;
public GarrisonAbilityFlags Flags;
public ushort OtherFactionGarrAbilityID;
public byte GarrAbilityCategoryID;
public byte FollowerTypeID;
public uint Id;
}
public sealed class GarrBuildingRecord
{
public uint Id;
public uint HordeGameObjectID;
public uint AllianceGameObjectID;
public LocalizedString NameAlliance;
public LocalizedString NameHorde;
public LocalizedString Description;
public LocalizedString Tooltip;
public uint IconFileDataID;
public ushort CostCurrencyID;
public ushort HordeTexPrefixKitID;
public ushort AllianceTexPrefixKitID;
public ushort AllianceActivationScenePackageID;
public ushort HordeActivationScenePackageID;
public ushort FollowerRequiredGarrAbilityID;
public ushort FollowerGarrAbilityEffectID;
public short CostMoney;
public byte Unknown;
public byte Type;
public byte Level;
public GarrisonBuildingFlags Flags;
public byte MaxShipments;
public byte GarrTypeID;
public int BuildDuration;
public int CostCurrencyAmount;
public int BonusAmount;
}
public sealed class GarrBuildingPlotInstRecord
{
public Vector2 LandmarkOffset;
public ushort UiTextureAtlasMemberID;
public ushort GarrSiteLevelPlotInstID;
public byte GarrBuildingID;
public uint Id;
}
public sealed class GarrClassSpecRecord
{
public LocalizedString NameMale;
public LocalizedString NameFemale;
public LocalizedString NameGenderless;
public ushort ClassAtlasID; // UiTextureAtlasMember.db2 ref
public ushort GarrFollItemSetID;
public byte Limit;
public byte Flags;
public uint Id;
}
public sealed class GarrFollowerRecord
{
public uint HordeCreatureID;
public uint AllianceCreatureID;
public LocalizedString HordeSourceText;
public LocalizedString AllianceSourceText;
public uint HordePortraitIconID;
public uint AlliancePortraitIconID;
public uint HordeAddedBroadcastTextID;
public uint AllianceAddedBroadcastTextID;
public LocalizedString Name;
public ushort HordeGarrFollItemSetID;
public ushort AllianceGarrFollItemSetID;
public ushort ItemLevelWeapon;
public ushort ItemLevelArmor;
public ushort HordeListPortraitTextureKitID;
public ushort AllianceListPortraitTextureKitID;
public byte FollowerTypeID;
public byte HordeUiAnimRaceInfoID;
public byte AllianceUiAnimRaceInfoID;
public byte Quality;
public byte HordeGarrClassSpecID;
public byte AllianceGarrClassSpecID;
public byte Level;
public byte Unknown1;
public byte Flags;
public sbyte Unknown2;
public sbyte Unknown3;
public byte GarrTypeID;
public byte MaxDurability;
public byte Class;
public byte HordeFlavorTextGarrStringID;
public byte AllianceFlavorTextGarrStringID;
public uint Id;
}
public sealed class GarrFollowerXAbilityRecord
{
public uint Id;
public ushort GarrFollowerID;
public ushort GarrAbilityID;
public byte FactionIndex;
}
public sealed class GarrPlotRecord
{
public uint Id;
public LocalizedString Name;
public uint AllianceConstructionGameObjectID;
public uint HordeConstructionGameObjectID;
public byte GarrPlotUICategoryID;
public byte PlotType;
public byte Flags;
public uint MinCount;
public uint MaxCount;
}
public sealed class GarrPlotBuildingRecord
{
public uint Id;
public byte GarrPlotID;
public byte GarrBuildingID;
}
public sealed class GarrPlotInstanceRecord
{
public uint Id;
public LocalizedString Name;
public byte GarrPlotID;
}
public sealed class GarrSiteLevelRecord
{
public uint Id;
public Vector2 TownHall;
public ushort MapID;
public ushort SiteID;
public ushort MovieID;
public ushort UpgradeResourceCost;
public ushort UpgradeMoneyCost;
public byte Level;
public byte UITextureKitID;
public byte Level2;
}
public sealed class GarrSiteLevelPlotInstRecord
{
public uint Id;
public Vector2 Landmark;
public ushort GarrSiteLevelID;
public byte GarrPlotInstanceID;
public byte Unknown;
}
public sealed class GemPropertiesRecord
{
public uint Id;
public SocketColor Type;
public ushort EnchantID;
public ushort MinItemLevel;
}
public sealed class GlyphBindableSpellRecord
{
public uint Id;
public uint SpellID;
public ushort GlyphPropertiesID;
}
public sealed class GlyphPropertiesRecord
{
public uint Id;
public uint SpellID;
public ushort SpellIconID;
public byte Type;
public byte GlyphExclusiveCategoryID;
}
public sealed class GlyphRequiredSpecRecord
{
public uint Id;
public ushort GlyphPropertiesID;
public ushort ChrSpecializationID;
}
public sealed class GuildColorBackgroundRecord
{
public uint Id;
public byte Red;
public byte Green;
public byte Blue;
}
public sealed class GuildColorBorderRecord
{
public uint Id;
public byte Red;
public byte Green;
public byte Blue;
}
public sealed class GuildColorEmblemRecord
{
public uint Id;
public byte Red;
public byte Green;
public byte Blue;
}
public sealed class GuildPerkSpellsRecord
{
public uint Id;
public uint SpellID;
}
}
@@ -0,0 +1,183 @@
/*
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
namespace Game.DataStorage
{
public sealed class GtArmorMitigationByLvlRecord
{
public float Mitigation;
}
public sealed class GtArtifactKnowledgeMultiplierRecord
{
public float Multiplier;
}
public sealed class GtArtifactLevelXPRecord
{
public float XP;
public float XP2;
}
public sealed class GtBarberShopCostBaseRecord
{
public float Cost;
}
public sealed class GtBaseMPRecord
{
public float Rogue;
public float Druid;
public float Hunter;
public float Mage;
public float Paladin;
public float Priest;
public float Shaman;
public float Warlock;
public float Warrior;
public float DeathKnight;
public float Monk;
public float DemonHunter;
}
public sealed class GtCombatRatingsRecord
{
public float Amplify;
public float DefenseSkill;
public float Dodge;
public float Parry;
public float Block;
public float HitMelee;
public float HitRanged;
public float HitSpell;
public float CritMelee;
public float CritRanged;
public float CritSpell;
public float MultiStrike;
public float Readiness;
public float Speed;
public float ResilienceCritTaken;
public float ResiliencePlayerDamage;
public float Lifesteal;
public float HasteMelee;
public float HasteRanged;
public float HasteSpell;
public float Avoidance;
public float Sturdiness;
public float Unused7;
public float Expertise;
public float ArmorPenetration;
public float Mastery;
public float PvPPower;
public float Cleave;
public float VersatilityDamageDone;
public float VersatilityHealingDone;
public float VersatilityDamageTaken;
public float Unused12;
}
public sealed class GtCombatRatingsMultByILvlRecord
{
public float ArmorMultiplier;
public float WeaponMultiplier;
public float TrinketMultiplier;
public float JewelryMultiplier;
}
public sealed class GtHonorLevelRecord
{
public float[] Prestige = new float[33];
}
public sealed class GtHpPerStaRecord
{
public float Health;
}
public sealed class GtItemSocketCostPerLevelRecord
{
public float SocketCost;
}
public sealed class GtNpcDamageByClassRecord
{
public float Rogue;
public float Druid;
public float Hunter;
public float Mage;
public float Paladin;
public float Priest;
public float Shaman;
public float Warlock;
public float Warrior;
public float DeathKnight;
public float Monk;
public float DemonHunter;
}
public sealed class GtNpcManaCostScalerRecord
{
public float Scaler;
}
public sealed class GtNpcTotalHpRecord
{
public float Rogue;
public float Druid;
public float Hunter;
public float Mage;
public float Paladin;
public float Priest;
public float Shaman;
public float Warlock;
public float Warrior;
public float DeathKnight;
public float Monk;
public float DemonHunter;
}
public sealed class GtSpellScalingRecord
{
public float Rogue;
public float Druid;
public float Hunter;
public float Mage;
public float Paladin;
public float Priest;
public float Shaman;
public float Warlock;
public float Warrior;
public float DeathKnight;
public float Monk;
public float DemonHunter;
public float Item;
public float Consumable;
public float Gem1;
public float Gem2;
public float Gem3;
public float Health;
}
public sealed class GtXpRecord
{
public float Total;
public float PerKill;
public float Junk;
public float Stats;
public float Divisor;
}
}
@@ -0,0 +1,50 @@
/*
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
using Framework.Constants;
namespace Game.DataStorage
{
public sealed class HeirloomRecord
{
public uint ItemID;
public LocalizedString SourceText;
public uint[] OldItem = new uint[2];
public uint NextDifficultyItemID;
public uint[] UpgradeItemID = new uint[3];
public ushort[] ItemBonusListID = new ushort[3];
public byte Flags;
public byte Source;
public uint Id;
}
public sealed class HolidaysRecord
{
public uint Id;
public uint[] Date = new uint[SharedConst.MaxHolidayDates]; // dates in unix time starting at January, 1, 2000
public ushort[] Duration = new ushort[SharedConst.MaxHolidayDurations];
public ushort Region;
public byte Looping;
public byte[] CalendarFlags = new byte[SharedConst.MaxHolidayFlags];
public byte Priority;
public sbyte CalendarFilterType;
public byte Flags;
public uint HolidayNameID;
public uint HolidayDescriptionID;
public int[] TextureFileDataID = new int[3];
}
}
@@ -0,0 +1,389 @@
/*
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
using Framework.Constants;
namespace Game.DataStorage
{
public sealed class ImportPriceArmorRecord
{
public uint Id;
public float ClothFactor;
public float LeatherFactor;
public float MailFactor;
public float PlateFactor;
}
public sealed class ImportPriceQualityRecord
{
public uint Id;
public float Factor;
}
public sealed class ImportPriceShieldRecord
{
public uint Id;
public float Factor;
}
public sealed class ImportPriceWeaponRecord
{
public uint Id;
public float Factor;
}
public sealed class ItemRecord
{
public uint Id;
public uint FileDataID;
public ItemClass Class;
public byte SubClass;
public sbyte SoundOverrideSubclass;
public sbyte Material;
public InventoryType inventoryType;
public byte Sheath;
public byte GroupSoundsID;
}
public sealed class ItemAppearanceRecord
{
public uint Id;
public uint DisplayID;
public uint IconFileDataID;
public uint UIOrder;
public byte ObjectComponentSlot;
}
public sealed class ItemArmorQualityRecord
{
public uint Id;
public float[] QualityMod = new float[7];
public ushort ItemLevel;
}
public sealed class ItemArmorShieldRecord
{
public uint Id;
public float[] Quality = new float[7];
public ushort ItemLevel;
}
public sealed class ItemArmorTotalRecord
{
public uint Id;
public float[] Value = new float[4];
public ushort ItemLevel;
}
public sealed class ItemBagFamilyRecord
{
public uint Id;
public uint Name;
}
public sealed class ItemBonusRecord
{
public uint Id;
public int[] Value = new int[2];
public ushort BonusListID;
public ItemBonusType Type;
public byte Index;
}
public sealed class ItemBonusListLevelDeltaRecord
{
public short Delta;
public uint Id;
}
public sealed class ItemBonusTreeNodeRecord
{
public uint Id;
public ushort BonusTreeID;
public ushort SubTreeID;
public ushort BonusListID;
public ushort ItemLevelSelectorID;
public byte BonusTreeModID;
}
public sealed class ItemChildEquipmentRecord
{
public uint Id;
public uint ItemID;
public uint AltItemID;
public byte AltEquipmentSlot;
}
public sealed class ItemClassRecord
{
public uint Id;
public float PriceMod;
public LocalizedString Name;
public byte OldEnumValue;
public byte Flags;
}
public sealed class ItemCurrencyCostRecord
{
public uint Id;
public uint ItemId;
}
// common struct for:
// ItemDamageAmmo.dbc
// ItemDamageOneHand.dbc
// ItemDamageOneHandCaster.dbc
// ItemDamageRanged.dbc
// ItemDamageThrown.dbc
// ItemDamageTwoHand.dbc
// ItemDamageTwoHandCaster.dbc
// ItemDamageWand.dbc
public sealed class ItemDamageRecord
{
public uint Id;
public float[] DPS = new float[7];
public ushort ItemLevel;
}
public sealed class ItemDisenchantLootRecord
{
public uint Id;
public ushort MinItemLevel;
public ushort MaxItemLevel;
public ushort RequiredDisenchantSkill;
public byte ItemClass;
public sbyte ItemSubClass;
public byte ItemQuality;
}
public sealed class ItemEffectRecord
{
public uint Id;
public uint ItemID;
public uint SpellID;
public int Cooldown;
public int CategoryCooldown;
public short Charges;
public ushort Category;
public ushort ChrSpecializationID;
public byte OrderIndex;
public ItemSpelltriggerType Trigger;
}
public sealed class ItemExtendedCostRecord
{
public uint Id;
public uint[] RequiredItem = new uint[ItemConst.MaxItemExtCostItems]; // required item id
public uint[] RequiredCurrencyCount = new uint[ItemConst.MaxItemExtCostCurrencies]; // required curency count
public ushort[] RequiredItemCount = new ushort[ItemConst.MaxItemExtCostItems]; // required count of 1st item
public ushort RequiredPersonalArenaRating; // required personal arena rating
public ushort[] RequiredCurrency = new ushort[ItemConst.MaxItemExtCostCurrencies]; // required curency id
public byte RequiredArenaSlot; // arena slot restrictions (min slot value)
public byte RequiredFactionId;
public byte RequiredFactionStanding;
public byte RequirementFlags;
public byte RequiredAchievement;
}
public sealed class ItemLevelSelectorRecord
{
public uint ID;
public ushort ItemLevel;
}
public sealed class ItemLimitCategoryRecord
{
public uint Id;
public LocalizedString Name;
public byte Quantity;
public byte Flags;
}
public sealed class ItemModifiedAppearanceRecord
{
public uint ItemID;
public ushort AppearanceID;
public byte AppearanceModID;
public byte Index;
public byte SourceType;
public uint Id;
}
public sealed class ItemPriceBaseRecord
{
public uint Id;
public float ArmorFactor;
public float WeaponFactor;
public ushort ItemLevel;
}
public sealed class ItemRandomPropertiesRecord
{
public uint Id;
public LocalizedString Name;
public ushort[] Enchantment = new ushort[ItemConst.MaxItemRandomProperties];
}
public sealed class ItemRandomSuffixRecord
{
public uint Id;
public LocalizedString Name;
public ushort[] Enchantment = new ushort[ItemConst.MaxItemRandomProperties];
public ushort[] AllocationPct = new ushort[ItemConst.MaxItemRandomProperties];
}
public sealed class ItemSearchNameRecord
{
public uint Id;
public LocalizedString Name;
public uint[] Flags = new uint[3];
public uint AllowableRace;
public uint RequiredSpell;
public ushort RequiredReputationFaction;
public ushort RequiredSkill;
public ushort RequiredSkillRank;
public ushort ItemLevel;
public byte Quality;
public byte RequiredExpansion;
public byte RequiredReputationRank;
public byte RequiredLevel;
public int AllowableClass;
}
public sealed class ItemSetRecord
{
public uint Id;
public LocalizedString Name;
public uint[] ItemID = new uint[17];
public ushort RequiredSkillRank;
public uint RequiredSkill;
public ItemSetFlags Flags;
}
public sealed class ItemSetSpellRecord
{
public uint Id;
public uint SpellID;
public ushort ItemSetID;
public ushort ChrSpecID;
public byte Threshold;
}
public sealed class ItemSparseRecord
{
public uint Id;
public uint[] Flags = new uint[3];
public float Unk1;
public float Unk2;
public uint BuyCount;
public uint BuyPrice;
public uint SellPrice;
public int AllowableRace;
public uint RequiredSpell;
public uint MaxCount;
public uint Stackable;
public int[] ItemStatAllocation = new int[ItemConst.MaxStats];
public float[] ItemStatSocketCostMultiplier = new float[ItemConst.MaxStats];
public float RangedModRange;
public LocalizedString Name;
public LocalizedString Name2;
public LocalizedString Name3;
public LocalizedString Name4;
public LocalizedString Description;
public uint BagFamily;
public float ArmorDamageModifier;
public uint Duration;
public float StatScalingFactor;
public short AllowableClass;
public ushort ItemLevel;
public ushort RequiredSkill;
public ushort RequiredSkillRank;
public ushort RequiredReputationFaction;
public short[] ItemStatValue = new short[ItemConst.MaxStats];
public ushort ScalingStatDistribution;
public ushort Delay;
public ushort PageText;
public ushort StartQuest;
public ushort LockID;
public ushort RandomProperty;
public ushort RandomSuffix;
public ushort ItemSet;
public ushort Area;
public ushort Map;
public ushort TotemCategory;
public ushort SocketBonus;
public ushort GemProperties;
public ushort ItemLimitCategory;
public ushort HolidayID;
public ushort RequiredTransmogHolidayID;
public ushort ItemNameDescriptionID;
public byte Quality;
public InventoryType inventoryType;
public sbyte RequiredLevel;
public byte RequiredHonorRank;
public byte RequiredCityRank;
public byte RequiredReputationRank;
public byte ContainerSlots;
public sbyte[] ItemStatType = new sbyte[ItemConst.MaxStats];
public byte DamageType;
public byte Bonding;
public byte LanguageID;
public byte PageMaterial;
public sbyte Material;
public byte Sheath;
public byte[] SocketColor = new byte[ItemConst.MaxGemSockets];
public byte CurrencySubstitutionID;
public byte CurrencySubstitutionCount;
public byte ArtifactID;
public byte RequiredExpansion;
}
public sealed class ItemSpecRecord
{
public uint Id;
public ushort SpecID;
public byte MinLevel;
public byte MaxLevel;
public byte ItemType;
public ItemSpecStat PrimaryStat;
public ItemSpecStat SecondaryStat;
}
public sealed class ItemSpecOverrideRecord
{
public uint Id;
public uint ItemID;
public ushort SpecID;
}
public sealed class ItemUpgradeRecord
{
public uint Id;
public uint CurrencyCost;
public ushort PrevItemUpgradeID;
public ushort CurrencyID;
public byte ItemUpgradePathID;
public byte ItemLevelBonus;
}
public sealed class ItemXBonusTreeRecord
{
public uint Id;
public uint ItemID;
public ushort BonusTreeID;
}
}
@@ -0,0 +1,25 @@
/*
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
namespace Game.DataStorage
{
public sealed class KeyChainRecord
{
public uint Id;
public byte[] Key = new byte[32];
}
}
@@ -0,0 +1,106 @@
/*
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
using Framework.Constants;
using Framework.GameMath;
namespace Game.DataStorage
{
public sealed class LfgDungeonsRecord
{
public uint Id;
public LocalizedString Name;
public LfgFlags Flags;
public LocalizedString Description;
public float MinItemLevel;
public ushort MaxLevel;
public ushort TargetLevelMax;
public short MapID;
public ushort RandomID;
public ushort ScenarioID;
public ushort LastBossJournalEncounterID;
public ushort BonusReputationAmount;
public ushort MentorItemLevel;
public uint PlayerConditionID;
public byte MinLevel;
public byte TargetLevel;
public byte TargetLevelMin;
public Difficulty DifficultyID;
public LfgType Type;
public byte Faction;
public byte Expansion;
public byte OrderIndex;
public byte GroupID;
public byte CountTank;
public byte CountHealer;
public byte CountDamage;
public byte MinCountTank;
public byte MinCountHealer;
public byte MinCountDamage;
public byte SubType;
public byte MentorCharLevel;
public int TextureFileDataID;
public int RewardIconFileDataID;
public int ProposalTextureFileDataID;
// Helpers
public uint Entry() { return (uint)(Id + ((int)Type << 24)); }
}
public sealed class LightRecord
{
public uint Id;
public Vector3 Pos;
public float FalloffStart;
public float FalloffEnd;
public ushort MapID;
public ushort[] LightParamsID = new ushort[8];
}
public sealed class LiquidTypeRecord
{
public uint Id;
public LocalizedString Name;
public uint SpellID;
public float MaxDarkenDepth;
public float FogDarkenIntensity;
public float AmbDarkenIntensity;
public float DirDarkenIntensity;
public float ParticleScale;
public string[] Texture = new string[6];
public uint[] Color = new uint[2];
public float[] Float = new float[18];
public uint[] Int = new uint[4];
public ushort Flags;
public ushort LightID;
public byte LiquidType;
public byte ParticleMovement;
public byte ParticleTexSlots;
public byte MaterialID;
public byte[] DepthTexCount = new byte[6];
public uint SoundID;
}
public sealed class LockRecord
{
public uint Id;
public uint[] Index = new uint[SharedConst.MaxLockCase];
public ushort[] Skill = new ushort[SharedConst.MaxLockCase];
public byte[] LockType = new byte[SharedConst.MaxLockCase];
public byte[] Action = new byte[SharedConst.MaxLockCase];
}
}
@@ -0,0 +1,240 @@
/*
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
using Framework.GameMath;
using System.IO;
using System.Runtime.InteropServices;
namespace Game.DataStorage
{
struct M2SplineKey
{
public M2SplineKey(BinaryReader reader)
{
p0 = new Vector3(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle());
p1 = new Vector3(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle());
p2 = new Vector3(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle());
}
public Vector3 p0;
public Vector3 p1;
public Vector3 p2;
}
struct M2Header
{
public M2Header(BinaryReader reader)
{
Magic = null;/// reader.ReadStringFromChars(4);
Version = reader.ReadUInt32();
lName = reader.ReadUInt32();
ofsName = reader.ReadUInt32();
GlobalModelFlags = reader.ReadUInt32();
nGlobalSequences = reader.ReadUInt32();
ofsGlobalSequences = reader.ReadUInt32();
nAnimations = reader.ReadUInt32();
ofsAnimations = reader.ReadUInt32();
nAnimationLookup = reader.ReadUInt32();
ofsAnimationLookup = reader.ReadUInt32();
nBones = reader.ReadUInt32();
ofsBones = reader.ReadUInt32();
nKeyBoneLookup = reader.ReadUInt32();
ofsKeyBoneLookup = reader.ReadUInt32();
nVertices = reader.ReadUInt32();
ofsVertices = reader.ReadUInt32();
nViews = reader.ReadUInt32();
nSubmeshAnimations = reader.ReadUInt32();
ofsSubmeshAnimations = reader.ReadUInt32();
nTextures = reader.ReadUInt32();
ofsTextures = reader.ReadUInt32();
nTransparency = reader.ReadUInt32();
ofsTransparency = reader.ReadUInt32();
nUVAnimation = reader.ReadUInt32();
ofsUVAnimation = reader.ReadUInt32();
nTexReplace = reader.ReadUInt32();
ofsTexReplace = reader.ReadUInt32();
nRenderFlags = reader.ReadUInt32();
ofsRenderFlags = reader.ReadUInt32();
nBoneLookupTable = reader.ReadUInt32();
ofsBoneLookupTable = reader.ReadUInt32();
nTexLookup = reader.ReadUInt32();
ofsTexLookup = reader.ReadUInt32();
nTexUnits = reader.ReadUInt32();
ofsTexUnits = reader.ReadUInt32();
nTransLookup = reader.ReadUInt32();
ofsTransLookup = reader.ReadUInt32();
nUVAnimLookup = reader.ReadUInt32();
ofsUVAnimLookup = reader.ReadUInt32();
BoundingBox = new AxisAlignedBox(new Vector3(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()) , new Vector3(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()));
BoundingSphereRadius = reader.ReadSingle();
CollisionBox = new AxisAlignedBox(new Vector3(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()), new Vector3(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()));
CollisionSphereRadius = reader.ReadSingle();
nBoundingTriangles = reader.ReadUInt32();
ofsBoundingTriangles = reader.ReadUInt32();
nBoundingVertices = reader.ReadUInt32();
ofsBoundingVertices = reader.ReadUInt32();
nBoundingNormals = reader.ReadUInt32();
ofsBoundingNormals = reader.ReadUInt32();
nAttachments = reader.ReadUInt32();
ofsAttachments = reader.ReadUInt32();
nAttachLookup = reader.ReadUInt32();
ofsAttachLookup = reader.ReadUInt32();
nEvents = reader.ReadUInt32();
ofsEvents = reader.ReadUInt32();
nLights = reader.ReadUInt32();
ofsLights = reader.ReadUInt32();
nCameras = reader.ReadUInt32();
ofsCameras = reader.ReadUInt32();
nCameraLookup = reader.ReadUInt32();
ofsCameraLookup = reader.ReadUInt32();
nRibbonEmitters = reader.ReadUInt32();
ofsRibbonEmitters = reader.ReadUInt32();
nParticleEmitters = reader.ReadUInt32();
ofsParticleEmitters = reader.ReadUInt32();
nBlendMaps = reader.ReadUInt32();
ofsBlendMaps = reader.ReadUInt32();
}
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public char[] Magic; // "MD20"
public uint Version; // The version of the format.
public uint lName; // Length of the model's name including the trailing \0
public uint ofsName; // Offset to the name, it seems like models can get reloaded by this name.should be unique, i guess.
public uint GlobalModelFlags; // 0x0001: tilt x, 0x0002: tilt y, 0x0008: add 2 fields in header, 0x0020: load .phys data (MoP+), 0x0080: has _lod .skin files (MoP?+), 0x0100: is camera related.
public uint nGlobalSequences;
public uint ofsGlobalSequences; // A list of timestamps.
public uint nAnimations;
public uint ofsAnimations; // Information about the animations in the model.
public uint nAnimationLookup;
public uint ofsAnimationLookup; // Mapping of global IDs to the entries in the Animation sequences block.
public uint nBones; // MAX_BONES = 0x100
public uint ofsBones; // Information about the bones in this model.
public uint nKeyBoneLookup;
public uint ofsKeyBoneLookup; // Lookup table for key skeletal bones.
public uint nVertices;
public uint ofsVertices; // Vertices of the model.
public uint nViews; // Views (LOD) are now in .skins.
public uint nSubmeshAnimations;
public uint ofsSubmeshAnimations; // Submesh color and alpha animations definitions.
public uint nTextures;
public uint ofsTextures; // Textures of this model.
public uint nTransparency;
public uint ofsTransparency; // Transparency of textures.
public uint nUVAnimation;
public uint ofsUVAnimation;
public uint nTexReplace;
public uint ofsTexReplace; // Replaceable Textures.
public uint nRenderFlags;
public uint ofsRenderFlags; // Blending modes / render flags.
public uint nBoneLookupTable;
public uint ofsBoneLookupTable; // A bone lookup table.
public uint nTexLookup;
public uint ofsTexLookup; // The same for textures.
public uint nTexUnits; // possibly removed with cata?!
public uint ofsTexUnits; // And texture units. Somewhere they have to be too.
public uint nTransLookup;
public uint ofsTransLookup; // Everything needs its lookup. Here are the transparencies.
public uint nUVAnimLookup;
public uint ofsUVAnimLookup;
public AxisAlignedBox BoundingBox; // min/max( [1].z, 2.0277779f ) - 0.16f seems to be the maximum camera height
public float BoundingSphereRadius;
public AxisAlignedBox CollisionBox;
public float CollisionSphereRadius;
public uint nBoundingTriangles;
public uint ofsBoundingTriangles; // Our bounding volumes. Similar structure like in the old ofsViews.
public uint nBoundingVertices;
public uint ofsBoundingVertices;
public uint nBoundingNormals;
public uint ofsBoundingNormals;
public uint nAttachments;
public uint ofsAttachments; // Attachments are for weapons etc.
public uint nAttachLookup;
public uint ofsAttachLookup; // Of course with a lookup.
public uint nEvents;
public uint ofsEvents; // Used for playing sounds when dying and a lot else.
public uint nLights;
public uint ofsLights; // Lights are mainly used in loginscreens but in wands and some doodads too.
public uint nCameras; // Format of Cameras changed with version 271!
public uint ofsCameras; // The cameras are present in most models for having a model in the Character-Tab.
public uint nCameraLookup;
public uint ofsCameraLookup; // And lookup-time again.
public uint nRibbonEmitters;
public uint ofsRibbonEmitters; // Things swirling around. See the CoT-entrance for light-trails.
public uint nParticleEmitters;
public uint ofsParticleEmitters; // Spells and weapons, doodads and loginscreens use them. Blood dripping of a blade? Particles.
public uint nBlendMaps; // This has to deal with blending. Exists IFF (flags & 0x8) != 0. When set, textures blending is overriden by the associated array. See M2/WotLK#Blend_mode_overrides
public uint ofsBlendMaps; // Same as above. Points to an array of uint16 of nBlendMaps entries -- From WoD information.};
}
struct M2Array
{
public M2Array(BinaryReader reader, uint offset)
{
if (offset != 0)
reader.BaseStream.Position = offset;
number = reader.ReadUInt32();
offset_elements = reader.ReadUInt32();
}
public uint number;
public uint offset_elements;
}
struct M2Track
{
public void Read(BinaryReader reader)
{
interpolation_type = reader.ReadUInt16();
global_sequence = reader.ReadUInt16();
timestamps = new M2Array(reader, 0);
values = new M2Array(reader, 0);
}
public ushort interpolation_type;
public ushort global_sequence;
public M2Array timestamps;
public M2Array values;
}
struct M2Camera
{
public void Read(BinaryReader reader, M2Header header)
{
reader.BaseStream.Position = header.ofsCameras;
type = reader.ReadUInt32();
far_clip = reader.ReadSingle();
near_clip = reader.ReadSingle();
positions.Read(reader);
position_base = new Vector3(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle());
target_positions.Read(reader);
target_position_base = new Vector3(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle());
rolldata.Read(reader);
fovdata.Read(reader);
}
public uint type; // 0: portrait, 1: characterinfo; -1: else (flyby etc.); referenced backwards in the lookup table.
public float far_clip;
public float near_clip;
public M2Track positions; // How the camera's position moves. Should be 3*3 floats.
public Vector3 position_base;
public M2Track target_positions; // How the target moves. Should be 3*3 floats.
public Vector3 target_position_base;
public M2Track rolldata; // The camera can have some roll-effect. Its 0 to 2*Pi.
public M2Track fovdata; // FoV for this segment
}
}
@@ -0,0 +1,179 @@
/*
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
using Framework.Constants;
using Framework.GameMath;
using System;
namespace Game.DataStorage
{
public sealed class MailTemplateRecord
{
public uint Id;
public LocalizedString Body;
}
public sealed class MapRecord
{
public uint Id;
public uint Directory;
public MapFlags[] Flags = new MapFlags[2];
public float MinimapIconScale;
public Vector2 CorpsePos; // entrance coordinates in ghost mode (in most cases = normal entrance)
public LocalizedString MapName;
public LocalizedString MapDescription0; // Horde
public LocalizedString MapDescription1; // Alliance
public LocalizedString ShortDescription;
public LocalizedString LongDescription;
public ushort AreaTableID;
public ushort LoadingScreenID;
public short CorpseMapID; // map_id of entrance map in ghost mode (continent always and in most cases = normal entrance)
public ushort TimeOfDayOverride;
public short ParentMapID;
public short CosmeticParentMapID;
public ushort WindSettingsID;
public MapTypes InstanceType;
public byte unk5;
public byte ExpansionID;
public byte MaxPlayers;
public byte TimeOffset;
//Helpers
public Expansion Expansion() { return (Expansion)ExpansionID; }
public bool IsDungeon() { return (InstanceType == MapTypes.Instance || InstanceType == MapTypes.Raid) && !IsGarrison(); }
public bool IsNonRaidDungeon() { return InstanceType == MapTypes.Instance; }
public bool Instanceable()
{
return InstanceType == MapTypes.Instance || InstanceType == MapTypes.Raid
|| InstanceType == MapTypes.Battleground || InstanceType == MapTypes.Arena;
}
public bool IsRaid() { return InstanceType == MapTypes.Raid; }
public bool IsBattleground() { return InstanceType == MapTypes.Battleground; }
public bool IsBattleArena() { return InstanceType == MapTypes.Arena; }
public bool IsBattlegroundOrArena() { return InstanceType == MapTypes.Battleground || InstanceType == MapTypes.Arena; }
public bool IsWorldMap() { return InstanceType == MapTypes.Common; }
public bool GetEntrancePos(out uint mapid, out float x, out float y)
{
mapid = 0;
x = 0;
y = 0;
if (CorpseMapID < 0)
return false;
mapid = (uint)CorpseMapID;
x = CorpsePos.X;
y = CorpsePos.Y;
return true;
}
public bool IsContinent()
{
return Id == 0 || Id == 1 || Id == 530 || Id == 571 || Id == 870 || Id == 1116 || Id == 1220;
}
public bool IsDynamicDifficultyMap() { return Flags[0].HasAnyFlag(MapFlags.CanToggleDifficulty); }
public bool IsGarrison() { return Flags[0].HasAnyFlag(MapFlags.Garrison); }
}
public sealed class MapDifficultyRecord
{
public uint Id;
public LocalizedString Message_lang; // m_message_lang (text showed when transfer to map failed)
public ushort MapID;
public byte DifficultyID;
public byte RaidDurationType; // 1 means daily reset, 2 means weekly
public byte MaxPlayers; // m_maxPlayers some heroic versions have 0 when expected same amount as in normal version
public byte LockID;
public byte Flags;
public byte ItemBonusTreeModID;
public uint Context;
public uint GetRaidDuration()
{
if (RaidDurationType == 1)
return 86400;
if (RaidDurationType == 2)
return 604800;
return 0;
}
}
public sealed class ModifierTreeRecord
{
public uint Id;
public uint[] Asset = new uint[2];
public ushort Parent;
public byte Type;
public byte Unk700;
public byte Operator;
public byte Amount;
}
public sealed class MountRecord
{
public uint SpellId;
public LocalizedString Name;
public LocalizedString Description;
public LocalizedString SourceDescription;
public float CameraPivotMultiplier;
public ushort MountTypeId;
public ushort Flags;
public byte Source;
public uint Id;
public uint PlayerConditionId;
public int UiModelSceneID;
}
public sealed class MountCapabilityRecord
{
public uint RequiredSpell;
public uint SpeedModSpell;
public ushort RequiredRidingSkill;
public ushort RequiredArea;
public short RequiredMap;
public MountCapabilityFlags Flags;
public uint Id;
public uint RequiredAura;
}
public sealed class MountTypeXCapabilityRecord
{
public uint Id;
public ushort MountTypeID;
public ushort MountCapabilityID;
public byte OrderIndex;
}
public sealed class MountXDisplayRecord
{
public uint ID;
public uint MountID;
public uint DisplayID;
public uint PlayerConditionID;
}
public sealed class MovieRecord
{
public uint Id;
public uint AudioFileDataID;
public uint SubtitleFileDataID;
public byte Volume;
public byte KeyID;
}
}
@@ -0,0 +1,46 @@
/*
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
namespace Game.DataStorage
{
public struct WMOAreaTableTripple
{
public WMOAreaTableTripple(int r, int a, int g)
{
groupId = g;
rootId = r;
adtId = a;
}
// ordered by entropy; that way memcmp will have a minimal medium runtime
int groupId;
int rootId;
int adtId;
}
public class TaxiPathBySourceAndDestination
{
public TaxiPathBySourceAndDestination(uint _id, uint _price)
{
ID = _id;
price = _price;
}
public uint ID;
public uint price;
}
}
@@ -0,0 +1,47 @@
/*
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
namespace Game.DataStorage
{
public sealed class NameGenRecord
{
public uint Id;
public LocalizedString Name;
public byte Race;
public byte Sex;
}
public sealed class NamesProfanityRecord
{
public uint Id;
public string Name;
public sbyte Language;
}
public sealed class NamesReservedRecord
{
public uint Id;
public string Name;
}
public sealed class NamesReservedLocaleRecord
{
public uint Id;
public string Name;
public byte LocaleMask;
}
}
@@ -0,0 +1,29 @@
/*
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
using Framework.Constants;
namespace Game.DataStorage
{
public sealed class OverrideSpellDataRecord
{
public uint Id;
public uint[] SpellID = new uint[SharedConst.MaxOverrideSpell];
public uint PlayerActionbarFileDataID;
public byte Flags;
}
}
@@ -0,0 +1,178 @@
/*
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
using Framework.Constants;
using System;
namespace Game.DataStorage
{
public sealed class PhaseRecord
{
public uint Id;
public ushort Flags;
}
public sealed class PhaseXPhaseGroupRecord
{
public uint Id;
public ushort PhaseId;
public ushort PhaseGroupID;
}
public sealed class PlayerConditionRecord
{
public uint Id;
public uint RaceMask;
public uint SkillLogic;
public uint ReputationLogic;
public uint PrevQuestLogic;
public uint CurrQuestLogic;
public uint CurrentCompletedQuestLogic;
public uint SpellLogic;
public uint ItemLogic;
public uint[] Time = new uint[2];
public uint AuraSpellLogic;
public uint[] AuraSpellID = new uint[4];
public uint AchievementLogic;
public uint AreaLogic;
public uint QuestKillLogic;
public LocalizedString FailureDescription;
public ushort MinLevel;
public ushort MaxLevel;
public ushort[] SkillID = new ushort[4];
public short[] MinSkill = new short[4];
public short[] MaxSkill = new short[4];
public ushort MaxFactionID;
public ushort[] PrevQuestID = new ushort[4];
public ushort[] CurrQuestID = new ushort[4];
public ushort[] CurrentCompletedQuestID = new ushort[4];
public ushort[] Explored = new ushort[2];
public ushort WorldStateExpressionID;
public ushort[] Achievement = new ushort[4];
public ushort[] AreaID = new ushort[4];
public ushort QuestKillID;
public ushort PhaseID;
public ushort MinAvgEquippedItemLevel;
public ushort MaxAvgEquippedItemLevel;
public ushort ModifierTreeID;
public byte Flags;
public sbyte Gender;
public sbyte NativeGender;
public byte MinLanguage;
public byte MaxLanguage;
public byte[] MinReputation = new byte[3];
public byte MaxReputation;
public byte Unknown1;
public byte MinPVPRank;
public byte MaxPVPRank;
public byte PvpMedal;
public byte ItemFlags;
public byte[] AuraCount = new byte[4];
public byte WeatherID;
public byte PartyStatus;
public byte LifetimeMaxPVPRank;
public byte[] LfgStatus = new byte[4];
public byte[] LfgCompare = new byte[4];
public byte[] CurrencyCount = new byte[4];
public sbyte MinExpansionLevel;
public sbyte MaxExpansionLevel;
public sbyte MinExpansionTier;
public sbyte MaxExpansionTier;
public byte MinGuildLevel;
public byte MaxGuildLevel;
public byte PhaseUseFlags;
public sbyte ChrSpecializationIndex;
public sbyte ChrSpecializationRole;
public sbyte PowerType;
public sbyte PowerTypeComp;
public sbyte PowerTypeValue;
public int ClassMask;
public uint LanguageID;
public uint[] MinFactionID = new uint[3];
public uint[] SpellID = new uint[4];
public uint[] ItemID = new uint[4];
public uint[] ItemCount = new uint[4];
public uint LfgLogic;
public uint[] LfgValue = new uint[4];
public uint CurrencyLogic;
public uint[] CurrencyID = new uint[4];
public uint[] QuestKillMonster = new uint[6];
public uint PhaseGroupID;
public uint MinAvgItemLevel;
public uint MaxAvgItemLevel;
public int[] MovementFlags = new int[2];
public uint MainHandItemSubclassMask;
}
public sealed class PowerDisplayRecord
{
public uint Id;
public uint GlobalStringBaseTag;
public byte PowerType;
public byte Red;
public byte Green;
public byte Blue;
}
public sealed class PowerTypeRecord
{
public uint Id;
public string PowerTypeToken;
public string PowerCostToken;
public float RegenerationPeace;
public float RegenerationCombat;
public short MaxPower;
public ushort RegenerationDelay;
public ushort Flags;
public PowerType PowerTypeEnum;
public sbyte RegenerationMin;
public sbyte RegenerationCenter;
public sbyte RegenerationMax;
public byte UIModifier;
}
public sealed class PrestigeLevelInfoRecord
{
public uint ID;
public uint IconID;
public LocalizedString PrestigeText;
public byte PrestigeLevel;
public PrestigeLevelInfoFlags Flags;
public bool IsDisabled() { return Flags.HasAnyFlag(PrestigeLevelInfoFlags.Disabled); }
}
public sealed class PvpDifficultyRecord
{
public uint Id;
public ushort MapID;
public byte BracketID;
public byte MinLevel;
public byte MaxLevel;
// helpers
public BattlegroundBracketId GetBracketId() { return (BattlegroundBracketId)BracketID; }
}
public sealed class PvpRewardRecord
{
public uint Id;
public uint HonorLevel;
public uint Prestige;
public uint RewardPackID;
}
}
@@ -0,0 +1,61 @@
/*
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
using Framework.Constants;
namespace Game.DataStorage
{
public sealed class QuestFactionRewardRecord
{
public uint Id;
public short[] QuestRewFactionValue = new short[10];
}
public sealed class QuestMoneyRewardRecord
{
public uint Id;
public uint[] Money = new uint[10];
}
public sealed class QuestPackageItemRecord
{
public uint Id;
public uint ItemID;
public ushort QuestPackageID;
public QuestPackageFilter FilterType;
public byte ItemCount;
}
public sealed class QuestSortRecord
{
public uint Id;
public LocalizedString SortName;
public byte SortOrder;
}
public sealed class QuestV2Record
{
public uint Id;
public ushort UniqueBitFlag;
}
public sealed class QuestXPRecord
{
public uint Id;
public ushort[] Exp = new ushort[10];
}
}
@@ -0,0 +1,53 @@
/*
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
namespace Game.DataStorage
{
public sealed class RandPropPointsRecord
{
public uint Id;
public uint[] EpicPropertiesPoints = new uint[5];
public uint[] RarePropertiesPoints = new uint[5];
public uint[] UncommonPropertiesPoints = new uint[5];
}
public sealed class RewardPackRecord
{
public uint Id;
public uint Money;
public float ArtifactXPMultiplier;
public byte ArtifactXPDifficulty;
public byte ArtifactCategoryID;
public uint TitleID;
public uint Unused;
}
public sealed class RewardPackXItemRecord
{
public uint Id;
public uint ItemID;
public uint RewardPackID;
public uint Amount;
}
public sealed class RulesetItemUpgradeRecord
{
public uint Id;
public uint ItemID;
public ushort ItemUpgradeID;
}
}
@@ -0,0 +1,560 @@
/*
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
using Framework.Constants;
using Framework.Dynamic;
using System;
namespace Game.DataStorage
{
public sealed class ScalingStatDistributionRecord
{
public uint Id;
public ushort ItemLevelCurveID;
public uint MinLevel;
public uint MaxLevel;
}
public sealed class ScenarioRecord
{
public uint Id;
public LocalizedString Name;
public ushort Data; // Seems to indicate different things, for zone invasions, this is the area id
public byte Flags;
public byte Type;
}
public sealed class ScenarioStepRecord
{
public uint Id;
public LocalizedString Description;
public LocalizedString Name;
public ushort CriteriaTreeID;
public ushort ScenarioID;
public ushort PreviousStepID; // Used in conjunction with Proving Grounds scenarios, when sequencing steps (Not using step order?)
public ushort QuestRewardID;
public byte Step;
public ScenarioStepFlags Flags;
public uint BonusRequiredStepID; // Bonus step can only be completed if scenario is in the step specified in this field
// helpers
public bool IsBonusObjective()
{
return Flags.HasAnyFlag(ScenarioStepFlags.BonusObjective);
}
}
public sealed class SceneScriptRecord
{
public uint Id;
public string Name;
public string Script;
public ushort PrevScriptId;
public ushort NextScriptId;
}
public sealed class SceneScriptPackageRecord
{
public uint Id;
public string Name;
}
public sealed class SkillLineRecord
{
public uint Id;
public LocalizedString DisplayName;
public LocalizedString Description;
public LocalizedString AlternateVerb;
public ushort Flags;
public SkillCategory CategoryID;
public byte CanLink;
public uint IconFileDataID;
public uint ParentSkillLineID;
}
public sealed class SkillLineAbilityRecord
{
public uint Id;
public uint SpellID;
public uint RaceMask;
public uint SupercedesSpell;
public ushort SkillLine;
public ushort MinSkillLineRank;
public ushort TrivialSkillLineRankHigh;
public ushort TrivialSkillLineRankLow;
public ushort UniqueBit;
public ushort TradeSkillCategoryID;
public AbilytyLearnType AcquireMethod;
public byte NumSkillUps;
public byte Unknown703;
public int ClassMask;
}
public sealed class SkillRaceClassInfoRecord
{
public uint Id;
public int RaceMask;
public ushort SkillID;
public SkillRaceClassInfoFlags Flags;
public ushort SkillTierID;
public byte Availability;
public byte MinLevel;
public int ClassMask;
}
public sealed class SoundKitRecord
{
public LocalizedString Name;
public float VolumeFloat;
public float MinDistance;
public float DistanceCutoff;
public float VolumeVariationPlus;
public float VolumeVariationMinus;
public float PitchVariationPlus;
public float PitchVariationMinus;
public float PitchAdjust;
public ushort Flags;
public ushort SoundEntriesAdvancedID;
public ushort BusOverwriteID;
public byte SoundType;
public byte EAXDef;
public byte DialogType;
public byte Unk700;
public uint Id;
}
public sealed class SpecializationSpellsRecord
{
public uint SpellID;
public uint OverridesSpellID;
public LocalizedString Description;
public ushort SpecID;
public byte OrderIndex;
public uint Id;
}
public sealed class SpellRecord
{
public LocalizedString Name;
public LocalizedString NameSubtext;
public LocalizedString Description;
public LocalizedString AuraDescription;
public uint MiscID;
public uint Id;
public uint DescriptionVariablesID;
}
public sealed class SpellAuraOptionsRecord
{
public uint Id;
public uint SpellID;
public uint ProcCharges;
public uint ProcTypeMask;
public uint ProcCategoryRecovery;
public ushort CumulativeAura;
public byte DifficultyID;
public byte ProcChance;
public byte SpellProcsPerMinuteID;
}
public sealed class SpellAuraRestrictionsRecord
{
public uint Id;
public uint SpellID;
public uint CasterAuraSpell;
public uint TargetAuraSpell;
public uint ExcludeCasterAuraSpell;
public uint ExcludeTargetAuraSpell;
public byte DifficultyID;
public byte CasterAuraState;
public byte TargetAuraState;
public byte ExcludeCasterAuraState;
public byte ExcludeTargetAuraState;
}
public sealed class SpellCastTimesRecord
{
public uint Id;
public int CastTime;
public int MinCastTime;
public short CastTimePerLevel;
}
public sealed class SpellCastingRequirementsRecord
{
public uint Id;
public uint SpellID;
public ushort MinFactionID;
public ushort RequiredAreasID;
public ushort RequiresSpellFocus;
public byte FacingCasterFlags;
public byte MinReputation;
public byte RequiredAuraVision;
}
public sealed class SpellCategoriesRecord
{
public uint Id;
public uint SpellID;
public ushort Category;
public ushort StartRecoveryCategory;
public ushort ChargeCategory;
public byte DifficultyID;
public byte DefenseType;
public byte DispelType;
public byte Mechanic;
public byte PreventionType;
}
public sealed class SpellCategoryRecord
{
public uint Id;
public LocalizedString Name;
public int ChargeRecoveryTime;
public SpellCategoryFlags Flags;
public byte UsesPerWeek;
public byte MaxCharges;
public uint ChargeCategoryType;
}
public sealed class SpellClassOptionsRecord
{
public uint Id;
public uint SpellID;
public FlagArray128 SpellClassMask;
public byte SpellClassSet;
public uint ModalNextSpell;
}
public sealed class SpellCooldownsRecord
{
public uint Id;
public uint SpellID;
public uint CategoryRecoveryTime;
public uint RecoveryTime;
public uint StartRecoveryTime;
public byte DifficultyID;
}
public sealed class SpellDurationRecord
{
public uint Id;
public int Duration;
public int MaxDuration;
public int DurationPerLevel;
}
public sealed class SpellEffectRecord
{
public FlagArray128 EffectSpellClassMask;
public uint Id;
public uint SpellID;
public uint Effect;
public uint EffectAura;
public int EffectBasePoints;
public uint EffectIndex;
public int EffectMiscValue;
public int EffectMiscValueB;
public uint EffectRadiusIndex;
public uint EffectRadiusMaxIndex;
public uint[] ImplicitTarget = new uint[2];
public uint DifficultyID;
public float EffectAmplitude;
public uint EffectAuraPeriod;
public float EffectBonusCoefficient;
public float EffectChainAmplitude;
public uint EffectChainTargets;
public int EffectDieSides;
public uint EffectItemType;
public uint EffectMechanic;
public float EffectPointsPerResource;
public float EffectRealPointsPerLevel;
public uint EffectTriggerSpell;
public float EffectPosFacing;
public uint EffectAttributes;
public float BonusCoefficientFromAP;
public float PvPMultiplier;
}
public sealed class SpellEffectScalingRecord
{
public uint Id;
public float Coefficient;
public float Variance;
public float ResourceCoefficient;
public uint SpellEffectID;
}
public sealed class SpellEquippedItemsRecord
{
public uint Id;
public uint SpellID;
public int EquippedItemInventoryTypeMask;
public int EquippedItemSubClassMask;
public sbyte EquippedItemClass;
}
public sealed class SpellFocusObjectRecord
{
public uint Id;
public LocalizedString Name;
}
public sealed class SpellInterruptsRecord
{
public uint Id;
public uint SpellID;
public uint[] AuraInterruptFlags = new uint[2];
public uint[] ChannelInterruptFlags = new uint[2];
public ushort InterruptFlags;
public byte DifficultyID;
}
public sealed class SpellItemEnchantmentRecord
{
public uint Id;
public uint[] EffectSpellID = new uint[ItemConst.MaxItemEnchantmentEffects];
public LocalizedString Name;
public float[] EffectScalingPoints = new float[ItemConst.MaxItemEnchantmentEffects];
public uint TransmogCost;
public uint TextureFileDataID;
public ushort[] EffectPointsMin = new ushort[ItemConst.MaxItemEnchantmentEffects];
public ushort ItemVisual;
public EnchantmentSlotMask Flags;
public ushort RequiredSkillID;
public ushort RequiredSkillRank;
public ushort ItemLevel;
public byte Charges;
public ItemEnchantmentType[] Effect = new ItemEnchantmentType[ItemConst.MaxItemEnchantmentEffects];
public byte ConditionID;
public byte MinLevel;
public byte MaxLevel;
public sbyte ScalingClass;
public sbyte ScalingClassRestricted;
public uint PlayerConditionID;
}
public sealed class SpellItemEnchantmentConditionRecord
{
public uint Id;
public byte[] LTOperandType = new byte[5];
public byte[] Operator = new byte[5];
public byte[] RTOperandType = new byte[5];
public byte[] RTOperand = new byte[5];
public byte[] Logic = new byte[5];
public uint[] LTOperand = new uint[5];
}
public sealed class SpellLearnSpellRecord
{
public uint Id;
public uint LearnSpellID;
public uint SpellID;
public uint OverridesSpellID;
}
public sealed class SpellLevelsRecord
{
public uint Id;
public uint SpellID;
public ushort BaseLevel;
public ushort MaxLevel;
public ushort SpellLevel;
public byte DifficultyID;
public byte MaxUsableLevel;
}
public sealed class SpellMiscRecord
{
public uint Id;
public uint Attributes;
public uint AttributesEx;
public uint AttributesExB;
public uint AttributesExC;
public uint AttributesExD;
public uint AttributesExE;
public uint AttributesExF;
public uint AttributesExG;
public uint AttributesExH;
public uint AttributesExI;
public uint AttributesExJ;
public uint AttributesExK;
public uint AttributesExL;
public uint AttributesExM;
public float Speed;
public float MultistrikeSpeedMod;
public ushort CastingTimeIndex;
public ushort DurationIndex;
public ushort RangeIndex;
public byte SchoolMask;
public uint IconFileDataID;
public uint ActiveIconFileDataID;
}
public sealed class SpellPowerRecord
{
public uint SpellID;
public int ManaCost;
public float ManaCostPercentage;
public float ManaCostPercentagePerSecond;
public uint RequiredAura;
public float HealthCostPercentage;
public byte PowerIndex;
public PowerType PowerType;
public uint Id;
public int ManaCostPerLevel;
public int ManaCostPerSecond;
public int ManaCostAdditional; // Spell uses [ManaCost, ManaCost+ManaCostAdditional] power - affects tooltip parsing as multiplier on SpellEffectEntry::EffectPointsPerResource
// only SPELL_EFFECT_WEAPON_DAMAGE_NOSCHOOL, SPELL_EFFECT_WEAPON_PERCENT_DAMAGE, SPELL_EFFECT_WEAPON_DAMAGE, SPELL_EFFECT_NORMALIZED_WEAPON_DMG
public uint PowerDisplayID;
public uint UnitPowerBarID;
}
public sealed class SpellPowerDifficultyRecord
{
public byte DifficultyID;
public byte PowerIndex;
public uint Id;
}
public sealed class SpellProcsPerMinuteRecord
{
public uint Id;
public float BaseProcRate;
public byte Flags;
}
public sealed class SpellProcsPerMinuteModRecord
{
public uint Id;
public float Coeff;
public ushort Param;
public SpellProcsPerMinuteModType Type;
public byte SpellProcsPerMinuteID;
}
public sealed class SpellRadiusRecord
{
public uint Id;
public float Radius;
public float RadiusPerLevel;
public float RadiusMin;
public float RadiusMax;
}
public sealed class SpellRangeRecord
{
public uint Id;
public float MinRangeHostile;
public float MinRangeFriend;
public float MaxRangeHostile;
public float MaxRangeFriend;
public LocalizedString DisplayName;
public LocalizedString DisplayNameShort;
public SpellRangeFlag Flags;
}
public sealed class SpellReagentsRecord
{
public uint Id;
public uint SpellID;
public int[] Reagent = new int[SpellConst.MaxReagents];
public ushort[] ReagentCount = new ushort[SpellConst.MaxReagents];
}
public sealed class SpellScalingRecord
{
public uint Id;
public uint SpellID;
public ushort ScalesFromItemLevel;
public int ScalingClass;
public uint MinScalingLevel;
public uint MaxScalingLevel;
}
public sealed class SpellShapeshiftRecord
{
public uint Id;
public uint SpellID;
public uint[] ShapeshiftExclude = new uint[2];
public uint[] ShapeshiftMask = new uint[2];
public byte StanceBarOrder;
}
public sealed class SpellShapeshiftFormRecord
{
public uint Id;
public LocalizedString Name;
public float WeaponDamageVariance;
public SpellShapeshiftFormFlags Flags;
public ushort CombatRoundTime;
public ushort MountTypeID;
public sbyte CreatureType;
public byte BonusActionBar;
public uint AttackIconFileDataID;
public ushort[] CreatureDisplayID = new ushort[4];
public ushort[] PresetSpellID = new ushort[SpellConst.MaxShapeshift];
}
public sealed class SpellTargetRestrictionsRecord
{
public uint Id;
public uint SpellID;
public float ConeAngle;
public float Width;
public uint Targets;
public ushort TargetCreatureType;
public byte DifficultyID;
public byte MaxAffectedTargets;
public uint MaxTargetLevel;
}
public sealed class SpellTotemsRecord
{
public uint Id;
public uint SpellID;
public uint[] Totem = new uint[SpellConst.MaxTotems];
public ushort[] RequiredTotemCategoryID = new ushort[SpellConst.MaxTotems];
}
public sealed class SpellXSpellVisualRecord
{
public uint SpellID;
public uint SpellVisualID;
public uint Id;
public float Chance;
public ushort CasterPlayerConditionID;
public ushort CasterUnitConditionID;
public ushort PlayerConditionID;
public ushort UnitConditionID;
public uint IconFileDataID;
public uint ActiveIconFileDataID;
public byte Flags;
public byte DifficultyID;
public byte Priority;
}
public sealed class SummonPropertiesRecord
{
public uint Id;
public uint Flags;
public SummonCategory Category;
public uint Faction;
public SummonType Type;
public int Slot;
}
}
@@ -0,0 +1,147 @@
/*
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
using Framework.Constants;
using Framework.GameMath;
namespace Game.DataStorage
{
public sealed class TactKeyRecord
{
public uint Id;
public byte[] Key = new byte[16];
}
public sealed class TalentRecord
{
public uint Id;
public uint SpellID;
public uint OverridesSpellID;
public LocalizedString Description;
public ushort SpecID;
public byte TierID;
public byte ColumnIndex;
public byte Flags;
public byte[] CategoryMask = new byte[2];
public byte ClassID;
}
public sealed class TaxiNodesRecord
{
public Vector3 Pos;
public LocalizedString Name;
public uint[] MountCreatureID = new uint[2];
public Vector2 MapOffset;
public ushort MapID;
public ushort ConditionID;
public ushort LearnableIndex;
public TaxiNodeFlags Flags;
public uint Id;
}
public sealed class TaxiPathRecord
{
public ushort From;
public ushort To;
public uint Id;
public uint Cost;
}
public sealed class TaxiPathNodeRecord
{
public Vector3 Loc;
public uint Delay;
public ushort PathID;
public ushort MapID;
public ushort ArrivalEventID;
public ushort DepartureEventID;
public byte NodeIndex;
public TaxiPathNodeFlags Flags;
public uint Id;
}
public sealed class TotemCategoryRecord
{
public uint Id;
public LocalizedString Name;
public uint CategoryMask;
public byte CategoryType;
}
public sealed class ToyRecord
{
public uint ItemID;
public LocalizedString Description;
public byte Flags;
public byte CategoryFilter;
public uint Id;
}
public sealed class TransmogHolidayRecord
{
public uint Id;
public int HolidayID;
}
public sealed class TransmogSetRecord
{
public LocalizedString Name;
public ushort BaseSetID;
public ushort UIOrder;
public byte ExpansionID;
public uint Id;
public int Flags;
public int QuestID;
public int ClassMask;
public int ItemNameDescriptionID;
public uint TransmogSetGroupID;
}
public sealed class TransmogSetGroupRecord
{
public LocalizedString Label;
public uint Id;
}
public sealed class TransmogSetItemRecord
{
public uint Id;
public uint TransmogSetID;
public uint ItemModifiedAppearanceID;
public int Flags;
}
public sealed class TransportAnimationRecord
{
public uint Id;
public uint TransportID;
public uint TimeIndex;
public Vector3 Pos;
public byte SequenceID;
}
public sealed class TransportRotationRecord
{
public uint Id;
public uint TransportID;
public uint TimeIndex;
public float X;
public float Y;
public float Z;
public float W;
}
}
@@ -0,0 +1,40 @@
/*
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
namespace Game.DataStorage
{
public sealed class UnitPowerBarRecord
{
public uint Id;
public float RegenerationPeace;
public float RegenerationCombat;
public uint[] FileDataID = new uint[6];
public uint[] Color = new uint[6];
public LocalizedString Name;
public LocalizedString Cost;
public LocalizedString OutOfError;
public LocalizedString ToolTip;
public float StartInset;
public float EndInset;
public ushort StartPower;
public ushort Flags;
public byte CenterPower;
public byte BarType;
public uint MinPower;
public uint MaxPower;
}
}
@@ -0,0 +1,137 @@
/*
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
using Framework.Constants;
using Framework.GameMath;
using System;
namespace Game.DataStorage
{
public sealed class VehicleRecord
{
public uint Id;
public VehicleFlags Flags;
public float TurnSpeed;
public float PitchSpeed;
public float PitchMin;
public float PitchMax;
public float MouseLookOffsetPitch;
public float CameraFadeDistScalarMin;
public float CameraFadeDistScalarMax;
public float CameraPitchOffset;
public float FacingLimitRight;
public float FacingLimitLeft;
public float MsslTrgtTurnLingering;
public float MsslTrgtPitchLingering;
public float MsslTrgtMouseLingering;
public float MsslTrgtEndOpacity;
public float MsslTrgtArcSpeed;
public float MsslTrgtArcRepeat;
public float MsslTrgtArcWidth;
public float[] MsslTrgtImpactRadius = new float[2];
public string MsslTrgtArcTexture;
public string MsslTrgtImpactTexture;
public string[] MsslTrgtImpactModel = new string[2];
public float CameraYawOffset;
public float MsslTrgtImpactTexRadius;
public ushort[] SeatID = new ushort[SharedConst.MaxVehicleSeats];
public ushort VehicleUIIndicatorID;
public ushort[] PowerDisplayID = new ushort[3];
public byte FlagsB;
public byte UILocomotionType;
}
public sealed class VehicleSeatRecord
{
public uint Id;
public uint[] Flags = new uint[3];
public Vector3 AttachmentOffset;
public float EnterPreDelay;
public float EnterSpeed;
public float EnterGravity;
public float EnterMinDuration;
public float EnterMaxDuration;
public float EnterMinArcHeight;
public float EnterMaxArcHeight;
public float ExitPreDelay;
public float ExitSpeed;
public float ExitGravity;
public float ExitMinDuration;
public float ExitMaxDuration;
public float ExitMinArcHeight;
public float ExitMaxArcHeight;
public float PassengerYaw;
public float PassengerPitch;
public float PassengerRoll;
public float VehicleEnterAnimDelay;
public float VehicleExitAnimDelay;
public float CameraEnteringDelay;
public float CameraEnteringDuration;
public float CameraExitingDelay;
public float CameraExitingDuration;
public Vector3 CameraOffset;
public float CameraPosChaseRate;
public float CameraFacingChaseRate;
public float CameraEnteringZoom;
public float CameraSeatZoomMin;
public float CameraSeatZoomMax;
public uint UISkinFileDataID;
public short EnterAnimStart;
public short EnterAnimLoop;
public short RideAnimStart;
public short RideAnimLoop;
public short RideUpperAnimStart;
public short RideUpperAnimLoop;
public short ExitAnimStart;
public short ExitAnimLoop;
public short ExitAnimEnd;
public short VehicleEnterAnim;
public short VehicleExitAnim;
public short VehicleRideAnimLoop;
public ushort EnterAnimKitID;
public ushort RideAnimKitID;
public ushort ExitAnimKitID;
public ushort VehicleEnterAnimKitID;
public ushort VehicleRideAnimKitID;
public ushort VehicleExitAnimKitID;
public ushort CameraModeID;
public sbyte AttachmentID;
public sbyte PassengerAttachmentID;
public sbyte VehicleEnterAnimBone;
public sbyte VehicleExitAnimBone;
public sbyte VehicleRideAnimLoopBone;
public byte VehicleAbilityDisplay;
public uint EnterUISoundID;
public uint ExitUISoundID;
public bool CanEnterOrExit()
{
return (Flags[0].HasAnyFlag((uint)VehicleSeatFlags.CanEnterOrExit) ||
//If it has anmation for enter/ride, means it can be entered/exited by logic
Flags[0].HasAnyFlag((uint)VehicleSeatFlags.HasLowerAnimForEnter | (uint)VehicleSeatFlags.HasLowerAnimForRide));
}
public bool CanSwitchFromSeat() { return Flags[0].HasAnyFlag((uint)VehicleSeatFlags.CanSwitch); }
public bool IsUsableByOverride()
{
return Flags[0].HasAnyFlag((uint)VehicleSeatFlags.Uncontrolled | (uint)VehicleSeatFlags.Unk18)
|| Flags[1].HasAnyFlag((uint)VehicleSeatFlagsB.UsableForced | (uint)VehicleSeatFlagsB.UsableForced2 |
(uint)VehicleSeatFlagsB.UsableForced3 | (uint)VehicleSeatFlagsB.UsableForced4);
}
public bool IsEjectable() { return Flags[1].HasAnyFlag((uint)VehicleSeatFlagsB.Ejectable); }
}
}
@@ -0,0 +1,104 @@
/*
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
using Framework.Constants;
using Framework.GameMath;
namespace Game.DataStorage
{
public sealed class WMOAreaTableRecord
{
public int WMOGroupID; // used in group WMO
public LocalizedString AreaName;
public short WMOID; // used in root WMO
public ushort AmbienceID;
public ushort ZoneMusic;
public ushort IntroSound;
public ushort AreaTableID;
public ushort UWIntroSound;
public ushort UWAmbience;
public sbyte NameSet; // used in adt file
public byte SoundProviderPref;
public byte SoundProviderPrefUnderwater;
public byte Flags;
public uint I;
public uint UWZoneMusic;
}
public sealed class WorldMapAreaRecord
{
public string AreaName;
public float LocLeft;
public float LocRight;
public float LocTop;
public float LocBottom;
public ushort MapID;
public ushort AreaID;
public short DisplayMapID;
public short DefaultDungeonFloor;
public ushort ParentWorldMapID;
public ushort Flags;
public byte LevelRangeMin;
public byte LevelRangeMax;
public byte BountySetID;
public byte BountyBoardLocation;
public uint Id;
public uint PlayerConditionID;
}
public sealed class WorldMapOverlayRecord
{
public uint Id;
public string TextureName;
public ushort TextureWidth;
public ushort TextureHeight;
public uint MapAreaID; // idx in WorldMapArea.dbc
public uint[] AreaID = new uint[SharedConst.MaxWorldMapOverlayArea];
public int OffsetX;
public int OffsetY;
public int HitRectTop;
public int HitRectLeft;
public int HitRectBottom;
public int HitRectRight;
public uint PlayerConditionID;
public uint Flags;
}
public sealed class WorldMapTransformsRecord
{
public uint Id;
public Vector3 RegionMin;
public Vector3 RegionMax;
public Vector2 RegionOffset;
public float RegionScale;
public ushort MapID;
public ushort AreaID;
public ushort NewMapID;
public ushort NewDungeonMapID;
public ushort NewAreaID;
public byte Flags;
}
public sealed class WorldSafeLocsRecord
{
public uint Id;
public Vector3 Loc;
public float Facing;
public LocalizedString AreaName;
public ushort MapID;
}
}