The problem is right after the variables get created the server starts to have odd behavior. The first user is able to join fine, but for subsequent users the ROOM_JOIN never gets called after sending a room join request. The server shows the variables all as they should be, and even shows the subsequent users joining in the logs, but the client games don't know that they have joined a room. Only way to fix is restart the server, also no errors in the log. Classes are using SerializableSFSType.
Things I tried:
- I tested with PutString and dummy data instead of PutClass and server has no issues in that case.
- Tested with a very simple class in PutClass, made no difference and still bugs out but no errors in the log.
- Tried setting the variable on the room itself instead of through getApi() but that didn't make a difference.
Am I doing anything wrong? Or should this get moved into an extension request instead of events? Also thinking about switching to an SFSObject but not sure how to implement hash table or dictionary.
Code: Select all
public class OnUserJoinRoomEventHandler extends BaseServerEventHandler {
@Override
public void handleServerEvent(ISFSEvent event) throws SFSException {
trace("Begin onRoomAdd");
Room eventRoom = (Room)event.getParameter(SFSEventParam.ROOM);
RoomVariable currentLevelDataVariable = eventRoom.getVariable(VariableNames.VariableName_Room_CurrentLevelData);
if(currentLevelDataVariable == null){
ISFSObject currentLevelDataSfso = new SFSObject();
currentLevelDataSfso.putClass(VariableNames.VariableName_Room_CurrentLevelData, new CurrentLevelData());
RoomVariable roomVariable = new SFSRoomVariable(VariableNames.VariableName_Room_CurrentLevelData,currentLevelDataSfso);
ArrayList<RoomVariable> variables = new ArrayList<>();
variables.add(roomVariable);
SetRoomVariable(event,null,variables);
}
RoomVariable changeSetVariable = eventRoom.getVariable(VariableNames.VariableName_Room_ChangeSet);
if(changeSetVariable == null){
ISFSObject changeSetSfso = new SFSObject();
changeSetSfso.putClass(VariableNames.VariableName_Room_ChangeSet, new ChangeSet(-2));
RoomVariable roomVariable = new SFSRoomVariable(VariableNames.VariableName_Room_ChangeSet,changeSetSfso);
ArrayList<RoomVariable> variables = new ArrayList<>();
variables.add(roomVariable);
SetRoomVariable(event,null,variables);
}
trace("End onRoomAdd");
}
public void SetRoomVariable(ISFSEvent event, User user, ArrayList<RoomVariable> variables){
Room eventRoom = (Room)event.getParameter(SFSEventParam.ROOM);
Room targetRoom = getParentExtension().getParentZone().getRoomByName(eventRoom.getName());
getApi().setRoomVariables(user, targetRoom, variables);
}
}
Code: Select all
public class CurrentLevelData implements SerializableSFSType {
public Hashtable<String, LevelObjectDataItem> Data = new Hashtable<>();
}
public class LevelObjectDataItem implements SerializableSFSType {
...
public String LevelObjectId;
public Layers Layer;
public Position Position;
public ChangeTypes ChangeType;
...
}