Professional Documents
Culture Documents
Documentation
for DotNet, Unity3D and Silverlight SDKs
Table of Contents
Overview
Photon Workflow
Operations
Events
Using TCP
Serializable Datatypes
Lite Application
Properties on Photon
Further Help
DotNet Platforms
6
7
Symbol Reference
Classes
10
10
ArrayList Class
ArrayList Constructor
10
10
ArrayList.ArrayList Constructor ()
11
11
ArrayList Fields
ArrayList.SyncRoot Field
ArrayList Methods
ArrayList.Synchronized Method
Hashtable Class
Hashtable Constructor
11
11
11
11
11
12
Hashtable.Hashtable Constructor ()
12
12
Hashtable Methods
12
Hashtable.Synchronized Method
12
Hashtable.this Indexer
12
Hashtable.ToString Method
13
ii
13
16
16
17
17
LitePeer Methods
17
LitePeer.OpGetProperties Method
17
OpGetPropertiesOfActor Method
17
OpGetPropertiesOfGame Method
18
OpJoin Method
19
OpLeave Method
20
OpRaiseEvent Method
20
LitePeer.OpSetPropertiesOfActor Method
22
LitePeer.OpSetPropertiesOfGame Method
22
PhotonPeer Class
PhotonPeer Constructor
23
26
26
26
27
PhotonPeer Fields
PhotonPeer.PhotonPort Field
PhotonPeer Methods
27
27
27
PhotonPeer.Connect Method
27
PhotonPeer.DeriveSharedKey Method
28
PhotonPeer.Disconnect Method
28
PhotonPeer.DispatchIncomingCommands Method
28
PhotonPeer.FetchServerTimestamp Method
28
OpCustom Method
29
PhotonPeer.OpExchangeKeysForEncryption Method
30
PhotonPeer.SendOutgoingCommands Method
30
PhotonPeer.Service Method
31
PhotonPeer.StopThread Method
31
PhotonPeer Properties
31
PhotonPeer.BytesIn Property
31
PhotonPeer.BytesOut Property
32
PhotonPeer.ChannelCount Property
32
PhotonPeer.CommandBufferSize Property
32
PhotonPeer.DebugOut Property
32
PhotonPeer.debugTimeForDeriveSharedKey Property
32
PhotonPeer.debugTimeForDiffieHellman Property
32
PhotonPeer.DisconnectTimeout Property
33
PhotonPeer.IsEncryptionAvailable Property
33
iii
33
PhotonPeer.LocalMsTimestampDelegate Property
33
PhotonPeer.LocalTimeInMilliSeconds Property
33
PhotonPeer.PeerID Property
33
PhotonPeer.PeerState Property
34
PhotonPeer.QueuedIncomingCommands Property
34
PhotonPeer.QueuedOutgoingCommands Property
34
PhotonPeer.RoundTripTime Property
34
PhotonPeer.RoundTripTimeVariance Property
34
PhotonPeer.SentCountAllowance Property
34
PhotonPeer.ServerAddress Property
35
PhotonPeer.ServerTimeInMilliSeconds Property
35
PhotonPeer.TimePingInterval Property
35
PhotonPeer.UseCommandActionQueue Property
35
PhotonPeer.UsedProtocol Property
36
PhotonPeer.WarningSize Property
36
PhotonPeer Delegates
PhotonPeer.GetLocalMsTimestampDelegate Delegate
SupportClass Class
SupportClass Classes
SupportClass.ThreadSafeRandom Class
SupportClass Methods
36
36
36
37
37
37
SupportClass.ByteArrayToString Method
37
SupportClass.DeserializeData Method
37
SupportClass.HashtableToString Method
38
NumberToByteArray Method
38
SupportClass.SerializeData Method
39
SupportClass.WriteStackTrace Method
39
Interfaces
39
IPhotonPeerListener Interface
IPhotonPeerListener Methods
39
40
IPhotonPeerListener.DebugReturn Method
40
IPhotonPeerListener.EventAction Method
40
IPhotonPeerListener.OperationResult Method
41
IPhotonPeerListener.PeerStatusCallback Method
41
42
ConnectionProtocol Enumeration
43
DebugLevel Enumeration
43
LiteEventCode Enumeration
43
LiteEventKey Enumeration
44
LiteOpCode Enumeration
45
iv
45
LitePropertyTypes Enumeration
46
PeerStateValue Enumeration
47
PhotonEventKey Enumeration
47
PhotonOpParameterKey Enumeration
48
StatusCode Enumeration
48
Index
1 Overview
Photon is a development framework to build real-time multiplayer games and applications for various platforms. It consists of
a Server SDK and Client SDKs for several platforms.
1
This is the documentation and reference for the Photon Client Library for DotNet, including Unity and Silverlight. Additional
documentation and help is available online. Visit: developer.exitgames.com.com and forum.exitgames.com
Photon provides a low-latency communication-layer based on UDP (or alternatively TCP). This protocol allows reliable and
unreliable transfer of data in "commands". On top of this, an operation- and event-framework is established to ease
development of your own games. We developed several applications and included them in the server SDK as example and
code base.
Server-side, the "Lite" application offers the basic operations that we felt useful for most room-based multiplayer games. We
included it's operations and events ( see page 3) are part of of the client API. The MMO application focuses on seamless
worlds and it's client side api is available in source in the MMO application's code (as it shares code with the server side).
The following API is used on several platforms: DotNet for Windows, Mono but also Unity3D scripting and Silverlight.
create a LitePeer (
1.2 Operations
see
Combined with the server's Lite application, this simple workflow would allow you to use rooms and send your game's events
( see page 3). The methods used could be broken down into three layers:
1
Low Level: Service, Connect, Disconnect and the StatusCallback are directly referring to the connection to the server.
This level works with UDP/TCP packets which transport commands (which in turn carry your operations). It keeps your
connection alive and organizes your RPC calls and events ( see page 3) into packages.
Logic Level: Operations ( see page 2), results and events ( see page 3) make up the logical level in Photon. Any
operation defined on the server (think RPC call) and can have a result. Events ( see page 3) are incoming from the
server and update the client with some data.
Application Level: Made up by a specific application and its features. In this case we use the operations and logic of the
Lite application. In this specific case, we have rooms and actors and more. The LitePeer ( see page 13) is matching the
server side implementation and wraps it up for you.
You don't have to manage the low level communication in most cases. However, it makes sense to know that everything that
goes from client to server (and the other way round) is put into "commands". Internally, commands are also used to establish
and keep the connection between client and server alive (without carrying additional data).
All methods that are operations (RPC calls) are prefixed with "Op" to tell them apart from anything else. Other server side
applications (like MMO or your own) will define different operations. These will have different parameters and return values.
These operations are not part of the client library but can be implemented by calling OpCustom().
PeerStatusCallback ( see page 41) is for peer state-changes (connect, disconnect, errors, compare with StatusCode
Enumeration ( see page 48))
OperationResult (
EventAction (
see page 41) is the callback for operations (join, leave, etc.)
DebugReturn (
see page 40) as callback to debug output (less frequently used by release builds)
TimePingInterval (
RoundTripTime (
RoundTripTimeVariance (
ServerTimeInMilliSeconds (
1.2 Operations
Operation is our term for remote procedure calls (RPC) on Photon. This in turn can be described as methods that are
implemented on the server-side and called by clients. As any method, they have parameters and return values. The Photon
development framework takes care of getting your RPC calls from clients to server and results back.
2
Server-side, operations are part of an application running on top of Photon. The default application provided by Exit Games
is called "Lite Application" or simply Lite. The LitePeer ( see page 13) class extends the PhotonPeer ( see page 23) by
methods for each of the Lite Operations.
Examples for Lite Operations are "join" and "raise event". On the client side, they can be found in the LitePeer ( see page
13) class as methods: OpJoin and OpRaiseEvent. They can be used right away with the default implementation of Photon
and the Lite Application.
Custom Operations
Photon is extendable with features that are specific to your game. You could persist world states or double check information
from the clients. Any operation that is not in Lite or the MMO application logic is called Custom Operation. Creating those is
primarily a server-side task, of course, but the clients have to use new functions / operations of the server.
So Operations are methods that can be called from the client side. They can have any number of parameters and any name.
To preserve bandwidth, we assign byte-codes for every operation and each parameter. The definition is done server side.
Each Operation has its own, unique number to identify it, known as the operation code (opCode). An operation class defines
the expected parameters and assigns a parameter code for each. With this definition, the client side only has to fill in the
values and let the server know the opCode of the Operation.
Photon uses Hashtables to aggregate the opCode and all parameters. Use OpCustom() (
Hashtable ( see page 11) and call any operation.
Client side, opCode and parameter-codes are currently of type byte (to minimize overhead). They need to match the
definition of the server side to successfully call your operation.
1.3 Events
Unlike operations, events are "messages" that are rarely triggered by the client that receives them. Events come from
outside: the server or other clients.
They are created as side effect of operations (e.g. when you join a room) or raised as main purpose of the operation Raise
Event. Most events carry some form of data but in rare cases the type of event itself is the message.
Events are (once more) Hashtables with arbitrary content.
Be aware that this might stall other commands. Call Service() or SendOutgoingCommands() more often than absolutely
necessary. You should check that PhotonPeer.QueuedOutgoingCommands ( see page 34) is becoming zero regularly to
make sure everything gets out. You can also check the debug output for "UDP package is full", which can happen from time
to time but should not happen permanently.
Sequencing
The sequencing of the protocol makes sure that any receiving client will Dispatch your actions in the order you sent them.
Unreliable data is considered replaceable and can be lost. Reliable events ( see page 3) and operations will be repeated
several times if needed but they will all be Dispatched in order without gaps. Unreliable actions are also related to the last
reliable action and not Dispatched before that reliable data was Dispatched first. This can be useful, if the events ( see
page 3) are related to each other.
Example: Your FPS sends out unreliable movement updates and reliable chat messages. A lost package with movement
updates would be left out as the next movement update is coming fast. An the receiving end, this would maybe show as a
small jump. If a package with a chat message is lost, this is repeated and would introduce lag, even to all movement updates
after the message was created. In this case, the data is unrelated and should be put into different channels.
Channels
The DotNet clients and server are now supporting "channels". This allows you to separate information into multiple channels,
each being sequenced independently. This means, that Events ( see page 3) of one channel will not be stalled because
events ( see page 3) of another channel are not available.
By default an PhotonPeer ( see page 23) has two channels and channel zero is the default to send operations. The
operations join and leave are always sent in channel zero (for simplicity). There is a "background" channel 255 used
internally for connect and disconnect messages. This is ignored for the channel count.
Channels are prioritized: the lowest channel number is put into a UDP package first. Data in a higher channel might be sent
later when a UDP package is already full.
Example: The chat messages can now be sent in channel one, while movement is sent in channel zero. They are not related
and if a chat message is delayed, it will no longer affect movement in channel zero. Also, channel zero has higher priority
and is more likely to be sent (in case packages get filled up).
Example:
A Silverlight client might send unreliable movement updates in channel # 1. This will be sent via TCP, which makes it
reliable. Photon however also has connections with UDP clients (like a 3D downloadable game client). It will use your
reliable / unreliable settings to forward your movement updates accordingly.
Starting with Photon Server SDK 1.8.0 and DotNet SDK 5.6.0, the set of serializable datatypes is changed. The ArrayList (
see page 10) was removed but aside from Arrays and Hashtables every serializable type can also be sent as array (e.g.
String[], Float[]). Only one-dimensional arrays are supported currently.
sbyte[]
int[]
String[]
Properties on Photon
Any change that uses the broadcast option will trigger a property update event. This event carries the changed properties
(only), who changed the properties and where the properties belong to.
Your clients need to "merge" the changes (if properties are cached at all).
Properties can be set by these methods:
LitePeer.OpSetPropertiesOfActor Method (
LitePeer.OpSetPropertiesOfGame Method (
LitePeer.OpJoin Method (
see page 19) also allows you to set properties if the game did not exist yet
6
Broadcast Events
Any change that uses the broadcast option will trigger a property update event LiteEventCode.SetProperties (
43). This event carries the properties as value of key LiteEventKey.Properties ( see page 44).
Additionally, there is information about who changed the properties in key LiteEventKey.ActorNr (
see page
The key LiteEventKey.TargetActorNr ( see page 44) will only be available if the property-set belongs to a certain player. If
it's not present, the properties are game-properties.
Notes
The current Lite application is not able to delete properties and does not support wildcard characters in string keys to fetch
properties.
Other types of keys could be used but to keep things simple, we decided against adding those. If needed, we would help you
with the implementation.
The property handling is likely to be updated and extended in the future.
2 DotNet Platforms
2.1 Photon for Unity3D
This chapter addresses differences between the DotNet SDK and the one for Unity3D.
If you don't use Unity3D, skip this chapter.
2
3. How to add Photon to your Unity project:
a) To add the Photon .dll from the SDK to a Unity project, just copy it somewhere in the assets-folder of the project and
make sure that there are no duplicates (pay attention to old versions with different filenames).
b) Make sure to have the following line of code somewhere in your scripts, so the game runs even when in background:
Application.runInBackground = true; //without this Photon will loose connection if not focussed
c) For the iOS builds, you should set the "iPhone Stripping Level" to "Strip Bytecode" (Edit->Project Settings->Player). Also,
use the "DotNet 2.0 subset". If your project runs fine in IDE and you get an error message when building it for device, please
check this option.
d) Make sure to change the server address used in the client, as "localhost:5055" won't work on device.
Essential differences
No UDP
Silverlight does not support UDP sockets and thus all instanced PhotonPeers are using TCP. This affects Photon only.
No Port 5055
8
Again a change for Photon usage: you cannot select just any port with Silverlight. It needs to connect to ports in the range of:
4502-4534. We selected 4530 as connection port. You also need to have a Policy File Server running on port 843. Both TCP
ports must be open to the general internet to reach your server. The Photon Server SDK provides the correct setup.
No Hashtable (
Silverlight excludes non-generic data types. As those are used throughout the libraries, we added the substitutes for those
classes. They are located in a separate library, so you could use Photon with Neutron in one project. Usage of those
substitutes should be analog to the DotNet Hashtable ( see page 11) and ArrayList ( see page 10).
Additional lib needed
In the Silverlight SDKs, we needed to split some classes from the Photon (and Neutron) libraries into a separate file.
Because of this, Silverlight projects have to both provided libraries / dlls of the Photon SDK.
The Demos
As usual, the demos are plain and consist of the least amount of UI possible (it's not our focus).
The Silverlight Photon Demo has its entry point in the Page.xaml.cs but most of the Photon logic is wrapped by the
Game.cs class. The sample should be compatible with the Realtime Demo of the DotNet SDK and others. Those however
are expanded more often.
If you need any further Silverlight demos we will help you. We just need to know.
3.1 Classes
ArrayList Class
3 Symbol Reference
3.1 Classes
The following table lists classes in this documentation.
Classes
Name
ArrayList (
Description
see page 10)
Hashtable (
LitePeer (
PhotonPeer (
SupportClass (
see page 8)
Methods
Name
ArrayList (
Description
see page 11)
ArrayList Fields
Name
SyncRoot (
Description
see page 11)
ArrayList Methods
Name
Synchronized (
Description
see page 11)
3.1 Classes
Hashtable Class
see page 8)
11
3.1 Classes
Hashtable Class
Methods
Name
Description
Hashtable (
Hashtable Methods
Name
Description
Synchronized (
this (
ToString (
12
3.1 Classes
LitePeer Class
see page 23) and implements the operations offered by the "Lite Application (
C#
public class LitePeer : PhotonPeer;
Remarks
This class is used by our samples and allows rapid development of simple games. You can use rooms and properties and
send events ( see page 3). For many games, this is a good start.
Methods
Name
Description
PhotonPeer (
LitePeer Class
Name
LitePeer (
Description
see page 16)
PhotonPeer Delegates
Name
Description
GetLocalMsTimestampDelegate (
PhotonPeer Fields
Name
Description
PhotonPort (
The default port used with Photon as string. DotNet and Unity: "5055".
"4530" for Silverlight.
PhotonPeer Methods
Name
Connect (
Description
see page 27)
This method does a DNS lookup (if necessary) and connects to the given
serverAddress.
The return value gives you feedback if the address has the correct
format. If so, this starts the process to establish the connection itself,
which might take a few seconds.
When the connection is established, a callback to
IPhotonPeerListener.PeerStatusCallback ( see page 41) will be done. If
the connection can't be established, despite having a valid address, the
PeerStatusCallback is called with an error-value.
The appID defines the application logic to use server-side and it should
match the name of one of the apps in your server's config.
By default,... more ( see page 27)
13
3.1 Classes
Disconnect (
LitePeer Class
DispatchIncomingCommands (
see page 28)
This method directly causes the callbacks for events ( see page 3),
responses and state changes within a IPhotonPeerListener ( see page
39). DispatchIncomingCommands only executes a single received
command per call. If a command was dispatched, the return value is true
and the method should be called again. This method is called by Service
( see page 31)() until currently available commands are dispatched.
FetchServerTimestamp (
page 28)
This will fetch the server's timestamp and update the approximation for
property ServerTimeInMilliseconds.
The server time approximation will NOT become more accurate by
repeated calls. Accuracy currently depends on a single roundtrip which is
done as fast as possible.
The command used for this is immediately acknowledged by the server.
This makes sure the roundtrip time is low and the timestamp +
rountriptime / 2 is close to the original value.
OpCustom (
see
OpExchangeKeysForEncryption (
see page 30)
This method creates a public key for this client and exchanges it with the
server.
Encryption is not instantly available after calling this method. The fetched
server's public-key is provided by callback to OperationResult. See
DeriveSharedKey ( see page 28) how to go on after this operation.
SendOutgoingCommands (
page 30)
Service (
see
StopThread (
LitePeer Class
Name
OpGetProperties (
Description
see page 17)
OpGetPropertiesOfActor (
page 17)
see
14
3.1 Classes
see
OpLeave (
OpRaiseEvent (
LitePeer Class
OpSetPropertiesOfActor (
page 22)
OpSetPropertiesOfGame (
page 22)
see
see
PhotonPeer Properties
Name
BytesIn (
Description
see page 31)
BytesOut (
ChannelCount (
CommandBufferSize (
32)
DebugOut (
see page
Sets the level of debug output which is returned by the library (in
DebugReturn ( see page 40)).
Use the PhotonPeer.DebugLevel ( see page 43) enumeration. Default:
Error.
debugTimeForDeriveSharedKey (
see page 32)
debugTimeForDiffieHellman (
page 32)
DisconnectTimeout (
see page 33) Milliseconds after which a reliable UDP command triggers a timeout
disconnect, unless acknowledged by server. This value currently only
affects UDP connections. The actual timeout might happen later,
depending on the connection. Commands that are sent while having a
bad roundtrip time and variance are checked less often for re-sending!
DisconnectTimeout and SentCountAllowance ( see page 34) are
competing settings: either might trigger a disconnect on the client first,
depending on the values and Rountrip Time. Default: 10000 ms.
IsEncryptionAvailable (
33)
Listener (
see page
15
3.1 Classes
see This setter for a timestamp delegate which then replaces the default
Environment.TickCount with any equal function.
see
PeerState (
LitePeer Class
QueuedIncomingCommands (
see page 34)
QueuedOutgoingCommands (
see page 34)
RoundTripTime (
RoundTripTimeVariance (
page 34)
SentCountAllowance (
34)
ServerAddress (
see
see page
ServerTimeInMilliSeconds (
page 35)
TimePingInterval (
WarningSize (
see
UseCommandActionQueue (
page 35)
UsedProtocol (
see
3.1 Classes
LitePeer Class
Description
IPhotonPeerListener listener
Your IPhotonPeerListener (
Description
IPhotonPeerListener listener
Your IPhotonPeerListener (
ConnectionProtocol protocolType
C#
public LitePeer(IPhotonPeerListener listener, bool useTcp);
Description
byte channelId
17
3.1 Classes
LitePeer Class
Parameters
Parameters
Description
int[] actorNrList
byte[] properties
byte channelId
channel 0 or higher
Returns
Consecutive invocationID of the OP. Will throw Exception if not connected or channelId >= channelCount.
Description
Please read the general description of Properties on Photon (
Description
int[] actorNrList
string[] properties
byte channelId
channel 0 or higher
Returns
Consecutive invocationID of the OP. Will throw Exception if not connected or channelId >= channelCount.
Description
Please read the general description of Properties on Photon (
Description
byte[] properties
byte channelId
channel 0 or higher
Returns
Consecutive invocationID of the OP. Will throw Exception if not connected or channelId >= channelCount.
Description
Please read the general description of Properties on Photon (
3.1 Classes
LitePeer Class
C#
public virtual short OpGetPropertiesOfGame(string[] properties, byte channelId);
Parameters
Parameters
Description
string[] properties
byte channelId
channel 0 or higher
Returns
Consecutive invocationID of the OP. Will throw Exception if not connected or channelId >= channelCount.
Description
Please read the general description of Properties on Photon (
see page 3) that are raised for the room by any player.
To distinguish the actors, each gets a consecutive actornumber. This is used in events ( see page 3) to mark who triggered
the event. A client finds out it's own actornumber in the return callback for operation Join. Number 1 is the lowest
actornumber in each room and the client with that actornumber created the room.
Each client could easily send custom data around. If the data should be available to newcomers, it makes sense to use
Properties.
Joining a room will trigger the event LiteEventCode.Join ( see page 43), which contains the list of actorNumbers of current
players inside the room (LiteEventKey.ActorList ( see page 44)). This also gives you a count of current players.
C#
public virtual short OpJoin(string gameName);
Parameters
Parameters
Description
string gameName
Returns
Consecutive invocationID of the OP. Will throw Exception if not connected.
This operation will join an existing room by name or create one if the name is not in use yet.
Rooms (or games) are simply identified by name. We assume that users always want to get into a room - no matter if it
existed before or not, so it might be a new one. If you want to make sure a room is created (new, empty), the client side
might come up with a unique name for it (make sure the name was not taken yet).
The application "Lite Lobby" lists room names and effectively allows the user to select a distinct one.
Each actor (a.k.a. player) in a room will get events (
see page 3) that are raised for the room by any player.
19
3.1 Classes
LitePeer Class
To distinguish the actors, each gets a consecutive actornumber. This is used in events ( see page 3) to mark who triggered
the event. A client finds out it's own actornumber in the return callback for operation Join. Number 1 is the lowest
actornumber in each room and the client with that actornumber created the room.
Each client could easily send custom data around. If the data should be available to newcomers, it makes sense to use
Properties.
Joining a room will trigger the event LiteEventCode.Join ( see page 43), which contains the list of actorNumbers of current
players inside the room (LiteEventKey.ActorList ( see page 44)). This also gives you a count of current players.
C#
public virtual short OpJoin(string gameName, Hashtable gameProperties, Hashtable
actorProperties, bool broadcastActorProperties);
Parameters
Parameters
Description
string gameName
Hashtable gameProperties
Hashtable actorProperties
bool broadcastActorProperties
Returns
Consecutive invocationID of the OP. Will throw Exception if not connected.
3.1 Classes
LitePeer Class
Parameters
Parameters
Description
byte eventCode
Hashtable evData
bool sendReliable
Returns
Consecutive invocationID of the OP. Will throw Exception if not connected.
Description
byte eventCode
Hashtable evData
bool sendReliable
byte channelId
Returns
Consecutive invocationID of the OP. Will throw Exception if not connected or channelId >= channelCount.
Remarks
RaiseEvent can be used reliable or unreliable. Both result in ordered events ( see page 3) but the unreliable ones might be
lost and allow gaps in the resulting event sequence. On the other hand, they cause less overhead and are optimal for data
that is replaced soon. Sending is not done immediately but in intervals of Service ( see page 31) calls.
The parameter eventCode defines the event's type and eventCode-value on the receiving clients. The parameter "evData" is
a Hashtable ( see page 11) which can have any number of keys and values of the serializable datatypes ( see page 5). It
will be copied to the resulting event Hashtable ( see page 11) as value of key: LiteEventKey.Data ( see page 44).
It is recommended to keep keys (and data) as simple as possible (e.g. Byte or Short as key and byte[] as value), as the data
is typically sent multiple times per second. This would add up to a huge amount of data in itself otherwise.
Example
//send some position data:
Hashtable evInfo = new Hashtable();
Player local = (Player)players[playerLocalID];
evInfo.Add((Object)STATUS_PLAYER_POS_X, (Int32)local.posX);
evInfo.Add((Object)STATUS_PLAYER_POS_Y, (Int32)local.posY);
peer.OpRaiseEvent(EV_MOVE, evInfo, true); //EV_MOVE = 101
see page 3) from the Photon Server are not pushed through the regular Protocol library. Instead they are received
21
3.1 Classes
LitePeer Class
C#
public virtual short OpRaiseEvent(byte eventCode, Hashtable evData, bool sendReliable, byte
channelId, int[] targetActors);
Parameters
Parameters
Description
byte eventCode
Hashtable evData
bool sendReliable
int[] targetActors
Returns
Consecutive invocationID of the OP. Will throw Exception if not connected or channelId >= channelCount.
Remarks
This variant works like the regular OpRaiseEvent methods. Please read the documentation of these ( see page 21). This
variant has an optional list of target actors. If set, the server will send the event only to the room's actors defined by the list.
This can be used to implement private messages inside a room or similar.
Description
int actorNr
Hashtable properties
bool broadcast
byte channelId
channel 0 or higher
Returns
Consecutive invocationID of the OP. Will throw Exception if not connected or channelId >= channelCount.
Description
Please read the general description of Properties on Photon (
3.1 Classes
PhotonPeer Class
Parameters
Parameters
Description
Hashtable properties
bool broadcast
byte channelId
channel 0 or higher
Returns
Consecutive invocationID of the OP. Will throw Exception if not connected or channelId >= channelCount.
Description
Please read the general description of Properties on Photon (
Description
see page 26)
PhotonPeer Delegates
Name
Description
GetLocalMsTimestampDelegate (
PhotonPeer Fields
Name
PhotonPort (
Description
see page 27)
The default port used with Photon as string. DotNet and Unity: "5055".
"4530" for Silverlight.
23
3.1 Classes
PhotonPeer Class
PhotonPeer Methods
Name
Connect (
Description
see page 27)
DeriveSharedKey (
Disconnect (
This method does a DNS lookup (if necessary) and connects to the given
serverAddress.
The return value gives you feedback if the address has the correct
format. If so, this starts the process to establish the connection itself,
which might take a few seconds.
When the connection is established, a callback to
IPhotonPeerListener.PeerStatusCallback ( see page 41) will be done. If
the connection can't be established, despite having a valid address, the
PeerStatusCallback is called with an error-value.
The appID defines the application logic to use server-side and it should
match the name of one of the apps in your server's config.
By default,... more ( see page 27)
DispatchIncomingCommands (
see page 28)
This method directly causes the callbacks for events ( see page 3),
responses and state changes within a IPhotonPeerListener ( see page
39). DispatchIncomingCommands only executes a single received
command per call. If a command was dispatched, the return value is true
and the method should be called again. This method is called by Service
( see page 31)() until currently available commands are dispatched.
FetchServerTimestamp (
page 28)
This will fetch the server's timestamp and update the approximation for
property ServerTimeInMilliseconds.
The server time approximation will NOT become more accurate by
repeated calls. Accuracy currently depends on a single roundtrip which is
done as fast as possible.
The command used for this is immediately acknowledged by the server.
This makes sure the roundtrip time is low and the timestamp +
rountriptime / 2 is close to the original value.
OpCustom (
see
OpExchangeKeysForEncryption (
see page 30)
24
3.1 Classes
see
StopThread (
PhotonPeer Class
PhotonPeer Properties
Name
Description
BytesIn (
BytesOut (
ChannelCount (
CommandBufferSize (
32)
DebugOut (
see page
Sets the level of debug output which is returned by the library (in
DebugReturn ( see page 40)).
Use the PhotonPeer.DebugLevel ( see page 43) enumeration. Default:
Error.
debugTimeForDeriveSharedKey (
see page 32)
debugTimeForDiffieHellman (
page 32)
DisconnectTimeout (
see page
LocalTimeInMilliSeconds (
page 33)
see
PeerState (
LocalMsTimestampDelegate (
page 33)
PeerID (
see page 33) Milliseconds after which a reliable UDP command triggers a timeout
disconnect, unless acknowledged by server. This value currently only
affects UDP connections. The actual timeout might happen later,
depending on the connection. Commands that are sent while having a
bad roundtrip time and variance are checked less often for re-sending!
DisconnectTimeout and SentCountAllowance ( see page 34) are
competing settings: either might trigger a disconnect on the client first,
depending on the values and Rountrip Time. Default: 10000 ms.
IsEncryptionAvailable (
33)
Listener (
see This setter for a timestamp delegate which then replaces the default
Environment.TickCount with any equal function.
Gets a local timestamp in milliseconds by calling the
GetLocalMsTimestampDelegate ( see page 36). See
LocalMsTimestampDelegate ( see page 33).
QueuedIncomingCommands (
see page 34)
QueuedOutgoingCommands (
see page 34)
3.1 Classes
RoundTripTimeVariance (
page 34)
SentCountAllowance (
34)
ServerAddress (
see
see page
ServerTimeInMilliSeconds (
page 35)
TimePingInterval (
WarningSize (
see
UseCommandActionQueue (
page 35)
UsedProtocol (
PhotonPeer Class
see
Parameters
Parameters
Description
IPhotonPeerListener listener
a IPhotonPeerListener (
3.1 Classes
PhotonPeer Class
recommend UDP.
C#
public PhotonPeer(IPhotonPeerListener listener, ConnectionProtocol protocolType);
Parameters
Parameters
Description
IPhotonPeerListener listener
a IPhotonPeerListener (
ConnectionProtocol protocolType
C#
public PhotonPeer(IPhotonPeerListener listener, bool useTcp);
Description
String serverAddress
String appID
27
3.1 Classes
PhotonPeer Class
Returns
true if IP is available (DNS name is resolved) and server is being connected. false on error.
In OperationResult use this code to derive the shared secret: case (byte)LiteOpCode.ExchangeKeysForEncryption:
//this.DebugReturn("OpExchangeKeysForEncryption ( see page 30) response: " + SupportClass.HashtableToString ( see
page 38)(returnValues)); if (returnCode == 0) this.peer.DeriveSharedKey((byte[])returnValues[(byte)LiteOpKey.ServerKey]);
break;
C#
public void DeriveSharedKey(byte[] serverPublicKey);
Parameters
Parameters
Description
byte[] serverPublicKey
see page
C#
public virtual void Disconnect();
3.1 Classes
PhotonPeer Class
The server time approximation will NOT become more accurate by repeated calls. Accuracy currently depends on a single
roundtrip which is done as fast as possible.
The command used for this is immediately acknowledged by the server. This makes sure the roundtrip time is low and the
timestamp + rountriptime / 2 is close to the original value.
C#
public virtual void FetchServerTimestamp();
Description
byte customOpCode
Hashtable customOpParameters
bool sendReliable
Returns
Consecutive invocationID of the OP. Will throw Exception if not connected or channelId >= channelCount.
C#
public virtual short OpCustom(byte customOpCode, Hashtable customOpParameters, bool
sendReliable, byte channelId);
Parameters
Parameters
Description
byte customOpCode
Hashtable customOpParameters
bool sendReliable
byte channelId
Returns
Consecutive invocationID of the OP. Will throw Exception if not connected or channelId >= channelCount.
29
3.1 Classes
PhotonPeer Class
C#
public virtual short OpCustom(byte customOpCode, Hashtable customOpParameters, bool
sendReliable, byte channelId, bool encrypt);
Parameters
Parameters
Description
byte customOpCode
Hashtable customOpParameters
bool sendReliable
byte channelId
bool encrypt
see page
As the Photon library does not create any UDP/TCP packages by itself. Instead, the application fully controls how many
packages are sent and when. A tradeoff, an application will lose connection, if it is no longer calling
SendOutgoingCommands or Service ( see page 31).
If multiple operations and ACKs are waiting to be sent, they will be aggregated into one package. The package fills in this
order: ACKs for received commands A "Ping" - only if no reliable data was sent for a while Starting with the lowest
Channel-Nr: Reliable Commands in channel Unreliable Commands in channel
This gives a higher priority to lower channels.
30
3.1 Classes
PhotonPeer Class
A longer interval between sends will lower the overhead per sent operation but increase the internal delay (which adds "lag").
Call this 2..20 times per second (depending on your target platform).
Example
You could replace Service by:
while (DispatchIncomingCommands (
see page 28)()); //Dispatch until everything
SendOutgoingCommands ( see page 30)(); //Send a UDP/TCP package with outgoing messages
is
Dispatched...
31
3.1 Classes
PhotonPeer Class
C#
public DebugLevel DebugOut;
Available
after
C#
public int debugTimeForDeriveSharedKey;
Remarks
This temporary property might be removed in upcoming SDK releases.
C#
public int debugTimeForDiffieHellman;
Remarks
This temporary property might be removed in upcoming SDK releases.
32
3.1 Classes
PhotonPeer Class
C#
public bool IsEncryptionAvailable;
see page 39) of this instance (set in constructor). Can be used in derived classes for
C#
public IPhotonPeerListener Listener;
Description
Exception
C#
public int LocalTimeInMilliSeconds;
3.1 Classes
PhotonPeer Class
C#
public ushort PeerID;
Remarks
Used for debugging only. This value is not useful in everyday Photon usage.
C#
public PeerStateValue PeerState;
Remarks
Don't mix this up with the StatusCode ( see page 48) provided in IPhotonListener.PeerStatusCallback(). Applications
should use the StatusCode ( see page 48) of PeerStatusCallback() to track their state, as it also covers the higher level
initialization between a client and Photon.
C#
public int QueuedIncomingCommands;
Changes of the roundtriptime as variance value. Gives a hint about how much the time is changing.
C#
public int RoundTripTimeVariance;
3.1 Classes
PhotonPeer Class
command is calculated by the current roundTripTime + 4 * roundTripTimeVariance. Please note that the timeout span until a
command will be resent is not constant, but based on the roundtrip time at the initial sending, which will be doubled with
every failed retry.
DisconnectTimeout ( see page 33) and SentCountAllowance are competing settings: either might trigger a disconnect on
the client first, depending on the values and Rountrip Time.
C#
public int SentCountAllowance;
C#
public string ServerAddress;
The value sent by Photon equals Environment.TickCount in the logic layer (e.g. Lite).
35
3.1 Classes
SupportClass Class
Description
ThreadSafeRandom (
37)
see page
SupportClass Methods
Name
Description
ByteArrayToString (
DeserializeData (
HashtableToString (
see page
WriteStackTrace (
see page 38) This method returns a string, representing the content of the given
hashtable. Returns null, if the parameter was null.
NumberToByteArray (
38)
SerializeData (
Inserts the number's value into the byte array, using Big-Endian order
(a.k.a. Network-byte-order).
Uses the internal serialization methods to create a byte-array from the
data supplied.
Writes the exception's stack trace to the received stream.
36
3.1 Classes
SupportClass Class
C#
public class ThreadSafeRandom;
ThreadSafeRandom Methods
Name
Next (
Description
see page 37)
Description
byte[] list
Returns
List of bytes as string (numbers separated by " ").
C#
public static Hashtable DeserializeData(byte[] dataBytes);
Parameters
Parameters
Description
byte[] dataBytes
37
3.1 Classes
SupportClass Class
Returns
The Hashtable (
Description
Hashtable neutronEvent
_nt_
Description
byte[] buffer
int index
int number
Number to write.
Description
byte[] buffer
int index
long number
Number to write.
C#
public static void NumberToByteArray(byte[] buffer, int index, short number);
Parameters
Parameters
Description
byte[] buffer
int index
short number
Number to write.
38
3.2 Interfaces
IPhotonPeerListener Interface
Description
Hashtable data
Data Hashtable (
byte-array.
Returns
Serialized data in form of a byte-array or null in case of error.
Remarks
This method can be helpful to save (almost) any data locally. The format uses a minimum of bytes for the given data.
You can put any information into the Hashtable (
Datatypes ( see page 5).
see page 11) as long as key and value are from the list of Serializable
See Also
DeserializeData (
Description
System.Exception throwable
System.IO.TextWriter stream
3.2 Interfaces
The following table lists interfaces in this documentation.
Interfaces
Name
IPhotonPeerListener (
39)
Description
see page
Callback interface for the Photon client side. Must be provided to a new
PhotonPeer ( see page 23) in its constructor.
C#
public interface IPhotonPeerListener;
39
3.2 Interfaces
IPhotonPeerListener Interface
Remarks
These methods are used by your PhotonPeer ( see page 23) instance to keep your app updated. Read each method's
description and check out the samples to see how to use them.
IPhotonPeerListener Methods
Name
DebugReturn (
EventAction (
Description
see page 40)
OperationResult (
PeerStatusCallback (
41)
see page
Description
DebugLevel level
string message
Remarks
All debug output of the library will be reported through this method. Print it or put it in a buffer to use it on-screen. Use
PhotonPeer.DebugOut ( see page 32) to select how verbose the output is.
Description
byte eventCode
Hashtable photonEvent
Remarks
Events ( see page 3) are used for communication between clients. The creation of an event is most often triggered by an
operation call. There are predefined events ( see page 3) like EvJoin and EvLeave and some predefined event keys in the
LiteEventKey Structure ( see page 44). It is easy to create custom events ( see page 3) with LitePeer.OpRaiseEvent (
see page 20).
40
3.2 Interfaces
IPhotonPeerListener Interface
Events ( see page 3) are buffered on the client side and must be Dispatched. This way, EventAction is always taking place
in the same thread as a PhotonPeer.DispatchIncomingCommands ( see page 28) call.
Description
byte opCode
int returnCode
Hashtable returnValues
Hashtable (
operation.
short invocID
Remarks
This method is used as general callback for all operations. The "type" of an operation is identified by a opCode (see:
Operations ( see page 2)).
The "Lite Application" uses these OpCodes:
LiteOpCode.Join (
see page 45) - as return for OpJoin(), contains the actorNr of "this" player
LiteOpCode.Leave (
LiteOpCode.RaiseEvent (
An operation's result is summarized by the returnCode: an int typed code for "Ok" or one some error code. Compare the
returnCode to the values of enum ReturnCode.
The opCode defines the type of operation called on Photon and in turn also the returnValues. They are provided as
Hashtable ( see page 11) which contains the complete "answer" of Photon, including keys for opCode and returnCode.
Each operation returns its opCode and returnCode but anything else can be (re-)defined server-side.
Each call of an operation gets an ID, called the "invocID". This can be matched to the IDs returned with any operation calls.
This way, an application could track if a certain OpRaiseEvent call was successful.
Example
When you join a room, the server will assign a consecutive number to each client: the "actorNr" or "player number". This is
sent back in the returnValues as value of key LiteEventKey.ActorNr ( see page 44).
Fetch your actorNr in a Join-callback like this:
int actorNr = (int)neutronEvent[(byte)LiteEventKey.ActorNr];
3
see page 23).
C#
void PeerStatusCallback(StatusCode statusCode);
Parameters
Parameters
Description
StatusCode statusCode
_nt_
41
ConnectionProtocol Enumeration
Remarks
State change callback
When this method is used to signalize a state-change, the opCode and other values will be 0 (or null) with the following
statusCode values:
StatusCode.Connect (
see page 48) - the connection to the Photon Server was established
StatusCode.Disconnect (
StatusCode.Exception (
see page 48) - some system or network error closed the connection
Possible errors
When developing with the Photon API, hundrets of events ( see page 3) might reach a client each minute. If they are not
processed in time, they might cause issues. As result of this, there are warnings and errors, which should help getting the
timing right. Check the StatusCode ( see page 48) for a list.
Description
ConnectionProtocol (
DebugLevel (
LiteEventCode (
LiteEventKey (
LiteOpCode (
LiteOpKey (
see page 43) These are the options that can be used as transport protocol.
LitePropertyTypes (
PeerStateValue (
PhotonEventKey (
Lite - Event ( see page 3) codes. These codes are defined by the Lite
application's logic on the server side. Other application's won't
necessarily use these.
Lite - Keys of event-content that's defined in the Lite application logic. To
keep things lean (in terms of bandwidth), we use byte keys to identify
values in events ( see page 3) within Lite. In Lite, you can send custom
events ( see page 3). Their content can be of any type for key (and
value of course). Content of custom events ( see page 3) is in a
sub-hashtable under key LiteEventKey.Data.
Lite - Operation Codes. This enumeration contains the codes that are
given to the Lite Application's operations. Instead of sending "Join", this
enables us to send the byt 90.
Lite - Keys for operation-parameters and return-values (short: OpKey).
Keys for operation-parameters could be assigned on a per operation
basis, but it makes sense if certain values (which are used throughout the
whole application) have fixed keys. Client and server side could re-use
the same key for those.
The MMO application and any application that's started from scratch can
use their own keys, aside from ReturnCode = 0, DebugString = 1 and
Code = 60 (which are essential for the Photon Client at the time being).
PhotonOpParameterKey (
page 48)
StatusCode (
see
LiteEventCode Enumeration
Description
Udp = 0
Tcp = 1
Description
OFF = 0
No debug out.
ERROR = 1
WARNING = 2
INFO = 3
ALL = 5
43
LiteOpCode Enumeration
Members
Members
Description
Join = 90
Event (
Leave = 91
Event (
SetProperties = 92
Event (
Remarks
If your game is built as extension of Lite, don't re-use these codes for your custom events (
Description
ActorNr = 9
TargetActorNr = 10
ActorList = 11
Properties = 12
ActorProperties = 14
see page
GameProperties = 15
see page
Code = PhotonEventKey.Code
Data = 42
CustomEventContent = 42
Remarks
If your game is built as extension of Lite, don't re-use these codes for your custom events (
44
LiteOpKey Enumeration
Description
Blank = 0
No operation.
Join = 90
Leave = 91
RaiseEvent = 92
SetProperties = 93
GetProperties = 94
ExchangeKeysForEncryption = 95
Remarks
Other applications (the MMO demo or your own) could define other operations and other codes. If your game is built as
extension of Lite, don't re-use these codes for your custom events ( see page 3).
45
PeerStateValue Enumeration
}
Members
Members
Description
ReturnCode = PhotonOpParameterKey.ReturnCode
DebugString = PhotonOpParameterKey.DebugString
Asid = 4
RoomName = 4
ActorNr = 9
TargetActorNr = 10
ActorList = 11
Properties = 12
Key for property set (Hashtable ( see page 11)). This key is
used when sending only one set of properties. If either
ActorProperties or GameProperties are used (of both), check
those keys.
Broadcast = 13
ActorProperties = 14
GameProperties = 15
ClientKey = 16
ServerKey = 17
Code = PhotonOpParameterKey.Code
Data = 42
Remarks
These keys match a definition in the Lite application (part of the server SDK). If your game is built as extension of Lite, don't
re-use these codes for your custom events ( see page 3).
Description
None = 0x00
Game = 0x01
Actor = 0x02
GameAndActor = Game|Actor
46
PhotonOpParameterKey Enumeration
Description
Disconnected = 0
Connecting = 1
InitializingApplication = 10
Connected = 3
Disconnecting = 4
see
Remarks
While this is not the same as the StatusCode ( see page 48) of IPhotonPeerListener.PeerStatusCallback ( see page
41)(), it directly relates to it. In most cases, it makes more sense to build a game's state on top of the PeerStatusCallback()
as you get changes.
Description
Code = 60
Remarks
Defined by Photon (cannot be re-assigned by any application).
47
StatusCode Enumeration
Description
ReturnCode = 0
DebugString = 1
Code = 60
Remarks
Defined by Photon (cannot be re-assigned by any application).
Description
Connect = 1024
Disconnect = 1025
Exception = 1026
48
StatusCode Enumeration
Exception_Connect = 1023
QueueOutgoingReliableWarning = 1027
QueueOutgoingReliableError = 1028
QueueOutgoingUnreliableWarning = 1029
SendError = 1030
QueueOutgoingAcksWarning = 1031
QueueIncomingReliableWarning = 1033
QueueIncomingUnreliableWarning = 1035
QueueSentWarning = 1037
InternalReceiveException = 1039
TimeoutDisconnect = 1040
DisconnectByServer = 1041
DisconnectByServerUserLimit = 1042
DisconnectByServerLogic = 1043
49
Index
Events 3
ArrayList 10
ArrayList class 10
F
Fragmentation and Channels 3
Further Help 7
ArrayList.ArrayList 11
ArrayList.Synchronized 11
ArrayList.SyncRoot 11
Asid enumeration member 45
G
Game enumeration member 46
GameAndActor enumeration member 46
Hashtable 11
Hashtable class 11
Classes 10
Hashtable 12
Synchronized 12
this 12
D
Data enumeration member 44, 45
DebugLevel 43
DebugLevel enumeration 43
DebugString enumeration member 45, 48
Disconnect enumeration member 48
ToString 13
Hashtable.Hashtable 12
Hashtable.Synchronized 12
Hashtable.this 12
Hashtable.ToString 13
I
INFO enumeration member 43
InitializingApplication enumeration member 47
Interfaces 39
InternalReceiveException enumeration member 48
IPhotonPeerListener 39
LitePeer.OpLeave 20
DebugReturn 40
LitePeer.OpSetPropertiesOfActor 22
EventAction 40
LitePeer.OpSetPropertiesOfGame 22
OperationResult 41
LitePropertyTypes 46
PeerStatusCallback 41
LitePropertyTypes enumeration 46
IPhotonPeerListener.DebugReturn 40
IPhotonPeerListener.EventAction 40
IPhotonPeerListener.OperationResult 41
IPhotonPeerListener.PeerStatusCallback 41
Operations 2
Overview 1
L
Leave enumeration member 43, 45
Lite Application 6
PeerStateValue 47
LiteEventCode 43
PeerStateValue enumeration 47
LiteEventCode enumeration 43
LiteEventKey 44
LiteEventKey enumeration 44
Photon Workflow 1
LiteOpCode 45
PhotonEventKey 47
LiteOpCode enumeration 45
PhotonEventKey enumeration 47
LiteOpKey 45
PhotonOpParameterKey 48
LiteOpKey enumeration 45
PhotonOpParameterKey enumeration 48
LitePeer 13
PhotonPeer 23
LitePeer class 13
PhotonPeer class 23
LitePeer 16, 17
BytesIn 31
OpGetProperties 17
BytesOut 32
OpGetPropertiesOfActor 17, 18
ChannelCount 32
OpGetPropertiesOfGame 18
CommandBufferSize 32
OpJoin 19
Connect 27
OpLeave 20
DebugOut 32
debugTimeForDeriveSharedKey 32
OpSetPropertiesOfActor 22
debugTimeForDiffieHellman 32
OpSetPropertiesOfGame 22
DeriveSharedKey 28
LitePeer.LitePeer 16, 17
Disconnect 28
LitePeer.OpGetProperties 17
DisconnectTimeout 33
LitePeer.OpGetPropertiesOfActor 17, 18
DispatchIncomingCommands 28
LitePeer.OpGetPropertiesOfGame 18
FetchServerTimestamp 28
LitePeer.OpJoin 19
GetLocalMsTimestampDelegate 36
b
PhotonPeer.OpCustom 29, 30
Listener 33
PhotonPeer.OpExchangeKeysForEncryption 30
LocalMsTimestampDelegate 33
PhotonPeer.PeerID 33
LocalTimeInMilliSeconds 33
PhotonPeer.PeerState 34
OpCustom 29, 30
PhotonPeer.PhotonPeer 26, 27
OpExchangeKeysForEncryption 30
PhotonPeer.PhotonPort 27
PeerID 33
PhotonPeer.QueuedIncomingCommands 34
PeerState 34
PhotonPeer.QueuedOutgoingCommands 34
PhotonPeer 26, 27
PhotonPeer.RoundTripTime 34
PhotonPort 27
PhotonPeer.RoundTripTimeVariance 34
QueuedIncomingCommands 34
PhotonPeer.SendOutgoingCommands 30
QueuedOutgoingCommands 34
PhotonPeer.SentCountAllowance 34
RoundTripTime 34
PhotonPeer.ServerAddress 35
RoundTripTimeVariance 34
PhotonPeer.ServerTimeInMilliSeconds 35
SendOutgoingCommands 30
PhotonPeer.Service 31
SentCountAllowance 34
PhotonPeer.StopThread 31
ServerAddress 35
PhotonPeer.TimePingInterval 35
ServerTimeInMilliSeconds 35
PhotonPeer.UseCommandActionQueue 35
Service 31
PhotonPeer.UsedProtocol 36
StopThread 31
PhotonPeer.WarningSize 36
TimePingInterval 35
UseCommandActionQueue 35
Properties on Photon 6
UsedProtocol 36
WarningSize 36
PhotonPeer.BytesIn 31
PhotonPeer.BytesOut 32
PhotonPeer.ChannelCount 32
PhotonPeer.CommandBufferSize 32
PhotonPeer.Connect 27
PhotonPeer.DebugOut 32
PhotonPeer.debugTimeForDeriveSharedKey 32
PhotonPeer.debugTimeForDiffieHellman 32
PhotonPeer.DeriveSharedKey 28
PhotonPeer.Disconnect 28
PhotonPeer.DisconnectTimeout 33
PhotonPeer.DispatchIncomingCommands 28
PhotonPeer.FetchServerTimestamp 28
PhotonPeer.GetLocalMsTimestampDelegate 36
PhotonPeer.IsEncryptionAvailable 33
R
RaiseEvent enumeration member 45
ReturnCode enumeration member 45, 48
RoomName enumeration member 45
PhotonPeer.Listener 33
PhotonPeer.LocalMsTimestampDelegate 33
PhotonPeer.LocalTimeInMilliSeconds 33
Serializable Datatypes 5
ServerKey enumeration member 45
c
T
TargetActorNr enumeration member 44, 45
Tcp enumeration member 43
The Photon Server 6
TimeoutDisconnect enumeration member 48
U
Udp enumeration member 43
Using TCP 4
W
WARNING enumeration member 43