mirror of
https://bitbucket.org/Ioncannon/project-meteor-server.git
synced 2025-04-22 04:37:47 +00:00
added a bit of targetfind stuff
This commit is contained in:
parent
c55c0b327d
commit
4ed8f3e5e2
3 changed files with 125 additions and 2 deletions
|
@ -150,7 +150,7 @@ namespace FFXIVClassic_Map_Server.Actors
|
||||||
return spawnPacket;
|
return spawnPacket;
|
||||||
}
|
}
|
||||||
|
|
||||||
public SubPacket CreatePositionUpdatePacket()
|
public SubPacket CreatePositionUpdatePacket(bool forceUpdate = false)
|
||||||
{
|
{
|
||||||
int updateMs = 300;
|
int updateMs = 300;
|
||||||
var diffTime = (DateTime.Now - lastMoveUpdate);
|
var diffTime = (DateTime.Now - lastMoveUpdate);
|
||||||
|
@ -160,7 +160,7 @@ namespace FFXIVClassic_Map_Server.Actors
|
||||||
updateMs = 150;
|
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);
|
hasMoved = (this.positionUpdates != null && this.positionUpdates.Count > 0);
|
||||||
if (hasMoved)
|
if (hasMoved)
|
||||||
|
|
|
@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,16 +4,130 @@ using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using FFXIVClassic_Map_Server.Actors;
|
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
|
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
|
class TargetFind
|
||||||
{
|
{
|
||||||
private Character owner;
|
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<Character> targets;
|
||||||
|
|
||||||
public TargetFind(Character owner)
|
public TargetFind(Character owner)
|
||||||
{
|
{
|
||||||
this.owner = 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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue