diff --git a/src/java/com/threerings/stage/data/StageCodes.java b/src/java/com/threerings/stage/data/StageCodes.java index 065b87812..cb1320fbc 100644 --- a/src/java/com/threerings/stage/data/StageCodes.java +++ b/src/java/com/threerings/stage/data/StageCodes.java @@ -23,12 +23,14 @@ package com.threerings.stage.data; import com.threerings.util.MessageBundle; +import com.threerings.presents.data.InvocationCodes; + import com.threerings.crowd.data.BodyObject; /** * Codes and constants relating to the Stage system. */ -public interface StageCodes +public interface StageCodes extends InvocationCodes { /** The i18n bundle identifier for the Stage system. */ public static final String STAGE_MESSAGE_BUNDLE = "stage.general"; diff --git a/src/java/com/threerings/stage/util/PlacementConstraints.java b/src/java/com/threerings/stage/util/PlacementConstraints.java index 4127f2c82..e60c4e818 100644 --- a/src/java/com/threerings/stage/util/PlacementConstraints.java +++ b/src/java/com/threerings/stage/util/PlacementConstraints.java @@ -52,7 +52,10 @@ public class PlacementConstraints public void visit (ObjectInfo info) { ObjectData data = createObjectData(info); if (data != null) { - _objectData.put(info, data); + // clone the map key, as the visit method reuses a + // single ObjectInfo instance for uninteresting objects + // in a section + _objectData.put((ObjectInfo)info.clone(), data); } } }; @@ -122,11 +125,19 @@ public class PlacementConstraints ObjectData[] addedData = new ObjectData[added.length]; for (int i = 0; i < added.length; i++) { addedData[i] = createObjectData(added[i]); + if (addedData[i] == null) { + return INTERNAL_ERROR; + } } ObjectData[] removedData = new ObjectData[removed.length]; for (int i = 0; i < removed.length; i++) { removedData[i] = (ObjectData)_objectData.get(removed[i]); + if (removedData[i] == null) { + Log.warning("Couldn't match object info up to data [info=" + + removed[i] + "]."); + return INTERNAL_ERROR; + } } return allowModifyObjects(addedData, removedData);