From 62055eff04be4f44f646bae2b9f24adf95451f2c Mon Sep 17 00:00:00 2001 From: Tahir Akhlaq Date: Sun, 18 Jun 2017 22:01:55 +0100 Subject: [PATCH] stubbed some more functions from kj's ai stuff - fixed some typos - cleaned some debug code --- FFXIVClassic Map Server/actors/Actor.cs | 12 +- FFXIVClassic Map Server/actors/area/Area.cs | 2 +- FFXIVClassic Map Server/actors/area/Zone.cs | 2 +- .../actors/chara/Character.cs | 31 +--- .../actors/chara/ai/AIContainer.cs | 67 ++++++- .../actors/chara/ai/StatusEffects.cs | 11 +- .../actors/chara/ai/controllers/Controller.cs | 2 +- .../chara/ai/controllers/MobController.cs | 1 + .../actors/chara/ai/state/AttackState.cs | 3 +- .../actors/chara/ai/state/State.cs | 11 +- .../actors/chara/npc/Npc.cs | 1 + .../bin/Debug/scripts/commands/gm/yolo.lua | 169 ------------------ FFXIVClassic Map Server/lua/LuaEngine.cs | 8 +- 13 files changed, 97 insertions(+), 223 deletions(-) delete mode 100644 FFXIVClassic Map Server/bin/Debug/scripts/commands/gm/yolo.lua diff --git a/FFXIVClassic Map Server/actors/Actor.cs b/FFXIVClassic Map Server/actors/Actor.cs index 68db3c94..15b58d2c 100644 --- a/FFXIVClassic Map Server/actors/Actor.cs +++ b/FFXIVClassic Map Server/actors/Actor.cs @@ -368,17 +368,11 @@ namespace FFXIVClassic_Map_Server.Actors zone.BroadcastPacketAroundActor(this, ChangeSpeedPacket); } - public void Update(DateTime tick) + public virtual void Update(DateTime tick) { - if (this is Character) - { - ((Character)this).Update(tick); - } - else if (this is Zone) - { - ((Zone)this).Update(tick); - } + } + public void GenerateActorName(int actorNumber) { diff --git a/FFXIVClassic Map Server/actors/area/Area.cs b/FFXIVClassic Map Server/actors/area/Area.cs index 9878526e..806dd396 100644 --- a/FFXIVClassic Map Server/actors/area/Area.cs +++ b/FFXIVClassic Map Server/actors/area/Area.cs @@ -531,7 +531,7 @@ namespace FFXIVClassic_Map_Server.Actors return null; } - public void Update(DateTime tick) + public override void Update(DateTime tick) { lock (mActorList) { diff --git a/FFXIVClassic Map Server/actors/area/Zone.cs b/FFXIVClassic Map Server/actors/area/Zone.cs index 3c2a8168..78883593 100644 --- a/FFXIVClassic Map Server/actors/area/Zone.cs +++ b/FFXIVClassic Map Server/actors/area/Zone.cs @@ -163,7 +163,7 @@ namespace FFXIVClassic_Map_Server.actors.area } } - public void Update(DateTime tick) + public override void Update(DateTime tick) { // todo: again, this is retarded but debug stuff var diffTime = tick - lastUpdate; diff --git a/FFXIVClassic Map Server/actors/chara/Character.cs b/FFXIVClassic Map Server/actors/chara/Character.cs index 1966b67c..97e5caad 100644 --- a/FFXIVClassic Map Server/actors/chara/Character.cs +++ b/FFXIVClassic Map Server/actors/chara/Character.cs @@ -171,35 +171,6 @@ namespace FFXIVClassic_Map_Server.Actors { if (this.target != player) { - #region super important performance critical code - - this.ChangeState(SetActorStatePacket.MAIN_STATE_MOUNTED); - - var chatMode = Program.Random.Next(13); - var emphasis = Program.Random.Next(9); - var drag = Program.Random.Next(7); - - chatMode = chatMode.Clamp(1, 12); - - string oni = "ONI"; - string chan = "CHA"; - - for (var i = 0; i < emphasis; ++i) - oni += "I"; - - for (var i = 0; i < drag; ++i) - chan += "A"; - - oni += "-"; - chan += "N"; - - // imouto aggro - player.SendMessage((uint)chatMode, "Rowena", oni + chan); - // sing for onii - this.PlayAnimation(Program.Random.Next(0, 2) == 1 ? (uint)67111904 : (uint)67108902); - - #endregion - this.target = target; } this.moveState = player.moveState; @@ -221,7 +192,7 @@ namespace FFXIVClassic_Map_Server.Actors } } - public void Update(DateTime tick) + public override void Update(DateTime tick) { // todo: actual ai controllers // todo: mods to control different params instead of hardcode diff --git a/FFXIVClassic Map Server/actors/chara/ai/AIContainer.cs b/FFXIVClassic Map Server/actors/chara/ai/AIContainer.cs index 60f44983..45550ae6 100644 --- a/FFXIVClassic Map Server/actors/chara/ai/AIContainer.cs +++ b/FFXIVClassic Map Server/actors/chara/ai/AIContainer.cs @@ -47,6 +47,15 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai controller.Update(tick); } + public void CheckCompletedStates() + { + while (states.Count > 0 && states.Peek().IsCompleted()) + { + states.Peek().Cleanup(); + states.Pop(); + } + } + public void InterruptStates() { while (states.Count > 0 && states.Peek().CanInterrupt()) @@ -73,21 +82,51 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai public bool CanChangeState() { - return states.Count == 0 || states.First().CanInterrupt(); + return states.Count == 0 || states.Peek().CanInterrupt(); + } + + public void ChangeTarget(Character target) + { + if (controller != null) + { + controller.ChangeTarget(target); + } } public void ChangeState(State state) { - if (states.Count < 10) + if (GetCurrentState() != null) { + if (states.Count <= 10) + { + CheckCompletedStates(); + states.Push(state); + } + else + { + throw new Exception("shit"); + } + } + } + + public void ForceChangeState(State state) + { + if (states.Count <= 10) + { + CheckCompletedStates(); states.Push(state); } else { - throw new Exception("shit"); + throw new Exception("force shit"); } } + public State GetCurrentState() + { + return states.Peek() ?? null; + } + public DateTime GetLatestUpdate() { return latestUpdate; @@ -157,11 +196,31 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai InternalMobSkill(target, mobSkillId); } - public void InternalEngage(Character target) + public void InternalChangeTarget(Character target) { } + public bool InternalEngage(Character target) + { + if (IsEngaged()) + { + if (this.owner.target != target) + { + ChangeTarget(target); + return true; + } + return false; + } + + if (CanChangeState() || (GetCurrentState() != null && GetCurrentState().IsCompleted())) + { + ForceChangeState(new AttackState(this.owner, target)); + return true; + } + return false; + } + public void InternalDisengage() { diff --git a/FFXIVClassic Map Server/actors/chara/ai/StatusEffects.cs b/FFXIVClassic Map Server/actors/chara/ai/StatusEffects.cs index 371817dd..33311cf8 100644 --- a/FFXIVClassic Map Server/actors/chara/ai/StatusEffects.cs +++ b/FFXIVClassic Map Server/actors/chara/ai/StatusEffects.cs @@ -363,7 +363,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai private byte tier; // same effect with higher tier overwrites this private Dictionary variables; // list of variables which belong to this effect, to be set/retrieved with GetVariable(key), SetVariable(key, val) private StatusEffectFlags flags; // death/erase/dispel etc - private StatusEffectOverwrite overwrite; // + private StatusEffectOverwrite overwrite; // how to handle adding an effect with same id (see StatusEfectOverwrite) public StatusEffect(Character owner, uint id, int magnitude, uint tickMs, uint durationMs, byte tier = 0) { @@ -602,5 +602,14 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai return list; } + public bool HasStatusEffectsByFlag(uint flag) + { + foreach (var effect in effects) + { + if ((effect.GetFlags() & flag) > 0) + return true; + } + return false; + } } } diff --git a/FFXIVClassic Map Server/actors/chara/ai/controllers/Controller.cs b/FFXIVClassic Map Server/actors/chara/ai/controllers/Controller.cs index 3f237d9e..50566f15 100644 --- a/FFXIVClassic Map Server/actors/chara/ai/controllers/Controller.cs +++ b/FFXIVClassic Map Server/actors/chara/ai/controllers/Controller.cs @@ -33,7 +33,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.controllers public virtual void ChangeTarget(Character target) { - owner.aiContainer.InternalEngage(target); + owner.aiContainer.InternalChangeTarget(target); } public bool IsAutoAttackEnabled() diff --git a/FFXIVClassic Map Server/actors/chara/ai/controllers/MobController.cs b/FFXIVClassic Map Server/actors/chara/ai/controllers/MobController.cs index f97e76b5..acc4d754 100644 --- a/FFXIVClassic Map Server/actors/chara/ai/controllers/MobController.cs +++ b/FFXIVClassic Map Server/actors/chara/ai/controllers/MobController.cs @@ -24,6 +24,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.controllers public override bool Engage(Character target) { // todo: check distance, last swing time, status effects + this.owner.aiContainer.InternalEngage(target); return true; } diff --git a/FFXIVClassic Map Server/actors/chara/ai/state/AttackState.cs b/FFXIVClassic Map Server/actors/chara/ai/state/AttackState.cs index ed2c659d..84f04227 100644 --- a/FFXIVClassic Map Server/actors/chara/ai/state/AttackState.cs +++ b/FFXIVClassic Map Server/actors/chara/ai/state/AttackState.cs @@ -13,6 +13,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.state base(owner, target) { this.startTime = DateTime.Now; + // todo: should handle everything here instead of on next tick.. } public override void OnStart() @@ -32,7 +33,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.state public override void OnComplete() { - + isCompleted = true; } public override void TryInterrupt() diff --git a/FFXIVClassic Map Server/actors/chara/ai/state/State.cs b/FFXIVClassic Map Server/actors/chara/ai/state/State.cs index d3cde4e3..f3f1cd42 100644 --- a/FFXIVClassic Map Server/actors/chara/ai/state/State.cs +++ b/FFXIVClassic Map Server/actors/chara/ai/state/State.cs @@ -20,6 +20,8 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.state protected SubPacket errorPacket; + protected bool isCompleted; + public State(Character owner, Character target) { this.owner = owner; @@ -29,9 +31,9 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.state } public virtual void Update(DateTime tick) { } - public virtual void OnStart() { } + public virtual void OnStart() { } public virtual void OnInterrupt() { } - public virtual void OnComplete() { } + public virtual void OnComplete() { isCompleted = true; } public virtual void TryInterrupt() { } @@ -47,5 +49,10 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.state this.interrupt = interrupt; } + public bool IsCompleted() + { + return isCompleted; + } + } } diff --git a/FFXIVClassic Map Server/actors/chara/npc/Npc.cs b/FFXIVClassic Map Server/actors/chara/npc/Npc.cs index 90eb7916..e71cb714 100644 --- a/FFXIVClassic Map Server/actors/chara/npc/Npc.cs +++ b/FFXIVClassic Map Server/actors/chara/npc/Npc.cs @@ -85,6 +85,7 @@ namespace FFXIVClassic_Map_Server.Actors isStatic = true; } } + GenerateActorName((int)actorNumber); this.aiContainer = new AIContainer(this, null, new PathFind(this), new TargetFind(this)); } diff --git a/FFXIVClassic Map Server/bin/Debug/scripts/commands/gm/yolo.lua b/FFXIVClassic Map Server/bin/Debug/scripts/commands/gm/yolo.lua deleted file mode 100644 index 9d2c364f..00000000 --- a/FFXIVClassic Map Server/bin/Debug/scripts/commands/gm/yolo.lua +++ /dev/null @@ -1,169 +0,0 @@ -require("global"); - -properties = { - permissions = 0, - parameters = "ssss", - description = -[[ -yolo -]], -} - -local quests = -{ - [111807] = { level = 25, weight = 4, rewardexp = 1080 }, - [110868] = { level = 50, weight = 4, rewardexp = 4400 }, - [111603] = { level = 22, weight = 5, rewardexp = 1100 }, - [111602] = { level = 22, weight = 5, rewardexp = 1100 }, - [111420] = { level = 45, weight = 5, rewardexp = 4450 }, - [110811] = { level = 18, weight = 6, rewardexp = 780 }, - [110814] = { level = 18, weight = 6, rewardexp = 780 }, - [110707] = { level = 25, weight = 6, rewardexp = 1620 }, - [110682] = { level = 34, weight = 6, rewardexp = 3180 }, - [111202] = { level = 35, weight = 6, rewardexp = 3360 }, - [111222] = { level = 35, weight = 6, rewardexp = 3360 }, - [111302] = { level = 35, weight = 6, rewardexp = 3360 }, - [111223] = { level = 40, weight = 6, rewardexp = 4260 }, - [110819] = { level = 45, weight = 6, rewardexp = 5340 }, - [111224] = { level = 45, weight = 6, rewardexp = 5340 }, - [111225] = { level = 45, weight = 6, rewardexp = 5340 }, - [110867] = { level = 45, weight = 6, rewardexp = 5340 }, - [110869] = { level = 45, weight = 6, rewardexp = 5340 }, - [110708] = { level = 45, weight = 6, rewardexp = 5340 }, - [110627] = { level = 45, weight = 6, rewardexp = 5340 }, - [111434] = { level = 50, weight = 6, rewardexp = 6600 }, - [110850] = { level = 1, weight = 7, rewardexp = 40 }, - [110851] = { level = 1, weight = 7, rewardexp = 40 }, - [110841] = { level = 20, weight = 7, rewardexp = 1120 }, - [110642] = { level = 20, weight = 7, rewardexp = 1120 }, - [110840] = { level = 20, weight = 7, rewardexp = 1120 }, - [110727] = { level = 21, weight = 7, rewardexp = 1401 }, - [111221] = { level = 30, weight = 7, rewardexp = 2661 }, - [111241] = { level = 30, weight = 7, rewardexp = 2661 }, - [110687] = { level = 28, weight = 9, rewardexp = 2970 }, - [110016] = { level = 34, weight = 50, rewardexp = 26500 }, - [110017] = { level = 38, weight = 50, rewardexp = 32500 }, - [110019] = { level = 46, weight = 50, rewardexp = 46000 } -}; - -local expTable = { - 570, -- 1 - 700, - 880, - 1100, - 1500, - 1800, - 2300, - 3200, - 4300, - 5000, -- 10 - 5900, - 6800, - 7700, - 8700, - 9700, - 11000, - 12000, - 13000, - 15000, - 16000, -- 20 - 20000, - 22000, - 23000, - 25000, - 27000, - 29000, - 31000, - 33000, - 35000, - 38000, -- 30 - 45000, - 47000, - 50000, - 53000, - 56000, - 59000, - 62000, - 65000, - 68000, - 71000, -- 40 - 74000, - 78000, - 81000, - 85000, - 89000, - 92000, - 96000, - 100000, - 100000, - 110000 -- 50 -}; - -local commandCost = { - ["raise"] = 150, - ["cure"] = 40, - ["cura"] = 100, - ["curaga"] = 150, -}; --- stone: (1, 9) (5, 12) (10, ) --- cure: (1, 5) (5, 6) (10, ) --- aero: (1, 9) (5, 12) (10, ) --- protect: (1, 9) (5, 12) (10, ) ---[[ -function onTrigger(player, argc, id, level, weight) - id = tonumber(id) or 111807; - level = tonumber(level) or quests[id].level; - weight = tonumber(weight) or quests[id].weight; - local messageId = MESSAGE_TYPE_SYSTEM_ERROR; - local sender = "yolo"; - - if id == 1 then - return - end - local message = calcSkillPoint(player, level, weight); - if player then - player.SendMessage(messageId, sender, string.format("calculated %s | expected %s", message, quests[id].rewardexp)); - end; - printf("calculated %s | expected %s", message, quests[id].rewardexp); -end; -]] - -function onTrigger(player, argc, skillName, level) - local messageId = MESSAGE_TYPE_SYSTEM_ERROR; - local sender = "yolo"; - if player then - local pos = player:GetPos(); - local x = tonumber(pos[0]); - local y = tonumber(pos[1]); - local z = tonumber(pos[2]); - local rot = tonumber(pos[3]); - local zone = pos[4]; - - printf("%f %f %f", x, y, z); - --local x, y, z = player.GetPos(); - for i = 1, 1 do - - local actor = player.GetZone().SpawnActor(1000070, 'ass', x-(13 + 2*i), y, z); - - actor.FollowTarget(player, 3.2); - end; - return; - end - level = tonumber(level) or 1; - if player then - player.SendMessage(messageId, sender, string.format("name %s | cost %d | level %u", skillName, calculateCommandCost(player, skillName, level), level)); - end; -end; - -function calculateCommandCost(player, skillName, level) - if skillName and level and commandCost[skillName] then - return math.ceil((8000 + (level - 70) * 500) * (commandCost[skillName] * 0.001)); - end; - return 1; -end - -function calcSkillPoint(player, lvl, weight) - weight = weight / 100 - - return math.ceil(expTable[lvl] * weight) -end \ No newline at end of file diff --git a/FFXIVClassic Map Server/lua/LuaEngine.cs b/FFXIVClassic Map Server/lua/LuaEngine.cs index c3c77720..65f146d3 100644 --- a/FFXIVClassic Map Server/lua/LuaEngine.cs +++ b/FFXIVClassic Map Server/lua/LuaEngine.cs @@ -533,11 +533,11 @@ 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); + Coroutine coroutine = script.CreateCoroutine(script.Globals["onTrigger"]).Coroutine; + DynValue value = coroutine.Resume(LuaParam.ToArray()); + GetInstance().ResolveResume(player, coroutine, value); return; } }