From fa52313419706fdd72d5218c1babf452708dcb82 Mon Sep 17 00:00:00 2001 From: Adam Mathieson Date: Mon, 22 Jul 2024 16:19:07 +0200 Subject: [PATCH 1/6] + AbsPosition_Inv + AbsPosition_ThreadFree + Start of Multiplayer client & server --- Multiplayer_Client/GameClient.cs | 71 +++++++++++++++ Multiplayer_Client/MessageParser.cs | 55 +++++++++++ Multiplayer_Client/Multiplayer_Client.csproj | 26 ++++++ Multiplayer_Client/OMSIClient.cs | 50 ++++++++++ Multiplayer_Server/Client.cs | 16 ++++ Multiplayer_Server/Lib/FastBinaryReader.cs | 74 +++++++++++++++ Multiplayer_Server/Lib/FastBinaryWriter.cs | 71 +++++++++++++++ Multiplayer_Server/Lib/OMSIMPMessages.cs | 44 +++++++++ Multiplayer_Server/MessageParser.cs | 69 ++++++++++++++ Multiplayer_Server/Multiplayer_Server.csproj | 19 ++++ Multiplayer_Server/OMSIServer.cs | 43 +++++++++ OmsiExtensions.sln | 91 +++++++++++++++++++ OmsiHook/WrappedOmsiClasses/OmsiMapObjInst.cs | 12 ++- 13 files changed, 639 insertions(+), 2 deletions(-) create mode 100644 Multiplayer_Client/GameClient.cs create mode 100644 Multiplayer_Client/MessageParser.cs create mode 100644 Multiplayer_Client/Multiplayer_Client.csproj create mode 100644 Multiplayer_Client/OMSIClient.cs create mode 100644 Multiplayer_Server/Client.cs create mode 100644 Multiplayer_Server/Lib/FastBinaryReader.cs create mode 100644 Multiplayer_Server/Lib/FastBinaryWriter.cs create mode 100644 Multiplayer_Server/Lib/OMSIMPMessages.cs create mode 100644 Multiplayer_Server/MessageParser.cs create mode 100644 Multiplayer_Server/Multiplayer_Server.csproj create mode 100644 Multiplayer_Server/OMSIServer.cs diff --git a/Multiplayer_Client/GameClient.cs b/Multiplayer_Client/GameClient.cs new file mode 100644 index 0000000..2189f18 --- /dev/null +++ b/Multiplayer_Client/GameClient.cs @@ -0,0 +1,71 @@ +using Microsoft.VisualBasic; +using OmsiHook; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Telepathy; + +namespace Multiplayer_Client +{ + internal class GameClient + { + public Tuple LastPing; + private OmsiHook.OmsiHook omsi; + private Dictionary Vehciles = new Dictionary(); + public GameClient() { + omsi = new OmsiHook.OmsiHook(); + omsi.AttachToOMSI().Wait(); + var OMSIRM = omsi.RemoteMethods; + OMSIRM.OmsiSetCriticalSectionLock(omsi.Globals.ProgamManager.CS_MakeVehiclePtr).ContinueWith((_) => + { + OMSIRM.MakeVehicle(@"Vehicles\GPM_MAN_LionsCity_M\MAN_A47.bus", __copyToMainList: true).ContinueWith((id) => + { + Console.WriteLine($"Spawned Vehicle ID: {id.Result}"); + Vehciles[0] = omsi.Globals.RoadVehicles.FList[1]; + OMSIRM.OmsiReleaseCriticalSectionLock(omsi.Globals.ProgamManager.CS_MakeVehiclePtr).ContinueWith((_) => Console.WriteLine($"Unlock")); + }); + }); + } + + public void updateVehicles(OMSIMPMessages.Vehicle_Position_Update update) + { + if (Vehciles.TryGetValue(update.ID, out var vehicle)) + { + vehicle.AbsPosition = update.abs_position; + vehicle.Position = update.position; + vehicle.Rotation = update.rotation; + vehicle.Velocity = update.velocity; + vehicle.MyKachelPnt = update.tile; + vehicle.AbsPosition_Inv = update.abs_position_inv; + } else + { + + } + } + + public void Tick(Telepathy.Client client) + { + if (omsi.Globals.PlayerVehicle.IsNull || !client.Connected) + return; + + var vehicle = omsi.Globals.PlayerVehicle; + Console.WriteLine($"\x1b[8;0HP:{vehicle.Position}/{vehicle.MyKachelPnt}\x1b[9;0HR:{vehicle.Rotation}\x1b[10;0HV:{vehicle.Velocity}"); + byte[] buff = new byte[180]; + int out_pos = 0; + FastBinaryWriter.Write(buff, ref out_pos, OMSIMPMessages.Messages.UPDATE_PLAYER_POSITION); + FastBinaryWriter.Write(buff, ref out_pos, new OMSIMPMessages.Player_Position_Update() + { + position = vehicle.Position, + abs_position = vehicle.AbsPosition, + abs_position_inv = vehicle.AbsPosition_Inv, + tile = vehicle.MyKachelPnt, + rotation = vehicle.Rotation, + velocity = vehicle.Velocity, + + }); + client.Send(buff); + } + } +} diff --git a/Multiplayer_Client/MessageParser.cs b/Multiplayer_Client/MessageParser.cs new file mode 100644 index 0000000..ca64f96 --- /dev/null +++ b/Multiplayer_Client/MessageParser.cs @@ -0,0 +1,55 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Multiplayer_Client +{ + internal class MessageParser + { + readonly static int MAJOR_VERSION = 1; + readonly static int MINOR_VERSION = 0; + public static void ParseMessage(byte[] message, Telepathy.Client client, GameClient gameClient) + { + message.AsSpan(0, message.Length); + int parse_pos = 0; + switch ((OMSIMPMessages.Messages)FastBinaryReader.ReadI32(message, ref parse_pos)) + { + case OMSIMPMessages.Messages.PING: + { + byte[] buff = new byte[8]; + int out_pos = 0; + FastBinaryWriter.Write(buff, ref out_pos, OMSIMPMessages.Messages.PONG); + FastBinaryWriter.Write(buff, ref out_pos, FastBinaryReader.ReadI32(message, ref parse_pos)); + client.Send(buff); + } + break; + case OMSIMPMessages.Messages.PONG: + { + if (gameClient.LastPing.Item1 == FastBinaryReader.ReadI32(message, ref parse_pos)) + { + gameClient.LastPing = new Tuple(gameClient.LastPing.Item1, gameClient.LastPing.Item2, DateTime.Now.Ticks); + Console.WriteLine($"Last Ping time: {((gameClient.LastPing.Item3 - gameClient.LastPing.Item2) / 10000):f3}ms"); + } + } + break; + case OMSIMPMessages.Messages.REPLY_VERSION: + { + Console.WriteLine($"Server Version: {FastBinaryReader.ReadI32(message, ref parse_pos)}.{FastBinaryReader.ReadI32(message, ref parse_pos):D2}"); + } + break; + case OMSIMPMessages.Messages.UPDATE_VEHICLE_POSITION: + { + gameClient.updateVehicles(FastBinaryReader.Read(message, ref parse_pos)); + } + break; + default: + { + Console.WriteLine($"Data received {message}"); + break; + } + } + } + } +} diff --git a/Multiplayer_Client/Multiplayer_Client.csproj b/Multiplayer_Client/Multiplayer_Client.csproj new file mode 100644 index 0000000..f774298 --- /dev/null +++ b/Multiplayer_Client/Multiplayer_Client.csproj @@ -0,0 +1,26 @@ + + + + Exe + net6.0-windows + enable + enable + OMSIClient + x86 + + + + + + + + + + + + + + + + + diff --git a/Multiplayer_Client/OMSIClient.cs b/Multiplayer_Client/OMSIClient.cs new file mode 100644 index 0000000..afd8d23 --- /dev/null +++ b/Multiplayer_Client/OMSIClient.cs @@ -0,0 +1,50 @@ +using Multiplayer_Client; +using System; +using System.Text; +using Telepathy; + +class OMSIClient +{ + static void Main(string[] args) + { + Client client = new Client(); + GameClient gameClient = new GameClient(); + client.Connect("127.0.0.1", 1337); + + + while (true) + { + Telepathy.Message msg; + while (client.GetNextMessage(out msg)) + { + switch (msg.eventType) + { + case EventType.Connected: + { + Console.WriteLine($"Client connected: {msg.connectionId}"); + byte[] buff = new byte[4]; + int out_pos = 0; + FastBinaryWriter.Write(buff, ref out_pos, OMSIMPMessages.Messages.REQUEST_VERSION); + client.Send(buff); + byte[] buff2 = new byte[8]; + out_pos = 0; + gameClient.LastPing = new Tuple(787, DateTime.Now.Ticks, 0); + FastBinaryWriter.Write(buff2, ref out_pos, OMSIMPMessages.Messages.PING); + FastBinaryWriter.Write(buff2, ref out_pos, 787); + client.Send(buff2); + } + break; + case EventType.Data: + MessageParser.ParseMessage(msg.data, client, gameClient); + break; + case EventType.Disconnected: + Console.WriteLine($"Client disconnected: {msg.connectionId}"); + break; + } + } + gameClient.Tick(client); + System.Threading.Thread.Sleep(10); + } + client.Disconnect(); + } +} diff --git a/Multiplayer_Server/Client.cs b/Multiplayer_Server/Client.cs new file mode 100644 index 0000000..c1e56d7 --- /dev/null +++ b/Multiplayer_Server/Client.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Multiplayer_Server +{ + internal class Client + { + public int ClientId { get; private set; } + public Client(int clientId) { + ClientId = clientId; + } + } +} diff --git a/Multiplayer_Server/Lib/FastBinaryReader.cs b/Multiplayer_Server/Lib/FastBinaryReader.cs new file mode 100644 index 0000000..458b62a --- /dev/null +++ b/Multiplayer_Server/Lib/FastBinaryReader.cs @@ -0,0 +1,74 @@ +using System; +using System.Buffers.Binary; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; + +internal static class FastBinaryReader +{ + public static int ReadI32(Span buffer, ref int pos) + { + var ret = BitConverter.ToInt32(buffer[pos..]); + pos += 4; + return ret; + } + + public static uint ReadU32(Span buffer, ref int pos) + { + var ret = BitConverter.ToUInt32(buffer[pos..]); + pos += 4; + return ret; + } + + public static short ReadI16(Span buffer, ref int pos) + { + var ret = BitConverter.ToInt16(buffer[pos..]); + pos += 2; + return ret; + } + + public static ushort ReadU16(Span buffer, ref int pos) + { + var ret = BitConverter.ToUInt16(buffer[pos..]); + pos += 2; + return ret; + } + + public static sbyte ReadI8(Span buffer, ref int pos) + { + var ret = (sbyte)buffer[pos]; + pos += 1; + return ret; + } + + public static byte ReadU8(Span buffer, ref int pos) + { + var ret = buffer[pos]; + pos += 1; + return ret; + } + + public static bool ReadBool(Span buffer, ref int pos) + { + var ret = BitConverter.ToBoolean(buffer[pos..]); + pos += 1; + return ret; + } + + public static float ReadFloat(Span buffer, ref int pos) + { + var ret = BitConverter.ToSingle(buffer[pos..]); + pos += 4; + return ret; + } + + public static T Read(Span buffer, ref int pos) where T : struct + { + var ret = MemoryMarshal.Read(buffer[pos..]); + pos += Unsafe.SizeOf(); + return ret; + } +} diff --git a/Multiplayer_Server/Lib/FastBinaryWriter.cs b/Multiplayer_Server/Lib/FastBinaryWriter.cs new file mode 100644 index 0000000..db16d34 --- /dev/null +++ b/Multiplayer_Server/Lib/FastBinaryWriter.cs @@ -0,0 +1,71 @@ +using System; +using System.Buffers.Binary; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; + +internal static class FastBinaryWriter +{ + public static void Write(Span buffer, ref int pos, int data) + { + BitConverter.TryWriteBytes(buffer[pos..], data); + pos += 4; + } + + public static void Write(Span buffer, ref int pos, uint data) + { + BitConverter.TryWriteBytes(buffer[pos..], data); + pos += 4; + } + + public static void Write(Span buffer, ref int pos, short data) + { + BitConverter.TryWriteBytes(buffer[pos..], data); + pos += 2; + } + public static void Write(Span buffer, ref int pos, ushort data) + { + BitConverter.TryWriteBytes(buffer[pos..], data); + pos += 2; + } + + public static void Write(Span buffer, ref int pos, byte data, int advance = 1) + { + BitConverter.TryWriteBytes(buffer[pos..], data); + pos += advance; + } + + public static void Write(Span buffer, ref int pos, sbyte data) + { + BitConverter.TryWriteBytes(buffer[pos..], data); + pos += 1; + } + + public static void Write(Span buffer, ref int pos, bool data) + { + BitConverter.TryWriteBytes(buffer[pos..], data); + pos += 1; + } + + public static void Write(Span buffer, ref int pos, float data) + { + BitConverter.TryWriteBytes(buffer[pos..], data); + pos += 4; + } + + public static void Write(byte[] buffer, ref int pos, int data) + { + BitConverter.TryWriteBytes(buffer.AsSpan()[pos..], data); + pos += 4; + } + + public static void Write(Span buffer, ref int pos, T dataStruct) where T : struct + { + MemoryMarshal.Write(buffer[pos..], ref dataStruct); + pos += Unsafe.SizeOf(); + } +} diff --git a/Multiplayer_Server/Lib/OMSIMPMessages.cs b/Multiplayer_Server/Lib/OMSIMPMessages.cs new file mode 100644 index 0000000..eadd42e --- /dev/null +++ b/Multiplayer_Server/Lib/OMSIMPMessages.cs @@ -0,0 +1,44 @@ +using OmsiHook; + +public static class OMSIMPMessages +{ + public enum Messages : int + { // Arguments + REQUEST_VERSION = 0, // - + REPLY_VERSION = 1, // Struct Version_Reply + UPDATE_PLAYER_POSITION = 2, // Struct Player_Position_Update + UPDATE_VEHICLE_POSITION = 3, + REQUEST_PLAYERS = 4, + REPLY_PLAYERS = 5, + PING = 6, // Int32 Nonce + PONG = 7, // Int32 Nonce + } + + public struct Version_Reply + { + public int Major; + public int Minor; + } + + public struct Player_Position_Update + { + public D3DMatrix abs_position; + public D3DMatrix abs_position_inv; + public OmsiPoint tile; + public D3DXQuaternion rotation; + public D3DVector velocity; + public D3DVector position; + } + + public struct Vehicle_Position_Update + { + public int ID; + public D3DMatrix abs_position; + public D3DMatrix abs_position_inv; + public OmsiPoint tile; + public D3DXQuaternion rotation; + public D3DVector velocity; + public D3DVector position; + + } +} diff --git a/Multiplayer_Server/MessageParser.cs b/Multiplayer_Server/MessageParser.cs new file mode 100644 index 0000000..b44be1c --- /dev/null +++ b/Multiplayer_Server/MessageParser.cs @@ -0,0 +1,69 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Multiplayer_Server +{ + internal class MessageParser + { + readonly static int MAJOR_VERSION = 1; + readonly static int MINOR_VERSION = 0; + public static void ParseMessage(byte[] message, Client client, Telepathy.Server server) + { + message.AsSpan(0, message.Length); + int parse_pos = 0; + switch ((OMSIMPMessages.Messages) FastBinaryReader.ReadI32(message, ref parse_pos)) + { + case OMSIMPMessages.Messages.REQUEST_VERSION: + { + byte[] buff = new byte[12]; + int out_pos = 0; + FastBinaryWriter.Write(buff, ref out_pos, OMSIMPMessages.Messages.REPLY_VERSION); + FastBinaryWriter.Write(buff, ref out_pos, new OMSIMPMessages.Version_Reply() { Major = MAJOR_VERSION, Minor = MINOR_VERSION }); + server.Send(client.ClientId, buff); + } + break; + + case OMSIMPMessages.Messages.UPDATE_PLAYER_POSITION: + { + var position = FastBinaryReader.Read(message, ref parse_pos); + Console.WriteLine($"\u001b[8;0HP:{position.position}/{position.tile}\u001b[9;0HR:{position.rotation}\u001b[10;0HV:{position.velocity}"); + + byte[] buff = new byte[184]; + int out_pos = 0; + FastBinaryWriter.Write(buff, ref out_pos, OMSIMPMessages.Messages.UPDATE_VEHICLE_POSITION); + FastBinaryWriter.Write(buff, ref out_pos, new OMSIMPMessages.Vehicle_Position_Update() { + ID = 0, + rotation = position.rotation, + tile = position.tile, + velocity = position.velocity, + abs_position = (position.abs_position), + abs_position_inv = (position.abs_position_inv), + position = position.position }); + server.Send(client.ClientId, buff); + + } + break; + + case OMSIMPMessages.Messages.REQUEST_PLAYERS: break; + + case OMSIMPMessages.Messages.PING: + { + byte[] buff = new byte[8]; + int out_pos = 0; + FastBinaryWriter.Write(buff, ref out_pos, OMSIMPMessages.Messages.PONG); + FastBinaryWriter.Write(buff, ref out_pos, FastBinaryReader.ReadI32(message, ref parse_pos)); + server.Send(client.ClientId, buff); + } + break; + default: + { + Console.WriteLine($"Data received from {client.ClientId}: {message}"); + break; + } + } + } + } +} diff --git a/Multiplayer_Server/Multiplayer_Server.csproj b/Multiplayer_Server/Multiplayer_Server.csproj new file mode 100644 index 0000000..f1d8630 --- /dev/null +++ b/Multiplayer_Server/Multiplayer_Server.csproj @@ -0,0 +1,19 @@ + + + + Exe + net6.0-windows + enable + enable + x86 + + + + + + + + + + + diff --git a/Multiplayer_Server/OMSIServer.cs b/Multiplayer_Server/OMSIServer.cs new file mode 100644 index 0000000..6c82ed9 --- /dev/null +++ b/Multiplayer_Server/OMSIServer.cs @@ -0,0 +1,43 @@ +using Multiplayer_Server; +using System; +using System.Linq; +using Telepathy; +using Client = Multiplayer_Server.Client; + +internal class OMSIServer +{ + + static void Main(string[] args) + { + Dictionary? Clients = new Dictionary(); + Telepathy.Server server = new Telepathy.Server(); + server.Start(1337); + + Console.WriteLine("Server started. Press Ctrl+C to stop..."); + + while (true) + { + Telepathy.Message msg; + while (server.GetNextMessage(out msg)) + { + switch (msg.eventType) + { + case EventType.Connected: + Clients.Add(msg.connectionId, new Client(msg.connectionId)); + Console.WriteLine($"Client connected: {server.GetClientAddress(msg.connectionId)}"); + break; + case EventType.Data: + MessageParser.ParseMessage(msg.data, Clients[msg.connectionId], server); + break; + case EventType.Disconnected: + Console.WriteLine($"Client disconnected: {Clients[msg.connectionId].ClientId}"); + Clients.Remove(msg.connectionId); + break; + } + } + System.Threading.Thread.Sleep(10); + } + + server.Stop(); + } +} diff --git a/OmsiExtensions.sln b/OmsiExtensions.sln index fd2db97..203697b 100644 --- a/OmsiExtensions.sln +++ b/OmsiExtensions.sln @@ -25,73 +25,164 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TriggersSample", "_OmsiHook EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VideoDemo", "_OmsiHookExamples\VideoDemo\VideoDemo.csproj", "{D94FF6D3-08AA-41CB-B9B9-F82E860E6E96}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Multiplayer_Server", "Multiplayer_Server\Multiplayer_Server.csproj", "{2D4DDEF6-2C5D-4348-8DCE-33201BFF046C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Multiplayer_Client", "Multiplayer_Client\Multiplayer_Client.csproj", "{33EBE989-3BB8-4773-96E6-A7D68E5655CD}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU Release|x86 = Release|x86 + ReleaseAndDocs|Any CPU = ReleaseAndDocs|Any CPU ReleaseAndDocs|x86 = ReleaseAndDocs|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution + {2E750CBE-F868-4AB7-96C2-27560F53E06B}.Debug|Any CPU.ActiveCfg = Debug|x86 + {2E750CBE-F868-4AB7-96C2-27560F53E06B}.Debug|Any CPU.Build.0 = Debug|x86 {2E750CBE-F868-4AB7-96C2-27560F53E06B}.Debug|x86.ActiveCfg = Debug|x86 {2E750CBE-F868-4AB7-96C2-27560F53E06B}.Debug|x86.Build.0 = Debug|x86 + {2E750CBE-F868-4AB7-96C2-27560F53E06B}.Release|Any CPU.ActiveCfg = Release|x86 + {2E750CBE-F868-4AB7-96C2-27560F53E06B}.Release|Any CPU.Build.0 = Release|x86 {2E750CBE-F868-4AB7-96C2-27560F53E06B}.Release|x86.ActiveCfg = Release|x86 {2E750CBE-F868-4AB7-96C2-27560F53E06B}.Release|x86.Build.0 = Release|x86 + {2E750CBE-F868-4AB7-96C2-27560F53E06B}.ReleaseAndDocs|Any CPU.ActiveCfg = ReleaseAndDocs|x86 + {2E750CBE-F868-4AB7-96C2-27560F53E06B}.ReleaseAndDocs|Any CPU.Build.0 = ReleaseAndDocs|x86 {2E750CBE-F868-4AB7-96C2-27560F53E06B}.ReleaseAndDocs|x86.ActiveCfg = ReleaseAndDocs|x86 {2E750CBE-F868-4AB7-96C2-27560F53E06B}.ReleaseAndDocs|x86.Build.0 = ReleaseAndDocs|x86 + {28DA0165-EAA7-4171-A065-319409682BD1}.Debug|Any CPU.ActiveCfg = Debug|x86 + {28DA0165-EAA7-4171-A065-319409682BD1}.Debug|Any CPU.Build.0 = Debug|x86 {28DA0165-EAA7-4171-A065-319409682BD1}.Debug|x86.ActiveCfg = Debug|x86 {28DA0165-EAA7-4171-A065-319409682BD1}.Debug|x86.Build.0 = Debug|x86 + {28DA0165-EAA7-4171-A065-319409682BD1}.Release|Any CPU.ActiveCfg = Release|x86 + {28DA0165-EAA7-4171-A065-319409682BD1}.Release|Any CPU.Build.0 = Release|x86 {28DA0165-EAA7-4171-A065-319409682BD1}.Release|x86.ActiveCfg = Release|x86 {28DA0165-EAA7-4171-A065-319409682BD1}.Release|x86.Build.0 = Release|x86 + {28DA0165-EAA7-4171-A065-319409682BD1}.ReleaseAndDocs|Any CPU.ActiveCfg = Release|x86 + {28DA0165-EAA7-4171-A065-319409682BD1}.ReleaseAndDocs|Any CPU.Build.0 = Release|x86 {28DA0165-EAA7-4171-A065-319409682BD1}.ReleaseAndDocs|x86.ActiveCfg = Release|x86 {28DA0165-EAA7-4171-A065-319409682BD1}.ReleaseAndDocs|x86.Build.0 = Release|x86 + {FDA9A525-9722-46D3-B80C-8D2A76ABCA2D}.Debug|Any CPU.ActiveCfg = Debug|x86 + {FDA9A525-9722-46D3-B80C-8D2A76ABCA2D}.Debug|Any CPU.Build.0 = Debug|x86 {FDA9A525-9722-46D3-B80C-8D2A76ABCA2D}.Debug|x86.ActiveCfg = Debug|x86 {FDA9A525-9722-46D3-B80C-8D2A76ABCA2D}.Debug|x86.Build.0 = Debug|x86 + {FDA9A525-9722-46D3-B80C-8D2A76ABCA2D}.Release|Any CPU.ActiveCfg = Release|x86 + {FDA9A525-9722-46D3-B80C-8D2A76ABCA2D}.Release|Any CPU.Build.0 = Release|x86 {FDA9A525-9722-46D3-B80C-8D2A76ABCA2D}.Release|x86.ActiveCfg = Release|x86 {FDA9A525-9722-46D3-B80C-8D2A76ABCA2D}.Release|x86.Build.0 = Release|x86 + {FDA9A525-9722-46D3-B80C-8D2A76ABCA2D}.ReleaseAndDocs|Any CPU.ActiveCfg = Release|x86 + {FDA9A525-9722-46D3-B80C-8D2A76ABCA2D}.ReleaseAndDocs|Any CPU.Build.0 = Release|x86 {FDA9A525-9722-46D3-B80C-8D2A76ABCA2D}.ReleaseAndDocs|x86.ActiveCfg = Release|x86 {FDA9A525-9722-46D3-B80C-8D2A76ABCA2D}.ReleaseAndDocs|x86.Build.0 = Release|x86 + {D5CA6EEA-D436-456E-BCA5-34C3DFD5BFC7}.Debug|Any CPU.ActiveCfg = Debug|x86 + {D5CA6EEA-D436-456E-BCA5-34C3DFD5BFC7}.Debug|Any CPU.Build.0 = Debug|x86 {D5CA6EEA-D436-456E-BCA5-34C3DFD5BFC7}.Debug|x86.ActiveCfg = Debug|x86 {D5CA6EEA-D436-456E-BCA5-34C3DFD5BFC7}.Debug|x86.Build.0 = Debug|x86 + {D5CA6EEA-D436-456E-BCA5-34C3DFD5BFC7}.Release|Any CPU.ActiveCfg = Release|x86 + {D5CA6EEA-D436-456E-BCA5-34C3DFD5BFC7}.Release|Any CPU.Build.0 = Release|x86 {D5CA6EEA-D436-456E-BCA5-34C3DFD5BFC7}.Release|x86.ActiveCfg = Release|x86 {D5CA6EEA-D436-456E-BCA5-34C3DFD5BFC7}.Release|x86.Build.0 = Release|x86 + {D5CA6EEA-D436-456E-BCA5-34C3DFD5BFC7}.ReleaseAndDocs|Any CPU.ActiveCfg = Release|x86 + {D5CA6EEA-D436-456E-BCA5-34C3DFD5BFC7}.ReleaseAndDocs|Any CPU.Build.0 = Release|x86 {D5CA6EEA-D436-456E-BCA5-34C3DFD5BFC7}.ReleaseAndDocs|x86.ActiveCfg = Release|x86 {D5CA6EEA-D436-456E-BCA5-34C3DFD5BFC7}.ReleaseAndDocs|x86.Build.0 = Release|x86 + {CBCB99EF-DD1A-4D4D-A9A8-9BF251FDCD1B}.Debug|Any CPU.ActiveCfg = Debug|Win32 + {CBCB99EF-DD1A-4D4D-A9A8-9BF251FDCD1B}.Debug|Any CPU.Build.0 = Debug|Win32 {CBCB99EF-DD1A-4D4D-A9A8-9BF251FDCD1B}.Debug|x86.ActiveCfg = Debug|Win32 {CBCB99EF-DD1A-4D4D-A9A8-9BF251FDCD1B}.Debug|x86.Build.0 = Debug|Win32 + {CBCB99EF-DD1A-4D4D-A9A8-9BF251FDCD1B}.Release|Any CPU.ActiveCfg = Release|Win32 + {CBCB99EF-DD1A-4D4D-A9A8-9BF251FDCD1B}.Release|Any CPU.Build.0 = Release|Win32 {CBCB99EF-DD1A-4D4D-A9A8-9BF251FDCD1B}.Release|x86.ActiveCfg = Release|Win32 {CBCB99EF-DD1A-4D4D-A9A8-9BF251FDCD1B}.Release|x86.Build.0 = Release|Win32 + {CBCB99EF-DD1A-4D4D-A9A8-9BF251FDCD1B}.ReleaseAndDocs|Any CPU.ActiveCfg = Release|Win32 + {CBCB99EF-DD1A-4D4D-A9A8-9BF251FDCD1B}.ReleaseAndDocs|Any CPU.Build.0 = Release|Win32 {CBCB99EF-DD1A-4D4D-A9A8-9BF251FDCD1B}.ReleaseAndDocs|x86.ActiveCfg = Release|Win32 {CBCB99EF-DD1A-4D4D-A9A8-9BF251FDCD1B}.ReleaseAndDocs|x86.Build.0 = Release|Win32 + {CDB17143-5653-48BE-AAC8-8419D5B4FD2C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CDB17143-5653-48BE-AAC8-8419D5B4FD2C}.Debug|Any CPU.Build.0 = Debug|Any CPU {CDB17143-5653-48BE-AAC8-8419D5B4FD2C}.Debug|x86.ActiveCfg = Debug|x86 {CDB17143-5653-48BE-AAC8-8419D5B4FD2C}.Debug|x86.Build.0 = Debug|x86 + {CDB17143-5653-48BE-AAC8-8419D5B4FD2C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CDB17143-5653-48BE-AAC8-8419D5B4FD2C}.Release|Any CPU.Build.0 = Release|Any CPU {CDB17143-5653-48BE-AAC8-8419D5B4FD2C}.Release|x86.ActiveCfg = Release|x86 {CDB17143-5653-48BE-AAC8-8419D5B4FD2C}.Release|x86.Build.0 = Release|x86 + {CDB17143-5653-48BE-AAC8-8419D5B4FD2C}.ReleaseAndDocs|Any CPU.ActiveCfg = Release|Any CPU + {CDB17143-5653-48BE-AAC8-8419D5B4FD2C}.ReleaseAndDocs|Any CPU.Build.0 = Release|Any CPU {CDB17143-5653-48BE-AAC8-8419D5B4FD2C}.ReleaseAndDocs|x86.ActiveCfg = Release|x86 {CDB17143-5653-48BE-AAC8-8419D5B4FD2C}.ReleaseAndDocs|x86.Build.0 = Release|x86 + {BA833C68-E8BD-4C86-9555-85542DF02015}.Debug|Any CPU.ActiveCfg = Debug|x86 + {BA833C68-E8BD-4C86-9555-85542DF02015}.Debug|Any CPU.Build.0 = Debug|x86 {BA833C68-E8BD-4C86-9555-85542DF02015}.Debug|x86.ActiveCfg = Debug|x86 {BA833C68-E8BD-4C86-9555-85542DF02015}.Debug|x86.Build.0 = Debug|x86 + {BA833C68-E8BD-4C86-9555-85542DF02015}.Release|Any CPU.ActiveCfg = Release|x86 + {BA833C68-E8BD-4C86-9555-85542DF02015}.Release|Any CPU.Build.0 = Release|x86 {BA833C68-E8BD-4C86-9555-85542DF02015}.Release|x86.ActiveCfg = Release|x86 {BA833C68-E8BD-4C86-9555-85542DF02015}.Release|x86.Build.0 = Release|x86 + {BA833C68-E8BD-4C86-9555-85542DF02015}.ReleaseAndDocs|Any CPU.ActiveCfg = Release|x86 + {BA833C68-E8BD-4C86-9555-85542DF02015}.ReleaseAndDocs|Any CPU.Build.0 = Release|x86 {BA833C68-E8BD-4C86-9555-85542DF02015}.ReleaseAndDocs|x86.ActiveCfg = Release|x86 {BA833C68-E8BD-4C86-9555-85542DF02015}.ReleaseAndDocs|x86.Build.0 = Release|x86 + {47659503-9923-4E74-AD26-103C1F9FF2B0}.Debug|Any CPU.ActiveCfg = Debug|x86 + {47659503-9923-4E74-AD26-103C1F9FF2B0}.Debug|Any CPU.Build.0 = Debug|x86 {47659503-9923-4E74-AD26-103C1F9FF2B0}.Debug|x86.ActiveCfg = Debug|x86 {47659503-9923-4E74-AD26-103C1F9FF2B0}.Debug|x86.Build.0 = Debug|x86 + {47659503-9923-4E74-AD26-103C1F9FF2B0}.Release|Any CPU.ActiveCfg = Release|x86 + {47659503-9923-4E74-AD26-103C1F9FF2B0}.Release|Any CPU.Build.0 = Release|x86 {47659503-9923-4E74-AD26-103C1F9FF2B0}.Release|x86.ActiveCfg = Release|x86 {47659503-9923-4E74-AD26-103C1F9FF2B0}.Release|x86.Build.0 = Release|x86 + {47659503-9923-4E74-AD26-103C1F9FF2B0}.ReleaseAndDocs|Any CPU.ActiveCfg = Release|x86 + {47659503-9923-4E74-AD26-103C1F9FF2B0}.ReleaseAndDocs|Any CPU.Build.0 = Release|x86 {47659503-9923-4E74-AD26-103C1F9FF2B0}.ReleaseAndDocs|x86.ActiveCfg = Release|x86 {47659503-9923-4E74-AD26-103C1F9FF2B0}.ReleaseAndDocs|x86.Build.0 = Release|x86 + {1DF326AE-4D10-4545-B36A-5622B76987EC}.Debug|Any CPU.ActiveCfg = Debug|x86 + {1DF326AE-4D10-4545-B36A-5622B76987EC}.Debug|Any CPU.Build.0 = Debug|x86 {1DF326AE-4D10-4545-B36A-5622B76987EC}.Debug|x86.ActiveCfg = Debug|x86 {1DF326AE-4D10-4545-B36A-5622B76987EC}.Debug|x86.Build.0 = Debug|x86 + {1DF326AE-4D10-4545-B36A-5622B76987EC}.Release|Any CPU.ActiveCfg = Release|x86 + {1DF326AE-4D10-4545-B36A-5622B76987EC}.Release|Any CPU.Build.0 = Release|x86 {1DF326AE-4D10-4545-B36A-5622B76987EC}.Release|x86.ActiveCfg = Release|x86 {1DF326AE-4D10-4545-B36A-5622B76987EC}.Release|x86.Build.0 = Release|x86 + {1DF326AE-4D10-4545-B36A-5622B76987EC}.ReleaseAndDocs|Any CPU.ActiveCfg = Release|x86 + {1DF326AE-4D10-4545-B36A-5622B76987EC}.ReleaseAndDocs|Any CPU.Build.0 = Release|x86 {1DF326AE-4D10-4545-B36A-5622B76987EC}.ReleaseAndDocs|x86.ActiveCfg = Release|x86 {1DF326AE-4D10-4545-B36A-5622B76987EC}.ReleaseAndDocs|x86.Build.0 = Release|x86 + {D94FF6D3-08AA-41CB-B9B9-F82E860E6E96}.Debug|Any CPU.ActiveCfg = Debug|x86 + {D94FF6D3-08AA-41CB-B9B9-F82E860E6E96}.Debug|Any CPU.Build.0 = Debug|x86 {D94FF6D3-08AA-41CB-B9B9-F82E860E6E96}.Debug|x86.ActiveCfg = Debug|x86 {D94FF6D3-08AA-41CB-B9B9-F82E860E6E96}.Debug|x86.Build.0 = Debug|x86 + {D94FF6D3-08AA-41CB-B9B9-F82E860E6E96}.Release|Any CPU.ActiveCfg = Release|x86 + {D94FF6D3-08AA-41CB-B9B9-F82E860E6E96}.Release|Any CPU.Build.0 = Release|x86 {D94FF6D3-08AA-41CB-B9B9-F82E860E6E96}.Release|x86.ActiveCfg = Release|x86 {D94FF6D3-08AA-41CB-B9B9-F82E860E6E96}.Release|x86.Build.0 = Release|x86 + {D94FF6D3-08AA-41CB-B9B9-F82E860E6E96}.ReleaseAndDocs|Any CPU.ActiveCfg = Release|x86 + {D94FF6D3-08AA-41CB-B9B9-F82E860E6E96}.ReleaseAndDocs|Any CPU.Build.0 = Release|x86 {D94FF6D3-08AA-41CB-B9B9-F82E860E6E96}.ReleaseAndDocs|x86.ActiveCfg = Release|x86 {D94FF6D3-08AA-41CB-B9B9-F82E860E6E96}.ReleaseAndDocs|x86.Build.0 = Release|x86 + {2D4DDEF6-2C5D-4348-8DCE-33201BFF046C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2D4DDEF6-2C5D-4348-8DCE-33201BFF046C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2D4DDEF6-2C5D-4348-8DCE-33201BFF046C}.Debug|x86.ActiveCfg = Debug|Any CPU + {2D4DDEF6-2C5D-4348-8DCE-33201BFF046C}.Debug|x86.Build.0 = Debug|Any CPU + {2D4DDEF6-2C5D-4348-8DCE-33201BFF046C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2D4DDEF6-2C5D-4348-8DCE-33201BFF046C}.Release|Any CPU.Build.0 = Release|Any CPU + {2D4DDEF6-2C5D-4348-8DCE-33201BFF046C}.Release|x86.ActiveCfg = Release|Any CPU + {2D4DDEF6-2C5D-4348-8DCE-33201BFF046C}.Release|x86.Build.0 = Release|Any CPU + {2D4DDEF6-2C5D-4348-8DCE-33201BFF046C}.ReleaseAndDocs|Any CPU.ActiveCfg = Release|Any CPU + {2D4DDEF6-2C5D-4348-8DCE-33201BFF046C}.ReleaseAndDocs|Any CPU.Build.0 = Release|Any CPU + {2D4DDEF6-2C5D-4348-8DCE-33201BFF046C}.ReleaseAndDocs|x86.ActiveCfg = Release|Any CPU + {2D4DDEF6-2C5D-4348-8DCE-33201BFF046C}.ReleaseAndDocs|x86.Build.0 = Release|Any CPU + {33EBE989-3BB8-4773-96E6-A7D68E5655CD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {33EBE989-3BB8-4773-96E6-A7D68E5655CD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {33EBE989-3BB8-4773-96E6-A7D68E5655CD}.Debug|x86.ActiveCfg = Debug|Any CPU + {33EBE989-3BB8-4773-96E6-A7D68E5655CD}.Debug|x86.Build.0 = Debug|Any CPU + {33EBE989-3BB8-4773-96E6-A7D68E5655CD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {33EBE989-3BB8-4773-96E6-A7D68E5655CD}.Release|Any CPU.Build.0 = Release|Any CPU + {33EBE989-3BB8-4773-96E6-A7D68E5655CD}.Release|x86.ActiveCfg = Release|Any CPU + {33EBE989-3BB8-4773-96E6-A7D68E5655CD}.Release|x86.Build.0 = Release|Any CPU + {33EBE989-3BB8-4773-96E6-A7D68E5655CD}.ReleaseAndDocs|Any CPU.ActiveCfg = Release|Any CPU + {33EBE989-3BB8-4773-96E6-A7D68E5655CD}.ReleaseAndDocs|Any CPU.Build.0 = Release|Any CPU + {33EBE989-3BB8-4773-96E6-A7D68E5655CD}.ReleaseAndDocs|x86.ActiveCfg = Release|Any CPU + {33EBE989-3BB8-4773-96E6-A7D68E5655CD}.ReleaseAndDocs|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/OmsiHook/WrappedOmsiClasses/OmsiMapObjInst.cs b/OmsiHook/WrappedOmsiClasses/OmsiMapObjInst.cs index fabbf01..81b7a64 100644 --- a/OmsiHook/WrappedOmsiClasses/OmsiMapObjInst.cs +++ b/OmsiHook/WrappedOmsiClasses/OmsiMapObjInst.cs @@ -40,7 +40,15 @@ public D3DMatrix AbsPosition get => Memory.ReadMemory(Address + 0x78); set => Memory.WriteMemory(Address + 0x78, value); } - public D3DMatrix AbsPosition_Inv => Memory.ReadMemory(Address + 0xb8); - public D3DMatrix AbsPosition_ThreadFree => Memory.ReadMemory(Address + 0xf8); + public D3DMatrix AbsPosition_Inv + { + get => Memory.ReadMemory(Address + 0xb8); + set => Memory.WriteMemory(Address + 0xb8, value); + } + public D3DMatrix AbsPosition_ThreadFree + { + get => Memory.ReadMemory(Address + 0xf8); + set => Memory.WriteMemory(Address + 0xf8, value); + } } } \ No newline at end of file From 286345502dd0f44908b1c24ea361bdae6af0cb3a Mon Sep 17 00:00:00 2001 From: Adam Mathieson Date: Mon, 22 Jul 2024 23:06:36 +0200 Subject: [PATCH 2/6] + Changes to position transmission - still not perfect --- Multiplayer_Client/GameClient.cs | 52 ++++++++++++++----- Multiplayer_Client/MessageParser.cs | 2 +- Multiplayer_Client/OMSIClient.cs | 2 +- Multiplayer_Server/Lib/OMSIMPMessages.cs | 16 +++--- Multiplayer_Server/MessageParser.cs | 13 +++-- OmsiHook/OmsiStructs.cs | 21 +++++--- OmsiHook/WrappedOmsiClasses/OmsiMapObjInst.cs | 16 ++++-- .../OmsiMovingMapObjInst.cs | 4 +- .../WrappedOmsiClasses/OmsiRoadVehicleInst.cs | 12 ++--- 9 files changed, 92 insertions(+), 46 deletions(-) diff --git a/Multiplayer_Client/GameClient.cs b/Multiplayer_Client/GameClient.cs index 2189f18..633b84c 100644 --- a/Multiplayer_Client/GameClient.cs +++ b/Multiplayer_Client/GameClient.cs @@ -5,7 +5,9 @@ using System.Linq; using System.Text; using System.Threading.Tasks; +using System.Numerics; using Telepathy; +using System.Runtime.CompilerServices; namespace Multiplayer_Client { @@ -13,7 +15,7 @@ internal class GameClient { public Tuple LastPing; private OmsiHook.OmsiHook omsi; - private Dictionary Vehciles = new Dictionary(); + private Dictionary Vehicles = new Dictionary(); public GameClient() { omsi = new OmsiHook.OmsiHook(); omsi.AttachToOMSI().Wait(); @@ -23,23 +25,44 @@ public GameClient() { OMSIRM.MakeVehicle(@"Vehicles\GPM_MAN_LionsCity_M\MAN_A47.bus", __copyToMainList: true).ContinueWith((id) => { Console.WriteLine($"Spawned Vehicle ID: {id.Result}"); - Vehciles[0] = omsi.Globals.RoadVehicles.FList[1]; + Vehicles[0] = omsi.Globals.RoadVehicles.FList[1]; OMSIRM.OmsiReleaseCriticalSectionLock(omsi.Globals.ProgamManager.CS_MakeVehiclePtr).ContinueWith((_) => Console.WriteLine($"Unlock")); }); }); } - public void updateVehicles(OMSIMPMessages.Vehicle_Position_Update update) + int i = 0; + public void UpdateVehicles(OMSIMPMessages.Vehicle_Position_Update update) { - if (Vehciles.TryGetValue(update.ID, out var vehicle)) + if (Vehicles.TryGetValue(update.ID, out var vehicle)) { - vehicle.AbsPosition = update.abs_position; - vehicle.Position = update.position; + if (i % 20 == 0) + vehicle.Position = update.position; vehicle.Rotation = update.rotation; vehicle.Velocity = update.velocity; vehicle.MyKachelPnt = update.tile; - vehicle.AbsPosition_Inv = update.abs_position_inv; - } else + vehicle.RelMatrix = update.relmatrix; + vehicle.Acc_Local = update.acclocal; + + var posMat = Matrix4x4.CreateFromQuaternion(update.rotation); + posMat.Translation = update.position; + var absPosMat = Matrix4x4.Multiply(posMat, Matrix4x4.Identity/*update.relmatrix*/); + Matrix4x4.Invert(absPosMat, out var absPosMatInv); + + vehicle.Pos_Mat = posMat; + vehicle.AbsPosition = absPosMat; + vehicle.AbsPosition_Inv = absPosMatInv; + vehicle.Used_RelVec = ((Matrix4x4)update.relmatrix).Translation; + vehicle.AI_Blinker_L = 1; + vehicle.AI_Blinker_R = 1; + vehicle.AI_var = 1; + + + //vehicle.AbsPosition = update.abs_position; + //vehicle.AbsPosition_Inv = update.abs_position_inv; + i++; + } + else { } @@ -51,20 +74,21 @@ public void Tick(Telepathy.Client client) return; var vehicle = omsi.Globals.PlayerVehicle; - Console.WriteLine($"\x1b[8;0HP:{vehicle.Position}/{vehicle.MyKachelPnt}\x1b[9;0HR:{vehicle.Rotation}\x1b[10;0HV:{vehicle.Velocity}"); - byte[] buff = new byte[180]; + Console.WriteLine($"\x1b[8;0HP:{vehicle.Position}/{vehicle.MyKachelPnt}\x1b[9;0HR:{vehicle.Rotation}\x1b[10;0HV:{vehicle.Velocity}\x1b[11;0HB:{vehicle.Acc_Local} / {((Vehicles.ContainsKey(0)) ? (Vehicles[0].Acc_Local.ToString()):"-")}"); + byte[] buff = new byte[Unsafe.SizeOf() + 4]; int out_pos = 0; FastBinaryWriter.Write(buff, ref out_pos, OMSIMPMessages.Messages.UPDATE_PLAYER_POSITION); FastBinaryWriter.Write(buff, ref out_pos, new OMSIMPMessages.Player_Position_Update() { position = vehicle.Position, - abs_position = vehicle.AbsPosition, - abs_position_inv = vehicle.AbsPosition_Inv, - tile = vehicle.MyKachelPnt, + tile = vehicle.MyKachelPnt, rotation = vehicle.Rotation, velocity = vehicle.Velocity, + relmatrix = vehicle.RelMatrix, + acclocal = vehicle.Acc_Local + //vehicle = vehicle.RoadVehicle.MyPath - }); + }); ; client.Send(buff); } } diff --git a/Multiplayer_Client/MessageParser.cs b/Multiplayer_Client/MessageParser.cs index ca64f96..3c2f425 100644 --- a/Multiplayer_Client/MessageParser.cs +++ b/Multiplayer_Client/MessageParser.cs @@ -41,7 +41,7 @@ public static void ParseMessage(byte[] message, Telepathy.Client client, GameCli break; case OMSIMPMessages.Messages.UPDATE_VEHICLE_POSITION: { - gameClient.updateVehicles(FastBinaryReader.Read(message, ref parse_pos)); + gameClient.UpdateVehicles(FastBinaryReader.Read(message, ref parse_pos)); } break; default: diff --git a/Multiplayer_Client/OMSIClient.cs b/Multiplayer_Client/OMSIClient.cs index afd8d23..fe04aec 100644 --- a/Multiplayer_Client/OMSIClient.cs +++ b/Multiplayer_Client/OMSIClient.cs @@ -43,7 +43,7 @@ static void Main(string[] args) } } gameClient.Tick(client); - System.Threading.Thread.Sleep(10); + System.Threading.Thread.Sleep(33); } client.Disconnect(); } diff --git a/Multiplayer_Server/Lib/OMSIMPMessages.cs b/Multiplayer_Server/Lib/OMSIMPMessages.cs index eadd42e..5172f56 100644 --- a/Multiplayer_Server/Lib/OMSIMPMessages.cs +++ b/Multiplayer_Server/Lib/OMSIMPMessages.cs @@ -1,4 +1,5 @@ using OmsiHook; +using System.Runtime.InteropServices; public static class OMSIMPMessages { @@ -14,31 +15,34 @@ public enum Messages : int PONG = 7, // Int32 Nonce } + [StructLayout(LayoutKind.Sequential)] public struct Version_Reply { public int Major; public int Minor; } + [StructLayout(LayoutKind.Sequential)] public struct Player_Position_Update { - public D3DMatrix abs_position; - public D3DMatrix abs_position_inv; public OmsiPoint tile; - public D3DXQuaternion rotation; + public D3DQuaternion rotation; public D3DVector velocity; public D3DVector position; + public D3DMatrix relmatrix; + public D3DVector acclocal; } + [StructLayout(LayoutKind.Sequential)] public struct Vehicle_Position_Update { public int ID; - public D3DMatrix abs_position; - public D3DMatrix abs_position_inv; public OmsiPoint tile; - public D3DXQuaternion rotation; + public D3DQuaternion rotation; public D3DVector velocity; public D3DVector position; + public D3DMatrix relmatrix; + public D3DVector acclocal; } } diff --git a/Multiplayer_Server/MessageParser.cs b/Multiplayer_Server/MessageParser.cs index b44be1c..25dda9b 100644 --- a/Multiplayer_Server/MessageParser.cs +++ b/Multiplayer_Server/MessageParser.cs @@ -1,6 +1,8 @@ -using System; +using OmsiHook; +using System; using System.Collections.Generic; using System.Linq; +using System.Runtime.CompilerServices; using System.Text; using System.Threading.Tasks; @@ -31,7 +33,7 @@ public static void ParseMessage(byte[] message, Client client, Telepathy.Server var position = FastBinaryReader.Read(message, ref parse_pos); Console.WriteLine($"\u001b[8;0HP:{position.position}/{position.tile}\u001b[9;0HR:{position.rotation}\u001b[10;0HV:{position.velocity}"); - byte[] buff = new byte[184]; + byte[] buff = new byte[Unsafe.SizeOf() + 4]; int out_pos = 0; FastBinaryWriter.Write(buff, ref out_pos, OMSIMPMessages.Messages.UPDATE_VEHICLE_POSITION); FastBinaryWriter.Write(buff, ref out_pos, new OMSIMPMessages.Vehicle_Position_Update() { @@ -39,9 +41,10 @@ public static void ParseMessage(byte[] message, Client client, Telepathy.Server rotation = position.rotation, tile = position.tile, velocity = position.velocity, - abs_position = (position.abs_position), - abs_position_inv = (position.abs_position_inv), - position = position.position }); + position = (new D3DVector(position.position.x + 4, position.position.y, position.position.z)), + relmatrix = position.relmatrix, + acclocal = position.acclocal, + }); server.Send(client.ClientId, buff); } diff --git a/OmsiHook/OmsiStructs.cs b/OmsiHook/OmsiStructs.cs index 0929197..9967834 100644 --- a/OmsiHook/OmsiStructs.cs +++ b/OmsiHook/OmsiStructs.cs @@ -29,11 +29,15 @@ public D3DVector(float x, float y, float z) public static implicit operator Vector3(D3DVector v) => new(v.x, v.y, v.z); public static implicit operator D3DVector(Vector3 v) => new() { x = v.X, y = v.Y, z = v.Z }; } - public struct D3DXVector2 + + public struct D3DVector2 { public float x, y; public override readonly string ToString() => $"[{x,8:F3}, {y,8:F3}]"; + + public static implicit operator Vector2(D3DVector2 v) => new(v.x, v.y); + public static implicit operator D3DVector2(Vector2 v) => new() { x = v.X, y = v.Y }; } /// @@ -102,11 +106,14 @@ public static implicit operator D3DMatrix(Matrix4x4 m) /// /// Defines a 4 dimensional float vector. /// - public struct D3DXQuaternion + public struct D3DQuaternion { public float x, y, z, w; public override readonly string ToString() => $"[{x,8:F3}, {y,8:F3}, {z,8:F3}, {w,8:F3}]"; + + public static implicit operator Quaternion(D3DQuaternion v) => new (v.x, v.y, v.z, v.w); + public static implicit operator D3DQuaternion(Quaternion v) => new() { x=v.X, y=v.Y, z=v.Z, w=v.W }; } /// @@ -478,7 +485,7 @@ public struct OmsiTicket public struct OmsiSeat { public D3DVector position; - public D3DXQuaternion rotation; + public D3DQuaternion rotation; public byte flag; public float height; public int getInteriorLights; // TODO: Check Data Type @@ -2040,8 +2047,8 @@ public struct OmsiBoogieInternal [OmsiStruct(typeof(OmsiPathInfo), typeof(OmsiPathInfoInternal))] [FieldOffset(0x0)] internal OmsiPathInfoInternal pathInfo; [FieldOffset(0x110)] internal D3DVector pos; - [FieldOffset(0x11c)] internal D3DXVector2 y_soll; - [FieldOffset(0x124)] internal D3DXVector2 y_harmon; + [FieldOffset(0x11c)] internal D3DVector2 y_soll; + [FieldOffset(0x124)] internal D3DVector2 y_harmon; [FieldOffset(0x12c)] internal float y_gleisfehler; [FieldOffset(0x130)] internal float z_gleisfehler; } @@ -2050,8 +2057,8 @@ public struct OmsiBoogie { public OmsiPathInfo pathInfo; public D3DVector pos; - public D3DXVector2 y_soll; - public D3DXVector2 y_harmon; + public D3DVector2 y_soll; + public D3DVector2 y_harmon; public float y_gleisfehler; public float z_gleisfehler; } diff --git a/OmsiHook/WrappedOmsiClasses/OmsiMapObjInst.cs b/OmsiHook/WrappedOmsiClasses/OmsiMapObjInst.cs index 81b7a64..2cfe5d1 100644 --- a/OmsiHook/WrappedOmsiClasses/OmsiMapObjInst.cs +++ b/OmsiHook/WrappedOmsiClasses/OmsiMapObjInst.cs @@ -18,9 +18,9 @@ public D3DMatrix Pos_Mat get => Memory.ReadMemory(Address + 0x10); set => Memory.WriteMemory(Address + 0x10, value); } - public D3DXQuaternion Rotation + public D3DQuaternion Rotation { - get => Memory.ReadMemory(Address + 0x50); + get => Memory.ReadMemory(Address + 0x50); set => Memory.WriteMemory(Address + 0x50, value); } public float Scale @@ -28,8 +28,16 @@ public float Scale get => Memory.ReadMemory(Address + 0x60); set => Memory.WriteMemory(Address + 0x60, value); } - public D3DMatrix RelMatrix => Memory.ReadMemory(Address + 0x64); - public D3DMatrix Used_RelVec => Memory.ReadMemory(Address + 0x68); + public D3DMatrix RelMatrix + { + get => Memory.ReadMemory(Memory.ReadMemory(Address + 0x64)); + set => Memory.WriteMemory(Memory.ReadMemory(Address + 0x64), value); + } + public D3DVector Used_RelVec + { + get => Memory.ReadMemory(Address + 0x68); + set => Memory.WriteMemory(Address + 0x68, value); + } public int Kachel { get => Memory.ReadMemory(Address + 0x74); diff --git a/OmsiHook/WrappedOmsiClasses/OmsiMovingMapObjInst.cs b/OmsiHook/WrappedOmsiClasses/OmsiMovingMapObjInst.cs index 039de74..c1cd146 100644 --- a/OmsiHook/WrappedOmsiClasses/OmsiMovingMapObjInst.cs +++ b/OmsiHook/WrappedOmsiClasses/OmsiMovingMapObjInst.cs @@ -53,9 +53,9 @@ public D3DVector Last_Position get => Memory.ReadMemory(Address + 0x26e); set => Memory.WriteMemory(Address + 0x26e, value); } - public D3DXQuaternion Last_Rotation + public D3DQuaternion Last_Rotation { - get => Memory.ReadMemory(Address + 0x27a); + get => Memory.ReadMemory(Address + 0x27a); set => Memory.WriteMemory(Address + 0x27a, value); } public D3DMatrix RelMatrixVar diff --git a/OmsiHook/WrappedOmsiClasses/OmsiRoadVehicleInst.cs b/OmsiHook/WrappedOmsiClasses/OmsiRoadVehicleInst.cs index c8a5c8d..d5a7771 100644 --- a/OmsiHook/WrappedOmsiClasses/OmsiRoadVehicleInst.cs +++ b/OmsiHook/WrappedOmsiClasses/OmsiRoadVehicleInst.cs @@ -394,19 +394,19 @@ public float VB_Var_Me_Reverse set => Memory.WriteMemory(Address + 0x8bc, value); } public OmsiRoadVehicleInst ScriptParent => Memory.ReadMemoryObject(Address, 0x8c0, false); - public D3DXVector2 Wagenkasten_RotZPhys + public D3DVector2 Wagenkasten_RotZPhys { - get => Memory.ReadMemory(Address + 0x8c4); + get => Memory.ReadMemory(Address + 0x8c4); set => Memory.WriteMemory(Address + 0x8c4, value); } - public D3DXVector2 Wagenkasten_RotXPhys + public D3DVector2 Wagenkasten_RotXPhys { - get => Memory.ReadMemory(Address + 0x8cc); + get => Memory.ReadMemory(Address + 0x8cc); set => Memory.WriteMemory(Address + 0x8cc, value); } - public D3DXVector2 Wagenkasten_TransZPhys + public D3DVector2 Wagenkasten_TransZPhys { - get => Memory.ReadMemory(Address + 0x8d4); + get => Memory.ReadMemory(Address + 0x8d4); set => Memory.WriteMemory(Address + 0x8d4, value); } public D3DVector Euler From a8c058d8526c99cbf4526727f2e35201b356545f Mon Sep 17 00:00:00 2001 From: Adam Mathieson Date: Fri, 27 Sep 2024 12:07:29 +0100 Subject: [PATCH 3/6] + Refactor to use standard naming convention for DX vectors and Quaternions (Compatible with OH2.5.3) --- Multiplayer_Server/Lib/OMSIMPMessages.cs | 4 ++-- OmsiHook/OmsiStructs.cs | 22 +++++++++---------- OmsiHook/WrappedOmsiClasses/OmsiMapObjInst.cs | 4 ++-- .../OmsiMovingMapObjInst.cs | 4 ++-- .../WrappedOmsiClasses/OmsiRoadVehicleInst.cs | 12 +++++----- 5 files changed, 23 insertions(+), 23 deletions(-) diff --git a/Multiplayer_Server/Lib/OMSIMPMessages.cs b/Multiplayer_Server/Lib/OMSIMPMessages.cs index 5172f56..15b9cbe 100644 --- a/Multiplayer_Server/Lib/OMSIMPMessages.cs +++ b/Multiplayer_Server/Lib/OMSIMPMessages.cs @@ -26,7 +26,7 @@ public struct Version_Reply public struct Player_Position_Update { public OmsiPoint tile; - public D3DQuaternion rotation; + public D3DXQuaternion rotation; public D3DVector velocity; public D3DVector position; public D3DMatrix relmatrix; @@ -38,7 +38,7 @@ public struct Vehicle_Position_Update { public int ID; public OmsiPoint tile; - public D3DQuaternion rotation; + public D3DXQuaternion rotation; public D3DVector velocity; public D3DVector position; public D3DMatrix relmatrix; diff --git a/OmsiHook/OmsiStructs.cs b/OmsiHook/OmsiStructs.cs index 9967834..3dfffef 100644 --- a/OmsiHook/OmsiStructs.cs +++ b/OmsiHook/OmsiStructs.cs @@ -30,14 +30,14 @@ public D3DVector(float x, float y, float z) public static implicit operator D3DVector(Vector3 v) => new() { x = v.X, y = v.Y, z = v.Z }; } - public struct D3DVector2 + public struct D3DXVector2 { public float x, y; public override readonly string ToString() => $"[{x,8:F3}, {y,8:F3}]"; - public static implicit operator Vector2(D3DVector2 v) => new(v.x, v.y); - public static implicit operator D3DVector2(Vector2 v) => new() { x = v.X, y = v.Y }; + public static implicit operator Vector2(D3DXVector2 v) => new(v.x, v.y); + public static implicit operator D3DXVector2(Vector2 v) => new() { x = v.X, y = v.Y }; } /// @@ -106,14 +106,14 @@ public static implicit operator D3DMatrix(Matrix4x4 m) /// /// Defines a 4 dimensional float vector. /// - public struct D3DQuaternion + public struct D3DXQuaternion { public float x, y, z, w; public override readonly string ToString() => $"[{x,8:F3}, {y,8:F3}, {z,8:F3}, {w,8:F3}]"; - public static implicit operator Quaternion(D3DQuaternion v) => new (v.x, v.y, v.z, v.w); - public static implicit operator D3DQuaternion(Quaternion v) => new() { x=v.X, y=v.Y, z=v.Z, w=v.W }; + public static implicit operator Quaternion(D3DXQuaternion v) => new (v.x, v.y, v.z, v.w); + public static implicit operator D3DXQuaternion(Quaternion v) => new() { x=v.X, y=v.Y, z=v.Z, w=v.W }; } /// @@ -485,7 +485,7 @@ public struct OmsiTicket public struct OmsiSeat { public D3DVector position; - public D3DQuaternion rotation; + public D3DXQuaternion rotation; public byte flag; public float height; public int getInteriorLights; // TODO: Check Data Type @@ -2047,8 +2047,8 @@ public struct OmsiBoogieInternal [OmsiStruct(typeof(OmsiPathInfo), typeof(OmsiPathInfoInternal))] [FieldOffset(0x0)] internal OmsiPathInfoInternal pathInfo; [FieldOffset(0x110)] internal D3DVector pos; - [FieldOffset(0x11c)] internal D3DVector2 y_soll; - [FieldOffset(0x124)] internal D3DVector2 y_harmon; + [FieldOffset(0x11c)] internal D3DXVector2 y_soll; + [FieldOffset(0x124)] internal D3DXVector2 y_harmon; [FieldOffset(0x12c)] internal float y_gleisfehler; [FieldOffset(0x130)] internal float z_gleisfehler; } @@ -2057,8 +2057,8 @@ public struct OmsiBoogie { public OmsiPathInfo pathInfo; public D3DVector pos; - public D3DVector2 y_soll; - public D3DVector2 y_harmon; + public D3DXVector2 y_soll; + public D3DXVector2 y_harmon; public float y_gleisfehler; public float z_gleisfehler; } diff --git a/OmsiHook/WrappedOmsiClasses/OmsiMapObjInst.cs b/OmsiHook/WrappedOmsiClasses/OmsiMapObjInst.cs index 2cfe5d1..6f4419e 100644 --- a/OmsiHook/WrappedOmsiClasses/OmsiMapObjInst.cs +++ b/OmsiHook/WrappedOmsiClasses/OmsiMapObjInst.cs @@ -18,9 +18,9 @@ public D3DMatrix Pos_Mat get => Memory.ReadMemory(Address + 0x10); set => Memory.WriteMemory(Address + 0x10, value); } - public D3DQuaternion Rotation + public D3DXQuaternion Rotation { - get => Memory.ReadMemory(Address + 0x50); + get => Memory.ReadMemory(Address + 0x50); set => Memory.WriteMemory(Address + 0x50, value); } public float Scale diff --git a/OmsiHook/WrappedOmsiClasses/OmsiMovingMapObjInst.cs b/OmsiHook/WrappedOmsiClasses/OmsiMovingMapObjInst.cs index c1cd146..039de74 100644 --- a/OmsiHook/WrappedOmsiClasses/OmsiMovingMapObjInst.cs +++ b/OmsiHook/WrappedOmsiClasses/OmsiMovingMapObjInst.cs @@ -53,9 +53,9 @@ public D3DVector Last_Position get => Memory.ReadMemory(Address + 0x26e); set => Memory.WriteMemory(Address + 0x26e, value); } - public D3DQuaternion Last_Rotation + public D3DXQuaternion Last_Rotation { - get => Memory.ReadMemory(Address + 0x27a); + get => Memory.ReadMemory(Address + 0x27a); set => Memory.WriteMemory(Address + 0x27a, value); } public D3DMatrix RelMatrixVar diff --git a/OmsiHook/WrappedOmsiClasses/OmsiRoadVehicleInst.cs b/OmsiHook/WrappedOmsiClasses/OmsiRoadVehicleInst.cs index d5a7771..c8a5c8d 100644 --- a/OmsiHook/WrappedOmsiClasses/OmsiRoadVehicleInst.cs +++ b/OmsiHook/WrappedOmsiClasses/OmsiRoadVehicleInst.cs @@ -394,19 +394,19 @@ public float VB_Var_Me_Reverse set => Memory.WriteMemory(Address + 0x8bc, value); } public OmsiRoadVehicleInst ScriptParent => Memory.ReadMemoryObject(Address, 0x8c0, false); - public D3DVector2 Wagenkasten_RotZPhys + public D3DXVector2 Wagenkasten_RotZPhys { - get => Memory.ReadMemory(Address + 0x8c4); + get => Memory.ReadMemory(Address + 0x8c4); set => Memory.WriteMemory(Address + 0x8c4, value); } - public D3DVector2 Wagenkasten_RotXPhys + public D3DXVector2 Wagenkasten_RotXPhys { - get => Memory.ReadMemory(Address + 0x8cc); + get => Memory.ReadMemory(Address + 0x8cc); set => Memory.WriteMemory(Address + 0x8cc, value); } - public D3DVector2 Wagenkasten_TransZPhys + public D3DXVector2 Wagenkasten_TransZPhys { - get => Memory.ReadMemory(Address + 0x8d4); + get => Memory.ReadMemory(Address + 0x8d4); set => Memory.WriteMemory(Address + 0x8d4, value); } public D3DVector Euler From 5dcc4878b864e08ed60a5f9115c545eb8de040b7 Mon Sep 17 00:00:00 2001 From: Adam Mathieson Date: Fri, 27 Sep 2024 12:08:42 +0100 Subject: [PATCH 4/6] + Move multiplayer examples to example folder --- OmsiExtensions.sln | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/OmsiExtensions.sln b/OmsiExtensions.sln index 203697b..0ece02e 100644 --- a/OmsiExtensions.sln +++ b/OmsiExtensions.sln @@ -25,9 +25,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TriggersSample", "_OmsiHook EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VideoDemo", "_OmsiHookExamples\VideoDemo\VideoDemo.csproj", "{D94FF6D3-08AA-41CB-B9B9-F82E860E6E96}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Multiplayer_Server", "Multiplayer_Server\Multiplayer_Server.csproj", "{2D4DDEF6-2C5D-4348-8DCE-33201BFF046C}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Multiplayer_Server", "Multiplayer_Server\Multiplayer_Server.csproj", "{2D4DDEF6-2C5D-4348-8DCE-33201BFF046C}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Multiplayer_Client", "Multiplayer_Client\Multiplayer_Client.csproj", "{33EBE989-3BB8-4773-96E6-A7D68E5655CD}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Multiplayer_Client", "Multiplayer_Client\Multiplayer_Client.csproj", "{33EBE989-3BB8-4773-96E6-A7D68E5655CD}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -192,6 +192,8 @@ Global {47659503-9923-4E74-AD26-103C1F9FF2B0} = {3F0BF441-D76C-4E0D-A5A8-B20895438EA5} {1DF326AE-4D10-4545-B36A-5622B76987EC} = {3F0BF441-D76C-4E0D-A5A8-B20895438EA5} {D94FF6D3-08AA-41CB-B9B9-F82E860E6E96} = {3F0BF441-D76C-4E0D-A5A8-B20895438EA5} + {2D4DDEF6-2C5D-4348-8DCE-33201BFF046C} = {3F0BF441-D76C-4E0D-A5A8-B20895438EA5} + {33EBE989-3BB8-4773-96E6-A7D68E5655CD} = {3F0BF441-D76C-4E0D-A5A8-B20895438EA5} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {A5F55305-C8FF-444C-9B98-FD487ADC583A} From a951b0156213f10e207d93a39110c04c716715b4 Mon Sep 17 00:00:00 2001 From: Adam Mathieson Date: Fri, 27 Sep 2024 12:31:12 +0100 Subject: [PATCH 5/6] + Restructure to keep in line with other examples + Use nuget version of OH in multiplayer --- OmsiExtensions.sln | 8 ++++---- .../Multiplayer_Client}/GameClient.cs | 0 .../Multiplayer_Client}/MessageParser.cs | 0 .../Multiplayer_Client}/Multiplayer_Client.csproj | 5 +---- .../Multiplayer_Client}/OMSIClient.cs | 0 .../Multiplayer_Server}/Client.cs | 0 .../Multiplayer_Server}/Lib/FastBinaryReader.cs | 0 .../Multiplayer_Server}/Lib/FastBinaryWriter.cs | 0 .../Multiplayer_Server}/Lib/OMSIMPMessages.cs | 0 .../Multiplayer_Server}/MessageParser.cs | 0 .../Multiplayer_Server}/Multiplayer_Server.csproj | 4 ---- .../Multiplayer_Server}/OMSIServer.cs | 0 12 files changed, 5 insertions(+), 12 deletions(-) rename {Multiplayer_Client => _OmsiHookExamples/Multiplayer_Client}/GameClient.cs (100%) rename {Multiplayer_Client => _OmsiHookExamples/Multiplayer_Client}/MessageParser.cs (100%) rename {Multiplayer_Client => _OmsiHookExamples/Multiplayer_Client}/Multiplayer_Client.csproj (89%) rename {Multiplayer_Client => _OmsiHookExamples/Multiplayer_Client}/OMSIClient.cs (100%) rename {Multiplayer_Server => _OmsiHookExamples/Multiplayer_Server}/Client.cs (100%) rename {Multiplayer_Server => _OmsiHookExamples/Multiplayer_Server}/Lib/FastBinaryReader.cs (100%) rename {Multiplayer_Server => _OmsiHookExamples/Multiplayer_Server}/Lib/FastBinaryWriter.cs (100%) rename {Multiplayer_Server => _OmsiHookExamples/Multiplayer_Server}/Lib/OMSIMPMessages.cs (100%) rename {Multiplayer_Server => _OmsiHookExamples/Multiplayer_Server}/MessageParser.cs (100%) rename {Multiplayer_Server => _OmsiHookExamples/Multiplayer_Server}/Multiplayer_Server.csproj (80%) rename {Multiplayer_Server => _OmsiHookExamples/Multiplayer_Server}/OMSIServer.cs (100%) diff --git a/OmsiExtensions.sln b/OmsiExtensions.sln index 9d71f22..abbb0de 100644 --- a/OmsiExtensions.sln +++ b/OmsiExtensions.sln @@ -25,11 +25,11 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TriggersSample", "_OmsiHook EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VideoDemo", "_OmsiHookExamples\VideoDemo\VideoDemo.csproj", "{D94FF6D3-08AA-41CB-B9B9-F82E860E6E96}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Multiplayer_Server", "Multiplayer_Server\Multiplayer_Server.csproj", "{2D4DDEF6-2C5D-4348-8DCE-33201BFF046C}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Multiplayer_Server", "_OmsiHookExamples\Multiplayer_Server\Multiplayer_Server.csproj", "{2D4DDEF6-2C5D-4348-8DCE-33201BFF046C}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Multiplayer_Client", "Multiplayer_Client\Multiplayer_Client.csproj", "{33EBE989-3BB8-4773-96E6-A7D68E5655CD}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Multiplayer_Client", "_OmsiHookExamples\Multiplayer_Client\Multiplayer_Client.csproj", "{33EBE989-3BB8-4773-96E6-A7D68E5655CD}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClickablePlaneDemo", "_OmsiHookExamples\ClickablePlaneDemo\ClickablePlaneDemo.csproj", "{49428923-732C-4541-8C97-C6D9C004D726}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ClickablePlaneDemo", "_OmsiHookExamples\ClickablePlaneDemo\ClickablePlaneDemo.csproj", "{49428923-732C-4541-8C97-C6D9C004D726}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -185,7 +185,7 @@ Global {33EBE989-3BB8-4773-96E6-A7D68E5655CD}.ReleaseAndDocs|Any CPU.Build.0 = Release|Any CPU {33EBE989-3BB8-4773-96E6-A7D68E5655CD}.ReleaseAndDocs|x86.ActiveCfg = Release|Any CPU {33EBE989-3BB8-4773-96E6-A7D68E5655CD}.ReleaseAndDocs|x86.Build.0 = Release|Any CPU - {49428923-732C-4541-8C97-C6D9C004D726}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {49428923-732C-4541-8C97-C6D9C004D726}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {49428923-732C-4541-8C97-C6D9C004D726}.Debug|Any CPU.Build.0 = Debug|Any CPU {49428923-732C-4541-8C97-C6D9C004D726}.Debug|x86.ActiveCfg = Debug|Any CPU {49428923-732C-4541-8C97-C6D9C004D726}.Debug|x86.Build.0 = Debug|Any CPU diff --git a/Multiplayer_Client/GameClient.cs b/_OmsiHookExamples/Multiplayer_Client/GameClient.cs similarity index 100% rename from Multiplayer_Client/GameClient.cs rename to _OmsiHookExamples/Multiplayer_Client/GameClient.cs diff --git a/Multiplayer_Client/MessageParser.cs b/_OmsiHookExamples/Multiplayer_Client/MessageParser.cs similarity index 100% rename from Multiplayer_Client/MessageParser.cs rename to _OmsiHookExamples/Multiplayer_Client/MessageParser.cs diff --git a/Multiplayer_Client/Multiplayer_Client.csproj b/_OmsiHookExamples/Multiplayer_Client/Multiplayer_Client.csproj similarity index 89% rename from Multiplayer_Client/Multiplayer_Client.csproj rename to _OmsiHookExamples/Multiplayer_Client/Multiplayer_Client.csproj index f774298..c7e0630 100644 --- a/Multiplayer_Client/Multiplayer_Client.csproj +++ b/_OmsiHookExamples/Multiplayer_Client/Multiplayer_Client.csproj @@ -10,12 +10,9 @@ + - - - - diff --git a/Multiplayer_Client/OMSIClient.cs b/_OmsiHookExamples/Multiplayer_Client/OMSIClient.cs similarity index 100% rename from Multiplayer_Client/OMSIClient.cs rename to _OmsiHookExamples/Multiplayer_Client/OMSIClient.cs diff --git a/Multiplayer_Server/Client.cs b/_OmsiHookExamples/Multiplayer_Server/Client.cs similarity index 100% rename from Multiplayer_Server/Client.cs rename to _OmsiHookExamples/Multiplayer_Server/Client.cs diff --git a/Multiplayer_Server/Lib/FastBinaryReader.cs b/_OmsiHookExamples/Multiplayer_Server/Lib/FastBinaryReader.cs similarity index 100% rename from Multiplayer_Server/Lib/FastBinaryReader.cs rename to _OmsiHookExamples/Multiplayer_Server/Lib/FastBinaryReader.cs diff --git a/Multiplayer_Server/Lib/FastBinaryWriter.cs b/_OmsiHookExamples/Multiplayer_Server/Lib/FastBinaryWriter.cs similarity index 100% rename from Multiplayer_Server/Lib/FastBinaryWriter.cs rename to _OmsiHookExamples/Multiplayer_Server/Lib/FastBinaryWriter.cs diff --git a/Multiplayer_Server/Lib/OMSIMPMessages.cs b/_OmsiHookExamples/Multiplayer_Server/Lib/OMSIMPMessages.cs similarity index 100% rename from Multiplayer_Server/Lib/OMSIMPMessages.cs rename to _OmsiHookExamples/Multiplayer_Server/Lib/OMSIMPMessages.cs diff --git a/Multiplayer_Server/MessageParser.cs b/_OmsiHookExamples/Multiplayer_Server/MessageParser.cs similarity index 100% rename from Multiplayer_Server/MessageParser.cs rename to _OmsiHookExamples/Multiplayer_Server/MessageParser.cs diff --git a/Multiplayer_Server/Multiplayer_Server.csproj b/_OmsiHookExamples/Multiplayer_Server/Multiplayer_Server.csproj similarity index 80% rename from Multiplayer_Server/Multiplayer_Server.csproj rename to _OmsiHookExamples/Multiplayer_Server/Multiplayer_Server.csproj index f1d8630..8c86e90 100644 --- a/Multiplayer_Server/Multiplayer_Server.csproj +++ b/_OmsiHookExamples/Multiplayer_Server/Multiplayer_Server.csproj @@ -12,8 +12,4 @@ - - - - diff --git a/Multiplayer_Server/OMSIServer.cs b/_OmsiHookExamples/Multiplayer_Server/OMSIServer.cs similarity index 100% rename from Multiplayer_Server/OMSIServer.cs rename to _OmsiHookExamples/Multiplayer_Server/OMSIServer.cs From a31a925c1fef00e59061d5456e21a1b40ffe19b8 Mon Sep 17 00:00:00 2001 From: Adam Mathieson Date: Mon, 30 Sep 2024 12:43:19 +0100 Subject: [PATCH 6/6] + Start of basic corrections to MP Branch --- .../Multiplayer_Client/GameClient.cs | 32 +++++++------------ .../Multiplayer_Client/MessageParser.cs | 8 +---- .../Multiplayer_Client.csproj | 2 +- .../Multiplayer_Client/OMSIClient.cs | 4 +-- .../Multiplayer_Server/Client.cs | 7 ++-- .../Multiplayer_Server/MessageParser.cs | 15 +++------ .../Multiplayer_Server.csproj | 1 + .../Multiplayer_Server/OMSIServer.cs | 10 +++--- 8 files changed, 28 insertions(+), 51 deletions(-) diff --git a/_OmsiHookExamples/Multiplayer_Client/GameClient.cs b/_OmsiHookExamples/Multiplayer_Client/GameClient.cs index 633b84c..b3f724d 100644 --- a/_OmsiHookExamples/Multiplayer_Client/GameClient.cs +++ b/_OmsiHookExamples/Multiplayer_Client/GameClient.cs @@ -1,23 +1,18 @@ -using Microsoft.VisualBasic; -using OmsiHook; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using OmsiHook; using System.Numerics; -using Telepathy; using System.Runtime.CompilerServices; -namespace Multiplayer_Client +namespace OmsiHook.Examples.Multiplayer_Client { internal class GameClient { public Tuple LastPing; - private OmsiHook.OmsiHook omsi; + private OmsiHook omsi; private Dictionary Vehicles = new Dictionary(); - public GameClient() { - omsi = new OmsiHook.OmsiHook(); + private int frameCounter = 0; + public GameClient() + { + omsi = new OmsiHook(); omsi.AttachToOMSI().Wait(); var OMSIRM = omsi.RemoteMethods; OMSIRM.OmsiSetCriticalSectionLock(omsi.Globals.ProgamManager.CS_MakeVehiclePtr).ContinueWith((_) => @@ -31,12 +26,11 @@ public GameClient() { }); } - int i = 0; public void UpdateVehicles(OMSIMPMessages.Vehicle_Position_Update update) { if (Vehicles.TryGetValue(update.ID, out var vehicle)) { - if (i % 20 == 0) + if (frameCounter % 20 == 0) vehicle.Position = update.position; vehicle.Rotation = update.rotation; vehicle.Velocity = update.velocity; @@ -56,15 +50,11 @@ public void UpdateVehicles(OMSIMPMessages.Vehicle_Position_Update update) vehicle.AI_Blinker_L = 1; vehicle.AI_Blinker_R = 1; vehicle.AI_var = 1; - - - //vehicle.AbsPosition = update.abs_position; - //vehicle.AbsPosition_Inv = update.abs_position_inv; - i++; + frameCounter++; } else { - + } } @@ -74,7 +64,7 @@ public void Tick(Telepathy.Client client) return; var vehicle = omsi.Globals.PlayerVehicle; - Console.WriteLine($"\x1b[8;0HP:{vehicle.Position}/{vehicle.MyKachelPnt}\x1b[9;0HR:{vehicle.Rotation}\x1b[10;0HV:{vehicle.Velocity}\x1b[11;0HB:{vehicle.Acc_Local} / {((Vehicles.ContainsKey(0)) ? (Vehicles[0].Acc_Local.ToString()):"-")}"); + Console.WriteLine($"\x1b[8;0HP:{vehicle.Position}/{vehicle.MyKachelPnt}\x1b[9;0HR:{vehicle.Rotation}\x1b[10;0HV:{vehicle.Velocity}\x1b[11;0HB:{vehicle.Acc_Local} / {((Vehicles.ContainsKey(0)) ? (Vehicles[0].Acc_Local.ToString()) : "-")}"); byte[] buff = new byte[Unsafe.SizeOf() + 4]; int out_pos = 0; FastBinaryWriter.Write(buff, ref out_pos, OMSIMPMessages.Messages.UPDATE_PLAYER_POSITION); diff --git a/_OmsiHookExamples/Multiplayer_Client/MessageParser.cs b/_OmsiHookExamples/Multiplayer_Client/MessageParser.cs index 3c2f425..4043afa 100644 --- a/_OmsiHookExamples/Multiplayer_Client/MessageParser.cs +++ b/_OmsiHookExamples/Multiplayer_Client/MessageParser.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Multiplayer_Client +namespace OmsiHook.Examples.Multiplayer_Client { internal class MessageParser { diff --git a/_OmsiHookExamples/Multiplayer_Client/Multiplayer_Client.csproj b/_OmsiHookExamples/Multiplayer_Client/Multiplayer_Client.csproj index c7e0630..f7cf4fc 100644 --- a/_OmsiHookExamples/Multiplayer_Client/Multiplayer_Client.csproj +++ b/_OmsiHookExamples/Multiplayer_Client/Multiplayer_Client.csproj @@ -10,7 +10,7 @@ - + diff --git a/_OmsiHookExamples/Multiplayer_Client/OMSIClient.cs b/_OmsiHookExamples/Multiplayer_Client/OMSIClient.cs index fe04aec..c37ca86 100644 --- a/_OmsiHookExamples/Multiplayer_Client/OMSIClient.cs +++ b/_OmsiHookExamples/Multiplayer_Client/OMSIClient.cs @@ -1,6 +1,4 @@ -using Multiplayer_Client; -using System; -using System.Text; +using OmsiHook.Examples.Multiplayer_Client; using Telepathy; class OMSIClient diff --git a/_OmsiHookExamples/Multiplayer_Server/Client.cs b/_OmsiHookExamples/Multiplayer_Server/Client.cs index c1e56d7..f6cd488 100644 --- a/_OmsiHookExamples/Multiplayer_Server/Client.cs +++ b/_OmsiHookExamples/Multiplayer_Server/Client.cs @@ -4,12 +4,13 @@ using System.Text; using System.Threading.Tasks; -namespace Multiplayer_Server +namespace OmsiHook.Examples.Multiplayer_Server { internal class Client { - public int ClientId { get; private set; } - public Client(int clientId) { + public int ClientId { get; private set; } + public Client(int clientId) + { ClientId = clientId; } } diff --git a/_OmsiHookExamples/Multiplayer_Server/MessageParser.cs b/_OmsiHookExamples/Multiplayer_Server/MessageParser.cs index 25dda9b..30db0f9 100644 --- a/_OmsiHookExamples/Multiplayer_Server/MessageParser.cs +++ b/_OmsiHookExamples/Multiplayer_Server/MessageParser.cs @@ -1,12 +1,6 @@ -using OmsiHook; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Runtime.CompilerServices; -using System.Text; -using System.Threading.Tasks; +using System.Runtime.CompilerServices; -namespace Multiplayer_Server +namespace OmsiHook.Examples.Multiplayer_Server { internal class MessageParser { @@ -16,7 +10,7 @@ public static void ParseMessage(byte[] message, Client client, Telepathy.Server { message.AsSpan(0, message.Length); int parse_pos = 0; - switch ((OMSIMPMessages.Messages) FastBinaryReader.ReadI32(message, ref parse_pos)) + switch ((OMSIMPMessages.Messages)FastBinaryReader.ReadI32(message, ref parse_pos)) { case OMSIMPMessages.Messages.REQUEST_VERSION: { @@ -36,7 +30,8 @@ public static void ParseMessage(byte[] message, Client client, Telepathy.Server byte[] buff = new byte[Unsafe.SizeOf() + 4]; int out_pos = 0; FastBinaryWriter.Write(buff, ref out_pos, OMSIMPMessages.Messages.UPDATE_VEHICLE_POSITION); - FastBinaryWriter.Write(buff, ref out_pos, new OMSIMPMessages.Vehicle_Position_Update() { + FastBinaryWriter.Write(buff, ref out_pos, new OMSIMPMessages.Vehicle_Position_Update() + { ID = 0, rotation = position.rotation, tile = position.tile, diff --git a/_OmsiHookExamples/Multiplayer_Server/Multiplayer_Server.csproj b/_OmsiHookExamples/Multiplayer_Server/Multiplayer_Server.csproj index 8c86e90..b9b22d1 100644 --- a/_OmsiHookExamples/Multiplayer_Server/Multiplayer_Server.csproj +++ b/_OmsiHookExamples/Multiplayer_Server/Multiplayer_Server.csproj @@ -9,6 +9,7 @@ + diff --git a/_OmsiHookExamples/Multiplayer_Server/OMSIServer.cs b/_OmsiHookExamples/Multiplayer_Server/OMSIServer.cs index 6c82ed9..71bb467 100644 --- a/_OmsiHookExamples/Multiplayer_Server/OMSIServer.cs +++ b/_OmsiHookExamples/Multiplayer_Server/OMSIServer.cs @@ -1,8 +1,6 @@ -using Multiplayer_Server; -using System; -using System.Linq; +using OmsiHook.Examples.Multiplayer_Server; using Telepathy; -using Client = Multiplayer_Server.Client; +using Client = OmsiHook.Examples.Multiplayer_Server.Client; internal class OMSIServer { @@ -10,14 +8,14 @@ internal class OMSIServer static void Main(string[] args) { Dictionary? Clients = new Dictionary(); - Telepathy.Server server = new Telepathy.Server(); + Server server = new Server(); server.Start(1337); Console.WriteLine("Server started. Press Ctrl+C to stop..."); while (true) { - Telepathy.Message msg; + Message msg; while (server.GetNextMessage(out msg)) { switch (msg.eventType)