package jadex.bdi.examples.cleanerworld; import jadex.application.space.envsupport.environment.IEnvironmentSpace; import jadex.application.space.envsupport.environment.ISpaceAction; import jadex.application.space.envsupport.environment.ISpaceObject; import jadex.application.space.envsupport.environment.space2d.Space2D; import jadex.application.space.envsupport.math.IVector1; import jadex.application.space.envsupport.math.IVector2; import jadex.application.space.envsupport.math.Vector1Double; import jadex.bridge.IComponentIdentifier; import jadex.commons.SimplePropertyObject; import java.util.Map; /** * Action for dropping a waste. */ public class DropWasteAction extends SimplePropertyObject implements ISpaceAction { protected static final IVector1 TOLERANCE = new Vector1Double(0.05); /** * Performs the action. * @param parameters parameters for the action * @param space the environment space * @return action return value */ public Object perform(Map parameters, IEnvironmentSpace space) { Space2D env = (Space2D)space; IComponentIdentifier owner = (IComponentIdentifier)parameters.get(ISpaceAction.ACTOR_ID); ISpaceObject wastebin = (ISpaceObject)parameters.get(ISpaceAction.OBJECT_ID); ISpaceObject waste = (ISpaceObject)parameters.get("waste"); ISpaceObject avatar = env.getAvatar(owner); assert avatar.getProperty("waste")!=null: avatar; if(env.getDistance((IVector2)wastebin.getProperty(Space2D.PROPERTY_POSITION), (IVector2)avatar.getProperty(Space2D.PROPERTY_POSITION)).greater(TOLERANCE)) throw new RuntimeException("Not near enough to wastebin: "+wastebin+" "+avatar); // System.out.println("drop: "+waste); if(((Boolean)wastebin.getProperty("full")).booleanValue()) throw new RuntimeException("Wastebin already full: "+wastebin+" "+avatar); int wastes = ((Integer)wastebin.getProperty("wastes")).intValue(); wastebin.setProperty("wastes", new Integer(wastes+1)); env.destroySpaceObject(waste.getId()); avatar.setProperty("waste", null); // System.out.println("pickup waste action "+parameters); return null; } }