GoGoBattleCrab() public method

public GoGoBattleCrab ( ) : void
return void
Exemplo n.º 1
0
        public void RunGameLoop()
        {
            Console.WriteLine(" Starting RunGameLoop Thread.");
            //isRunning = true;

            if(playintro == false)
               introlength = new TimeSpan(0, 0, 7);
            else
                introlength = new TimeSpan(0, 0, 21);

            beatrate = new TimeSpan(0, 0, 1);

            introtime = DateTime.Now;
            lastBeat = DateTime.Now;

            NetOutgoingMessage outmsg;

            crab = new CrabBehavior();

            //while(isRunning)
            int sendRate = 1000 / ticksPerSecond; // 1 sec = 1000ms as Sleep uses ms.
            for ( isRunning=true; isRunning; Thread.Sleep(sendRate) )
            {
                if (gamePhase != (int)GameState.Lobby && players.Count == 0)
                {
                    Console.WriteLine("All players disconnected, returning to lobby gamestate.");

                    gamePhase = (int)GameState.Lobby;
                }

                if (gamePhase == (int)GameState.Intro && ((introtime + introlength) < DateTime.Now))
                {
                    //Intro has ran for it's length, lets start the game proper.
                    Console.WriteLine("PlayIntro was set to '"+playintro+"' sending StartGame packet to clients...");
                    //outmsg = server.CreateMessage();
                    //outmsg.Write((byte)PacketTypes.StartGame);
                    //server.SendMessage(outmsg, server.Connections, NetDeliveryMethod.ReliableOrdered, 1);

                    crab.Direction = false;
                    gamePhase = (int)GameState.InGame;
                }

                if(gamePhase == (int)GameState.InGame && crab.CurrentHealth>0)
                {
                    crab.GoGoBattleCrab();
                }

            // Handle dropping players and long idle connections. Note Client must send a KeepAlive packet within 15s
            if (NetTime.Now > last15sec+15)
                {
                    foreach (PlayerObject player in players)
                    {
                        //Console.WriteLine("KeepAlive Check "+player.Name+" (Id"+player.Id+") "+ player.Connection.Status+" RTT "+player.Connection.AverageRoundtripTime +" keepAlive "+player.keepAlive+" vs. lastKeepAlive "+player.lastKeepAlive);
                        if (player.keepAlive > player.lastKeepAlive)
                            player.lastKeepAlive = NetTime.Now;
                        else if (player.keepAlive != player.lastKeepAlive)
                        {
                            SendLobbyMessage("Server","You may need the latest github update v1.1 for multiplayer support.",player.Connection);
                            SendConsoleMessage("You may need the lastest github update v1.1 for multiplayer support.",player.Connection);
                            SendMessageDebug("You may need the lastest github update v1.1 for multiplayer support.",player.Connection);
                            player.Connection.Deny(player.Name + " (Id"+player.Id+") idle connection's keepAlive "+player.keepAlive+" is < lastKeepAlive "+player.lastKeepAlive);
                        }
                        else if (player.keepAlive == player.lastKeepAlive)
                            player.lastKeepAlive = NetTime.Now;
                    }
                    last15sec = NetTime.Now;
                }

                //Send update beats.
                if ((lastBeat + beatrate) < DateTime.Now && gamePhase >=1)
                {
                    //Send a beat to all users. Because the server doesn't really know if they disconnected unless we are sending packets to them.
                    //Beats go out every 2 seconds.
                    foreach (PlayerObject p in players)
                    {
                        outmsg = server.CreateMessage();
                        outmsg.Write((byte)PacketTypes.Beat);
                        outmsg.Write((Int16)beatnum);
                        outmsg.Write(p.Connection.AverageRoundtripTime/2f);
                        server.SendMessage(outmsg, p.Connection, NetDeliveryMethod.ReliableOrdered, 4);
                    }
                    beatnum++;
                    lastBeat = DateTime.Now;
                }
            }
            Console.WriteLine(" Stopped RunGameLoop Thread.");
        }
