diff --git a/Source/Game/AI/SmartScripts/SmartScript.cs b/Source/Game/AI/SmartScripts/SmartScript.cs index 8c792ae3f..1955b1161 100644 --- a/Source/Game/AI/SmartScripts/SmartScript.cs +++ b/Source/Game/AI/SmartScripts/SmartScript.cs @@ -938,11 +938,11 @@ namespace Game.AI Creature creature = target.ToCreature(); if (creature != null) { - SmartAI smartAI = (SmartAI)creature.GetAI(); - if (smartAI != null) + CreatureAI smartAI = creature.GetAI(); + if (smartAI != null && smartAI is SmartAI) { - smartAI.SetDespawnTime(respawnDelay); - smartAI.StartDespawn(); + ((SmartAI)smartAI).SetDespawnTime(respawnDelay); + ((SmartAI)smartAI).StartDespawn(); } else creature.DespawnOrUnsummon(respawnDelay); diff --git a/Source/Game/Collision/Maps/MapTree.cs b/Source/Game/Collision/Maps/MapTree.cs index f9cfa3548..0b64ed2f3 100644 --- a/Source/Game/Collision/Maps/MapTree.cs +++ b/Source/Game/Collision/Maps/MapTree.cs @@ -114,79 +114,84 @@ namespace Game.Collision return LoadResult.ReadFromFileFailed; } + LoadResult result = LoadResult.FileNotFound; + TileFileOpenResult fileResult = OpenMapTileFile(VMapManager.VMapPath, iMapID, tileX, tileY, vm); if (fileResult.File != null) { + result = LoadResult.Success; using (BinaryReader reader = new BinaryReader(fileResult.File)) { if (reader.ReadStringFromChars(8) != MapConst.VMapMagic) - return LoadResult.VersionMismatch; + result = LoadResult.VersionMismatch; - uint numSpawns = reader.ReadUInt32(); - for (uint i = 0; i < numSpawns; ++i) + if (result == LoadResult.Success) { - // read model spawns - if (ModelSpawn.ReadFromFile(reader, out ModelSpawn spawn)) + uint numSpawns = reader.ReadUInt32(); + for (uint i = 0; i < numSpawns && result == LoadResult.Success; ++i) { - // acquire model instance - WorldModel model = vm.AcquireModelInstance(spawn.name, spawn.flags); - if (model == null) - Log.outError(LogFilter.Server, "StaticMapTree.LoadMapTile() : could not acquire WorldModel [{0}, {1}]", tileX, tileY); - - // update tree - if (iSpawnIndices.ContainsKey(spawn.Id)) + // read model spawns + if (ModelSpawn.ReadFromFile(reader, out ModelSpawn spawn)) { - uint referencedVal = iSpawnIndices[spawn.Id]; - if (!iLoadedSpawns.ContainsKey(referencedVal)) + // acquire model instance + WorldModel model = vm.AcquireModelInstance(spawn.name, spawn.flags); + if (model == null) + Log.outError(LogFilter.Server, "StaticMapTree.LoadMapTile() : could not acquire WorldModel [{0}, {1}]", tileX, tileY); + + // update tree + if (iSpawnIndices.ContainsKey(spawn.Id)) { - if (referencedVal >= iNTreeValues) + uint referencedVal = iSpawnIndices[spawn.Id]; + if (!iLoadedSpawns.ContainsKey(referencedVal)) { - Log.outError(LogFilter.Maps, "StaticMapTree.LoadMapTile() : invalid tree element ({0}/{1}) referenced in tile {2}", referencedVal, iNTreeValues, fileResult.Name); - continue; - } + if (referencedVal >= iNTreeValues) + { + Log.outError(LogFilter.Maps, "StaticMapTree.LoadMapTile() : invalid tree element ({0}/{1}) referenced in tile {2}", referencedVal, iNTreeValues, fileResult.Name); + continue; + } - iTreeValues[referencedVal] = new ModelInstance(spawn, model); - iLoadedSpawns[referencedVal] = 1; + iTreeValues[referencedVal] = new ModelInstance(spawn, model); + iLoadedSpawns[referencedVal] = 1; + } + else + ++iLoadedSpawns[referencedVal]; + } + else if (iMapID == fileResult.UsedMapId) + { + // unknown parent spawn might appear in because it overlaps multiple tiles + // in case the original tile is swapped but its neighbour is now (adding this spawn) + // we want to not mark it as loading error and just skip that model + Log.outError(LogFilter.Maps, $"StaticMapTree.LoadMapTile() : invalid tree element (spawn {spawn.Id}) referenced in tile fileResult.Name{fileResult.Name} by map {iMapID}"); + result = LoadResult.ReadFromFileFailed; } - else - ++iLoadedSpawns[referencedVal]; - } - else if (iMapID == fileResult.UsedMapId) - { - // unknown parent spawn might appear in because it overlaps multiple tiles - // in case the original tile is swapped but its neighbour is now (adding this spawn) - // we want to not mark it as loading error and just skip that model - Log.outError(LogFilter.Maps, $"StaticMapTree.LoadMapTile() : invalid tree element (spawn {spawn.Id}) referenced in tile fileResult.Name{fileResult.Name} by map {iMapID}"); - return LoadResult.ReadFromFileFailed; } else { Log.outError(LogFilter.Maps, $"StaticMapTree.LoadMapTile() : cannot read model from file (spawn index {i}) referenced in tile {fileResult.Name} by map {iMapID}"); - return LoadResult.ReadFromFileFailed; + result = LoadResult.ReadFromFileFailed; } } } + iLoadedTiles[PackTileID(tileX, tileY)] = true; } - iLoadedTiles[PackTileID(tileX, tileY)] = true; } else { iLoadedTiles[PackTileID(tileX, tileY)] = false; } - return LoadResult.Success; + return result; } public void UnloadMapTile(uint tileX, uint tileY, VMapManager vm) { uint tileID = PackTileID(tileX, tileY); - var tile = iLoadedTiles.LookupByKey(tileID); if (!iLoadedTiles.ContainsKey(tileID)) { Log.outError(LogFilter.Server, "StaticMapTree.UnloadMapTile() : trying to unload non-loaded tile - Map:{0} X:{1} Y:{2}", iMapID, tileX, tileY); return; } - if (tile) // file associated with tile + if (iLoadedTiles[tileID]) // file associated with tile { TileFileOpenResult fileResult = OpenMapTileFile(VMapManager.VMapPath, iMapID, tileX, tileY, vm); if (fileResult.File != null) diff --git a/Source/Game/DataStorage/CliDB.cs b/Source/Game/DataStorage/CliDB.cs index 9538654dc..9c17183d9 100644 --- a/Source/Game/DataStorage/CliDB.cs +++ b/Source/Game/DataStorage/CliDB.cs @@ -60,7 +60,7 @@ namespace Game.DataStorage ArtifactStorage = ReadDB2("Artifact.db2", HotfixStatements.SEL_ARTIFACT, HotfixStatements.SEL_ARTIFACT_APPEARANCE_LOCALE); ArtifactAppearanceStorage = ReadDB2("ArtifactAppearance.db2", HotfixStatements.SEL_ARTIFACT_APPEARANCE, HotfixStatements.SEL_ARTIFACT_APPEARANCE_LOCALE); ArtifactAppearanceSetStorage = ReadDB2("ArtifactAppearanceSet.db2", HotfixStatements.SEL_ARTIFACT_APPEARANCE_SET, HotfixStatements.SEL_ARTIFACT_APPEARANCE_SET_LOCALE); - ArtifactCategoryStorage = ReadDB2("ArtifactCategory.db2", HotfixStatements.SEL_ARTIFACT_CATEGORY); + //ArtifactCategoryStorage = ReadDB2("ArtifactCategory.db2", HotfixStatements.SEL_ARTIFACT_CATEGORY); ArtifactPowerStorage = ReadDB2("ArtifactPower.db2", HotfixStatements.SEL_ARTIFACT_POWER); ArtifactPowerLinkStorage = ReadDB2("ArtifactPowerLink.db2", HotfixStatements.SEL_ARTIFACT_POWER_LINK); ArtifactPowerPickerStorage = ReadDB2("ArtifactPowerPicker.db2", HotfixStatements.SEL_ARTIFACT_POWER_PICKER); diff --git a/Source/Game/DataStorage/DB2Manager.cs b/Source/Game/DataStorage/DB2Manager.cs index d3a918b0a..ddc2361f7 100644 --- a/Source/Game/DataStorage/DB2Manager.cs +++ b/Source/Game/DataStorage/DB2Manager.cs @@ -75,9 +75,13 @@ namespace Game.DataStorage foreach (AzeriteEmpoweredItemRecord azeriteEmpoweredItem in CliDB.AzeriteEmpoweredItemStorage.Values) _azeriteEmpoweredItems[azeriteEmpoweredItem.ItemID] = azeriteEmpoweredItem; + CliDB.AzeriteEmpoweredItemStorage.Clear(); + foreach (AzeriteEssencePowerRecord azeriteEssencePower in CliDB.AzeriteEssencePowerStorage.Values) _azeriteEssencePowersByIdAndRank[((uint)azeriteEssencePower.AzeriteEssenceID, (uint)azeriteEssencePower.Tier)] = azeriteEssencePower; + CliDB.AzeriteEssencePowerStorage.Clear(); + foreach (AzeriteItemMilestonePowerRecord azeriteItemMilestonePower in CliDB.AzeriteItemMilestonePowerStorage.Values) _azeriteItemMilestonePowers.Add(azeriteItemMilestonePower); @@ -99,6 +103,8 @@ namespace Game.DataStorage if (CliDB.AzeritePowerStorage.ContainsKey(azeritePowerSetMember.AzeritePowerID)) _azeritePowers.Add(azeritePowerSetMember.AzeritePowerSetID, azeritePowerSetMember); + CliDB.AzeritePowerSetMemberStorage.Clear(); + foreach (AzeriteTierUnlockRecord azeriteTierUnlock in CliDB.AzeriteTierUnlockStorage.Values) { var key = (azeriteTierUnlock.AzeriteTierUnlockSetID, (ItemContext)azeriteTierUnlock.ItemCreationContext); @@ -2295,7 +2301,7 @@ namespace Game.DataStorage Dictionary _itemLevelDeltaToBonusListContainer = new Dictionary(); MultiMap _itemBonusTrees = new MultiMap(); Dictionary _itemChildEquipment = new Dictionary(); - Array _itemClassByOldEnum = new Array(19); + ItemClassRecord[] _itemClassByOldEnum = new ItemClassRecord[19]; List _itemsWithCurrencyCost = new List(); MultiMap _itemCategoryConditions = new MultiMap(); MultiMap _itemLevelQualitySelectorQualities = new MultiMap(); diff --git a/Source/Game/Entities/Player/Player.Quest.cs b/Source/Game/Entities/Player/Player.Quest.cs index cb4873431..982dec02b 100644 --- a/Source/Game/Entities/Player/Player.Quest.cs +++ b/Source/Game/Entities/Player/Player.Quest.cs @@ -2627,7 +2627,6 @@ namespace Game.Entities Log.outError(LogFilter.Player, "GetQuestObjectiveData: called for quest {0} with invalid StorageIndex {1} (objective data is not tracked)", quest.Id, storageIndex); var status = m_QuestStatus.LookupByKey(quest.Id); - if (status == null) { Log.outError(LogFilter.Player, "GetQuestObjectiveData: player {0} ({1}) doesn't have quest status data for quest {2}", GetName(), GetGUID().ToString(), quest.Id); diff --git a/Source/Game/Entities/Unit/Unit.Combat.cs b/Source/Game/Entities/Unit/Unit.Combat.cs index b96346bf4..cf921cdf3 100644 --- a/Source/Game/Entities/Unit/Unit.Combat.cs +++ b/Source/Game/Entities/Unit/Unit.Combat.cs @@ -2196,7 +2196,6 @@ namespace Game.Entities minDamage = Math.Max(0.0f, minDamage); maxDamage = Math.Max(0.0f, maxDamage); - if (minDamage > maxDamage) { minDamage = minDamage + maxDamage; diff --git a/Source/Game/Networking/Packets/LootPackets.cs b/Source/Game/Networking/Packets/LootPackets.cs index fa7dae3c6..4be859a13 100644 --- a/Source/Game/Networking/Packets/LootPackets.cs +++ b/Source/Game/Networking/Packets/LootPackets.cs @@ -111,12 +111,12 @@ namespace Game.Networking.Packets uint Count = _worldPacket.ReadUInt32(); Target = _worldPacket.ReadPackedGuid(); - for (uint i = 0; i < Count; ++i) + for (int i = 0; i < Count; ++i) { LootRequest lootRequest = new LootRequest(); lootRequest.Object = _worldPacket.ReadPackedGuid(); lootRequest.LootListID = _worldPacket.ReadUInt8(); - Loot.Add(lootRequest); + Loot[i] = lootRequest; } } diff --git a/Source/Game/Networking/Packets/TalentPackets.cs b/Source/Game/Networking/Packets/TalentPackets.cs index 2cc2ddc0f..7219225ca 100644 --- a/Source/Game/Networking/Packets/TalentPackets.cs +++ b/Source/Game/Networking/Packets/TalentPackets.cs @@ -151,7 +151,7 @@ namespace Game.Networking.Packets { uint size = _worldPacket.ReadUInt32(); for (int i = 0; i < size; ++i) - Talents[i].Read(_worldPacket); + Talents[i] = new PvPTalent(_worldPacket); } public Array Talents = new Array(4); @@ -182,7 +182,7 @@ namespace Game.Networking.Packets public ushort PvPTalentID; public byte Slot; - public void Read(WorldPacket data) + public PvPTalent(WorldPacket data) { PvPTalentID = data.ReadUInt16(); Slot = data.ReadUInt8();