From eb17da1c893ed71db96de411a28e686a83a89f15 Mon Sep 17 00:00:00 2001 From: Filip Maj Date: Sat, 24 Jun 2017 15:31:42 -0400 Subject: [PATCH] Modified how directors work to allow for persistence. Implemented GuildleveDirector object and it's work values. --- FFXIVClassic Map Server/actors/area/Area.cs | 10 +- .../actors/chara/player/Player.cs | 11 +-- .../actors/director/Director.cs | 93 +++++++++++++++---- .../actors/director/GuildleveDirector.cs | 43 +++++++++ .../actors/director/Work/GuildleveWork.cs | 21 +++++ .../dataobjects/GuildleveData.cs | 4 +- FFXIVClassic Map Server/lua/LuaEngine.cs | 17 ++-- 7 files changed, 155 insertions(+), 44 deletions(-) create mode 100644 FFXIVClassic Map Server/actors/director/GuildleveDirector.cs create mode 100644 FFXIVClassic Map Server/actors/director/Work/GuildleveWork.cs diff --git a/FFXIVClassic Map Server/actors/area/Area.cs b/FFXIVClassic Map Server/actors/area/Area.cs index df792e0b..3478057b 100644 --- a/FFXIVClassic Map Server/actors/area/Area.cs +++ b/FFXIVClassic Map Server/actors/area/Area.cs @@ -490,15 +490,11 @@ namespace FFXIVClassic_Map_Server.Actors } } - public Director CreateDirector(string path) + public Director CreateDirector(string path, params object[] args) { lock (directorLock) { - Director director = new Director(directorIdCount, this, path); - - if (!director.IsCreated()) - return null; - + Director director = new Director(directorIdCount, this, path, args); currentDirectors.Add(directorIdCount, director); directorIdCount++; return director; @@ -511,7 +507,7 @@ namespace FFXIVClassic_Map_Server.Actors { if (currentDirectors.ContainsKey(id)) { - currentDirectors[id].RemoveChildren(); + currentDirectors[id].RemoveMembers(); currentDirectors.Remove(id); } } diff --git a/FFXIVClassic Map Server/actors/chara/player/Player.cs b/FFXIVClassic Map Server/actors/chara/player/Player.cs index 224865c8..10a23f9f 100644 --- a/FFXIVClassic Map Server/actors/chara/player/Player.cs +++ b/FFXIVClassic Map Server/actors/chara/player/Player.cs @@ -1420,14 +1420,7 @@ namespace FFXIVClassic_Map_Server.Actors if (!ownedDirectors.Contains(director)) { ownedDirectors.Add(director); - director.AddChild(this); - - if (spawnImmediatly) - { - director.GetSpawnPackets(actorId).DebugPrintPacket(); - QueuePacket(director.GetSpawnPackets(actorId)); - QueuePacket(director.GetInitPackets(actorId)); - } + director.AddMember(this); } } @@ -1443,7 +1436,7 @@ namespace FFXIVClassic_Map_Server.Actors if (!ownedDirectors.Contains(director)) { ownedDirectors.Remove(director); - director.RemoveChild(this); + director.RemoveMember(this); } } diff --git a/FFXIVClassic Map Server/actors/director/Director.cs b/FFXIVClassic Map Server/actors/director/Director.cs index 6db051b4..5170c978 100644 --- a/FFXIVClassic Map Server/actors/director/Director.cs +++ b/FFXIVClassic Map Server/actors/director/Director.cs @@ -15,23 +15,26 @@ namespace FFXIVClassic_Map_Server.actors.director { private uint directorId; private string directorScriptPath; - private List childrenOwners = new List(); + private List members = new List(); private bool isCreated = false; - public Director(uint id, Area zone, string directorPath) + private Script directorScript; + private Coroutine currentCoroutine; + + public Director(uint id, Area zone, string directorPath, params object[] args) : base((6 << 28 | zone.actorId << 19 | (uint)id)) { directorId = id; this.zone = zone; - directorScriptPath = directorPath; - DoActorInit(directorScriptPath); - GenerateActorName((int)id); + directorScriptPath = directorPath; + + LoadLuaScript(); eventConditions = new EventList(); eventConditions.noticeEventConditions = new List(); eventConditions.noticeEventConditions.Add(new EventList.NoticeEventCondition("noticeEvent", 0xE,0x0)); eventConditions.noticeEventConditions.Add(new EventList.NoticeEventCondition("noticeRequest", 0x0, 0x1)); - eventConditions.noticeEventConditions.Add(new EventList.NoticeEventCondition("reqForChild", 0x0, 0x1)); + eventConditions.noticeEventConditions.Add(new EventList.NoticeEventCondition("reqForChild", 0x0, 0x1)); } public override SubPacket CreateScriptBindPacket(uint playerActorId) @@ -80,40 +83,70 @@ namespace FFXIVClassic_Map_Server.actors.director public void OnCommandEvent(Player player, Command command) { LuaEngine.GetInstance().CallLuaFunction(player, this, "onCommandEvent", false, command); - } + } - public void DoActorInit(string directorPath) + public void StartDirector(bool spawnImmediate, params object[] args) { - List lparams = LuaEngine.GetInstance().CallLuaFunctionForReturn(null, this, "init", false); + object[] args2 = new object[args.Length + 1]; + args2[0] = this; + Array.Copy(args, 0, args2, 1, args.Length); + + List lparams = CallLuaScript("init", args2); if (lparams.Count >= 1 && lparams[0].value is string) { classPath = (string)lparams[0].value; className = classPath.Substring(classPath.LastIndexOf("/") + 1); + GenerateActorName((int)directorId); isCreated = true; } + + if (isCreated && spawnImmediate) + { + foreach (Player p in GetPlayerMembers()) + { + GetSpawnPackets(actorId).DebugPrintPacket(); + p.QueuePacket(GetSpawnPackets(actorId)); + p.QueuePacket(GetInitPackets(actorId)); + } + } } - public void AddChild(Actor actor) + public void AddMember(Actor actor) { - if (!childrenOwners.Contains(actor)) - childrenOwners.Add(actor); + if (!members.Contains(actor)) + members.Add(actor); } - public void RemoveChild(Actor actor) + public void RemoveMember(Actor actor) { - if (childrenOwners.Contains(actor)) - childrenOwners.Remove(actor); - if (childrenOwners.Count == 0) + if (members.Contains(actor)) + members.Remove(actor); + if (members.Count == 0) Server.GetWorldManager().GetZone(zoneId).DeleteDirector(actorId); } - public void RemoveChildren() + public void RemoveMembers() { - childrenOwners.Clear(); + members.Clear(); Server.GetWorldManager().GetZone(zoneId).DeleteDirector(actorId); } + public List GetMembers() + { + return members; + } + + public List GetPlayerMembers() + { + return members.FindAll(s => s is Player); + } + + public List GetNpcMembers() + { + return members.FindAll(s => s is Npc); + } + public bool IsCreated() { return isCreated; @@ -166,5 +199,29 @@ namespace FFXIVClassic_Map_Server.actors.director return directorScriptPath; } + private void LoadLuaScript() + { + string luaPath = String.Format(LuaEngine.FILEPATH_DIRECTORS, GetScriptPath()); + directorScript = LuaEngine.LoadScript(luaPath); + if (directorScript == null) + Program.Log.Error("Could not find script for director {0}.", GetName()); + } + + private List CallLuaScript(string funcName, params object[] args) + { + if (directorScript != null) + { + if (!directorScript.Globals.Get(funcName).IsNil()) + { + DynValue result = directorScript.Call(directorScript.Globals[funcName], args); + List lparams = LuaUtils.CreateLuaParamList(result); + return lparams; + } + else + Program.Log.Error("Could not find script for director {0}.", GetName()); + } + return null; + } + } } diff --git a/FFXIVClassic Map Server/actors/director/GuildleveDirector.cs b/FFXIVClassic Map Server/actors/director/GuildleveDirector.cs new file mode 100644 index 00000000..7ff4892b --- /dev/null +++ b/FFXIVClassic Map Server/actors/director/GuildleveDirector.cs @@ -0,0 +1,43 @@ +using FFXIVClassic_Map_Server.actors.director.Work; +using FFXIVClassic_Map_Server.Actors; +using FFXIVClassic_Map_Server.dataobjects; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FFXIVClassic_Map_Server.actors.director +{ + class GuildleveDirector : Director + { + public uint guildleveId; + public GuildleveData guildleveData; + public GuildleveWork guildleveWork = new GuildleveWork(); + + public GuildleveDirector(uint id, Area zone, string directorPath, uint guildleveId, params object[] args) + : base(id, zone, directorPath, args) + { + this.guildleveId = guildleveId; + this.guildleveData = Server.GetGuildleveGamedata(guildleveId); + + guildleveWork.aimNum[0] = guildleveData.aimNum[0]; + guildleveWork.aimNum[1] = guildleveData.aimNum[1]; + guildleveWork.aimNum[2] = guildleveData.aimNum[2]; + guildleveWork.aimNum[3] = guildleveData.aimNum[3]; + + guildleveWork.aimNumNow[0] = guildleveWork.aimNumNow[1] = guildleveWork.aimNumNow[2] = guildleveWork.aimNumNow[3] = 0; + } + + public void UpdateAimNum(int index, sbyte value) + { + + } + + public void updateUiState(int index, sbyte value) + { + + } + + } +} diff --git a/FFXIVClassic Map Server/actors/director/Work/GuildleveWork.cs b/FFXIVClassic Map Server/actors/director/Work/GuildleveWork.cs new file mode 100644 index 00000000..9d2990fc --- /dev/null +++ b/FFXIVClassic Map Server/actors/director/Work/GuildleveWork.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FFXIVClassic_Map_Server.actors.director.Work +{ + + class GuildleveWork + { + public uint startTime = 0; + public sbyte[] aimNum = new sbyte[4]; + public sbyte[] aimNumNow = new sbyte[4]; + public sbyte[] uiState = new sbyte[4]; + public float[] markerX = new float[3]; + public float[] markerY = new float[3]; + public float[] markerZ = new float[3]; + } + +} diff --git a/FFXIVClassic Map Server/dataobjects/GuildleveData.cs b/FFXIVClassic Map Server/dataobjects/GuildleveData.cs index 2c2cf64f..32834f07 100644 --- a/FFXIVClassic Map Server/dataobjects/GuildleveData.cs +++ b/FFXIVClassic Map Server/dataobjects/GuildleveData.cs @@ -31,8 +31,8 @@ namespace FFXIVClassic_Map_Server.dataobjects id = reader.GetUInt32("id"); classType = reader.GetUInt32("classType"); location = reader.GetUInt32("location"); - factionCreditRequired = reader.GetByte("factionCreditRequired"); - level = reader.GetByte("level"); + factionCreditRequired = reader.GetUInt16("factionCreditRequired"); + level = reader.GetUInt16("level"); aetheryte = reader.GetUInt32("aetheryte"); plateId = reader.GetUInt32("plateId"); borderId = reader.GetUInt32("borderId"); diff --git a/FFXIVClassic Map Server/lua/LuaEngine.cs b/FFXIVClassic Map Server/lua/LuaEngine.cs index dc1d2fe2..cf778c05 100644 --- a/FFXIVClassic Map Server/lua/LuaEngine.cs +++ b/FFXIVClassic Map Server/lua/LuaEngine.cs @@ -21,13 +21,13 @@ namespace FFXIVClassic_Map_Server.lua { class LuaEngine { - const string FILEPATH_PLAYER = "./scripts/player.lua"; - const string FILEPATH_ZONE = "./scripts/unique/{0}/zone.lua"; - const string FILEPATH_CONTENT = "./scripts/content/{0}.lua"; - const string FILEPATH_COMMANDS = "./scripts/commands/{0}.lua"; - const string FILEPATH_DIRECTORS = "./scripts/directors/{0}.lua"; - const string FILEPATH_NPCS = "./scripts/unique/{0}/{1}/{2}.lua"; - const string FILEPATH_QUEST = "./scripts/quests/{0}/{1}.lua"; + public const string FILEPATH_PLAYER = "./scripts/player.lua"; + public const string FILEPATH_ZONE = "./scripts/unique/{0}/zone.lua"; + public const string FILEPATH_CONTENT = "./scripts/content/{0}.lua"; + public const string FILEPATH_COMMANDS = "./scripts/commands/{0}.lua"; + public const string FILEPATH_DIRECTORS = "./scripts/directors/{0}.lua"; + public const string FILEPATH_NPCS = "./scripts/unique/{0}/{1}/{2}.lua"; + public const string FILEPATH_QUEST = "./scripts/quests/{0}/{1}.lua"; private static LuaEngine mThisEngine; private Dictionary mSleepingOnTime = new Dictionary(); @@ -576,13 +576,14 @@ namespace FFXIVClassic_Map_Server.lua script.Globals["GetStaticActorById"] = (Func)Server.GetStaticActors; script.Globals["GetWorldMaster"] = (Func)Server.GetWorldManager().GetActor; script.Globals["GetItemGamedata"] = (Func)Server.GetItemGamedata; + script.Globals["GetGuildleveGamedata"] = (Func)Server.GetGuildleveGamedata; script.Globals["GetLuaInstance"] = (Func)LuaEngine.GetInstance; script.Options.DebugPrint = s => { Program.Log.Debug(s); }; return script; } - private static void SendError(Player player, string message) + public static void SendError(Player player, string message) { message = "[LuaError] " + message; if (player == null)