Exemplo n.º 2
0
        public void RunGameLoop()
        {
            Console.WriteLine(" Starting RunGameLoop Thread.");
            //isRunning = true;

            if (playintro == false)
            {
                introlength = new TimeSpan(0, 0, 7);
            }
            else
            {
                introlength = new TimeSpan(0, 0, 21);
            }

            beatrate = new TimeSpan(0, 0, 1);

            introtime = DateTime.Now;
            lastBeat  = DateTime.Now;

            NetOutgoingMessage outmsg;

            crab = new CrabBehavior();

            //while(isRunning)
            int sendRate = 1000 / ticksPerSecond;             // 1 sec = 1000ms as Sleep uses ms.

            for (isRunning = true; isRunning; Thread.Sleep(sendRate))
            {
                if (gamePhase != (int)GameState.Lobby && players.Count == 0)
                {
                    Console.WriteLine("All players disconnected, returning to lobby gamestate.");

                    gamePhase = (int)GameState.Lobby;
                }

                if (gamePhase == (int)GameState.Intro && ((introtime + introlength) < DateTime.Now))
                {
                    //Intro has ran for it's length, lets start the game proper.
                    Console.WriteLine("PlayIntro was set to '" + playintro + "' sending StartGame packet to clients...");
                    //outmsg = server.CreateMessage();
                    //outmsg.Write((byte)PacketTypes.StartGame);
                    //server.SendMessage(outmsg, server.Connections, NetDeliveryMethod.ReliableOrdered, 1);

                    crab.Direction = false;
                    gamePhase      = (int)GameState.InGame;
                }

                if (gamePhase == (int)GameState.InGame && crab.CurrentHealth > 0)
                {
                    crab.GoGoBattleCrab();
                }

                // Handle dropping players and long idle connections. Note Client must send a KeepAlive packet within 15s
                if (NetTime.Now > last15sec + 15)
                {
                    foreach (PlayerObject player in players)
                    {
                        //Console.WriteLine("KeepAlive Check "+player.Name+" (Id"+player.Id+") "+ player.Connection.Status+" RTT "+player.Connection.AverageRoundtripTime +" keepAlive "+player.keepAlive+" vs. lastKeepAlive "+player.lastKeepAlive);
                        if (player.keepAlive > player.lastKeepAlive)
                        {
                            player.lastKeepAlive = NetTime.Now;
                        }
                        else if (player.keepAlive != player.lastKeepAlive)
                        {
                            SendLobbyMessage("Server", "You may need the latest github update v1.1 for multiplayer support.", player.Connection);
                            SendConsoleMessage("You may need the lastest github update v1.1 for multiplayer support.", player.Connection);
                            SendMessageDebug("You may need the lastest github update v1.1 for multiplayer support.", player.Connection);
                            player.Connection.Deny(player.Name + " (Id" + player.Id + ") idle connection's keepAlive " + player.keepAlive + " is < lastKeepAlive " + player.lastKeepAlive);
                        }
                        else if (player.keepAlive == player.lastKeepAlive)
                        {
                            player.lastKeepAlive = NetTime.Now;
                        }
                    }
                    last15sec = NetTime.Now;
                }

                //Send update beats.
                if ((lastBeat + beatrate) < DateTime.Now && gamePhase >= 1)
                {
                    //Send a beat to all users. Because the server doesn't really know if they disconnected unless we are sending packets to them.
                    //Beats go out every 2 seconds.
                    foreach (PlayerObject p in players)
                    {
                        outmsg = server.CreateMessage();
                        outmsg.Write((byte)PacketTypes.Beat);
                        outmsg.Write((Int16)beatnum);
                        outmsg.Write(p.Connection.AverageRoundtripTime / 2f);
                        server.SendMessage(outmsg, p.Connection, NetDeliveryMethod.ReliableOrdered, 4);
                    }
                    beatnum++;
                    lastBeat = DateTime.Now;
                }
            }
            Console.WriteLine(" Stopped RunGameLoop Thread.");
        }
