From 9d7a84d3a3cc86e33e1913a2f3a2bb416e108e55 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Thu, 14 Mar 2024 11:26:01 -0400 Subject: [PATCH] Core/Objects: Added ToWorldObject and ToItem Port From (https://github.com/TrinityCore/TrinityCore/commit/6f6af6a1a1508508d0e42b90f0acf4f363cf91bd) --- Source/Framework/Constants/ObjectConst.cs | 4 ++- Source/Game/Entities/GameObject/GameObject.cs | 2 +- Source/Game/Entities/Object/WorldObject.cs | 18 ++++++++++--- Source/Game/Entities/Player/Player.Quest.cs | 26 +++++-------------- Source/Game/Entities/Player/Player.Spells.cs | 11 +++----- Source/Game/Entities/Player/Player.cs | 13 +++++----- Source/Game/Maps/Map.cs | 19 +++++++------- Source/Game/Spells/Auras/Aura.cs | 19 +++++++------- 8 files changed, 56 insertions(+), 56 deletions(-) diff --git a/Source/Framework/Constants/ObjectConst.cs b/Source/Framework/Constants/ObjectConst.cs index 9e11f6d50..867aae926 100644 --- a/Source/Framework/Constants/ObjectConst.cs +++ b/Source/Framework/Constants/ObjectConst.cs @@ -38,7 +38,9 @@ namespace Framework.Constants AreaTrigger = 0x800, SceneObject = 0x1000, Conversation = 0x2000, - Seer = Player | Unit | DynamicObject + + Seer = Player | Unit | DynamicObject, + WorldObject = Unit | GameObject | DynamicObject | Corpse | AreaTrigger | SceneObject | Conversation } public enum HighGuid diff --git a/Source/Game/Entities/GameObject/GameObject.cs b/Source/Game/Entities/GameObject/GameObject.cs index f43118099..46e95003d 100644 --- a/Source/Game/Entities/GameObject/GameObject.cs +++ b/Source/Game/Entities/GameObject/GameObject.cs @@ -1331,7 +1331,7 @@ namespace Game.Entities return true; Unit owner = GetOwner(); - if (owner != null && seer.IsTypeMask(TypeMask.Unit) && owner.IsFriendlyTo(seer.ToUnit())) + if (owner != null && seer.IsUnit() && owner.IsFriendlyTo(seer.ToUnit())) return true; } diff --git a/Source/Game/Entities/Object/WorldObject.cs b/Source/Game/Entities/Object/WorldObject.cs index 0b4187015..3b040eea3 100644 --- a/Source/Game/Entities/Object/WorldObject.cs +++ b/Source/Game/Entities/Object/WorldObject.cs @@ -59,8 +59,9 @@ namespace Game.Entities if (IsInWorld) { Log.outFatal(LogFilter.Misc, "WorldObject.Dispose() {0} deleted but still in world!!", GetGUID().ToString()); - if (IsTypeMask(TypeMask.Item)) - Log.outFatal(LogFilter.Misc, "Item slot {0}", ((Item)this).GetSlot()); + Item item = ToItem(); + if (item != null) + Log.outFatal(LogFilter.Misc, "Item slot {0}", item.GetSlot()); Cypher.Assert(false); } @@ -3016,7 +3017,8 @@ namespace Game.Entities if (!player.HaveAtClient(this)) continue; - if (IsTypeMask(TypeMask.Unit) && (ToUnit().GetCharmerGUID() == player.GetGUID()))// @todo this is for puppet + Unit unit = ToUnit(); + if (unit != null && unit.GetCharmerGUID() == player.GetGUID())// @todo this is for puppet continue; DestroyForPlayer(player); @@ -3088,6 +3090,7 @@ namespace Game.Entities public bool IsDestroyedObject() { return _isDestroyedObject; } public void SetDestroyedObject(bool destroyed) { _isDestroyedObject = destroyed; } + public bool IsWorldObject() { return IsTypeMask(TypeMask.WorldObject); } public bool IsCreature() { return GetTypeId() == TypeId.Unit; } public bool IsPlayer() { return GetTypeId() == TypeId.Player; } public bool IsGameObject() { return GetTypeId() == TypeId.GameObject; } @@ -3097,6 +3100,7 @@ namespace Game.Entities public bool IsAreaTrigger() { return GetTypeId() == TypeId.AreaTrigger; } public bool IsConversation() { return GetTypeId() == TypeId.Conversation; } public bool IsSceneObject() { return GetTypeId() == TypeId.SceneObject; } + public bool IsItem() { return GetTypeId() == TypeId.Item; } public Creature ToCreature() { return IsCreature() ? (this as Creature) : null; } public Player ToPlayer() { return IsPlayer() ? (this as Player) : null; } @@ -3107,6 +3111,7 @@ namespace Game.Entities public AreaTrigger ToAreaTrigger() { return IsAreaTrigger() ? (this as AreaTrigger) : null; } public Conversation ToConversation() { return IsConversation() ? (this as Conversation) : null; } public SceneObject ToSceneObject() { return IsSceneObject() ? (this as SceneObject) : null; } + public Item ToItem() { return IsItem() ? (this as Item) : null; } public virtual uint GetLevelForTarget(WorldObject target) { return 1; } @@ -3448,7 +3453,12 @@ namespace Game.Entities { float newZ = GetMapHeight(x, y, z); if (newZ > MapConst.InvalidHeight) - z = newZ + (IsUnit() ? ToUnit().GetHoverOffset() : 0.0f); + { + z = newZ; + Unit unit = ToUnit(); + if (unit != null) + z += ToUnit().GetHoverOffset(); + } } public void UpdateAllowedPositionZ(float x, float y, ref float z) diff --git a/Source/Game/Entities/Player/Player.Quest.cs b/Source/Game/Entities/Player/Player.Quest.cs index 5a9c8f605..97bfde2e1 100644 --- a/Source/Game/Entities/Player/Player.Quest.cs +++ b/Source/Game/Entities/Player/Player.Quest.cs @@ -820,12 +820,8 @@ namespace Game.Entities { SpellInfo spellInfo = Global.SpellMgr.GetSpellInfo(quest.SourceSpellID, GetMap().GetDifficultyID()); Unit caster = this; - if (questGiver != null && questGiver.IsTypeMask(TypeMask.Unit) && !quest.HasFlag(QuestFlags.PlayerCastAccept) && !spellInfo.HasTargetType(Targets.UnitCaster) && !spellInfo.HasTargetType(Targets.DestCasterSummon)) - { - Unit unit = questGiver.ToUnit(); - if (unit != null) - caster = unit; - } + if (questGiver != null && questGiver.IsUnit() && !quest.HasFlag(QuestFlags.PlayerCastAccept) && !spellInfo.HasTargetType(Targets.UnitCaster) && !spellInfo.HasTargetType(Targets.DestCasterSummon)) + caster = questGiver.ToUnit(); caster.CastSpell(this, spellInfo.Id, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetCastDifficulty(spellInfo.Difficulty)); } @@ -1169,12 +1165,8 @@ namespace Game.Entities { SpellInfo spellInfo = Global.SpellMgr.GetSpellInfo(quest.RewardSpell, GetMap().GetDifficultyID()); Unit caster = this; - if (questGiver != null && questGiver.IsTypeMask(TypeMask.Unit) && !quest.HasFlag(QuestFlags.PlayerCastComplete) && !spellInfo.HasTargetType(Targets.UnitCaster)) - { - Unit unit = questGiver.ToUnit(); - if (unit != null) - caster = unit; - } + if (questGiver != null && questGiver.IsUnit() && !quest.HasFlag(QuestFlags.PlayerCastComplete) && !spellInfo.HasTargetType(Targets.UnitCaster)) + caster = questGiver.ToUnit(); caster.CastSpell(this, spellInfo.Id, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetCastDifficulty(spellInfo.Difficulty)); } @@ -1189,12 +1181,8 @@ namespace Game.Entities SpellInfo spellInfo = Global.SpellMgr.GetSpellInfo(displaySpell.SpellId, GetMap().GetDifficultyID()); Unit caster = this; - if (questGiver != null && questGiver.IsTypeMask(TypeMask.Unit) && !quest.HasFlag(QuestFlags.PlayerCastComplete) && !spellInfo.HasTargetType(Targets.UnitCaster)) - { - Unit unit = questGiver.ToUnit(); - if (unit != null) - caster = unit; - } + if (questGiver != null && questGiver.IsUnit() && !quest.HasFlag(QuestFlags.PlayerCastComplete) && !spellInfo.HasTargetType(Targets.UnitCaster)) + caster = questGiver.ToUnit(); caster.CastSpell(this, spellInfo.Id, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetCastDifficulty(spellInfo.Difficulty)); } @@ -1229,7 +1217,7 @@ namespace Game.Entities //lets remove flag for delayed teleports SetCanDelayTeleport(false); - if (questGiver != null && questGiver.IsTypeMask(TypeMask.Unit | TypeMask.GameObject)) + if (questGiver != null && questGiver.IsWorldObject()) { //For AutoSubmition was added plr case there as it almost same exclute AI script cases. // Send next quest diff --git a/Source/Game/Entities/Player/Player.Spells.cs b/Source/Game/Entities/Player/Player.Spells.cs index 97ae52be1..a6e1a5509 100644 --- a/Source/Game/Entities/Player/Player.Spells.cs +++ b/Source/Game/Entities/Player/Player.Spells.cs @@ -875,15 +875,12 @@ namespace Game.Entities public void StopCastingBindSight() { - WorldObject target = GetViewpoint(); + Unit target = GetViewpoint()?.ToUnit(); if (target != null) { - if (target.IsTypeMask(TypeMask.Unit)) - { - ((Unit)target).RemoveAurasByType(AuraType.BindSight, GetGUID()); - ((Unit)target).RemoveAurasByType(AuraType.ModPossess, GetGUID()); - ((Unit)target).RemoveAurasByType(AuraType.ModPossessPet, GetGUID()); - } + target.RemoveAurasByType(AuraType.BindSight, GetGUID()); + target.RemoveAurasByType(AuraType.ModPossess, GetGUID()); + target.RemoveAurasByType(AuraType.ModPossessPet, GetGUID()); } } diff --git a/Source/Game/Entities/Player/Player.cs b/Source/Game/Entities/Player/Player.cs index 88173b83a..13f9c8eae 100644 --- a/Source/Game/Entities/Player/Player.cs +++ b/Source/Game/Entities/Player/Player.cs @@ -6148,8 +6148,7 @@ namespace Game.Entities // target aura duration for caster show only if target exist at caster client // send data at target visibility change (adding to client) - if (target.IsTypeMask(TypeMask.Unit)) - SendInitialVisiblePackets(target.ToUnit()); + SendInitialVisiblePackets(target); } } } @@ -7438,8 +7437,9 @@ namespace Game.Entities // farsight dynobj or puppet may be very far away UpdateVisibilityOf(target); - if (target.IsTypeMask(TypeMask.Unit) && target != GetVehicleBase()) - target.ToUnit().AddPlayerToVision(this); + Unit targetUnit = target.ToUnit(); + if (targetUnit != null && targetUnit != GetVehicleBase()) + targetUnit.AddPlayerToVision(this); SetSeer(target); } else @@ -7454,8 +7454,9 @@ namespace Game.Entities SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.FarsightObject), ObjectGuid.Empty); - if (target.IsTypeMask(TypeMask.Unit) && target != GetVehicleBase()) - target.ToUnit().RemovePlayerFromVision(this); + Unit targetUnit = target.ToUnit(); + if (targetUnit != null && targetUnit != GetVehicleBase()) + targetUnit.RemovePlayerFromVision(this); //must immediately set seer back otherwise may crash SetSeer(this); diff --git a/Source/Game/Maps/Map.cs b/Source/Game/Maps/Map.cs index ad78ad5e8..491f4298c 100644 --- a/Source/Game/Maps/Map.cs +++ b/Source/Game/Maps/Map.cs @@ -3880,7 +3880,10 @@ namespace Game.Maps // prepare static data ObjectGuid sourceGUID = source != null ? source.GetGUID() : ObjectGuid.Empty; //some script commands doesn't have source ObjectGuid targetGUID = target != null ? target.GetGUID() : ObjectGuid.Empty; - ObjectGuid ownerGUID = (source != null && source.IsTypeMask(TypeMask.Item)) ? ((Item)source).GetOwnerGUID() : ObjectGuid.Empty; + ObjectGuid ownerGUID = ObjectGuid.Empty; + var item = source?.ToItem(); + if (item != null) + ownerGUID = item.GetOwnerGUID(); // Schedule script execution for all scripts in the script map bool immedScript = false; @@ -4027,7 +4030,7 @@ namespace Game.Maps if (obj == null) Log.outError(LogFilter.Scripts, "{0} {1} object is NULL.", scriptInfo.GetDebugInfo(), isSource ? "source" : "target"); - else if (!obj.IsTypeMask(TypeMask.Unit)) + else if (!obj.IsUnit()) Log.outError(LogFilter.Scripts, "{0} {1} object is not unit (TypeId: {2}, Entry: {3}, GUID: {4}), skipping.", scriptInfo.GetDebugInfo(), isSource ? "source" : "target", obj.GetTypeId(), obj.GetEntry(), obj.GetGUID().ToString()); else @@ -4105,7 +4108,7 @@ namespace Game.Maps Log.outError(LogFilter.Scripts, "{0} door guid is not specified.", scriptInfo.GetDebugInfo()); else if (source == null) Log.outError(LogFilter.Scripts, "{0} source object is NULL.", scriptInfo.GetDebugInfo()); - else if (!source.IsTypeMask(TypeMask.Unit)) + else if (!source.IsUnit()) Log.outError(LogFilter.Scripts, "{0} source object is not unit (TypeId: {1}, Entry: {2}, GUID: {3}), skipping.", scriptInfo.GetDebugInfo(), source.GetTypeId(), source.GetEntry(), source.GetGUID().ToString()); else @@ -4124,12 +4127,10 @@ namespace Game.Maps { pDoor.UseDoorOrButton((uint)nTimeToToggle); - if (target != null && target.IsTypeMask(TypeMask.GameObject)) - { - GameObject goTarget = target.ToGameObject(); - if (goTarget != null && goTarget.GetGoType() == GameObjectTypes.Button) - goTarget.UseDoorOrButton((uint)nTimeToToggle); - } + GameObject goTarget = target?.ToGameObject(); + if (goTarget != null && goTarget.GetGoType() == GameObjectTypes.Button) + goTarget.UseDoorOrButton((uint)nTimeToToggle); + } } } diff --git a/Source/Game/Spells/Auras/Aura.cs b/Source/Game/Spells/Auras/Aura.cs index a9a30b2f5..3571c2ba2 100644 --- a/Source/Game/Spells/Auras/Aura.cs +++ b/Source/Game/Spells/Auras/Aura.cs @@ -300,7 +300,7 @@ namespace Game.Spells { return $"Base: {(GetBase() != null ? GetBase().GetDebugInfo() : "NULL")}\nTarget: {(GetTarget() != null ? GetTarget().GetDebugInfo() : "NULL")}"; } - + public Unit GetTarget() { return _target; } public Aura GetBase() { return _base; } @@ -2153,7 +2153,7 @@ namespace Game.Spells script._FinishScriptCall(); } } - + public void CallScriptEffectAbsorbHandlers(AuraEffect aurEff, AuraApplication aurApp, DamageInfo dmgInfo, ref uint absorbAmount, ref bool defaultPrevented) { foreach (var auraScript in m_loadedScripts) @@ -2209,7 +2209,7 @@ namespace Game.Spells auraScript._FinishScriptCall(); } } - + public void CallScriptEffectManaShieldHandlers(AuraEffect aurEff, AuraApplication aurApp, DamageInfo dmgInfo, ref uint absorbAmount, ref bool defaultPrevented) { foreach (var auraScript in m_loadedScripts) @@ -2264,7 +2264,7 @@ namespace Game.Spells loadedScript._FinishScriptCall(); } } - + public bool CallScriptCheckProcHandlers(AuraApplication aurApp, ProcEventInfo eventInfo) { bool result = true; @@ -2406,7 +2406,7 @@ namespace Game.Spells Cypher.Assert(GetAuraType() == AuraObjectType.DynObj); return m_owner.ToDynamicObject(); } - + public void SetCastItemGUID(ObjectGuid guid) { m_castItemGuid = guid; @@ -2608,10 +2608,11 @@ namespace Game.Spells createInfo.CasterGUID = createInfo.Caster.GetGUID(); // check if aura can be owned by owner - if (createInfo.GetOwner().IsTypeMask(TypeMask.Unit)) - if (!createInfo.GetOwner().IsInWorld || createInfo.GetOwner().ToUnit().IsDuringRemoveFromWorld()) + Unit ownerUnit = createInfo.GetOwner().ToUnit(); + if (ownerUnit != null) + if (!ownerUnit.IsInWorld || ownerUnit.IsDuringRemoveFromWorld()) // owner not in world so don't allow to own not self casted single target auras - if (createInfo.CasterGUID != createInfo.GetOwner().GetGUID() && createInfo.GetSpellInfo().IsSingleTarget()) + if (createInfo.CasterGUID != ownerUnit.GetGUID() && createInfo.GetSpellInfo().IsSingleTarget()) return null; Aura aura; @@ -2805,7 +2806,7 @@ namespace Game.Spells case SpellEffectName.ApplyAuraOnPet: { Unit pet = Global.ObjAccessor.GetUnit(GetUnitOwner(), GetUnitOwner().GetPetGUID()); - if (pet != null) + if (pet != null) if (condList == null || Global.ConditionMgr.IsObjectMeetToConditions(pet, refe, condList)) units.Add(pet); break;