Listen for object death on table participants when we're not in a place and

can't rely on hearing that they left the place to clean up after them.


git-svn-id: svn+ssh://src.earth.threerings.net/vilya/trunk@274 c613c5cb-e716-0410-b11b-feb51c14d237
This commit is contained in:
Michael Bayne
2007-04-10 17:05:48 +00:00
parent eab2ae7d91
commit 97a8417d4e
@@ -60,7 +60,7 @@ import com.threerings.parlor.game.server.GameManager;
* of a table matchmaking service on a particular distributed object. * of a table matchmaking service on a particular distributed object.
*/ */
public class TableManager public class TableManager
implements ParlorCodes, OidListListener, TableProvider implements ParlorCodes, TableProvider
{ {
/** /**
* Creates a table manager that will manage tables in the supplied distributed object (which * Creates a table manager that will manage tables in the supplied distributed object (which
@@ -77,7 +77,7 @@ public class TableManager
// if our table is in a "place" add ourselves as a listener so that we can tell if a user // if our table is in a "place" add ourselves as a listener so that we can tell if a user
// leaves the place without leaving their table // leaves the place without leaving their table
if (_dobj instanceof PlaceObject) { if (_dobj instanceof PlaceObject) {
_dobj.addListener(this); _dobj.addListener(_leaveListener);
} }
} }
@@ -91,7 +91,7 @@ public class TableManager
_tlobj.setTableService(null); _tlobj.setTableService(null);
} }
if (_dobj instanceof PlaceObject) { if (_dobj instanceof PlaceObject) {
_dobj.removeListener(this); _dobj.removeListener(_leaveListener);
} }
_tlobj = null; _tlobj = null;
_dobj = null; _dobj = null;
@@ -277,9 +277,15 @@ public class TableManager
protected void notePlayerAdded (Table table, int playerOid) protected void notePlayerAdded (Table table, int playerOid)
{ {
_boidMap.put(playerOid, table); _boidMap.put(playerOid, table);
// if we're in a place, we're done
// TODO: if we're not in a place, listen to the player's BodyObject for object death so if (_dobj instanceof PlaceObject) {
// that we remove them from their table if they logoff return;
}
// if not, listen to their BodyObject for death so that we remove them if they logoff
BodyObject body = (BodyObject)PresentsServer.omgr.getObject(playerOid);
if (body != null) {
body.addListener(_deathListener);
}
} }
/** /**
@@ -288,7 +294,12 @@ public class TableManager
protected boolean notePlayerRemoved (Table table, int playerOid) protected boolean notePlayerRemoved (Table table, int playerOid)
{ {
boolean removed = (_boidMap.remove(playerOid) != null); boolean removed = (_boidMap.remove(playerOid) != null);
// TODO: remove our BodyObject death listener if (!(_dobj instanceof PlaceObject)) {
BodyObject body = (BodyObject)PresentsServer.omgr.getObject(playerOid);
if (body != null) {
body.removeListener(_deathListener);
}
}
return removed; return removed;
} }
@@ -403,22 +414,13 @@ public class TableManager
_tlobj.updateTables(table); _tlobj.updateTables(table);
} }
// documentation inherited /**
public void objectAdded (ObjectAddedEvent event) * Called when a body is known to have left either the room that contains our tables or logged
* off of the server.
*/
protected void bodyLeft (int bodyOid)
{ {
// 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 // look up the table to which this occupant is mapped
int bodyOid = event.getOid();
Table pender = _boidMap.remove(bodyOid); Table pender = _boidMap.remove(bodyOid);
if (pender == null) { if (pender == null) {
return; return;
@@ -440,6 +442,27 @@ public class TableManager
} }
} }
/** Listens for players leaving the place that contains our tables. */
protected OidListListener _leaveListener = new OidListListener() {
public void objectAdded (ObjectAddedEvent event) {
// nothing doing
}
public void objectRemoved (ObjectRemovedEvent event) {
// if an occupant departed, see if they are in a pending table
if (event.getName().equals(PlaceObject.OCCUPANTS)) {
bodyLeft(event.getOid());
}
}
};
/** Listens for the death of body objects that are in tables. This is used when we are not
* managing tables in a place but rather across the whole server. */
protected ObjectDeathListener _deathListener = new ObjectDeathListener() {
public void objectDestroyed (ObjectDestroyedEvent event) {
bodyLeft(event.getTargetOid());
}
};
/** A reference to the distributed object in which we're managing tables. */ /** A reference to the distributed object in which we're managing tables. */
protected DObject _dobj; protected DObject _dobj;