分享

Building a simple yet powerful MMO game architecture, Part 2: Gaming and Web integration

 daomucun 2009-01-15


Level: Intermediate

Hyun Sung Chu (hyunchu@us.ibm.com), Advisory Software Engineer, IBM

21 Oct 2008

Massive multiplayer online (MMO) virtual-world games offer tantalizing new ways to learn, entertain, collaborate, socialize, visualize information, and do business. In this series, learn about an architecture based upon the first 3D MMO game from IBM?, PowerUp. Integrating a Web back end with a multiplayer online game (MOG) is a straightforward, effective way to provide MMO functions, such as persistence and integration. This article explores technical details of the architecture, including the functions, and calls for integrating game clients and servers with back-end systems.

Introduction

Part 1 of this series introduced a flexible and powerful MMO game architecture, based upon the fictitious MMO game Starship IBM, that's quick and easy to implement. It explained the implementation of the architecture and the interactions among gaming clients, gaming servers, Web servers, and a database.

This article explores the relationship between the gaming components and the back-end component and demonstrates how you can achieve a simple yet powerful MMO game architecture.



Back to top


Web back-end use cases

Most multiplayer gaming engines, such as Torque Game Engine Advanced (TGEA), provide default MOG functions out of the box. A Web and database back end can be used to add MMO functions. Table 1 shows the core subset of use cases provided by the Starship IBM Web back end. This subset can be used to implement any MMO game Web back end.


Table 1. Starship IBM core Web back-end use cases
Use case Actor Description
Get available mothership server Gaming client Retrieve the IP address and port of an available mothership server to initially log in to. This information is then used by the "Log in to server" use case to log in to the specified server. Additional game logic can be performed, such as gaming server load balancing, that determines which mothership server information to return.
Log in to server Gaming server Given the player's username, password, and the game server IP address and port, authenticate the user information. If authenticated, the database will be updated to indicate the player is logged in to this particular game server.
Get a list destination servers Gaming client Return a list of alien outpost and unexplored planet server IP addresses and ports and the number of players currently on each game server. The destination IP address and port can then be used in conjunction with "Check if server is full" and "Log in to server" to allow the player to travel from the mothership server to another game server.

The server player number can be used by players to load balance themselves (players can choose a game server to join that is not maxed out).

Check if server is full Gaming client Given the server IP address, this use case is intended as a last-minute check by the gaming client before initiating the loading and login to another server.
Remove player from server Gaming server If the player disconnects from the game for any reason, update the database to indicate the player is no longer on the game server.
Get player points Gaming client Given a username, return that player's point total.
Update player points Gaming server Given a username and point value, add that point value to the player's point total.

Actor denotes whether the gaming client or server invokes the HTTP request to the Web server, not whether the gaming client or server initially invokes the use case. For example, the "Remove player from server" use case's actor is the gaming server. Even though this is initially invoked when, for example, the player chooses to quit the game from the gaming client, the gaming server should actually make the HTTP request to the back-end Web server.

Figure 1 shows the flow of the players in Starship IBM, and how they can travel from one server to another. All 20 alien outpost servers are not shown.


Figure 1. Starship IBM player server flow
Starship ibm player serer flow

To help illustrate the flow, the following is a typical sequence of how a player goes through the various servers.

  1. The player enters a username and password, and selects Login to start the game. This will initiate the "Get available mothership server" use case, which will retrieve the IP address and port of an available mothership server.

    Using this IP address and port, "Log in to server" will be invoked, which will authenticate the player and update the database to indicate the player is currently on the specified mothership server.

  2. The player will bring up an interface that retrieves a list of available alien outpost servers, which will invoke the "Get a list of destination servers" use case.
  3. The player selects one of the alien outpost servers and starts that mission, which will perform "Check if server is full" and then "Log in to server" using the IP address and port from the selected alien outpost server.
  4. After the player is finished with the alien outpost mission, the player can go back to the mothership, which will perform essentially the same action as item 1 in this list. This time, though, the player will not have to enter a username and password.



Back to top


Database implementation

Figure 2 shows all the database tables that underlie the Web back-end use cases described in Table 1.


Figure 2. Database implementation
Database implementation

The GAME_SERVER table stores the data for all the TGEA game servers. Note the one-to-many relation between the GAME_SERVER entries and the PLAYER entries. Each gaming server hosts zero to multiple players. There is also a one-to-one relation between the PLAYER table and PLAYER_POINTS table, as each player has a point total.


Table 2. GAME_SERVER columns
Column Description
IP_PORT The primary key (PK), consisting of the <IP address>:<Port>, which uniquely identifies each of the TGEA servers. An example value is '0.0.0.0:28000'.
TYPE Indicates whether the server is a mothership, alien outpost, or unexplored world server. The allowed values are 'MSHIP', 'ALIEN', and 'UNEXPLOR'.
INIT_LOGIN Indicates whether this is a type of game server that the player can initially log in to (is it a mothership server). Allowed values are 'Y' or 'N'.

