public void OnNetworkReceive( NetPeer peer, NetPacketReader reader, DeliveryMethod deliveryMethod) { if (!reader.IsNull) { peer.GetConnection().Receive(reader.GetRemainingBytesSegment()); } }
public void OnNetworkReceive( NetPeer peer, NetPacketReader reader, DeliveryMethod deliveryMethod) { if (reader.IsNull) { throw new InvalidNetworkPackageException($"Received empty package from ${peer}."); } peer.GetConnection()?.Receive(reader.GetRemainingBytesSegment()); }
public void OnNetworkReceive(NetPeer peer, NetPacketReader reader, DeliveryMethod method) { byte[] data = reader.GetRemainingBytes(); peer.GetConnection().serverPlayer.HandleReceive(new ByteReader(data), method == DeliveryMethod.ReliableOrdered); }
public void OnNetworkLatencyUpdate(NetPeer peer, int latency) { peer.GetConnection().Latency = latency; }
public void OnPeerDisconnected(NetPeer peer, DisconnectInfo disconnectInfo) { IConnection conn = peer.GetConnection(); server.OnDisconnected(conn, MpDisconnectReason.ClientLeft); }
public void OnPeerDisconnected(NetPeer peer, DisconnectInfo disconnectInfo) { m_Server.Disconnected( (ConnectionServer)peer.GetConnection(), disconnectInfo.GetReason(false)); }
/// <summary> Message loop to check type of message and handle it accordingly </summary> public void MessageLoop() { while ((_msg = _peer.ReadMessage()) != null) { s_bpsBytes += _msg.LengthBytes; switch (_msg.MessageType) { case NetIncomingMessageType.DiscoveryRequest: //Debug.WriteLine("ReceivePeersData DiscoveryRequest"); _peer.SendDiscoveryResponse(null, _msg.SenderEndPoint); break; case NetIncomingMessageType.DiscoveryResponse: // just connect to first server discovered //Debug.WriteLine("ReceivePeersData DiscoveryResponse CONNECT"); if (_peer.Connections.Any(x => x.RemoteEndPoint.Address.Equals(_msg.SenderEndPoint.Address))) { Debug.WriteLine("allreadyConnected"); } else { _peer.Connect(_msg.SenderEndPoint); } break; case NetIncomingMessageType.ConnectionApproval: //Debug.WriteLine("ReceivePeersData ConnectionApproval"); _msg.SenderConnection.Approve(); //broadcast this to all connected clients SendPeerInfo(_msg.SenderEndPoint.Address, _msg.SenderEndPoint.Port); break; case NetIncomingMessageType.Data: //another client sent us data //Read TypeData First Enums.MessageType mType = (Enums.MessageType)_msg.ReadByte(); if (mType == Enums.MessageType.String) { var metadata = _msg.ReadString(); if (metadata == "StartEvent") { var map = _msg.ReadString(); _isMaster = false; MasterNetConnection = _peer.Connections.FirstOrDefault(x => x.RemoteEndPoint.Address.ToString() == _msg.SenderEndPoint.Address.ToString()); Game1.Inst.Scene.Raise("startgame", map); } else if (metadata == "metadata") { Game1.Inst.Scene.Raise("network_data_text", _msg.ReadString()); } } else if (mType == Enums.MessageType.PeerInformation) { int byteLenth = _msg.ReadInt32(); byte[] addressBytes = _msg.ReadBytes(byteLenth); IPAddress ip = new IPAddress(addressBytes); int port = _msg.ReadInt32(); //connect IPEndPoint endPoint = new IPEndPoint(ip, port); Debug.WriteLine("Data::PeerInfo::Detecting if we're connected"); if (_peer.GetConnection(endPoint) == null) { //are we already connected? //Don't try to connect to ourself! if (_peer.Configuration.LocalAddress.GetHashCode() != endPoint.Address.GetHashCode() || _peer.Configuration.Port.GetHashCode() != endPoint.Port.GetHashCode()) { Debug.WriteLine(string.Format("Data::PeerInfo::Initiate new connection to: {0}:{1}", endPoint.Address.ToString(), endPoint.Port.ToString())); _peer.Connect(endPoint); } } } else if (mType == Enums.MessageType.Entity || mType == Enums.MessageType.EntityLight) { var cbody = new CBody(); var ctransform = new CTransform(); string modelname = ""; bool isPlayer = false; int id = 0; id = mType == Enums.MessageType.EntityLight ? _msg.ReadEntityLight(ref cbody, ref ctransform, ref modelname, ref isPlayer) : _msg.ReadEntity(ref cbody, ref ctransform, ref modelname, ref isPlayer); Game1.Inst.Scene.Raise("entityupdate", new EntitySync { ID = id, CBody = cbody, CTransform = ctransform, ModelFileName = modelname, IsPlayer = isPlayer }); } else if (mType == Enums.MessageType.CTransform) { var metadata = _msg.ReadString(); var data = _msg.ReadCTransform(); //Game1.Inst.Scene.Raise("network_data", data); } else if (mType == Enums.MessageType.Vector3) { var metadata = _msg.ReadString(); var data = _msg.ReadCTransform(); //Game1.Inst.Scene.Raise("network_data", data); } else if (mType == Enums.MessageType.CText) { var id = _msg.ReadInt32(); var data = _msg.ReadCText(); Game1.Inst.Scene.Raise("network_menu_data_received", new MenuItem { CText = data, Id = id }); } else if (mType == Enums.MessageType.Int32) { var metadata = _msg.ReadString(); var data = _msg.ReadInt32(); if (metadata == "network_game_end") { Game1.Inst.Scene.Raise("game_end", data); } } else if (mType == Enums.MessageType.PlayerInfo) { var date = _msg.ReadInt64(); if (!players.Any(x => x.IP == _msg.SenderEndPoint.Address.ToString() + " " + _msg.SenderEndPoint.Port.ToString())) { players.Add(new NetworkPlayer { IP = _msg.SenderEndPoint.Address.ToString() + " " + _msg.SenderEndPoint.Port.ToString(), Time = new DateTime(date), You = false }); Game1.Inst.Scene.Raise("update_peers", players.OrderBy(x => x.Time).ToList()); } } //Console.WriteLine("END ReceivePeersData Data"); break; case NetIncomingMessageType.UnconnectedData: Debug.WriteLine("UnconnectedData: " + _msg.ReadString()); break; case NetIncomingMessageType.VerboseDebugMessage: Debug.WriteLine(NetIncomingMessageType.VerboseDebugMessage + " " + _msg.ReadString()); break; case NetIncomingMessageType.DebugMessage: Debug.WriteLine(NetIncomingMessageType.DebugMessage + " " + _msg.ReadString()); break; case NetIncomingMessageType.WarningMessage: Debug.WriteLine(NetIncomingMessageType.WarningMessage + " " + _msg.ReadString()); break; case NetIncomingMessageType.ErrorMessage: Debug.WriteLine(NetIncomingMessageType.ErrorMessage + " " + _msg.ReadString()); break; default: Debug.WriteLine("ReceivePeersData Unknown type: " + _msg.MessageType.ToString()); try { Debug.WriteLine(_msg.SenderConnection); if (_msg.SenderConnection.Status == NetConnectionStatus.Disconnected) { //Maybe try to reconnect } Debug.WriteLine(_msg.ReadString()); } catch { Debug.WriteLine("Couldn't parse unknown to string."); } break; } } }
public void OnPeerDisconnected(NetPeer peer, DisconnectInfo disconnectInfo) { ConnectionBase conn = peer.GetConnection(); server.playerManager.OnDisconnected(conn, MpDisconnectReason.ClientLeft); }
/// <summary> /// Called by the Update method when status change messages are received. /// Connection, disconnection and approval requests, for example. /// </summary> /// <param name="message">The incoming message.</param> private void ProcessStatusChangedMessage(NetIncomingMessage message) { NetConnectionStatus newStatus = (NetConnectionStatus)message.ReadByte(); switch (newStatus) { case NetConnectionStatus.Connected: // get ClientId provided by the server if we're a client if (Role == NetworkRole.Client) { var serverConnection = network.GetConnection(message.SenderEndPoint); var remoteHail = serverConnection.RemoteHailMessage; if (remoteHail != null) { ClientId = remoteHail.ReadByte(); } // add the server to our client Id map, its ID is always 1 // old connection may still be around if it wasn't cleaned up if (clientIdConnectionMap.ContainsKey(1)) { clientIdConnectionMap[1] = serverConnection; } else { clientIdConnectionMap.Add(1, serverConnection); } log.Info($"Connected to: {message.SenderEndPoint} with Client ID {ClientId}"); Connected?.Invoke(message.SenderConnection.RemoteUniqueIdentifier); } // send all game objects to new peer if (Role == NetworkRole.Server) { var id = clientIdConnectionMap.Where(kvp => kvp.Value == message.SenderConnection).FirstOrDefault(); log.Info($"New client connected from: {message.SenderEndPoint} with id {id}"); SendCreateAllEntities(message.SenderConnection); ClientConnected?.Invoke(message.SenderConnection.RemoteUniqueIdentifier); } RefreshConnectionCollection(); break; case NetConnectionStatus.Disconnected: if (Role == NetworkRole.Client) { log.Info("Disconnected from server."); Disconnected?.Invoke(message.SenderConnection.RemoteUniqueIdentifier); } if (Role == NetworkRole.Server) { log.Info("Client disconnected."); ClientDisconnected?.Invoke(message.SenderConnection.RemoteUniqueIdentifier); DestroyUnownedEntities(); } RefreshConnectionCollection(); break; case NetConnectionStatus.RespondedAwaitingApproval: SendApprovalMessage(message.SenderConnection); break; } }
public void OnPeerDisconnected(NetPeer peer, DisconnectInfo disconnectInfo) { IConnection conn = peer.GetConnection(); server.OnDisconnected(conn); }
public Context CreateRemoteContext(IPEndPoint target) => new Context(NetPeer.GetConnection(target));
public void OnPeerDisconnected(NetPeer peer, DisconnectInfo disconnectInfo) { m_Server.Disconnected( (ConnectionServer)peer.GetConnection(), EDisconnectReason.ClientLeft); }