From b68d13ea7fe841d44285f13f0d516955c4d343f0 Mon Sep 17 00:00:00 2001 From: Filip Maj Date: Sat, 2 Apr 2016 17:56:01 -0400 Subject: [PATCH] Cleaned up the lua calls and renamed "onInstantiation" to "init". Added a "onSpawn" callback but still working on it. Added the "ActorSpecialGraphicPacket" and functions to use it. --- .../FFXIVClassic Map Server.csproj | 1 + .../actors/chara/Character.cs | 7 ++ .../actors/chara/npc/Npc.cs | 2 +- .../actors/chara/player/Player.cs | 11 +++ .../dataobjects/ConnectedPlayer.cs | 1 + FFXIVClassic Map Server/lua/LuaEngine.cs | 92 ++++++++++--------- .../send/Actor/ActorSpecialGraphicPacket.cs | 36 ++++++++ 7 files changed, 108 insertions(+), 42 deletions(-) create mode 100644 FFXIVClassic Map Server/packets/send/Actor/ActorSpecialGraphicPacket.cs diff --git a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj index 27a9891d..2ecccff3 100644 --- a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj +++ b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj @@ -134,6 +134,7 @@ + diff --git a/FFXIVClassic Map Server/actors/chara/Character.cs b/FFXIVClassic Map Server/actors/chara/Character.cs index 8ada9422..dd5f5266 100644 --- a/FFXIVClassic Map Server/actors/chara/Character.cs +++ b/FFXIVClassic Map Server/actors/chara/Character.cs @@ -81,6 +81,13 @@ namespace FFXIVClassic_Map_Server.Actors return SetActorIdleAnimationPacket.buildPacket(actorId, playerActorId, animationId); } + public void setQuestIcon(Player player, bool hasIcon) + { + ActorSpecialGraphicPacket.buildPacket(player.actorId, actorId, hasIcon ? ActorSpecialGraphicPacket.QUEST : 0x0).debugPrintSubPacket(); + //player.queuePacket(ActorSpecialGraphicPacket.buildPacket(player.actorId, actorId, hasIcon ? ActorSpecialGraphicPacket.QUEST : 0x0)); + + } + } } diff --git a/FFXIVClassic Map Server/actors/chara/npc/Npc.cs b/FFXIVClassic Map Server/actors/chara/npc/Npc.cs index 9e43c677..f84b4e24 100644 --- a/FFXIVClassic Map Server/actors/chara/npc/Npc.cs +++ b/FFXIVClassic Map Server/actors/chara/npc/Npc.cs @@ -50,7 +50,7 @@ namespace FFXIVClassic_Map_Server.Actors List lParams; Player player = Server.GetWorldManager().GetPCInWorld(playerActorId); - lParams = LuaEngine.doActorOnInstantiate(player, this); + lParams = LuaEngine.doActorInstantiate(player, this); if (lParams == null) { diff --git a/FFXIVClassic Map Server/actors/chara/player/Player.cs b/FFXIVClassic Map Server/actors/chara/player/Player.cs index 9ef1b188..bcb44705 100644 --- a/FFXIVClassic Map Server/actors/chara/player/Player.cs +++ b/FFXIVClassic Map Server/actors/chara/player/Player.cs @@ -965,6 +965,17 @@ namespace FFXIVClassic_Map_Server.Actors return null; } + public Quest getQuest(string name) + { + for (int i = 0; i < questScenario.Length; i++) + { + if (questScenario[i] != null && questScenario[i].actorName.Equals(name)) + return questScenario[i]; + } + + return null; + } + public bool hasQuest(uint id) { for (int i = 0; i < questScenario.Length; i++) diff --git a/FFXIVClassic Map Server/dataobjects/ConnectedPlayer.cs b/FFXIVClassic Map Server/dataobjects/ConnectedPlayer.cs index 455448dc..567aec3c 100644 --- a/FFXIVClassic Map Server/dataobjects/ConnectedPlayer.cs +++ b/FFXIVClassic Map Server/dataobjects/ConnectedPlayer.cs @@ -2,6 +2,7 @@ using FFXIVClassic_Lobby_Server.common; using FFXIVClassic_Lobby_Server.packets; using FFXIVClassic_Map_Server.Actors; +using FFXIVClassic_Map_Server.lua; using FFXIVClassic_Map_Server.packets.send.actor; using System; using System.Collections.Generic; diff --git a/FFXIVClassic Map Server/lua/LuaEngine.cs b/FFXIVClassic Map Server/lua/LuaEngine.cs index a9d18ee5..7a7603bd 100644 --- a/FFXIVClassic Map Server/lua/LuaEngine.cs +++ b/FFXIVClassic Map Server/lua/LuaEngine.cs @@ -31,7 +31,7 @@ namespace FFXIVClassic_Map_Server.lua UserData.RegistrationPolicy = InteropRegistrationPolicy.Automatic; } - public static List doActorOnInstantiate(Player player, Actor target) + public static List doActorInstantiate(Player player, Actor target) { string luaPath; @@ -39,14 +39,10 @@ namespace FFXIVClassic_Map_Server.lua { luaPath = String.Format(FILEPATH_NPCS, target.zoneId, target.getName()); if (File.Exists(luaPath)) - { - Script script = new Script(); - ((ScriptLoaderBase)script.Options.ScriptLoader).ModulePaths = new string[] { "./scripts/?", "./scripts/?.lua" }; - script.Globals["getStaticActor"] = (Func)Server.getStaticActors; - script.Globals["getWorldMaster"] = (Func)Server.GetWorldManager().GetActor; - script.Globals["getItemGamedata"] = (Func)Server.getItemGamedata; - script.DoFile(luaPath); - DynValue result = script.Call(script.Globals["onInstantiate"], target); + { + Script script = loadScript(luaPath); + + DynValue result = script.Call(script.Globals["init"], target); List lparams = LuaUtils.createLuaParamList(result); return lparams; } @@ -80,13 +76,7 @@ namespace FFXIVClassic_Map_Server.lua if (File.Exists(luaPath)) { - Script script = new Script(); - ((ScriptLoaderBase)script.Options.ScriptLoader).ModulePaths = new string[] { "./scripts/?", "./scripts/?.lua" }; - script.Globals["getWorldManager"] = (Func)Server.GetWorldManager; - script.Globals["getStaticActor"] = (Func)Server.getStaticActors; - script.Globals["getWorldMaster"] = (Func)Server.GetWorldManager().GetActor; - script.Globals["getItemGamedata"] = (Func)Server.getItemGamedata; - script.DoFile(luaPath); + Script script = loadScript(luaPath); //Have to do this to combine LuaParams List objects = new List(); @@ -98,7 +88,8 @@ namespace FFXIVClassic_Map_Server.lua objects.AddRange(LuaUtils.createLuaParamObjectList(eventStart.luaParams)); //Run Script - DynValue result = script.Call(script.Globals["onEventStarted"], objects.ToArray()); + if (!script.Globals.Get("onEventStarted").IsNil()) + script.Call(script.Globals["onEventStarted"], objects.ToArray()); } else { @@ -110,6 +101,28 @@ namespace FFXIVClassic_Map_Server.lua } + public static void doActorOnSpawn(Player player, Npc target) + { + string luaPath = String.Format(FILEPATH_NPCS, target.zoneId, target.getName()); + + if (File.Exists(luaPath)) + { + Script script = loadScript(luaPath); + + //Run Script + if (!script.Globals.Get("onSpawn").IsNil()) + script.Call(script.Globals["onSpawn"], player, target); + } + else + { + List sendError = new List(); + sendError.Add(EndEventPacket.buildPacket(player.actorId, player.eventCurrentOwner, player.eventCurrentStarter)); + player.sendMessage(SendMessagePacket.MESSAGE_TYPE_SYSTEM_ERROR, "", String.Format("ERROR: Could not find script for actor {0}.", target.getName())); + player.playerSession.queuePacket(BasePacket.createPacket(sendError, true, false)); + } + + } + public static void doActorOnEventUpdated(Player player, Actor target, EventUpdatePacket eventUpdate) { string luaPath; @@ -123,13 +136,7 @@ namespace FFXIVClassic_Map_Server.lua if (File.Exists(luaPath)) { - Script script = new Script(); - ((ScriptLoaderBase)script.Options.ScriptLoader).ModulePaths = new string[] { "./scripts/?", "./scripts/?.lua" }; - script.Globals["getWorldManager"] = (Func)Server.GetWorldManager; - script.Globals["getStaticActor"] = (Func)Server.getStaticActors; - script.Globals["getWorldMaster"] = (Func)Server.GetWorldManager().GetActor; - script.Globals["getItemGamedata"] = (Func)Server.getItemGamedata; - script.DoFile(luaPath); + Script script = loadScript(luaPath); //Have to do this to combine LuaParams List objects = new List(); @@ -139,7 +146,8 @@ namespace FFXIVClassic_Map_Server.lua objects.AddRange(LuaUtils.createLuaParamObjectList(eventUpdate.luaParams)); //Run Script - DynValue result = script.Call(script.Globals["onEventUpdate"], objects.ToArray()); + if (!script.Globals.Get("onEventUpdate").IsNil()) + script.Call(script.Globals["onEventUpdate"], objects.ToArray()); } else { @@ -156,16 +164,11 @@ namespace FFXIVClassic_Map_Server.lua if (File.Exists(luaPath)) { - Script script = new Script(); - ((ScriptLoaderBase)script.Options.ScriptLoader).ModulePaths = new string[] { "./scripts/?", "./scripts/?.lua" }; - script.Globals["getWorldManager"] = (Func)Server.GetWorldManager; - script.Globals["getStaticActor"] = (Func)Server.getStaticActors; - script.Globals["getWorldMaster"] = (Func)Server.GetWorldManager().GetActor; - script.Globals["getItemGamedata"] = (Func)Server.getItemGamedata; - script.DoFile(luaPath); + Script script = loadScript(luaPath); //Run Script - DynValue result = script.Call(script.Globals["onZoneIn"], player); + if (!script.Globals.Get("onZoneIn").IsNil()) + script.Call(script.Globals["onZoneIn"], player); } } @@ -173,18 +176,25 @@ namespace FFXIVClassic_Map_Server.lua { if (File.Exists(FILEPATH_PLAYER)) { - Script script = new Script(); - ((ScriptLoaderBase)script.Options.ScriptLoader).ModulePaths = new string[] { "./scripts/?", "./scripts/?.lua" }; - script.Globals["getWorldManager"] = (Func)Server.GetWorldManager; - script.Globals["getStaticActor"] = (Func)Server.getStaticActors; - script.Globals["getWorldMaster"] = (Func)Server.GetWorldManager().GetActor; - script.Globals["getItemGamedata"] = (Func)Server.getItemGamedata; - script.DoFile(FILEPATH_PLAYER); + Script script = loadScript(FILEPATH_PLAYER); //Run Script - DynValue result = script.Call(script.Globals["onLogin"], player); + if (!script.Globals.Get("onZoneIn").IsNil()) + script.Call(script.Globals["onZoneIn"], player); } } + private static Script loadScript(string filename) + { + Script script = new Script(); + ((FileSystemScriptLoader)script.Options.ScriptLoader).ModulePaths = FileSystemScriptLoader.UnpackStringPaths("./scripts/?;./scripts/?.lua"); + script.Globals["getWorldManager"] = (Func)Server.GetWorldManager; + script.Globals["getStaticActor"] = (Func)Server.getStaticActors; + script.Globals["getWorldMaster"] = (Func)Server.GetWorldManager().GetActor; + script.Globals["getItemGamedata"] = (Func)Server.getItemGamedata; + script.DoFile(filename); + return script; + } + } } diff --git a/FFXIVClassic Map Server/packets/send/Actor/ActorSpecialGraphicPacket.cs b/FFXIVClassic Map Server/packets/send/Actor/ActorSpecialGraphicPacket.cs new file mode 100644 index 00000000..d2604645 --- /dev/null +++ b/FFXIVClassic Map Server/packets/send/Actor/ActorSpecialGraphicPacket.cs @@ -0,0 +1,36 @@ +using FFXIVClassic_Lobby_Server.packets; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FFXIVClassic_Map_Server.packets.send.actor +{ + class ActorSpecialGraphicPacket + { + public const int NONE = 0x0; + public const int QUEST = 0x2; + public const int NOGRAPHIC = 0x3; + public const int QUEST_IMPORTANT = 0x4; + + public const ushort OPCODE = 0x00E3; + public const uint PACKET_SIZE = 0x28; + + public static SubPacket buildPacket(uint playerActorID, uint targetActorID, int iconCode) + { + byte[] data = new byte[PACKET_SIZE - 0x20]; + + using (MemoryStream mem = new MemoryStream(data)) + { + using (BinaryWriter binWriter = new BinaryWriter(mem)) + { + binWriter.Write((Int32)iconCode); + } + } + + return new SubPacket(OPCODE, targetActorID, playerActorID, data); + } + } +}