Rearrangements and added code to clean up after tables when their
associated games finally go away. git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@548 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
//
|
//
|
||||||
// $Id: TableManager.java,v 1.1 2001/10/23 23:47:02 mdb Exp $
|
// $Id: TableManager.java,v 1.2 2001/10/24 01:14:38 mdb Exp $
|
||||||
|
|
||||||
package com.threerings.parlor.server;
|
package com.threerings.parlor.server;
|
||||||
|
|
||||||
@@ -10,6 +10,8 @@ import com.samskivert.util.HashIntMap;
|
|||||||
import com.samskivert.util.StringUtil;
|
import com.samskivert.util.StringUtil;
|
||||||
|
|
||||||
import com.threerings.presents.dobj.ObjectAddedEvent;
|
import com.threerings.presents.dobj.ObjectAddedEvent;
|
||||||
|
import com.threerings.presents.dobj.ObjectDeathListener;
|
||||||
|
import com.threerings.presents.dobj.ObjectDestroyedEvent;
|
||||||
import com.threerings.presents.dobj.ObjectRemovedEvent;
|
import com.threerings.presents.dobj.ObjectRemovedEvent;
|
||||||
import com.threerings.presents.dobj.OidListListener;
|
import com.threerings.presents.dobj.OidListListener;
|
||||||
import com.threerings.presents.server.ServiceFailedException;
|
import com.threerings.presents.server.ServiceFailedException;
|
||||||
@@ -238,63 +240,6 @@ public class TableManager
|
|||||||
_tlobj.removeFromTables(table.tableId);
|
_tlobj.removeFromTables(table.tableId);
|
||||||
}
|
}
|
||||||
|
|
||||||
// documentation inherited
|
|
||||||
public void objectAdded (ObjectAddedEvent event)
|
|
||||||
{
|
|
||||||
// nothing doing
|
|
||||||
}
|
|
||||||
|
|
||||||
// documentation inherited
|
|
||||||
public void objectRemoved (ObjectRemovedEvent event)
|
|
||||||
{
|
|
||||||
Log.info("Object removed: " + event);
|
|
||||||
|
|
||||||
// if an occupant departed, see if they are in a pending table
|
|
||||||
if (!event.getName().equals(PlaceObject.OCCUPANTS)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// look up the table to which this occupant is mapped
|
|
||||||
int bodyOid = event.getOid();
|
|
||||||
Table pender = (Table)_boidMap.remove(bodyOid);
|
|
||||||
if (pender == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// remove this occupant from the table
|
|
||||||
if (!pender.clearOccupant(bodyOid)) {
|
|
||||||
Log.warning("Attempt to remove body from mapped table failed " +
|
|
||||||
"[table=" + pender + ", bodyOid=" + bodyOid + "].");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// either update or delete the table depending on whether or not
|
|
||||||
// we just removed the last occupant
|
|
||||||
if (pender.isEmpty()) {
|
|
||||||
purgeTable(pender);
|
|
||||||
} else {
|
|
||||||
_tlobj.updateTables(pender);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Called by the place registry when the game object has been created
|
|
||||||
* and provided to the game manager. We use this to map game object
|
|
||||||
* oids back to table records when we create games from tables.
|
|
||||||
*/
|
|
||||||
public void placeCreated (PlaceObject plobj, PlaceManager pmgr)
|
|
||||||
{
|
|
||||||
// see if this place manager is associated with a table
|
|
||||||
Table table = (Table)_pendingTables.remove(pmgr);
|
|
||||||
if (table != null) {
|
|
||||||
// update the table with the newly created game object
|
|
||||||
table.gameOid = plobj.getOid();
|
|
||||||
|
|
||||||
// and then update the lobby object that contains the table
|
|
||||||
_tlobj.updateTables(table);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called when we're ready to create a game (either an invitation has
|
* Called when we're ready to create a game (either an invitation has
|
||||||
* been accepted or a table is ready to start. If there is a problem
|
* been accepted or a table is ready to start. If there is a problem
|
||||||
@@ -330,6 +275,89 @@ public class TableManager
|
|||||||
return gmgr;
|
return gmgr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called by the place registry when the game object has been created
|
||||||
|
* and provided to the game manager. We use this to map game object
|
||||||
|
* oids back to table records when we create games from tables.
|
||||||
|
*/
|
||||||
|
public void placeCreated (PlaceObject plobj, PlaceManager pmgr)
|
||||||
|
{
|
||||||
|
// see if this place manager is associated with a table
|
||||||
|
Table table = (Table)_pendingTables.remove(pmgr);
|
||||||
|
if (table != null) {
|
||||||
|
// update the table with the newly created game object
|
||||||
|
table.gameOid = plobj.getOid();
|
||||||
|
|
||||||
|
// add an object death listener to unmap the table when the
|
||||||
|
// game finally goes away
|
||||||
|
plobj.addListener(new ObjectDeathListener() {
|
||||||
|
public void objectDestroyed (ObjectDestroyedEvent event) {
|
||||||
|
unmapTable(event.getTargetOid());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// and then update the lobby object that contains the table
|
||||||
|
_tlobj.updateTables(table);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when a game created from a table managed by this table
|
||||||
|
* manager was destroyed. We remove the associated table.
|
||||||
|
*/
|
||||||
|
protected void unmapTable (int gameOid)
|
||||||
|
{
|
||||||
|
// look through our tables table for a table with a matching game
|
||||||
|
Iterator iter = _tables.values().iterator();
|
||||||
|
while (iter.hasNext()) {
|
||||||
|
Table table = (Table)iter.next();
|
||||||
|
if (table.gameOid == gameOid) {
|
||||||
|
purgeTable(table);
|
||||||
|
return; // all done
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Log.warning("Requested to unmap table that wasn't mapped " +
|
||||||
|
"[gameOid=" + gameOid + "].");
|
||||||
|
}
|
||||||
|
|
||||||
|
// documentation inherited
|
||||||
|
public void objectAdded (ObjectAddedEvent event)
|
||||||
|
{
|
||||||
|
// nothing doing
|
||||||
|
}
|
||||||
|
|
||||||
|
// documentation inherited
|
||||||
|
public void objectRemoved (ObjectRemovedEvent event)
|
||||||
|
{
|
||||||
|
// if an occupant departed, see if they are in a pending table
|
||||||
|
if (!event.getName().equals(PlaceObject.OCCUPANTS)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// look up the table to which this occupant is mapped
|
||||||
|
int bodyOid = event.getOid();
|
||||||
|
Table pender = (Table)_boidMap.remove(bodyOid);
|
||||||
|
if (pender == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// remove this occupant from the table
|
||||||
|
if (!pender.clearOccupant(bodyOid)) {
|
||||||
|
Log.warning("Attempt to remove body from mapped table failed " +
|
||||||
|
"[table=" + pender + ", bodyOid=" + bodyOid + "].");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// either update or delete the table depending on whether or not
|
||||||
|
// we just removed the last occupant
|
||||||
|
if (pender.isEmpty()) {
|
||||||
|
purgeTable(pender);
|
||||||
|
} else {
|
||||||
|
_tlobj.updateTables(pender);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/** A reference to the place object in which we're managing tables. */
|
/** A reference to the place object in which we're managing tables. */
|
||||||
protected PlaceObject _plobj;
|
protected PlaceObject _plobj;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user