mirror of
				https://bitbucket.org/Ioncannon/project-meteor-server.git
				synced 2025-05-20 08:26:59 -04:00 
			
		
		
		
	Added implementations of the event receive/send packets. Added lua scripting stuff. Added some utils.
This commit is contained in:
		
							
								
								
									
										77
									
								
								FFXIVClassic Map Server/lua/LuaEngine.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								FFXIVClassic Map Server/lua/LuaEngine.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -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<SubPacket> sendError = new List<SubPacket>(); | ||||
|                 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<SubPacket> sendError = new List<SubPacket>(); | ||||
|                 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)); | ||||
|             } | ||||
|         } | ||||
|          | ||||
|     } | ||||
| } | ||||
							
								
								
									
										22
									
								
								FFXIVClassic Map Server/lua/LuaEvent.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								FFXIVClassic Map Server/lua/LuaEvent.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -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() | ||||
|         { | ||||
|  | ||||
|         } | ||||
|  | ||||
|     } | ||||
| } | ||||
							
								
								
									
										20
									
								
								FFXIVClassic Map Server/lua/LuaParam.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								FFXIVClassic Map Server/lua/LuaParam.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -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; | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										74
									
								
								FFXIVClassic Map Server/lua/LuaPlayer.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								FFXIVClassic Map Server/lua/LuaPlayer.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -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<LuaParam> 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); | ||||
|         } | ||||
|  | ||||
|     } | ||||
| } | ||||
							
								
								
									
										241
									
								
								FFXIVClassic Map Server/lua/LuaUtils.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										241
									
								
								FFXIVClassic Map Server/lua/LuaUtils.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -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<LuaParam> readLuaParams(BinaryReader reader) | ||||
|         { | ||||
|             List<LuaParam> luaParams = new List<LuaParam>(); | ||||
|  | ||||
|             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<byte> list = new List<byte>(); | ||||
|                         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<LuaParam> readLuaParams(byte[] bytesIn) | ||||
|         { | ||||
|             List<LuaParam> luaParams = new List<LuaParam>();             | ||||
|  | ||||
|             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<byte> list = new List<byte>(); | ||||
|                                 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<LuaParam> createLuaParamList(object[] list) | ||||
|         { | ||||
|             List<LuaParam> luaParams = new List<LuaParam>(); | ||||
|  | ||||
|             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 <LuaParam> 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<LuaParam> 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; | ||||
|         } | ||||
|  | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user