diff --git a/Source/Framework/Collections/MultiMap.cs b/Source/Framework/Collections/MultiMap.cs index bf8cc7e24..52f8d0297 100644 --- a/Source/Framework/Collections/MultiMap.cs +++ b/Source/Framework/Collections/MultiMap.cs @@ -119,7 +119,7 @@ namespace System.Collections.Generic public List LookupByKey(TKey key) { if (_interalStorage.ContainsKey(key)) - return _interalStorage[key].ToList(); + return _interalStorage[key]; return new List(); } @@ -128,7 +128,7 @@ namespace System.Collections.Generic { TKey newkey = (TKey)Convert.ChangeType(key, typeof(TKey)); if (_interalStorage.ContainsKey(newkey)) - return _interalStorage[newkey].ToList(); + return _interalStorage[newkey]; return new List(); } @@ -363,7 +363,7 @@ namespace System.Collections.Generic public List LookupByKey(TKey key) { if (_interalStorage.ContainsKey(key)) - return _interalStorage[key].ToList(); + return _interalStorage[key]; return new List(); } @@ -372,7 +372,7 @@ namespace System.Collections.Generic { TKey newkey = (TKey)Convert.ChangeType(key, typeof(TKey)); if (_interalStorage.ContainsKey(newkey)) - return _interalStorage[newkey].ToList(); + return _interalStorage[newkey]; return new List(); } diff --git a/Source/Framework/Realm/RealmManager.cs b/Source/Framework/Realm/RealmManager.cs index aa3b4e12e..fd9a815d0 100644 --- a/Source/Framework/Realm/RealmManager.cs +++ b/Source/Framework/Realm/RealmManager.cs @@ -61,7 +61,7 @@ public class RealmManager : Singleton SQLResult result = DB.Login.Query(stmt); Dictionary existingRealms = new Dictionary(); - foreach (var p in _realms.ToList()) + foreach (var p in _realms) existingRealms[p.Key] = p.Value.Name; _realms.Clear(); @@ -211,7 +211,7 @@ public class RealmManager : Singleton public byte[] GetRealmList(uint build, string subRegion) { var realmList = new RealmListUpdates(); - foreach (var realm in _realms.ToList()) + foreach (var realm in _realms) { if (realm.Value.Id.GetSubRegionAddress() != subRegion) continue; diff --git a/Source/Framework/Util/Extensions.cs b/Source/Framework/Util/Extensions.cs index 03eb28bae..66281a8a3 100644 --- a/Source/Framework/Util/Extensions.cs +++ b/Source/Framework/Util/Extensions.cs @@ -15,17 +15,16 @@ * along with this program. If not, see . */ +using Framework.IO; using System.Collections.Generic; using System.IO; using System.Linq; -using System.Linq.Expressions; using System.Numerics; using System.Reflection; using System.Reflection.Emit; using System.Runtime.InteropServices; using System.Text; using System.Text.RegularExpressions; -using Framework.IO; namespace System { @@ -338,20 +337,6 @@ namespace System return new string(reader.ReadChars(count)); } - public static byte[] ToByteArray(this BinaryReader reader) - { - var data = new byte[reader.BaseStream.Length]; - - long pos = reader.BaseStream.Position; - reader.BaseStream.Seek(0, SeekOrigin.Begin); - for (int i = 0; i < data.Length; i++) - data[i] = (byte)reader.BaseStream.ReadByte(); - - reader.BaseStream.Seek(pos, SeekOrigin.Begin); - return data; - - } - public static T[] ReadArray(this BinaryReader reader, int size) where T : struct { int numBytes = FastStruct.Size * size; @@ -374,74 +359,6 @@ namespace System return FastStruct.ArrayToStructure(result); } - - public static int ReadInt32(this BinaryReader br, int byteCount = 0) - { - if (byteCount == 0) - return br.ReadInt32(); - - if (byteCount != 4) - { - - } - - byte[] b = new byte[sizeof(int)]; - for (int i = 0; i < byteCount; i++) - b[i] = br.ReadByte(); - - return BitConverter.ToInt32(b, 0); - } - - public static uint ReadUInt32(this BinaryReader br, int byteCount = 0) - { - if (byteCount == 0) - return br.ReadUInt32(); - - if (byteCount != 4) - { - - } - - byte[] b = new byte[sizeof(uint)]; - for (int i = 0; i < byteCount; i++) - b[i] = br.ReadByte(); - - return BitConverter.ToUInt32(b, 0); - } - - public static long ReadInt64(this BinaryReader br, int byteCount = 0) - { - if (byteCount == 0) - return br.ReadInt64(); - - if (byteCount != 8) - { - - } - - byte[] b = new byte[sizeof(long)]; - for (int i = 0; i < byteCount; i++) - b[i] = br.ReadByte(); - - return BitConverter.ToInt64(b, 0); - } - - public static ulong ReadUInt64(this BinaryReader br, int byteCount = 0) - { - if (byteCount == 0) - return br.ReadUInt64(); - - if (byteCount != 8) - { - - } - - byte[] b = new byte[sizeof(ulong)]; - for (int i = 0; i < byteCount; i++) - b[i] = br.ReadByte(); - - return BitConverter.ToUInt64(b, 0); - } #endregion } } \ No newline at end of file diff --git a/Source/Game/DataStorage/M2Storage.cs b/Source/Game/DataStorage/M2Storage.cs index 8b3f71158..0b4849b31 100644 --- a/Source/Game/DataStorage/M2Storage.cs +++ b/Source/Game/DataStorage/M2Storage.cs @@ -191,12 +191,12 @@ namespace Game.DataStorage // Read header M2Header header = m2file.ReadStruct(); - 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(8 + header.ofsCameras); - readCamera(cam, (uint)m2file.BaseStream.Length - 8, buffer, cameraEntry); + m2file.BaseStream.Position = 8; + readCamera(cam, (uint)m2file.BaseStream.Length - 8, m2file, cameraEntry); } } catch (EndOfStreamException) diff --git a/Source/Game/Maps/Grid.cs b/Source/Game/Maps/Grid.cs index 874bd21c5..7a91d16db 100644 --- a/Source/Game/Maps/Grid.cs +++ b/Source/Game/Maps/Grid.cs @@ -301,20 +301,20 @@ namespace Game.Maps switch (visitor._mask) { case GridMapTypeMask.AllGrid: - visitor.Visit(_container.gameObjects.ToList()); - visitor.Visit(_container.creatures.ToList()); - visitor.Visit(_container.dynamicObjects.ToList()); - visitor.Visit(_container.corpses.ToList()); - visitor.Visit(_container.areaTriggers.ToList()); - visitor.Visit(_container.conversations.ToList()); - visitor.Visit(_container.worldObjects.ToList()); + visitor.Visit(_container.gameObjects); + visitor.Visit(_container.creatures); + visitor.Visit(_container.dynamicObjects); + visitor.Visit(_container.corpses); + visitor.Visit(_container.areaTriggers); + visitor.Visit(_container.conversations); + visitor.Visit(_container.worldObjects); break; case GridMapTypeMask.AllWorld: visitor.Visit(_objects.players); - visitor.Visit(_objects.creatures.ToList()); - visitor.Visit(_objects.corpses.ToList()); - visitor.Visit(_objects.dynamicObjects.ToList()); - visitor.Visit(_objects.worldObjects.ToList()); + visitor.Visit(_objects.creatures); + visitor.Visit(_objects.corpses); + visitor.Visit(_objects.dynamicObjects); + visitor.Visit(_objects.worldObjects); break; default: Log.outError(LogFilter.Server, "{0} called Visit with Unknown Mask {1}.", visitor.ToString(), visitor._mask); diff --git a/Source/Game/Maps/Map.cs b/Source/Game/Maps/Map.cs index 1111978d6..d5731cafa 100644 --- a/Source/Game/Maps/Map.cs +++ b/Source/Game/Maps/Map.cs @@ -86,9 +86,8 @@ namespace Game.Maps var header = reader.ReadStruct(); if (new string(header.mapMagic) != MapConst.MapMagic || new string(header.versionMagic) != MapConst.MapVersionMagic) { - Log.outError(LogFilter.Maps, - "Map file '{0}' is from an incompatible map version ({1}), {2} is expected. Please recreate using the mapextractor.", - fileName, Convert.ToString(header.versionMagic), MapConst.MapVersionMagic); + Log.outError(LogFilter.Maps, "Map file '{0}' is from an incompatible map version ({1}), {2} is expected. Please recreate using the mapextractor.", + fileName, new string(header.versionMagic), MapConst.MapVersionMagic); return false; } return true; @@ -551,10 +550,11 @@ namespace Game.Maps public virtual void Update(uint diff) { _dynamicTree.update(diff); - + // update worldsessions for existing players - foreach (Player player in m_activePlayers.ToList()) + for (var i = 0; i < m_activePlayers.Count; ++i) { + Player player = m_activePlayers[i]; if (player.IsInWorld) { WorldSession session = player.GetSession(); @@ -562,6 +562,7 @@ namespace Game.Maps session.Update(diff, updater); } } + // update active cells around players and active objects resetMarkedCells(); @@ -570,8 +571,9 @@ namespace Game.Maps var grid_object_update = new Visitor(update, GridMapTypeMask.AllGrid); var world_object_update = new Visitor(update, GridMapTypeMask.AllWorld); - foreach (Player player in m_activePlayers.ToList()) + for (var i = 0; i < m_activePlayers.Count; ++i) { + Player player = m_activePlayers[i]; if (!player.IsInWorld) continue; @@ -612,16 +614,18 @@ namespace Game.Maps } } - foreach (WorldObject obj in m_activeNonPlayers.ToList()) + for (var i = 0; i < m_activeNonPlayers.Count; ++i) { + WorldObject obj = m_activeNonPlayers[i]; if (!obj.IsInWorld) continue; VisitNearbyCellsOf(obj, grid_object_update, world_object_update); } - foreach (Transport transport in _transports.ToList()) + for (var i = 0; i < _transports.Count; ++i) { + Transport transport = _transports[i]; if (!transport || !transport.IsInWorld) continue; @@ -923,6 +927,7 @@ namespace Game.Maps Cell old_cell = dynObj.GetCurrentCell(); Contract.Assert(integrity_check == old_cell); + Cell new_cell = new Cell(x, y); if (getGrid(new_cell.GetGridX(), new_cell.GetGridY()) == null) @@ -947,6 +952,7 @@ namespace Game.Maps old_cell = dynObj.GetCurrentCell(); integrity_check = new Cell(dynObj.GetPositionX(), dynObj.GetPositionY()); + Contract.Assert(integrity_check == old_cell); } @@ -989,6 +995,7 @@ namespace Game.Maps if (c._moveState == ObjectCellMoveState.None) creaturesToMove.Add(c); + c.SetNewCellPosition(x, y, z, ang); } @@ -1061,8 +1068,10 @@ namespace Game.Maps void MoveAllCreaturesInMoveList() { _creatureToMoveLock = true; - foreach (Creature creature in creaturesToMove.ToList()) + + for (var i = 0; i< creaturesToMove.Count; ++i) { + Creature creature = creaturesToMove[i]; if (creature.GetMap() != this) //pet is teleported to another map continue; @@ -1104,6 +1113,7 @@ namespace Game.Maps } } } + creaturesToMove.Clear(); _creatureToMoveLock = false; } @@ -1111,8 +1121,10 @@ namespace Game.Maps void MoveAllGameObjectsInMoveList() { _gameObjectsToMoveLock = true; - foreach (GameObject go in _gameObjectsToMove) + + for (var i = 0; i < _gameObjectsToMove.Count; ++i) { + GameObject go = _gameObjectsToMove[i]; if (go.GetMap() != this) //transport is teleported to another map continue; @@ -1148,6 +1160,7 @@ namespace Game.Maps } } } + _gameObjectsToMove.Clear(); _gameObjectsToMoveLock = false; } @@ -1155,8 +1168,10 @@ namespace Game.Maps void MoveAllDynamicObjectsInMoveList() { _dynamicObjectsToMoveLock = true; - foreach (var dynObj in _dynamicObjectsToMove) + + for (var i = 0; i < _dynamicObjectsToMove.Count; ++i) { + DynamicObject dynObj = _dynamicObjectsToMove[i]; if (dynObj.GetMap() != this) //transport is teleported to another map continue; @@ -1188,8 +1203,10 @@ namespace Game.Maps void MoveAllAreaTriggersInMoveList() { _areaTriggersToMoveLock = true; - foreach (AreaTrigger at in _areaTriggersToMove) + + for (var i = 0; i < _areaTriggersToMove.Count; ++i) { + AreaTrigger at = _areaTriggersToMove[i]; if (at.GetMap() != this) //transport is teleported to another map continue; @@ -2095,8 +2112,9 @@ namespace Game.Maps public virtual void DelayedUpdate(uint diff) { - foreach (var transport in _transports.ToList()) + for (var i = 0; i < _transports.Count; ++i) { + Transport transport = _transports[i]; if (!transport.IsInWorld) continue; diff --git a/Source/Game/Maps/ObjectGridLoader.cs b/Source/Game/Maps/ObjectGridLoader.cs index a0075b5e6..f84b73ace 100644 --- a/Source/Game/Maps/ObjectGridLoader.cs +++ b/Source/Game/Maps/ObjectGridLoader.cs @@ -18,6 +18,7 @@ using Framework.Constants; using Game.Entities; using System.Collections.Generic; +using System.Linq; namespace Game.Maps { @@ -181,7 +182,7 @@ namespace Game.Maps { public override void Visit(ICollection objs) { - foreach (var creature in objs) + foreach (var creature in objs.ToList()) { // creature in unloading grid can have respawn point in another grid // if it will be unloaded then it will not respawn in original grid until unload/load original grid @@ -191,7 +192,7 @@ namespace Game.Maps } public override void Visit(ICollection objs) { - foreach (var go in objs) + foreach (var go in objs.ToList()) { // gameobject in unloading grid can have respawn point in another grid // if it will be unloaded then it will not respawn in original grid until unload/load original grid diff --git a/Source/Scripts/Northrend/AzjolNerub/AzjolNerub/BossKrikthirTheGatewatcher.cs b/Source/Scripts/Northrend/AzjolNerub/AzjolNerub/BossKrikthirTheGatewatcher.cs index e1f8e8b92..91500b1ba 100644 --- a/Source/Scripts/Northrend/AzjolNerub/AzjolNerub/BossKrikthirTheGatewatcher.cs +++ b/Source/Scripts/Northrend/AzjolNerub/AzjolNerub/BossKrikthirTheGatewatcher.cs @@ -760,14 +760,14 @@ namespace Scripts.Northrend.AzjolNerub.AzjolNerub.KrikthirTheGatewatcher void HandleTargets(List targetList) { // Remove any Watchers that are already in combat - foreach (var obj in targetList.ToList()) + for (var i = 0; i < targetList.Count; ++i) { - Creature creature = obj.ToCreature(); + Creature creature = targetList[i].ToCreature(); if (creature) if (creature.IsAlive() && !creature.IsInCombat()) continue; - targetList.Remove(obj); + targetList.RemoveAt(i); } // Default to Krik'thir himself if he isn't engaged diff --git a/Source/Scripts/Northrend/IcecrownCitadel/LadyDeathwhisper.cs b/Source/Scripts/Northrend/IcecrownCitadel/LadyDeathwhisper.cs index 0e30a574c..e46ea3db4 100644 --- a/Source/Scripts/Northrend/IcecrownCitadel/LadyDeathwhisper.cs +++ b/Source/Scripts/Northrend/IcecrownCitadel/LadyDeathwhisper.cs @@ -573,7 +573,7 @@ namespace Scripts.Northrend.IcecrownCitadel return; List temp = new List(); - foreach (var guid in summons.ToList()) + foreach (var guid in summons) { Creature cre = ObjectAccessor.GetCreature(me, guid); if (cre)