diff --git a/FFXIVClassic Map Server/actors/Actor.cs b/FFXIVClassic Map Server/actors/Actor.cs index 329af346..c4e5d034 100644 --- a/FFXIVClassic Map Server/actors/Actor.cs +++ b/FFXIVClassic Map Server/actors/Actor.cs @@ -540,7 +540,7 @@ namespace FFXIVClassic_Map_Server.Actors return zoneId; } - public bool IsFacing(float x, float y, byte checkAngle = 45) + public bool IsFacing(float x, float y) { var rot1 = this.rotation; @@ -554,6 +554,26 @@ namespace FFXIVClassic_Map_Server.Actors return rot1 == (float)dRot; } + public bool IsFacing(Actor target) + { + if (target == null) + { + Program.Log.Error("[{0}][{1}] IsFacing no target!", actorId, actorName); + return false; + } + + var rot1 = this.rotation; + + var dX = this.positionX - target.positionX; + var dY = this.positionY - target.positionY; + + var rot2 = Math.Atan2(dY, dX); + + var dRot = Math.PI - rot2 + Math.PI / 2; + + return rot1 == (float)dRot; + } + public void LookAt(Actor actor) { if (actor != null) diff --git a/FFXIVClassic Map Server/actors/area/Area.cs b/FFXIVClassic Map Server/actors/area/Area.cs index bbf8e916..eb6b837b 100644 --- a/FFXIVClassic Map Server/actors/area/Area.cs +++ b/FFXIVClassic Map Server/actors/area/Area.cs @@ -161,6 +161,8 @@ namespace FFXIVClassic_Map_Server.Actors public void UpdateActorPosition(Actor actor) { + this.hasMoved = true; + int gridX = (int)actor.positionX / boundingGridSize; int gridY = (int)actor.positionZ / boundingGridSize; @@ -202,7 +204,6 @@ namespace FFXIVClassic_Map_Server.Actors mActorBlock[gridOldX, gridOldY].Remove(actor); mActorBlock[gridX, gridY].Add(actor); } - this.hasMoved = true; } public List GetActorsAroundPoint(float x, float y, int checkDistance) diff --git a/FFXIVClassic Map Server/actors/chara/Character.cs b/FFXIVClassic Map Server/actors/chara/Character.cs index 8c9f0a7d..b3d79aeb 100644 --- a/FFXIVClassic Map Server/actors/chara/Character.cs +++ b/FFXIVClassic Map Server/actors/chara/Character.cs @@ -252,7 +252,7 @@ namespace FFXIVClassic_Map_Server.Actors { // make sure we dont tell player to despawn us twice targId = player.actorId; - player.QueuePacket(RemoveActorPacket.BuildPacket(player.actorId, actorId)); + //player.QueuePacket(RemoveActorPacket.BuildPacket(player.actorId, actorId)); } } this.isMovingToSpawn = true; @@ -268,6 +268,8 @@ namespace FFXIVClassic_Map_Server.Actors this.lastMoveUpdate = this.lastMoveUpdate.AddSeconds(-5); } } + Player closestPlayer = null; + float closestPlayerDistance = 1000.0f; foreach (var actor in zone.GetActorsAroundActor(this, 65)) { @@ -278,7 +280,7 @@ namespace FFXIVClassic_Map_Server.Actors // dont despawn again if we already told target to despawn us if (despawnOutOfRange && player.actorId != targId) { - player.QueuePacket(RemoveActorPacket.BuildPacket(player.actorId, this.actorId)); + //player.QueuePacket(RemoveActorPacket.BuildPacket(player.actorId, this.actorId)); continue; } @@ -289,43 +291,48 @@ namespace FFXIVClassic_Map_Server.Actors // find distance between self and target var distance = Utils.Distance(positionX, positionY, positionZ, player.positionX, player.positionY, player.positionZ); - int maxDistance = player == target ? 27 : 15; + int maxDistance = player == target ? 27 : 10; // check target isnt too far - if (distance <= maxDistance) + // todo: create cone thing for IsFacing + if (distance <= maxDistance && distance <= closestPlayerDistance && (IsFacing(player) || true)) { + closestPlayerDistance = distance; + closestPlayer = player; foundActor = true; - - if (!hasMoved) - { - if (distance >= 3) - { - FollowTarget(player, 2.4f, 5); - } - // too close, spread out - else if (distance <= 0.64f) - { - var minRadius = 0.65f; - var maxRadius = 0.85f; - - var angle = Program.Random.NextDouble() * Math.PI * 2; - var radius = Math.Sqrt(Program.Random.NextDouble() * (maxRadius - minRadius)) + minRadius; - - float x = (float)(radius * Math.Cos(angle)); - float z = (float)(radius * Math.Sin(angle)); - - positionUpdates.Add(new utils.Vector3(positionX + x, positionY, positionZ + z)); - - hasMoved = true; - } - - if (target != null) - { - LookAt(target); - } - } } - break; + } + } + + if (foundActor) + { + if (!hasMoved) + { + if (closestPlayerDistance >= 3) + { + FollowTarget(closestPlayer, 2.4f, 5); + } + // too close, spread out + else if (closestPlayerDistance <= 0.64f) + { + var minRadius = 0.65f; + var maxRadius = 0.85f; + + var angle = Program.Random.NextDouble() * Math.PI * 2; + var radius = Math.Sqrt(Program.Random.NextDouble() * (maxRadius - minRadius)) + minRadius; + + float x = (float)(radius * Math.Cos(angle)); + float z = (float)(radius * Math.Sin(angle)); + + positionUpdates.Add(new utils.Vector3(positionX + x, positionY, positionZ + z)); + + hasMoved = true; + } + + if (target != null) + { + LookAt(target); + } } } var diffMove = (DateTime.Now - lastMoveUpdate);