public static string Hotfixes() { var stringBuilder = new StringBuilder(); if (BinaryPacketReader.GetLocale() == LocaleConstant.enUS) { // ReSharper disable once LoopCanBePartlyConvertedToQuery foreach (DB2Hash hashValue in Enum.GetValues(typeof(DB2Hash))) { if (HotfixSettings.Instance.ShouldLog(hashValue)) { HotfixStoreMgr.GetStore(hashValue)?.Serialize(stringBuilder, null); } } } else { foreach (DB2Hash hashValue in Enum.GetValues(typeof(DB2Hash))) { if (!HotfixSettings.Instance.ShouldLog(hashValue)) { continue; } var localeBuilder = new StringBuilder(); HotfixStoreMgr.GetStore(hashValue)?.Serialize(stringBuilder, localeBuilder); stringBuilder.Append(localeBuilder); } } return(stringBuilder.ToString()); }
/// <summary> /// [addedInVersion, +inf[ /// </summary> /// <param name="name">database field name</param> /// <param name="addedInVersion">initial version</param> /// <param name="locale">initial locale</param> public DBFieldNameAttribute(string name, ClientVersionBuild addedInVersion, LocaleConstant locale) { if (ClientVersion.AddedInVersion(addedInVersion) && BinaryPacketReader.GetLocale() == locale) { Name = name; Count = 1; } else { Name = null; Count = 0; } }
/// <summary> /// [addedInVersion, +inf[ /// </summary> /// <param name="name">database field name</param> /// <param name="locale">initial locale</param> public DBFieldNameAttribute(string name, LocaleConstant locale) { if (BinaryPacketReader.GetLocale() == locale) { Name = name; Count = 1; } else { Name = null; Count = 0; } }
public bool IsVisible() { if (Locale != null && Locale != BinaryPacketReader.GetLocale()) { return(false); } TargetedDatabase target = Settings.TargetedDatabase; if (_addedInVersion.HasValue && !_removedInVersion.HasValue) { return(target >= _addedInVersion.Value); } if (_addedInVersion.HasValue && _removedInVersion.HasValue) { return(target >= _addedInVersion.Value && target < _removedInVersion.Value); } return(true); }
public static void HandleQuestQueryResponse(Packet packet) { packet.ReadInt32("Entry"); Bit hasData = packet.ReadBit("Has Data"); if (!hasData) { return; // nothing to do } var id = packet.ReadEntry("Quest ID"); QuestTemplate quest = new QuestTemplate { ID = (uint)id.Key }; quest.QuestType = packet.ReadInt32E <QuestType>("QuestType"); quest.QuestLevel = packet.ReadInt32("QuestLevel"); quest.QuestPackageID = packet.ReadUInt32("QuestPackageID"); quest.MinLevel = packet.ReadInt32("QuestMinLevel"); quest.QuestSortID = (QuestSort)packet.ReadUInt32("QuestSortID"); quest.QuestInfoID = packet.ReadInt32E <QuestInfo>("QuestInfoID"); quest.SuggestedGroupNum = packet.ReadUInt32("SuggestedGroupNum"); quest.RewardNextQuest = packet.ReadUInt32("RewardNextQuest"); quest.RewardXPDifficulty = packet.ReadUInt32("RewardXPDifficulty"); quest.RewardXPMultiplier = packet.ReadSingle("RewardXPMultiplier"); quest.RewardMoney = packet.ReadInt32("RewardMoney"); quest.RewardMoneyDifficulty = packet.ReadUInt32("RewardMoneyDifficulty"); quest.RewardMoneyMultiplier = packet.ReadSingle("RewardMoneyMultiplier"); quest.RewardBonusMoney = packet.ReadUInt32("RewardBonusMoney"); quest.RewardDisplaySpell = packet.ReadUInt32("RewardDisplaySpell"); quest.RewardSpellWod = packet.ReadUInt32("RewardSpell"); quest.RewardHonorWod = packet.ReadUInt32("RewardHonor"); quest.RewardKillHonor = packet.ReadSingle("RewardKillHonor"); quest.StartItem = packet.ReadUInt32("StartItem"); quest.Flags = packet.ReadUInt32E <QuestFlags>("Flags"); quest.FlagsEx = packet.ReadUInt32E <QuestFlags2>("FlagsEx"); quest.RewardItem = new uint?[4]; quest.RewardAmount = new uint?[4]; quest.ItemDrop = new uint?[4]; quest.ItemDropQuantity = new uint?[4]; for (int i = 0; i < 4; ++i) { quest.RewardItem[i] = packet.ReadUInt32("RewardItems", i); quest.RewardAmount[i] = packet.ReadUInt32("RewardAmount", i); quest.ItemDrop[i] = packet.ReadUInt32("ItemDrop", i); quest.ItemDropQuantity[i] = packet.ReadUInt32("ItemDropQuantity", i); } quest.RewardChoiceItemID = new uint?[6]; quest.RewardChoiceItemQuantity = new uint?[6]; quest.RewardChoiceItemDisplayID = new uint?[6]; for (int i = 0; i < 6; ++i) // CliQuestInfoChoiceItem { quest.RewardChoiceItemID[i] = packet.ReadUInt32("RewardChoiceItemID", i); quest.RewardChoiceItemQuantity[i] = packet.ReadUInt32("RewardChoiceItemQuantity", i); quest.RewardChoiceItemDisplayID[i] = packet.ReadUInt32("RewardChoiceItemDisplayID", i); } quest.POIContinent = packet.ReadUInt32("POIContinent"); quest.POIx = packet.ReadSingle("POIx"); quest.POIy = packet.ReadSingle("POIy"); quest.POIPriorityWod = packet.ReadInt32("POIPriority"); quest.RewardTitle = packet.ReadUInt32("RewardTitle"); quest.RewardTalents = packet.ReadUInt32("RewardTalents"); quest.RewardArenaPoints = packet.ReadUInt32("RewardArenaPoints"); quest.RewardSkillLineID = packet.ReadUInt32("RewardSkillLineID"); quest.RewardNumSkillUps = packet.ReadUInt32("RewardNumSkillUps"); quest.QuestGiverPortrait = packet.ReadUInt32("PortraitGiver"); quest.QuestTurnInPortrait = packet.ReadUInt32("PortraitTurnIn"); quest.RewardFactionID = new uint?[5]; quest.RewardFactionValue = new int?[5]; quest.RewardFactionOverride = new int?[5]; for (int i = 0; i < 5; ++i) { quest.RewardFactionID[i] = packet.ReadUInt32("RewardFactionID", i); quest.RewardFactionValue[i] = packet.ReadInt32("RewardFactionValue", i); quest.RewardFactionOverride[i] = packet.ReadInt32("RewardFactionOverride", i); } quest.RewardFactionFlags = packet.ReadUInt32("RewardFactionFlags"); quest.RewardCurrencyID = new uint?[4]; quest.RewardCurrencyCount = new uint?[4]; for (int i = 0; i < 4; ++i) { quest.RewardCurrencyID[i] = packet.ReadUInt32("RewardCurrencyID"); quest.RewardCurrencyCount[i] = packet.ReadUInt32("RewardCurrencyQty"); } quest.SoundAccept = packet.ReadUInt32("AcceptedSoundKitID"); quest.SoundTurnIn = packet.ReadUInt32("CompleteSoundKitID"); quest.AreaGroupID = packet.ReadUInt32("AreaGroupID"); quest.TimeAllowed = packet.ReadUInt32("TimeAllowed"); uint int2946 = packet.ReadUInt32("CliQuestInfoObjective"); quest.AllowableRacesWod = packet.ReadInt32("AllowableRaces"); for (int i = 0; i < int2946; ++i) { var objectiveId = packet.ReadEntry("Id", i); QuestObjective questInfoObjective = new QuestObjective { ID = (uint)objectiveId.Key, QuestID = (uint)id.Key }; questInfoObjective.Type = packet.ReadByteE <QuestRequirementType>("Quest Requirement Type", i); questInfoObjective.StorageIndex = packet.ReadSByte("StorageIndex", i); questInfoObjective.ObjectID = packet.ReadInt32("ObjectID", i); questInfoObjective.Amount = packet.ReadInt32("Amount", i); questInfoObjective.Flags = packet.ReadUInt32("Flags", i); questInfoObjective.UnkFloat = packet.ReadSingle("Float5", i); int int280 = packet.ReadInt32("VisualEffects", i); for (int j = 0; j < int280; ++j) { QuestVisualEffect questVisualEffect = new QuestVisualEffect { ID = questInfoObjective.ID, Index = (uint)j, VisualEffect = packet.ReadInt32("VisualEffectId", i, j) }; Storage.QuestVisualEffects.Add(questVisualEffect, packet.TimeSpan); } packet.ResetBitReader(); uint bits6 = packet.ReadBits(8); questInfoObjective.Description = packet.ReadWoWString("Description", bits6, i); if (BinaryPacketReader.GetLocale() != LocaleConstant.enUS && questInfoObjective.Description != string.Empty) { QuestObjectivesLocale localesQuestObjectives = new QuestObjectivesLocale { ID = (uint)objectiveId.Key, QuestId = (uint)id.Key, StorageIndex = questInfoObjective.StorageIndex, Description = questInfoObjective.Description }; Storage.LocalesQuestObjectives.Add(localesQuestObjectives, packet.TimeSpan); } Storage.QuestObjectives.Add(questInfoObjective, packet.TimeSpan); } packet.ResetBitReader(); uint bits26 = packet.ReadBits(9); uint bits154 = packet.ReadBits(12); uint bits904 = packet.ReadBits(12); uint bits1654 = packet.ReadBits(9); uint bits1789 = packet.ReadBits(10); uint bits2045 = packet.ReadBits(8); uint bits2109 = packet.ReadBits(10); uint bits2365 = packet.ReadBits(8); uint bits2429 = packet.ReadBits(11); quest.LogTitle = packet.ReadWoWString("LogTitle", bits26); quest.LogDescription = packet.ReadWoWString("LogDescription", bits154); quest.QuestDescription = packet.ReadWoWString("QuestDescription", bits904); quest.AreaDescription = packet.ReadWoWString("AreaDescription", bits1654); quest.QuestGiverTextWindow = packet.ReadWoWString("PortraitGiverText", bits1789); quest.QuestGiverTargetName = packet.ReadWoWString("PortraitGiverName", bits2045); quest.QuestTurnTextWindow = packet.ReadWoWString("PortraitTurnInText", bits2109); quest.QuestTurnTargetName = packet.ReadWoWString("PortraitTurnInName", bits2365); quest.QuestCompletionLog = packet.ReadWoWString("QuestCompletionLog", bits2429); if (BinaryPacketReader.GetLocale() != LocaleConstant.enUS) { LocalesQuest localesQuest = new LocalesQuest { ID = (uint)id.Key, Locale = BinaryPacketReader.GetClientLocale(), LogTitle = quest.LogTitle, LogDescription = quest.LogDescription, QuestDescription = quest.QuestDescription, AreaDescription = quest.AreaDescription, PortraitGiverText = quest.QuestGiverTextWindow, PortraitGiverName = quest.QuestGiverTargetName, PortraitTurnInText = quest.QuestTurnTextWindow, PortraitTurnInName = quest.QuestTurnTargetName, QuestCompletionLog = quest.QuestCompletionLog }; Storage.LocalesQuests.Add(localesQuest, packet.TimeSpan); } Storage.QuestTemplates.Add(quest, packet.TimeSpan); }
public static void HandleDBReply(Packet packet) { var type = packet.ReadUInt32E <DB2Hash>("TableHash"); var entry = packet.ReadInt32("RecordID"); var timeStamp = packet.ReadUInt32(); packet.AddValue("Timestamp", Utilities.GetDateTimeFromUnixTime(timeStamp)); var allow = packet.ReadBit("Allow"); var size = packet.ReadInt32("Size"); var data = packet.ReadBytes(size); var db2File = new Packet(data, packet.Opcode, packet.Time, packet.Direction, packet.Number, packet.Writer, packet.FileName); if (entry < 0 || !allow) { packet.WriteLine("Row {0} has been removed.", -entry); HotfixStoreMgr.RemoveRecord(type, entry); } else { switch (type) { case DB2Hash.BroadcastText: { var bct = new BroadcastText() { ID = (uint)entry, Text = db2File.ReadCString("Text"), Text1 = db2File.ReadCString("Text1"), }; bct.EmoteID = new ushort?[3]; bct.EmoteDelay = new ushort?[3]; for (int i = 0; i < 3; ++i) { bct.EmoteID[i] = db2File.ReadUInt16("EmoteID", i); } for (int i = 0; i < 3; ++i) { bct.EmoteDelay[i] = db2File.ReadUInt16("EmoteDelay", i); } bct.EmotesID = db2File.ReadUInt16("EmotesID"); bct.LanguageID = db2File.ReadByte("LanguageID"); bct.Flags = db2File.ReadByte("Flags"); if (ClientVersion.AddedInVersion(ClientVersionBuild.V7_3_5_25848)) { bct.ConditionID = db2File.ReadUInt32("ConditionID"); } bct.SoundEntriesID = new uint?[2]; for (int i = 0; i < 2; ++i) { bct.SoundEntriesID[i] = db2File.ReadUInt32("SoundEntriesID", i); } if (ClientVersion.AddedInVersion(ClientVersionBuild.V7_0_3_22248) && ClientVersion.RemovedInVersion(ClientVersionBuild.V7_3_5_25848)) { bct.ConditionID = db2File.ReadUInt32("ConditionID"); } Storage.BroadcastTexts.Add(bct, packet.TimeSpan); if (BinaryPacketReader.GetLocale() != LocaleConstant.enUS) { BroadcastTextLocale lbct = new BroadcastTextLocale { ID = bct.ID, TextLang = bct.Text, Text1Lang = bct.Text1 }; Storage.BroadcastTextLocales.Add(lbct, packet.TimeSpan); } break; } default: HotfixStoreMgr.AddRecord(type, entry, db2File); break; } db2File.ClosePacket(false); } }
public static void HandleCreatureQueryResponse(Packet packet) { var entry = packet.ReadEntry("Entry"); Bit hasData = packet.ReadBit(); if (!hasData) { return; // nothing to do } CreatureTemplate creature = new CreatureTemplate { Entry = (uint)entry.Key }; packet.ReadBits(11); uint qItemCount = packet.ReadBits(22); int lenS4 = (int)packet.ReadBits(6); creature.RacialLeader = packet.ReadBit("Racial Leader"); var stringLens = new int[4][]; for (int i = 0; i < 4; i++) { stringLens[i] = new int[2]; stringLens[i][0] = (int)packet.ReadBits(11); stringLens[i][1] = (int)packet.ReadBits(11); } int lenS5 = (int)packet.ReadBits(11); packet.ResetBitReader(); creature.Family = packet.ReadInt32E <CreatureFamily>("Family"); creature.RequiredExpansion = packet.ReadUInt32E <ClientType>("Expansion"); creature.Type = packet.ReadInt32E <CreatureType>("Type"); if (lenS5 > 1) { creature.SubName = packet.ReadCString("Sub Name"); } creature.ModelIDs = new uint?[4]; creature.ModelIDs[0] = packet.ReadUInt32("Display ID 0"); creature.ModelIDs[3] = packet.ReadUInt32("Display ID 3"); //TODO: move to creature_questitems //creature.QuestItems = new uint[qItemCount]; for (int i = 0; i < qItemCount; ++i) { /*creature.QuestItems[i] = (uint)*/ packet.ReadInt32 <ItemId>("Quest Item", i); } var name = new string[4]; var femaleName = new string[4]; for (int i = 0; i < 4; ++i) { if (stringLens[i][0] > 1) { name[i] = packet.ReadCString("Name", i); } if (stringLens[i][1] > 1) { femaleName[i] = packet.ReadCString("Female Name", i); } } creature.Name = name[0]; creature.FemaleName = femaleName[0]; if (lenS4 > 1) { creature.IconName = packet.ReadCString("Icon Name"); } creature.TypeFlags = packet.ReadUInt32E <CreatureTypeFlag>("Type Flags"); creature.TypeFlags2 = packet.ReadUInt32("Creature Type Flags 2"); // Missing enum creature.HealthModifier = packet.ReadSingle("Modifier 1"); creature.Rank = packet.ReadInt32E <CreatureRank>("Rank"); creature.KillCredits = new uint?[2]; for (int i = 0; i < 2; ++i) { creature.KillCredits[i] = packet.ReadUInt32("Kill Credit", i); } creature.ManaModifier = packet.ReadSingle("Modifier 2"); creature.MovementID = packet.ReadUInt32("Movement ID"); creature.ModelIDs[1] = packet.ReadUInt32("Display ID 1"); creature.ModelIDs[2] = packet.ReadUInt32("Display ID 2"); packet.AddSniffData(StoreNameType.Unit, entry.Key, "QUERY_RESPONSE"); Storage.CreatureTemplates.Add(creature, packet.TimeSpan); if (BinaryPacketReader.GetLocale() != LocaleConstant.enUS) { CreatureTemplateLocale localesCreature = new CreatureTemplateLocale { ID = (uint)entry.Key, Name = creature.Name, NameAlt = creature.FemaleName, Title = creature.SubName, TitleAlt = creature.TitleAlt }; Storage.LocalesCreatures.Add(localesCreature, packet.TimeSpan); } ObjectName objectName = new ObjectName { ObjectType = ObjectType.Unit, ID = entry.Key, Name = creature.Name }; Storage.ObjectNames.Add(objectName, packet.TimeSpan); }
private static string GetPath() { return(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + Settings.DBCPath + @"\" + BinaryPacketReader.GetLocale() + @"\"); }
public static void HandleCreatureQueryResponse(Packet packet) { var entry = packet.ReadEntry("Entry"); if (entry.Value) { return; } CreatureTemplate creature = new CreatureTemplate { Entry = (uint)entry.Key }; var name = new string[4]; for (int i = 0; i < name.Length; i++) { name[i] = packet.ReadCString("Name", i); } creature.Name = name[0]; if (ClientVersion.AddedInVersion(ClientVersionBuild.V4_1_0_13914)) { var femaleName = new string[4]; for (int i = 0; i < femaleName.Length; i++) { femaleName[i] = packet.ReadCString("Female Name", i); } creature.FemaleName = femaleName[0]; } creature.SubName = packet.ReadCString("Sub Name"); if (ClientVersion.AddedInVersion(ClientVersionBuild.V5_0_5_16048)) { creature.TitleAlt = packet.ReadCString("TitleAlt"); } creature.IconName = packet.ReadCString("Icon Name"); creature.TypeFlags = packet.ReadUInt32E <CreatureTypeFlag>("Type Flags"); if (ClientVersion.AddedInVersion(ClientVersionBuild.V4_1_0_13914)) // Might be earlier or later { creature.TypeFlags2 = packet.ReadUInt32("Creature Type Flags 2"); // Missing enum } creature.Type = packet.ReadInt32E <CreatureType>("Type"); creature.Family = packet.ReadInt32E <CreatureFamily>("Family"); creature.Rank = packet.ReadInt32E <CreatureRank>("Rank"); if (ClientVersion.AddedInVersion(ClientVersionBuild.V3_1_0_9767)) { creature.KillCredits = new uint?[2]; for (int i = 0; i < 2; ++i) { creature.KillCredits[i] = packet.ReadUInt32("Kill Credit", i); } } else // Did they stop sending pet spell data after 3.1? { packet.ReadInt32("Unk Int"); creature.PetSpellDataID = packet.ReadUInt32("Pet Spell Data Id"); } creature.ModelIDs = new uint?[4]; for (int i = 0; i < 4; i++) { creature.ModelIDs[i] = packet.ReadUInt32("Model ID", i); } creature.HealthModifier = packet.ReadSingle("Modifier 1"); creature.ManaModifier = packet.ReadSingle("Modifier 2"); creature.RacialLeader = packet.ReadBool("Racial Leader"); int qItemCount = ClientVersion.AddedInVersion(ClientVersionBuild.V3_2_0_10192) ? 6 : 4; //TODO: Move to creature_questitem //creature.QuestItems = new uint[qItemCount]; if (ClientVersion.AddedInVersion(ClientVersionBuild.V3_1_0_9767)) { for (int i = 0; i < qItemCount; i++) { /*creature.QuestItems[i] = (uint)*/ packet.ReadInt32 <ItemId>("Quest Item", i); } creature.MovementID = packet.ReadUInt32("Movement ID"); } if (ClientVersion.AddedInVersion(ClientVersionBuild.V4_0_1_13164)) { creature.RequiredExpansion = packet.ReadUInt32E <ClientType>("Expansion"); } packet.AddSniffData(StoreNameType.Unit, entry.Key, "QUERY_RESPONSE"); Storage.CreatureTemplates.Add(creature, packet.TimeSpan); if (BinaryPacketReader.GetLocale() != LocaleConstant.enUS) { CreatureTemplateLocale localesCreature = new CreatureTemplateLocale { ID = (uint)entry.Key, Name = creature.Name, NameAlt = creature.FemaleName, Title = creature.SubName, TitleAlt = creature.TitleAlt }; Storage.LocalesCreatures.Add(localesCreature, packet.TimeSpan); } ObjectName objectName = new ObjectName { ObjectType = ObjectType.Unit, ID = entry.Key, Name = creature.Name }; Storage.ObjectNames.Add(objectName, packet.TimeSpan); }
public static void HandleQuestQueryResponse(Packet packet) { packet.ReadInt32("Entry"); Bit hasData = packet.ReadBit("Has Data"); if (!hasData) { return; // nothing to do } var id = packet.ReadEntry("Quest ID"); QuestTemplate quest = new QuestTemplate { ID = (uint)id.Key }; quest.QuestType = packet.ReadInt32E <QuestType>("QuestType"); quest.QuestLevel = packet.ReadInt32("QuestLevel"); if (ClientVersion.AddedInVersion(ClientVersionBuild.V7_3_5_25848)) { quest.QuestMaxScalingLevel = packet.ReadInt32("QuestMaxScalingLevel"); } quest.QuestPackageID = packet.ReadUInt32("QuestPackageID"); quest.MinLevel = packet.ReadInt32("QuestMinLevel"); quest.QuestSortID = (QuestSort)packet.ReadUInt32("QuestSortID"); quest.QuestInfoID = packet.ReadInt32E <QuestInfo>("QuestInfoID"); quest.SuggestedGroupNum = packet.ReadUInt32("SuggestedGroupNum"); quest.RewardNextQuest = packet.ReadUInt32("RewardNextQuest"); quest.RewardXPDifficulty = packet.ReadUInt32("RewardXPDifficulty"); quest.RewardXPMultiplier = packet.ReadSingle("RewardXPMultiplier"); quest.RewardMoney = packet.ReadInt32("RewardMoney"); quest.RewardMoneyDifficulty = packet.ReadUInt32("RewardMoneyDifficulty"); quest.RewardMoneyMultiplier = packet.ReadSingle("RewardMoneyMultiplier"); quest.RewardBonusMoney = packet.ReadUInt32("RewardBonusMoney"); quest.RewardDisplaySpellLegion = new uint?[3]; for (int i = 0; i < 3; ++i) { quest.RewardDisplaySpellLegion[i] = packet.ReadUInt32("RewardDisplaySpell", i); } quest.RewardSpellWod = packet.ReadUInt32("RewardSpell"); quest.RewardHonorWod = packet.ReadUInt32("RewardHonor"); quest.RewardKillHonor = packet.ReadSingle("RewardKillHonor"); quest.RewardArtifactXPDifficulty = packet.ReadUInt32("RewardArtifactXPDifficulty"); quest.RewardArtifactXPMultiplier = packet.ReadSingle("RewardArtifactXPMultiplier"); quest.RewardArtifactCategoryID = packet.ReadUInt32("RewardArtifactCategoryID"); quest.StartItem = packet.ReadUInt32("StartItem"); quest.Flags = packet.ReadUInt32E <QuestFlags>("Flags"); quest.FlagsEx = packet.ReadUInt32E <QuestFlags2>("FlagsEx"); quest.RewardItem = new uint?[4]; quest.RewardAmount = new uint?[4]; quest.ItemDrop = new uint?[4]; quest.ItemDropQuantity = new uint?[4]; for (int i = 0; i < 4; ++i) { quest.RewardItem[i] = packet.ReadUInt32("RewardItems", i); quest.RewardAmount[i] = packet.ReadUInt32("RewardAmount", i); quest.ItemDrop[i] = packet.ReadUInt32("ItemDrop", i); quest.ItemDropQuantity[i] = packet.ReadUInt32("ItemDropQuantity", i); } quest.RewardChoiceItemID = new uint?[6]; quest.RewardChoiceItemQuantity = new uint?[6]; quest.RewardChoiceItemDisplayID = new uint?[6]; for (int i = 0; i < 6; ++i) // CliQuestInfoChoiceItem { quest.RewardChoiceItemID[i] = packet.ReadUInt32("RewardChoiceItemID", i); quest.RewardChoiceItemQuantity[i] = packet.ReadUInt32("RewardChoiceItemQuantity", i); quest.RewardChoiceItemDisplayID[i] = packet.ReadUInt32("RewardChoiceItemDisplayID", i); } quest.POIContinent = packet.ReadUInt32("POIContinent"); quest.POIx = packet.ReadSingle("POIx"); quest.POIy = packet.ReadSingle("POIy"); quest.POIPriorityWod = packet.ReadInt32("POIPriority"); quest.RewardTitle = packet.ReadUInt32("RewardTitle"); quest.RewardArenaPoints = packet.ReadUInt32("RewardArenaPoints"); quest.RewardSkillLineID = packet.ReadUInt32("RewardSkillLineID"); quest.RewardNumSkillUps = packet.ReadUInt32("RewardNumSkillUps"); quest.QuestGiverPortrait = packet.ReadUInt32("PortraitGiver"); quest.QuestTurnInPortrait = packet.ReadUInt32("PortraitTurnIn"); quest.RewardFactionID = new uint?[5]; quest.RewardFactionOverride = new int?[5]; quest.RewardFactionValue = new int?[5]; quest.RewardFactionCapIn = new int?[5]; for (int i = 0; i < 5; ++i) { quest.RewardFactionID[i] = packet.ReadUInt32("RewardFactionID", i); quest.RewardFactionValue[i] = packet.ReadInt32("RewardFactionValue", i); quest.RewardFactionOverride[i] = packet.ReadInt32("RewardFactionOverride", i); quest.RewardFactionCapIn[i] = packet.ReadInt32("RewardFactionCapIn", i); } quest.RewardFactionFlags = packet.ReadUInt32("RewardFactionFlags"); quest.RewardCurrencyID = new uint?[4]; quest.RewardCurrencyCount = new uint?[4]; for (int i = 0; i < 4; ++i) { quest.RewardCurrencyID[i] = packet.ReadUInt32("RewardCurrencyID"); quest.RewardCurrencyCount[i] = packet.ReadUInt32("RewardCurrencyQty"); } quest.SoundAccept = packet.ReadUInt32("AcceptedSoundKitID"); quest.SoundTurnIn = packet.ReadUInt32("CompleteSoundKitID"); quest.AreaGroupID = packet.ReadUInt32("AreaGroupID"); quest.TimeAllowed = packet.ReadUInt32("TimeAllowed"); uint cliQuestInfoObjective = packet.ReadUInt32("CliQuestInfoObjective"); if (ClientVersion.AddedInVersion(ClientVersionBuild.V7_3_5_25848)) { quest.AllowableRacesWod = packet.ReadUInt64("AllowableRaces"); } if (ClientVersion.AddedInVersion(ClientVersionBuild.V7_0_3_22248) && ClientVersion.RemovedInVersion(ClientVersionBuild.V7_3_5_25848)) { quest.AllowableRacesWod = (uint)packet.ReadInt32("AllowableRaces"); } quest.QuestRewardID = packet.ReadInt32("QuestRewardID"); if (ClientVersion.AddedInVersion(ClientVersionBuild.V7_2_0_23826)) { quest.Expansion = packet.ReadInt32("Expansion"); } packet.ResetBitReader(); uint logTitleLen = packet.ReadBits(9); uint logDescriptionLen = packet.ReadBits(12); uint questDescriptionLen = packet.ReadBits(12); uint areaDescriptionLen = packet.ReadBits(9); uint questGiverTextWindowLen = packet.ReadBits(10); uint questGiverTargetNameLen = packet.ReadBits(8); uint questTurnTextWindowLen = packet.ReadBits(10); uint questTurnTargetNameLen = packet.ReadBits(8); uint questCompletionLogLen = packet.ReadBits(11); for (uint i = 0; i < cliQuestInfoObjective; ++i) { var objectiveId = packet.ReadEntry("Id", i); QuestObjective questInfoObjective = new QuestObjective { ID = (uint)objectiveId.Key, QuestID = (uint)id.Key }; questInfoObjective.Type = packet.ReadByteE <QuestRequirementType>("Quest Requirement Type", i); questInfoObjective.StorageIndex = packet.ReadSByte("StorageIndex", i); questInfoObjective.Order = i; questInfoObjective.ObjectID = packet.ReadInt32("ObjectID", i); questInfoObjective.Amount = packet.ReadInt32("Amount", i); questInfoObjective.Flags = packet.ReadUInt32("Flags", i); if (ClientVersion.AddedInVersion(ClientVersionBuild.V7_1_0_22900)) { questInfoObjective.Flags2 = packet.ReadUInt32("Flags2", i); } questInfoObjective.ProgressBarWeight = packet.ReadSingle("ProgressBarWeight", i); int visualEffectsCount = packet.ReadInt32("VisualEffects", i); for (uint j = 0; j < visualEffectsCount; ++j) { QuestVisualEffect questVisualEffect = new QuestVisualEffect { ID = questInfoObjective.ID, Index = j, VisualEffect = packet.ReadInt32("VisualEffectId", i, j) }; Storage.QuestVisualEffects.Add(questVisualEffect, packet.TimeSpan); } packet.ResetBitReader(); uint bits6 = packet.ReadBits(8); questInfoObjective.Description = packet.ReadWoWString("Description", bits6, i); if (BinaryPacketReader.GetLocale() != LocaleConstant.enUS && questInfoObjective.Description != string.Empty) { QuestObjectivesLocale localesQuestObjectives = new QuestObjectivesLocale { ID = (uint)objectiveId.Key, QuestId = (uint)id.Key, StorageIndex = questInfoObjective.StorageIndex, Description = questInfoObjective.Description }; Storage.LocalesQuestObjectives.Add(localesQuestObjectives, packet.TimeSpan); } Storage.QuestObjectives.Add(questInfoObjective, packet.TimeSpan); } quest.LogTitle = packet.ReadWoWString("LogTitle", logTitleLen); quest.LogDescription = packet.ReadWoWString("LogDescription", logDescriptionLen); quest.QuestDescription = packet.ReadWoWString("QuestDescription", questDescriptionLen); quest.AreaDescription = packet.ReadWoWString("AreaDescription", areaDescriptionLen); quest.QuestGiverTextWindow = packet.ReadWoWString("PortraitGiverText", questGiverTextWindowLen); quest.QuestGiverTargetName = packet.ReadWoWString("PortraitGiverName", questGiverTargetNameLen); quest.QuestTurnTextWindow = packet.ReadWoWString("PortraitTurnInText", questTurnTextWindowLen); quest.QuestTurnTargetName = packet.ReadWoWString("PortraitTurnInName", questTurnTargetNameLen); quest.QuestCompletionLog = packet.ReadWoWString("QuestCompletionLog", questCompletionLogLen); if (BinaryPacketReader.GetLocale() != LocaleConstant.enUS) { LocalesQuest localesQuest = new LocalesQuest { ID = (uint)id.Key, LogTitle = quest.LogTitle, LogDescription = quest.LogDescription, QuestDescription = quest.QuestDescription, AreaDescription = quest.AreaDescription, PortraitGiverText = quest.QuestGiverTextWindow, PortraitGiverName = quest.QuestGiverTargetName, PortraitTurnInText = quest.QuestTurnTextWindow, PortraitTurnInName = quest.QuestTurnTargetName, QuestCompletionLog = quest.QuestCompletionLog }; Storage.LocalesQuests.Add(localesQuest, packet.TimeSpan); } Storage.QuestTemplates.Add(quest, packet.TimeSpan); }
public static void HandleCreatureQueryResponse(Packet packet) { var entry = packet.ReadEntry("Entry"); CreatureTemplate creature = new CreatureTemplate { Entry = (uint)entry.Key }; Bit hasData = packet.ReadBit(); if (!hasData) { return; // nothing to do } packet.ResetBitReader(); uint titleLen = packet.ReadBits(11); uint titleAltLen = packet.ReadBits(11); uint cursorNameLen = packet.ReadBits(6); creature.RacialLeader = packet.ReadBit("Leader"); var stringLens = new int[4][]; for (int i = 0; i < 4; i++) { stringLens[i] = new int[2]; stringLens[i][0] = (int)packet.ReadBits(11); stringLens[i][1] = (int)packet.ReadBits(11); } for (var i = 0; i < 4; ++i) { if (stringLens[i][0] > 1) { string name = packet.ReadCString("Name"); if (i == 0) { creature.Name = name; } } if (stringLens[i][1] > 1) { string nameAlt = packet.ReadCString("NameAlt"); if (i == 0) { creature.FemaleName = nameAlt; } } } creature.TypeFlags = packet.ReadUInt32E <CreatureTypeFlag>("Type Flags"); creature.TypeFlags2 = packet.ReadUInt32("Creature Type Flags 2"); creature.Type = packet.ReadInt32E <CreatureType>("CreatureType"); creature.Family = packet.ReadInt32E <CreatureFamily>("CreatureFamily"); creature.Rank = packet.ReadInt32E <CreatureRank>("Classification"); creature.KillCredits = new uint?[2]; for (int i = 0; i < 2; ++i) { creature.KillCredits[i] = packet.ReadUInt32("ProxyCreatureID", i); } creature.ModelIDs = new uint?[4]; for (int i = 0; i < 4; ++i) { creature.ModelIDs[i] = packet.ReadUInt32("CreatureDisplayID", i); } creature.HealthModifier = packet.ReadSingle("HpMulti"); creature.ManaModifier = packet.ReadSingle("EnergyMulti"); uint questItems = packet.ReadUInt32("QuestItems"); creature.MovementID = packet.ReadUInt32("CreatureMovementInfoID"); creature.HealthScalingExpansion = packet.ReadUInt32E <ClientType>("HealthScalingExpansion"); creature.RequiredExpansion = packet.ReadUInt32E <ClientType>("RequiredExpansion"); creature.VignetteID = packet.ReadUInt32("VignetteID"); if (titleLen > 1) { creature.SubName = packet.ReadCString("Title"); } if (titleAltLen > 1) { creature.TitleAlt = packet.ReadCString("TitleAlt"); } if (cursorNameLen > 1) { creature.IconName = packet.ReadCString("CursorName"); } for (uint i = 0; i < questItems; ++i) { CreatureTemplateQuestItem questItem = new CreatureTemplateQuestItem { CreatureEntry = (uint)entry.Key, Idx = i, ItemId = packet.ReadUInt32 <ItemId>("QuestItem", i) }; Storage.CreatureTemplateQuestItems.Add(questItem, packet.TimeSpan); } packet.AddSniffData(StoreNameType.Unit, entry.Key, "QUERY_RESPONSE"); Storage.CreatureTemplates.Add(creature, packet.TimeSpan); if (BinaryPacketReader.GetLocale() != LocaleConstant.enUS) { CreatureTemplateLocale localesCreature = new CreatureTemplateLocale { ID = (uint)entry.Key, Name = creature.Name, NameAlt = creature.FemaleName, Title = creature.SubName, TitleAlt = creature.TitleAlt }; Storage.LocalesCreatures.Add(localesCreature, packet.TimeSpan); } ObjectName objectName = new ObjectName { ObjectType = ObjectType.Unit, ID = entry.Key, Name = creature.Name }; Storage.ObjectNames.Add(objectName, packet.TimeSpan); }
public void SerializeStore(HotfixStore <T> store, StringBuilder hotfixBuilder, StringBuilder localeBuilder) { if (store.Records.Count == 0) { return; } var hotfixStructureAttribute = typeof(T).GetCustomAttribute <HotfixStructureAttribute>(); Debug.Assert(hotfixStructureAttribute != null); var propertiesInfos = typeof(T).GetProperties(BindingFlags.Instance | BindingFlags.Public); var tableName = Regex.Replace(hotfixStructureAttribute.Hash.ToString(), @"((?<=.)[A-Z][a-zA-Z]*)|((?<=[a-zA-Z])\d+)", @"_$1$2", RegexOptions.Compiled).ToLower(); if (localeBuilder != null && propertiesInfos.Any( propInfo => propInfo.PropertyType == typeof(string) || propInfo.PropertyType == typeof(string[]))) { localeBuilder.AppendLine("SET NAMES 'utf8';"); localeBuilder.Append($"INSERT INTO `{tableName}_locale` ("); if (!hotfixStructureAttribute.HasIndexInData) { localeBuilder.Append("`ID`, "); } localeBuilder.Append("`locale`, "); } hotfixBuilder.AppendLine("SET NAMES 'utf8';"); hotfixBuilder.Append($"INSERT INTO `{tableName}` ("); if (!hotfixStructureAttribute.HasIndexInData) { hotfixBuilder.Append("`ID`, "); } foreach (var propInfo in propertiesInfos) { if (propInfo.PropertyType.IsArray) { var isString = propInfo.PropertyType.GetElementType() == typeof(string); var arraySizeAttribute = propInfo.GetCustomAttribute <HotfixArrayAttribute>(); for (var i = 0; i < arraySizeAttribute.Size; ++i) { hotfixBuilder.Append($"`{propInfo.Name}{i}`, "); if (localeBuilder != null && isString) { localeBuilder.Append($"{propInfo.Name}{i}_lang`, "); } } } else { hotfixBuilder.Append($"`{propInfo.Name}`, "); if (localeBuilder != null && propInfo.PropertyType == typeof(string)) { localeBuilder.Append($"`{propInfo.Name}_lang`, "); } } } hotfixBuilder.AppendLine("`VerifiedBuild`) VALUES"); localeBuilder?.AppendLine("`VerifiedBuild`) VALUES"); var remainingCount = store.Records.Count - 1; foreach (var kv in store.Records) { hotfixBuilder.Append("("); localeBuilder?.Append("("); if (!hotfixStructureAttribute.HasIndexInData) { hotfixBuilder.Append($"{kv.Key}, "); localeBuilder?.Append($"{kv.Key}, "); } localeBuilder?.Append($"{BinaryPacketReader.GetLocale()}, "); _serializer((T)kv.Value, hotfixBuilder, localeBuilder); hotfixBuilder.AppendLine(remainingCount > 0 ? $"{ClientVersion.BuildInt})," : $"{ClientVersion.BuildInt});"); localeBuilder?.AppendLine(remainingCount > 0 ? $"{ClientVersion.BuildInt})," : $"{ClientVersion.BuildInt});"); --remainingCount; } hotfixBuilder.AppendLine(); localeBuilder?.AppendLine(); }