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;
}
}