Added support for dispatching scene updates made to the currently occupied
scene. git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@2649 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
@@ -1,18 +1,73 @@
|
|||||||
//
|
//
|
||||||
// $Id: SceneController.java,v 1.1 2001/11/12 20:56:55 mdb Exp $
|
// $Id: SceneController.java,v 1.2 2003/06/11 04:14:11 mdb Exp $
|
||||||
|
|
||||||
package com.threerings.whirled.client;
|
package com.threerings.whirled.client;
|
||||||
|
|
||||||
|
import com.threerings.presents.dobj.MessageEvent;
|
||||||
|
import com.threerings.presents.dobj.MessageListener;
|
||||||
|
|
||||||
import com.threerings.crowd.client.PlaceController;
|
import com.threerings.crowd.client.PlaceController;
|
||||||
|
import com.threerings.crowd.data.PlaceConfig;
|
||||||
|
import com.threerings.crowd.data.PlaceObject;
|
||||||
|
import com.threerings.crowd.util.CrowdContext;
|
||||||
|
|
||||||
|
import com.threerings.whirled.data.SceneCodes;
|
||||||
|
import com.threerings.whirled.data.SceneUpdate;
|
||||||
|
import com.threerings.whirled.util.WhirledContext;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The base scene controller class. It is expected that users of the
|
* The base scene controller class. It is expected that users of the
|
||||||
* Whirled services will extend this controller class when creating
|
* Whirled services will extend this controller class when creating
|
||||||
* specialized controllers for their scenes. Presently there are no basic
|
* specialized controllers for their scenes.
|
||||||
* scene services provided by this controller, but its existence affords
|
|
||||||
* the addition of such services should they become necessary in the
|
|
||||||
* future.
|
|
||||||
*/
|
*/
|
||||||
public abstract class SceneController extends PlaceController
|
public abstract class SceneController extends PlaceController
|
||||||
{
|
{
|
||||||
|
// documentation inherited
|
||||||
|
public void init (CrowdContext ctx, PlaceConfig config)
|
||||||
|
{
|
||||||
|
super.init(ctx, config);
|
||||||
|
_ctx = (WhirledContext)ctx;
|
||||||
|
}
|
||||||
|
|
||||||
|
// documentation inherited
|
||||||
|
public void willEnterPlace (PlaceObject plobj)
|
||||||
|
{
|
||||||
|
super.willEnterPlace(plobj);
|
||||||
|
plobj.addListener(_updateListener);
|
||||||
|
}
|
||||||
|
|
||||||
|
// documentation inherited
|
||||||
|
public void didLeavePlace (PlaceObject plobj)
|
||||||
|
{
|
||||||
|
super.didLeavePlace(plobj);
|
||||||
|
plobj.removeListener(_updateListener);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method is called if a scene update is recorded while we
|
||||||
|
* currently occupy a scene. The default implementation will update
|
||||||
|
* our local scene and scene model, but derived classes will likely
|
||||||
|
* want to ensure that the update is properly displayed.
|
||||||
|
*/
|
||||||
|
protected void sceneUpdated (SceneUpdate update)
|
||||||
|
{
|
||||||
|
// apply the update to the scene
|
||||||
|
_ctx.getSceneDirector().getScene().updateReceived(update);
|
||||||
|
|
||||||
|
// we don't persistify these updates in this circumstance, but
|
||||||
|
// next time we come to this scene we'll redownload the update and
|
||||||
|
// apply it to the repository; as the updates are meant to be very
|
||||||
|
// small, this shouldn't be horribly less efficient
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Used to listen for scene updates. */
|
||||||
|
protected MessageListener _updateListener = new MessageListener() {
|
||||||
|
public void messageReceived (MessageEvent event) {
|
||||||
|
if (event.getName().equals(SceneCodes.SCENE_UPDATE)) {
|
||||||
|
sceneUpdated((SceneUpdate)event.getArgs()[0]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
protected WhirledContext _ctx;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
//
|
//
|
||||||
// $Id: Scene.java,v 1.8 2003/02/12 07:23:31 mdb Exp $
|
// $Id: Scene.java,v 1.9 2003/06/11 04:14:11 mdb Exp $
|
||||||
|
|
||||||
package com.threerings.whirled.data;
|
package com.threerings.whirled.data;
|
||||||
|
|
||||||
@@ -50,6 +50,14 @@ public interface Scene
|
|||||||
*/
|
*/
|
||||||
public void setVersion (int version);
|
public void setVersion (int version);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called to inform the scene that an update has been received while
|
||||||
|
* the scene was resolved and active. The update should be applied to
|
||||||
|
* the underlying scene model and any derivative data should be
|
||||||
|
* appropriately updated.
|
||||||
|
*/
|
||||||
|
public void updateReceived (SceneUpdate update);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the scene model from which this scene was created.
|
* Returns the scene model from which this scene was created.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
//
|
//
|
||||||
// $Id: SceneCodes.java,v 1.3 2002/08/14 19:07:57 mdb Exp $
|
// $Id: SceneCodes.java,v 1.4 2003/06/11 04:14:11 mdb Exp $
|
||||||
|
|
||||||
package com.threerings.whirled.data;
|
package com.threerings.whirled.data;
|
||||||
|
|
||||||
@@ -11,4 +11,6 @@ import com.threerings.whirled.client.SceneDirector;
|
|||||||
*/
|
*/
|
||||||
public interface SceneCodes extends LocationCodes
|
public interface SceneCodes extends LocationCodes
|
||||||
{
|
{
|
||||||
|
/** The message identifier for scene update messages. */
|
||||||
|
public static final String SCENE_UPDATE = "scene_update";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
//
|
//
|
||||||
// $Id: SceneImpl.java,v 1.1 2003/02/12 07:23:31 mdb Exp $
|
// $Id: SceneImpl.java,v 1.2 2003/06/11 04:14:11 mdb Exp $
|
||||||
|
|
||||||
package com.threerings.whirled.data;
|
package com.threerings.whirled.data;
|
||||||
|
|
||||||
import com.threerings.crowd.data.PlaceConfig;
|
import com.threerings.crowd.data.PlaceConfig;
|
||||||
import com.threerings.whirled.data.SceneModel;
|
|
||||||
|
import com.threerings.whirled.Log;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An implementation of the {@link Scene} interface.
|
* An implementation of the {@link Scene} interface.
|
||||||
@@ -72,6 +73,20 @@ public class SceneImpl implements Scene
|
|||||||
_model.version = version;
|
_model.version = version;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// documentation inherited from interface
|
||||||
|
public void updateReceived (SceneUpdate update)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
// validate and apply the update
|
||||||
|
update.validate(_model);
|
||||||
|
update.apply(_model);
|
||||||
|
} catch (Exception e) {
|
||||||
|
Log.warning("Error applying update [scene=" + this +
|
||||||
|
", update=" + update + "].");
|
||||||
|
Log.logStackTrace(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// documentation inherited from interface
|
// documentation inherited from interface
|
||||||
public SceneModel getSceneModel ()
|
public SceneModel getSceneModel ()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
//
|
//
|
||||||
// $Id: SceneManager.java,v 1.13 2003/06/11 02:48:07 mdb Exp $
|
// $Id: SceneManager.java,v 1.14 2003/06/11 04:14:11 mdb Exp $
|
||||||
|
|
||||||
package com.threerings.whirled.server;
|
package com.threerings.whirled.server;
|
||||||
|
|
||||||
@@ -10,6 +10,7 @@ import com.threerings.presents.util.Invoker;
|
|||||||
|
|
||||||
import com.threerings.whirled.Log;
|
import com.threerings.whirled.Log;
|
||||||
import com.threerings.whirled.data.Scene;
|
import com.threerings.whirled.data.Scene;
|
||||||
|
import com.threerings.whirled.data.SceneCodes;
|
||||||
import com.threerings.whirled.data.SceneModel;
|
import com.threerings.whirled.data.SceneModel;
|
||||||
import com.threerings.whirled.data.SceneUpdate;
|
import com.threerings.whirled.data.SceneUpdate;
|
||||||
import com.threerings.whirled.server.WhirledServer;
|
import com.threerings.whirled.server.WhirledServer;
|
||||||
@@ -134,7 +135,8 @@ public class SceneManager extends PlaceManager
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// TODO: broadcast the update to all occupants of the scene
|
// broadcast the update to all occupants of the scene
|
||||||
|
_plobj.postMessage(SceneCodes.SCENE_UPDATE, new Object[] { update });
|
||||||
}
|
}
|
||||||
|
|
||||||
// documentation inherited
|
// documentation inherited
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
//
|
//
|
||||||
// $Id: SpotSceneImpl.java,v 1.1 2003/02/12 07:23:31 mdb Exp $
|
// $Id: SpotSceneImpl.java,v 1.2 2003/06/11 04:14:11 mdb Exp $
|
||||||
|
|
||||||
package com.threerings.whirled.spot.data;
|
package com.threerings.whirled.spot.data;
|
||||||
|
|
||||||
@@ -23,7 +23,12 @@ public class SpotSceneImpl
|
|||||||
public SpotSceneImpl (SpotSceneModel smodel)
|
public SpotSceneImpl (SpotSceneModel smodel)
|
||||||
{
|
{
|
||||||
_smodel = smodel;
|
_smodel = smodel;
|
||||||
|
readPortals();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void readPortals ()
|
||||||
|
{
|
||||||
|
_portals.clear();
|
||||||
for (int ii = 0, ll = _smodel.portals.length; ii < ll; ii++) {
|
for (int ii = 0, ll = _smodel.portals.length; ii < ll; ii++) {
|
||||||
Portal port = _smodel.portals[ii];
|
Portal port = _smodel.portals[ii];
|
||||||
_portals.put(port.portalId, port);
|
_portals.put(port.portalId, port);
|
||||||
@@ -110,6 +115,15 @@ public class SpotSceneImpl
|
|||||||
_smodel.defaultEntranceId = (portal == null) ? -1 : portal.portalId;
|
_smodel.defaultEntranceId = (portal == null) ? -1 : portal.portalId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This should be called if a scene update was received that caused
|
||||||
|
* our underlying scene model to change.
|
||||||
|
*/
|
||||||
|
public void updateReceived ()
|
||||||
|
{
|
||||||
|
readPortals();
|
||||||
|
}
|
||||||
|
|
||||||
/** A casted reference to our scene model. */
|
/** A casted reference to our scene model. */
|
||||||
protected SpotSceneModel _smodel;
|
protected SpotSceneModel _smodel;
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
//
|
//
|
||||||
// $Id: UpdateList.java,v 1.1 2003/02/12 07:23:32 mdb Exp $
|
// $Id: UpdateList.java,v 1.2 2003/06/11 04:14:11 mdb Exp $
|
||||||
|
|
||||||
package com.threerings.whirled.util;
|
package com.threerings.whirled.util;
|
||||||
|
|
||||||
@@ -61,7 +61,7 @@ public class UpdateList
|
|||||||
*/
|
*/
|
||||||
public SceneUpdate[] getUpdates (int fromVersion)
|
public SceneUpdate[] getUpdates (int fromVersion)
|
||||||
{
|
{
|
||||||
if (fromVersion < _minVersion) {
|
if (_minVersion == -1 || fromVersion < _minVersion) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user