Exemplo n.º 3
0
        static void Main(string[] args)
        {
            //Setup the policy server first.

            const string AllPolicy =
            @"<?xml version='1.0'?>
            <cross-domain-policy>
            <allow-access-from domain=""*"" to-ports=""*"" />
            </cross-domain-policy>";

            SocketPolicyServer policyServer = new SocketPolicyServer(AllPolicy);
            int ret = policyServer.Start();
            if (ret != 0)
                Console.WriteLine("Failed to start policy server.");
            else
                Console.WriteLine("Policy service started.");

            //Alright, now onto the regular server.
            config = new NetPeerConfiguration("crab_battle");
            config.Port = 14248;
            config.MaximumConnections = 10;
            config.EnableMessageType(NetIncomingMessageType.ConnectionApproval);

            server = new NetServer(config);
            server.Start();

            Console.WriteLine("Crab Battle server open for business.");

            NetIncomingMessage inc;

            DateTime time = DateTime.Now;
            DateTime lastBeat = DateTime.Now;
            DateTime introtime = DateTime.Now;

            TimeSpan timetopass = new TimeSpan(0,0,0,0,50);
            TimeSpan beatrate = new TimeSpan(0, 0, 1);

            TimeSpan introlength;

            bool skipintro = false;

            if(skipintro == true)
                introlength = new TimeSpan(0, 0, 3);
            else
                introlength = new TimeSpan(0, 0, 21);

            int beatnum = 0;

            players = new List<PlayerObject>();

            int playercount = 0;

            NetOutgoingMessage outmsg;

            int gamePhase = 0;

            int gameDifficulty = 1;
            healthMod = 1;

            CrabBehavior crab = new CrabBehavior();

            while(true)
            {
                //The gamestate stuff comes first because we drop a continue if no packet is recieved.

                if (gamePhase != (int)GameState.Lobby && players.Count == 0)
                {
                    Console.WriteLine("All players disconnected, returning to lobby gamestate.");
                    gamePhase = (int)GameState.Lobby;
                }

                if (gamePhase == (int)GameState.Intro && ((introtime + introlength) < DateTime.Now))
                {
                    //Intro has ran for it's length, lets start the game proper.
                    outmsg = server.CreateMessage();
                    outmsg.Write((byte)PacketTypes.StartGame);
                    server.SendMessage(outmsg, server.Connections, NetDeliveryMethod.ReliableOrdered, 1);

                    crab.Direction = false;

                    gamePhase = (int)GameState.InGame;
                }

                if(gamePhase == (int)GameState.InGame)
                {
                    crab.GoGoBattleCrab();
                }

                //Handle dropping players.

                if ((time + timetopass) < DateTime.Now)
                {
                    for (int i = 0; i < players.Count; i++)
                    {
                        PlayerObject player = players[i];

                        //Make sure everyone is connected, and if not drop them.
                        if (player.Connection.Status == NetConnectionStatus.Disconnected || player.Connection.Status == NetConnectionStatus.Disconnecting)
                        {
                            Console.WriteLine(player.Name + " has disconnected, removing player object.");
                            SendLobbyMessage("Server", player.Name + " 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, 1);
                        }
                        else
                        {
                            if (player.LastBeat + 5 < beatnum)
                            {
                                player.Connection.Disconnect("Timeout");
                                Console.WriteLine(player.Name + " has not responded in over 10 seconds.  Closing connection.");
                            }
                        }
                    }

                    time = DateTime.Now;
                }

                //Send update beats.

                if ((lastBeat + beatrate) < DateTime.Now)
                {
                    //Send a beat to all users.  Because the server doesn't really know if they disconnected unless we are sending packets to them.
                    //Beats go out every 2 seconds.
                    foreach (PlayerObject p in players)
                    {
                        outmsg = server.CreateMessage();
                        outmsg.Write((byte)PacketTypes.Beat);
                        outmsg.Write((Int16)beatnum);
                        outmsg.Write(p.Connection.AverageRoundtripTime/2f);
                        server.SendMessage(outmsg, p.Connection, NetDeliveryMethod.ReliableOrdered, 1);
                    }
                    beatnum++;

                    lastBeat = DateTime.Now;
                }

                // IT'S PACKET TIME

                if ((inc = server.ReadMessage()) == null) continue;

                switch(inc.MessageType)
                {
                    case NetIncomingMessageType.ConnectionApproval:
                        //A new connection! If the game is not currently ongoing, we'll accept this connection.

                        Console.WriteLine("Incoming login request. " + inc.SenderConnection.ToString());

                        if (gamePhase > 0)
                        {
                            inc.SenderConnection.Deny("The server is already running a game.");
                            break;
                        }

                        Console.WriteLine("Assigning new player the name of Player " + (playercount+1) + ".");

                        inc.SenderConnection.Approve();

                        players.Add(new PlayerObject(playercount+1, inc.SenderConnection, "Player "+(playercount+1), beatnum));

                        SendLobbyMessage("Server", "Player " + (playercount + 1) + " has connected.  Connected players: " + players.Count);

                        outmsg = server.CreateMessage();
                        outmsg.Write((byte)PacketTypes.Message);
                        outmsg.Write("You are now connected to CrabBattle Server.");
                        server.SendMessage(outmsg, inc.SenderConnection, NetDeliveryMethod.ReliableOrdered, 1);

                        outmsg = server.CreateMessage();
                        outmsg.Write((byte)PacketTypes.AssignId);
                        outmsg.Write((Int32)(playercount + 1));
                        server.SendMessage(outmsg, inc.SenderConnection, NetDeliveryMethod.ReliableOrdered, 1);

                        //Send the current playercount to the client.
                        outmsg = server.CreateMessage();
                        outmsg.Write((byte)PacketTypes.PlayerCount);
                        outmsg.Write((Int16)players.Count);
                        server.SendMessage(outmsg, inc.SenderConnection, NetDeliveryMethod.ReliableOrdered, 1);

                        outmsg = server.CreateMessage();
                        outmsg.Write((byte)PacketTypes.PlayerCount);
                        outmsg.Write((Int16)players.Count);
                        server.SendMessage(outmsg, server.Connections, NetDeliveryMethod.ReliableOrdered, 1);

                        //Send difficulty settings to the new player

                        Console.WriteLine(gameDifficulty + " " + healthMod);

                        outmsg = server.CreateMessage();
                        outmsg.Write((byte)PacketTypes.SettingsChange);
                        outmsg.Write((Int16)gameDifficulty);
                        outmsg.Write((Int16)healthMod);
                        server.SendMessage(outmsg, inc.SenderConnection, NetDeliveryMethod.ReliableOrdered, 1);

                        playercount++;

                        break;

                    case NetIncomingMessageType.Data:

                        PlayerObject player = players.Find(p => p.Connection == inc.SenderConnection);
                        if (player == null)
                            break; //Don't accept data from connections that don't have a player attached.

                        switch ((PacketTypes)inc.ReadByte())
                        {
                            case PacketTypes.LobbyMessage:
                                {
                                    string msg = inc.ReadString();
                                    SendLobbyMessage(player.Name, msg);
                                    Console.WriteLine(player.Name + ": " + msg);
                                }
                                break;
                            case PacketTypes.SettingsChange:
                                {
                                    //Difficulty or health mod changed, broadcast changes to all clients.
                                    gameDifficulty = inc.ReadInt16();
                                    healthMod = inc.ReadInt16();

                                    Console.WriteLine(player.Name + " 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, 1);
                                }
                                break;
                            case PacketTypes.Beat:
                                {
                                    player.LastBeat = inc.ReadInt16();
                                    player.X = inc.ReadFloat();
                                    player.Y = inc.ReadFloat();

                                    if (crab.CurrentTarget == player.Id)
                                    {
                                        float CrabX = inc.ReadFloat();
                                        float CrabZ = inc.ReadFloat();

                                        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, 1);
                                    }
                                }
                                break;
                            case PacketTypes.Ready:
                                {
                                    //Player is ready to start the game.
                                    player.Ready = inc.ReadBoolean();

                                    Console.WriteLine(player.Name + " 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.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 = inc.ReadString();
                                    Console.WriteLine(player.Name + " changed their name to '" + newname + "'.");
                                    SendLobbyMessage("Server", player.Name + " changed their name to '" + newname + "'.");

                                    player.Name = newname;
                                }
                                break;
                            case PacketTypes.Disconnect:
                                {
                                    //Player requests to disconnect from the server.
                                    Console.WriteLine(player.Name + " 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, 1);
                                }
                                break;
                            case PacketTypes.StartGame:
                                {
                                    //Someone clicked start game.  Lets make sure everyone is ready and we're in a state where we can start.
                                    if (gamePhase != (int)GameState.Lobby)
                                        break;

                                    bool ready = true;

                                    foreach (PlayerObject p in players)
                                        ready = ready & p.Ready;

                                    if (ready)
                                    {
                                        outmsg = server.CreateMessage();
                                        outmsg.Write((byte)PacketTypes.Message);
                                        outmsg.Write("All players ready, launching game.");
                                        server.SendMessage(outmsg, server.Connections, NetDeliveryMethod.ReliableOrdered, 1);

                                        Console.WriteLine("All set, launching Game!");

                                        float numplayers = players.Count();
                                        float curplayer = ((numplayers-1) * 20f) / 2f * -1f;

                                        for (int i = 0; i < players.Count; i++)
                                        {
                                            PlayerObject p = players[i];

                                            //Lets create all the player objects for all players, 20 paces apart.
                                            outmsg = server.CreateMessage();
                                            outmsg.Write((byte)PacketTypes.AddPlayer);
                                            outmsg.Write((Int16)p.Id);

                                            p.X = curplayer;
                                            p.Y = -500f; //Hardcoded ftw!

                                            curplayer += 20f;

                                            outmsg.Write(p.X);
                                            outmsg.Write(p.Y);

                                            outmsg.Write(p.Name);

                                            server.SendMessage(outmsg, server.Connections, NetDeliveryMethod.ReliableOrdered, 1);
                                        }

                                        outmsg = server.CreateMessage();
                                        outmsg.Write((byte)PacketTypes.PlayIntro);
                                        server.SendMessage(outmsg, server.Connections, NetDeliveryMethod.ReliableOrdered, 1);

                                        gamePhase = (int)GameState.Intro;

                                        crab = new CrabBehavior(); //Prepare the CRAB!

                                        introtime = DateTime.Now;
                                    }
                                    else
                                    {
                                        outmsg = server.CreateMessage();
                                        outmsg.Write((byte)PacketTypes.Message);
                                        outmsg.Write("A player attempted to start the game, but not all players are ready.");
                                        server.SendMessage(outmsg, server.Connections, NetDeliveryMethod.ReliableOrdered, 1);
                                        SendLobbyMessage("Server", "Game cannot start until all users are ready.");
                                    }
                                }
                                break;
                            case PacketTypes.PlayerSpecial:
                                {
                                    int shottype = inc.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, 0);
                                    //Console.WriteLine("Relaying Special Action Message for " + player.Name + ".");
                                }
                                break;
                            case PacketTypes.PlayerAction:
                                {
                                    //Player hit a key or something!  Change their status, broadcast to other users.

                                    //Set player values
                                    //inc.ReadInt16(); //Player id is submitted, but not used.
                                    player.X = inc.ReadFloat();
                                    player.Y = inc.ReadFloat();
                                    player.VelocityX = inc.ReadFloat();
                                    player.VelocityY = inc.ReadFloat();
                                    player.Firing = inc.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, 1);

                                    //Console.WriteLine("Relaying Action Message for " + player.Name + ". "+player.VelocityX + " " + player.VelocityY);
                                }
                                break;
                            case PacketTypes.HurtTarget:
                                {
                                    int damage = inc.ReadInt16();

                                    crab.CurrentHealth -= damage;
                                    bool hittype = inc.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.Unreliable, 0);
                                }
                                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, 0);
                                }
                                break;
                        }
                        break;
                    case NetIncomingMessageType.StatusChanged:
                        {
                            //Players connection status changed.
                            PlayerObject p1 = players.Find(p => p.Connection == inc.SenderConnection);
                            if (p1 == null)
                                break;

                            Console.WriteLine(p1.Name + " status changed to " + (NetConnectionStatus)inc.SenderConnection.Status + ".");
                        }
                        break;
                    default:
                        break;
                }
            }
        }
