diff --git a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj index 08a41bec..99ceaa98 100644 --- a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj +++ b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj @@ -110,7 +110,6 @@ - diff --git a/FFXIVClassic Map Server/actors/chara/player/Player.cs b/FFXIVClassic Map Server/actors/chara/player/Player.cs index 2b615e58..00608e38 100644 --- a/FFXIVClassic Map Server/actors/chara/player/Player.cs +++ b/FFXIVClassic Map Server/actors/chara/player/Player.cs @@ -88,7 +88,10 @@ namespace FFXIVClassic_Map_Server.Actors 74000, 78000, 81000, 85000, 89000, 92000, 96000, 100000, 100000, 110000}; //Level <= 50 //Event Related - private Stack runningEvents = new Stack(); + public uint currentEventOwner = 0; + public string currentEventName = ""; + + public Coroutine currentEventRunning; //Player Info public uint destinationZone; @@ -1675,24 +1678,19 @@ namespace FFXIVClassic_Map_Server.Actors public void StartEvent(Actor owner, EventStartPacket start) { - GameEvent startedEvent = new GameEvent(start.triggerName, this, owner); - runningEvents.Push(startedEvent); - LuaEngine.GetInstance().EventStarted(startedEvent, start); + LuaEngine.GetInstance().EventStarted(this, owner, start); } public void UpdateEvent(EventUpdatePacket update) { - GameEvent updateEvent = runningEvents.Peek(); - LuaEngine.GetInstance().OnEventUpdate(updateEvent, update.luaParams); - } + LuaEngine.GetInstance().OnEventUpdate(this, update.luaParams); + } public void KickEvent(Actor actor, string conditionName, params object[] parameters) { if (actor == null) return; - runningEvents.Pop(); - List lParams = LuaUtils.CreateLuaParamList(parameters); SubPacket spacket = KickEventPacket.BuildPacket(actorId, actor.actorId, 0x75dc1705, conditionName, lParams); spacket.DebugPrintSubPacket(); @@ -1704,8 +1702,6 @@ namespace FFXIVClassic_Map_Server.Actors if (actor == null) return; - runningEvents.Pop(); - List lParams = LuaUtils.CreateLuaParamList(parameters); SubPacket spacket = KickEventPacket.BuildPacket(actorId, actor.actorId, unknown, conditionName, lParams); spacket.DebugPrintSubPacket(); @@ -1715,22 +1711,25 @@ namespace FFXIVClassic_Map_Server.Actors public void SetEventStatus(Actor actor, string conditionName, bool enabled, byte unknown) { QueuePacket(packets.send.actor.events.SetEventStatus.BuildPacket(actor.actorId, enabled, unknown, conditionName)); - } + } public void RunEventFunction(string functionName, params object[] parameters) { List lParams = LuaUtils.CreateLuaParamList(parameters); - SubPacket spacket = RunEventFunctionPacket.BuildPacket(actorId, runningEvents.Peek().GetOwnerActorId(), runningEvents.Peek().GetEventName(), functionName, lParams); + SubPacket spacket = RunEventFunctionPacket.BuildPacket(actorId, currentEventOwner, currentEventName, functionName, lParams); spacket.DebugPrintSubPacket(); QueuePacket(spacket); } public void EndEvent() { - GameEvent endingEvent = runningEvents.Pop(); - SubPacket p = EndEventPacket.BuildPacket(actorId, endingEvent.GetOwnerActorId(), endingEvent.GetEventName()); + SubPacket p = EndEventPacket.BuildPacket(actorId, currentEventOwner, currentEventName); p.DebugPrintSubPacket(); QueuePacket(p); + + currentEventOwner = 0; + currentEventName = ""; + currentEventRunning = null; } public void SendInstanceUpdate() diff --git a/FFXIVClassic Map Server/dataobjects/GameEvent.cs b/FFXIVClassic Map Server/dataobjects/GameEvent.cs deleted file mode 100644 index f0815a83..00000000 --- a/FFXIVClassic Map Server/dataobjects/GameEvent.cs +++ /dev/null @@ -1,65 +0,0 @@ -using FFXIVClassic_Map_Server.Actors; -using MoonSharp.Interpreter; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace FFXIVClassic_Map_Server.dataobjects -{ - class GameEvent - { - private string eventName; - private uint ownerActorId; - private Player playerActor; - private Actor ownerActor; - private Coroutine coroutine; - private uint hashCode; - - public GameEvent(String eventName, Player player, Actor owner) - { - this.eventName = eventName; - this.playerActor = player; - this.ownerActor = owner; - this.ownerActorId = owner.actorId; - hashCode = (uint)new Tuple(player.actorId, owner.actorId, eventName).GetHashCode(); - } - - public string GetEventName() - { - return eventName; - } - - public uint GetOwnerActorId() - { - return ownerActorId; - } - - public Player GetPlayerActor() - { - return playerActor; - } - - public Actor GetOwnerActor() - { - return ownerActor; - } - - public Coroutine GetCoroutine() - { - return coroutine; - } - - public void SetCoroutine(Coroutine coroutine) - { - this.coroutine = coroutine; - } - - public uint GetUniqueEventId() - { - return hashCode; - } - - } -} diff --git a/FFXIVClassic Map Server/lua/LuaEngine.cs b/FFXIVClassic Map Server/lua/LuaEngine.cs index bdf3b515..0659bdde 100644 --- a/FFXIVClassic Map Server/lua/LuaEngine.cs +++ b/FFXIVClassic Map Server/lua/LuaEngine.cs @@ -36,6 +36,7 @@ namespace FFXIVClassic_Map_Server.lua private Timer luaTimer; + private LuaEngine() { UserData.RegistrationPolicy = InteropRegistrationPolicy.Automatic; @@ -101,31 +102,31 @@ namespace FFXIVClassic_Map_Server.lua } foreach (Coroutine key in mToAwake) - { + { DynValue value = key.Resume(); ResolveResume(null, key, value); } } - public void OnEventUpdate(GameEvent gEvent, List args) + public void OnEventUpdate(Player player, List args) { - if (mSleepingOnPlayerEvent.ContainsKey(gEvent.GetUniqueEventId())) + if (mSleepingOnPlayerEvent.ContainsKey(player.actorId)) { try { - Coroutine coroutine = mSleepingOnPlayerEvent[gEvent.GetUniqueEventId()]; - mSleepingOnPlayerEvent.Remove(gEvent.GetUniqueEventId()); + Coroutine coroutine = mSleepingOnPlayerEvent[player.actorId]; + mSleepingOnPlayerEvent.Remove(player.actorId); DynValue value = coroutine.Resume(LuaUtils.CreateLuaParamObjectList(args)); - ResolveResume(gEvent.GetPlayerActor(), coroutine, value); + ResolveResume(player, coroutine, value); } catch (ScriptRuntimeException e) { - LuaEngine.SendError(gEvent.GetPlayerActor(), String.Format("OnEventUpdated: {0}", e.DecoratedMessage)); - gEvent.GetPlayerActor().EndEvent(); + LuaEngine.SendError(player, String.Format("OnEventUpdated: {0}", e.DecoratedMessage)); + player.EndEvent(); } } else - gEvent.GetPlayerActor().EndEvent(); + player.EndEvent(); } private static string GetScriptPath(Actor target) @@ -214,7 +215,7 @@ namespace FFXIVClassic_Map_Server.lua private void CallLuaFunctionNpc(Player player, Npc target, string funcName, bool optional, params object[] args) { - object[] args2 = new object[args.Length + (player == null ? 1:2)]; + object[] args2 = new object[args.Length + (player == null ? 1 : 2)]; Array.Copy(args, 0, args2, (player == null ? 1 : 2), args.Length); if (player != null) { @@ -265,7 +266,7 @@ namespace FFXIVClassic_Map_Server.lua catch (ScriptRuntimeException e) { SendError(player, e.DecoratedMessage); - } + } } } @@ -290,9 +291,9 @@ namespace FFXIVClassic_Map_Server.lua if (script != null) { if (!script.Globals.Get(funcName).IsNil()) - { + { //Run Script - DynValue result = script.Call(script.Globals[funcName], args2); + DynValue result = script.Call(script.Globals[funcName], args2); List lparams = LuaUtils.CreateLuaParamList(result); return lparams; } @@ -322,7 +323,7 @@ namespace FFXIVClassic_Map_Server.lua DynValue result = script.Call(script.Globals[funcName], args); List lparams = LuaUtils.CreateLuaParamList(result); return lparams; - } + } } return null; } @@ -361,36 +362,36 @@ namespace FFXIVClassic_Map_Server.lua { if (!(target is Area) && !optional) SendError(player, String.Format("Could not find script for actor {0}.", target.GetName())); - } + } } - public void EventStarted(GameEvent gEvent, EventStartPacket eventStart) + public void EventStarted(Player player, Actor target, EventStartPacket eventStart) { List lparams = eventStart.luaParams; lparams.Insert(0, new LuaParam(2, eventStart.triggerName)); - - if (mSleepingOnPlayerEvent.ContainsKey(gEvent.GetUniqueEventId())) + if (mSleepingOnPlayerEvent.ContainsKey(player.actorId)) { - Coroutine coroutine = mSleepingOnPlayerEvent[gEvent.GetUniqueEventId()]; - mSleepingOnPlayerEvent.Remove(gEvent.GetUniqueEventId()); + Coroutine coroutine = mSleepingOnPlayerEvent[player.actorId]; + mSleepingOnPlayerEvent.Remove(player.actorId); - try{ + try + { DynValue value = coroutine.Resume(); - ResolveResume(null, coroutine, value); + ResolveResume(null, coroutine, value); } catch (ScriptRuntimeException e) { - LuaEngine.SendError(gEvent.GetPlayerActor(), String.Format("OnEventStarted: {0}", e.DecoratedMessage)); - gEvent.GetPlayerActor().EndEvent(); - } + LuaEngine.SendError(player, String.Format("OnEventStarted: {0}", e.DecoratedMessage)); + player.EndEvent(); + } } else { - if (gEvent.GetOwnerActor() is Director) - ((Director)gEvent.GetOwnerActor()).OnEventStart(gEvent.GetPlayerActor(), LuaUtils.CreateLuaParamObjectList(lparams)); + if (target is Director) + ((Director)target).OnEventStart(player, LuaUtils.CreateLuaParamObjectList(lparams)); else - CallLuaFunction(gEvent.GetPlayerActor(), gEvent.GetOwnerActor(), "onEventStarted", false, LuaUtils.CreateLuaParamObjectList(lparams)); - } + CallLuaFunction(player, target, "onEventStarted", false, LuaUtils.CreateLuaParamObjectList(lparams)); + } } public DynValue ResolveResume(Player player, Coroutine coroutine, DynValue value) @@ -399,8 +400,8 @@ namespace FFXIVClassic_Map_Server.lua return value; if (player != null && value.String != null && value.String.Equals("_WAIT_EVENT")) - { - GetInstance().AddWaitEventCoroutine(player, coroutine); + { + GetInstance().AddWaitEventCoroutine(player, coroutine); } else if (value.Tuple != null && value.Tuple.Length >= 1 && value.Tuple[0].String != null) { @@ -428,7 +429,7 @@ namespace FFXIVClassic_Map_Server.lua { bool playerNull = player == null; if (playerNull && param.Length >= 3) - player = Server.GetWorldManager().GetPCInWorld(param[1] + " " + param[2]); + player = Server.GetWorldManager().GetPCInWorld(param[1] + " " + param[2]); // load from scripts/commands/gm/ directory var path = String.Format("./scripts/commands/gm/{0}.lua", cmd.ToLower()); @@ -611,9 +612,8 @@ namespace FFXIVClassic_Map_Server.lua return; List SendError = new List(); player.SendMessage(SendMessagePacket.MESSAGE_TYPE_SYSTEM_ERROR, "", message); - player.EndEvent(); + player.QueuePacket(EndEventPacket.BuildPacket(player.actorId, player.currentEventOwner, player.currentEventName)); } - + } } - \ No newline at end of file