GameDesign: Difference between revisions
Jump to navigation
Jump to search
Content deleted Content added
imported>MiguelAngelBlanchLardin No edit summary |
imported>StephenIerodiaconou No edit summary |
||
| Line 51: | Line 51: | ||
Postcondition: The state MUST be NULL or STATE_LOGIN_COMPLETE |
Postcondition: The state MUST be NULL or STATE_LOGIN_COMPLETE |
||
and a we have created a PlayerEntry for this player with |
and a we have created a PlayerEntry for this player with a unique clientid. |
||
</pre> |
</pre> |
||
| Line 130: | Line 130: | ||
It consists of a list of RuntimePlayerEntry objects and is heavily linked with the PlayerDatabase, so we can hide the complexity to GameManager. By making PlayerDatabase hidden by PlayerContainer we achieve the illusion that managing the runtime behavior we modify automatically the permanent one. |
It consists of a list of RuntimePlayerEntry objects and is heavily linked with the PlayerDatabase, so we can hide the complexity to GameManager. By making PlayerDatabase hidden by PlayerContainer we achieve the illusion that managing the runtime behavior we modify automatically the permanent one. |
||
RuntimePlayerEntry is the structure that contains the information |
RuntimePlayerEntry is the structure that contains the information about the player while it is online. <br>RuntimePlayerEntry contains: |
||
* clientid<br> |
* <i>clientid</i><br> |
||
Clientid is the field |
Clientid is the field that indexes players in the server. See the documentation about clientid generation to understand what they are and how they are generated. |
||
* source<br> |
* <i>source</i><br> |
||
Source is the IPv4 address of the client |
Source is the IPv4 address of the client. This is used to determine if the message is really coming from the client or another person trying to impersonate it. |
||
* timestamp<br> |
* <i>timestamp</i><br> |
||
Timestamp is used to determine if a client has timed out |
Timestamp is used to determine if a client has timed out in which case it is only wasting resources on the server. As you may already know, UDP is not a delivery-guaranteed protocol, so we need to check for dead clients ourselves. Note that this only indicates that the player timed out and it doesn't apply any kind of measures on them. |
||
* storedTimestamp<br> |
* <i>storedTimestamp</i><br> |
||
storeTimestamp is used to determine when |
storeTimestamp is used to determine when the player was last stored in the database. We don't store each time the player info changes as this would obviously be very CPU time consuming. Instead we cached the changes and store them only every 5 minutes. |
||
* username<br> |
* <i>username</i><br> |
||
Username is filled in at runtime with a Login event |
Username is filled in at runtime with a Login event. If we store the username here we are able to use the database from PlayerContainer thus by knowing the clientid we can also now know the username without having to look to the actual database. |
||
* choosenCharacter<br> |
* <i>choosenCharacter</i><br> |
||
choosenCharacter is filled in at runtime with a ChooseCharacter event |
choosenCharacter is filled in at runtime with a ChooseCharacter event. If we store the information here we are able to use the database from PlayerContainer and hence by knowing the clientid we also know the choosenCharacter without having to refer to the actual database. |
||
* state<br> |
* <i>state</i><br> |
||
State is a number expressing the state in which the player is. There are four states: |
State is a number expressing the state in which the player is. There are four states: |
||
**Have to login |
**<b>Have to login |
||
**Login Complete |
**Login Complete |
||
**Game begin |
**Game begin |
||
**Logout |
**Logout</b> |
||
When we create the |
When we create the entity, by default, the state is <b>Have to login</b>. Once you have logged in correctly, the state changes to <b>Login Complete</b> and once the player has chosen a Character it changes to <b>game begin</b>. The logout state is pretty trivial :) |
||
The |
The idea is that some operations are only allowed in certain states, so the state property stores which state they are in to make validating actions easier. |
||
*perception counter<br> |
*perception counter<br> |
||
Perception counter is used |
The Perception counter is used to keep an incremental count of the perceptions sent so that the client can see if it gets out of sync. |
||
*perception Previous RPObject<br> |
*perception Previous RPObject<br> |
||
Perception previous RPObject is the RPObject that was sent on the last perception |
Perception previous RPObject is the RPObject that was sent on the last perception. Using this we can track changes to a RPObject without disturbing the rest of the system. |
||
*perception Out of Sync<br> |
*perception Out of Sync<br> |
||
This flag indicates |
This flag indicates to the server if the player has become out of sync. This allows us to re-sync it as soon as possible. |
||
| ⚫ | |||
| ⚫ | |||
==ClientID generation== |
==ClientID generation== |
||
Each client MUST have a session id to |
Each client MUST have a session id to prevent another player impersonating it. sessionid must be of short or int size to make guessing the ID much harder. |
||
| ⚫ | |||
| ⚫ | |||
Home |
|||
==Synchronization between Game and RP Managers== |
==Synchronization between Game and RP Managers== |
||
Why bother with |
Why bother with this? Well, imagine that a player logs out while the perception is being built, it will no longer be accessible by the RP Manager when it expects the object to be there, or if RPManager tries to remove a player which has already been removed, these situations are very serious as they will probably make the server fail. |
||
So we need to synchronize game and RP manager. |
|||
The idea is that they request to a central mutex access to the PlayerEntryContainer, and that mutex is the one that decide how the access is done. |
|||
So we must synchronize the Game and RP Managers. |
|||
| ⚫ | |||
The idea behind the solution is that the each manger requests access to the PlayerEntryContainer via a central mutex (a mutex is a syncronisation element attached to a resource, which can be owned by one task at any point in time. If the mutex is owned already when a task tries to access the object protected by it then the mutex will inform the task that it doesn't have access at this point in time to the object). |
|||
| ⚫ | |||
| ⚫ | |||
| ⚫ | |||