diff --git a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj index 2b5d91c4..5d30b233 100644 --- a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj +++ b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj @@ -88,7 +88,8 @@ - + + @@ -98,9 +99,10 @@ - + + diff --git a/FFXIVClassic Map Server/actors/Actor.cs b/FFXIVClassic Map Server/actors/Actor.cs index 845650b9..0c863301 100644 --- a/FFXIVClassic Map Server/actors/Actor.cs +++ b/FFXIVClassic Map Server/actors/Actor.cs @@ -643,9 +643,9 @@ namespace FFXIVClassic_Map_Server.Actors return currentSubState == SetActorStatePacket.SUB_STATE_PLAYER && this is Player ? ((Player)this) : null; } - public Mob GetAsMob() + public BattleNpc GetAsMob() { - return currentSubState == SetActorStatePacket.SUB_STATE_MONSTER && this is Mob ? ((Mob)this) : null; + return currentSubState == SetActorStatePacket.SUB_STATE_MONSTER && this is BattleNpc ? ((BattleNpc)this) : null; } public Npc GetAsNpc() diff --git a/FFXIVClassic Map Server/actors/area/Area.cs b/FFXIVClassic Map Server/actors/area/Area.cs index d59d47fe..1557486c 100644 --- a/FFXIVClassic Map Server/actors/area/Area.cs +++ b/FFXIVClassic Map Server/actors/area/Area.cs @@ -427,7 +427,7 @@ namespace FFXIVClassic_Map_Server.Actors Npc npc; if(isMob) - npc = new Mob(mActorList.Count + 1, actorClass, uniqueId, this, x, y, z, rot, state, animId, null); + npc = new BattleNpc(mActorList.Count + 1, actorClass, uniqueId, this, x, y, z, rot, state, animId, null); else npc = new Npc(mActorList.Count + 1, actorClass, uniqueId, this, x, y, z, rot, state, animId, null); diff --git a/FFXIVClassic Map Server/actors/chara/Character.cs b/FFXIVClassic Map Server/actors/chara/Character.cs index d128b66e..6e9576c5 100644 --- a/FFXIVClassic Map Server/actors/chara/Character.cs +++ b/FFXIVClassic Map Server/actors/chara/Character.cs @@ -203,11 +203,8 @@ namespace FFXIVClassic_Map_Server.Actors // time elapsed since last ai update - if (aiContainer != null) - { - this.aiContainer.Update(tick); - } - + this.aiContainer?.Update(tick); + /* var diffTime = (tick - lastAiUpdate); @@ -369,7 +366,21 @@ namespace FFXIVClassic_Map_Server.Actors } */ } - + public virtual void Spawn(DateTime tick) + { + + } + + public virtual void Die(DateTime tick) + { + + } + + protected virtual void Despawn(DateTime tick) + { + + } + } } diff --git a/FFXIVClassic Map Server/actors/chara/ai/AIContainer.cs b/FFXIVClassic Map Server/actors/chara/ai/AIContainer.cs index c2a77edb..094e5412 100644 --- a/FFXIVClassic Map Server/actors/chara/ai/AIContainer.cs +++ b/FFXIVClassic Map Server/actors/chara/ai/AIContainer.cs @@ -248,5 +248,16 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai { } + + public void InternalDie(DateTime tick, uint timeToFadeout) + { + + } + + public void InternalRaise(Character target) + { + // todo: place at target + // ForceChangeState(new RaiseState(target)); + } } } diff --git a/FFXIVClassic Map Server/actors/chara/ai/controllers/MobController.cs b/FFXIVClassic Map Server/actors/chara/ai/controllers/MobController.cs deleted file mode 100644 index acc4d754..00000000 --- a/FFXIVClassic Map Server/actors/chara/ai/controllers/MobController.cs +++ /dev/null @@ -1,63 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using FFXIVClassic_Map_Server.Actors; - -namespace FFXIVClassic_Map_Server.actors.chara.ai.controllers -{ - class MobController : Controller - { - public MobController(Character owner) - { - this.owner = owner; - this.lastUpdate = DateTime.Now; - } - - public override void Update(DateTime tick) - { - // todo: handle aggro/deaggro and other shit here - ((Mob)this.owner).statusEffects.Update(tick); - } - - public override bool Engage(Character target) - { - // todo: check distance, last swing time, status effects - this.owner.aiContainer.InternalEngage(target); - return true; - } - - private bool TryEngage(Character target) - { - // todo: - return true; - } - - public override bool Disengage() - { - // todo: - return true; - } - - public override void Cast(Character target, uint spellId) - { - - } - - public override void Ability(Character target, uint abilityId) - { - - } - - public override void RangedAttack(Character target) - { - - } - - public override void MobSkill(Character target, uint mobSkillId) - { - - } - } -} diff --git a/FFXIVClassic Map Server/actors/chara/ai/state/AttackState.cs b/FFXIVClassic Map Server/actors/chara/ai/state/AttackState.cs index 8f5b8931..ae486d89 100644 --- a/FFXIVClassic Map Server/actors/chara/ai/state/AttackState.cs +++ b/FFXIVClassic Map Server/actors/chara/ai/state/AttackState.cs @@ -48,7 +48,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.state public override void OnComplete() { - var damage = FFXIVClassic_Map_Server.actors.chara.ai.utils.AttackUtils.CalculateDamage(owner, target); + var damage = utils.AttackUtils.CalculateDamage(owner, target); lua.LuaEngine.GetInstance().CallLuaFunction(owner, target, "onAttack", false, damage); @@ -73,29 +73,29 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.state // todo: actually check proc rate/random chance of whatever effect effectId = list[0].GetEffectId(); } - this.errorPacket = BattleActionX01Packet.BuildPacket(target.actorId, owner.actorId, target.actorId, 0, effectId, 0, 0, 0, 0); - owner.zone.BroadcastPacketAroundActor(owner, errorPacket); - errorPacket = null; + // todo: which is actually the swing packet + //this.errorPacket = BattleActionX01Packet.BuildPacket(target.actorId, owner.actorId, target.actorId, 0, effectId, 0, (ushort)BattleActionX01PacketCommand.Attack, 0, 0); + //owner.zone.BroadcastPacketAroundActor(owner, errorPacket); + //errorPacket = null; interrupt = true; return; } - else if (target.zone != owner.zone) - { - interrupt = true; - return; - } - else if (owner.aiContainer.IsDead()) - { - // todo: this really shouldnt ever hit since we'd be clearing states on death - interrupt = true; - return; - } - interrupt = CanAttack(); + + interrupt = !CanAttack(); } private bool CanAttack() { - if (target.aiContainer.IsDead()) + // todo: shouldnt need to check if owner is dead since all states would be cleared + if (owner.aiContainer.IsDead() || target.aiContainer.IsDead()) + { + return false; + } + else if (target.zone != owner.zone) + { + return false; + } + else if (target is Player && ((Player)target).playerSession.isUpdatesLocked) { return false; } diff --git a/FFXIVClassic Map Server/actors/chara/npc/Mob.cs b/FFXIVClassic Map Server/actors/chara/npc/Mob.cs deleted file mode 100644 index 5c89488e..00000000 --- a/FFXIVClassic Map Server/actors/chara/npc/Mob.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using FFXIVClassic_Map_Server.Actors; -using FFXIVClassic_Map_Server.actors.chara.npc; -using FFXIVClassic_Map_Server.actors; -using FFXIVClassic_Map_Server.actors.chara; -using FFXIVClassic_Map_Server.actors.chara.ai; -using FFXIVClassic_Map_Server.actors.chara.ai.controllers; -using FFXIVClassic_Map_Server.packets.send.actor; - -namespace FFXIVClassic_Map_Server.Actors -{ - class Mob : Npc - { - public HateContainer hateContainer; - - public Mob(int actorNumber, ActorClass actorClass, string uniqueId, Area spawnedArea, float posX, float posY, float posZ, float rot, - ushort actorState, uint animationId, string customDisplayName) - : base(actorNumber, actorClass, uniqueId, spawnedArea, posX, posY, posZ, rot, actorState, animationId, customDisplayName) - { - this.aiContainer = new AIContainer(this, new MobController(this), new PathFind(this), new TargetFind(this)); - this.currentSubState = SetActorStatePacket.SUB_STATE_MONSTER; - this.hateContainer = new HateContainer(this); - } - } -} diff --git a/FFXIVClassic Map Server/lua/LuaEngine.cs b/FFXIVClassic Map Server/lua/LuaEngine.cs index e24f87f4..7a3e33e1 100644 --- a/FFXIVClassic Map Server/lua/LuaEngine.cs +++ b/FFXIVClassic Map Server/lua/LuaEngine.cs @@ -536,11 +536,12 @@ namespace FFXIVClassic_Map_Server.lua LuaParam.Insert(1, i - (playerNull ? 2 : 0)); // run the script - //script.Call(script.Globals["onTrigger"], LuaParam.ToArray()); + script.Call(script.Globals["onTrigger"], LuaParam.ToArray()); - Coroutine coroutine = script.CreateCoroutine(script.Globals["onTrigger"]).Coroutine; - DynValue value = coroutine.Resume(LuaParam.ToArray()); - GetInstance().ResolveResume(player, coroutine, value); + // gm commands dont need to be coroutines? + //Coroutine coroutine = script.CreateCoroutine(script.Globals["onTrigger"]).Coroutine; + //DynValue value = coroutine.Resume(LuaParam.ToArray()); + //ResolveResume(player, coroutine, value); return; } } diff --git a/FFXIVClassic Map Server/packets/send/Actor/battle/BattleActionX01Packet.cs b/FFXIVClassic Map Server/packets/send/Actor/battle/BattleActionX01Packet.cs index 17efb745..29ffec17 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/battle/BattleActionX01Packet.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/battle/BattleActionX01Packet.cs @@ -6,6 +6,12 @@ using FFXIVClassic.Common; namespace FFXIVClassic_Map_Server.packets.send.actor.battle { + // see xtx_command + enum BattleActionX01PacketCommand : ushort + { + Disengage = 12002, + Attack = 22104, + } class BattleActionX01Packet { public const ushort OPCODE = 0x0139;