The PLAYER table stores the base player information.


Table 3. PLAYER columns
Column Description
USERNAME The PK that uniquely identifies each player. An example value is 'Space Cowboy'.
PASSWORD The player's password.
IP_PORT The foreign key (FK) to the GAME_SERVER table that indicates which gaming server the player is currently logged in to.

The PLAYER_POINTS table stores point related data for each player.


Table 4. PLAYER_POINTS columns
Column Description
USERNAME The FK to the PLAYER table.
POINT_TOTAL The player's point total.

Given the GAME_SERVER table described above, and the actual Starship IBM server implementation described in Part 1 of this series, Table 5 below shows what the actual GAME_SERVER table entries would be. Of course, the IP addresses and ports are only examples.


Table 5. Starship IBM GAME_SERVER table entries
IP_PORT TYPE INIT_LOGIN
'0.0.0.0:28000' 'MSHIP' 'Y'
'0.0.0.1:28000' 'MSHIP' 'Y'
'0.0.0.2:28000' 'ALIEN' 'N'
'0.0.0.2:28001' 'ALIEN' 'N'
'0.0.0.3:28000' 'ALIEN' 'N'
'0.0.0.3:28001' 'ALIEN' 'N'
Alien outpost servers 0.0.0.2:28002 - 28009 and 0.0.0.3:28002 - 28009 not listed
'0.0.0.4:28000' 'UNEXPLOR' 'N'
'0.0.0.5:28000' 'UNEXPLOR' 'N'


Back to top


MMO game Web application programming interface (API)

The Web application server uses the given database tables and serves up a set of MMO game functions. The API of the functions consists of HTTP GET requests to the Web server, and the Web application server returns an HTML page for a given request. The syntax of the HTTP GET request API is as follows:

[scheme]://[Web server IP address]/[path]?[query]

[scheme]://[Web server IP address]/[path]? is essentially static. The interesting part of the syntax is the [query], which consists of [action parameter][parameters].

[action parameter] consists of action=[action name]
[parameters] consists of 0 through N &[parameter key]=[parameter value] pairs.

This basic syntax can be used to accommodate all the HTTP GET request APIs. Table 6 shows examples of HTTP GET requests. Considering the Starship IBM architecture implementation, lets assume the public IBM WebSphere? server IP address and port are 1.1.1.1:80, and the secure WebSphere server IP address and port are 1.1.1.2:80.


Table 6. Example HTTP GET requests
Web back-end use case HTTP GET request
Get available mothership server http://1.1.1.1:80/starshipIBM?action=getMothershipServerIPPort
Get player points http://1.1.1.1:80/starshipIBM?action=getPlayerPoints&userName=Space Cowboy
Update player points http://1.1.1.2:80/starshipIBM?action=addPlayerPoints&userName=Space Cowboy&points=200

Given an HTTP request, the Web application server will return an HTML page that the TGEA gaming client or server processes. The syntax of the returned HTML page can be:

request-status=[request status]
[key value pairs]

[request status] indicates the status of the HTTP request. The TGEA client or server will use this return status message and process the HTML page appropriately. For example, SUCCESS indicates the request was processed successfully, while other possible return status messages, such as SERVER_FULL, can indicate other states or problems with the HTTP request.

[key value pairs] consists of 0 or more [key]=[values] pairs. Each [key]=[values] pair is on a separate line. [values] can consists of one or more entries delimited by a comma.

Table 7 lists the returned HTML pages for the example use cases.


Table 7. HTML page returns
Web back-end use case HTTP GET request query Example returned HTML page Notes
Get available mothership server action=getMothershipServerIPPort return-status=SUCCESS
ip_port=0.0.0.0:28000

Log in to server action=loginToServer&destServerIP=0.0.0.0:28000
&username=Space Cowboy&pw=43YaC0nE9c
return-status=SUCCESS

The Web server doesn't perform the actual game login and loading. It simply authenticates the player and updates the database to indicate which server the player is on.

Get a list of destination servers action=getServerList return-status=SUCCESS
server_info=0.0.0.2:28000,ALIEN,8
server_info=0.0.0.2:28001,ALIEN,5
server_info=0.0.0.3:28000,ALIEN,0
server_info=0.0.0.3:28001,ALIEN,2
server_info=0.0.0.4:28000,UNEXPLOR,98
server_info=0.0.0.5:28000,UNEXPLOR,35
The server_info values are the gaming server IP address:port, server type, and number of players currently on the server. ALIEN servers 0.0.0.2:28002 - 28009 and 0.0.0.3:28002 - 28009 are not listed.
Check if server is full action=checkServer&ipAddr=0.0.0.4:28000 return-status=SUCCESS

