From 53be9a74ca513fd5571eca3a230b8b17b2b551b6 Mon Sep 17 00:00:00 2001 From: Michael Bayne Date: Tue, 22 Feb 2005 18:54:48 +0000 Subject: [PATCH] Added more sanity checking to portal traversal to avoid spurious error messages if repeat requests come in or for some reason the client and server ever differ in opinion as to which scene the player is in. git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@3363 542714f4-19e9-0310-aa3c-eee0fc999fb1 --- .../spot/client/SpotSceneDirector.java | 19 +++++++++++++++++-- .../whirled/spot/client/SpotService.java | 4 +++- .../whirled/spot/data/SpotMarshaller.java | 10 +++++----- .../whirled/spot/server/SpotDispatcher.java | 4 ++-- .../whirled/spot/server/SpotProvider.java | 13 ++++++++++--- 5 files changed, 37 insertions(+), 13 deletions(-) diff --git a/src/java/com/threerings/whirled/spot/client/SpotSceneDirector.java b/src/java/com/threerings/whirled/spot/client/SpotSceneDirector.java index 0ad1e8afb..4fde28293 100644 --- a/src/java/com/threerings/whirled/spot/client/SpotSceneDirector.java +++ b/src/java/com/threerings/whirled/spot/client/SpotSceneDirector.java @@ -43,6 +43,7 @@ import com.threerings.crowd.data.PlaceObject; import com.threerings.whirled.client.SceneDirector; import com.threerings.whirled.data.SceneModel; +import com.threerings.whirled.data.ScenedBodyObject; import com.threerings.whirled.util.WhirledContext; import com.threerings.whirled.spot.Log; @@ -133,6 +134,18 @@ public class SpotSceneDirector extends BasicDirector return false; } + // sanity check the server's notion of what scene we're in with + // our notion of it + int sceneId = _scdir.getScene().getId(); + ScenedBodyObject sbobj = (ScenedBodyObject) + _ctx.getClient().getClientObject(); + if (sceneId != sbobj.getSceneId()) { + Log.warning("Client and server differ in opinion of what scene " + + "we're in [sSceneId=" + sbobj.getSceneId() + + ", cSceneId=" + sceneId + "]."); + return false; + } + // find the portal they're talking about Portal dest = scene.getPortal(portalId); if (dest == null) { @@ -159,8 +172,10 @@ public class SpotSceneDirector extends BasicDirector } // issue a traversePortal request - Log.info("Issuing traversePortal(" + dest + ", " + sceneVer + ")."); - _sservice.traversePortal(_ctx.getClient(), portalId, sceneVer, _scdir); + Log.info("Issuing traversePortal(" + + sceneId + ", " + dest + ", " + sceneVer + ")."); + _sservice.traversePortal( + _ctx.getClient(), sceneId, portalId, sceneVer, _scdir); return true; } diff --git a/src/java/com/threerings/whirled/spot/client/SpotService.java b/src/java/com/threerings/whirled/spot/client/SpotService.java index 79e30b572..13560575d 100644 --- a/src/java/com/threerings/whirled/spot/client/SpotService.java +++ b/src/java/com/threerings/whirled/spot/client/SpotService.java @@ -38,12 +38,14 @@ public interface SpotService extends InvocationService /** * Requests to traverse the specified portal. * + * @param sceneId the player's current scene which is used to sanity + * check things when the request actually arrives. * @param portalId the portal to be traversed. * @param destSceneVer the version of the destination scene data that * the client has in its local repository. */ public void traversePortal ( - Client client, int portalId, int destSceneVer, + Client client, int sceneId, int portalId, int destSceneVer, SceneMoveListener listener); /** diff --git a/src/java/com/threerings/whirled/spot/data/SpotMarshaller.java b/src/java/com/threerings/whirled/spot/data/SpotMarshaller.java index 322128a32..f8d63c7c6 100644 --- a/src/java/com/threerings/whirled/spot/data/SpotMarshaller.java +++ b/src/java/com/threerings/whirled/spot/data/SpotMarshaller.java @@ -2,7 +2,7 @@ // $Id$ // // Narya library - tools for developing networked games -// Copyright (C) 2002-2004 Three Rings Design, Inc., All Rights Reserved +// Copyright (C) 2002-2005 Three Rings Design, Inc., All Rights Reserved // http://www.threerings.net/code/narya/ // // This library is free software; you can redistribute it and/or modify it @@ -81,12 +81,12 @@ public class SpotMarshaller extends InvocationMarshaller public static final int TRAVERSE_PORTAL = 4; // documentation inherited from interface - public void traversePortal (Client arg1, int arg2, int arg3, SceneService.SceneMoveListener arg4) + public void traversePortal (Client arg1, int arg2, int arg3, int arg4, SceneService.SceneMoveListener arg5) { - SceneMarshaller.SceneMoveMarshaller listener4 = new SceneMarshaller.SceneMoveMarshaller(); - listener4.listener = arg4; + SceneMarshaller.SceneMoveMarshaller listener5 = new SceneMarshaller.SceneMoveMarshaller(); + listener5.listener = arg5; sendRequest(arg1, TRAVERSE_PORTAL, new Object[] { - new Integer(arg2), new Integer(arg3), listener4 + new Integer(arg2), new Integer(arg3), new Integer(arg4), listener5 }); } diff --git a/src/java/com/threerings/whirled/spot/server/SpotDispatcher.java b/src/java/com/threerings/whirled/spot/server/SpotDispatcher.java index 05148252b..604cb00f0 100644 --- a/src/java/com/threerings/whirled/spot/server/SpotDispatcher.java +++ b/src/java/com/threerings/whirled/spot/server/SpotDispatcher.java @@ -2,7 +2,7 @@ // $Id$ // // Narya library - tools for developing networked games -// Copyright (C) 2002-2004 Three Rings Design, Inc., All Rights Reserved +// Copyright (C) 2002-2005 Three Rings Design, Inc., All Rights Reserved // http://www.threerings.net/code/narya/ // // This library is free software; you can redistribute it and/or modify it @@ -83,7 +83,7 @@ public class SpotDispatcher extends InvocationDispatcher case SpotMarshaller.TRAVERSE_PORTAL: ((SpotProvider)provider).traversePortal( source, - ((Integer)args[0]).intValue(), ((Integer)args[1]).intValue(), (SceneService.SceneMoveListener)args[2] + ((Integer)args[0]).intValue(), ((Integer)args[1]).intValue(), ((Integer)args[2]).intValue(), (SceneService.SceneMoveListener)args[3] ); return; diff --git a/src/java/com/threerings/whirled/spot/server/SpotProvider.java b/src/java/com/threerings/whirled/spot/server/SpotProvider.java index 655306a29..c4d34a767 100644 --- a/src/java/com/threerings/whirled/spot/server/SpotProvider.java +++ b/src/java/com/threerings/whirled/spot/server/SpotProvider.java @@ -1,5 +1,5 @@ // -// $Id: SpotProvider.java,v 1.25 2004/08/27 02:20:47 mdb Exp $ +// $Id$ // // Narya library - tools for developing networked games // Copyright (C) 2002-2004 Three Rings Design, Inc., All Rights Reserved @@ -77,11 +77,18 @@ public class SpotProvider /** * Processes a {@link SpotService#traversePortal} request. */ - public void traversePortal (ClientObject caller, int portalId, + public void traversePortal (ClientObject caller, int sceneId, int portalId, int destSceneVer, SceneMoveListener listener) throws InvocationException { - int sceneId = getCallerSceneId(caller); + // 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 + "]."); + return; + } // avoid cluttering up the method declaration with final keywords final BodyObject fsource = (BodyObject)caller;