mirror of
				https://bitbucket.org/Ioncannon/project-meteor-server.git
				synced 2025-05-20 08:26:59 -04:00 
			
		
		
		
	Added command and script packets. Finished the SetActorProperty packet. Fixed bug with manually send packets from console.
This commit is contained in:
		| @@ -38,7 +38,8 @@ namespace FFXIVClassic_Lobby_Server | ||||
|  | ||||
|             while (sendPacketQueue.Count > 0) | ||||
|             { | ||||
|                 BasePacket packet = sendPacketQueue.Take(); | ||||
|                 BasePacket packet = sendPacketQueue.Take();                 | ||||
|  | ||||
|                 byte[] packetBytes = packet.getPacketBytes(); | ||||
|                 byte[] buffer = new byte[0xffff]; | ||||
|                 Array.Copy(packetBytes, buffer, packetBytes.Length); | ||||
|   | ||||
| @@ -76,9 +76,10 @@ | ||||
|     <Compile Include="PacketProcessor.cs" /> | ||||
|     <Compile Include="packets\BasePacket.cs" /> | ||||
|     <Compile Include="packets\receive\HandshakePacket.cs" /> | ||||
|     <Compile Include="packets\receive\script\CommandStartRequestPacket.cs" /> | ||||
|     <Compile Include="packets\receive\script\ScriptResultPacket.cs" /> | ||||
|     <Compile Include="packets\receive\SetTargetPacket.cs" /> | ||||
|     <Compile Include="packets\receive\LockTargetPacket.cs" /> | ||||
|     <Compile Include="packets\receive\EndScriptPacket.cs" /> | ||||
|     <Compile Include="packets\receive\StartScriptPacket.cs" /> | ||||
|     <Compile Include="packets\send\actor\ActorDoEmotePacket.cs" /> | ||||
|     <Compile Include="packets\send\actor\DeleteAllActorsPacket.cs" /> | ||||
| @@ -93,6 +94,7 @@ | ||||
|     <Compile Include="packets\send\actor\inventory\EquipmentSetupPacket.cs" /> | ||||
|     <Compile Include="packets\send\actor\RemoveActorPacket.cs" /> | ||||
|     <Compile Include="packets\send\actor\SetActorNamePacket.cs" /> | ||||
|     <Compile Include="packets\send\actor\SetActorPropetyPacket.cs" /> | ||||
|     <Compile Include="packets\send\actor\SetActorSpeedPacket.cs" /> | ||||
|     <Compile Include="packets\send\actor\SetActorStatePacket.cs" /> | ||||
|     <Compile Include="packets\send\actor\SetActorTargetAnimatedPacket.cs" /> | ||||
| @@ -114,6 +116,8 @@ | ||||
|     <Compile Include="packets\send\player\SetPlayerTitlePacket.cs" /> | ||||
|     <Compile Include="packets\send\PongPacket.cs" /> | ||||
|     <Compile Include="packets\send\QuitPacket.cs" /> | ||||
|     <Compile Include="packets\send\script\ScriptEndPacket.cs" /> | ||||
|     <Compile Include="packets\send\script\ScriptStartPacket.cs" /> | ||||
|     <Compile Include="packets\send\SendMessagePacket.cs" /> | ||||
|     <Compile Include="packets\send\SetMapPacket.cs" /> | ||||
|     <Compile Include="packets\send\SetMusicPacket.cs" /> | ||||
| @@ -123,6 +127,7 @@ | ||||
|     <Compile Include="packets\receive\UpdatePlayerPositionPacket.cs" /> | ||||
|     <Compile Include="Program.cs" /> | ||||
|     <Compile Include="Properties\AssemblyInfo.cs" /> | ||||
|     <Compile Include="ScriptParamReader.cs" /> | ||||
|     <Compile Include="Server.cs" /> | ||||
|     <Compile Include="Zone.cs" /> | ||||
|   </ItemGroup> | ||||
| @@ -130,9 +135,7 @@ | ||||
|     <None Include="App.config" /> | ||||
|     <None Include="packages.config" /> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <Folder Include="packets\send\script\" /> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup /> | ||||
|   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> | ||||
|   <!-- To modify your build process, add your task inside one of the targets below and uncomment it.  | ||||
|        Other similar extension points exist, see Microsoft.Common.targets. | ||||
|   | ||||
| @@ -18,6 +18,7 @@ using FFXIVClassic_Map_Server.packets.send.Actor.inventory; | ||||
| using FFXIVClassic_Map_Server.packets.send.Actor; | ||||
| using FFXIVClassic_Map_Server.packets.send.actor; | ||||
| using FFXIVClassic_Map_Server; | ||||
| using FFXIVClassic_Map_Server.packets.send.script; | ||||
|  | ||||
| namespace FFXIVClassic_Lobby_Server | ||||
| { | ||||
| @@ -263,6 +264,9 @@ namespace FFXIVClassic_Lobby_Server | ||||
|                         case 0x0003: | ||||
|                             subpacket.debugPrintSubPacket(); | ||||
|                             break; | ||||
|                         //Unknown | ||||
|                         case 0x0007:  | ||||
|                             break; | ||||
|                         //Update Position | ||||
|                         case 0x00CA: | ||||
|                             //Update Position | ||||
| @@ -291,14 +295,14 @@ namespace FFXIVClassic_Lobby_Server | ||||
|                         //Start Script | ||||
|                         case 0x012D: | ||||
|                             subpacket.debugPrintSubPacket(); | ||||
|                             //StartScriptPacket startScript = new StartScriptPacket(subpacket.data); | ||||
|                             //client.queuePacket(new BasePacket("./packets/script/bed.bin")); | ||||
|                             CommandStartRequestPacket commandStart = new CommandStartRequestPacket(subpacket.data); | ||||
|                              | ||||
|                             client.queuePacket(BasePacket.createPacket(ActorDoEmotePacket.buildPacket(player.actorID, player.getActor().currentTarget, 137), true, false)); | ||||
|                             break; | ||||
|                         //Script Result | ||||
|                         case 0x012E: | ||||
|                             subpacket.debugPrintSubPacket(); | ||||
|                             processScriptResult(subpacket); | ||||
|                             ScriptResultPacket scriptResult = new ScriptResultPacket(subpacket.data); | ||||
|                             break; | ||||
|                         case 0x012F: | ||||
|                             subpacket.debugPrintSubPacket(); | ||||
| @@ -311,16 +315,12 @@ namespace FFXIVClassic_Lobby_Server | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         }         | ||||
|  | ||||
|         public void sendPacket(string path, int conn) | ||||
|         { | ||||
|             if (mPlayers.Count == 0) | ||||
|                 return; | ||||
|  | ||||
|             BasePacket packet = new BasePacket(path); | ||||
|                 | ||||
|  | ||||
|             foreach (KeyValuePair<uint, Player> entry in mPlayers) | ||||
|             { | ||||
|                 packet.replaceActorID(entry.Value.actorID); | ||||
|   | ||||
							
								
								
									
										72
									
								
								FFXIVClassic Map Server/ScriptParamReader.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								FFXIVClassic Map Server/ScriptParamReader.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,72 @@ | ||||
| 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<int> types = new List<int>(); | ||||
|         List<Object> values = new List<Object>(); | ||||
|  | ||||
|         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<byte> list = new List<byte>(); | ||||
|                         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; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -53,7 +53,70 @@ namespace FFXIVClassic_Lobby_Server.common | ||||
|             DateTime unixEpoch = new DateTime(1970, 1, 1); | ||||
|             unixTimeStamp = (UInt32)(zuluTime.Subtract(unixEpoch)).TotalSeconds; | ||||
|  | ||||
|             return unixTimeStamp; | ||||
|             return 0x55555555; | ||||
|             //return unixTimeStamp; | ||||
|         } | ||||
|  | ||||
|         public static uint MurmurHash2(string key, uint seed) | ||||
|         { | ||||
| 	        // 'm' and 'r' are mixing constants generated offline. | ||||
| 	        // They're not really 'magic', they just happen to work well. | ||||
|  | ||||
|             byte[] data = Encoding.ASCII.GetBytes(key); | ||||
| 	        const uint m = 0x5bd1e995; | ||||
| 	        const int r = 24; | ||||
|             int len = key.Length; | ||||
|             int dataIndex = len - 4; | ||||
|  | ||||
| 	        // Initialize the hash to a 'random' value | ||||
|  | ||||
| 	        uint h = seed ^ (uint)len; | ||||
|  | ||||
| 	        // Mix 4 bytes at a time into the hash | ||||
| 	         | ||||
|  | ||||
| 	        while (len >= 4) | ||||
| 	        { | ||||
| 		        h *= m; | ||||
|  | ||||
|                 uint k = (uint)BitConverter.ToInt32(data, dataIndex); | ||||
| 		        k =     ((k >> 24) & 0xff) | // move byte 3 to byte 0 | ||||
| 			            ((k << 8) & 0xff0000) | // move byte 1 to byte 2 | ||||
| 			            ((k >> 8) & 0xff00) | // move byte 2 to byte 1 | ||||
| 			            ((k << 24) & 0xff000000); // byte 0 to byte 3 | ||||
|  | ||||
| 		        k *= m; | ||||
| 		        k ^= k >> r; | ||||
| 		        k *= m; | ||||
|  | ||||
| 		        h ^= k; | ||||
|  | ||||
| 		        dataIndex -= 4; | ||||
| 		        len -= 4; | ||||
| 	        } | ||||
|  | ||||
| 	        // Handle the last few bytes of the input array | ||||
|  | ||||
| 	        switch (len) | ||||
| 	        { | ||||
|                 case 3:  | ||||
|                     h ^= (uint)data[2] << 16; goto case 2; | ||||
|                 case 2:  | ||||
|                     h ^= (uint)data[0] << 8; goto case 1; | ||||
| 	            case 1:  | ||||
|                     h ^= data[1]; | ||||
| 		            h *= m; | ||||
|                     break; | ||||
| 	        }; | ||||
|  | ||||
| 	        // Do a few final mixes of the hash to ensure the last few | ||||
| 	        // bytes are well-incorporated. | ||||
|  | ||||
| 	        h ^= h >> 13; | ||||
| 	        h *= m; | ||||
| 	        h ^= h >> 15; | ||||
|  | ||||
| 	        return h; | ||||
|         } | ||||
|  | ||||
|     } | ||||
|   | ||||
| @@ -71,7 +71,7 @@ namespace FFXIVClassic_Map_Server.dataobjects | ||||
|  | ||||
|         public ClientConnection getConnection2() | ||||
|         { | ||||
|             return conn1; | ||||
|             return conn2; | ||||
|         } | ||||
|  | ||||
|         public Actor getActor() | ||||
| @@ -136,7 +136,8 @@ namespace FFXIVClassic_Map_Server.dataobjects | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             basePackets.Add(BasePacket.createPacket(posUpdateSubpackets, true, false)); | ||||
|             if (posUpdateSubpackets.Count > 0) | ||||
|                 basePackets.Add(BasePacket.createPacket(posUpdateSubpackets, true, false)); | ||||
|  | ||||
|             return basePackets; | ||||
|         } | ||||
|   | ||||
| @@ -9,13 +9,16 @@ namespace FFXIVClassic_Map_Server.packets.send.script | ||||
| { | ||||
|     class CommandStartRequestPacket | ||||
|     { | ||||
|         bool invalidPacket = false; | ||||
|         public const ushort OPCODE = 0x012E; | ||||
|         public const uint PACKET_SIZE = 0x78; | ||||
|  | ||||
|         public bool invalidPacket = false; | ||||
|  | ||||
|         public uint actorID; | ||||
|         public uint scriptOwnerActorID; | ||||
|         public uint val1; | ||||
|         public uint val2; | ||||
|         public string callbackName; | ||||
|         public ScriptParamReader reader; | ||||
|  | ||||
|         public CommandStartRequestPacket(byte[] data) | ||||
|         { | ||||
| @@ -30,14 +33,8 @@ namespace FFXIVClassic_Map_Server.packets.send.script | ||||
|                         val2 = binReader.ReadUInt32(); | ||||
|                         binReader.ReadByte(); | ||||
|  | ||||
|                         while (true) | ||||
|                         { | ||||
|                             byte inByte = binReader.ReadByte(); | ||||
|                             if (inByte == 0) | ||||
|                                 break; | ||||
|                             callbackName += (char)inByte; | ||||
|                         } | ||||
|  | ||||
|                         binReader.BaseStream.Seek(0x31, SeekOrigin.Begin); | ||||
|                         reader = new ScriptParamReader(binReader);                       | ||||
|                     } | ||||
|                     catch (Exception){ | ||||
|                         invalidPacket = true; | ||||
|   | ||||
| @@ -9,14 +9,16 @@ namespace FFXIVClassic_Map_Server.packets.send.script | ||||
| { | ||||
|     class ScriptResultPacket | ||||
|     { | ||||
|         bool invalidPacket = false; | ||||
|         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; | ||||
|         public uint val3; | ||||
|         public uint val4; | ||||
|         public uint val5; | ||||
|         ScriptParamReader reader; | ||||
|  | ||||
|         public ScriptResultPacket(byte[] data) | ||||
|         { | ||||
| @@ -26,11 +28,11 @@ namespace FFXIVClassic_Map_Server.packets.send.script | ||||
|                 { | ||||
|                     try{ | ||||
|                         actorID = binReader.ReadUInt32(); | ||||
|                         scriptOwnerActorID = binReader.ReadUInt32(); | ||||
|                         val1 = binReader.ReadUInt32(); | ||||
|                         val2 = binReader.ReadUInt32(); | ||||
|                         val3 = binReader.ReadUInt32(); | ||||
|                         val4 = binReader.ReadUInt32(); | ||||
|                         val5 = binReader.ReadUInt32();                         | ||||
|                         binReader.ReadByte(); | ||||
|                         reader = new ScriptParamReader(binReader);                           | ||||
|                     } | ||||
|                     catch (Exception){ | ||||
|                         invalidPacket = true; | ||||
|   | ||||
| @@ -66,14 +66,12 @@ namespace FFXIVClassic_Map_Server.packets.send.actor | ||||
|  | ||||
|         private ushort runningByteTotal = 0; | ||||
|         private byte[] data = new byte[PACKET_SIZE - 0x20]; | ||||
|         private string script; | ||||
|  | ||||
|         private MemoryStream mem; | ||||
|         private BinaryWriter binWriter; | ||||
|  | ||||
|         public SetActorPropetyPacket(string script) | ||||
|         public SetActorPropetyPacket() | ||||
|         { | ||||
|             this.script = script; | ||||
|             mem = new MemoryStream(data); | ||||
|             binWriter = new BinaryWriter(mem); | ||||
|             binWriter.Seek(1, SeekOrigin.Begin); | ||||
| @@ -87,7 +85,7 @@ namespace FFXIVClassic_Map_Server.packets.send.actor | ||||
|  | ||||
|         public bool addByte(uint id, byte value) | ||||
|         { | ||||
|             if (runningByteTotal + 6 + Encoding.ASCII.GetByteCount(script) > MAXBYTES) | ||||
|             if (runningByteTotal + 6 > MAXBYTES) | ||||
|                 return false; | ||||
|  | ||||
|             binWriter.Write((byte)1); | ||||
| @@ -100,7 +98,7 @@ namespace FFXIVClassic_Map_Server.packets.send.actor | ||||
|  | ||||
|         public bool addShort(uint id, ushort value) | ||||
|         { | ||||
|             if (runningByteTotal + 7 + Encoding.ASCII.GetByteCount(script) > MAXBYTES) | ||||
|             if (runningByteTotal + 7 > MAXBYTES) | ||||
|                 return false; | ||||
|  | ||||
|             binWriter.Write((byte)2); | ||||
| @@ -113,7 +111,7 @@ namespace FFXIVClassic_Map_Server.packets.send.actor | ||||
|  | ||||
|         public bool addInt(uint id, uint value) | ||||
|         { | ||||
|             if (runningByteTotal + 9 + Encoding.ASCII.GetByteCount(script) > MAXBYTES) | ||||
|             if (runningByteTotal + 9 > MAXBYTES) | ||||
|                 return false; | ||||
|  | ||||
|             binWriter.Write((byte)4); | ||||
| @@ -124,11 +122,29 @@ namespace FFXIVClassic_Map_Server.packets.send.actor | ||||
|             return true; | ||||
|         } | ||||
|  | ||||
|         public bool addBuffer(uint id, byte[] buffer) | ||||
|         { | ||||
|             if (runningByteTotal + 5 + buffer.Length  > MAXBYTES) | ||||
|                 return false; | ||||
|  | ||||
|             binWriter.Write((byte)buffer.Length); | ||||
|             binWriter.Write((UInt32)id); | ||||
|             binWriter.Write(buffer); | ||||
|             runningByteTotal += (ushort)(5 + buffer.Length); | ||||
|  | ||||
|             return true; | ||||
|         } | ||||
|  | ||||
|         public void setTarget(string target) | ||||
|         { | ||||
|             binWriter.Write((byte)(0x82 + target.Length)); | ||||
|             binWriter.Write(target); | ||||
|             runningByteTotal += (ushort)(1 + target.Length); | ||||
|  | ||||
|         } | ||||
|  | ||||
|         public SubPacket buildPacket(uint playerActorID, uint actorID) | ||||
|         { | ||||
|             binWriter.Write((ushort)00); | ||||
|             binWriter.Write(Encoding.ASCII.GetBytes(script)); | ||||
|  | ||||
|             binWriter.Seek(0, SeekOrigin.Begin); | ||||
|             binWriter.Write((byte)runningByteTotal); | ||||
|              | ||||
|   | ||||
		Reference in New Issue
	
	Block a user