or:

return-status=SERVER_FULL

Remove player from server action=logout&username=Space Cowboy return-status=SUCCESS
Should be invoked when a game client disconnects from a game server for any reason.
Get player points action=getPlayerPoints&userName=Space Cowboy return-status=SUCCESS
points=12400

Update player points action=addPlayerPoints&userName=Space Cowboy&points=200 return-status=SUCCESS

The main characteristics of an MMO game are persistence and integration of the gaming world and servers. The use cases in this article demonstrate how to achieve persistence and integration in the Web back end. The "Get player points" and "Update player points" use cases show how to achieve persistence. It is easy to then extrapolate other persistence related functions, such as retrieving and updating a player's inventory or game world status.

Gaming world integration is more interesting and a little more involved. The small set of server-related use cases in this article show how gaming world integration functions can be provided by the Web back end.

Example: Log in to server in Torque

Implementing the use cases is straightforward using TorqueScript. Create a TorqueScript HttpObject, make the appropriate HttpObject get request call, and process the returned HTML page. However, implementing the "Log in to server" use case might not be that obvious. To go from one server to another in Torque, you need to invoke the standard TorqueScript client functions disconnect(), then GameConnection.connect(%ipAddr), where %ipAddr is the destination server IP address. This will disconnect the player from the current game server and start loading the new mission from the new server. The "Log in to server" Web request can then be invoked in the default TorqueScript server function GameConnection::onConnect() to perform its housekeeping duties of properly updating the database.

"Check if server is full" should be invoked right before disconnect(). The sole purpose of this use case is to help reduce the number of unnecessary (and unceremonious) dumping of game clients from the game to the login screen. This happens when disconnect() is called before GameConnection.connect(%ipAddr). A typical, preventable case occurs if the destination server player count maxed out before the client could start connecting to that server.



Back to top


Other Web back-end use cases

The small set of core back-end use cases in this article helped explain the MMO game function provided by the Starship IBM Web back end. Of course, an actual MMO game would include more involved functions. The following list has brief descriptions of other possible MMO game use cases that can readily be implemented with the Web back end described in this article.

More persistence functions
Besides retrieving and updating points, other persistence functions can also be implemented, such as retrieving and updating player profiles, inventory, and game world status.

Viewing a list of players on other servers
Since the player and server relationship is tracked in the database, it's straightforward to display the list of all the players on a particular server. Messaging players on other servers is also an intriguing possible function; Part 3 of this series will explain how it might be implemented.

Mission-status related functions
The game servers can schedule a recurring function that updates the Web and database back end with its mission time.

For example, the alien outpost mission could be a timed mission. The mission time can be passed to the Web and database back end at a repeated interval.

Game server monitoring
All game servers can schedule a repeated keep-alive message to the Web and database back end. In conjunction with an e-mail messaging component in the Web application server, this message can be used to notify system administrators when a game server goes down.

The server status information can also be incorporated into any game server load-balancing algorithm, so users are not sent to a game server that is apparently down.

Integration with other applications
There are intriguing possibilities for further integration with other applications, using a middleware application such as IBM WebSphere.


Back to top


Summary

A Web and database back end can be used to provide MMO game functions, such as persistence and an integrated game world. You can do so in a straightforward manner using a set of Web APIs using HTTP GET requests. These APIs are part of a standard three-tiered architecture, where the gaming client and servers cleanly integrate with a Web and database back end. The APIs have an effective array of options that can provide virtually all MMO game-related functions.

Stay tuned for Part 3, which will review and assess the capabilities and limitations of the MMO game architecture, and whether it meets the high-level specifications and goals defined in Part 1 (scalability, flexibility in deployment, flexibility in gaming design, performance, and security).



Back to top


Acknowledgments

Thanks to Scott Crowther and Abraham Guerra from IBM CIO for implementing the WebSphere and DB2? components for PowerUp the game. This allowed the author to focus on such business critical tasks as dune buggy anti-rollover logic, water balloons, laser beams, and "smog monsters."



Resources

Learn

Get products and technologies
  • Download, explore, and play PowerUp.

  • Download IBM product evaluation versions and get your hands on application development tools and middleware products from IBM DB2, Lotus?, Rational?, Tivoli?, and WebSphere.


Discuss


About the author


Hyun Sung Chu is an advisory software engineer at IBM. Hyun is involved in several 3D MMO and virtual world projects, and he was the architect and lead developer for PowerUp, the first publicly available 3D MMO game from IBM. In his previous incarnation, Hyun was a Web and Java developer, contributing to numerous successful projects for IBM Research, IBM Corporate Finance, and IBM Corporate Head Quarters.

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多