moved ally engage stuff to ContentArea onUpdate

This commit is contained in:
Tahir Akhlaq 2017-10-11 19:23:40 +01:00
parent 520ae7a119
commit 27200b8df5
15 changed files with 115 additions and 98 deletions

View file

@ -61,7 +61,7 @@ namespace FFXIVClassic_Map_Server.Actors
public List<LuaParam> classParams;
public List<Vector3> positionUpdates;
public DateTime lastMoveUpdate;
protected DateTime lastUpdateScript;
protected DateTime lastUpdate;
public Actor target;

View file

@ -421,6 +421,11 @@ namespace FFXIVClassic_Map_Server.Actors
return GetAllActors<BattleNpc>();
}
public virtual List<Ally> GetAllies()
{
return GetAllActors<Ally>();
}
public void BroadcastPacketsAroundActor(Actor actor, List<SubPacket> packets)
{
foreach (SubPacket packet in packets)
@ -662,11 +667,14 @@ namespace FFXIVClassic_Map_Server.Actors
{
lock (mActorList)
{
foreach (Actor a in mActorList.Values)
foreach (Actor a in mActorList.Values.ToList())
a.Update(tick);
var deltaTime = (tick - Program.LastTick).TotalMilliseconds;
LuaEngine.GetInstance().CallLuaFunction(null, this, "onUpdate", true, deltaTime, this);
if ((tick - lastUpdateScript).TotalMilliseconds > 1500)
{
LuaEngine.GetInstance().CallLuaFunctionForReturn(LuaEngine.GetScriptPath(this), "onUpdate", true, this, tick);
lastUpdateScript = tick;
}
}
}

View file

@ -136,7 +136,6 @@ namespace FFXIVClassic_Map_Server.Actors
this.statusEffects = new StatusEffectContainer(this);
// todo: move this somewhere more appropriate
ResetMoveSpeeds();
// todo: base this on equip and shit
SetMod((uint)Modifier.AttackRange, 3);
SetMod((uint)Modifier.AttackDelay, (Program.Random.Next(30, 60) * 100));
@ -277,22 +276,8 @@ namespace FFXIVClassic_Map_Server.Actors
public void FollowTarget(Actor target, float stepSize = 1.2f, int maxPath = 25, float radius = 0.0f)
{
var player = target as Player;
if (player != null)
{
if (this.target != player)
{
this.target = target;
}
// todo: move this to own function thing
this.oldMoveState = this.moveState;
this.moveState = 2;
updateFlags |= ActorUpdateFlags.Position | ActorUpdateFlags.Speed;
//this.moveSpeeds = player.moveSpeeds;
PathTo(player.positionX, player.positionY, player.positionZ, stepSize, maxPath, radius);
}
if (target != null)
PathTo(target.positionX, target.positionY, target.positionZ, stepSize, maxPath, radius);
}
public Int64 GetMod(uint modifier)
@ -654,8 +639,10 @@ namespace FFXIVClassic_Map_Server.Actors
// todo: call onAttack/onDamageTaken
target.DelHP(action.amount);
if (target is BattleNpc)
{
((BattleNpc)target).lastAttacker = this;
((BattleNpc)target).hateContainer.UpdateHate(this, action.amount);
}
AddTP(115);
target.AddTP(100);
}
@ -754,7 +741,7 @@ namespace FFXIVClassic_Map_Server.Actors
public bool IsMonster()
{
return this is BattleNpc && !IsAlly();
return this is BattleNpc;
}
public bool IsPet()

View file

@ -39,15 +39,11 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai
{
if (!HasHateForTarget(target))
hateList.Add(target, new HateEntry(target, 1, 0, true));
else
Program.Log.Error($"{target.actorName} is already on [{owner.actorId}]{owner.actorName}'s hate list!");
}
public void UpdateHate(Character target, int damage)
{
if (!HasHateForTarget(target))
AddBaseHate(target);
AddBaseHate(target);
//hateList[target].volatileEnmity += (uint)damage;
hateList[target].cumulativeEnmity += (uint)damage;
}
@ -55,13 +51,9 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai
public void ClearHate(Character target = null)
{
if (target != null)
{
hateList.Remove(target);
}
else
{
hateList.Clear();
}
}
private void UpdateHate(HateEntry entry)

View file

