From 4ed8f3e5e213b46604bcef99a4d5e45f27f272cf Mon Sep 17 00:00:00 2001 From: Tahir Akhlaq Date: Sun, 9 Jul 2017 00:27:15 +0100 Subject: [PATCH] added a bit of targetfind stuff --- FFXIVClassic Map Server/actors/Actor.cs | 4 +- .../actors/chara/Character.cs | 9 ++ .../actors/chara/ai/TargetFind.cs | 114 ++++++++++++++++++ 3 files changed, 125 insertions(+), 2 deletions(-) diff --git a/FFXIVClassic Map Server/actors/Actor.cs b/FFXIVClassic Map Server/actors/Actor.cs index fbc9dbf2..d150b74a 100644 --- a/FFXIVClassic Map Server/actors/Actor.cs +++ b/FFXIVClassic Map Server/actors/Actor.cs @@ -150,7 +150,7 @@ namespace FFXIVClassic_Map_Server.Actors return spawnPacket; } - public SubPacket CreatePositionUpdatePacket() + public SubPacket CreatePositionUpdatePacket(bool forceUpdate = false) { int updateMs = 300; var diffTime = (DateTime.Now - lastMoveUpdate); @@ -160,7 +160,7 @@ namespace FFXIVClassic_Map_Server.Actors updateMs = 150; } - if (hasMoved && ((this is Player ) || diffTime.Milliseconds >= updateMs)) + if (forceUpdate || (hasMoved && ((this is Player ) || diffTime.Milliseconds >= updateMs))) { hasMoved = (this.positionUpdates != null && this.positionUpdates.Count > 0); if (hasMoved) diff --git a/FFXIVClassic Map Server/actors/chara/Character.cs b/FFXIVClassic Map Server/actors/chara/Character.cs index f20bed1f..4d0d5c35 100644 --- a/FFXIVClassic Map Server/actors/chara/Character.cs +++ b/FFXIVClassic Map Server/actors/chara/Character.cs @@ -385,6 +385,15 @@ namespace FFXIVClassic_Map_Server.Actors } + public bool IsDead() + { + return currentMainState == SetActorStatePacket.MAIN_STATE_DEAD || currentMainState == SetActorStatePacket.MAIN_STATE_DEAD2; + } + + public bool IsAlive() + { + return !IsDead(); + } } } diff --git a/FFXIVClassic Map Server/actors/chara/ai/TargetFind.cs b/FFXIVClassic Map Server/actors/chara/ai/TargetFind.cs index 7a53177d..f33b36ff 100644 --- a/FFXIVClassic Map Server/actors/chara/ai/TargetFind.cs +++ b/FFXIVClassic Map Server/actors/chara/ai/TargetFind.cs @@ -4,16 +4,130 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using FFXIVClassic_Map_Server.Actors; +using FFXIVClassic.Common; + +// port of dsp's ai code https://github.com/DarkstarProject/darkstar/blob/master/src/map/ai/ namespace FFXIVClassic_Map_Server.actors.chara.ai { + [Flags] + enum TargetFindFlags : ushort + { + None, + All, // able to target players who arent in party + Alliance, // alliance + Pet, // allow targeting pets + ZoneWide, // + Dead, // allow targeting of dead players + } + + enum TargetFindCharacterType + { + None, + PlayerToPlayer, // player can target all players in party + PlayerToBattleNpc, // player can target all battlenpc (excluding player owned pets) + BattleNpcToBattleNpc, // battlenpc can target other battlenpcs + BattleNpcToPlayer, // battlenpc can target players + } + + enum TargetFindAOEType + { + None, + Circle, + Cone, + Box + } + + enum TargetFindAOERadiusType + { + Target, + Self + } + class TargetFind { private Character owner; + private Character target; + private TargetFindCharacterType findType; + private TargetFindFlags findFlags; + private TargetFindAOEType aoeType; + private Vector3 targetPosition; + private float range; + private float angle; + private List targets; public TargetFind(Character owner) { this.owner = owner; + Reset(); + } + + public void Reset() + { + this.target = null; + this.findType = TargetFindCharacterType.None; + this.findFlags = TargetFindFlags.None; + this.targetPosition = null; + this.range = 0.0f; + this.angle = 0.0f; + } + + public void SetAOEType(TargetFindAOEType type, float range = -1.0f, float angle = -1.0f) + { + aoeType = type; + range = range != -1.0f ? range : 0.0f; + angle = angle != -1.0f ? angle : 0.0f; + } + + public void FindTarget(Character target, TargetFindFlags flags) + { + findFlags = flags; + this.target = null; + this.targetPosition = new Vector3(target.positionX, target.positionY, target.positionZ); + + AddTarget(target, false); + } + + public void FindWithinArea(Character target, float radius, TargetFindFlags flags) + { + + } + + private void AddTarget(Character target, bool withPet) + { + if (CanTarget(target)) + targets.Add(target); + + // todo: add pets too + } + + private void AddAllInParty(Character target, bool withPet) + { + + } + + private void AddAllInAlliance(Character target, bool withPet) + { + + } + + public bool CanTarget(Character target) + { + // already targeted, dont target again + if (targets.Contains(target)) + return false; + + // cant target dead + if ((findFlags & TargetFindFlags.Dead) == 0 && target.IsDead()) + return false; + + // cant target if player is zoning + if (target is Player && ((Player)target).playerSession.isUpdatesLocked) + return false; + + + + return true; } } }