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."); }
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."); }
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; } } }
// 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; * } */ }