From 0e61c38792a07945d620672f78774434311aa5da Mon Sep 17 00:00:00 2001 From: hondacrx Date: Mon, 25 May 2020 20:46:19 -0400 Subject: [PATCH] Fix some crashes --- Source/Game/Achievements/CriteriaHandler.cs | 30 ++++++++++++++++++++- Source/Game/AuctionHouse/AuctionManager.cs | 8 +++--- Source/Game/Movement/MotionMaster.cs | 1 - 3 files changed, 33 insertions(+), 6 deletions(-) diff --git a/Source/Game/Achievements/CriteriaHandler.cs b/Source/Game/Achievements/CriteriaHandler.cs index af0591aa6..2f6bf9ca5 100644 --- a/Source/Game/Achievements/CriteriaHandler.cs +++ b/Source/Game/Achievements/CriteriaHandler.cs @@ -2476,7 +2476,11 @@ namespace Game.Achievements public class CriteriaManager : Singleton { - CriteriaManager() { } + CriteriaManager() + { + for (var i = 0; i < (int)CriteriaTypes.TotalTypes; ++i) + _criteriasByAsset[i] = new MultiMap(); + } public void LoadCriteriaModifiersTree() { @@ -2639,6 +2643,30 @@ namespace Game.Achievements { ++criterias; _criteriasByType.Add(criteriaEntry.Type, criteria); + if (IsCriteriaTypeStoredByAsset(criteriaEntry.Type)) + { + if (criteriaEntry.Type != CriteriaTypes.ExploreArea) + _criteriasByAsset[(int)criteriaEntry.Type].Add(criteriaEntry.Asset, criteria); + else + { + var worldOverlayEntry = CliDB.WorldMapOverlayStorage.LookupByKey(criteriaEntry.Asset); + if (worldOverlayEntry == null) + break; + + for (byte j = 0; j < SharedConst.MaxWorldMapOverlayArea; ++j) + { + if (worldOverlayEntry.AreaID[j] != 0) + { + bool valid = true; + for (byte i = 0; i < j; ++i) + if (worldOverlayEntry.AreaID[j] == worldOverlayEntry.AreaID[i]) + valid = false; + if (valid) + _criteriasByAsset[(int)criteriaEntry.Type].Add(worldOverlayEntry.AreaID[j], criteria); + } + } + } + } } if (criteria.FlagsCu.HasAnyFlag(CriteriaFlagsCu.Guild)) diff --git a/Source/Game/AuctionHouse/AuctionManager.cs b/Source/Game/AuctionHouse/AuctionManager.cs index 80a053502..6715d99be 100644 --- a/Source/Game/AuctionHouse/AuctionManager.cs +++ b/Source/Game/AuctionHouse/AuctionManager.cs @@ -1472,11 +1472,11 @@ namespace Game owner.GetSession().SendAuctionClosedNotification(auction, 0.0f, false); int itemIndex = 0; - while (auction.Items.Count > itemIndex) + while (itemIndex < auction.Items.Count) { MailDraft mail = new MailDraft(Global.AuctionHouseMgr.BuildItemAuctionMailSubject(AuctionMailType.Expired, auction), ""); - for (int i = 0; i < SharedConst.MaxMailItems && auction.Items[itemIndex] != null; ++i, ++itemIndex) + for (int i = 0; i < SharedConst.MaxMailItems && itemIndex < auction.Items.Count; ++i, ++itemIndex) mail.AddItem(auction.Items[itemIndex]); mail.SendMailTo(trans, new MailReceiver(owner, auction.Owner), new MailSender(this), MailCheckMask.Copied, 0); @@ -1493,11 +1493,11 @@ namespace Game public void SendAuctionRemoved(AuctionPosting auction, Player owner, SQLTransaction trans) { int itemIndex = 0; - while (auction.Items.Count > itemIndex) + while (itemIndex < auction.Items.Count) { MailDraft draft = new MailDraft(Global.AuctionHouseMgr.BuildItemAuctionMailSubject(AuctionMailType.Cancelled, auction), ""); - for (int i = 0; i < SharedConst.MaxMailItems && auction.Items[itemIndex] != null; ++i, ++itemIndex) + for (int i = 0; i < SharedConst.MaxMailItems && itemIndex < auction.Items.Count; ++i, ++itemIndex) draft.AddItem(auction.Items[itemIndex]); draft.SendMailTo(trans, owner, new MailSender(this), MailCheckMask.Copied); diff --git a/Source/Game/Movement/MotionMaster.cs b/Source/Game/Movement/MotionMaster.cs index 2cb479c63..1ec337f75 100644 --- a/Source/Game/Movement/MotionMaster.cs +++ b/Source/Game/Movement/MotionMaster.cs @@ -34,7 +34,6 @@ namespace Game.Movement public MotionMaster(Unit me) { _owner = me; - _expireList = null; _top = -1; _cleanFlag = MMCleanFlag.None;