diff --git a/src/java/com/threerings/whirled/client/SceneDirector.java b/src/java/com/threerings/whirled/client/SceneDirector.java
index d5e42733..64f2ed12 100644
--- a/src/java/com/threerings/whirled/client/SceneDirector.java
+++ b/src/java/com/threerings/whirled/client/SceneDirector.java
@@ -67,7 +67,7 @@ public class SceneDirector extends BasicDirector
* Should instruct the client to move the last known working location (as well as clean up
* after the failed moveTo request).
*/
- public void recoverMoveTo (int sceneId);
+ public void recoverMoveTo (int previousSceneId);
}
/**
@@ -327,12 +327,8 @@ public class SceneDirector extends BasicDirector
// from interface SceneService.SceneMoveListener
public void requestFailed (String reason)
{
- // clear out our pending request oid
- int sceneId = _pendingSceneId;
- _pendingSceneId = -1;
-
// let our observers know that something has gone horribly awry
- _locdir.failedToMoveTo(sceneId, reason);
+ _locdir.failedToMoveTo(_pendingSceneId, reason);
}
/**
@@ -394,15 +390,21 @@ public class SceneDirector extends BasicDirector
// from interface LocationDirector.FailureHandler
public void recoverFailedMove (int placeId)
{
+ // if we're currently in a scene, then just stay there
+ if (_sceneId > 0) {
+ return;
+ }
+
// we'll need this momentarily
- int sceneId = _sceneId;
+ int justAttemptedSceneId = _pendingSceneId;
+ _pendingSceneId = -1;
// clear out our now bogus scene tracking info
clearScene();
// if we were previously somewhere (and that somewhere isn't where we just tried to go),
// try going back to that happy place
- if (_previousSceneId != -1 && _previousSceneId != sceneId) {
+ if (_previousSceneId != -1 && _previousSceneId != justAttemptedSceneId) {
// if we have a move handler use that
if (_moveHandler != null) {
_moveHandler.recoverMoveTo(_previousSceneId);
diff --git a/src/java/com/threerings/whirled/zone/client/ZoneDirector.java b/src/java/com/threerings/whirled/zone/client/ZoneDirector.java
index 0ba43cf5..28148af1 100644
--- a/src/java/com/threerings/whirled/zone/client/ZoneDirector.java
+++ b/src/java/com/threerings/whirled/zone/client/ZoneDirector.java
@@ -40,23 +40,20 @@ import com.threerings.whirled.zone.data.ZoneSummary;
import com.threerings.whirled.zone.util.ZoneUtil;
/**
- * The zone director augments the scene services with the notion of zones.
- * Zones are self-contained, connected groups of scenes. The normal scene
- * director services can be used to move from scene to scene, but moving
- * to a new zone requires a special move request which can be accomplished
- * via the zone director. The zone director also makes available the zone
- * summary which provides information on the zone which can be used to
- * generate an overview map or similar.
+ * The zone director augments the scene services with the notion of zones. Zones are
+ * self-contained, connected groups of scenes. The normal scene director services can be used to
+ * move from scene to scene, but moving to a new zone requires a special move request which can be
+ * accomplished via the zone director. The zone director also makes available the zone summary
+ * which provides information on the zone which can be used to generate an overview map or similar.
*/
public class ZoneDirector extends BasicDirector
implements ZoneReceiver, ZoneService.ZoneMoveListener,
SceneDirector.MoveHandler
{
/**
- * Constructs a zone director with the supplied context, and delegate
- * scene director (which the zone director will coordinate with when
- * moving from scene to scene). A zone director is required on the
- * client side for systems that wish to use the zone services.
+ * Constructs a zone director with the supplied context, and delegate scene director (which the
+ * zone director will coordinate with when moving from scene to scene). A zone director is
+ * required on the client side for systems that wish to use the zone services.
*/
public ZoneDirector (WhirledContext ctx, SceneDirector scdir)
{
@@ -71,9 +68,8 @@ public class ZoneDirector extends BasicDirector
}
/**
- * Returns the summary for the zone currently occupied by the client
- * or null if the client does not currently occupy a zone (not a
- * normal situation).
+ * Returns the summary for the zone currently occupied by the client or null if the client does
+ * not currently occupy a zone (not a normal situation).
*/
public ZoneSummary getZoneSummary ()
{
@@ -81,8 +77,8 @@ public class ZoneDirector extends BasicDirector
}
/**
- * Adds a zone observer to the list. This observer will subsequently
- * be notified of effected and failed zone changes.
+ * Adds a zone observer to the list. This observer will subsequently be notified of effected
+ * and failed zone changes.
*/
public void addZoneObserver (ZoneObserver observer)
{
@@ -98,9 +94,9 @@ public class ZoneDirector extends BasicDirector
}
/**
- * Requests that this client move the specified scene in the specified
- * zone. A request will be made and when the response is received, the
- * location observers will be notified of success or failure.
+ * Requests that this client move the specified scene in the specified zone. A request will be
+ * made and when the response is received, the location observers will be notified of success
+ * or failure.
*/
public boolean moveTo (int zoneId, int sceneId)
{
@@ -108,9 +104,9 @@ public class ZoneDirector extends BasicDirector
}
/**
- * Requests that this client move the specified scene in the specified
- * zone. A request will be made and when the response is received, the
- * location observers will be notified of success or failure.
+ * Requests that this client move the specified scene in the specified zone. A request will be
+ * made and when the response is received, the location observers will be notified of success
+ * or failure.
*/
public boolean moveTo (int zoneId, int sceneId, ResultListener rl)
{
@@ -121,25 +117,23 @@ public class ZoneDirector extends BasicDirector
return false;
}
- // if the requested zone is the same as our current zone, we just
- // want a regular old moveTo request
+ // if the requested zone is the same as our current zone, we just want a regular old moveTo
+ // request
if (_summary != null && zoneId == _summary.zoneId) {
return _scdir.moveTo(sceneId);
}
- // otherwise, we make a zoned moveTo request; prepare to move to
- // this scene (sets up pending data)
+ // otherwise, we make a zoned moveTo request; prepare to move to this scene (sets up
+ // pending data)
if (!_scdir.prepareMoveTo(sceneId, rl)) {
return false;
}
- // let our zone observers know that we're attempting to switch
- // zones
+ // let our zone observers know that we're attempting to switch zones
notifyObservers(Integer.valueOf(zoneId));
- // check the version of our cached copy of the scene to which
- // we're requesting to move; if we were unable to load it, assume
- // a cached version of zero
+ // check the version of our cached copy of the scene to which we're requesting to move; if
+ // we were unable to load it, assume a cached version of zero
int sceneVers = 0;
SceneModel pendingModel = _scdir.getPendingModel();
if (pendingModel != null) {
@@ -170,18 +164,14 @@ public class ZoneDirector extends BasicDirector
_previousZoneId = -1;
}
- /**
- * Called in response to a successful {@link ZoneService#moveTo}
- * request.
- */
- public void moveSucceeded (
- int placeId, PlaceConfig config, ZoneSummary summary)
+ // from interface ZoneService.ZoneMoveListener
+ public void moveSucceeded (int placeId, PlaceConfig config, ZoneSummary summary)
{
if (_summary != null) {
// keep track of our previous zone info
_previousZoneId = _summary.zoneId;
}
-
+
// keep track of the summary
_summary = summary;
@@ -192,14 +182,9 @@ public class ZoneDirector extends BasicDirector
notifyObservers(summary);
}
- /**
- * Called in response to a successful {@link ZoneService#moveTo}
- * request when our cached scene was out of date and the server
- * determined that we needed some updates.
- */
+ // from interface ZoneService.ZoneMoveListener
public void moveSucceededWithUpdates (
- int placeId, PlaceConfig config, ZoneSummary summary,
- SceneUpdate[] updates)
+ int placeId, PlaceConfig config, ZoneSummary summary, SceneUpdate[] updates)
{
// keep track of the summary
_summary = summary;
@@ -211,11 +196,7 @@ public class ZoneDirector extends BasicDirector
notifyObservers(summary);
}
- /**
- * Called in response to a successful {@link ZoneService#moveTo}
- * request when our cached scene was out of date and the server
- * determined that we needed an updated copy.
- */
+ // from interface ZoneService.ZoneMoveListener
public void moveSucceededWithScene (
int placeId, PlaceConfig config, ZoneSummary summary, SceneModel model)
{
@@ -229,9 +210,7 @@ public class ZoneDirector extends BasicDirector
notifyObservers(summary);
}
- /**
- * Called in response to a failed zoned moveTo request.
- */
+ // from interface ZoneService.ZoneMoveListener
public void requestFailed (String reason)
{
// let the scene director cope
@@ -261,29 +240,28 @@ public class ZoneDirector extends BasicDirector
moveTo(zoneId, sceneId, null);
}
- /**
- * Called when something breaks down after successfully completely a
- * moveTo request.
- */
- public void recoverMoveTo (int sceneId)
+ // from SceneDirector.MoveHandler
+ public void recoverMoveTo (int previousSceneId)
{
- if (_previousZoneId != -1) {
- moveTo(_previousZoneId, sceneId);
+ if (_summary != null) {
+ return; // if we're currently somewhere, just stay there
+ }
+ // otherwise if we were previously in a zone/scene, try going back there
+ if (_previousZoneId != -1) {
+ moveTo(_previousZoneId, previousSceneId);
} else {
- _scdir.moveTo(sceneId);
+ _scdir.moveTo(previousSceneId);
}
}
/**
- * Notifies observers of success or failure, depending on the type of
- * object provided as data.
+ * Notifies observers of success or failure, depending on the type of object provided as data.
*/
protected void notifyObservers (Object data)
{
// let our observers know that all is well on the western front
- for (int i = 0; i < _observers.size(); i++) {
- ZoneObserver obs = (ZoneObserver)_observers.get(i);
+ for (ZoneObserver obs : _observers) {
try {
if (data instanceof Integer) {
obs.zoneWillChange(((Integer)data).intValue());
@@ -294,8 +272,8 @@ public class ZoneDirector extends BasicDirector
}
} catch (Throwable t) {
- Log.warning("Zone observer choked during notification " +
- "[data=" + data + ", obs=" + obs + "].");
+ Log.warning("Zone observer choked during notification [data=" + data +
+ ", obs=" + obs + "].");
Log.logStackTrace(t);
}
}
@@ -310,12 +288,11 @@ public class ZoneDirector extends BasicDirector
/** Provides access to zone services. */
protected ZoneService _zservice;
- /** A reference to the zone summary for the currently occupied
- * zone. */
+ /** A reference to the zone summary for the currently occupied zone. */
protected ZoneSummary _summary;
/** Our zone observer list. */
- protected ArrayList _observers = new ArrayList();
+ protected ArrayList _observers = new ArrayList();
/** Our previous zone id. */
protected int _previousZoneId = -1;
diff --git a/src/java/com/threerings/whirled/zone/client/ZoneService.java b/src/java/com/threerings/whirled/zone/client/ZoneService.java
index fa202170..afebb11e 100644
--- a/src/java/com/threerings/whirled/zone/client/ZoneService.java
+++ b/src/java/com/threerings/whirled/zone/client/ZoneService.java
@@ -38,11 +38,22 @@ public interface ZoneService extends InvocationService
/** Used to deliver responses to {@link #moveTo} requests. */
public static interface ZoneMoveListener extends InvocationListener
{
+ /**
+ * Called in response to a successful {@link #moveTo} request.
+ */
public void moveSucceeded (int placeId, PlaceConfig config, ZoneSummary summary);
- public void moveSucceededWithUpdates (
- int placeId, PlaceConfig config, ZoneSummary summary, SceneUpdate[] updates);
+ /**
+ * Called in response to a successful {@link #moveTo} request when our cached scene was out
+ * of date and the server determined that we needed some updates.
+ */
+ public void moveSucceededWithUpdates (
+ int placeId, PlaceConfig config, ZoneSummary summary, SceneUpdate[] updates);
+ /**
+ * Called in response to a successful {@link #moveTo} request when our cached scene was out
+ * of date and the server determined that we needed an updated copy.
+ */
public void moveSucceededWithScene (
int placeId, PlaceConfig config, ZoneSummary summary, SceneModel model);
}