diff --git a/Source/Game/Entities/Pet.cs b/Source/Game/Entities/Pet.cs index 17a882d45..5b4988e80 100644 --- a/Source/Game/Entities/Pet.cs +++ b/Source/Game/Entities/Pet.cs @@ -335,12 +335,12 @@ namespace Game.Entities if (owner.IsPlayer() && IsControlled() && !IsTemporarySummoned() && (GetPetType() == PetType.Summon || GetPetType() == PetType.Hunter)) owner.ToPlayer().SetLastPetNumber(petInfo.PetNumber); + var session = owner.GetSession(); + var lastSaveTime = petInfo.LastSaveTime; + var specializationId = petInfo.SpecializationId; owner.GetSession().AddQueryHolderCallback(DB.Characters.DelayQueryHolder(new PetLoadQueryHolder(ownerid, petInfo.PetNumber))) .AfterComplete(holder => { - var session = owner.GetSession(); - var lastSaveTime = petInfo.LastSaveTime; - var specializationId = petInfo.SpecializationId; if (session.GetPlayer() != owner || owner.GetPet() != this) return; diff --git a/Source/Game/Handlers/AuctionHandler.cs b/Source/Game/Handlers/AuctionHandler.cs index 563af83e9..256eb10f4 100644 --- a/Source/Game/Handlers/AuctionHandler.cs +++ b/Source/Game/Handlers/AuctionHandler.cs @@ -131,9 +131,10 @@ namespace Game SQLTransaction trans = new(); if (auctionHouse.BuyCommodity(trans, _player, (uint)confirmCommoditiesPurchase.ItemID, confirmCommoditiesPurchase.Quantity, throttle.DelayUntilNext)) { + var buyerGuid = _player.GetGUID(); AddTransactionCallback(DB.Characters.AsyncCommitTransaction(trans)).AfterComplete(success => { - if (GetPlayer() && GetPlayer().GetGUID() == _player.GetGUID()) + if (GetPlayer() && GetPlayer().GetGUID() == buyerGuid) { if (success) { @@ -766,9 +767,10 @@ namespace Game auctionHouse.AddAuction(trans, auction); _player.SaveInventoryAndGoldToDB(trans); + var auctionPlayerGuid = _player.GetGUID(); AddTransactionCallback(DB.Characters.AsyncCommitTransaction(trans)).AfterComplete(success => { - if (GetPlayer() && GetPlayer().GetGUID() == _player.GetGUID()) + if (GetPlayer() && GetPlayer().GetGUID() == auctionPlayerGuid) { if (success) { @@ -912,9 +914,11 @@ namespace Game auctionHouse.AddAuction(trans, auction); _player.SaveInventoryAndGoldToDB(trans); + + var auctionPlayerGuid = _player.GetGUID(); AddTransactionCallback(DB.Characters.AsyncCommitTransaction(trans)).AfterComplete(success => - { - if (GetPlayer() && GetPlayer().GetGUID() == _player.GetGUID()) + { + if (GetPlayer() && GetPlayer().GetGUID() == auctionPlayerGuid) { if (success) { diff --git a/Source/Game/Handlers/CharacterHandler.cs b/Source/Game/Handlers/CharacterHandler.cs index 92c582f2f..869760502 100644 --- a/Source/Game/Handlers/CharacterHandler.cs +++ b/Source/Game/Handlers/CharacterHandler.cs @@ -1186,9 +1186,10 @@ namespace Game PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.SEL_CHECK_NAME); stmt.AddValue(0, checkCharacterNameAvailability.Name); + var sequenceIndex = checkCharacterNameAvailability.SequenceIndex; _queryProcessor.AddCallback(DB.Characters.AsyncQuery(stmt).WithCallback(result => { - SendPacket(new CheckCharacterNameAvailabilityResult(checkCharacterNameAvailability.SequenceIndex, !result.IsEmpty() ? ResponseCodes.CharCreateNameInUse : ResponseCodes.Success)); + SendPacket(new CheckCharacterNameAvailabilityResult(sequenceIndex, !result.IsEmpty() ? ResponseCodes.CharCreateNameInUse : ResponseCodes.Success)); })); } diff --git a/Source/Game/Spells/Spell.cs b/Source/Game/Spells/Spell.cs index 14b6e50ee..2ea0309cb 100644 --- a/Source/Game/Spells/Spell.cs +++ b/Source/Game/Spells/Spell.cs @@ -1485,17 +1485,19 @@ namespace Game.Spells if (player.IsImmunedToSpellEffect(m_spellInfo, spellEffectInfo, null)) return; + var spell = this; + var targetGuid = rafTarget.GetGUID(); rafTarget.GetMap().AddFarSpellCallback(map => { - Player player = Global.ObjAccessor.GetPlayer(map, rafTarget.GetGUID()); + Player player = Global.ObjAccessor.GetPlayer(map, targetGuid); if (player == null) return; // check immunity again in case it changed during update - if (player.IsImmunedToSpellEffect(GetSpellInfo(), spellEffectInfo, null)) + if (player.IsImmunedToSpellEffect(spell.GetSpellInfo(), spellEffectInfo, null)) return; - HandleEffects(player, null, null, null, spellEffectInfo, SpellEffectHandleMode.HitTarget); + spell.HandleEffects(player, null, null, null, spellEffectInfo, SpellEffectHandleMode.HitTarget); }); } } diff --git a/Source/Game/Spells/SpellEffects.cs b/Source/Game/Spells/SpellEffects.cs index 4f0cf0a23..64a2b1e23 100644 --- a/Source/Game/Spells/SpellEffects.cs +++ b/Source/Game/Spells/SpellEffects.cs @@ -305,26 +305,35 @@ namespace Game.Spells if (effectInfo.Effect == SpellEffectName.TriggerSpell) delay = TimeSpan.FromMilliseconds(effectInfo.MiscValue); + var caster = m_caster; + var originalCaster = m_originalCasterGUID; + var castItemGuid = m_castItemGUID; + var originalCastId = m_castId; + var triggerSpell = effectInfo.TriggerSpell; + var effect = effectInfo.Effect; + var value = damage; + var itemLevel = m_castItemLevel; + m_caster.m_Events.AddEventAtOffset(() => { // original caster guid only for GO cast CastSpellExtraArgs args = new(TriggerCastFlags.FullMask); - args.SetOriginalCaster(m_originalCasterGUID); - args.OriginalCastId = m_castId; - args.OriginalCastItemLevel = m_castItemLevel; - if (!m_castItemGUID.IsEmpty() && Global.SpellMgr.GetSpellInfo(effectInfo.TriggerSpell, m_caster.GetMap().GetDifficultyID()).HasAttribute(SpellAttr2.RetainItemCast)) + args.SetOriginalCaster(originalCaster); + args.OriginalCastId = originalCastId; + args.OriginalCastItemLevel = itemLevel; + if (!castItemGuid.IsEmpty() && Global.SpellMgr.GetSpellInfo(triggerSpell, caster.GetMap().GetDifficultyID()).HasAttribute(SpellAttr2.RetainItemCast)) { - Player triggeringAuraCaster = m_caster?.ToPlayer(); + Player triggeringAuraCaster = caster?.ToPlayer(); if (triggeringAuraCaster != null) - args.CastItem = triggeringAuraCaster.GetItemByGuid(m_castItemGUID); + args.CastItem = triggeringAuraCaster.GetItemByGuid(castItemGuid); } // set basepoints for trigger with value effect - if (effectInfo.Effect == SpellEffectName.TriggerSpellWithValue) + if (effect == SpellEffectName.TriggerSpellWithValue) for (int i = 0; i < SpellConst.MaxEffects; ++i) - args.AddSpellMod(SpellValueMod.BasePoint0 + i, damage); + args.AddSpellMod(SpellValueMod.BasePoint0 + i, value); - m_caster.CastSpell(targets, effectInfo.TriggerSpell, args); + caster.CastSpell(targets, triggerSpell, args); }, delay); } diff --git a/Source/Scripts/Spells/Shaman.cs b/Source/Scripts/Spells/Shaman.cs index c315eb281..d7cd55912 100644 --- a/Source/Scripts/Spells/Shaman.cs +++ b/Source/Scripts/Spells/Shaman.cs @@ -1179,11 +1179,15 @@ namespace Scripts.Spells.Shaman Unit caster = procInfo.GetActor(); + var targets = new CastSpellTargetArg(procInfo.GetProcTarget()); + var overloadSpellId = GetTriggeredSpellId(procInfo.GetSpellInfo().Id); + var originalCastId = procInfo.GetProcSpell().m_castId; + caster.m_Events.AddEventAtOffset(() => { CastSpellExtraArgs args = new(); - args.OriginalCastId = procInfo.GetProcSpell().m_castId; - caster.CastSpell(new CastSpellTargetArg(procInfo.GetProcTarget()), GetTriggeredSpellId(procInfo.GetSpellInfo().Id), args); + args.OriginalCastId = originalCastId; + caster.CastSpell(targets, overloadSpellId, args); }, TimeSpan.FromMilliseconds(400)); }