@ -102,8 +102,6 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.controllers
owner.aiContainer.pathFind.PreparePath(owner.spawnX, owner.spawnY, owner.spawnZ, 1.5f, 10);
neutralTime = lastActionTime;
owner.hateContainer.ClearHate();
owner.ResetMoveSpeeds();
owner.moveState = 1;
lua.LuaEngine.CallLuaBattleFunction(owner, "onDisengage", owner, target, Utils.UnixTimeStampUTC(lastUpdate));
}
@ -203,7 +201,11 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.controllers
}
Move();
lua.LuaEngine.CallLuaBattleFunction(owner, "onCombatTick", owner, owner.target, Utils.UnixTimeStampUTC(tick), contentGroupCharas);
if ((tick - lastCombatTickScript).TotalSeconds > 2)
{
lua.LuaEngine.CallLuaBattleFunction(owner, "onCombatTick", owner, owner.target, Utils.UnixTimeStampUTC(tick), contentGroupCharas);
lastCombatTickScript = tick;
}
}
protected virtual void Move()

View file

@ -11,6 +11,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.controllers
{
protected Character owner;
protected DateTime lastCombatTickScript;
protected DateTime lastUpdate;
public bool canUpdate = true;
protected bool autoAttackEnabled = true;

View file

@ -38,7 +38,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.state
if (target == null || target.IsDead())
{
if (owner is BattleNpc)
if (owner.IsMonster() || owner.IsAlly())
target = ((BattleNpc)owner).hateContainer.GetMostHatedTarget();
}
else
@ -141,7 +141,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.state
// todo: shouldnt need to check if owner is dead since all states would be cleared
if (owner.IsDead() || target.IsDead())
{
if (owner is BattleNpc)
if (owner.IsMonster() || owner.IsAlly())
((BattleNpc)owner).hateContainer.ClearHate(target);
owner.aiContainer.ChangeTarget(null);

View file

@ -90,12 +90,7 @@ namespace FFXIVClassic_Map_Server.Actors
spawnY = posY;
spawnZ = posZ;
// todo: read these from db also
detectionType = DetectionType.Sight;
this.moveState = 2;
ResetMoveSpeeds();
despawnTime = 10;
respawnTime = 30;
CalculateBaseStats();
}
@ -245,19 +240,7 @@ namespace FFXIVClassic_Map_Server.Actors
{
if (respawnTime > 0)
{
base.Spawn(tick);
this.isMovingToSpawn = false;
this.ResetMoveSpeeds();
this.hateContainer.ClearHate();
zone.BroadcastPacketsAroundActor(this, GetSpawnPackets(null, 0x01));
zone.BroadcastPacketsAroundActor(this, GetInitPackets());
charaWork.parameterSave.hp = charaWork.parameterSave.hpMax;
charaWork.parameterSave.mp = charaWork.parameterSave.mpMax;
RecalculateStats();
OnSpawn();
updateFlags |= ActorUpdateFlags.AllNpc;
ForceRespawn();
}
}
@ -266,7 +249,6 @@ namespace FFXIVClassic_Map_Server.Actors
base.Spawn(Program.Tick);
this.isMovingToSpawn = false;
this.ResetMoveSpeeds();
this.hateContainer.ClearHate();
zone.BroadcastPacketsAroundActor(this, GetSpawnPackets(null, 0x01));
zone.BroadcastPacketsAroundActor(this, GetInitPackets());
@ -316,8 +298,6 @@ namespace FFXIVClassic_Map_Server.Actors
}
positionUpdates?.Clear();
aiContainer.InternalDie(tick, despawnTime);
this.ResetMoveSpeeds();
// todo: reset cooldowns
lua.LuaEngine.GetInstance().OnSignal("mobkill");

View file

@ -2188,6 +2188,7 @@ namespace FFXIVClassic_Map_Server.Actors
// todo: should just make a thing that updates the one slot cause this is dumb as hell
UpdateHotbarTimer(spell.id, spell.recastTimeSeconds);
LuaEngine.GetInstance().OnSignal("spellUse");
}
public override void OnWeaponSkill(State state, BattleAction[] actions, ref BattleAction[] errors)
@ -2199,8 +2200,16 @@ namespace FFXIVClassic_Map_Server.Actors
UpdateHotbarTimer(skill.id, skill.recastTimeSeconds);
// todo: this really shouldnt be called on each ws?
lua.LuaEngine.CallLuaBattleFunction(this, "onWeaponSkill", this, state.GetTarget(), skill);
LuaEngine.GetInstance().OnSignal("weaponskillUse");
}
public override void OnAbility(State state, BattleAction[] actions, ref BattleAction[] errors)
{
base.OnAbility(state, actions, ref errors);
LuaEngine.GetInstance().OnSignal("abilityUse");
}
//Handles exp being added, does not handle figuring out exp bonus from buffs or skill/link chains or any of that
public void AddExp(int exp, byte classId, int bonusPercent = 0)
{

View file

@ -259,7 +259,7 @@ namespace FFXIVClassic_Map_Server.lua
return -1;
}
private static string GetScriptPath(Actor target)
public static string GetScriptPath(Actor target)
{
if (target is Player)
{