using System; using System.Text; using System.Collections.Generic; namespace Conquer_Online_Server.Network { public class Writer { public static void WriteStringWithLength(string arg, int len, int offset, byte[] buffer) { if (buffer == null) return; if (offset > buffer.Length - 1) return; int till = len; till = Math.Min(arg.Length, till); buffer[offset] = (byte)till; offset++; byte[] argEncoded = Server.Encoding.GetBytes(arg); Array.Copy(argEncoded, 0, buffer, offset, till); } public static void WriteStringWithLength(string arg, int offset, byte[] buffer) { if (buffer == null) return; if (offset > buffer.Length - 1) return; int till = buffer.Length - offset; till = Math.Min(arg.Length, till); buffer[offset] = (byte)arg.Length; offset++; byte[] argEncoded = Server.Encoding.GetBytes(arg); Array.Copy(argEncoded, 0, buffer, offset, till); } public static void WriteString(string arg, int offset, byte[] buffer) { if (buffer == null) return; if (offset > buffer.Length - 1) return; byte[] argEncoded = Server.Encoding.GetBytes(arg); if (buffer.Length >= offset + arg.Length) Array.Copy(argEncoded, 0, buffer, offset, arg.Length); } /* public static void WriteStringWithLength(string arg, int offset, byte[] buffer) { if (buffer == null) return; if (offset > buffer.Length - 1) return; int till = buffer.Length - offset; till = Math.Min(arg.Length, till); buffer[offset] = (byte)arg.Length; offset++; ushort i = 0; while (i < till) { buffer[(ushort)(i + offset)] = (byte)arg[i]; i = (ushort)(i + 1); } } public static void WriteString(string arg, int offset, byte[] buffer) { if (buffer == null) return; if (offset > buffer.Length - 1) return; if (buffer.Length >= offset + arg.Length) { unsafe { #if UNSAFE fixed (byte* Buffer = buffer) { ushort i = 0; while (i < arg.Length) { *((byte*)(Buffer + offset + i)) = (byte)arg[i]; i++; } } #else ushort i = 0; while (i < arg.Length) { buffer[(ushort)(i + offset)] = (byte)arg[i]; i = (ushort)(i + 1); } #endif } } }*/ public static void WriteByte(byte arg, int offset, byte[] buffer) { if (buffer == null) return; if (offset > buffer.Length - 1) return; buffer[offset] = arg; } public static void WriteBoolean(bool arg, int offset, byte[] buffer) { if (buffer == null) return; if (offset > buffer.Length - 1) return; WriteByte(arg == true ? (byte)1 : (byte)0, offset, buffer); } public static void WriteUInt16(ushort arg, int offset, byte[] buffer) { if (buffer == null) return; if (offset > buffer.Length - 1) return; if (buffer.Length >= offset + sizeof(ushort)) { unsafe { #if UNSAFE fixed (byte* Buffer = buffer) *((ushort*)(Buffer + offset)) = arg; #else buffer[offset] = (byte)arg; buffer[offset + 1] = (byte)(arg >> 8); #endif } } } public static void WriteUInt32(uint arg, int offset, byte[] buffer) { if (buffer == null) return; if (offset > buffer.Length - 1) return; if (buffer.Length >= offset + sizeof(uint)) { unsafe { #if UNSAFE fixed (byte* Buffer = buffer) *((uint*)(Buffer + offset)) = arg; #else buffer[offset] = (byte)arg; buffer[offset + 1] = (byte)(arg >> 8); buffer[offset + 2] = (byte)(arg >> 16); buffer[offset + 3] = (byte)(arg >> 24); #endif } } } public static unsafe void WriteUInt128(decimal arg, int offset, byte[] Buffer) { try { fixed (byte* buffer = Buffer) *((decimal*)(buffer + offset)) = arg; } catch (Exception e) { Console.WriteLine(e); } } public static void WriteInt32(int arg, int offset, byte[] buffer) { if (buffer == null) return; if (offset > buffer.Length - 1) return; if (buffer.Length >= offset + sizeof(uint)) { unsafe { #if UNSAFE fixed (byte* Buffer = buffer) *((int*)(Buffer + offset)) = arg; #else buffer[offset] = (byte)(arg); buffer[offset + 1] = (byte)(arg >> 8); buffer[offset + 2] = (byte)(arg >> 16); buffer[offset + 3] = (byte)(arg >> 24); #endif } } } public static void WriteUInt64(ulong arg, int offset, byte[] buffer) { if (buffer == null) return; if (offset > buffer.Length - 1) return; if (buffer.Length >= offset + sizeof(ulong)) { unsafe { #if UNSAFE fixed (byte* Buffer = buffer) *((ulong*)(Buffer + offset)) = arg; #else buffer[offset] = (byte)(arg); buffer[offset + 1] = (byte)(arg >> 8); buffer[offset + 2] = (byte)(arg >> 16); buffer[offset + 3] = (byte)(arg >> 24); buffer[offset + 4] = (byte)(arg >> 32); buffer[offset + 5] = (byte)(arg >> 40); buffer[offset + 6] = (byte)(arg >> 48); buffer[offset + 7] = (byte)(arg >> 56); #endif } } } public static void WriteStringList(List arg, int offset, byte[] buffer) { if (arg == null) return; if (buffer == null) return; if (offset > buffer.Length - 1) return; buffer[offset] = (byte)arg.Count; offset++; foreach (string str in arg) { buffer[offset] = (byte)str.Length; WriteString(str, offset + 1, buffer); offset += str.Length + 1; } } public static void WriteStringList(string[] arg, int offset, byte[] buffer) { if (arg == null) return; if (buffer == null) return; if (offset > buffer.Length - 1) return; buffer[offset] = (byte)arg.Length; offset++; foreach (string str in arg) { buffer[offset] = (byte)str.Length; WriteString(str, offset + 1, buffer); offset += str.Length + 1; } } public static void String(string arg, int offset, byte[] buffer) { if (buffer == null) return; if (offset > buffer.Length - 1) return; byte[] argEncoded = Server.Encoding.GetBytes(arg); if (buffer.Length >= offset + arg.Length) Array.Copy(argEncoded, 0, buffer, offset, arg.Length); } /* public static void String(string arg, int offset, byte[] buffer) { if (buffer == null) return; if (offset > buffer.Length - 1) return; if (buffer.Length >= offset + arg.Length) { unsafe { #if UNSAFE fixed (byte* Buffer = buffer) { ushort i = 0; while (i < arg.Length) { *((byte*)(Buffer + offset + i)) = (byte)arg[i]; i++; } } #else ushort i = 0; while (i < arg.Length) { buffer[(ushort)(i + offset)] = (byte)arg[i]; i = (ushort)(i + 1); } #endif } } }*/ public static void Byte(byte arg, int offset, byte[] buffer) { if (buffer == null) return; if (offset > buffer.Length - 1) return; buffer[offset] = arg; } public static void Boolean(bool arg, int offset, byte[] buffer) { if (buffer == null) return; if (offset > buffer.Length - 1) return; WriteByte(arg == true ? (byte)1 : (byte)0, offset, buffer); } public static void Ushort(ushort arg, int offset, byte[] buffer) { if (buffer == null) return; if (offset > buffer.Length - 1) return; if (buffer.Length >= offset + sizeof(ushort)) { unsafe { #if UNSAFE fixed (byte* Buffer = buffer) { *((ushort*)(Buffer + offset)) = arg; } #else buffer[offset] = (byte)arg; buffer[offset + 1] = (byte)(arg >> 8); #endif } } } public static void Uint(uint arg, int offset, byte[] buffer) { if (buffer == null) return; if (offset > buffer.Length - 1) return; if (buffer.Length >= offset + sizeof(uint)) { unsafe { #if UNSAFE fixed (byte* Buffer = buffer) { *((uint*)(Buffer + offset)) = arg; } #else buffer[offset] = (byte)arg; buffer[offset + 1] = (byte)(arg >> 8); buffer[offset + 2] = (byte)(arg >> 16); buffer[offset + 3] = (byte)(arg >> 24); #endif } } } public static unsafe void Decimal(decimal arg, int offset, byte[] Buffer) { try { fixed (byte* buffer = Buffer) { if (arg.GetType() == typeof(decimal)) { *((decimal*)(buffer + offset)) = arg; } } } catch (Exception e) { Conquer_Online_Server.Console.WriteLine(e); } } public static void Int(int arg, int offset, byte[] buffer) { if (buffer == null) return; if (offset > buffer.Length - 1) return; if (buffer.Length >= offset + sizeof(uint)) { unsafe { #if UNSAFE fixed (byte* Buffer = buffer) { *((int*)(Buffer + offset)) = arg; } #else buffer[offset] = (byte)(arg); buffer[offset + 1] = (byte)(arg >> 8); buffer[offset + 2] = (byte)(arg >> 16); buffer[offset + 3] = (byte)(arg >> 24); #endif } } } public static void Ulong(ulong arg, int offset, byte[] buffer) { if (buffer == null) return; if (offset > buffer.Length - 1) return; if (buffer.Length >= offset + sizeof(ulong)) { unsafe { #if UNSAFE fixed (byte* Buffer = buffer) { *((ulong*)(Buffer + offset)) = arg; } #else buffer[offset] = (byte)(arg); buffer[offset + 1] = (byte)(arg >> 8); buffer[offset + 2] = (byte)(arg >> 16); buffer[offset + 3] = (byte)(arg >> 24); buffer[offset + 4] = (byte)(arg >> 32); buffer[offset + 5] = (byte)(arg >> 40); buffer[offset + 6] = (byte)(arg >> 48); buffer[offset + 7] = (byte)(arg >> 56); #endif } } } public static void WriteUshort(ushort arg, int offset, byte[] buffer) { if (buffer == null) return; if (offset > buffer.Length - 1) return; if (buffer.Length >= offset + sizeof(ushort)) { unsafe { #if UNSAFE fixed (byte* Buffer = buffer) { *((ushort*)(Buffer + offset)) = arg; } #else buffer[offset] = (byte)arg; buffer[offset + 1] = (byte)(arg >> 8); #endif } } } public static void WriteUint(uint arg, int offset, byte[] buffer) { if (buffer == null) return; if (offset > buffer.Length - 1) return; if (buffer.Length >= offset + sizeof(uint)) { unsafe { #if UNSAFE fixed (byte* Buffer = buffer) { *((uint*)(Buffer + offset)) = arg; } #else buffer[offset] = (byte)arg; buffer[offset + 1] = (byte)(arg >> 8); buffer[offset + 2] = (byte)(arg >> 16); buffer[offset + 3] = (byte)(arg >> 24); #endif } } } public static void WriteUlong(ulong arg, int offset, byte[] buffer) { if (buffer == null) return; if (offset > buffer.Length - 1) return; if (buffer.Length >= offset + sizeof(ulong)) { unsafe { #if UNSAFE fixed (byte* Buffer = buffer) { *((ulong*)(Buffer + offset)) = arg; } #else buffer[offset] = (byte)(arg); buffer[offset + 1] = (byte)(arg >> 8); buffer[offset + 2] = (byte)(arg >> 16); buffer[offset + 3] = (byte)(arg >> 24); buffer[offset + 4] = (byte)(arg >> 32); buffer[offset + 5] = (byte)(arg >> 40); buffer[offset + 6] = (byte)(arg >> 48); buffer[offset + 7] = (byte)(arg >> 56); #endif } } } #region New Write public static void Write(string arg, int offset, byte[] buffer) { if (buffer == null) return; if (offset > buffer.Length - 1) return; byte[] argEncoded = Server.Encoding.GetBytes(arg); if (buffer.Length >= offset + arg.Length) Array.Copy(argEncoded, 0, buffer, offset, arg.Length); } public static void Write(byte arg, int offset, byte[] buffer) { if (buffer == null) return; if (offset > buffer.Length - 1) return; buffer[offset] = arg; } public static void Write(bool arg, int offset, byte[] buffer) { if (buffer == null) return; if (offset > buffer.Length - 1) return; WriteByte(arg == true ? (byte)1 : (byte)0, offset, buffer); } public static void Write(ushort arg, int offset, byte[] buffer) { if (buffer == null) return; if (offset > buffer.Length - 1) return; if (buffer.Length >= offset + sizeof(ushort)) { unsafe { #if UNSAFE fixed (byte* Buffer = buffer) { *((ushort*)(Buffer + offset)) = arg; } #else buffer[offset] = (byte)arg; buffer[offset + 1] = (byte)(arg >> 8); #endif } } } public static void Write(uint arg, int offset, byte[] buffer) { if (buffer == null) return; if (offset > buffer.Length - 1) return; if (buffer.Length >= offset + sizeof(uint)) { unsafe { #if UNSAFE fixed (byte* Buffer = buffer) { *((uint*)(Buffer + offset)) = arg; } #else buffer[offset] = (byte)arg; buffer[offset + 1] = (byte)(arg >> 8); buffer[offset + 2] = (byte)(arg >> 16); buffer[offset + 3] = (byte)(arg >> 24); #endif } } } public static void Write(ulong arg, int offset, byte[] buffer) { if (buffer == null) return; if (offset > buffer.Length - 1) return; if (buffer.Length >= offset + sizeof(ulong)) { unsafe { #if UNSAFE fixed (byte* Buffer = buffer) { *((ulong*)(Buffer + offset)) = arg; } #else buffer[offset] = (byte)(arg); buffer[offset + 1] = (byte)(arg >> 8); buffer[offset + 2] = (byte)(arg >> 16); buffer[offset + 3] = (byte)(arg >> 24); buffer[offset + 4] = (byte)(arg >> 32); buffer[offset + 5] = (byte)(arg >> 40); buffer[offset + 6] = (byte)(arg >> 48); buffer[offset + 7] = (byte)(arg >> 56); #endif } } } #endregion } }