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;