mirror of
https://github.com/thunderbrewhq/thunderbrew
synced 2025-12-08 10:25:59 +03:00
# Conflicts: # src/client/Client.cpp # src/console/Device.cpp # src/console/Line.cpp # src/console/Line.hpp # src/db/Db.cpp # src/db/Db.hpp # src/db/StaticDb.cpp # src/db/StaticDb.hpp # src/db/rec/Achievement_CategoryRec.cpp # src/db/rec/Achievement_CategoryRec.hpp # src/db/rec/Achievement_CriteriaRec.cpp # src/db/rec/Achievement_CriteriaRec.hpp # src/db/rec/AnimKitBoneSetAliasRec.cpp # src/db/rec/AnimKitBoneSetAliasRec.hpp # src/db/rec/AnimKitBoneSetRec.cpp # src/db/rec/AnimKitBoneSetRec.hpp # src/db/rec/AnimKitConfigBoneSetRec.cpp # src/db/rec/AnimKitConfigBoneSetRec.hpp # src/db/rec/AnimKitConfigRec.cpp # src/db/rec/AnimKitConfigRec.hpp # src/db/rec/AnimKitPriorityRec.cpp # src/db/rec/AnimKitPriorityRec.hpp # src/db/rec/AnimKitRec.cpp # src/db/rec/AnimKitRec.hpp # src/db/rec/AnimKitSegmentRec.cpp # src/db/rec/AnimKitSegmentRec.hpp # src/db/rec/AnimReplacementRec.cpp # src/db/rec/AnimReplacementRec.hpp # src/db/rec/AnimReplacementSetRec.cpp # src/db/rec/AnimReplacementSetRec.hpp # src/db/rec/AnimationDataRec.cpp # src/db/rec/AnimationDataRec.hpp # src/db/rec/AreaAssignmentRec.cpp # src/db/rec/AreaAssignmentRec.hpp # src/db/rec/AreaGroupRec.cpp # src/db/rec/AreaGroupRec.hpp # src/db/rec/AreaPOIRec.cpp # src/db/rec/AreaPOIRec.hpp # src/db/rec/AreaTableRec.cpp # src/db/rec/AreaTableRec.hpp # src/db/rec/AreaTriggerRec.cpp # src/db/rec/AreaTriggerRec.hpp # src/db/rec/ArmorLocationRec.cpp # src/db/rec/ArmorLocationRec.hpp # src/db/rec/AttackAnimKitsRec.cpp # src/db/rec/AttackAnimKitsRec.hpp # src/db/rec/AttackAnimTypesRec.cpp # src/db/rec/AttackAnimTypesRec.hpp # src/db/rec/AuctionHouseRec.cpp # src/db/rec/AuctionHouseRec.hpp # src/db/rec/BankBagSlotPricesRec.cpp # src/db/rec/BankBagSlotPricesRec.hpp # src/db/rec/BarberShopStyleRec.cpp # src/db/rec/BarberShopStyleRec.hpp # src/db/rec/BattlemasterListRec.cpp # src/db/rec/BattlemasterListRec.hpp # src/db/rec/CameraModeRec.cpp # src/db/rec/CameraModeRec.hpp # src/db/rec/CameraShakesRec.cpp # src/db/rec/CameraShakesRec.hpp # src/db/rec/CharBaseInfoRec.cpp # src/db/rec/CharBaseInfoRec.hpp # src/db/rec/CharHairGeosetsRec.cpp # src/db/rec/CharHairGeosetsRec.hpp # src/db/rec/CharHairTexturesRec.cpp # src/db/rec/CharHairTexturesRec.hpp # src/db/rec/CharSectionsRec.cpp # src/db/rec/CharSectionsRec.hpp # src/db/rec/CharStartOutfitRec.cpp # src/db/rec/CharStartOutfitRec.hpp # src/db/rec/CharTitlesRec.cpp # src/db/rec/CharTitlesRec.hpp # src/db/rec/CharVariationsRec.cpp # src/db/rec/CharVariationsRec.hpp # src/db/rec/CharacterFacialHairStylesRec.cpp # src/db/rec/CharacterFacialHairStylesRec.hpp # src/db/rec/ChatChannelsRec.cpp # src/db/rec/ChatChannelsRec.hpp # src/db/rec/ChatProfanityRec.cpp # src/db/rec/ChatProfanityRec.hpp # src/db/rec/ChrClassesRec.cpp # src/db/rec/ChrClassesRec.hpp # src/db/rec/CinematicCameraRec.cpp # src/db/rec/CinematicCameraRec.hpp # src/db/rec/CinematicSequencesRec.cpp # src/db/rec/CinematicSequencesRec.hpp # src/db/rec/CreatureDisplayInfoExtraRec.cpp # src/db/rec/CreatureDisplayInfoExtraRec.hpp # src/db/rec/CreatureDisplayInfoRec.cpp # src/db/rec/CreatureDisplayInfoRec.hpp # src/db/rec/CreatureFamilyRec.cpp # src/db/rec/CreatureFamilyRec.hpp # src/db/rec/CreatureModelDataRec.cpp # src/db/rec/CreatureModelDataRec.hpp # src/db/rec/CreatureMovementInfoRec.cpp # src/db/rec/CreatureMovementInfoRec.hpp # src/db/rec/CreatureSoundDataRec.cpp # src/db/rec/CreatureSoundDataRec.hpp # src/db/rec/CreatureSpellDataRec.cpp # src/db/rec/CreatureSpellDataRec.hpp # src/db/rec/CreatureTypeRec.cpp # src/db/rec/CreatureTypeRec.hpp # src/db/rec/CurrencyCategoryRec.cpp # src/db/rec/CurrencyCategoryRec.hpp # src/db/rec/CurrencyTypesRec.cpp # src/db/rec/CurrencyTypesRec.hpp # src/db/rec/DanceMovesRec.cpp # src/db/rec/DanceMovesRec.hpp # src/db/rec/DeathThudLookupsRec.cpp # src/db/rec/DeathThudLookupsRec.hpp # src/db/rec/DeclinedWordCasesRec.cpp # src/db/rec/DeclinedWordCasesRec.hpp # src/db/rec/DeclinedWordRec.cpp # src/db/rec/DeclinedWordRec.hpp # src/db/rec/DestructibleModelDataRec.cpp # src/db/rec/DestructibleModelDataRec.hpp # src/db/rec/DungeonEncounterRec.cpp # src/db/rec/DungeonEncounterRec.hpp # src/db/rec/DungeonMapChunkRec.cpp # src/db/rec/DungeonMapChunkRec.hpp # src/db/rec/DungeonMapRec.cpp # src/db/rec/DungeonMapRec.hpp # src/db/rec/DurabilityCostsRec.cpp # src/db/rec/DurabilityCostsRec.hpp # src/db/rec/DurabilityQualityRec.cpp # src/db/rec/DurabilityQualityRec.hpp # src/db/rec/EmotesRec.cpp # src/db/rec/EmotesRec.hpp # src/db/rec/EmotesTextDataRec.cpp # src/db/rec/EmotesTextDataRec.hpp # src/db/rec/EmotesTextRec.cpp # src/db/rec/EmotesTextRec.hpp # src/db/rec/EmotesTextSoundRec.cpp # src/db/rec/EmotesTextSoundRec.hpp # src/db/rec/EnvironmentalDamageRec.cpp # src/db/rec/EnvironmentalDamageRec.hpp # src/db/rec/ExhaustionRec.cpp # src/db/rec/ExhaustionRec.hpp # src/db/rec/FactionGroupRec.cpp # src/db/rec/FactionGroupRec.hpp # src/db/rec/FactionRec.cpp # src/db/rec/FactionRec.hpp # src/db/rec/FactionTemplateRec.cpp # src/db/rec/FactionTemplateRec.hpp # src/db/rec/FileDataRec.cpp # src/db/rec/FileDataRec.hpp # src/db/rec/FootprintTexturesRec.cpp # src/db/rec/FootprintTexturesRec.hpp # src/db/rec/FootstepTerrainLookupRec.cpp # src/db/rec/FootstepTerrainLookupRec.hpp # src/db/rec/GMSurveyAnswersRec.cpp # src/db/rec/GMSurveyAnswersRec.hpp # src/db/rec/GMSurveyCurrentSurveyRec.cpp # src/db/rec/GMSurveyCurrentSurveyRec.hpp # src/db/rec/GMSurveyQuestionsRec.cpp # src/db/rec/GMSurveyQuestionsRec.hpp # src/db/rec/GMSurveySurveysRec.cpp # src/db/rec/GMSurveySurveysRec.hpp # src/db/rec/GMTicketCategoryRec.cpp # src/db/rec/GMTicketCategoryRec.hpp # src/db/rec/GameObjectArtKitRec.cpp # src/db/rec/GameObjectArtKitRec.hpp # src/db/rec/GameObjectDisplayInfoRec.cpp # src/db/rec/GameObjectDisplayInfoRec.hpp # src/db/rec/GameTablesRec.cpp # src/db/rec/GameTablesRec.hpp # src/db/rec/GameTipsRec.cpp # src/db/rec/GameTipsRec.hpp # src/db/rec/GemPropertiesRec.cpp # src/db/rec/GemPropertiesRec.hpp # src/db/rec/GlueScreenEmoteRec.cpp # src/db/rec/GlueScreenEmoteRec.hpp # src/db/rec/GlyphPropertiesRec.cpp # src/db/rec/GlyphPropertiesRec.hpp # src/db/rec/GlyphSlotRec.cpp # src/db/rec/GlyphSlotRec.hpp # src/db/rec/GroundEffectDoodadRec.cpp # src/db/rec/GroundEffectDoodadRec.hpp # src/db/rec/GroundEffectTextureRec.cpp # src/db/rec/GroundEffectTextureRec.hpp # src/db/rec/GuildPerkSpellsRec.cpp # src/db/rec/GuildPerkSpellsRec.hpp # src/db/rec/HelmetGeosetVisDataRec.cpp # src/db/rec/HelmetGeosetVisDataRec.hpp # src/db/rec/HolidayDescriptionsRec.cpp # src/db/rec/HolidayDescriptionsRec.hpp # src/db/rec/HolidayNamesRec.cpp # src/db/rec/HolidayNamesRec.hpp # src/db/rec/HolidaysRec.cpp # src/db/rec/HolidaysRec.hpp # src/db/rec/ItemArmorQualityRec.cpp # src/db/rec/ItemArmorQualityRec.hpp # src/db/rec/ItemArmorShieldRec.cpp # src/db/rec/ItemArmorShieldRec.hpp # src/db/rec/ItemArmorTotalRec.cpp # src/db/rec/ItemArmorTotalRec.hpp # src/db/rec/ItemBagFamilyRec.cpp # src/db/rec/ItemBagFamilyRec.hpp # src/db/rec/ItemClassRec.cpp # src/db/rec/ItemClassRec.hpp # src/db/rec/ItemCondExtCostsRec.cpp # src/db/rec/ItemCondExtCostsRec.hpp # src/db/rec/ItemDamageAmmoRec.cpp # src/db/rec/ItemDamageAmmoRec.hpp # src/db/rec/ItemDamageOneHandCasterRec.cpp # src/db/rec/ItemDamageOneHandCasterRec.hpp # src/db/rec/ItemDamageOneHandRec.cpp # src/db/rec/ItemDamageOneHandRec.hpp # src/db/rec/ItemDamageRangedRec.cpp # src/db/rec/ItemDamageRangedRec.hpp # src/db/rec/ItemDamageThrownRec.cpp # src/db/rec/ItemDamageThrownRec.hpp # src/db/rec/ItemDamageTwoHandCasterRec.cpp # src/db/rec/ItemDamageTwoHandCasterRec.hpp # src/db/rec/ItemDamageTwoHandRec.cpp # src/db/rec/ItemDamageTwoHandRec.hpp # src/db/rec/ItemDamageWandRec.cpp # src/db/rec/ItemDamageWandRec.hpp # src/db/rec/ItemDisplayInfoRec.cpp # src/db/rec/ItemDisplayInfoRec.hpp # src/db/rec/ItemExtendedCostRec.cpp # src/db/rec/ItemExtendedCostRec.hpp # src/db/rec/ItemGroupSoundsRec.cpp # src/db/rec/ItemGroupSoundsRec.hpp # src/db/rec/ItemLimitCategoryRec.cpp # src/db/rec/ItemLimitCategoryRec.hpp # src/db/rec/ItemPetFoodRec.cpp # src/db/rec/ItemPetFoodRec.hpp # src/db/rec/ItemPurchaseGroupRec.cpp # src/db/rec/ItemPurchaseGroupRec.hpp # src/db/rec/ItemRandomPropertiesRec.cpp # src/db/rec/ItemRandomPropertiesRec.hpp # src/db/rec/ItemRandomSuffixRec.cpp # src/db/rec/ItemRandomSuffixRec.hpp # src/db/rec/ItemRec.cpp # src/db/rec/ItemRec.hpp # src/db/rec/ItemReforgeRec.cpp # src/db/rec/ItemReforgeRec.hpp # src/db/rec/ItemSetRec.cpp # src/db/rec/ItemSetRec.hpp # src/db/rec/ItemSubClassMaskRec.cpp # src/db/rec/ItemSubClassMaskRec.hpp # src/db/rec/ItemSubClassRec.cpp # src/db/rec/ItemSubClassRec.hpp # src/db/rec/ItemVisualEffectsRec.cpp # src/db/rec/ItemVisualEffectsRec.hpp # src/db/rec/ItemVisualsRec.cpp # src/db/rec/ItemVisualsRec.hpp # src/db/rec/LanguageWordsRec.cpp # src/db/rec/LanguageWordsRec.hpp # src/db/rec/LanguagesRec.cpp # src/db/rec/LanguagesRec.hpp # src/db/rec/LightFloatBandRec.cpp # src/db/rec/LightFloatBandRec.hpp # src/db/rec/LightIntBandRec.cpp # src/db/rec/LightIntBandRec.hpp # src/db/rec/LightParamsRec.cpp # src/db/rec/LightParamsRec.hpp # src/db/rec/LightRec.cpp # src/db/rec/LightRec.hpp # src/db/rec/LightSkyboxRec.cpp # src/db/rec/LightSkyboxRec.hpp # src/db/rec/LiquidMaterialRec.cpp # src/db/rec/LiquidMaterialRec.hpp # src/db/rec/LiquidObjectRec.cpp # src/db/rec/LiquidObjectRec.hpp # src/db/rec/LiquidTypeRec.cpp # src/db/rec/LiquidTypeRec.hpp # src/db/rec/LoadingScreenTaxiSplinesRec.cpp # src/db/rec/LoadingScreenTaxiSplinesRec.hpp # src/db/rec/LoadingScreensRec.cpp # src/db/rec/LoadingScreensRec.hpp # src/db/rec/LockRec.cpp # src/db/rec/LockRec.hpp # src/db/rec/LockTypeRec.cpp # src/db/rec/LockTypeRec.hpp # src/db/rec/MailTemplateRec.cpp # src/db/rec/MailTemplateRec.hpp # src/db/rec/MapDifficultyRec.cpp # src/db/rec/MapDifficultyRec.hpp # src/db/rec/MapRec.cpp # src/db/rec/MapRec.hpp # src/db/rec/MaterialRec.cpp # src/db/rec/MaterialRec.hpp # src/db/rec/MountTypeRec.cpp # src/db/rec/MountTypeRec.hpp # src/db/rec/MovieFileDataRec.cpp # src/db/rec/MovieFileDataRec.hpp # src/db/rec/MovieRec.cpp # src/db/rec/MovieRec.hpp # src/db/rec/MovieVariationRec.cpp # src/db/rec/MovieVariationRec.hpp # src/db/rec/NPCSoundsRec.cpp # src/db/rec/NPCSoundsRec.hpp # src/db/rec/NameGenRec.cpp # src/db/rec/NameGenRec.hpp # src/db/rec/NamesProfanityRec.cpp # src/db/rec/NamesProfanityRec.hpp # src/db/rec/NamesReservedRec.cpp # src/db/rec/NamesReservedRec.hpp # src/db/rec/ObjectEffectGroupRec.cpp # src/db/rec/ObjectEffectGroupRec.hpp # src/db/rec/ObjectEffectModifierRec.cpp # src/db/rec/ObjectEffectModifierRec.hpp # src/db/rec/ObjectEffectPackageElemRec.cpp # src/db/rec/ObjectEffectPackageElemRec.hpp # src/db/rec/ObjectEffectPackageRec.cpp # src/db/rec/ObjectEffectPackageRec.hpp # src/db/rec/ObjectEffectRec.cpp # src/db/rec/ObjectEffectRec.hpp # src/db/rec/OverrideSpellDataRec.cpp # src/db/rec/OverrideSpellDataRec.hpp # src/db/rec/PackageRec.cpp # src/db/rec/PackageRec.hpp # src/db/rec/PageTextMaterialRec.cpp # src/db/rec/PageTextMaterialRec.hpp # src/db/rec/PaperDollItemFrameRec.cpp # src/db/rec/PaperDollItemFrameRec.hpp # src/db/rec/ParticleColorRec.cpp # src/db/rec/ParticleColorRec.hpp # src/db/rec/PetPersonalityRec.cpp # src/db/rec/PetPersonalityRec.hpp # src/db/rec/PetitionTypeRec.cpp # src/db/rec/PetitionTypeRec.hpp # src/db/rec/PhaseRec.cpp # src/db/rec/PhaseRec.hpp # src/db/rec/PhaseShiftZoneSoundsRec.cpp # src/db/rec/PhaseShiftZoneSoundsRec.hpp # src/db/rec/PhaseXPhaseGroupRec.cpp # src/db/rec/PhaseXPhaseGroupRec.hpp # src/db/rec/PowerDisplayRec.cpp # src/db/rec/PowerDisplayRec.hpp # src/db/rec/QuestFactionRewardRec.cpp # src/db/rec/QuestFactionRewardRec.hpp # src/db/rec/QuestInfoRec.cpp # src/db/rec/QuestInfoRec.hpp # src/db/rec/QuestSortRec.cpp # src/db/rec/QuestSortRec.hpp # src/db/rec/QuestXPRec.cpp # src/db/rec/QuestXPRec.hpp # src/db/rec/RandPropPointsRec.cpp # src/db/rec/RandPropPointsRec.hpp # src/db/rec/ResearchBranchRec.cpp # src/db/rec/ResearchBranchRec.hpp # src/db/rec/ResistancesRec.cpp # src/db/rec/ResistancesRec.hpp # src/db/rec/ScalingStatDistributionRec.cpp # src/db/rec/ScalingStatDistributionRec.hpp # src/db/rec/ScalingStatValuesRec.cpp # src/db/rec/ScalingStatValuesRec.hpp # src/db/rec/ScreenEffectRec.cpp # src/db/rec/ScreenEffectRec.hpp # src/db/rec/ServerMessagesRec.cpp # src/db/rec/ServerMessagesRec.hpp # src/db/rec/SheatheSoundLookupsRec.cpp # src/db/rec/SheatheSoundLookupsRec.hpp # src/db/rec/SkillCostsDataRec.cpp # src/db/rec/SkillCostsDataRec.hpp # src/db/rec/SkillLineAbilityRec.cpp # src/db/rec/SkillLineAbilityRec.hpp # src/db/rec/SkillLineCategoryRec.cpp # src/db/rec/SkillLineCategoryRec.hpp # src/db/rec/SkillLineRec.cpp # src/db/rec/SkillLineRec.hpp # src/db/rec/SkillRaceClassInfoRec.cpp # src/db/rec/SkillRaceClassInfoRec.hpp # src/db/rec/SkillTiersRec.cpp # src/db/rec/SkillTiersRec.hpp # src/db/rec/SoundAmbienceRec.cpp # src/db/rec/SoundAmbienceRec.hpp # src/db/rec/SoundEmittersRec.cpp # src/db/rec/SoundEmittersRec.hpp # src/db/rec/SoundEntriesAdvancedRec.cpp # src/db/rec/SoundEntriesAdvancedRec.hpp # src/db/rec/SoundEntriesRec.cpp # src/db/rec/SoundEntriesRec.hpp # src/db/rec/SoundFilterElemRec.cpp # src/db/rec/SoundFilterElemRec.hpp # src/db/rec/SoundFilterRec.cpp # src/db/rec/SoundFilterRec.hpp # src/db/rec/SoundProviderPreferencesRec.cpp # src/db/rec/SoundProviderPreferencesRec.hpp # src/db/rec/SoundSamplePreferencesRec.cpp # src/db/rec/SoundSamplePreferencesRec.hpp # src/db/rec/SoundWaterTypeRec.cpp # src/db/rec/SoundWaterTypeRec.hpp # src/db/rec/SpamMessagesRec.cpp # src/db/rec/SpamMessagesRec.hpp # src/db/rec/SpellAuraOptionsRec.cpp # src/db/rec/SpellAuraOptionsRec.hpp # src/db/rec/SpellAuraRestrictionsRec.cpp # src/db/rec/SpellAuraRestrictionsRec.hpp # src/db/rec/SpellCastTimesRec.cpp # src/db/rec/SpellCastTimesRec.hpp # src/db/rec/SpellCastingRequirementsRec.cpp # src/db/rec/SpellCastingRequirementsRec.hpp # src/db/rec/SpellCategoriesRec.cpp # src/db/rec/SpellCategoriesRec.hpp # src/db/rec/SpellCategoryRec.cpp # src/db/rec/SpellCategoryRec.hpp # src/db/rec/SpellChainEffectsRec.cpp # src/db/rec/SpellChainEffectsRec.hpp # src/db/rec/SpellClassOptionsRec.cpp # src/db/rec/SpellClassOptionsRec.hpp # src/db/rec/SpellCooldownsRec.cpp # src/db/rec/SpellCooldownsRec.hpp # src/db/rec/SpellDescriptionVariablesRec.cpp # src/db/rec/SpellDescriptionVariablesRec.hpp # src/db/rec/SpellDifficultyRec.cpp # src/db/rec/SpellDifficultyRec.hpp # src/db/rec/SpellDispelTypeRec.cpp # src/db/rec/SpellDispelTypeRec.hpp # src/db/rec/SpellDurationRec.cpp # src/db/rec/SpellDurationRec.hpp # src/db/rec/SpellEffectCameraShakesRec.cpp # src/db/rec/SpellEffectCameraShakesRec.hpp # src/db/rec/SpellEffectRec.cpp # src/db/rec/SpellEffectRec.hpp # src/db/rec/SpellEquippedItemsRec.cpp # src/db/rec/SpellEquippedItemsRec.hpp # src/db/rec/SpellFocusObjectRec.cpp # src/db/rec/SpellFocusObjectRec.hpp # src/db/rec/SpellIconRec.cpp # src/db/rec/SpellIconRec.hpp # src/db/rec/SpellInterruptsRec.cpp # src/db/rec/SpellInterruptsRec.hpp # src/db/rec/SpellItemEnchantmentConditionRec.cpp # src/db/rec/SpellItemEnchantmentConditionRec.hpp # src/db/rec/SpellItemEnchantmentRec.cpp # src/db/rec/SpellItemEnchantmentRec.hpp # src/db/rec/SpellLevelsRec.cpp # src/db/rec/SpellLevelsRec.hpp # src/db/rec/SpellMechanicRec.cpp # src/db/rec/SpellMechanicRec.hpp # src/db/rec/SpellMissileMotionRec.cpp # src/db/rec/SpellMissileMotionRec.hpp # src/db/rec/SpellMissileRec.cpp # src/db/rec/SpellMissileRec.hpp # src/db/rec/SpellPowerRec.cpp # src/db/rec/SpellPowerRec.hpp # src/db/rec/SpellRadiusRec.cpp # src/db/rec/SpellRadiusRec.hpp # src/db/rec/SpellRangeRec.cpp # src/db/rec/SpellRangeRec.hpp # src/db/rec/SpellReagentsRec.cpp # src/db/rec/SpellReagentsRec.hpp # src/db/rec/SpellRec.cpp # src/db/rec/SpellRec.hpp # src/db/rec/SpellRuneCostRec.cpp # src/db/rec/SpellRuneCostRec.hpp # src/db/rec/SpellScalingRec.cpp # src/db/rec/SpellScalingRec.hpp # src/db/rec/SpellShapeshiftFormRec.cpp # src/db/rec/SpellShapeshiftFormRec.hpp # src/db/rec/SpellShapeshiftRec.cpp # src/db/rec/SpellShapeshiftRec.hpp # src/db/rec/SpellTargetRestrictionsRec.cpp # src/db/rec/SpellTargetRestrictionsRec.hpp # src/db/rec/SpellTotemsRec.cpp # src/db/rec/SpellTotemsRec.hpp # src/db/rec/SpellVisualEffectNameRec.cpp # src/db/rec/SpellVisualEffectNameRec.hpp # src/db/rec/SpellVisualKitAreaModelRec.cpp # src/db/rec/SpellVisualKitAreaModelRec.hpp # src/db/rec/SpellVisualKitModelAttachRec.cpp # src/db/rec/SpellVisualKitModelAttachRec.hpp # src/db/rec/SpellVisualKitRec.cpp # src/db/rec/SpellVisualKitRec.hpp # src/db/rec/SpellVisualPrecastTransitionsRec.cpp # src/db/rec/SpellVisualPrecastTransitionsRec.hpp # src/db/rec/SpellVisualRec.cpp # src/db/rec/SpellVisualRec.hpp # src/db/rec/StableSlotPricesRec.cpp # src/db/rec/StableSlotPricesRec.hpp # src/db/rec/Startup_StringsRec.cpp # src/db/rec/Startup_StringsRec.hpp # src/db/rec/StationeryRec.cpp # src/db/rec/StationeryRec.hpp # src/db/rec/StringLookupsRec.cpp # src/db/rec/StringLookupsRec.hpp # src/db/rec/SummonPropertiesRec.cpp # src/db/rec/SummonPropertiesRec.hpp # src/db/rec/TalentRec.cpp # src/db/rec/TalentRec.hpp # src/db/rec/TalentTabRec.cpp # src/db/rec/TalentTabRec.hpp # src/db/rec/TaxiNodesRec.cpp # src/db/rec/TaxiNodesRec.hpp # src/db/rec/TaxiPathNodeRec.cpp # src/db/rec/TaxiPathNodeRec.hpp # src/db/rec/TaxiPathRec.cpp # src/db/rec/TaxiPathRec.hpp # src/db/rec/TeamContributionPointsRec.cpp # src/db/rec/TeamContributionPointsRec.hpp # src/db/rec/TerrainMaterialRec.cpp # src/db/rec/TerrainMaterialRec.hpp # src/db/rec/TerrainTypeRec.cpp # src/db/rec/TerrainTypeRec.hpp # src/db/rec/TerrainTypeSoundsRec.cpp # src/db/rec/TerrainTypeSoundsRec.hpp # src/db/rec/TotemCategoryRec.cpp # src/db/rec/TotemCategoryRec.hpp # src/db/rec/TransportAnimationRec.cpp # src/db/rec/TransportAnimationRec.hpp # src/db/rec/TransportPhysicsRec.cpp # src/db/rec/TransportPhysicsRec.hpp # src/db/rec/TransportRotationRec.cpp # src/db/rec/TransportRotationRec.hpp # src/db/rec/UISoundLookupsRec.cpp # src/db/rec/UISoundLookupsRec.hpp # src/db/rec/UnitBloodLevelsRec.cpp # src/db/rec/UnitBloodLevelsRec.hpp # src/db/rec/UnitBloodRec.cpp # src/db/rec/UnitBloodRec.hpp # src/db/rec/VehicleRec.cpp # src/db/rec/VehicleRec.hpp # src/db/rec/VehicleSeatRec.cpp # src/db/rec/VehicleSeatRec.hpp # src/db/rec/VehicleUIIndSeatRec.cpp # src/db/rec/VehicleUIIndSeatRec.hpp # src/db/rec/VehicleUIIndicatorRec.cpp # src/db/rec/VehicleUIIndicatorRec.hpp # src/db/rec/VideoHardwareRec.cpp # src/db/rec/VideoHardwareRec.hpp # src/db/rec/VocalUISoundsRec.cpp # src/db/rec/VocalUISoundsRec.hpp # src/db/rec/WMOAreaTableRec.cpp # src/db/rec/WMOAreaTableRec.hpp # src/db/rec/WeaponImpactSoundsRec.cpp # src/db/rec/WeaponImpactSoundsRec.hpp # src/db/rec/WeaponSwingSounds2Rec.cpp # src/db/rec/WeaponSwingSounds2Rec.hpp # src/db/rec/WeatherRec.cpp # src/db/rec/WeatherRec.hpp # src/db/rec/WorldChunkSoundsRec.cpp # src/db/rec/WorldChunkSoundsRec.hpp # src/db/rec/WorldMapAreaRec.cpp # src/db/rec/WorldMapAreaRec.hpp # src/db/rec/WorldMapContinentRec.cpp # src/db/rec/WorldMapContinentRec.hpp # src/db/rec/WorldMapOverlayRec.cpp # src/db/rec/WorldMapOverlayRec.hpp # src/db/rec/WorldMapTransformsRec.cpp # src/db/rec/WorldMapTransformsRec.hpp # src/db/rec/WorldSafeLocsRec.cpp # src/db/rec/WorldSafeLocsRec.hpp # src/db/rec/WorldStateUIRec.cpp # src/db/rec/WorldStateUIRec.hpp # src/db/rec/WorldStateZoneSoundsRec.cpp # src/db/rec/WorldStateZoneSoundsRec.hpp # src/db/rec/WowError_StringsRec.cpp # src/db/rec/WowError_StringsRec.hpp # src/db/rec/ZoneIntroMusicTableRec.cpp # src/db/rec/ZoneIntroMusicTableRec.hpp # src/db/rec/ZoneLightPointRec.cpp # src/db/rec/ZoneLightPointRec.hpp # src/db/rec/ZoneLightRec.cpp # src/db/rec/ZoneLightRec.hpp # src/db/rec/ZoneMusicRec.cpp # src/db/rec/ZoneMusicRec.hpp # src/db/rec/gtBarberShopCostBaseRec.cpp # src/db/rec/gtBarberShopCostBaseRec.hpp # src/db/rec/gtChanceToMeleeCritBaseRec.cpp # src/db/rec/gtChanceToMeleeCritBaseRec.hpp # src/db/rec/gtChanceToMeleeCritRec.cpp # src/db/rec/gtChanceToMeleeCritRec.hpp # src/db/rec/gtChanceToSpellCritBaseRec.cpp # src/db/rec/gtChanceToSpellCritBaseRec.hpp # src/db/rec/gtChanceToSpellCritRec.cpp # src/db/rec/gtChanceToSpellCritRec.hpp # src/db/rec/gtCombatRatingsRec.cpp # src/db/rec/gtCombatRatingsRec.hpp # src/db/rec/gtNPCManaCostScalerRec.cpp # src/db/rec/gtNPCManaCostScalerRec.hpp # src/db/rec/gtOCTClassCombatRatingScalarRec.cpp # src/db/rec/gtOCTClassCombatRatingScalarRec.hpp # src/db/rec/gtOCTRegenHPRec.cpp # src/db/rec/gtOCTRegenHPRec.hpp # src/db/rec/gtOCTRegenMPRec.cpp # src/db/rec/gtOCTRegenMPRec.hpp # src/db/rec/gtRegenHPPerSptRec.cpp # src/db/rec/gtRegenHPPerSptRec.hpp # src/db/rec/gtRegenMPPerSptRec.cpp # src/db/rec/gtRegenMPPerSptRec.hpp # src/db/rec/gtSpellScalingRec.cpp # src/db/rec/gtSpellScalingRec.hpp # src/gx/CGxDevice.cpp # src/gx/Device.cpp # src/gx/Device.hpp # src/gx/d3d/CGxDeviceD3d.cpp # src/ui/FrameScript.cpp
812 lines
20 KiB
C++
812 lines
20 KiB
C++
#include "client/Client.hpp"
|
|
#include "async/AsyncFile.hpp"
|
|
#include "client/ClientServices.hpp"
|
|
#include "client/CmdLine.hpp"
|
|
#include "client/ClientHandlers.hpp"
|
|
#include "console/CVar.hpp"
|
|
#include "console/Client.hpp"
|
|
#include "console/Device.hpp"
|
|
#include "console/Screen.hpp"
|
|
#include "console/Command.hpp"
|
|
#include "console/Console.hpp"
|
|
#include "db/Db.hpp"
|
|
#include "db/Startup_Strings.hpp"
|
|
#include "glue/CGlueMgr.hpp"
|
|
#include "gameui/CGGameUI.hpp"
|
|
#include "gx/Screen.hpp"
|
|
#include "gx/Texture.hpp"
|
|
#include "model/Model2.hpp"
|
|
#include "net/Poll.hpp"
|
|
#include "ui/FrameScript.hpp"
|
|
#include "ui/FrameXML.hpp"
|
|
#include "world/World.hpp"
|
|
#include "util/Filesystem.hpp"
|
|
#include <bc/Debug.hpp>
|
|
#include <common/Prop.hpp>
|
|
#include <common/Time.hpp>
|
|
#include <common/Processor.hpp>
|
|
#include <storm/Error.hpp>
|
|
#include <storm/Log.hpp>
|
|
#include <storm/Registry.hpp>
|
|
#include <storm/Option.hpp>
|
|
#include <bc/os/Path.hpp>
|
|
#include <bc/File.hpp>
|
|
#include <cstdio>
|
|
|
|
CVar* Client::g_accountNameVar;
|
|
CVar* Client::g_accountListVar;
|
|
CVar* Client::g_accountUsesTokenVar;
|
|
CVar* Client::g_movieVar;
|
|
CVar* Client::g_expansionMovieVar;
|
|
CVar* Client::g_movieSubtitleVar;
|
|
CVar* Client::g_lastCharacterIndex;
|
|
|
|
|
|
HEVENTCONTEXT Client::g_clientEventContext;
|
|
char Client::g_currentLocaleName[5] = {};
|
|
|
|
|
|
static uint8_t s_expansionLevel;
|
|
static bool g_hasIsoLocale[12];
|
|
static const char* s_localeArray[12] = {
|
|
"deDE", "enGB", "enUS", "esES", "frFR", "koKR",
|
|
"zhCN", "zhTW", "enCN", "enTW", "esMX", "ruRU"
|
|
};
|
|
|
|
static int32_t s_timeTestError;
|
|
|
|
int32_t CCommand_ReloadUI(const char*, const char*) {
|
|
CGlueMgr::m_reload = 1;
|
|
// CGGameUI::Reload();
|
|
return 1;
|
|
}
|
|
|
|
int32_t CCommand_Perf(const char*, const char*) {
|
|
return 1;
|
|
}
|
|
|
|
#if defined(WHOA_SYSTEM_WIN)
|
|
|
|
int32_t CCommand_TimingInfo(const char* command, const char* arguments) {
|
|
auto desiredTimingMethod = static_cast<TimingMethod>(CVar::LookupRegistered("timingMethod")->GetInt());
|
|
auto timingTestError = CVar::LookupRegistered("timingTestError")->GetInt();
|
|
auto selectedTimingMethod = OsTimeGetTimingMethod();
|
|
|
|
ConsolePrintf("Timing method desired: %d - %s", desiredTimingMethod, OsTimeGetTimingMethodName(desiredTimingMethod));
|
|
ConsolePrintf("Timing method selected: %d - %s", selectedTimingMethod, OsTimeGetTimingMethodName(selectedTimingMethod));
|
|
|
|
ConsolePrintf("Timing test error: %d", timingTestError);
|
|
return 1;
|
|
}
|
|
|
|
#endif
|
|
|
|
void AsyncFileInitialize() {
|
|
// TODO
|
|
AsyncFileReadInitialize(0, 100);
|
|
}
|
|
|
|
void BaseInitializeGlobal() {
|
|
PropInitialize();
|
|
}
|
|
|
|
void ClientMiscInitialize() {
|
|
// TODO
|
|
}
|
|
|
|
void ClientRegisterConsoleCommands() {
|
|
ConsoleCommandRegister("reloadUI", CCommand_ReloadUI, GRAPHICS, nullptr);
|
|
ConsoleCommandRegister("perf", CCommand_Perf, DEBUG, nullptr);
|
|
|
|
Client::g_accountNameVar = CVar::Register(
|
|
"accountName",
|
|
"Saved account name",
|
|
64,
|
|
"",
|
|
nullptr,
|
|
GAME,
|
|
false,
|
|
nullptr,
|
|
false
|
|
);
|
|
|
|
Client::g_accountListVar = CVar::Register(
|
|
"accountList",
|
|
"List of wow accounts for saved Blizzard account",
|
|
0,
|
|
"",
|
|
nullptr,
|
|
GAME,
|
|
false,
|
|
nullptr,
|
|
false
|
|
);
|
|
|
|
Client::g_accountUsesTokenVar = CVar::Register(
|
|
"g_accountUsesToken",
|
|
"Saved whether uses authenticator",
|
|
0,
|
|
"0",
|
|
nullptr,
|
|
GAME,
|
|
false,
|
|
nullptr,
|
|
false
|
|
);
|
|
|
|
Client::g_movieVar = CVar::Register(
|
|
"movie",
|
|
"Show movie on startup",
|
|
0,
|
|
"1",
|
|
nullptr,
|
|
GAME,
|
|
false,
|
|
nullptr,
|
|
false
|
|
);
|
|
|
|
Client::g_expansionMovieVar = CVar::Register(
|
|
"expansionMovie",
|
|
"Show expansion movie on startup",
|
|
0,
|
|
"1",
|
|
nullptr,
|
|
GAME,
|
|
false,
|
|
nullptr,
|
|
false
|
|
);
|
|
Client::g_movieSubtitleVar = CVar::Register(
|
|
"movieSubtitle",
|
|
"Show movie subtitles",
|
|
0,
|
|
"0",
|
|
nullptr,
|
|
GAME,
|
|
false,
|
|
nullptr,
|
|
false
|
|
);
|
|
|
|
Client::g_lastCharacterIndex = CVar::Register(
|
|
"lastCharacterIndex",
|
|
"Last character selected",
|
|
0,
|
|
"0",
|
|
nullptr,
|
|
GAME,
|
|
false,
|
|
nullptr,
|
|
false);
|
|
// TODO
|
|
}
|
|
|
|
void ClientPostClose(int32_t a1) {
|
|
// TODO s_finalDialog = a1;
|
|
EventPostCloseEx(nullptr);
|
|
}
|
|
|
|
int32_t DestroyEngineCallback(const void* a1, void* a2) {
|
|
// TODO
|
|
return 1;
|
|
}
|
|
|
|
int32_t InitializeEngineCallback(const void* a1, void* a2) {
|
|
// TODO
|
|
// sub_4D2A30();
|
|
|
|
AsyncFileInitialize();
|
|
TextureInitialize();
|
|
|
|
// ModelBlobLoad("world\\model.blob");
|
|
|
|
// if (SFile::IsStreamingMode()) {
|
|
// TextureLoadBlob("world\\liquid.tex");
|
|
// }
|
|
|
|
ScrnInitialize(0);
|
|
ConsoleScreenInitialize(nullptr); // TODO argument
|
|
|
|
// s_cvarTextureFilteringMode = CVar::Register(
|
|
// "textureFilteringMode",
|
|
// "Texture filtering mode",
|
|
// 1,
|
|
// "1",
|
|
// &TextureFilteringCallback,
|
|
// 1,
|
|
// 0,
|
|
// 0,
|
|
// 0
|
|
// );
|
|
|
|
// s_cvarUIFaster = CVar::Register(
|
|
// "UIFaster",
|
|
// "UI acceleration option",
|
|
// 0,
|
|
// "3",
|
|
// &UIFasterCalllback,
|
|
// 1,
|
|
// 0,
|
|
// 0,
|
|
// 0
|
|
// );
|
|
|
|
// s_cvarTextureCacheSize = CVar::Register(
|
|
// "textureCacheSize",
|
|
// "Texture cache size in bytes",
|
|
// 1,
|
|
// "32",
|
|
// &TextureCacheSizeCallback,
|
|
// 1,
|
|
// 0,
|
|
// 0,
|
|
// 0
|
|
// );
|
|
|
|
// sub_4B6580(*(_DWORD *)(dword_B2F9FC + 48) << 20);
|
|
|
|
// AddConsoleDeviceDefaultCallback(SetDefaults);
|
|
|
|
// if (ConsoleDeviceHardwareChanged()) {
|
|
// v3 = 0;
|
|
|
|
// do {
|
|
// SetDefaults(v3++);
|
|
// } while (v3 < 3);
|
|
// }
|
|
|
|
auto m2Flags = M2RegisterCVars();
|
|
M2Initialize(m2Flags, 0);
|
|
|
|
// v4 = *(_DWORD *)(dword_B2FA00 + 48);
|
|
// sub_4B61C0(dword_AB6128[v4]);
|
|
// sub_4B6230(dword_AB6140[v4]);
|
|
|
|
WowClientInit();
|
|
|
|
return 1;
|
|
}
|
|
|
|
uint8_t GetExpansionLevel() {
|
|
return s_expansionLevel;
|
|
}
|
|
|
|
const char* UpdateInstallLocation() {
|
|
// TODO
|
|
return nullptr;
|
|
}
|
|
|
|
bool UpdateInstallLocationForName(int32_t a1, size_t size, const char* filename, char* buffer, const char* locale) {
|
|
if (a1 == 2) {
|
|
auto location = UpdateInstallLocation();
|
|
if (!location) {
|
|
return false;
|
|
}
|
|
SStrPrintf(buffer, size, "%s%s%s", location, "Data\\", filename);
|
|
} else {
|
|
SStrPrintf(buffer, size, "%s%s", "Data\\", filename);
|
|
}
|
|
for (auto i = SStrStr(buffer, "****"); i; i = SStrStr(buffer, "****")) {
|
|
size_t offset = static_cast<size_t>(i - buffer);
|
|
memcpy(&buffer[offset], locale, 4);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
void SetPaths() {
|
|
// SFile::DisableSFileCheckDisk();
|
|
// SFile::EnableDirectAccess(0);
|
|
|
|
char buffer[STORM_MAX_PATH] = {0};
|
|
|
|
const char* datadir = CmdLineGetString(CMD_DATA_DIR);
|
|
if (*datadir == '\0') {
|
|
OsGetExePath(buffer, STORM_MAX_PATH);
|
|
datadir = buffer;
|
|
}
|
|
|
|
SLogSetDefaultDirectory(datadir);
|
|
SFile::SetBasePath(datadir);
|
|
SFile::SetDataPath("Data\\");
|
|
|
|
OsSetCurrentDirectory(datadir);
|
|
}
|
|
|
|
bool IsCommonMpqExists() {
|
|
char path1[1024];
|
|
SStrPrintf(path1, sizeof(path1), "%s%s", "Data\\", "common.MPQ");
|
|
for (auto i = SStrStr(path1, "****"); i; i = SStrStr(path1, "****")) {
|
|
size_t offset = static_cast<size_t>(i - path1);
|
|
memcpy(&path1[offset], "----", 4);
|
|
}
|
|
|
|
char path2[1024];
|
|
SStrPrintf(path2, sizeof(path2), "%s%s", "..\\Data\\", "common.MPQ");
|
|
for (auto i = SStrStr(path2, "****"); i; i = SStrStr(path2, "****")) {
|
|
size_t offset = static_cast<size_t>(i - path2);
|
|
memcpy(&path2[offset], "----", 4);
|
|
}
|
|
|
|
auto location = UpdateInstallLocation();
|
|
if (location) {
|
|
char path3[1024];
|
|
SStrPrintf(path3, sizeof(path3), "%s%s%s", location, "Data\\", "common.MPQ");
|
|
for (auto i = SStrStr(path3, "****"); i; i = SStrStr(path3, "****")) {
|
|
size_t offset = static_cast<size_t>(i - path3);
|
|
memcpy(&path3[offset], "----", 4);
|
|
}
|
|
|
|
if (!Blizzard::File::Exists(path1) && !Blizzard::File::Exists(path2)) {
|
|
return Blizzard::File::Exists(path3);
|
|
}
|
|
} else if (!Blizzard::File::Exists(path1)) {
|
|
return Blizzard::File::Exists(path2);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
size_t GetLocaleIndex(const char* locale) {
|
|
for (size_t i = 0; i < 12; ++i) {
|
|
if (SStrCmpI(locale, s_localeArray[i], 4) == 0) {
|
|
return i;
|
|
}
|
|
}
|
|
return 2; // s_localeArray[2] == "enUS"
|
|
}
|
|
|
|
void CheckAvailableLocales(char* locale) {
|
|
if (!IsCommonMpqExists()) {
|
|
return;
|
|
}
|
|
|
|
for (size_t localeIndex = 0; localeIndex < 12; ++localeIndex) {
|
|
g_hasIsoLocale[localeIndex] = false;
|
|
|
|
const char* filename = "****\\locale-****.MPQ";
|
|
|
|
char path[1024];
|
|
SStrPrintf(path, sizeof(path), "%s%s", "Data\\", filename);
|
|
for (auto i = SStrStr(path, "****"); i; i = SStrStr(path, "****")) {
|
|
size_t offset = static_cast<size_t>(i - path);
|
|
memcpy(&path[offset], s_localeArray[localeIndex], 4);
|
|
}
|
|
|
|
if (Blizzard::File::Exists(path)) {
|
|
g_hasIsoLocale[localeIndex] = true;
|
|
continue;
|
|
}
|
|
|
|
SStrPrintf(path, sizeof(path), "%s%s", "..\\Data\\", filename);
|
|
for (auto i = SStrStr(path, "****"); i; i = SStrStr(path, "****")) {
|
|
size_t offset = static_cast<size_t>(i - path);
|
|
memcpy(&path[offset], s_localeArray[localeIndex], 4);
|
|
}
|
|
|
|
if (Blizzard::File::Exists(path)) {
|
|
g_hasIsoLocale[localeIndex] = true;
|
|
continue;
|
|
}
|
|
|
|
if (UpdateInstallLocationForName(2, sizeof(path), filename, path, s_localeArray[localeIndex]) &&
|
|
Blizzard::File::Exists(path)) {
|
|
g_hasIsoLocale[localeIndex] = true;
|
|
}
|
|
}
|
|
|
|
size_t localeIndex = GetLocaleIndex(locale);
|
|
for (size_t i = 0; i < 12; ++i) {
|
|
if (g_hasIsoLocale[localeIndex]) {
|
|
break;
|
|
}
|
|
localeIndex = (localeIndex + 1) % 12;
|
|
}
|
|
SStrCopy(locale, s_localeArray[localeIndex], STORM_MAX_STR);
|
|
}
|
|
|
|
bool LocaleChangedCallback(CVar*, const char*, const char* value, void*) {
|
|
SStrCopy(Client::g_currentLocaleName, value, sizeof(Client::g_currentLocaleName));
|
|
return true;
|
|
}
|
|
|
|
#if defined(WHOA_SYSTEM_WIN)
|
|
|
|
bool TimingMethodCallback(CVar* h, const char* oldValue, const char* newValue, void* param) {
|
|
auto cv = static_cast<CVar*>(param);
|
|
auto newMethod = static_cast<TimingMethod>(atol(newValue));
|
|
if (newMethod < TimingMethods) {
|
|
if (oldValue) {
|
|
auto oldMethod = static_cast<TimingMethod>(atol(oldValue));
|
|
if ((newMethod != oldMethod) && cv->GetInt()) {
|
|
cv->SetReadOnly(false);
|
|
cv->Set("0", true, false, false, true);
|
|
cv->SetReadOnly(true);
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
ConsolePrintf("\'%s\' is not a valid timing method. Valid methods are:", newValue);
|
|
auto method = Timing_BestAvailable;
|
|
while (method < TimingMethods) {
|
|
ConsolePrintf(" %d - %s", method, OsTimeGetTimingMethodName(method));
|
|
method = static_cast<TimingMethod>(static_cast<int32_t>(method) + 1);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
#endif
|
|
|
|
int32_t InitializeGlobal() {
|
|
ProcessCommandLine();
|
|
SetPaths();
|
|
|
|
// TODO:
|
|
// WowConfigureFileSystem::ReadBuildKeyFromFile("WoW.mfil");
|
|
|
|
// if (dword_B2FA10 != 2) {
|
|
// sub_403560();
|
|
// }
|
|
|
|
// LOBYTE(v24) = 0;
|
|
|
|
// if (sub_422140()) {
|
|
// LOBYTE(v24) = OsDirectoryExists((int)"WTF/Account") == 0;
|
|
// }
|
|
|
|
ClientServices::LoadCDKey();
|
|
|
|
ConsoleInitializeClientCommand();
|
|
ConsoleInitializeClientCVar("Config.wtf");
|
|
// TODO: CVar::ArchiveCodeRegisteredOnly();
|
|
|
|
// v18 = 0;
|
|
// v19 = 0;
|
|
// ptr = 0;
|
|
// v21 = 0;
|
|
|
|
// ::ForEveryRunOnceWTF::Execute(&v18, &CVar::Load);
|
|
|
|
// if (ptr) {
|
|
// SMemFree(ptr, a_pad, -2, 0);
|
|
// }
|
|
|
|
CVar::Register(
|
|
"dbCompress",
|
|
"Database compression",
|
|
0,
|
|
"-1",
|
|
nullptr,
|
|
CATEGORY::DEFAULT,
|
|
false,
|
|
nullptr,
|
|
false
|
|
);
|
|
|
|
CVar* locale = CVar::Register(
|
|
"locale",
|
|
"Set the game locale",
|
|
0,
|
|
"****",
|
|
&LocaleChangedCallback,
|
|
CATEGORY::DEFAULT,
|
|
false,
|
|
nullptr,
|
|
false
|
|
);
|
|
|
|
if (!SStrCmp(locale->GetString(), "****", STORM_MAX_STR)) {
|
|
locale->Set("enUS", true, false, false, true);
|
|
}
|
|
|
|
CVar::Register(
|
|
"useEnglishAudio",
|
|
"override the locale and use English audio",
|
|
0,
|
|
"0",
|
|
nullptr,
|
|
CATEGORY::DEFAULT,
|
|
false,
|
|
nullptr,
|
|
false
|
|
);
|
|
|
|
// TODO: SFile::IsTrial() check
|
|
// if (sub_422140()) {
|
|
// sub_4036B0(v24, 0, a2, (int)v2, (char)v24);
|
|
// }
|
|
|
|
char existingLocale[5] = {};
|
|
SStrCopy(existingLocale, locale->GetString(), sizeof(existingLocale));
|
|
CheckAvailableLocales(existingLocale);
|
|
locale->Set(existingLocale, true, false, false, true);
|
|
|
|
char path[STORM_MAX_PATH];
|
|
SStrPrintf(path, sizeof(path), "%s%s", "Data\\", locale->GetString());
|
|
SFile::SetDataPathAlternate(path);
|
|
SFile::RebuildHash();
|
|
|
|
|
|
OpenArchives();
|
|
|
|
// TODO: This method should be placed inside OpenArchives
|
|
ClientServices::InitLoginServerCVars(1, locale->GetString());
|
|
|
|
// sub_405DD0();
|
|
|
|
// CVar* v3 = CVar::Register(
|
|
// "processAffinityMask",
|
|
// "Sets which core(s) WoW may execute on - changes require restart to take effect",
|
|
// 2,
|
|
// "0",
|
|
// &sub_4022E0,
|
|
// 0,
|
|
// 0,
|
|
// 0,
|
|
// 0
|
|
// );
|
|
|
|
// CVar* v4 = CVar::Lookup("videoOptionsVersion");
|
|
|
|
// if (!v4 || v4->m_intValue < 3) {
|
|
// SStrPrintf(v23, 8, "%u", 0);
|
|
// CVar::Set(v3, v23, 1, 0, 0, 1);
|
|
// CVar::Update((int)v3);
|
|
// }
|
|
|
|
// v5 = v3->m_intValue;
|
|
|
|
// if (v5) {
|
|
// SSetCurrentProcessAffinityMask(v5);
|
|
// }
|
|
|
|
BaseInitializeGlobal();
|
|
|
|
EventInitialize(1, 0);
|
|
|
|
#if defined(WHOA_SYSTEM_WIN)
|
|
|
|
auto cvTimingTestError = CVar::Register(
|
|
"timingTestError",
|
|
"Error reported by the timing validation system",
|
|
0x2 | 0x4,
|
|
"0",
|
|
0,
|
|
DEFAULT,
|
|
false,
|
|
nullptr,
|
|
false
|
|
);
|
|
auto cvTimingMethod = CVar::Register(
|
|
"timingMethod",
|
|
"Desired method for game timing",
|
|
0x2,
|
|
"0",
|
|
TimingMethodCallback,
|
|
DEFAULT,
|
|
false,
|
|
cvTimingTestError,
|
|
false
|
|
);
|
|
OsTimeStartup(static_cast<TimingMethod>(cvTimingMethod->GetInt()));
|
|
ConsoleCommandRegister("timingInfo", CCommand_TimingInfo, DEBUG, nullptr);
|
|
s_timeTestError = OsTimeGetTestError();
|
|
if (s_timeTestError != cvTimingTestError->GetInt()) {
|
|
char value[16];
|
|
sprintf(value, "%d", s_timeTestError);
|
|
cvTimingTestError->SetReadOnly(false);
|
|
cvTimingTestError->Set(value, true, false, false, true);
|
|
cvTimingTestError->Update();
|
|
cvTimingTestError->SetReadOnly(true);
|
|
ConsolePrintf("Timing test error: %d", s_timeTestError);
|
|
}
|
|
|
|
#else
|
|
|
|
OsTimeStartup(Timing_BestAvailable);
|
|
|
|
#endif
|
|
|
|
g_Startup_StringsDB.Load(__FILE__, __LINE__);
|
|
|
|
auto titleRecord = g_Startup_StringsDB.GetRecord(MSG_TITLE_WOW);
|
|
auto title = titleRecord ? titleRecord->m_message : "World of Warcraft";
|
|
char v15[260];
|
|
SStrCopy(v15, title, 0x7FFFFFFF);
|
|
|
|
ConsoleDeviceInitialize(v15);
|
|
|
|
// OsIMEInitialize();
|
|
|
|
// uint32_t v13 = OsGetAsyncTimeMs();
|
|
// g_rndSeed.SetSeed(v13);
|
|
|
|
Client::g_clientEventContext = EventCreateContextEx(
|
|
1,
|
|
&InitializeEngineCallback,
|
|
&DestroyEngineCallback,
|
|
0,
|
|
0
|
|
);
|
|
|
|
return 1;
|
|
}
|
|
|
|
void DestroyGlobal() {
|
|
// TODO
|
|
|
|
OsTimeShutdown();
|
|
EventDestroy();
|
|
ConsoleDeviceDestroy();
|
|
CVar::Destroy();
|
|
|
|
// TODO
|
|
}
|
|
|
|
void StormDestroy() {
|
|
// TODO
|
|
|
|
SRegDestroy();
|
|
}
|
|
|
|
void CommonMain() {
|
|
StormInitialize();
|
|
|
|
// TODO:
|
|
// SErrCatchUnhandledExceptions();
|
|
// OsSystemInitialize("Blizzard Entertainment World of Warcraft", 0);
|
|
int32_t option = 1;
|
|
StormSetOption(10, &option, sizeof(option));
|
|
StormSetOption(11, &option, sizeof(option));
|
|
|
|
// QoL: enable debug logs
|
|
#if !defined(NDEBUG)
|
|
option = 1;
|
|
StormSetOption(5, &option, sizeof(option));
|
|
#endif
|
|
|
|
OsSystemEnableCpuLog();
|
|
|
|
// SetPaths() moved into InitializeGlobal()
|
|
|
|
uint32_t sendErrorLogs = 1;
|
|
if (!SRegLoadValue("World of Warcraft\\Client", "SendErrorLogs", 0, &sendErrorLogs)) {
|
|
sendErrorLogs = 1;
|
|
SRegSaveValue("World of Warcraft\\Client", "SendErrorLogs", 0, sendErrorLogs);
|
|
}
|
|
|
|
// SErrSetLogTitleString("World of WarCraft (build 12340)");
|
|
// SErrSetLogTitleCallback(WowLogHeader);
|
|
// if (sendErrorLogs) {
|
|
// SErrRegisterHandler(SendErrorLog);
|
|
// }
|
|
|
|
if (InitializeGlobal()) {
|
|
EventDoMessageLoop();
|
|
DestroyGlobal();
|
|
}
|
|
|
|
StormDestroy();
|
|
|
|
// TODO:
|
|
// Misc Cleanup
|
|
}
|
|
|
|
void BlizzardAssertCallback(const char* a1, const char* a2, const char* a3, uint32_t a4) {
|
|
if (*a2) {
|
|
SErrDisplayError(0, a3, a4, a2, 0, 1, 0x11111111);
|
|
} else {
|
|
SErrDisplayError(0, a3, a4, a1, 0, 1, 0x11111111);
|
|
}
|
|
}
|
|
|
|
void StormInitialize() {
|
|
// TODO
|
|
// SStrInitialize();
|
|
// SErrInitialize();
|
|
SLogInitialize();
|
|
// SFile::Initialize();
|
|
|
|
Blizzard::Debug::SetAssertHandler(BlizzardAssertCallback);
|
|
}
|
|
|
|
void WowClientInit() {
|
|
// TODO
|
|
// EventRegister(EVENT_ID_5, (int)sub_4020E0);
|
|
// _cfltcvt_init_0();
|
|
|
|
ClientMiscInitialize();
|
|
|
|
ClientRegisterConsoleCommands();
|
|
|
|
ClientDBInitialize();
|
|
|
|
// LoadingScreenInitialize();
|
|
|
|
FrameScript_Initialize(0);
|
|
|
|
// TODO
|
|
// SI2::Init(0);
|
|
// sub_6F66B0();
|
|
|
|
FrameXML_RegisterDefault();
|
|
GlueScriptEventsInitialize();
|
|
ScriptEventsInitialize();
|
|
|
|
// TODO
|
|
// sub_6F75E0();
|
|
// sub_401FF0();
|
|
|
|
ClientServices::Initialize();
|
|
// TODO ClientServices::SetMessageHandler(SMSG_TUTORIAL_FLAGS, (int)sub_530920, 0);
|
|
|
|
// TODO
|
|
// v2 = CVar::Lookup("EnableVoiceChat");
|
|
// if (v2 && *(_DWORD *)(v2 + 48)) {
|
|
// ComSatClient_Init();
|
|
// }
|
|
|
|
// TODO
|
|
// DBCache_RegisterHandlers();
|
|
// DBCache_Initialize(a1);
|
|
|
|
// TODO
|
|
// sub_78E400();
|
|
|
|
CWorld::Initialize();
|
|
|
|
// TODO
|
|
// ShadowInit();
|
|
// GxuLightInitialize();
|
|
// GxuLightBucketSizeSet(16.665001);
|
|
// InputControlInitialize();
|
|
|
|
CGlueMgr::Initialize();
|
|
|
|
// TODO
|
|
// if (GetConsoleMessage()) {
|
|
// v3 = (const char *)GetConsoleMessage();
|
|
// CGlueMgr::AddChangedOptionWarning(v3);
|
|
// SetConsoleMessage(0);
|
|
// }
|
|
|
|
// TODO
|
|
// if (sub_422140()) {
|
|
// sub_421630();
|
|
// }
|
|
|
|
if (s_expansionLevel != 1) {
|
|
if (Client::g_movieVar->GetInt()) {
|
|
Client::g_movieVar->Set("0", true, false, false, true);
|
|
CGlueMgr::SetScreen("movie");
|
|
} else {
|
|
CGlueMgr::SetScreen("login");
|
|
}
|
|
} else {
|
|
if (Client::g_expansionMovieVar->GetInt()) {
|
|
Client::g_expansionMovieVar->Set("0", true, false, false, true);
|
|
Client::g_movieVar->Set("0", true, false, false, true);
|
|
CGlueMgr::SetScreen("movie");
|
|
} else {
|
|
CGlueMgr::SetScreen("login");
|
|
}
|
|
}
|
|
|
|
// TODO
|
|
// CGlueMgr::m_pendingTimerAlert = dword_B2F9D8;
|
|
// sub_7FC5A0();
|
|
|
|
EventRegister(EVENT_ID_POLL, &PollNet);
|
|
}
|
|
|
|
void ClientInitializeGame(int32_t continentID, const C3Vector& position) {
|
|
// TODO
|
|
CGGameUI::InitializeGame();
|
|
|
|
ClientServices::SetMessageHandler(SMSG_NEW_WORLD, &NewWorldHandler, nullptr);
|
|
ClientServices::SetMessageHandler(SMSG_LOGIN_VERIFY_WORLD, &LoginVerifyWorldHandler, nullptr);
|
|
|
|
// TODO
|
|
}
|