void RegistNewAutonomousObject(ClientDataContainer client, ReplicatiorBase replicatior, string PrefabName) { RegistNewReplicationObject(replicatior, PrefabName); replicatior.OwnerNetId = client.NetworkId; client.AutonomousObjects.Add(replicatior); OnNewAutonomousObjectAdded?.Invoke(replicatior); }
/// <summary> /// manually call is not recommended /// </summary> public void ServerTick() { if (ClientDataList.Count < 1) { return; } ClientDataList.ForEach((c) => { if (c.TcpSocket.Available > 0) { c.TcpSocket.Client.Receive(buffer); Debug.Log("Tcp Received : " + encoding.GetString(buffer)); DecompClientRequest(buffer, c); if (OnTcpPacketReceived != null) { OnTcpPacketReceived.Invoke(buffer, c); } } }); if (UdpSocket.Available > 0) { IPEndPoint endPoint = null; byte[] Udpbuffer = UdpSocket.Receive(ref endPoint); Debug.Log("Udp Received : " + encoding.GetString(Udpbuffer)); ClientDataContainer client = ClientDataList.Find((c) => c.address == endPoint.Address); DecompClientAutonomousData(Udpbuffer, client); if (OnUdpPacketReceived != null) { OnUdpPacketReceived.Invoke(Udpbuffer, client); } } Replicate(); }
void OnClientDisconnected(ClientDataContainer client) { ClientUIController uIController = clientUIs.Find((ui) => ui.clientDataContainer.address == client.address); clientUIs.Remove(uIController); Destroy(uIController.gameObject); }
public void DisconnectClient(ClientDataContainer client) { SendTcpPacket(client, "Kicked"); if (ClientDataList.Contains(client)) { ClientDisconnected(client); } }
private void OnReceivedMessage(byte[] data, ClientDataContainer clientData) { Debug.Log("new"); GameObject obj = Instantiate(ClientUIPrefab, ContentPanel.transform); ClientUIController uIController = obj.GetComponent <ClientUIController>(); uIController.Initialize(server, clientData); clientUIs.Add(uIController); }
void DecompClientRequest(byte[] data, ClientDataContainer client) { string datastr = encoding.GetString(data); string[] vs = datastr.Contains('$') ? datastr.Split('$') : new string[] { datastr }; foreach (string s in vs) { ClientRequest(s, client); } }
void ClientDisconnected(ClientDataContainer client) { ClientDataList.Remove(client); OnClientDisconnected?.Invoke(client); client.AutonomousObjects.ForEach((r) => { DestroyReplicatedObject(r.Id); }); Debug.Log("Client Disconnected : " + client.address); }
void SendInitialMessage(ClientDataContainer client) { string InitRepData = "Assign," + client.NetworkId + "$"; RepObjects.ForEach((obj) => { InitRepData += "NewRepObj" + "," + obj.RepPrefabName + "," + Serializer.Vector3ToString(obj.transform.position) + "," + Serializer.Vector3ToString(obj.transform.eulerAngles) + "," + obj.transform.parent.gameObject.name + "," + obj.Id + "," + obj.OwnerNetId + "$"; }); SendTcpPacket(client, encoding.GetBytes(InitRepData)); }
public void SendTcpPacket(ClientDataContainer client, byte[] data) { try { client.TcpSocket.Client.Send(data); } catch { ClientDisconnected(client); } }
void ClientRequest(string request, ClientDataContainer client) { string[] vs = request.Contains(',') ? request.Split(',') : new string[] { request }; switch (vs[0]) { case "NewAutoObj": CreateAutonomousPrefab(vs[1], vs[2], Serializer.StringToVector3(vs[3], vs[4], vs[5]), Serializer.StringToVector3(vs[6], vs[7], vs[8]), vs[9], client); break; case "DestAutoObj": RepObjPairs.TryGetValue(int.Parse(vs[1]), out ReplicatiorBase replicatior); if (client.AutonomousObjects.Contains(replicatior)) { DestroyReplicatedObject(int.Parse(vs[1])); } break; case "Init": SendInitialMessage(client); break; case "RPWCOS": //WideRange RPC On Server ProcessRPC_Wide(vs[1], vs[2], vs[3]); break; case "RPWCOC": //WideRange RPC On Client HandOutRPC_Wide(byte.Parse(vs[1]), vs[2], vs[3], vs[4]); break; case "RPWCMC": //MultiCast WideRange RPC MultiCastRPC_Wide(vs[1], vs[2], vs[3]); break; case "RPCOS": //RPC On Server ProcessRPC(int.Parse(vs[1]), vs[2], vs[3]); break; case "RPCOC": //RPC On Client HandOutRPC(byte.Parse(vs[1]), vs[2], vs[3], vs[4]); break; case "RPCMC": //MultiCast RPC MultiCastRPC(vs[1], vs[2], vs[3]); break; case "Disconnect": ClientDisconnected(client); break; default: OnTcpMessageReceived?.Invoke(encoding.GetBytes(request), client); break; } }
public void SendTcpPacket(ClientDataContainer client, string data) { try { client.TcpSocket.Client.Send(encoding.GetBytes(data)); } catch { ClientDisconnected(client); } }
void AcceptedClientCallback(System.IAsyncResult ar) { Debug.Log("Server: Client Connected"); TcpClient client = (ar.AsyncState as TcpListener).EndAcceptTcpClient(ar); ClientDataContainer c = new ClientDataContainer() { TcpSocket = client, address = ((IPEndPoint)client.Client.RemoteEndPoint).Address, AutonomousObjects = new List <ReplicatiorBase>(), NetworkId = NetIdBuffer++ }; Debug.Log("Client IPAddress : " + c.address); ClientDataList.Add(c); OnNewClientConnected?.Invoke(c); }
byte[] CreateReplicationData(ClientDataContainer client) { byte[] data = new byte[0]; RepObjects.ForEach((obj) => { if (obj.DoesClientNeedReplication(client)) { byte[] vs = obj.GetReplicationData(); if (vs != null) { data = data.Concat(encoding.GetBytes(obj.Id + ":")).Concat(vs).Concat(encoding.GetBytes("$")).ToArray(); } } }); return(data); }
void DecompClientAutonomousData(byte[] data, ClientDataContainer client) { string datastr = encoding.GetString(data); string[] vs = datastr.Contains('$') ? datastr.Split('$') : new string[] { datastr }; foreach (string s in vs) { if (s.Length < 1) { return; } if (s.IndexOf(':') < 0) { return; } int Id = int.Parse(s.Substring(0, s.IndexOf(':'))); HandOutAutonomousData(Id, encoding.GetBytes(s.Substring(s.IndexOf(':') + 1))); } }
void OnClientConnected(ClientDataContainer client) { UpdateUI(); }
void CreateAutonomousPrefab(string PrefabName, string ObjName, Vector3 pos, Vector3 eular, string ParentObjName, ClientDataContainer Owner) { string path = "Prefabs/" + PrefabName; GameObject Pobj = (GameObject)Resources.Load(path), parentobj = GameObject.Find(ParentObjName), obj; if (parentobj != null) { obj = Instantiate(Pobj, pos, Quaternion.Euler(eular.x, eular.y, eular.z), parentobj.transform); } else { obj = Instantiate(Pobj, pos, Quaternion.Euler(eular.x, eular.y, eular.z)); } ReplicatiorBase replicatior = obj.GetComponent <ReplicatiorBase>(); if (replicatior == null) { Debug.Log("CreatingAutonomousPrefab Request Refused! Attach Replicator To Prefab!"); Destroy(obj); return; } RegistNewAutonomousObject(Owner, replicatior, PrefabName); ClientDataList.ForEach((c) => { if (c.TcpSocket != Owner.TcpSocket) { SendTcpPacket(c, encoding.GetBytes("NewRepObj," + PrefabName + "," + Serializer.Vector3ToString(pos) + "," + Serializer.Vector3ToString(eular) + "," + ParentObjName + "," + replicatior.Id)); } else { SendTcpPacket(c, encoding.GetBytes("AutoObjAdded," + ObjName + "," + replicatior.Id)); } }); }
/// <summary> /// Available Only On Server. if override this function , Dont forget about AutonomousCheck{client.AutonomousObjects.Contains(this)}. /// </summary> /// <param name="client"></param> /// <returns></returns> public virtual bool DoesClientNeedReplication(ClientDataContainer client) { return(!client.AutonomousObjects.Contains(this)); }
void SendFile(ClientDataContainer client, string FilePath) { client.TcpSocket.Client.SendFile(FilePath); }
public override bool DoesClientNeedReplication(ClientDataContainer client) { return(Prepos != transform.position && !IsAutonomousObject()); }
// Start is called before the first frame update public void Initialize(NetworkManager_Server server, ClientDataContainer clientData) { clientDataContainer = clientData; Server = server; }