diff --git a/Source/Framework/Database/MySqlBase.cs b/Source/Framework/Database/MySqlBase.cs index 9a2a41121..cdddbf153 100644 --- a/Source/Framework/Database/MySqlBase.cs +++ b/Source/Framework/Database/MySqlBase.cs @@ -162,13 +162,13 @@ namespace Framework.Database return new QueryCallback(result); } - public Task> DelayQueryHolder(SQLQueryHolder holder) + public SQLQueryHolderCallback DelayQueryHolder(SQLQueryHolder holder) { SQLQueryHolderTask task = new(holder); // Store future result before enqueueing - task might get already processed and deleted before returning from this method Task> result = task.GetFuture(); _queue.Push(task); - return result; + return new(result); } public void LoadPreparedStatements() diff --git a/Source/Framework/Database/SQLQueryHolder.cs b/Source/Framework/Database/SQLQueryHolder.cs index b82c0997a..4bdef7daf 100644 --- a/Source/Framework/Database/SQLQueryHolder.cs +++ b/Source/Framework/Database/SQLQueryHolder.cs @@ -15,6 +15,7 @@ * along with this program. If not, see . */ +using System; using System.Collections.Generic; using System.Threading.Tasks; @@ -74,4 +75,31 @@ namespace Framework.Database public Task> GetFuture() { return m_result.Task; } } + + public class SQLQueryHolderCallback : ISqlCallback + { + Task> m_future; + Action> m_callback; + + public SQLQueryHolderCallback(Task> future) + { + m_future = future; + } + + public void AfterComplete(Action> callback) + { + m_callback = callback; + } + + public bool InvokeIfReady() + { + if (m_future != null && m_future.Wait(0)) + { + m_callback(m_future.Result); + return true; + } + + return false; + } + } } diff --git a/Source/Game/Handlers/CharacterHandler.cs b/Source/Game/Handlers/CharacterHandler.cs index 0a7581cf7..79e3e1994 100644 --- a/Source/Game/Handlers/CharacterHandler.cs +++ b/Source/Game/Handlers/CharacterHandler.cs @@ -50,7 +50,7 @@ namespace Game return; } - _charEnumCallback = DB.Characters.DelayQueryHolder(holder); + AddQueryHolderCallback(DB.Characters.DelayQueryHolder(holder)).AfterComplete(result => HandleCharEnum((EnumCharactersQueryHolder)result)); } void HandleCharEnum(EnumCharactersQueryHolder holder) @@ -148,8 +148,8 @@ namespace Game HandleCharEnum(holder); return; } - - _charEnumCallback = DB.Characters.DelayQueryHolder(holder); + + AddQueryHolderCallback(DB.Characters.DelayQueryHolder(holder)).AfterComplete(result => HandleCharEnum((EnumCharactersQueryHolder)result)); } void HandleCharUndeleteEnumCallback(SQLResult result) @@ -723,7 +723,7 @@ namespace Game SendPacket(new ResumeComms(ConnectionType.Instance)); - _charLoginCallback = DB.Characters.DelayQueryHolder(holder); + AddQueryHolderCallback(DB.Characters.DelayQueryHolder(holder)).AfterComplete(holder => HandlePlayerLogin((LoginQueryHolder)holder)); } public void HandlePlayerLogin(LoginQueryHolder holder) diff --git a/Source/Game/Maps/Map.cs b/Source/Game/Maps/Map.cs index 96fbdb2ec..621cb64cc 100644 --- a/Source/Game/Maps/Map.cs +++ b/Source/Game/Maps/Map.cs @@ -5371,8 +5371,6 @@ namespace Game.Maps if (i_data == null) return; - i_data.Initialize(); - if (load) { // @todo make a global storage for this diff --git a/Source/Game/Server/WorldSession.cs b/Source/Game/Server/WorldSession.cs index 72754b1ba..e08e99cbb 100644 --- a/Source/Game/Server/WorldSession.cs +++ b/Source/Game/Server/WorldSession.cs @@ -22,6 +22,7 @@ using Framework.Realm; using Game.Accounts; using Game.BattleGrounds; using Game.BattlePets; +using Game.Chat; using Game.Entities; using Game.Guilds; using Game.Maps; @@ -33,8 +34,6 @@ using System.Collections.Generic; using System.IO; using System.Numerics; using System.Text; -using System.Threading.Tasks; -using Game.Chat; namespace Game { @@ -603,7 +602,7 @@ namespace Game return false; } - + public bool DisallowHyperlinksAndMaybeKick(string str) { if (!str.Contains('|')) @@ -616,7 +615,7 @@ namespace Game return false; } - + public void SendNotification(CypherStrings str, params object[] args) { SendNotification(Global.ObjectMgr.GetCypherString(str), args); @@ -705,26 +704,7 @@ namespace Game { _queryProcessor.ProcessReadyCallbacks(); _transactionCallbacks.ProcessReadyCallbacks(); - - if (_realmAccountLoginCallback != null && _realmAccountLoginCallback.IsCompleted && _accountLoginCallback != null && _accountLoginCallback.IsCompleted) - { - InitializeSessionCallback(_realmAccountLoginCallback.Result, _accountLoginCallback.Result); - _realmAccountLoginCallback = null; - _accountLoginCallback = null; - } - - // HandlePlayerLoginOpcode - if (_charLoginCallback != null && _charLoginCallback.IsCompleted) - { - HandlePlayerLogin((LoginQueryHolder)_charLoginCallback.Result); - _charLoginCallback = null; - } - - if (_charEnumCallback != null && _charEnumCallback.IsCompleted) - { - HandleCharEnum((EnumCharactersQueryHolder)_charEnumCallback.Result); - _charEnumCallback = null; - } + _queryHolderProcessor.ProcessReadyCallbacks(); } TransactionCallback AddTransactionCallback(TransactionCallback callback) @@ -732,11 +712,16 @@ namespace Game return _transactionCallbacks.AddCallback(callback); } + SQLQueryHolderCallback AddQueryHolderCallback(SQLQueryHolderCallback callback) + { + return (SQLQueryHolderCallback)_queryHolderProcessor.AddCallback(callback); + } + public bool CanAccessAlliedRaces() { return GetAccountExpansion() >= Expansion.BattleForAzeroth; } - + void InitWarden(BigInteger k) { if (_os == "Win") @@ -786,11 +771,25 @@ namespace Game AccountInfoQueryHolder holder = new(); holder.Initialize(GetAccountId(), GetBattlenetAccountId()); - _realmAccountLoginCallback = DB.Characters.DelayQueryHolder(realmHolder); - _accountLoginCallback = DB.Login.DelayQueryHolder(holder); + AccountInfoQueryHolderPerRealm characterHolder = null; + AccountInfoQueryHolder loginHolder = null; + + AddQueryHolderCallback(DB.Characters.DelayQueryHolder(realmHolder)).AfterComplete(result => + { + characterHolder = (AccountInfoQueryHolderPerRealm)result; + if (loginHolder != null && characterHolder != null) + InitializeSessionCallback(loginHolder, characterHolder); + }); + + AddQueryHolderCallback(DB.Login.DelayQueryHolder(holder)).AfterComplete(result => + { + loginHolder = (AccountInfoQueryHolder)result; + if (loginHolder != null && characterHolder != null) + InitializeSessionCallback(loginHolder, characterHolder); + }); } - void InitializeSessionCallback(SQLQueryHolder realmHolder, SQLQueryHolder holder) + void InitializeSessionCallback(SQLQueryHolder holder, SQLQueryHolder realmHolder) { LoadAccountData(realmHolder.GetResult(AccountInfoQueryLoad.GlobalAccountDataIndexPerRealm), AccountDataTypes.GlobalCacheMask); LoadTutorialsData(realmHolder.GetResult(AccountInfoQueryLoad.TutorialsIndexPerRealm)); @@ -898,7 +897,7 @@ namespace Game else return (uint)movementTime; } - + public Locale GetSessionDbcLocale() { return m_sessionDbcLocale; } public Locale GetSessionDbLocaleIndex() { return m_sessionDbLocaleIndex; } @@ -922,7 +921,7 @@ namespace Game // Packets cooldown public long GetCalendarEventCreationCooldown() { return _calendarEventCreationCooldown; } public void SetCalendarEventCreationCooldown(long cooldown) { _calendarEventCreationCooldown = cooldown; } - + // Battle Pets public BattlePetMgr GetBattlePetMgr() { return _battlePetMgr; } public CollectionMgr GetCollectionMgr() { return _collectionMgr; } @@ -1005,13 +1004,9 @@ namespace Game BattlePetMgr _battlePetMgr; - Task> _realmAccountLoginCallback; - Task> _accountLoginCallback; - Task> _charLoginCallback; - Task> _charEnumCallback; - AsyncCallbackProcessor _queryProcessor = new(); AsyncCallbackProcessor _transactionCallbacks = new(); + AsyncCallbackProcessor _queryHolderProcessor = new(); #endregion }