diff --git a/src/java/com/threerings/whirled/spot/server/SpotProvider.java b/src/java/com/threerings/whirled/spot/server/SpotProvider.java
index a2304429..576f0deb 100644
--- a/src/java/com/threerings/whirled/spot/server/SpotProvider.java
+++ b/src/java/com/threerings/whirled/spot/server/SpotProvider.java
@@ -55,11 +55,10 @@ public class SpotProvider
implements SpotCodes, InvocationProvider
{
/**
- * Creates a spot provider that can be registered with the invocation
- * manager to handle spot services.
+ * Creates a spot provider that can be registered with the invocation manager to handle spot
+ * services.
*/
- public SpotProvider (RootDObjectManager omgr, PlaceRegistry plreg,
- SceneRegistry screg)
+ public SpotProvider (RootDObjectManager omgr, PlaceRegistry plreg, SceneRegistry screg)
{
// we'll need these later
_plreg = plreg;
@@ -77,9 +76,9 @@ public class SpotProvider
// le sanity check
int cSceneId = getCallerSceneId(caller);
if (cSceneId != sceneId) {
- Log.info("Ignoring stale traverse portal request " +
- "[caller=" + caller.who() + ", oSceneId=" + sceneId +
- ", portalId=" + portalId + ", cSceneId=" + cSceneId + "].");
+ Log.info("Ignoring stale traverse portal request [caller=" + caller.who() +
+ ", oSceneId=" + sceneId + ", portalId=" + portalId +
+ ", cSceneId=" + cSceneId + "].");
InvocationMarshaller.setNoResponse(listener);
return;
}
@@ -91,8 +90,7 @@ public class SpotProvider
final SceneMoveListener flistener = listener;
// obtain the source scene
- final SpotSceneManager srcmgr = (SpotSceneManager)
- _screg.getSceneManager(sceneId);
+ final SpotSceneManager srcmgr = (SpotSceneManager)_screg.getSceneManager(sceneId);
if (srcmgr == null) {
Log.warning("Traverse portal missing source scene " +
"[user=" + fsource.who() + ", sceneId=" + sceneId +
@@ -112,60 +110,52 @@ public class SpotProvider
// make sure this portal has valid info
if (fdest == null || !fdest.isValid()) {
- Log.warning("Traverse portal with invalid portal " +
- "[user=" + fsource.who() + ", scene=" + srcmgr.where() +
- ", pid=" + portalId + ", portal=" + fdest +
- ", portals=" + StringUtil.toString(rss.getPortals()) +
- "].");
+ Log.warning("Traverse portal with invalid portal [user=" + fsource.who() +
+ ", scene=" + srcmgr.where() + ", pid=" + portalId + ", portal=" + fdest +
+ ", portals=" + StringUtil.toString(rss.getPortals()) + "].");
throw new InvocationException(NO_SUCH_PORTAL);
}
// resolve their destination scene
- SceneRegistry.ResolutionListener rl =
- new SceneRegistry.ResolutionListener() {
- public void sceneWasResolved (SceneManager scmgr) {
- // make sure our caller is still around; under heavy
- // load, clients might end their session while the
- // scene is resolving
- if (!fsource.isActive()) {
- Log.info("Abandoning portal traversal, client gone " +
- "[who=" + fsource.who() +
- ", dest=" + scmgr.where() + "].");
- InvocationMarshaller.setNoResponse(flistener);
- return;
- }
-
- // let the source manager know that this guy is
- // departing via the specified portal
- srcmgr.willTraversePortal(fsource, fdest);
-
- SpotSceneManager sscmgr = (SpotSceneManager)scmgr;
- finishTraversePortalRequest(
- fsource, sscmgr, fsceneVer, fdest, flistener);
+ SceneRegistry.ResolutionListener rl = new SceneRegistry.ResolutionListener() {
+ public void sceneWasResolved (SceneManager scmgr) {
+ // make sure our caller is still around; under heavy load, clients might end their
+ // session while the scene is resolving
+ if (!fsource.isActive()) {
+ Log.info("Abandoning portal traversal, client gone [who=" + fsource.who() +
+ ", dest=" + scmgr.where() + "].");
+ InvocationMarshaller.setNoResponse(flistener);
+ return;
}
- public void sceneFailedToResolve (
- int rsceneId, Exception reason) {
- Log.warning("Unable to resolve target scene " +
- "[sceneId=" + rsceneId +
- ", reason=" + reason + "].");
- // pretend like the scene doesn't exist to the client
- flistener.requestFailed(NO_SUCH_PLACE);
- }
- };
+ // let the source manager know that this guy is departing via the specified portal
+ srcmgr.willTraversePortal(fsource, fdest);
+
+ SpotSceneManager sscmgr = (SpotSceneManager)scmgr;
+ finishTraversePortalRequest(fsource, sscmgr, fsceneVer, fdest, flistener);
+ }
+
+ public void sceneFailedToResolve (
+ int rsceneId, Exception reason) {
+ Log.warning("Unable to resolve target scene [sceneId=" + rsceneId +
+ ", reason=" + reason + "].");
+ // pretend like the scene doesn't exist to the client
+ flistener.requestFailed(NO_SUCH_PLACE);
+ }
+ };
_screg.resolveScene(fdest.targetSceneId, rl);
}
/**
- * This is called after the scene to which we are moving is guaranteed
- * to have been loaded into the server.
+ * This is called after the scene to which we are moving is guaranteed to have been loaded into
+ * the server.
*/
protected void finishTraversePortalRequest (
- BodyObject source, SpotSceneManager destmgr, int sceneVer,
- Portal dest, SceneMoveListener listener)
+ BodyObject source, SpotSceneManager destmgr, int sceneVer, Portal dest,
+ SceneMoveListener listener)
{
// let the destination scene manager know that we're coming in
- destmgr.mapEnteringBody(source, dest.targetPortalId);
+ destmgr.mapEnteringBody(source, dest);
try {
// move to the place object associated with this scene
@@ -189,19 +179,16 @@ public class SpotProvider
BodyObject source = (BodyObject)caller;
int cSceneId = getCallerSceneId(caller);
if (cSceneId != sceneId) {
- Log.info("Rejecting changeLocation for invalid scene " +
- "[user=" + source.who() + ", insid=" + cSceneId +
- ", wantsid=" + sceneId + ", loc=" + loc + "].");
+ Log.info("Rejecting changeLocation for invalid scene [user=" + source.who() +
+ ", insid=" + cSceneId + ", wantsid=" + sceneId + ", loc=" + loc + "].");
throw new InvocationException(INVALID_LOCATION);
}
// look up the scene manager for the specified scene
- SpotSceneManager smgr = (SpotSceneManager)
- _screg.getSceneManager(sceneId);
+ SpotSceneManager smgr = (SpotSceneManager)_screg.getSceneManager(sceneId);
if (smgr == null) {
- Log.warning("User requested to change location from " +
- "non-existent scene [user=" + source.who() +
- ", sceneId=" + sceneId + ", loc=" + loc +"].");
+ Log.warning("User requested to change location from non-existent scene " +
+ "[user=" + source.who() + ", sceneId=" + sceneId + ", loc=" + loc +"].");
throw new InvocationException(INTERNAL_ERROR);
}
@@ -223,12 +210,11 @@ public class SpotProvider
BodyObject source = (BodyObject)caller;
// look up the scene manager for the specified scene
- SpotSceneManager smgr = (SpotSceneManager)
- _screg.getSceneManager(sceneId);
+ SpotSceneManager smgr = (SpotSceneManager)_screg.getSceneManager(sceneId);
if (smgr == null) {
- Log.warning("User requested to join cluster from " +
- "non-existent scene [user=" + source.who() +
- ", sceneId=" + sceneId + ", foid=" + friendOid +"].");
+ Log.warning("User requested to join cluster from non-existent scene " +
+ "[user=" + source.who() + ", sceneId=" + sceneId +
+ ", foid=" + friendOid +"].");
throw new InvocationException(INTERNAL_ERROR);
}
@@ -249,57 +235,50 @@ public class SpotProvider
BodyObject source = (BodyObject)caller;
String errmsg = source.checkAccess(ChatCodes.CHAT_ACCESS, null);
if (errmsg != null) {
- SpeakProvider.sendFeedback(source,
- MessageManager.GLOBAL_BUNDLE, errmsg);
- return;
+ SpeakProvider.sendFeedback(source, MessageManager.GLOBAL_BUNDLE, errmsg);
+ } else {
+ sendClusterChatMessage(getCallerSceneId(caller), source.getOid(),
+ source.getVisibleName(), null, message, mode);
}
-
- sendClusterChatMessage(getCallerSceneId(caller), source.getOid(),
- source.getVisibleName(), null, message, mode);
}
/**
- * Sends a cluster chat notification to the specified location in the
- * specified place object originating with the specified speaker (the
- * speaker can be a server entity that wishes to fake a "speak"
- * message, in which case the bundle argument should be non-null and
- * should contain the id of the bundle to be used to translate the
- * message text) and with the supplied message content.
+ * Sends a cluster chat notification to the specified location in the specified place object
+ * originating with the specified speaker (the speaker can be a server entity that wishes to
+ * fake a "speak" message, in which case the bundle argument should be non-null and should
+ * contain the id of the bundle to be used to translate the message text) and with the supplied
+ * message content.
*
* @param sceneId the scene id in which to deliver the chat message.
- * @param speakerOid the body object id of the speaker (used to verify
- * that they are in the cluster in question).
- * @param speaker the username of the user that generated the message
- * (or some special speaker name for server messages).
- * @param bundle the bundle identifier that will be used by the client
- * to translate the message text (or null if the message originated
- * from a real live human who wrote it in their native tongue).
+ * @param speakerOid the body object id of the speaker (used to verify that they are in the
+ * cluster in question).
+ * @param speaker the username of the user that generated the message (or some special speaker
+ * name for server messages).
+ * @param bundle the bundle identifier that will be used by the client to translate the message
+ * text (or null if the message originated from a real live human who wrote it in their native
+ * tongue).
* @param message the text of the chat message.
*/
- public void sendClusterChatMessage (
- int sceneId, int speakerOid, Name speaker,
- String bundle, String message, byte mode)
+ public void sendClusterChatMessage (int sceneId, int speakerOid, Name speaker,
+ String bundle, String message, byte mode)
{
// look up the scene manager for the specified scene
- SpotSceneManager smgr = (SpotSceneManager)
- _screg.getSceneManager(sceneId);
+ SpotSceneManager smgr = (SpotSceneManager)_screg.getSceneManager(sceneId);
if (smgr == null) {
- Log.warning("User requested cluster chat in non-existent scene " +
- "[user=" + speaker + ", sceneId=" + sceneId +
- ", message=" + message + "].");
+ Log.warning("User requested cluster chat in non-existent scene [user=" + speaker +
+ ", sceneId=" + sceneId + ", message=" + message + "].");
return;
}
// pass this request on to the spot scene manager
- smgr.handleClusterSpeakRequest(
- speakerOid, speaker, bundle, message, mode);
+ smgr.handleClusterSpeakRequest(speakerOid, speaker, bundle, message, mode);
}
/**
* Obtains the scene id occupied by the supplied caller.
*
- * @exception InvocationException thrown if the caller does not
- * implement {@link ScenedBodyObject}.
+ * @exception InvocationException thrown if the caller does not implement {@link
+ * ScenedBodyObject}.
*/
protected static int getCallerSceneId (ClientObject caller)
throws InvocationException
@@ -307,8 +286,7 @@ public class SpotProvider
if (caller instanceof ScenedBodyObject) {
return ((ScenedBodyObject)caller).getSceneId();
} else {
- Log.warning("Can't get scene from non-scened caller " +
- caller.who() + ".");
+ Log.warning("Can't get scene from non-scened caller " + caller.who() + ".");
throw new InvocationException(INTERNAL_ERROR);
}
}
diff --git a/src/java/com/threerings/whirled/spot/server/SpotSceneManager.java b/src/java/com/threerings/whirled/spot/server/SpotSceneManager.java
index 036ed03c..84d8893d 100644
--- a/src/java/com/threerings/whirled/spot/server/SpotSceneManager.java
+++ b/src/java/com/threerings/whirled/spot/server/SpotSceneManager.java
@@ -21,10 +21,10 @@
package com.threerings.whirled.spot.server;
+import java.util.HashMap;
import java.util.Iterator;
import com.samskivert.util.HashIntMap;
-import com.samskivert.util.IntIntMap;
import com.threerings.util.Name;
import com.threerings.presents.dobj.DObject;
@@ -50,9 +50,8 @@ import com.threerings.whirled.spot.data.SpotScene;
import com.threerings.whirled.spot.data.SpotSceneObject;
/**
- * Handles the movement of bodies between locations in the scene and
- * creates the necessary distributed objects to allow bodies in clusters
- * to chat with one another.
+ * Handles the movement of bodies between locations in the scene and creates the necessary
+ * distributed objects to allow bodies in clusters to chat with one another.
*/
public class SpotSceneManager extends SceneManager
implements SpotCodes
@@ -62,8 +61,7 @@ public class SpotSceneManager extends SceneManager
*/
public static void moveBodyToDefaultPortal (BodyObject body)
{
- SpotSceneManager mgr = (SpotSceneManager)
- CrowdServer.plreg.getPlaceManager(body.location);
+ SpotSceneManager mgr = (SpotSceneManager)CrowdServer.plreg.getPlaceManager(body.location);
if (mgr != null) {
SpotScene scene = (SpotScene)mgr.getScene();
if (scene == null) {
@@ -84,24 +82,20 @@ public class SpotSceneManager extends SceneManager
}
/**
- * Assigns a starting location for an entering body. This will happen
- * before the body is made to "occupy" the scene (defined by their
- * having an occupant info record). So when they do finally occupy the
- * scene, the client will know where to render them.
+ * Assigns a starting location for an entering body. This will happen before the body is made
+ * to "occupy" the scene (defined by their having an occupant info record). So when they do
+ * finally occupy the scene, the client will know where to render them.
*/
- public void mapEnteringBody (BodyObject body, int portalId)
+ public void mapEnteringBody (BodyObject body, Portal from)
{
- // small optimization: don't save portalId -1, because it simply means
- // "use the default entrance" and retrieving an unset value will
- // return -1 anyway
- if (portalId != -1) {
- _enterers.put(body.getOid(), portalId);
+ // don't save a null from portal, because it simply means "use the default entrance"
+ if (from != null) {
+ _enterers.put(body.getOid(), from);
}
}
/**
- * Called if a body failed to enter our scene after we assigned them
- * an entering position.
+ * Called if a body failed to enter our scene after we assigned them an entering position.
*/
public void clearEnteringBody (BodyObject body)
{
@@ -109,10 +103,9 @@ public class SpotSceneManager extends SceneManager
}
/**
- * This is called when a user requests to traverse a portal from this
- * scene to another scene. The manager may return an error code string
- * that will be reported back to the caller explaining the failure or
- * null indicating that it is OK for the caller to
+ * This is called when a user requests to traverse a portal from this scene to another scene.
+ * The manager may return an error code string that will be reported back to the caller
+ * explaining the failure or null indicating that it is OK for the caller to
* traverse the portal.
*/
public String mayTraversePortal (BodyObject body, Portal portal)
@@ -121,11 +114,10 @@ public class SpotSceneManager extends SceneManager
}
/**
- * This is called to let this scene manager know that the user is
- * about to traverse the specified portal. The default implementation
- * relocates the user to the location associated with the portal. It
- * is still possible that the traversal will fail, so don't do
- * anything too crazy.
+ * This is called to let this scene manager know that the user is about to traverse the
+ * specified portal. The default implementation relocates the user to the location associated
+ * with the portal. It is still possible that the traversal will fail, so don't do anything too
+ * crazy.
*/
public void willTraversePortal (BodyObject body, Portal portal)
{
@@ -135,10 +127,9 @@ public class SpotSceneManager extends SceneManager
// documentation inherited
protected void didStartup ()
{
- // get a casted reference to our place object (we need to do this
- // before calling super.didStartup() because that will call
- // sceneManagerDidResolve() which may start letting people into
- // the scene)
+ // get a casted reference to our place object (we need to do this before calling
+ // super.didStartup() because that will call sceneManagerDidResolve() which may start
+ // letting people into the scene)
_ssobj = (SpotSceneObject)_plobj;
super.didStartup();
@@ -165,17 +156,16 @@ public class SpotSceneManager extends SceneManager
removeFromCluster(bodyOid);
// let's make damned sure they're not in any cluster
- Iterator cliter = _clusters.values().iterator();
+ Iterator cliter = _clusters.values().iterator();
while (cliter.hasNext()) {
- ClusterRecord clrec = (ClusterRecord)cliter.next();
+ ClusterRecord clrec = cliter.next();
if (clrec.containsKey(bodyOid)) {
Log.info("Pruning departed body from cluster [boid=" + bodyOid +
", cluster=" + clrec + "].");
clrec.removeBody(bodyOid);
if (clrec.size() == 0) {
- // If we just removed the last body, destroy the cluster,
- // need to use the iterator's removal so we don't
- // hose ourselves.
+ // if we just removed the last body, destroy the cluster, need to use the
+ // iterator's removal so we don't hose ourselves
clrec.destroy(false);
cliter.remove();
}
@@ -188,25 +178,23 @@ public class SpotSceneManager extends SceneManager
{
super.insertOccupantInfo(info, body);
- // we don't actually populate their occupant info, but instead assign
- // them their starting location in the scene
+ // we don't actually populate their occupant info, but instead assign them their starting
+ // location in the scene
assignStartingLocation(body);
}
/**
* Give our new body a starting location.
- * @param body The new body entering the scene.
*/
protected void assignStartingLocation (BodyObject body)
{
- int portalId = _enterers.remove(body.getOid());
+ Portal from = _enterers.remove(body.getOid());
Portal entry;
- if (portalId != -1) {
- entry = _sscene.getPortal(portalId);
+ if (from != null && from.portalId != -1) {
+ entry = _sscene.getPortal(from.portalId);
if (entry == null) {
Log.warning("Body mapped at invalid portal [where=" + where() +
- ", who=" + body.who() +
- ", portalId=" + portalId + "].");
+ ", who=" + body.who() + ", from=" + from + "].");
entry = _sscene.getDefaultEntrance();
}
} else {
@@ -216,40 +204,37 @@ public class SpotSceneManager extends SceneManager
// Log.debug("Positioning entering body [who=" + body.who() +
// ", where=" + entry.getOppLocation() + "].");
- // create a scene location for them located on the entrance portal
- // but facing the opposite direction
+ // create a scene location for them located on the entrance portal but facing the opposite
+ // direction
_ssobj.addToOccupantLocs(computeEnteringLocation(body, entry));
}
/**
- * Called when the supplied body is entering our scene via the
- * specified portal. The default location is the one associated with
- * the portal, but derived classes may wish to adjust this.
+ * Called when the supplied body is entering our scene via the specified portal. The default
+ * location is the one associated with the portal, but derived classes may wish to adjust this.
*/
- protected SceneLocation computeEnteringLocation (
- BodyObject body, Portal entry)
+ protected SceneLocation computeEnteringLocation (BodyObject body, Portal entry)
{
return new SceneLocation(entry.getOppLocation(), body.getOid());
}
/**
- * Called by the {@link SpotProvider} when we receive a request by a
- * user to occupy a particular location.
+ * Called by the {@link SpotProvider} when we receive a request by a user to occupy a
+ * particular location.
*
* @param source the body to be moved.
* @param loc the location to which to move the body.
*
- * @exception InvocationException thrown with a reason code explaining
- * the failure if there is a problem processing the request.
+ * @exception InvocationException thrown with a reason code explaining the failure if there is
+ * a problem processing the request.
*/
protected void handleChangeLoc (BodyObject source, Location loc)
throws InvocationException
{
// make sure they are in our scene
if (!_ssobj.occupants.contains(source.getOid())) {
- Log.warning("Refusing change loc from non-scene occupant " +
- "[where=" + where() + ", who=" + source.who() +
- ", loc=" + loc + "].");
+ Log.warning("Refusing change loc from non-scene occupant [where=" + where() +
+ ", who=" + source.who() + ", loc=" + loc + "].");
throw new InvocationException(INTERNAL_ERROR);
}
@@ -258,9 +243,8 @@ public class SpotSceneManager extends SceneManager
throw new InvocationException(INVALID_LOCATION);
}
- // update the user's location information in the scene which will
- // indicate to the client that their avatar should be moved from
- // its current position to their new position
+ // update the user's location information in the scene which will indicate to the client
+ // that their avatar should be moved from its current position to their new position
updateLocation(source, loc);
// remove them from any cluster as they've departed
@@ -268,10 +252,9 @@ public class SpotSceneManager extends SceneManager
}
/**
- * Derived classes can override this method and validate that the
- * specified body can stand in the requested location. The default
- * implementation returns true in all circumstances;
- * stand where ye may!
+ * Derived classes can override this method and validate that the specified body can stand in
+ * the requested location. The default implementation returns true in all
+ * circumstances; stand where ye may!
*/
protected boolean validateLocation (BodyObject source, Location loc)
{
@@ -286,9 +269,8 @@ public class SpotSceneManager extends SceneManager
SceneLocation sloc = new SceneLocation(loc, source.getOid());
if (!_ssobj.occupantLocs.contains(sloc)) {
// complain if they don't already have a location configured
- Log.warning("Changing loc for occupant without previous loc " +
- "[where=" + where() + ", who=" + source.who() +
- ", nloc=" + loc + "].");
+ Log.warning("Changing loc for occupant without previous loc [where=" + where() +
+ ", who=" + source.who() + ", nloc=" + loc + "].");
Thread.dumpStack();
_ssobj.addToOccupantLocs(sloc);
} else {
@@ -297,22 +279,21 @@ public class SpotSceneManager extends SceneManager
}
/**
- * Called by the {@link SpotProvider} when we receive a request by a
- * user to join a particular cluster.
+ * Called by the {@link SpotProvider} when we receive a request by a user to join a particular
+ * cluster.
*
* @param joiner the body to be moved.
- * @param targetOid the bodyOid of another user or the oid of an
- * existing cluster; the moving user will be made to join the other
- * user's cluster.
+ * @param targetOid the bodyOid of another user or the oid of an existing cluster; the moving
+ * user will be made to join the other user's cluster.
*
- * @exception InvocationException thrown with a reason code explaining
- * the failure if there is a problem processing the request.
+ * @exception InvocationException thrown with a reason code explaining the failure if there is
+ * a problem processing the request.
*/
protected void handleJoinCluster (BodyObject joiner, int targetOid)
throws InvocationException
{
// if the cluster already exists, add this user and be done
- ClusterRecord clrec = (ClusterRecord)_clusters.get(targetOid);
+ ClusterRecord clrec = _clusters.get(targetOid);
if (clrec != null) {
clrec.addBody(joiner);
return;
@@ -321,8 +302,7 @@ public class SpotSceneManager extends SceneManager
// otherwise see if they sent us the user's oid
DObject tobj = CrowdServer.omgr.getObject(targetOid);
if (!(tobj instanceof BodyObject)) {
- Log.info("Can't join cluster, missing target " +
- "[creator=" + joiner.who() +
+ Log.info("Can't join cluster, missing target [creator=" + joiner.who() +
", targetOid=" + targetOid + "].");
throw new InvocationException(NO_SUCH_CLUSTER);
}
@@ -330,9 +310,8 @@ public class SpotSceneManager extends SceneManager
// make sure we're in the same scene as said user
BodyObject friend = (BodyObject)tobj;
if (friend.location != joiner.location) {
- Log.info("Refusing cluster join from non-proximate user " +
- "[joiner=" + joiner.who() + ", jloc=" + joiner.location +
- ", target=" + friend.who() +
+ Log.info("Refusing cluster join from non-proximate user [joiner=" + joiner.who() +
+ ", jloc=" + joiner.location + ", target=" + friend.who() +
", tloc=" + friend.location + "].");
throw new InvocationException(NO_SUCH_CLUSTER);
}
@@ -344,21 +323,18 @@ public class SpotSceneManager extends SceneManager
return;
}
- // confirm that they can start a cluster with this unsuspecting
- // other person
+ // confirm that they can start a cluster with this unsuspecting other person
checkCanCluster(joiner, friend);
// otherwise we create a new cluster and add our charter members!
-// Log.debug("Creating cluster [starter=" + joiner.who() +
-// ", target=" + friend.who() + "].");
+// Log.debug("Creating cluster [starter=" + joiner.who() + ", tgt=" + friend.who() + "].");
clrec = createClusterRecord();
clrec.addBody(friend);
clrec.addBody(joiner);
}
/**
- * Creates the cluster record instance that we'll use to manage our
- * cluster.
+ * Creates the cluster record instance that we'll use to manage our cluster.
*/
protected ClusterRecord createClusterRecord ()
{
@@ -366,10 +342,9 @@ public class SpotSceneManager extends SceneManager
}
/**
- * Gives derived classes an opportunity to veto a user's attempt to
- * start a cluster with another user. If the attempt should be vetoed,
- * this method should throw an {@link InvocationException} indicating
- * the reason for veto.
+ * Gives derived classes an opportunity to veto a user's attempt to start a cluster with
+ * another user. If the attempt should be vetoed, this method should throw an {@link
+ * InvocationException} indicating the reason for veto.
*/
protected void checkCanCluster (BodyObject initiator, BodyObject target)
throws InvocationException
@@ -397,33 +372,27 @@ public class SpotSceneManager extends SceneManager
*/
protected ClusterRecord getCluster (int bodyOid)
{
- ClusteredBodyObject bobj = (ClusteredBodyObject)
- CrowdServer.omgr.getObject(bodyOid);
- return (bobj == null) ? null :
- (ClusterRecord)_clusters.get(bobj.getClusterOid());
+ ClusteredBodyObject bobj = (ClusteredBodyObject)CrowdServer.omgr.getObject(bodyOid);
+ return (bobj == null) ? null : _clusters.get(bobj.getClusterOid());
}
/**
- * Called by the {@link SpotProvider} when we receive a cluster speak
- * request.
+ * Called by the {@link SpotProvider} when we receive a cluster speak request.
*/
- protected void handleClusterSpeakRequest (
- int sourceOid, Name source, String bundle, String message, byte mode)
+ protected void handleClusterSpeakRequest (int sourceOid, Name source, String bundle,
+ String message, byte mode)
{
ClusterRecord clrec = getCluster(sourceOid);
if (clrec == null) {
- Log.warning("Non-clustered user requested cluster speak " +
- "[where=" + where() + ", chatter=" + source +
- " (" + sourceOid + "), msg=" + message + "].");
+ Log.warning("Non-clustered user requested cluster speak [where=" + where() +
+ ", chatter=" + source + " (" + sourceOid + "), msg=" + message + "].");
} else {
- SpeakProvider.sendSpeak(clrec.getClusterObject(),
- source, bundle, message, mode);
+ SpeakProvider.sendSpeak(clrec.getClusterObject(), source, bundle, message, mode);
}
}
/**
- * Returns the location of the specified body or null if they have no
- * location in this scene.
+ * Returns the location of the specified body or null if they have no location in this scene.
*/
protected SceneLocation locationForBody (int bodyOid)
{
@@ -431,8 +400,7 @@ public class SpotSceneManager extends SceneManager
}
/**
- * Verifies that the specified cluster can be expanded to include
- * another body.
+ * Verifies that the specified cluster can be expanded to include another body.
*/
protected boolean canAddBody (ClusterRecord clrec, BodyObject body)
{
@@ -440,26 +408,23 @@ public class SpotSceneManager extends SceneManager
}
/**
- * Called when a user is added to a cluster. The scene manager
- * implementation should take this opportunity to rearrange everyone
- * in the cluster appropriately for the new size.
+ * Called when a user is added to a cluster. The scene manager implementation should take this
+ * opportunity to rearrange everyone in the cluster appropriately for the new size.
*/
protected void bodyAdded (ClusterRecord clrec, BodyObject body)
{
}
/**
- * Called when a user is removed from a cluster. The scene manager
- * implementation should take this opportunity to rearrange everyone
- * in the cluster appropriately for the new size.
+ * Called when a user is removed from a cluster. The scene manager implementation should take
+ * this opportunity to rearrange everyone in the cluster appropriately for the new size.
*/
protected void bodyRemoved (ClusterRecord clrec, BodyObject body)
{
}
/**
- * Used to manage clusters which are groups of users that can chat to
- * one another.
+ * Used to manage clusters which are groups of users that can chat to one another.
*/
protected class ClusterRecord extends HashIntMap
{
@@ -485,9 +450,8 @@ public class SpotSceneManager extends SceneManager
throws InvocationException
{
if (!(body instanceof ClusteredBodyObject)) {
- Log.warning("Refusing to add non-clustered body to cluster " +
- "[cloid=" + _clobj.getOid() +
- ", size=" + size() + ", who=" + body.who() + "].");
+ Log.warning("Refusing to add non-clustered body to cluster [cloid=" +
+ _clobj.getOid() + ", size=" + size() + ", who=" + body.who() + "].");
throw new InvocationException(INTERNAL_ERROR);
}
@@ -511,10 +475,8 @@ public class SpotSceneManager extends SceneManager
body.startTransaction();
try {
bodyAdded(this, body); // do the hokey pokey
-
if (_clobj != null) {
- ((ClusteredBodyObject)body).setClusterOid(
- _clobj.getOid());
+ ((ClusteredBodyObject)body).setClusterOid(_clobj.getOid());
_clobj.addToOccupants(body.getOid());
_ssobj.updateClusters(_cluster);
}
@@ -534,9 +496,8 @@ public class SpotSceneManager extends SceneManager
{
BodyObject body = (BodyObject)remove(bodyOid);
if (body == null) {
- Log.warning("Requested to remove unknown body from cluster " +
- "[cloid=" + _clobj.getOid() +
- ", size=" + size() + ", who=" + bodyOid + "].");
+ Log.warning("Requested to remove unknown body from cluster [cloid=" +
+ _clobj.getOid() + ", size=" + size() + ", who=" + bodyOid + "].");
return;
}
@@ -548,7 +509,6 @@ public class SpotSceneManager extends SceneManager
try {
((ClusteredBodyObject)body).setClusterOid(-1);
bodyRemoved(this, body); // do the hokey pokey
-
if (_clobj != null) {
_clobj.removeFromOccupants(bodyOid);
_ssobj.updateClusters(_cluster);
@@ -557,6 +517,7 @@ public class SpotSceneManager extends SceneManager
} finally {
_ssobj.commitTransaction();
}
+
} finally {
if (body.isActive()) {
body.commitTransaction();
@@ -584,12 +545,10 @@ public class SpotSceneManager extends SceneManager
protected void destroy (boolean doRemoval)
{
-// Log.debug("Cluster empty, going away " +
-// "[cloid=" + _clobj.getOid() + "].");
+// Log.debug("Cluster empty, going away [cloid=" + _clobj.getOid() + "].");
_ssobj.removeFromClusters(_cluster.getKey());
- // If we've also been requested to remove ourself from the clusters
- // list, do that.
+ // if we've also been requested to remove ourself from the clusters list, do that
if (doRemoval) {
_clusters.remove(_clobj.getOid());
}
@@ -607,8 +566,8 @@ public class SpotSceneManager extends SceneManager
protected SpotScene _sscene;
/** Records with information on all clusters in this scene. */
- protected HashIntMap _clusters = new HashIntMap();
+ protected HashIntMap _clusters = new HashIntMap();
/** A mapping of entering bodies to portal ids. */
- protected IntIntMap _enterers = new IntIntMap();
+ protected HashMap _enterers = new HashMap();
}