using System.Collections; using System.Collections.Generic; using UnityEngine; using System; using System.Text; [XLua.LuaCallCSharp] public class LuaGameNetPackBase { public ushort cmd = 0; public ushort combineCmd = 0; List sendBytes = new List(); Action writeBytesAction; public void RegistWriteToBytes(Action action) { writeBytesAction = action; } public void WriteShortBytes(ushort value, LuaGameNetSystem.NetDataType type) { byte[] bytes; switch (type) { case LuaGameNetSystem.NetDataType.BYTE: bytes = new byte[1]; bytes[0] = (byte)(value & 0xFF); break; case LuaGameNetSystem.NetDataType.WORD: bytes = BitConverter.GetBytes((short)value); break; default: bytes = BitConverter.GetBytes((int)value); break; } sendBytes.AddRange(bytes); } public void WriteUintsBytes(uint value, LuaGameNetSystem.NetDataType type) { byte[] bytes; switch (type) { case LuaGameNetSystem.NetDataType.BYTE: bytes = new byte[1]; bytes[0] = (byte)(value & 0xFF); break; case LuaGameNetSystem.NetDataType.WORD: bytes = BitConverter.GetBytes((short)value); break; default: bytes = BitConverter.GetBytes((int)value); break; } sendBytes.AddRange(bytes); } public void WriteIntsBytes(int value, LuaGameNetSystem.NetDataType type) { byte[] bytes; switch (type) { case LuaGameNetSystem.NetDataType.BYTE: bytes = new byte[1]; bytes[0] = (byte)(value & 0xFF); break; case LuaGameNetSystem.NetDataType.WORD: bytes = BitConverter.GetBytes((short)value); break; default: bytes = BitConverter.GetBytes((int)value); break; } sendBytes.AddRange(bytes); } public void WriteStringBytes(string value, LuaGameNetSystem.NetDataType type, int length) { var bytes = stringEncoding.GetBytes(value); if (bytes.Length != length) { Array.Resize(ref bytes, length); } sendBytes.AddRange(bytes); } public void WriteShortsWriteLenBytes(ushort[] values, LuaGameNetSystem.NetDataType type) { for (var i = 0; i < values.Length; i++) { WriteShortBytes(values[i], type); } } public void WriteIntsWriteLenBytes(int[] values, LuaGameNetSystem.NetDataType type) { for (var i = 0; i < values.Length; i++) { WriteIntsBytes(values[i], type); } } public void WriteUintsWriteLenBytes(uint[] values, LuaGameNetSystem.NetDataType type) { for (var i = 0; i < values.Length; i++) { WriteUintsBytes(values[i], type); } } public void Send() { sendBytes.Add((byte)((cmd & 0xFF00) >> 8)); sendBytes.Add((byte)(cmd & 0xFF)); if (writeBytesAction != null) { writeBytesAction(); } if (combineCmd != 0) { var lengthBytes = BitConverter.GetBytes((ushort)sendBytes.Count); sendBytes.Insert(0, lengthBytes[1]); sendBytes.Insert(0, lengthBytes[0]); sendBytes.Insert(0, (byte)(combineCmd & 0xFF)); sendBytes.Insert(0, (byte)((combineCmd & 0xFF00) >> 8)); } GameNetSystem.Instance.SendInfo(sendBytes.ToArray()); } int readIndex = 0; public uint TransUintBytes(byte[] value, LuaGameNetSystem.NetDataType type) { var length = GetBytesLength(type); var result = 0u; switch (type) { case LuaGameNetSystem.NetDataType.BYTE: result = (uint)value[readIndex]; break; case LuaGameNetSystem.NetDataType.WORD: result = (ushort)BitConverter.ToUInt16(value, readIndex); break; case LuaGameNetSystem.NetDataType.DWORD: result = BitConverter.ToUInt32(value, readIndex); break; case LuaGameNetSystem.NetDataType.Int: result = (uint)BitConverter.ToInt32(value, readIndex); break; default: Debug.LogError("请指定正确的类型。"); break; } readIndex += length; return result; } public int TransIntBytes(byte[] value, LuaGameNetSystem.NetDataType type) { var length = GetBytesLength(type); var result = 0; switch (type) { case LuaGameNetSystem.NetDataType.BYTE: result = (int)value[readIndex]; break; case LuaGameNetSystem.NetDataType.WORD: result = (int)BitConverter.ToUInt16(value, readIndex); break; case LuaGameNetSystem.NetDataType.DWORD: result = (int)BitConverter.ToUInt32(value, readIndex); break; case LuaGameNetSystem.NetDataType.Int: result = BitConverter.ToInt32(value, readIndex); break; default: Debug.LogError("请指定正确的类型。"); break; } readIndex += length; return result; } public ushort TransUshortBytes(byte[] value, LuaGameNetSystem.NetDataType type) { var length = GetBytesLength(type); var result = (ushort)0; switch (type) { case LuaGameNetSystem.NetDataType.BYTE: result = (ushort)value[readIndex]; readIndex += length; break; case LuaGameNetSystem.NetDataType.WORD: result = BitConverter.ToUInt16(value, readIndex); readIndex += length; break; default: Debug.LogError("请指定正确的类型。"); break; } return result; } public byte TransByteBytes(byte[] value, LuaGameNetSystem.NetDataType type) { var result = value[readIndex]; readIndex += GetBytesLength(type); return result; } static Encoding stringEncoding = Encoding.UTF8; public string TransStringBytes(byte[] value, LuaGameNetSystem.NetDataType type, int length) { if (value.Length < readIndex + length) { DebugEx.LogError("封包长度不足。"); return string.Empty; } else { var result = stringEncoding.GetString(value, readIndex, length); readIndex += length; return result; } } public uint[] TransVShortsBytes(byte[] value, LuaGameNetSystem.NetDataType type, int length) { var step = GetBytesLength(type); var array = new uint[length]; for (var i = 0; i < length; i++) { switch (type) { case LuaGameNetSystem.NetDataType.BYTE: array[i] = TransByteBytes(value, type); break; case LuaGameNetSystem.NetDataType.WORD: array[i] = TransUshortBytes(value, type); break; case LuaGameNetSystem.NetDataType.Int: array[i] = (uint)TransIntBytes(value, type); break; case LuaGameNetSystem.NetDataType.DWORD: array[i] = TransUintBytes(value, type); break; default: Debug.LogError("请指定正确的类型。"); break; } readIndex += step; } return array; } static int GetBytesLength(LuaGameNetSystem.NetDataType type) { var step = 1; switch (type) { case LuaGameNetSystem.NetDataType.BYTE: step = 1; break; case LuaGameNetSystem.NetDataType.WORD: step = 2; break; case LuaGameNetSystem.NetDataType.DWORD: step = 4; break; case LuaGameNetSystem.NetDataType.Int: step = 4; break; case LuaGameNetSystem.NetDataType.Double: step = 4; break; default: break; } return step; } } [XLua.LuaCallCSharp] public class LuaGameNetSystem { public static LuaGameNetPackBase New() { return new LuaGameNetPackBase(); } public enum NetDataType { BYTE, WORD, DWORD, Chars, Int, Double } }