topical media & game development

talk show tell print

lib-unity-tutorial-network-m2h-Assets-Example3-GameLobby.js / js



  /* 
  *  This file is part of the Unity networking tutorial by M2H (http://www.M2H.nl)
  *  The original author of this code is Mike Hergaarden, even though some small parts 
  *  are copied from the Unity tutorials/manuals.
  *  Feel free to use this code for your own projects, drop us a line if you made something exciting! 
  */
  #pragma strict
  
  var serverPort : int = 45671;
  var gameName : String = "Example3_Lobby";
  
  private var launchingGame : boolean = false;
  private var showMenu : boolean = false;
  
  private var playerList : Array = new Array();
  class PlayerInfo {
          var username : String;
          var player : NetworkPlayer;
  }
  
  private var serverMaxPlayers : int =4;
  private var serverTitle : String = "Loading..";
  private var serverPasswordProtected : boolean = false;
  
  private var playerName : String = "";
  
  private var mainMenuScript : MainMenu;
  
  function Awake(){
          showMenu=false;
  }
  
  function Start(){
          mainMenuScript =  MainMenu.SP;
  }
  
  function EnableLobby(){
          playerName = PlayerPrefs.GetString("playerName");
          
          
           
          lastRegTime=Time.time-3600;
          
          launchingGame=false;
          showMenu=true;
          
          var chat : LobbyChat = GetComponent(LobbyChat);                
          chat.ShowChatWindow();
  }
  
  function OnGUI () {
          if(!showMenu){
                  return;
          }
  
          
          //Back to main menu
          if(GUI.Button(Rect(40,10,150,20), "Back to main menu")){
                  leaveLobby();
          }
          
          if(launchingGame){                
                  launchingGameGUI();
                  
          } else if(!Network.isServer && !Network.isClient){
                  //First set player count, server name and password option                        
                  hostSettings();
                  
          } else {
                  //Show the lobby                
                  showLobby();
          }
  }
  
  function leaveLobby(){
          //Disconnect fdrom host, or shotduwn host
          if (Network.isServer || Network.isClient){
                  if(Network.isServer){
                          MasterServer.UnregisterHost();
                  }
                  Network.Disconnect();
                  yield WaitForSeconds(0.3);
          }        
          
          var chat : LobbyChat = GetComponent(LobbyChat);
          chat.CloseChatWindow();
                  
          mainMenuScript.OpenMenu("multiplayer");
          
          showMenu=false;
  }
  
  private var hostSetting_title : String = "No server title";
  private var hostSetting_players : int = 4;
  private var hostSetting_password : String = "";
  
  function hostSettings(){
          
          GUI.BeginGroup (Rect (Screen.width/2-175, Screen.height/2-75-50, 350, 150));
          GUI.Box (Rect (0,0,350,150), "Server options");
          
          GUI.Label (Rect (10,20,150,20), "Server title");
          hostSetting_title = GUI.TextField (Rect (175,20,160,20), hostSetting_title);
          
          GUI.Label (Rect (10,40,150,20), "Max. players (2-32)");
          hostSetting_players = parseInt(GUI.TextField (Rect (175,40,160,20), hostSetting_players+""));
          
          GUI.Label (Rect (10,60,150,50), "Password\n");
          hostSetting_password = (GUI.TextField (Rect (175,60,160,20), hostSetting_password));
          
          
          if(GUI.Button (Rect (100,115,150,20), "Go to lobby")){
                  StartHost(hostSetting_password, parseInt(hostSetting_players), hostSetting_title);
          }
          GUI.EndGroup();
  }
  
  function StartHost(password : String, players : int, serverName : String){
          if(players<1){
                  players=1;
          }
          if(players>=32){
                  players=32;
          }
          if(password && password!=""){
                  serverPasswordProtected  = true;
                  Network.incomingPassword = password;
          }else{
                  serverPasswordProtected  = false;
                  Network.incomingPassword = "";
          }
          
          serverTitle = serverName;
  
          Network.InitializeSecurity();
          Network.InitializeServer((players-1), serverPort);        
  }
  
  function showLobby(){
          var players = "";
          var currentPlayerCount : int =0;
          for (var playerInstance : PlayerInfo in playerList) {
                  players=playerInstance.username+"\n"+players;
                  currentPlayerCount++;        
          }
          
          GUI.BeginGroup (Rect (Screen.width/2-200, Screen.height/2-200, 400, 180));
          GUI.Box (Rect (0,0,400,200), "Game lobby");
          
  
          var pProtected="no";
          if(serverPasswordProtected){
                  pProtected="yes";
          }
          GUI.Label (Rect (10,20,150,20), "Password protected");
          GUI.Label (Rect (150,20,100,100), pProtected);
          
          GUI.Label (Rect (10,40,150,20), "Server title");
          GUI.Label (Rect (150,40,100,100), serverTitle);
          
          GUI.Label (Rect (10,60,150,20), "Players");
          GUI.Label (Rect (150,60,100,100), currentPlayerCount+"/"+serverMaxPlayers);
          
          GUI.Label (Rect (10,80,150,20), "Current players");
          GUI.Label (Rect (150,80,100,100), players);
          
          
          if(Network.isServer){
                  if(GUI.Button (Rect (25,140,150,20), "Start the game")){
                          HostLaunchGame();
                  }
          }else{
                  GUI.Label (Rect (25,140,200,40), "Waiting for the server to start the game..");
          }
          
          GUI.EndGroup();
  }
  
  function OnConnectedToServer(){
          //Called on client
          //Send everyone this clients data
          playerList  = new Array();
          playerName = PlayerPrefs.GetString("playerName");
          networkView.RPC("addPlayer",RPCMode.AllBuffered, Network.player, playerName);        
  }
  
  function OnServerInitialized(){
          //Called on host
          //Add hosts own data to the playerlist        
          playerList  = new Array();
          networkView.RPC("addPlayer",RPCMode.AllBuffered, Network.player, playerName);
          
          var pProtected : boolean = false;
          if(Network.incomingPassword && Network.incomingPassword!=""){
                  pProtected=true;
          }
          var maxPlayers : int = Network.maxConnections+1;
          
          networkView.RPC("setServerSettings",RPCMode.AllBuffered, pProtected, maxPlayers, hostSetting_title);
          
  }
  
  var lastRegTime : float = -60;
  function Update(){
          if(Network.isServer && lastRegTime<Time.time-60){
                  lastRegTime=Time.time;
                  MasterServer.RegisterHost(gameName,hostSetting_title, "No description");
          }
  }
  
  @RPC
  function setServerSettings(password : boolean, maxPlayers : int, newSrverTitle : String){
          serverMaxPlayers = maxPlayers;
          serverTitle  = newSrverTitle;
          serverPasswordProtected  = password;
  }
  
  function OnPlayerDisconnected(player: NetworkPlayer) {
          //Called on host
          //Remove player information from playerlist
          networkView.RPC("playerLeft", RPCMode.All, player);
  
          var chat : LobbyChat = GetComponent(LobbyChat);
          chat.addGameChatMessage("A player left the lobby");
  }
  
  @RPC
  function addPlayer(player : NetworkPlayer, username : String){
          Debug.Log("got addplayer"+username);
          
          var playerInstance : PlayerInfo = new PlayerInfo();
          playerInstance.player = player;
          playerInstance.username = username;                
          playerList.Add(playerInstance);
  }
  
  @RPC
  function playerLeft(player : NetworkPlayer){
          
          var deletePlayer : PlayerInfo;
          
          for (var playerInstance : PlayerInfo in playerList) {
                  if (player == playerInstance.player) {                        
                          deletePlayer = playerInstance;
                  }
          }
          playerList.Remove(deletePlayer);
          Network.RemoveRPCs(player);
          Network.DestroyPlayerObjects(player);
  }
  
  function HostLaunchGame(){
          if(!Network.isServer){
                  return;
          }
          
          // Don't allow any more players
          Network.maxConnections = -1;
          MasterServer.UnregisterHost();        
          
          networkView.RPC("launchGame",RPCMode.All);
  }
  
  @RPC
  function launchGame(){
          Network.isMessageQueueRunning=false;
          launchingGame=true;
  }
  
  function launchingGameGUI(){
          //Show loading progress, ADD LOADINGSCREEN?
          GUI.Box(Rect(Screen.width/4+180,Screen.height/2-30,280,50), "");
          if(Application.CanStreamedLevelBeLoaded ((Application.loadedLevel+1))){
                  GUI.Label(Rect(Screen.width/4+200,Screen.height/2-25,285,150), "Loaded, starting the game!");
                  Application.LoadLevel( (Application.loadedLevel+1) );
          }else{
                  GUI.Label(Rect(Screen.width/4+200,Screen.height/2-25,285,150), "Starting..Loading the game: "+Mathf.Floor(Application.GetStreamProgressForLevel((Application.loadedLevel+1))*100)+" %");
          }        
          
  }
  


(C) Æliens 04/09/2009

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.