Page 1 of 1

SetUserVariables

Posted: 07 Jun 2009, 17:17
by tpelham42
Having a bit of an issue setting the user variables for a connected user. Inside an OnJoinedRoom call back I have the below code...

Code: Select all

Debug.Log("[NetMgr] OnRoomJoined");
if(room.GetName() == G_PlayerMgr.instance.GetUsername()){
   Debug.Log("[NetMgr] Joining My Own Room");
   //Set Room Variables
   ArrayList rVars = new ArrayList();
   rVars.Add(new RoomVariable("oid", G_PlayerMgr.instance.playerData.mem_id.ToString(), false, false));
   sfClient.SetRoomVariables(rVars);   

   Hashtable uVars = new Hashtable();         
   uVars.Add("id", G_PlayerMgr.instance.playerData.mem_id.ToString());
   uVars.Add("gen", G_PlayerMgr.instance.playerData.gender);      
         
   sfClient.SetUserVariables(uVars);
         
   Debug.Log("[NetMgr] OnRoomJoined... User Joined Their Own Room. Starting Layout Load...");         
   G_LayoutMgr.instance.loadHome();         
}//if
else{
   //Get The New Rooms Owner ID   
   Debug.Log("[NetMgr] Joining Remote Room: " + room.GetName());         
   Hashtable roomVars = room.GetVariables();
   int owner_id = int.Parse((string)roomVars["oid"]);
   G_LayoutMgr.instance.loadActiveLayout(owner_id);
}//else


The SetUserVariables throws back an acception: " Exception: System.NullReferenceException: Object reference not set to an instance of an object".

I know the variables I'm putting into the hashtable are fine and even tried putting in direct string values and continue to get this error. If I comment out the setuservariables line everything goes through fine with no error. The setRoomVariables above it works fine and does set the room variables. I even tried commenting that out to see if there was in an issue trying to set both variable types in the same block and that didn't make a difference.

I'm using Unity 2.5, SmartFox 1.6.6 and the latest api.

Posted: 11 Jun 2009, 21:41
by tpelham42
Still no joy on this. I've tried the following

- reverting back to 1.0 and 1.1 of the smartfoxapi for Unity
- Reverting back to 1.6.2 of the Smart Fox Server (which is the last time this worked on an older build of the project)

I have tried a few combination's of the above to no avail. The issue seems to be in the API as I'm not seeing any errors or activity on the server end when I try to SetUserVariables. It states error dispatching event which would indicate it's client side. I have tried cleaning up some other unrelated issues in my code thinking perhaps that was causing some issue, but still nothing. Has anyone else seen this issue before?

Thanks.

Posted: 13 Jun 2009, 07:15
by ThomasLund
Hey - been totally busted with work lately. But will take a look soon!

(Just a quick life sign from me)

Posted: 13 Jun 2009, 17:40
by tpelham42
Finally managed to solve this issue this morning. The cause was that I was using a custom login and was not manually setting the SmartFox.myUserId value. I had not even thought about my custom login causing issues and was not aware the myUserId value needed to manually set. After reviewing the docs several more times I stumbled upon it and now everything is working as expected. Figured it was something small and sure enough it was a one liner fix. hehe.

Posted: 13 Jun 2009, 17:59
by ThomasLund
Ahhhh :-)

Cool!

Also remember on custom login to send the room list to the API. Also something that is done behind the scenes in the build-in version.

Best
Thomas

Posted: 14 Jun 2009, 13:04
by tpelham42
Also remember on custom login to send the room list to the API. Also something that is done behind the scenes in the build-in version.

Thanks. Is that done through the GetRoomList method or do I need to expressly pass the room list to the api?

Posted: 14 Jun 2009, 13:23
by ThomasLund
Here is what I've done on the backend - see at the very last code parts

Code: Select all

   public void handleInternalEvent(InternalEventObject ieo) {
      System.out.println("Internal command recieved " + ieo.getEventName());
      if (ieo.getEventName().equals("loginRequest")) {
         authenticate(ieo.getParam("nick"), ieo.getParam("pass"), (SocketChannel)ieo.getObject("chan"));
      }
   }

   /**
    * Authenticate given credentials
    * @param username The username of the player who wants to login
    * @param password The password given for the username
    * @param channel SocketChannel the given player is connected to, so response can be sent back through that channel
    */
   private void authenticate(String username, String password, SocketChannel channel) {
      ActionscriptObject res = new ActionscriptObject();

      try {
         User user = helper.canLogin(username, password, channel, this.getOwnerZone());
         // The login was successfull
         res.put("_cmd", "logOK");
         res.put("id", String.valueOf(user.getUserId()));
         res.put("name", user.getName());

      } catch (LoginException e) {
         // The server did not allow the user to login
         res.put("_cmd", "logKO");
         res.put("err", e.getMessage());
      }

      // Send response back to calling client
      LinkedList ll = new LinkedList();
      ll.add(channel);
      sendResponse(res, -1, null, ll);

      // Send an update room list to the client to mimick the build in login fundtionality
      if (res.getString("_cmd").equals("logOK")) {
         helper.sendRoomList(channel);
      }
   }

Posted: 14 Jun 2009, 13:48
by tpelham42
How does this differ from using GetRoomList on the extension response on the client side? Is this a better practice to do it as part of the custom login script? Thanks.

Posted: 14 Jun 2009, 14:32
by ThomasLund
The result is the same if you do it in 2 steps from your game code - or mimic the build in login.

As long as you are aware that you can do almost nothing with the API until the room list is populated - then you are fine.

/Thomas

Posted: 14 Jun 2009, 14:57
by tpelham42
Great Thanks.