More table services! Yay!
git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@527 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
//
|
//
|
||||||
// $Id: ParlorCodes.java,v 1.7 2001/10/19 22:02:36 mdb Exp $
|
// $Id: ParlorCodes.java,v 1.8 2001/10/23 02:22:16 mdb Exp $
|
||||||
|
|
||||||
package com.threerings.parlor.client;
|
package com.threerings.parlor.client;
|
||||||
|
|
||||||
@@ -64,25 +64,20 @@ public interface ParlorCodes extends InvocationCodes
|
|||||||
|
|
||||||
/** The response identifier for a table created response. This is
|
/** The response identifier for a table created response. This is
|
||||||
* mapped by the invocation services to a call to {@link
|
* mapped by the invocation services to a call to {@link
|
||||||
* ParlorDirector#handleTableCreated}. */
|
* TableManager#handleTableCreated}. */
|
||||||
public static final String TABLE_CREATED_RESPONSE = "TableCreated";
|
public static final String TABLE_CREATED_RESPONSE = "TableCreated";
|
||||||
|
|
||||||
/** The response identifier for a create failed response. This is
|
/** The response identifier for a create failed response. This is
|
||||||
* mapped by the invocation services to a call to {@link
|
* mapped by the invocation services to a call to {@link
|
||||||
* ParlorDirector#handleCreateFailed}. */
|
* TableManager#handleCreateFailed}. */
|
||||||
public static final String CREATE_FAILED_RESPONSE = "CreateFailed";
|
public static final String CREATE_FAILED_RESPONSE = "CreateFailed";
|
||||||
|
|
||||||
/** The message identifier for a join table request. */
|
/** The message identifier for a join table request. */
|
||||||
public static final String JOIN_TABLE_REQUEST = "JoinTable";
|
public static final String JOIN_TABLE_REQUEST = "JoinTable";
|
||||||
|
|
||||||
/** The response identifier for a table joined response. This is
|
|
||||||
* mapped by the invocation services to a call to {@link
|
|
||||||
* ParlorDirector#handleTableJoined}. */
|
|
||||||
public static final String TABLE_JOINED_RESPONSE = "TableJoined";
|
|
||||||
|
|
||||||
/** The response identifier for a join failed response. This is mapped
|
/** The response identifier for a join failed response. This is mapped
|
||||||
* by the invocation services to a call to {@link
|
* by the invocation services to a call to {@link
|
||||||
* ParlorDirector#handleJoinFailed}. */
|
* TableManager#handleJoinFailed}. */
|
||||||
public static final String JOIN_FAILED_RESPONSE = "JoinFailed";
|
public static final String JOIN_FAILED_RESPONSE = "JoinFailed";
|
||||||
|
|
||||||
/** An error code returned when a user requests to join a table that
|
/** An error code returned when a user requests to join a table that
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
//
|
//
|
||||||
// $Id: ParlorDirector.java,v 1.12 2001/10/22 23:56:25 mdb Exp $
|
// $Id: ParlorDirector.java,v 1.13 2001/10/23 02:22:16 mdb Exp $
|
||||||
|
|
||||||
package com.threerings.parlor.client;
|
package com.threerings.parlor.client;
|
||||||
|
|
||||||
@@ -377,22 +377,6 @@ public class ParlorDirector
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void handleTableCreated (int invid, int tableId)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public void handleCreateFailed (int invid, String reason)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public void handleTableJoined (int invid, int tableId)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public void handleJoinFailed (int invid, String reason)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The invitation class is used to track information related to
|
* The invitation class is used to track information related to
|
||||||
* outstanding invitations generated by or targeted to this client.
|
* outstanding invitations generated by or targeted to this client.
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
//
|
//
|
||||||
// $Id: ParlorService.java,v 1.7 2001/10/11 21:08:21 mdb Exp $
|
// $Id: ParlorService.java,v 1.8 2001/10/23 02:22:16 mdb Exp $
|
||||||
|
|
||||||
package com.threerings.parlor.client;
|
package com.threerings.parlor.client;
|
||||||
|
|
||||||
@@ -103,4 +103,57 @@ public class ParlorService implements ParlorCodes
|
|||||||
"[inviteId=" + inviteId + "].");
|
"[inviteId=" + inviteId + "].");
|
||||||
return invdir.invoke(MODULE_NAME, CANCEL_INVITE_ID, args, rsptarget);
|
return invdir.invoke(MODULE_NAME, CANCEL_INVITE_ID, args, rsptarget);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* You probably don't want to call this directly, but want to call
|
||||||
|
* {@link TableManager#createTable}. Requests that a new table be
|
||||||
|
* created.
|
||||||
|
*
|
||||||
|
* @param client a connected, operational client instance.
|
||||||
|
* @param lobbyOid the oid of the lobby that will contain the newly
|
||||||
|
* created table.
|
||||||
|
* @param config the game config for the game to be matchmade by the
|
||||||
|
* table.
|
||||||
|
* @param rsptarget the object reference that will receive and process
|
||||||
|
* the response.
|
||||||
|
*
|
||||||
|
* @return the invocation request id of the generated request.
|
||||||
|
*/
|
||||||
|
public static int createTable (
|
||||||
|
Client client, int lobbyOid, GameConfig config, Object rsptarget)
|
||||||
|
{
|
||||||
|
InvocationDirector invdir = client.getInvocationDirector();
|
||||||
|
Object[] args = new Object[] { new Integer(lobbyOid), config };
|
||||||
|
Log.info("Sending table creation request " +
|
||||||
|
"[lobbyOid=" + lobbyOid + ", config=" + config + "].");
|
||||||
|
return invdir.invoke(
|
||||||
|
MODULE_NAME, CREATE_TABLE_REQUEST, args, rsptarget);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* You probably don't want to call this directly, but want to call
|
||||||
|
* {@link TableManager#joinTable}. Requests that the current user
|
||||||
|
* be added to the specified table at the specified position.
|
||||||
|
*
|
||||||
|
* @param client a connected, operational client instance.
|
||||||
|
* @param tableId the unique id of the table to which this user wishes
|
||||||
|
* to be added.
|
||||||
|
* @param position the position at the table to which this user desires
|
||||||
|
* to be added.
|
||||||
|
* @param rsptarget the object reference that will receive and process
|
||||||
|
* the response.
|
||||||
|
*
|
||||||
|
* @return the invocation request id of the generated request.
|
||||||
|
*/
|
||||||
|
public static int joinTable (
|
||||||
|
Client client, int tableId, int position, Object rsptarget)
|
||||||
|
{
|
||||||
|
InvocationDirector invdir = client.getInvocationDirector();
|
||||||
|
Object[] args = new Object[] { new Integer(tableId),
|
||||||
|
new Integer(position) };
|
||||||
|
Log.info("Sending join table request " +
|
||||||
|
"[tableId=" + tableId + ", position=" + position + "].");
|
||||||
|
return invdir.invoke(
|
||||||
|
MODULE_NAME, JOIN_TABLE_REQUEST, args, rsptarget);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,253 @@
|
|||||||
|
//
|
||||||
|
// $Id: TableDirector.java,v 1.1 2001/10/23 02:22:16 mdb Exp $
|
||||||
|
|
||||||
|
package com.threerings.parlor.client;
|
||||||
|
|
||||||
|
import com.threerings.presents.dobj.ElementAddedEvent;
|
||||||
|
import com.threerings.presents.dobj.ElementUpdatedEvent;
|
||||||
|
import com.threerings.presents.dobj.ElementRemovedEvent;
|
||||||
|
import com.threerings.presents.dobj.SetListener;
|
||||||
|
|
||||||
|
import com.threerings.crowd.data.BodyObject;
|
||||||
|
import com.threerings.crowd.data.PlaceObject;
|
||||||
|
|
||||||
|
import com.threerings.parlor.Log;
|
||||||
|
import com.threerings.parlor.data.Table;
|
||||||
|
import com.threerings.parlor.data.TableLobbyObject;
|
||||||
|
import com.threerings.parlor.game.GameConfig;
|
||||||
|
import com.threerings.parlor.util.ParlorContext;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* As tables are created and managed within the scope of a place (a
|
||||||
|
* lobby), we want to fold the table management functionality into the
|
||||||
|
* standard hierarchy of place controllers that deal with place-related
|
||||||
|
* functionality on the client. Thus, instead of forcing places that
|
||||||
|
* expect to have tables to extend a <code>TableLobbyController</code> or
|
||||||
|
* something similar, we instead provide the table manager which can be
|
||||||
|
* instantiated by the place controller (or specific table related views)
|
||||||
|
* to handle the table matchmaking services.
|
||||||
|
*
|
||||||
|
* <p> Entites that do so, will need to implement the {@link
|
||||||
|
* TableObserver} interface so that the table manager can notify them when
|
||||||
|
* table related things happen.
|
||||||
|
*
|
||||||
|
* <p> The table services expect that the place object being used as a
|
||||||
|
* lobby in which the table matchmaking takes place implements the {@link
|
||||||
|
* TableLobbyObject} interface.
|
||||||
|
*/
|
||||||
|
public class TableManager
|
||||||
|
implements SetListener
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Creates a new table manager to manage tables with the specified
|
||||||
|
* observer which will receive callbacks when interesting table
|
||||||
|
* related things happen.
|
||||||
|
*
|
||||||
|
* @param ctx the parlor context in use by the client.
|
||||||
|
* @param tableField the field name of the distributed set that
|
||||||
|
* contains the tables we will be managing.
|
||||||
|
* @param observer the entity that will receive callbacks when things
|
||||||
|
* happen to the tables.
|
||||||
|
*/
|
||||||
|
public TableManager (
|
||||||
|
ParlorContext ctx, String tableField, TableObserver observer)
|
||||||
|
{
|
||||||
|
// keep track of this stuff
|
||||||
|
_ctx = ctx;
|
||||||
|
_tableField = tableField;
|
||||||
|
_observer = observer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This must be called by the entity that uses the table manager when
|
||||||
|
* the using entity prepares to enter and display a place. It is
|
||||||
|
* assumed that the client is already subscribed to the provided place
|
||||||
|
* object.
|
||||||
|
*/
|
||||||
|
public void willEnterPlace (PlaceObject place)
|
||||||
|
{
|
||||||
|
// add ourselves as a listener to the place object
|
||||||
|
place.addListener(this);
|
||||||
|
|
||||||
|
// and remember this for later
|
||||||
|
_lobby = place;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This must be called by the entity that uses the table manager when
|
||||||
|
* the using entity has left and is done displaying a place.
|
||||||
|
*/
|
||||||
|
public void didLeavePlace (PlaceObject place)
|
||||||
|
{
|
||||||
|
// remove our listenership
|
||||||
|
place.removeListener(this);
|
||||||
|
|
||||||
|
// clear out our lobby reference
|
||||||
|
_lobby = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a request to create a table with the specified game
|
||||||
|
* configuration. This user will become the owner of this table and
|
||||||
|
* will be added to the first position in the table. The response will
|
||||||
|
* be communicated via the {@link TableObserver} interface.
|
||||||
|
*/
|
||||||
|
public void createTable (GameConfig config)
|
||||||
|
{
|
||||||
|
// if we're already in a table, refuse the request
|
||||||
|
if (_ourTable != null) {
|
||||||
|
Log.warning("Ignoring request to create table as we're " +
|
||||||
|
"already in a table [table=" + _ourTable + "].");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// make sure we're currently in a place
|
||||||
|
if (_lobby == null) {
|
||||||
|
Log.warning("Requested to create a table but we're not " +
|
||||||
|
"currently in a place [config=" + config + "].");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// go ahead and issue the create request
|
||||||
|
ParlorService.createTable(
|
||||||
|
_ctx.getClient(), _lobby.getOid(), config, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a request to join the specified table at the specified
|
||||||
|
* position. The response will be communicated via the {@link
|
||||||
|
* TableObserver} interface.
|
||||||
|
*/
|
||||||
|
public void joinTable (int tableId, int position)
|
||||||
|
{
|
||||||
|
// if we're already in a table, refuse the request
|
||||||
|
if (_ourTable != null) {
|
||||||
|
Log.warning("Ignoring request to join table as we're " +
|
||||||
|
"already in a table [table=" + _ourTable + "].");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// make sure we're currently in a place
|
||||||
|
if (_lobby == null) {
|
||||||
|
Log.warning("Requested to join a table but we're not " +
|
||||||
|
"currently in a place [tableId=" + tableId + "].");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// go ahead and issue the create request
|
||||||
|
ParlorService.joinTable(
|
||||||
|
_ctx.getClient(), tableId, position, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
// documentation inherited
|
||||||
|
public void elementAdded (ElementAddedEvent event)
|
||||||
|
{
|
||||||
|
if (event.getName().equals(_tableField)) {
|
||||||
|
Table table = (Table)event.getElement();
|
||||||
|
_observer.tableAdded(table);
|
||||||
|
|
||||||
|
// check to see if we just joined a table
|
||||||
|
checkForOurTable(table);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// documentation inherited
|
||||||
|
public void elementUpdated (ElementUpdatedEvent event)
|
||||||
|
{
|
||||||
|
if (event.getName().equals(_tableField)) {
|
||||||
|
Table table = (Table)event.getElement();
|
||||||
|
_observer.tableUpdated(table);
|
||||||
|
|
||||||
|
// check to see if we just joined or left a table
|
||||||
|
checkForOurTable(table);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// documentation inherited
|
||||||
|
public void elementRemoved (ElementRemovedEvent event)
|
||||||
|
{
|
||||||
|
if (event.getName().equals(_tableField)) {
|
||||||
|
Integer tableId = (Integer)event.getKey();
|
||||||
|
_observer.tableRemoved(tableId.intValue());
|
||||||
|
|
||||||
|
// check to see if our table just disappeared
|
||||||
|
if (_ourTable != null && tableId.equals(_ourTable.tableId)) {
|
||||||
|
_ourTable = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called by the invocation services when a table creation request was
|
||||||
|
* received by the server and the table was successfully created.
|
||||||
|
*
|
||||||
|
* @param invid the invocation id of the invitation request.
|
||||||
|
*/
|
||||||
|
public void handleTableCreated (int invid, int tableId)
|
||||||
|
{
|
||||||
|
// nothing much to do here
|
||||||
|
Log.info("Table creation succeeded [tableId=" + tableId + "].");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called by the invocation services when a table creation request
|
||||||
|
* failed or was rejected for some reason.
|
||||||
|
*
|
||||||
|
* @param invid the invocation id of the creation request.
|
||||||
|
* @param reason a reason code explaining the failure.
|
||||||
|
*/
|
||||||
|
public void handleCreateFailed (int invid, String reason)
|
||||||
|
{
|
||||||
|
Log.warning("Table creation failed [reason=" + reason + "].");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called by the invocation services when a join table request failed
|
||||||
|
* or was rejected for some reason.
|
||||||
|
*
|
||||||
|
* @param invid the invocation id of the join request.
|
||||||
|
* @param reason a reason code explaining the failure.
|
||||||
|
*/
|
||||||
|
public void handleJoinFailed (int invid, String reason)
|
||||||
|
{
|
||||||
|
Log.warning("Join table failed [reason=" + reason + "].");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks to see if we're a member of this table and notes it as our
|
||||||
|
* table, if so.
|
||||||
|
*/
|
||||||
|
protected void checkForOurTable (Table table)
|
||||||
|
{
|
||||||
|
// if this is the same table as our table, clear out our table
|
||||||
|
// reference and allow it to be added back if we are still in the
|
||||||
|
// table
|
||||||
|
if (table.equals(_ourTable)) {
|
||||||
|
_ourTable = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// look for our username in the occupants array
|
||||||
|
BodyObject self = (BodyObject)_ctx.getClient().getClientObject();
|
||||||
|
for (int i = 0; i < table.occupants.length; i++) {
|
||||||
|
if (self.username.equals(table.occupants[i])) {
|
||||||
|
_ourTable = table;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** A context by which we can access necessary client services. */
|
||||||
|
protected ParlorContext _ctx;
|
||||||
|
|
||||||
|
/** The place object in which we're currently managing tables. */
|
||||||
|
protected PlaceObject _lobby;
|
||||||
|
|
||||||
|
/** The field name of the distributed set that contains our tables. */
|
||||||
|
protected String _tableField;
|
||||||
|
|
||||||
|
/** The entity that we talk to when table stuff happens. */
|
||||||
|
protected TableObserver _observer;
|
||||||
|
|
||||||
|
/** The table of which we are a member if any. */
|
||||||
|
protected Table _ourTable;
|
||||||
|
}
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
//
|
||||||
|
// $Id: TableObserver.java,v 1.1 2001/10/23 02:22:16 mdb Exp $
|
||||||
|
|
||||||
|
package com.threerings.parlor.client;
|
||||||
|
|
||||||
|
import com.threerings.parlor.data.Table;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The {@link TableManager} converts distributed object events into higher
|
||||||
|
* level callbacks to implementers of this interface, which are expected
|
||||||
|
* to render these events sensically in a user interface.
|
||||||
|
*/
|
||||||
|
public interface TableObserver
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Called when a new table is created.
|
||||||
|
*/
|
||||||
|
public void tableAdded (Table table);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when something has changed about a table (occupant list
|
||||||
|
* updated, state changed from matchmaking to in-play, etc.).
|
||||||
|
*/
|
||||||
|
public void tableUpdated (Table table);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when a table goes away.
|
||||||
|
*/
|
||||||
|
public void tableRemoved (int tableId);
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
//
|
//
|
||||||
// $Id: Table.java,v 1.3 2001/10/22 23:56:01 mdb Exp $
|
// $Id: Table.java,v 1.4 2001/10/23 02:22:16 mdb Exp $
|
||||||
|
|
||||||
package com.threerings.parlor.data;
|
package com.threerings.parlor.data;
|
||||||
|
|
||||||
@@ -181,6 +181,19 @@ public class Table
|
|||||||
_tconfig = (TableConfig)config;
|
_tconfig = (TableConfig)config;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if this table is equal to the supplied object (which
|
||||||
|
* must be a table with the same table id).
|
||||||
|
*/
|
||||||
|
public boolean equals (Object other)
|
||||||
|
{
|
||||||
|
if (other != null && other instanceof Table) {
|
||||||
|
return ((Table)other).tableId.equals(tableId);
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generates a string representation of this table instance.
|
* Generates a string representation of this table instance.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
//
|
//
|
||||||
// $Id: ParlorManager.java,v 1.12 2001/10/19 22:02:36 mdb Exp $
|
// $Id: ParlorManager.java,v 1.13 2001/10/23 02:22:17 mdb Exp $
|
||||||
|
|
||||||
package com.threerings.parlor.server;
|
package com.threerings.parlor.server;
|
||||||
|
|
||||||
@@ -240,10 +240,20 @@ public class ParlorManager
|
|||||||
// create a brand spanking new table
|
// create a brand spanking new table
|
||||||
Table table = new Table(placeOid, config);
|
Table table = new Table(placeOid, config);
|
||||||
|
|
||||||
// and stick it into the table lobby object
|
// stick the creator into position zero
|
||||||
|
String error = table.setOccupant(0, creator.username);
|
||||||
|
if (error != null) {
|
||||||
|
Log.warning("Unable to add creator to position zero of " +
|
||||||
|
"table!? [table=" + table +
|
||||||
|
", creator=" + creator + "].");
|
||||||
|
// bail out now and abort the table creation process
|
||||||
|
throw new ServiceFailedException(error);
|
||||||
|
}
|
||||||
|
|
||||||
|
// stick the table into the table lobby object
|
||||||
tlobj.addToTables(table);
|
tlobj.addToTables(table);
|
||||||
|
|
||||||
// also stick the table into our tables table
|
// also stick it into our tables table
|
||||||
_tables.put(table.getTableId(), table);
|
_tables.put(table.getTableId(), table);
|
||||||
|
|
||||||
// finally let the caller know what the new table id is
|
// finally let the caller know what the new table id is
|
||||||
@@ -373,8 +383,7 @@ public class ParlorManager
|
|||||||
CrowdServer.omgr.getObject(table.lobbyOid);
|
CrowdServer.omgr.getObject(table.lobbyOid);
|
||||||
if (tlobj == null) {
|
if (tlobj == null) {
|
||||||
Log.warning("Can't update in-play table as lobby's gone " +
|
Log.warning("Can't update in-play table as lobby's gone " +
|
||||||
"missing [table=" + table +
|
"missing [table=" + table + "].");
|
||||||
", gameOid=" + plobj.getOid() + "].");
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
tlobj.updateTables(table);
|
tlobj.updateTables(table);
|
||||||
|
|||||||
Reference in New Issue
Block a user