From 734a3f4e7f628aa72e652629b452f4ebb10ef8e9 Mon Sep 17 00:00:00 2001 From: Filip Maj Date: Fri, 1 Jan 2016 14:03:55 -0500 Subject: [PATCH] Added implementations of the event receive/send packets. Added lua scripting stuff. Added some utils. --- FFXIVClassic Map Server/ScriptParamReader.cs | 72 ------ FFXIVClassic Map Server/common/Utils.cs | 8 + FFXIVClassic Map Server/lua/LuaEngine.cs | 77 ++++++ FFXIVClassic Map Server/lua/LuaEvent.cs | 22 ++ FFXIVClassic Map Server/lua/LuaParam.cs | 20 ++ FFXIVClassic Map Server/lua/LuaPlayer.cs | 74 ++++++ FFXIVClassic Map Server/lua/LuaUtils.cs | 241 ++++++++++++++++++ .../packets/receive/StartScriptPacket.cs | 36 --- .../receive/events/EventStartPacket.cs | 66 +++++ .../EventUpdatePacket.cs} | 18 +- .../receive/script/ScriptResultPacket.cs | 44 ---- .../EndEventPacket.cs} | 15 +- .../send/events/RunEventFunctionPacket.cs | 78 ++++++ .../packets/send/login/InitPacket.cs | 41 --- .../packets/send/script/ScriptStartPacket.cs | 52 ---- 15 files changed, 603 insertions(+), 261 deletions(-) delete mode 100644 FFXIVClassic Map Server/ScriptParamReader.cs create mode 100644 FFXIVClassic Map Server/lua/LuaEngine.cs create mode 100644 FFXIVClassic Map Server/lua/LuaEvent.cs create mode 100644 FFXIVClassic Map Server/lua/LuaParam.cs create mode 100644 FFXIVClassic Map Server/lua/LuaPlayer.cs create mode 100644 FFXIVClassic Map Server/lua/LuaUtils.cs delete mode 100644 FFXIVClassic Map Server/packets/receive/StartScriptPacket.cs create mode 100644 FFXIVClassic Map Server/packets/receive/events/EventStartPacket.cs rename FFXIVClassic Map Server/packets/receive/{script/CommandStartRequestPacket.cs => events/EventUpdatePacket.cs} (70%) delete mode 100644 FFXIVClassic Map Server/packets/receive/script/ScriptResultPacket.cs rename FFXIVClassic Map Server/packets/send/{script/ScriptEndPacket.cs => events/EndEventPacket.cs} (57%) create mode 100644 FFXIVClassic Map Server/packets/send/events/RunEventFunctionPacket.cs delete mode 100644 FFXIVClassic Map Server/packets/send/login/InitPacket.cs delete mode 100644 FFXIVClassic Map Server/packets/send/script/ScriptStartPacket.cs diff --git a/FFXIVClassic Map Server/ScriptParamReader.cs b/FFXIVClassic Map Server/ScriptParamReader.cs deleted file mode 100644 index ad0c8af3..00000000 --- a/FFXIVClassic Map Server/ScriptParamReader.cs +++ /dev/null @@ -1,72 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace FFXIVClassic_Map_Server -{ - class ScriptParamReader - { - List types = new List(); - List values = new List(); - - public ScriptParamReader(BinaryReader reader) - { - while (true) - { - byte code = reader.ReadByte(); - switch (code) - { - case 0x0: //INT32 - types.Add(6); - values.Add(reader.ReadUInt32()); - break; - case 0x1: //???? - continue; - case 0x2: //Null Termed String - types.Add(2); - List list = new List(); - while(true){ - byte readByte = reader.ReadByte(); - if (readByte == 0) - break; - list.Add(readByte); - } - values.Add(Encoding.ASCII.GetString(list.ToArray())); - break; - case 0x4: //BYTE - types.Add(4); - values.Add(reader.ReadByte()); - break; - case 0x5: //NULL??? - types.Add(5); - values.Add(new Object()); - continue; - case 0x6: //INT32 - types.Add(6); - values.Add(reader.ReadUInt32()); - break; - case 0xF: //End - return; - } - } - } - - public int getType(int index) - { - return types[index]; - } - - public Object getValue(int index) - { - return values[index]; - } - - public int getCount() - { - return values.Count; - } - } -} diff --git a/FFXIVClassic Map Server/common/Utils.cs b/FFXIVClassic Map Server/common/Utils.cs index 32004392..055ca9b0 100644 --- a/FFXIVClassic Map Server/common/Utils.cs +++ b/FFXIVClassic Map Server/common/Utils.cs @@ -67,6 +67,14 @@ namespace FFXIVClassic_Lobby_Server.common return unixTimeStamp; } + public static uint swapEndian(uint input) + { + return ((input >> 24) & 0xff) | + ((input << 8) & 0xff0000) | + ((input >> 8) & 0xff00) | + ((input << 24) & 0xff000000); + } + public static uint MurmurHash2(string key, uint seed) { // 'm' and 'r' are mixing constants generated offline. diff --git a/FFXIVClassic Map Server/lua/LuaEngine.cs b/FFXIVClassic Map Server/lua/LuaEngine.cs new file mode 100644 index 00000000..79bf5034 --- /dev/null +++ b/FFXIVClassic Map Server/lua/LuaEngine.cs @@ -0,0 +1,77 @@ +using FFXIVClassic_Lobby_Server.packets; +using FFXIVClassic_Map_Server.dataobjects; +using FFXIVClassic_Map_Server.dataobjects.actors; +using FFXIVClassic_Map_Server.dataobjects.chara; +using FFXIVClassic_Map_Server.dataobjects.chara.npc; +using FFXIVClassic_Map_Server.packets.receive.events; +using FFXIVClassic_Map_Server.packets.send; +using FFXIVClassic_Map_Server.packets.send.events; +using NLua; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FFXIVClassic_Map_Server.lua +{ + class LuaEngine + { + const string FILEPATH_COMMANDS = "./scripts/command/{0}.lua"; + const string FILEPATH_EVENTS = "./scripts/talk/{0}.lua"; + + Lua lstate = new Lua(); + + public LuaEngine() + { + } + + + public void doEventStart(ConnectedPlayer player, Actor target, EventStartPacket packet) + { + string luaPath; + + if (target is Command) + luaPath = String.Format(FILEPATH_COMMANDS, target.getName()); + else if (target is Npc) + luaPath = String.Format(FILEPATH_EVENTS, target.getName()); + else + luaPath = ""; + + if (File.Exists(luaPath)) + { + lstate.DoFile(luaPath); + var eventStarted = lstate["eventStarted"] as LuaFunction; + eventStarted.Call(new LuaPlayer(player), player.eventCurrentOwner, LuaUtils.createLuaParamObjectList(packet.luaParams)); + } + else + { + List sendError = new List(); + sendError.Add(EndEventPacket.buildPacket(player.actorID, player.eventCurrentOwner, player.eventCurrentStarter)); + sendError.Add(SendMessagePacket.buildPacket(player.actorID, player.actorID, SendMessagePacket.MESSAGE_TYPE_GENERAL_INFO, "", "ERROR: Could not find script for event")); + player.queuePacket(BasePacket.createPacket(sendError, true, false)); + } + } + + public void doEventUpdated(ConnectedPlayer player, Actor target, EventUpdatePacket packet) + { + string luaPath = String.Format(FILEPATH_EVENTS, ((Command)target).getName()); + + if (File.Exists(luaPath)) + { + lstate.DoFile(luaPath); + var eventStarted = lstate["eventUpdated"] as LuaFunction; + eventStarted.Call(new LuaPlayer(player), player.eventCurrentOwner, packet.step, LuaUtils.createLuaParamObjectList(packet.luaParams)); + } + else + { + List sendError = new List(); + sendError.Add(EndEventPacket.buildPacket(player.actorID, player.eventCurrentOwner, player.eventCurrentStarter)); + sendError.Add(SendMessagePacket.buildPacket(player.actorID, player.actorID, SendMessagePacket.MESSAGE_TYPE_GENERAL_INFO, "", "ERROR: Could not find script for event")); + player.queuePacket(BasePacket.createPacket(sendError, true, false)); + } + } + + } +} diff --git a/FFXIVClassic Map Server/lua/LuaEvent.cs b/FFXIVClassic Map Server/lua/LuaEvent.cs new file mode 100644 index 00000000..73a4fb02 --- /dev/null +++ b/FFXIVClassic Map Server/lua/LuaEvent.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FFXIVClassic_Map_Server.lua +{ + class LuaEvent + { + public static void getStep() + { + + } + + public static void getParam() + { + + } + + } +} diff --git a/FFXIVClassic Map Server/lua/LuaParam.cs b/FFXIVClassic Map Server/lua/LuaParam.cs new file mode 100644 index 00000000..20ecea3b --- /dev/null +++ b/FFXIVClassic Map Server/lua/LuaParam.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FFXIVClassic_Map_Server.lua +{ + class LuaParam + { + public int typeID; + public Object value; + + public LuaParam(int type, Object value) + { + this.typeID = type; + this.value = value; + } + } +} diff --git a/FFXIVClassic Map Server/lua/LuaPlayer.cs b/FFXIVClassic Map Server/lua/LuaPlayer.cs new file mode 100644 index 00000000..187e31e8 --- /dev/null +++ b/FFXIVClassic Map Server/lua/LuaPlayer.cs @@ -0,0 +1,74 @@ +using FFXIVClassic_Map_Server.dataobjects; +using FFXIVClassic_Map_Server.packets.send; +using FFXIVClassic_Map_Server.packets.send.events; +using NLua; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FFXIVClassic_Map_Server.lua +{ + class LuaPlayer + { + private ConnectedPlayer player; + + public LuaPlayer(ConnectedPlayer player) + { + this.player = player; + } + + public void setMusic(ushort musicID, ushort playMode) + { + player.queuePacket(SetMusicPacket.buildPacket(player.actorID, musicID, playMode), true, false); + } + + public void setWeather(uint weatherID) + { + player.queuePacket(SetWeatherPacket.buildPacket(player.actorID, weatherID), true, false); + } + + public void getParameter(string paramName) + { + + } + + public void setParameter(string paramName, object value, string uiToRefresh) + { + + } + + public void getAttributePoints() + { + + } + + public void setAttributePoints(int str, int vit, int dex, int inte, int min, int pie) + { + + } + + public void logout() + { + player.queuePacket(LogoutPacket.buildPacket(player.actorID), true, false); + } + + public void quitGame() + { + player.queuePacket(QuitPacket.buildPacket(player.actorID), true, false); + } + + public void runEvent(string functionName, params object[] parameters) + { + List lParams = LuaUtils.createLuaParamList(parameters); + player.getConnection1().queuePacket(RunEventFunctionPacket.buildPacket(player.actorID, player.eventCurrentOwner, player.eventCurrentStarter, functionName, lParams), true, false); + } + + public void endEvent() + { + player.getConnection1().queuePacket(EndEventPacket.buildPacket(player.actorID, player.eventCurrentOwner, player.eventCurrentStarter), true, false); + } + + } +} diff --git a/FFXIVClassic Map Server/lua/LuaUtils.cs b/FFXIVClassic Map Server/lua/LuaUtils.cs new file mode 100644 index 00000000..7cdf181c --- /dev/null +++ b/FFXIVClassic Map Server/lua/LuaUtils.cs @@ -0,0 +1,241 @@ +using FFXIVClassic_Lobby_Server.common; +using FFXIVClassic_Map_Server.dataobjects; +using FFXIVClassic_Map_Server.lua; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FFXIVClassic_Map_Server +{ + class LuaUtils + { + + public static List readLuaParams(BinaryReader reader) + { + List luaParams = new List(); + + bool isDone = false; + while (true) + { + byte code = reader.ReadByte(); + object value = null; + bool wasNil = false; + + switch (code) + { + case 0x0: //Int32 + value = Utils.swapEndian(reader.ReadUInt32()); + break; + case 0x1: //Int32 + value = Utils.swapEndian(reader.ReadUInt32()); + break; + case 0x2: //Null Termed String + List list = new List(); + while(true){ + byte readByte = reader.ReadByte(); + if (readByte == 0) + break; + list.Add(readByte); + } + value = Encoding.ASCII.GetString(list.ToArray()); + break; + case 0x3: //Boolean False + value = false; + break; + case 0x4: //Boolean True + value = true; + break; + case 0x5: //Nil + wasNil = true; + break; + case 0x6: //Actor (By Id) + value = Utils.swapEndian(reader.ReadUInt32()); + break; + case 0x10: //Byte? + value = reader.ReadByte(); + break; + case 0x1B: //Short? + value = reader.ReadUInt16(); + break; + case 0xF: //End + isDone = true; + continue; + } + + if (isDone) + break; + + if (value != null) + luaParams.Add(new LuaParam(code, value)); + else if (wasNil) + luaParams.Add(new LuaParam(code, value)); + } + + return luaParams; + } + + public static List readLuaParams(byte[] bytesIn) + { + List luaParams = new List(); + + using (MemoryStream memStream = new MemoryStream(bytesIn)) + { + using (BinaryReader reader = new BinaryReader(memStream)) + { + bool isDone = false; + while (true) + { + byte code = reader.ReadByte(); + object value = null; + bool wasNil = false; + + switch (code) + { + case 0x0: //Int32 + value = Utils.swapEndian(reader.ReadUInt32()); + break; + case 0x1: //Int32 + value = Utils.swapEndian(reader.ReadUInt32()); + break; + case 0x2: //Null Termed String + List list = new List(); + while (true) + { + byte readByte = reader.ReadByte(); + if (readByte == 0) + break; + list.Add(readByte); + } + value = Encoding.ASCII.GetString(list.ToArray()); + break; + case 0x3: //Boolean False + value = false; + break; + case 0x4: //Boolean True + value = true; + break; + case 0x5: //Nil + wasNil = true; + break; + case 0x6: //Actor (By Id) + value = Utils.swapEndian(reader.ReadUInt32()); + break; + case 0x10: //Byte? + value = reader.ReadByte(); + break; + case 0x1B: //Short? + value = reader.ReadUInt16(); + break; + case 0xF: //End + isDone = true; + continue; + } + + if (isDone) + break; + + if (value != null) + luaParams.Add(new LuaParam(code, value)); + else if (wasNil) + luaParams.Add(new LuaParam(code, value)); + } + } + } + return luaParams; + } + + public static List createLuaParamList(object[] list) + { + List luaParams = new List(); + + foreach (object o in list) + { + if (o is uint) + { + luaParams.Add(new LuaParam(0x0, (uint)o)); + } + else if (o is string) + { + luaParams.Add(new LuaParam(0x2, (string)o)); + } + else if (o is bool) + { + if (((bool)o)) + luaParams.Add(new LuaParam(0x4, null)); + else + luaParams.Add(new LuaParam(0x3, null)); + } + else if (o == null) + { + luaParams.Add(new LuaParam(0x5, null)); + } + else if (o is Actor) + { + luaParams.Add(new LuaParam(0x6, ((Actor)o).actorID)); + } + } + + return luaParams; + } + + public static object[] createLuaParamObjectList(List luaParams) + { + object[] list = new object[luaParams.Count]; + + for (int i = 0; i < list.Length; i++) + list[i] = luaParams[i].value; + + return list; + } + + + public static string dumpParams(List lParams) + { + string dumpString = ""; + for (int i = 0; i < lParams.Count; i++) + { + switch (lParams[i].typeID) + { + case 0x0: //Int32 + dumpString += String.Format("0x{0:X}", (uint)lParams[i].value); + break; + case 0x1: //Int32 + dumpString += String.Format("0x{0:X}", (uint)lParams[i].value); + break; + case 0x2: //Null Termed String + dumpString += String.Format("\"{0}\"", (string)lParams[i].value); + break; + case 0x3: //Boolean False + dumpString += "false"; + break; + case 0x4: //Boolean True + dumpString += "true"; + break; + case 0x5: //NULL??? + dumpString += "nil"; + break; + case 0x6: //Actor (By Id) + dumpString += String.Format("0x{0:X}", (uint)lParams[i].value); + break; + case 0x10: //Byte? + dumpString += String.Format("0x{0:X}", (byte)lParams[i].value); + break; + case 0x1B: //Short? + dumpString += String.Format("0x{0:X}", (ushort)lParams[i].value); + break; + case 0xF: //End + break; + } + + if (i != lParams.Count - 1) + dumpString += ", "; + } + + return dumpString; + } + + } +} diff --git a/FFXIVClassic Map Server/packets/receive/StartScriptPacket.cs b/FFXIVClassic Map Server/packets/receive/StartScriptPacket.cs deleted file mode 100644 index 48744ab9..00000000 --- a/FFXIVClassic Map Server/packets/receive/StartScriptPacket.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace FFXIVClassic_Map_Server.packets.receive -{ - class StartScriptPacket - { - public uint sourceActor; - public uint targetActor; - - public string scriptName; - - public bool invalidPacket = false; - - public StartScriptPacket(byte[] data) - { - using (MemoryStream mem = new MemoryStream(data)) - { - using (BinaryReader binReader = new BinaryReader(mem)) - { - try{ - sourceActor = binReader.ReadUInt32(); - targetActor = binReader.ReadUInt32(); - } - catch (Exception){ - invalidPacket = true; - } - } - } - } - } -} diff --git a/FFXIVClassic Map Server/packets/receive/events/EventStartPacket.cs b/FFXIVClassic Map Server/packets/receive/events/EventStartPacket.cs new file mode 100644 index 00000000..daac2e08 --- /dev/null +++ b/FFXIVClassic Map Server/packets/receive/events/EventStartPacket.cs @@ -0,0 +1,66 @@ +using FFXIVClassic_Map_Server.lua; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FFXIVClassic_Map_Server.packets.receive.events +{ + class EventStartPacket + { + public const ushort OPCODE = 0x012D; + public const uint PACKET_SIZE = 0xD8; + + public bool invalidPacket = false; + + public uint actorID; + public uint scriptOwnerActorID; + public uint val1; + public uint val2; + + public byte val3; + + public string eventStarter; + + public List luaParams; + + public EventStartPacket(byte[] data) + { + using (MemoryStream mem = new MemoryStream(data)) + { + using (BinaryReader binReader = new BinaryReader(mem)) + { + try{ + actorID = binReader.ReadUInt32(); + scriptOwnerActorID = binReader.ReadUInt32(); + val1 = binReader.ReadUInt32(); + val2 = binReader.ReadUInt32(); + val3 = binReader.ReadByte(); + + List strList = new List(); + byte curByte; + while ((curByte = binReader.ReadByte())!=0) + { + strList.Add(curByte); + } + eventStarter = Encoding.ASCII.GetString(strList.ToArray()); + + binReader.ReadUInt32(); + binReader.ReadUInt32(); + binReader.ReadUInt32(); + binReader.ReadUInt32(); + + binReader.ReadByte(); + + luaParams = LuaUtils.readLuaParams(binReader); + } + catch (Exception){ + invalidPacket = true; + } + } + } + } + } +} diff --git a/FFXIVClassic Map Server/packets/receive/script/CommandStartRequestPacket.cs b/FFXIVClassic Map Server/packets/receive/events/EventUpdatePacket.cs similarity index 70% rename from FFXIVClassic Map Server/packets/receive/script/CommandStartRequestPacket.cs rename to FFXIVClassic Map Server/packets/receive/events/EventUpdatePacket.cs index 4006975f..976c6c68 100644 --- a/FFXIVClassic Map Server/packets/receive/script/CommandStartRequestPacket.cs +++ b/FFXIVClassic Map Server/packets/receive/events/EventUpdatePacket.cs @@ -1,13 +1,14 @@ -using System; +using FFXIVClassic_Map_Server.lua; +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.script +namespace FFXIVClassic_Map_Server.packets.receive.events { - class CommandStartRequestPacket + class EventUpdatePacket { public const ushort OPCODE = 0x012E; public const uint PACKET_SIZE = 0x78; @@ -18,9 +19,10 @@ namespace FFXIVClassic_Map_Server.packets.send.script public uint scriptOwnerActorID; public uint val1; public uint val2; - public ScriptParamReader reader; + public byte step; + public List luaParams; - public CommandStartRequestPacket(byte[] data) + public EventUpdatePacket(byte[] data) { using (MemoryStream mem = new MemoryStream(data)) { @@ -31,10 +33,8 @@ namespace FFXIVClassic_Map_Server.packets.send.script scriptOwnerActorID = binReader.ReadUInt32(); val1 = binReader.ReadUInt32(); val2 = binReader.ReadUInt32(); - binReader.ReadByte(); - - binReader.BaseStream.Seek(0x31, SeekOrigin.Begin); - reader = new ScriptParamReader(binReader); + step = binReader.ReadByte(); + luaParams = LuaUtils.readLuaParams(binReader); } catch (Exception){ invalidPacket = true; diff --git a/FFXIVClassic Map Server/packets/receive/script/ScriptResultPacket.cs b/FFXIVClassic Map Server/packets/receive/script/ScriptResultPacket.cs deleted file mode 100644 index 49f63708..00000000 --- a/FFXIVClassic Map Server/packets/receive/script/ScriptResultPacket.cs +++ /dev/null @@ -1,44 +0,0 @@ -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.script -{ - class ScriptResultPacket - { - public const ushort OPCODE = 0x012E; - public const uint PACKET_SIZE = 0xD8; - - public bool invalidPacket = false; - - public uint actorID; - public uint scriptOwnerActorID; - public uint val1; - public uint val2; - ScriptParamReader reader; - - public ScriptResultPacket(byte[] data) - { - using (MemoryStream mem = new MemoryStream(data)) - { - using (BinaryReader binReader = new BinaryReader(mem)) - { - try{ - actorID = binReader.ReadUInt32(); - scriptOwnerActorID = binReader.ReadUInt32(); - val1 = binReader.ReadUInt32(); - val2 = binReader.ReadUInt32(); - binReader.ReadByte(); - reader = new ScriptParamReader(binReader); - } - catch (Exception){ - invalidPacket = true; - } - } - } - } - } -} diff --git a/FFXIVClassic Map Server/packets/send/script/ScriptEndPacket.cs b/FFXIVClassic Map Server/packets/send/events/EndEventPacket.cs similarity index 57% rename from FFXIVClassic Map Server/packets/send/script/ScriptEndPacket.cs rename to FFXIVClassic Map Server/packets/send/events/EndEventPacket.cs index d08cac0d..29ada3c4 100644 --- a/FFXIVClassic Map Server/packets/send/script/ScriptEndPacket.cs +++ b/FFXIVClassic Map Server/packets/send/events/EndEventPacket.cs @@ -6,25 +6,26 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace FFXIVClassic_Map_Server.packets.send.script +namespace FFXIVClassic_Map_Server.packets.send.events { - class ScriptEndPacket + class EndEventPacket { public const ushort OPCODE = 0x0131; public const uint PACKET_SIZE = 0x50; - public static SubPacket buildPacket(uint playerActorID, string startName) + public static SubPacket buildPacket(uint playerActorID, uint eventOwnerActorID, string eventStarter) { byte[] data = new byte[PACKET_SIZE - 0x20]; + int maxBodySize = data.Length - 0x80; using (MemoryStream mem = new MemoryStream(data)) { using (BinaryWriter binWriter = new BinaryWriter(mem)) { - binWriter.Write((uint)playerActorID); - binWriter.Write((uint)0); - binWriter.Write((byte)0); - binWriter.Write(Encoding.Unicode.GetBytes(startName)); + binWriter.Write((UInt32)playerActorID); + binWriter.Write((UInt32)eventOwnerActorID); + binWriter.Write((Byte)0); + binWriter.Write(Encoding.ASCII.GetBytes(eventStarter), 0, Encoding.ASCII.GetByteCount(eventStarter) >= 0x20 ? 0x20 : Encoding.ASCII.GetByteCount(eventStarter)); } } diff --git a/FFXIVClassic Map Server/packets/send/events/RunEventFunctionPacket.cs b/FFXIVClassic Map Server/packets/send/events/RunEventFunctionPacket.cs new file mode 100644 index 00000000..45bfa138 --- /dev/null +++ b/FFXIVClassic Map Server/packets/send/events/RunEventFunctionPacket.cs @@ -0,0 +1,78 @@ +using FFXIVClassic_Lobby_Server.common; +using FFXIVClassic_Lobby_Server.packets; +using FFXIVClassic_Map_Server.lua; +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.events +{ + class RunEventFunctionPacket + { + public const ushort OPCODE = 0x0130; + public const uint PACKET_SIZE = 0x2B8; + + public static SubPacket buildPacket(uint playerActorID, uint eventOwnerActorID, string eventStarter, string callFunction, List luaParams) + { + byte[] data = new byte[PACKET_SIZE - 0x20]; + int maxBodySize = data.Length - 0x80; + + using (MemoryStream mem = new MemoryStream(data)) + { + using (BinaryWriter binWriter = new BinaryWriter(mem)) + { + binWriter.Write((UInt32)playerActorID); + binWriter.Write((UInt32)eventOwnerActorID); + binWriter.Write((Byte)0); + binWriter.Write(Encoding.ASCII.GetBytes(eventStarter), 0, Encoding.ASCII.GetByteCount(eventStarter) >= 0x20 ? 0x20 : Encoding.ASCII.GetByteCount(eventStarter)); + binWriter.Seek(0x29, SeekOrigin.Begin); + binWriter.Write(Encoding.ASCII.GetBytes(callFunction), 0, Encoding.ASCII.GetByteCount(callFunction) >= 0x20 ? 0x20 : Encoding.ASCII.GetByteCount(callFunction)); + binWriter.Seek(0x49, SeekOrigin.Begin); + + //Write out params + foreach (LuaParam p in luaParams) + { + binWriter.Write((Byte)p.typeID); + switch (p.typeID) + { + case 0x0: //Int32 + binWriter.Write(Utils.swapEndian((UInt32)p.value)); + break; + case 0x1: //Int32 + binWriter.Write(Utils.swapEndian((UInt32)p.value)); + break; + case 0x2: //Null Termed String + string svalue = (string)p.value; + binWriter.Write(Encoding.ASCII.GetBytes(svalue), 0, Encoding.ASCII.GetByteCount(svalue)); + if (svalue[svalue.Length - 1] != '\0') + binWriter.Write((Byte)0); + break; + case 0x3: //Boolean False + break; + case 0x4: //Boolean True + break; + case 0x5: //Nil + break; + case 0x6: //Actor (By Id) + binWriter.Write(Utils.swapEndian((UInt32)p.value)); + break; + case 0x10: //Byte? + //value = reader.ReadByte(); + break; + case 0x1B: //Short? + //value = reader.ReadUInt16(); + break; + } + } + + binWriter.Write((Byte)0xF); + } + } + + return new SubPacket(OPCODE, playerActorID, playerActorID, data); + } + } +} diff --git a/FFXIVClassic Map Server/packets/send/login/InitPacket.cs b/FFXIVClassic Map Server/packets/send/login/InitPacket.cs deleted file mode 100644 index 38b8f033..00000000 --- a/FFXIVClassic Map Server/packets/send/login/InitPacket.cs +++ /dev/null @@ -1,41 +0,0 @@ -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.login -{ - class InitPacket - { - public static BasePacket buildPacket(uint actorID, uint time) - { - byte[] data = new byte[0x18]; - - using (MemoryStream mem = new MemoryStream(data)) - { - using (BinaryWriter binWriter = new BinaryWriter(mem)) - { - try - { - binWriter.Write((short)0x18); - binWriter.Write((short)0x7); - binWriter.Write((uint)0); - binWriter.Write((uint)0); - binWriter.Write((uint)0xFFFFFD7F); - - binWriter.Write((uint)actorID); - binWriter.Write((uint)time); - } - catch (Exception) - { - } - } - } - - return BasePacket.createPacket(data, false, false); - } - } -} diff --git a/FFXIVClassic Map Server/packets/send/script/ScriptStartPacket.cs b/FFXIVClassic Map Server/packets/send/script/ScriptStartPacket.cs deleted file mode 100644 index 31a1680a..00000000 --- a/FFXIVClassic Map Server/packets/send/script/ScriptStartPacket.cs +++ /dev/null @@ -1,52 +0,0 @@ -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.script -{ - class ScriptStartPacket - { - public const ushort OPCODE = 0x0130; - public const uint PACKET_SIZE = 0xB0; - - //Known types - public const byte TYPE_END = 0xF; - public const byte TYPE_UINT = 0x6; - public const byte TYPE_BYTE = 0x5; - public const byte TYPE_STRING = 0x2; - public const byte TYPE_STRING_20B = 0x1; - public const byte TYPE_STRING_NULLTERM = 0x0; - - public static SubPacket buildPacket(uint playerActorID, uint scriptOwnerActorID, string startName, string scriptName) - { - byte[] data = new byte[PACKET_SIZE - 0x20]; - - using (MemoryStream mem = new MemoryStream(data)) - { - using (BinaryWriter binWriter = new BinaryWriter(mem)) - { - binWriter.Write((uint)playerActorID); - binWriter.Write((uint)scriptOwnerActorID); - binWriter.Write((byte)1); - binWriter.Write(Encoding.Unicode.GetBytes(startName)); - binWriter.Seek(0x29, SeekOrigin.Begin); - binWriter.Write(Encoding.Unicode.GetBytes(scriptName)); - binWriter.Seek(0x29 + 0x20, SeekOrigin.Begin); - binWriter.Write((byte)6); - - byte[] actorID = BitConverter.GetBytes(playerActorID); - Array.Reverse(actorID); - binWriter.Write(actorID); - - binWriter.Write((byte)0x0F); - } - } - - return new SubPacket(OPCODE, playerActorID, playerActorID, data); - } - } -}