Exemplo n.º 4
0
    // Update is called once per frame
    void Update()
    {
        if (gm.isSoloPlay)
        {
            if (gm.gamephase == 2)
            {
                cb.GoGoBattleCrab(Time.time, Time.deltaTime);
            }
            return; //Don't do any of the net management stuff if we're solo.
        }

        if (client.Status == NetPeerStatus.Running && (inc = client.ReadMessage()) != null)
        {
            switch (inc.MessageType)
            {
            case NetIncomingMessageType.Data:
            {
                switch (inc.ReadByte())
                {
                case (byte)PacketTypes.StartGame:
                {
                    // Server sent go ahead to auto start
                    ToggleReady(true);
                    gm.gamephase = 1;
                    if (newname != gm.username)
                    {
                        ChangeName(newname);
                    }
                    print("Received ok to start game intro");
                }
                break;

                case (byte)PacketTypes.PlayIntro:
                {
                    gm.isPlayIntro = inc.ReadBoolean();
                    AddConsoleMessage("isPlayIntro " + gm.isPlayIntro);
                    Debug.Log("isPlayIntro " + gm.isPlayIntro);
                }
                break;

                case (byte)PacketTypes.Message:
                {
                    AddConsoleMessage(inc.ReadString());
                }
                break;

                case (byte)PacketTypes.MessageDebug:
                {
                    print(inc.ReadString());
                }
                break;

                case (byte)PacketTypes.LobbyMessage:
                {
                    AddLobbyMessage(inc.ReadString());
                }
                break;

                case (byte)PacketTypes.PlayerCount:
                {
                    numPlayers = inc.ReadInt16();
                    AddConsoleMessage("The number of connected users has changed to " + numPlayers + ".");
                }
                break;

                case (byte)PacketTypes.SettingsChange:
                {
                    difficulty = inc.ReadInt16();
                    healthmod  = inc.ReadInt16();
                    Debug.Log("Difficulty: " + difficulty + " Battle Length: " + healthmod);
                    AddConsoleMessage("Game difficulty: " + difficulty + " Battle Length: " + healthmod);
                    EnemyManager.CalculateHealth();
                }
                break;

                case (byte)PacketTypes.AssignId:
                {
                    ClientId = inc.ReadInt32();

                    isConnected = true;
                    AddConsoleMessage("Server assigned you an id of " + ClientId + ".");
                    ChangeName(newname);
                }
                break;

                case (byte)PacketTypes.AddPlayer:
                {
                    int     playerid = inc.ReadInt16();
                    float   x        = inc.ReadFloat();
                    float   y        = inc.ReadFloat();
                    string  name     = inc.ReadString();
                    Vector3 position = new Vector3(x, 15, y);
                    Debug.Log("Adding player " + name + " (" + playerid + ") to scene.");

                    if (Players.Exists(play => play.Id == playerid))
                    {
                        return;
                    }

                    GameObject p;
                    if (playerid == ClientId)
                    {
                        //Debug.Log("YOU");
                        p      = GameObject.Instantiate(Resources.Load("player"), position, Quaternion.identity) as GameObject;
                        Player = new PlayerObject(playerid, p, name);
                        Players.Add(Player);

                        Enemy.animation.Play("laying");
                        lastSec = Time.time;
                    }
                    else
                    {
                        //Debug.Log("THEM");
                        p = GameObject.Instantiate(Resources.Load("ally"), position, Quaternion.identity) as GameObject;
                        Players.Add(new PlayerObject(playerid, p, name));
                    }
                }
                break;

                case (byte)PacketTypes.RemovePlayer:
                {
                    int playerid = inc.ReadInt16();
                    //if (gm.gamephase == 0) break;

                    PlayerObject player = Players.Find(p => p.Id == playerid);
                    if (player == null)
                    {
                        break;
                    }
                    Debug.Log("Player " + player.Name + " (" + playerid + ") had disconnected");
                    PlayerController pc     = player.Obj.GetComponent <PlayerController>();
                    bool             status = Players.Remove(player);
                    Debug.Log("Removing player " + playerid + " " + status);
                    Destroy(pc.playername);
                    Destroy(player.Obj);
                }
                break;

                case (byte)PacketTypes.UpdateName:
                {
                    //A Player changed their name.
                    string namechange = inc.ReadString();
                    int    playerid   = inc.ReadInt16();

                    //SendLobbyMessage("Server", player.Name + " (Id"+player.Id+") changed their name to '" + newname + "'.");
                    PlayerObject player = Players.Find(p => p.Id == playerid);
                    if (player == null)
                    {
                        break;
                    }
                    Debug.Log(player.Name + " (Id" + playerid + ") changed their name to '" + namechange + "'.");
                    player.Name = namechange;
                    var pn = player.Controller.playername;
                    if (pn == null)
                    {
                        break;
                    }
                    pn.guiText.text = player.Name;
                }
                break;

                case (byte)PacketTypes.Beat:
                {
                    NetOutgoingMessage outmsg = new NetOutgoingMessage();
                    outmsg.Write((byte)PacketTypes.Beat);
                    outmsg.Write(inc.ReadInt16());
                    if (Player != null)
                    {
                        outmsg.Write(Player.Obj.transform.position.x);
                        outmsg.Write(Player.Obj.transform.position.z);
                    }
                    else
                    {
                        outmsg.Write(0f);
                        outmsg.Write(0f);
                    }
                    outmsg.Write((float)Enemy.transform.position.x);
                    outmsg.Write((float)Enemy.transform.position.z);
                    client.SendMessage(outmsg, NetDeliveryMethod.ReliableOrdered, 4);
                    roundtriptime = inc.ReadFloat();
                }
                break;

                case (byte)PacketTypes.EnemySync:
                {
                    inc.ReadInt16();
                    EnemyManager.CrabMoveSync(inc.ReadFloat(), inc.ReadFloat(), inc.ReadFloat(), inc.ReadFloat(), inc.ReadBoolean(), inc.ReadFloat() + roundtriptime);
                }
                break;

                case (byte)PacketTypes.PlayerSpecial:
                {
                    int playerid = inc.ReadInt16();

                    PlayerObject player = Players.Find(p => p.Id == playerid);
                    if (player == null)
                    {
                        break;
                    }

                    int specialType = inc.ReadInt16();

                    Debug.Log("Got special action request for player " + playerid + " (" + player.Name + ")");

                    if (playerid != ClientId)
                    {
                        player.Controller.UseSpecial(specialType);
                    }
                }
                break;

                case (byte)PacketTypes.PlayerAction:
                {
                    int playerid = inc.ReadInt16();

                    PlayerObject player = Players.Find(p => p.Id == playerid);
                    if (player == null)
                    {
                        break;
                    }

                    float x = inc.ReadFloat();
                    float y = inc.ReadFloat();

                    player.xVelocity = inc.ReadFloat();
                    player.yVelocity = inc.ReadFloat();

                    bool isShooting = inc.ReadBoolean();

                    float triptime = inc.ReadFloat() + roundtriptime;

                    //Only push updates for remote players...
                    if (playerid != ClientId)
                    {
                        player.Controller.PushUpdate(x, y, player.xVelocity, player.yVelocity, isShooting, triptime);
                    }
                }
                break;

                case (byte)PacketTypes.EnemyAction:
                {
                    int   actionId = inc.ReadInt16();
                    float speed    = inc.ReadFloat();
                    int   seed     = inc.ReadInt16();

                    EnemyManager.CrabCommand(actionId, speed, seed);
                }
                break;

                case (byte)PacketTypes.EnemyHealth:
                {
                    EnemyManager.CurrentHealth = inc.ReadInt16();
                }
                break;

                case (byte)PacketTypes.PlayerHit:
                {
                    int playerid = inc.ReadInt16();

                    if (Player == null || Player.Id == playerid)
                    {
                        break;
                    }

                    PlayerObject player = Players.Find(p => p.Id == playerid);
                    if (player != null)
                    {
                        GameObject.Instantiate(Resources.Load("Detonator-Insanity"), player.Obj.transform.position, Quaternion.identity);
                    }
                }
                break;

                default:
                    inc.Reset();
                    Debug.Log("Unhandled Packet Type Recieved.  Packettype is " + Enum.GetName(typeof(PacketTypes), (int)inc.ReadByte()) + ".");
                    break;
                }
            }
            break;

            default:

                break;
            }
        }

        if (Time.time > lastSec + 1)
        {
            lastSec = Time.time;
            SendKeepAlive();

            if (client.ConnectionStatus == NetConnectionStatus.Disconnected)
            {
                AddLobbyMessage("Lost connection to server. Attempting to reconnect...");
                NetOutgoingMessage outmsg = new NetOutgoingMessage();
                outmsg.Write("A Client");

                IPAddress     addr = (Dns.GetHostEntry(hostIp)).AddressList[0];
                IPEndPoint    ip   = new IPEndPoint(addr, gm.gamePort);
                NetConnection nc   = client.GetConnection(ip);

                if (nc != null)
                {
                    isConnected = false;
                    gm.isReady  = false;
                    client.AcceptConnection(nc);
                    AddConsoleMessage("Lost connection to server. Attempting to reconnect...");
                    print("KeepAlive: Reconnecting to server...");
                }
                else
                {
                    client.Connect(hostIp, gm.gamePort, outmsg);
                    if (gm.gamephase == (int)GameState.InGame)
                    {
                        gm.isShowMenu = false;
                        gm.gamephase  = 0;
                        ToggleReady(false);
                        Application.LoadLevel("mainscene");
                    }
                    else
                    {
                        ToggleReady(false);
                        AddConsoleMessage("Attempting to connect to the server...");
                    }
                }
            }
        }

        /*
         * if ((lastBeat + 10 < Time.time) || (lastBeat + 4 < Time.time && !isConnected))
         * {
         * if (isConnected)
         * {
         * AddConsoleMessage("Lost connection to server.  Attempting to reconnect...");
         * isConnected = false;
         * gm.isReady = false;
         * }
         * else
         *      {
         * AddConsoleMessage("Attempting to connect to the server...");
         *
         *      NetOutgoingMessage outmsg = new NetOutgoingMessage();
         *      outmsg.Write("A Client");
         *
         *              print("Update: Reconnecting to server...");
         * client.Connect(hostIp, gm.gamePort, outmsg);
         *      }
         *
         * lastBeat = Time.time;
         * }
         */
    }