- Home /
Array index out of range?
OK, so I have a network script, everything works fine up to the point were a user joins a server, is asked for a password, then clicks connect. But when the user clicks connect i get and error Array index out of range. Here is the code:
var gameName:String = "";
var serverName:String = "";
var showTextField:boolean;
var showPassField:boolean;
private var connect:boolean;
private var canStart = false;
private var fontStyle : GUIStyle;
private var passWord:String = "";
private var passAtemp:String = "";
private var refreshing:boolean;
private var hostData:HostData[];
private var btnX:float;
private var btnY:float;
private var btnW:float;
private var btnH:float;
function Start(){
btnX = Screen.width * 0.05;
btnY = Screen.width * 0.05;
btnW = Screen.width * 0.1;
btnH = Screen.width * 0.1;
}
function startServer(){
Network.incomingPassword = passWord;
Network.InitializeServer(6, 25000, !Network.HavePublicAddress);
MasterServer.RegisterHost(gameName, serverName, "test game");
}
function refreshHostList(){
MasterServer.RequestHostList(gameName);
refreshing = true;
}
function Update(){
if(refreshing){
if(MasterServer.PollHostList().Length > 0){
refreshing = false;
Debug.Log(MasterServer.PollHostList().Length);
hostData = MasterServer.PollHostList();
}
}
}
function OnServerInitialized(){
Application.LoadLevel("Lobby");
Debug.Log("Server Initialized");
}
function OnMasterServerEvent(mse:MasterServerEvent){
if(mse == MasterServerEvent.RegistrationSucceeded){
Debug.Log("Registared Server");
}
}
function OnGUI(){
if(showPassField){
GUI.Label(Rect (btnX * 6, btnY * 4, btnW * 2, btnH * 0.5), "Enter server Password: ");
passAtemp = GUI.TextField(Rect (btnX * 8, btnY * 4, btnW * 2, btnH * 0.2), passAtemp, 12);
if(GUI.Button(Rect(btnX * 7, btnY * 5, btnW, btnH * 0.5), "Connect")){
connect = true;
Debug.Log("Pass");
}
}
if(showTextField){
GUI.Label(Rect (btnX * 6, btnY * 3, btnW * 2, btnH * 0.5), "Enter server name: ");
serverName = GUI.TextField(Rect (btnX * 8, btnY * 3, btnW * 2, btnH * 0.2), serverName, 25);
GUI.Label(Rect (btnX * 6, btnY * 4, btnW * 2, btnH * 0.5), "Enter server Password: ");
passWord = GUI.TextField(Rect (btnX * 8, btnY * 4, btnW * 2, btnH * 0.2), passWord, 12);
if(GUI.Button(Rect(btnX * 7, btnY * 5, btnW, btnH * 0.5), "Start")){
startServer();
}
if(GUI.Button(Rect(btnX * 11, btnY * 5, btnW, btnH * 0.5), "Cancel")){
Application.LoadLevel("Menu");
}
}
if(!Network.isClient && !Network.isServer && !showTextField){
if(GUI.Button(Rect(btnX, btnY, btnW, btnH), "Start Server")){
showTextField = true;
Destroy(GameObject.FindWithTag("Menu"));
Debug.Log("Starting Server");
}
if(GUI.Button(Rect(btnX, btnY * 1.2 + btnH, btnW, btnH), "Refresh Host")){
Debug.Log("Refreshing");
refreshHostList();
}
if(GUI.Button(Rect(btnX, btnY * 3.4 + btnH, btnW, btnH), "Exit")){
Application.Quit();
}
if(hostData){
for(var i:int = 0; i<hostData.length; i++){
if(GUI.Button(Rect(btnX * 2 + btnW, btnY*1.2 + (btnH * i), btnW * 3, btnH*.5),hostData[i].gameName + "" +hostData[i].connectedPlayers + "/6")){
showPassField = true;
Destroy(GameObject.FindWithTag("Menu"));
}
}
if(connect){
Network.Connect(hostData[i],passAtemp);
}
}
}
}
Answer by whydoidoit · Dec 15, 2012 at 01:36 PM
Your problem is that the
if(connect) {
Network.Connect(hostData[i], passAtemp);
}
is outside the for next loop and so the value of i is guaranteed to be = to the length of the array and hence be an index out of range exception.
I can't quite work out what you are trying to do with that line - but it's guaranteed to fail at present.
Answer by totru · Dec 15, 2012 at 01:55 PM
You problem is the last statement. As the index of a for loop is increased on each turn it is hostData.length after the loop (else the loop wouldn't be left). But as an array is zero based, you ask for an element outside the range.
Network.Connect(hostData[i-1], passAtemp);
should do the job.
Answer by RobbingDaHood · Dec 15, 2012 at 01:53 PM
The code in the end
for(var i:int = 0; i<hostData.length; i++){
needs to be
for(var i:int = 0; i<hostData.length - 1; i++){
Your answer
