diff --git a/TestVelGameServer/Packages/VelNetUnity/Editor/EditorUtils.cs b/TestVelGameServer/Packages/VelNetUnity/Editor/EditorUtils.cs new file mode 100644 index 0000000..ab66d21 --- /dev/null +++ b/TestVelGameServer/Packages/VelNetUnity/Editor/EditorUtils.cs @@ -0,0 +1,48 @@ +#if UNITY_EDITOR + +using System.Collections.Generic; +using UnityEditor; +using UnityEditor.SceneManagement; +using UnityEngine; +using UnityEngine.SceneManagement; + +namespace VelNet.Editor +{ + public class EditorUtils : MonoBehaviour + { + [MenuItem("VelNet/Check For Duplicate NetworkIds", false, 10)] + private static void CheckDuplicateNetworkIds() + { + NetworkObject[] objs = FindObjectsOfType(); + Dictionary ids = new Dictionary(); + foreach (NetworkObject o in objs) + { + if (!o.isSceneObject) continue; + + if (ids.ContainsKey(o.sceneNetworkId) || o.sceneNetworkId < 100) + { + if (ids.ContainsKey(o.sceneNetworkId)) + { + Debug.Log($"Found duplicated id: {o.name} {ids[o.sceneNetworkId].name}", o); + } + else + { + Debug.Log($"Found duplicated id: {o.name} {o.sceneNetworkId}", o); + } + + o.sceneNetworkId = 100; + while (ids.ContainsKey(o.sceneNetworkId)) + { + o.sceneNetworkId += 1; + } + + PrefabUtility.RecordPrefabInstancePropertyModifications(o); + EditorSceneManager.MarkSceneDirty(SceneManager.GetActiveScene()); + } + + ids.Add(o.sceneNetworkId, o); + } + } + } +} +#endif \ No newline at end of file diff --git a/TestVelGameServer/Packages/VelNetUnity/Editor/EditorUtils.cs.meta b/TestVelGameServer/Packages/VelNetUnity/Editor/EditorUtils.cs.meta new file mode 100644 index 0000000..a0118c0 --- /dev/null +++ b/TestVelGameServer/Packages/VelNetUnity/Editor/EditorUtils.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8f2f5f489d44f614c96bcf8f493c787d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestVelGameServer/Packages/VelNetUnity/Editor/VelNet.Editor.asmdef b/TestVelGameServer/Packages/VelNetUnity/Editor/VelNet.Editor.asmdef new file mode 100644 index 0000000..044643a --- /dev/null +++ b/TestVelGameServer/Packages/VelNetUnity/Editor/VelNet.Editor.asmdef @@ -0,0 +1,18 @@ +{ + "name": "VelNet.Editor", + "rootNamespace": "VelNet.Editor", + "references": [ + "GUID:1e55e2c4387020247a1ae212bbcbd381" + ], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/TestVelGameServer/Packages/VelNetUnity/Editor/VelNet.Editor.asmdef.meta b/TestVelGameServer/Packages/VelNetUnity/Editor/VelNet.Editor.asmdef.meta new file mode 100644 index 0000000..4389fa2 --- /dev/null +++ b/TestVelGameServer/Packages/VelNetUnity/Editor/VelNet.Editor.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: ae0703a992a8fe347978b1cd2dd2d7a9 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/TestVelGameServer/Packages/VelNetUnity/Runtime/VelNetManager.cs b/TestVelGameServer/Packages/VelNetUnity/Runtime/VelNetManager.cs index 9234857..0b5174b 100644 --- a/TestVelGameServer/Packages/VelNetUnity/Runtime/VelNetManager.cs +++ b/TestVelGameServer/Packages/VelNetUnity/Runtime/VelNetManager.cs @@ -27,13 +27,14 @@ namespace VelNet MESSAGE_SETGROUP = 6 }; - public enum MessageType + public enum MessageType : byte { ObjectSync, TakeOwnership, Instantiate, Destroy, - DeleteSceneObjects + DeleteSceneObjects, + Custom } public string host; @@ -80,6 +81,7 @@ namespace VelNet public static Action RoomsReceived; public static Action MessageReceived; + public static Action CustomMessageReceived; #endregion @@ -438,7 +440,15 @@ namespace VelNet sceneObjects[i].networkId = -1 + "-" + sceneObjects[i].sceneNetworkId; sceneObjects[i].owner = masterPlayer; sceneObjects[i].isSceneObject = true; // needed for special handling when deleted - objects.Add(sceneObjects[i].networkId, sceneObjects[i]); + + if (objects.ContainsKey(sceneObjects[i].networkId)) + { + Debug.LogError($"Duplicate NetworkID: {sceneObjects[i].networkId} {sceneObjects[i].name} {objects[sceneObjects[i].networkId]}"); + } + else + { + objects.Add(sceneObjects[i].networkId, sceneObjects[i]); + } } } else @@ -528,12 +538,12 @@ namespace VelNet { //read a byte - byte type = (byte)stream.ReadByte(); + MessageSendType type = (MessageSendType)stream.ReadByte(); switch (type) { //login - case 0: + case MessageSendType.MESSAGE_LOGIN: { LoginMessage m = new LoginMessage(); m.userId = GetIntFromBytes(ReadExact(stream, 4)); //not really the sender... @@ -541,7 +551,7 @@ namespace VelNet break; } //rooms - case 1: + case MessageSendType.MESSAGE_GETROOMS: { RoomsMessage m = new RoomsMessage(); m.rooms = new List(); @@ -567,7 +577,7 @@ namespace VelNet break; } //joined - case 2: + case MessageSendType.MESSAGE_JOINROOM: { JoinMessage m = new JoinMessage(); m.userId = GetIntFromBytes(ReadExact(stream, 4)); @@ -578,7 +588,10 @@ namespace VelNet break; } //data - case 3: + case MessageSendType.MESSAGE_OTHERS: + // case MessageSendType.MESSAGE_OTHERS_ORDERED: + // case MessageSendType.MESSAGE_ALL: + // case MessageSendType.MESSAGE_ALL_ORDERED: { DataMessage m = new DataMessage(); m.senderId = GetIntFromBytes(ReadExact(stream, 4)); @@ -588,7 +601,7 @@ namespace VelNet break; } //new master - case 4: + case MessageSendType.MESSAGE_ALL: { ChangeMasterMessage m = new ChangeMasterMessage(); m.masterId = GetIntFromBytes(ReadExact(stream, 4)); //sender is the new master @@ -723,7 +736,7 @@ namespace VelNet byte[] uB = Encoding.UTF8.GetBytes(username); byte[] pB = Encoding.UTF8.GetBytes(password); - writer.Write((byte)0); + writer.Write((byte)MessageSendType.MESSAGE_LOGIN); writer.Write((byte)uB.Length); writer.Write(uB); writer.Write((byte)pB.Length); @@ -747,7 +760,7 @@ namespace VelNet BinaryWriter writer = new BinaryWriter(stream); byte[] R = Encoding.UTF8.GetBytes(roomname); - writer.Write((byte)2); + writer.Write((byte)MessageSendType.MESSAGE_JOINROOM); writer.Write((byte)R.Length); writer.Write(R); SendTcpMessage(stream.ToArray()); @@ -765,6 +778,26 @@ namespace VelNet } } + public static void SendCustomMessage(byte[] message, bool include_self = false, bool reliable = true, bool ordered = false) + { + using MemoryStream mem = new MemoryStream(); + using BinaryWriter writer = new BinaryWriter(mem); + writer.Write((byte)MessageType.Custom); + writer.Write(message.Length); + writer.Write(message); + SendToRoom(mem.ToArray(), include_self, reliable, ordered); + } + + public static void SendCustomMessageToGroup(string group, byte[] message,bool reliable = true) + { + using MemoryStream mem = new MemoryStream(); + using BinaryWriter writer = new BinaryWriter(mem); + writer.Write((byte)MessageType.Custom); + writer.Write(message.Length); + writer.Write(message); + SendToGroup(group, mem.ToArray(), reliable); + } + internal static void SendToRoom(byte[] message, bool include_self = false, bool reliable = true, bool ordered = false) { byte sendType = (byte)MessageSendType.MESSAGE_OTHERS; diff --git a/TestVelGameServer/Packages/VelNetUnity/Runtime/VelNetPlayer.cs b/TestVelGameServer/Packages/VelNetUnity/Runtime/VelNetPlayer.cs index 7369dfd..1b8a3c0 100644 --- a/TestVelGameServer/Packages/VelNetUnity/Runtime/VelNetPlayer.cs +++ b/TestVelGameServer/Packages/VelNetUnity/Runtime/VelNetPlayer.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System; using System.IO; using System.Text; +using UnityEngine; namespace VelNet { @@ -131,7 +132,12 @@ namespace VelNet { VelNetManager.NetworkDestroy(reader.ReadString()); } - + break; + } + case VelNetManager.MessageType.Custom: // custom packets + { + int len = reader.ReadInt32(); + VelNetManager.CustomMessageReceived?.Invoke(reader.ReadBytes(len)); break; } default: