How to Find Rooms for Specific Rules or Specific Maps¶
Each room may have various parameters like current game map, mode, stage, etc. Using the SearchJoinableRoom() function and the ICondition object it is possible to find a collection of rooms which meet the search conditions.
Let’s say there are the following game modes and maps.
public enum GameRule {
TeamDeathMatch = 0,
DeathMatch,
GroundBattle
}
public enum GameMap {
Island = 0,
Sea,
River
}
They are properties specific to a particular game title,
so we use custom properties to represent them.
That is, use key1 to store a GameRule and key2 to store a GameMap.
The script to create a room (in a DeathMatch rule on Island map) will look like:
StrixNetwork.instance.CreateRoom(
new RoomProperties {
name = "New Room",
capacity = 4,
key1 = (double)GameRule.DeathMatch,
key2 = (double)GameMap.Island
},
new RoomMemberProperties {
name = "Player name"
},
args => {
Debug.Log("CreateRoom succeeded");
},
args => {
Debug.Log("CreateRoom failed. error = " + args.cause);
}
);
One can search for rooms by conditions by creating an ICondition object.
It is necessary to pass the property’s name (called field in the search API)
and its expected value in a condition object to perform a search.
StrixNetwork.instance.SearchJoinableRoom(
new Equals(new Field("key1"), new Value((double)GameRule.DeathMatch)),
null, 10, 0,
args => {
foreach (var roomInfo in args.roomInfoCollection) {
Debug.Log("roomId " + roomInfo.roomId + " name " + roomInfo.name);
}
},
args => {
Debug.Log("SearchJoinableRoom failed. error = " + args.cause);
}
);
Alternatively, you can use ConditionBuilder to create an ICondition object
provides a more convenient and readable expression.
StrixNetwork.instance.SearchJoinableRoom(
ConditionBuilder.Builder().Field("key1").EqualTo((double)GameRule.DeathMatch).Build(),
null, 10, 0,
args => {
foreach (var roomInfo in args.roomInfoCollection) {
logger.Info("roomId " + roomInfo.roomId + " name " + roomInfo.name);
}
},
args => {
logger.Info("SearchJoinableRoom failed. error = " + args.cause);
}
);
Using an And object it is possible to search for rooms using several conditions.
StrixNetwork.instance.SearchJoinableRoom(
new And(
new List<ICondition> {
new Equals(new Field("key1"), new Value((double)GameRule.DeathMatch)),
new Equals(new Field("key2"), new Value((double)GameMap.Island))
}
), null, 10, 0,
args => {
foreach (var roomInfo in args.roomInfoCollection) {
logger.Info("roomId " + roomInfo.roomId + " name " + roomInfo.name);
}
},
args => {
logger.Info("SearchJoinableRoom failed. error = " + args.cause);
}
);
Or, the same search below using ConditionBuilder.
StrixNetwork.instance.SearchJoinableRoom(
ConditionBuilder.Builder()
.Field("key1").EqualTo((double)GameRule.DeathMatch)
.And()
.Field("key2").EqualTo((double)GameMap.Island)
.Build(),
null, 10, 0,
args => {
foreach (var roomInfo in args.roomInfoCollection) {
logger.Info("roomId " + roomInfo.roomId + " name " + roomInfo.name);
}
},
args => {
logger.Info("SearchJoinableRoom failed. error = " + args.cause);
}
);
Strix provides the following condition constructs.
Condition type |
Builder method |
Data Type |
Description |
|---|---|---|---|
Equals |
EqualTo |
any |
key == value |
NotEquals |
NotEqualTo |
any |
key != value |
GreaterThan |
GreaterThan |
number |
key > value |
GreaterThanEquals |
GreaterThanEquals |
number |
key >= value |
LessThan |
LessThan |
number |
key < value |
LessThanEquals |
LessThanEquals |
number |
key <= value |
IsNull |
IsNull |
string |
key is null |
IsNotNull |
IsNotNull |
string |
key is not null |
Like |
Like |
string |
key is like value (pattern) |
NotLike |
(unavailable) |
string |
key is not like value (pattern) |
And |
And |
condition |
Both condition A and Condition B |
Or |
Or |
condition |
Condition A, Condition B, or both |
In this table, any means
bool,int,long,double, orstring, and number means eitherint,long, ordouble.
Note
Strix supports more condition constructs. See the API Reference for the full list.
The following property (field) names can be used in search conditions.
Field name |
Type |
|---|---|
roomId |
long |
capacity |
int |
memberCount |
int |
primaryKey |
long |
isPasswordProtected |
bool |
isJoinable |
bool |
state |
int |
name |
string |
key1 |
double |
key2 |
double |
key3 |
double |
key4 |
double |
key5 |
double |
key6 |
double |
key7 |
double |
key8 |
double |
stringKey |
string |
Note
You can search a room using standard properties (such as capacity or memberCount)
as well as standard custom properties (such as state or key1),
but you can’t using full-custom properties (those stored in properties).
Note
Type of these properties are significant when performing a search. No automatic type conversion takes place. If the name of a room property and the specified type don’t match, no errors are detected, but the search returns unusable results.
For example, if you want to find a room whose capacity is not two, you can pass the following condition to a search method:
new Equals(new Field("capacity"), new Value(2))
However, if you would make a mistake to write it as follows, for whatever reason, it doesn’t work.
new Equals(new Field("capacity"), new Value(2.0))
The search with the latter condition will return list of rooms including those with the capacity equals to 2. Strix condition system distinguishes an int value 2 and a double value 2.0, and the type of “capacity” property is int, so the search returns the room whose capacity is not “a double value 2.0”.
In the example presented on this page, GameRule and GameMap are enums,
while key1 and key2 custom properties are of type double.
That’s why these enum values are always casted to double in the above example codes.
You need a special attention when passing one of the enum values to
a Value constructor or
a comparison method like EqualTo (in condition builder),
because they have overloads taking int and double (among other types)
for different properties.
If you pass an enum value to them without a cast,
C# grammar implicitly casts them to int to invoke an int version,
which creates an unusable ICondition object.