From 087f26b41b72fe116610f8a913d55f71360b6d9c Mon Sep 17 00:00:00 2001 From: Michael Bayne Date: Wed, 11 Jun 2003 02:48:07 +0000 Subject: [PATCH] Further work on dynamic scene updating. git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@2648 542714f4-19e9-0310-aa3c-eee0fc999fb1 --- .../com/threerings/whirled/data/SceneUpdate.java | 15 +++++++++------ .../threerings/whirled/server/SceneManager.java | 12 +++++++++++- .../threerings/whirled/server/SceneProvider.java | 11 +++++++++-- .../whirled/zone/server/ZoneProvider.java | 13 ++++++++++--- 4 files changed, 39 insertions(+), 12 deletions(-) diff --git a/src/java/com/threerings/whirled/data/SceneUpdate.java b/src/java/com/threerings/whirled/data/SceneUpdate.java index 05633ac5f..62d02f934 100644 --- a/src/java/com/threerings/whirled/data/SceneUpdate.java +++ b/src/java/com/threerings/whirled/data/SceneUpdate.java @@ -1,8 +1,9 @@ // -// $Id: SceneUpdate.java,v 1.1 2003/02/12 07:23:31 mdb Exp $ +// $Id: SceneUpdate.java,v 1.2 2003/06/11 02:48:07 mdb Exp $ package com.threerings.whirled.data; +import com.samskivert.util.StringUtil; import com.threerings.io.Streamable; import com.threerings.whirled.Log; @@ -12,18 +13,18 @@ import com.threerings.whirled.Log; * be stored persistently and sent to clients to update their own local * copies of scenes. */ -public abstract class SceneUpdate +public class SceneUpdate implements Streamable, Cloneable { /** - * Creates a scene update that will operate on a scene with the - * specified target scene and version number. + * Initializes this scene update such that it will operate on a scene + * with the specified target scene and version number. * * @param targetId the id of the scene on which we are to operate. * @param targetVersion the version of the scene on which we are to * operate. */ - public SceneUpdate (int targetId, int targetVersion) + public void init (int targetId, int targetVersion) { _targetId = targetId; _targetVersion = targetVersion; @@ -72,7 +73,7 @@ public abstract class SceneUpdate /** * Applies this update to the specified scene model. Derived classes * will want to override this method and apply updates of their own, - * being sure to call super.applyToScene. + * being sure to call super.apply. */ public void apply (SceneModel model) { @@ -104,6 +105,8 @@ public abstract class SceneUpdate { buf.append("sceneId=").append(_targetId); buf.append(", version=").append(_targetVersion); + buf.append(", "); + StringUtil.fieldsToString(buf, this); } /** The version number of the scene on which we operate. */ diff --git a/src/java/com/threerings/whirled/server/SceneManager.java b/src/java/com/threerings/whirled/server/SceneManager.java index 6036edf3c..6c729dba7 100644 --- a/src/java/com/threerings/whirled/server/SceneManager.java +++ b/src/java/com/threerings/whirled/server/SceneManager.java @@ -1,5 +1,5 @@ // -// $Id: SceneManager.java,v 1.12 2003/02/12 07:23:31 mdb Exp $ +// $Id: SceneManager.java,v 1.13 2003/06/11 02:48:07 mdb Exp $ package com.threerings.whirled.server; @@ -32,6 +32,14 @@ public class SceneManager extends PlaceManager return _scene; } + /** + * Returns {@link UpdateList#getUpdates} for this scene's updates. + */ + public SceneUpdate[] getUpdates (int fromVersion) + { + return _updates.getUpdates(fromVersion); + } + /** * Called by the scene registry once the scene manager has been * created (and initialized), but before it is started up. @@ -125,6 +133,8 @@ public class SceneManager extends PlaceManager return false; } }); + + // TODO: broadcast the update to all occupants of the scene } // documentation inherited diff --git a/src/java/com/threerings/whirled/server/SceneProvider.java b/src/java/com/threerings/whirled/server/SceneProvider.java index 99f55cd2d..59cf94d58 100644 --- a/src/java/com/threerings/whirled/server/SceneProvider.java +++ b/src/java/com/threerings/whirled/server/SceneProvider.java @@ -1,5 +1,5 @@ // -// $Id: SceneProvider.java,v 1.16 2003/04/17 19:17:07 mdb Exp $ +// $Id: SceneProvider.java,v 1.17 2003/06/11 02:48:07 mdb Exp $ package com.threerings.whirled.server; @@ -16,6 +16,7 @@ import com.threerings.whirled.Log; import com.threerings.whirled.client.SceneService.SceneMoveListener; import com.threerings.whirled.data.SceneCodes; import com.threerings.whirled.data.SceneModel; +import com.threerings.whirled.data.SceneUpdate; import com.threerings.whirled.data.ScenedBodyObject; /** @@ -106,7 +107,13 @@ public class SceneProvider // check to see if they need a newer version of the scene data SceneModel model = scmgr.getScene().getSceneModel(); if (sceneVersion < model.version) { - listener.moveSucceededWithScene(ploid, config, model); + // try getting updates + SceneUpdate[] updates = scmgr.getUpdates(sceneVersion); + if (updates != null) { + listener.moveSucceededWithUpdates(ploid, config, updates); + } else { + listener.moveSucceededWithScene(ploid, config, model); + } } else { listener.moveSucceeded(ploid, config); } diff --git a/src/java/com/threerings/whirled/zone/server/ZoneProvider.java b/src/java/com/threerings/whirled/zone/server/ZoneProvider.java index f8490ce1d..58787c829 100644 --- a/src/java/com/threerings/whirled/zone/server/ZoneProvider.java +++ b/src/java/com/threerings/whirled/zone/server/ZoneProvider.java @@ -1,5 +1,5 @@ // -// $Id: ZoneProvider.java,v 1.14 2003/02/12 07:23:32 mdb Exp $ +// $Id: ZoneProvider.java,v 1.15 2003/06/11 02:48:07 mdb Exp $ package com.threerings.whirled.zone.server; @@ -13,6 +13,7 @@ import com.threerings.crowd.data.PlaceObject; import com.threerings.crowd.server.LocationProvider; import com.threerings.whirled.data.SceneModel; +import com.threerings.whirled.data.SceneUpdate; import com.threerings.whirled.data.ScenedBodyObject; import com.threerings.whirled.server.SceneManager; import com.threerings.whirled.server.SceneRegistry; @@ -163,8 +164,14 @@ public class ZoneProvider // check to see if they need a newer version of the scene data SceneModel model = scmgr.getScene().getSceneModel(); if (sceneVersion < model.version) { - // then send the moveTo response - listener.moveSucceededWithScene(ploid, config, summary, model); + SceneUpdate[] updates = scmgr.getUpdates(sceneVersion); + if (updates != null) { + listener.moveSucceededWithUpdates( + ploid, config, summary, updates); + } else { + listener.moveSucceededWithScene( + ploid, config, summary, model); + } } else { // then send the moveTo response