CryLobby was designed to provide an abstraction layer to any 3rd party lobby service. Crytek currently implemented support for the following services:
A service is either eCLS_LAN or eCLS_Online. At present you can only have 1 of each.
LAN only provides the ICryMatchMaking interface.
Online provides a more complete set.
In general all lobby functions expect a callback and return a task identifier.
Due to differences in 3rd party functionality, an additional callback may be executed at any time.
CryLobbyConfigurationCallback is used to provide details about your game that are not exposed via the normal API.
Game can register as being interested in events. In example the Player connected to LIVE, ethernet cable removed, game invite received.
gEnv->pNetwork->GetLobby()->RegisterEventInterest(eCLSE_OnlineState, callback, userArg);
typedef void (*CryLobbyEventCallback)(UCryLobbyEventData eventData, void *userParam);
Most functions in CryLobby and subsystems return an error code.
These error codes also returned in callback functions. A full list can be found in ICryLobby.h
This happens for example when your listener class is being destroyed.
gEnv->pNetwork->GetLobby()->CancelTask(taskId);
taskId is an out parameter in any lobby function that also takes a callback.
Avoid where possible, especially on certain tasks like SessionCreate, SessionJoin or SessionDelete. This may not stop the task from running (could be too late to abort), but it will stop the callback from firing.
Restrictions:
Connections limit is an overall limit - shared between sessions.
Most functions require a session handle, this is returned by SessionCreate or SessionJoin.
virtual ECryLobbyError SessionCreate(uint32* users, int numUsers, uint32 flags, SCrySessionData* data, CryLobbyTaskID* taskID, CryMatchmakingSessionCreateCallback cb, void* cbArg) = 0;
The users pointer along with the numUsers count parameters pass an array of user indexes and correspond to the pad index.
The flags parameter can be one of the following:
The Data argument represents the advertised/synched values which can be changed using SessionUpdate.
virtual ECryLobbyError SessionJoin(uint32* users, int numUsers, uint32 flags, CrySessionID id, CryLobbyTaskID* taskID, CryMatchmakingSessionJoinCallback cb, void* cbArg) = 0;
The function is similar to SessionCreate. It takes a CrySessionID as argument. Provided by either a search callback, an invite callback or from a game packet in another session.
virtual ECryLobbyError SessionDelete(CrySessionHandle h, CryLobbyTaskID* taskID, CryMatchmakingCallback cb, void* cbArg) = 0;
CrySessionHandle is provided by either SessionCreate or SessionJoin callback.
Send arbitrary packets. Doesn't use a fixed format.
Here is an example:
CCryLobbyPacket packet;
Uint32 bufferSize = CryLobbyPacketReliableHeaderSize + CryLobbyPacketUINT8Size;
if (packet.CreateWriteBuffer(bufferSize))
{
packet.StartWrite(type, reliable);
packet.WriteUINT8(3);
}
gEnv->pNetwork->GetLobby()->GetMatchMaking()->SendToAllClients(&packet, sessionHandle);
Also look at SendToClient and SendToServer.
Handled through same mechanism as CryLobbyEvents.
gEnv->pNetwork->GetLobby()->RegisterEventInterest(eCLSE_UserPacket, cb, this);
MatchMaking events will have a sessionHandle as part of the data in the callback, check this against the current session since you don't register for events on a specific session.