public void HandleMessages(object fromPlayer) { if ((inmsg = ((NetServer)fromPlayer).ReadMessage()) == null) { return; } NetOutgoingMessage outmsg; switch (inmsg.MessageType) { /* * case NetIncomingMessageType.DebugMessage: * case NetIncomingMessageType.VerboseDebugMessage: * case NetIncomingMessageType.WarningMessage: */ case NetIncomingMessageType.ConnectionApproval: { if (players.Count == 0) { idCount = 0; } Console.WriteLine("Incoming login request. " + inmsg.SenderConnection.ToString()); AddNewPlayer(inmsg); if (gamePhase == (int)GameState.InGame || gamePhase == (int)GameState.Intro) { // Auto Join Game StartGame(players.Find(p => p.Connection == inmsg.SenderConnection)); } } break; case NetIncomingMessageType.Data: PlayerObject player = players.Find(p => p.Connection == inmsg.SenderConnection); if (player == null || inmsg.LengthBytes < 1) { break; //Don't accept data from connections that don't have a player attached. } switch ((PacketTypes)inmsg.ReadByte()) { case PacketTypes.LobbyMessage: { string msg = inmsg.ReadString(); SendLobbyMessage(player.Name, msg); Console.WriteLine("Chat " + player.Name + ": " + msg); } break; case PacketTypes.SettingsChange: { if (inmsg.LengthBytes < 2) { break; } //Difficulty or health mod changed, broadcast changes to all clients. gameDifficulty = inmsg.ReadInt16(); healthMod = inmsg.ReadInt16(); crab.CalculateHealth(); Console.WriteLine(player.Name + " (Id" + player.Id + ") changed difficulty/healthmod to " + gameDifficulty + "/" + healthMod + "."); outmsg = server.CreateMessage(); outmsg.Write((byte)PacketTypes.SettingsChange); outmsg.Write((Int16)gameDifficulty); outmsg.Write((Int16)healthMod); server.SendMessage(outmsg, server.Connections, NetDeliveryMethod.ReliableOrdered, 5); } break; case PacketTypes.KeepAlive: { // one way heartbeat from client. Server sets a timestamp. // Unity can potentially keep unstable client threads open that waist server resources player.keepAlive = NetTime.Now; } break; case PacketTypes.Beat: { if (inmsg.LengthBytes < 2) { break; // .PeekInt16()) break; } //if (!player.Ready) break; player.LastBeat = inmsg.ReadInt16(); player.X = inmsg.ReadFloat(); player.Y = inmsg.ReadFloat(); if (crab.CurrentTarget == player.Id) { float CrabX = inmsg.ReadFloat(); float CrabZ = inmsg.ReadFloat(); crab.RealPosition.X = CrabX; crab.RealPosition.Z = CrabZ; if (crab.random.Next(0, 10) > 8) { crab.Direction = !crab.Direction; } //Crab position and target sync. outmsg = server.CreateMessage(); outmsg.Write((byte)PacketTypes.EnemySync); outmsg.Write((Int16)player.Id); //Id of the current crab controller. outmsg.Write(CrabX); //EnemyX outmsg.Write(CrabZ); //EnemyZ outmsg.Write(player.X); outmsg.Write(player.Y); outmsg.Write(crab.Direction); outmsg.Write(player.Connection.AverageRoundtripTime / 2f); //Divide by 2 to get trip time. server.SendMessage(outmsg, server.Connections, NetDeliveryMethod.ReliableOrdered, 3); } } break; case PacketTypes.Ready: { //Player is ready to start the game. player.Ready = inmsg.ReadBoolean(); Console.WriteLine(player.Name + " (Id" + player.Id + ") changed their ready status to " + player.Ready); if (player.Ready) { SendLobbyMessage("Server", player.Name + " is now Ready."); } else { SendLobbyMessage("Server", player.Name + " is no longer ready."); } } break; case PacketTypes.PlayIntro: { if (gamePhase == (int)GameState.InGame || gamePhase == (int)GameState.Intro) { SendConsoleMessage("cannot change intro while game is in play", inmsg.SenderConnection); outmsg = server.CreateMessage(); outmsg.Write((byte)PacketTypes.PlayIntro); outmsg.Write(false); server.SendMessage(outmsg, inmsg.SenderConnection, NetDeliveryMethod.ReliableOrdered, 5); break; } //Player changed the status of Play Intro playintro = inmsg.ReadBoolean(); if (playintro) { introlength = new TimeSpan(0, 0, 21); } else { introlength = new TimeSpan(0, 0, 7); } Console.WriteLine(player.Name + " (Id" + player.Id + ") changed PlayInto to " + playintro); if (playintro) { SendLobbyMessage("Server", player.Name + " enabled play intro."); } else { SendLobbyMessage("Server", player.Name + " skipped play intro."); } // Now sync everyone up. outmsg = server.CreateMessage(); outmsg.Write((byte)PacketTypes.PlayIntro); outmsg.Write(playintro); server.SendMessage(outmsg, server.Connections, NetDeliveryMethod.ReliableOrdered, 5); } break; case PacketTypes.UpdateName: { //Player changed their name. Since the clients aren't aware of each other until the game starts, //there's no need to broadcast this message to other users. string newname = inmsg.ReadString(); Console.WriteLine(player.Name + " (Id" + player.Id + ") changed their name to '" + newname + "'."); SendLobbyMessage("Server", player.Name + " (Id" + player.Id + ") changed their name to '" + newname + "'."); player.Name = newname; // let all other clients know that player changed his/her name outmsg = server.CreateMessage(); outmsg.Write((byte)PacketTypes.UpdateName); outmsg.Write(player.Name); outmsg.Write(player.Id); server.SendToAll(outmsg, inmsg.SenderConnection, NetDeliveryMethod.ReliableOrdered, 5); } break; case PacketTypes.Disconnect: { //Player requests to disconnect from the server. Console.WriteLine(player.Name + " (Id" + player.Id + ") has disconnected, removing player object."); outmsg = server.CreateMessage(); outmsg.Write((byte)PacketTypes.RemovePlayer); outmsg.Write((Int16)player.Id); server.SendMessage(outmsg, server.Connections, NetDeliveryMethod.ReliableOrdered, 1); players.Remove(player); outmsg = server.CreateMessage(); outmsg.Write((byte)PacketTypes.PlayerCount); outmsg.Write((Int16)players.Count); server.SendMessage(outmsg, server.Connections, NetDeliveryMethod.ReliableOrdered, 6); } break; case PacketTypes.StartGame: { StartGame(player); } break; case PacketTypes.PlayerSpecial: { int shottype = inmsg.ReadInt16(); outmsg = server.CreateMessage(); outmsg.Write((byte)PacketTypes.PlayerSpecial); outmsg.Write((Int16)player.Id); outmsg.Write((Int16)shottype); server.SendMessage(outmsg, server.Connections, NetDeliveryMethod.ReliableUnordered, 2); //Console.WriteLine("Relaying Special Action Message for " + player.Name + "."); } break; case PacketTypes.PlayerAction: { if (inmsg.LengthBytes < 2) { break; } //Player hit a key or something! Change their status, broadcast to other users. //Set player values //inmsg.ReadInt16(); //Player id is submitted, but not used. player.X = inmsg.ReadFloat(); player.Y = inmsg.ReadFloat(); player.VelocityX = inmsg.ReadFloat(); player.VelocityY = inmsg.ReadFloat(); player.Firing = inmsg.ReadBoolean(); //Broadcast them to everyone else outmsg = server.CreateMessage(); outmsg.Write((byte)PacketTypes.PlayerAction); outmsg.Write((Int16)player.Id); outmsg.Write(player.X); outmsg.Write(player.Y); outmsg.Write(player.VelocityX); outmsg.Write(player.VelocityY); outmsg.Write(player.Firing); outmsg.Write(player.Connection.AverageRoundtripTime / 2f); //Not an exact science, but we'll use this to predict their position. server.SendMessage(outmsg, server.Connections, NetDeliveryMethod.ReliableOrdered, 2); //Console.WriteLine("Relaying Action Message for " + player.Name + ". "+player.VelocityX + " " + player.VelocityY); } break; case PacketTypes.HurtTarget: { int damage = inmsg.ReadInt16(); crab.CurrentHealth -= damage; bool hittype = inmsg.ReadBoolean(); if (!hittype) { player.dmgnormal += damage; } else { player.dmgweakpoint += damage; } outmsg = server.CreateMessage(); outmsg.Write((byte)PacketTypes.EnemyHealth); outmsg.Write((Int16)crab.CurrentHealth); server.SendMessage(outmsg, server.Connections, NetDeliveryMethod.ReliableUnordered, 3); } break; case PacketTypes.PlayerHit: { player.hitstaken += 1; outmsg = server.CreateMessage(); outmsg.Write((byte)PacketTypes.PlayerHit); outmsg.Write((Int16)player.Id); server.SendMessage(outmsg, server.Connections, NetDeliveryMethod.ReliableUnordered, 2); } break; } break; case NetIncomingMessageType.StatusChanged: { player = players.Find(p => p.Connection == inmsg.SenderConnection); if (player == null) { break; //Don't accept data from connections that don't have a player attached. } NetConnectionStatus status = (NetConnectionStatus)inmsg.ReadByte(); string reason = inmsg.ReadString(); if (player.Connection.Status == NetConnectionStatus.Disconnected || player.Connection.Status == NetConnectionStatus.Disconnecting) { SendLobbyMessage("Server", player.Name + " (Id" + player.Id + ") has disconnected."); outmsg = server.CreateMessage(); outmsg.Write((byte)PacketTypes.RemovePlayer); outmsg.Write((Int16)player.Id); server.SendMessage(outmsg, server.Connections, NetDeliveryMethod.ReliableOrdered, 1); players.Remove(player); outmsg = server.CreateMessage(); outmsg.Write((byte)PacketTypes.PlayerCount); outmsg.Write((Int16)players.Count); server.SendMessage(outmsg, server.Connections, NetDeliveryMethod.ReliableOrdered, 6); } Console.WriteLine(player.Name + " (Id" + player.Id + ") status changed to " + status + " (" + reason + ") " + players.Count); } break; default: break; } }