package net.cis.client.game.common.model.co;
import net.cis.client.game.common.ctrl.IDispatcher;
import net.cis.client.game.common.ctrl.IGameApplication;
import net.cis.client.game.common.model.ai.AINode;
import net.cis.client.game.common.model.event.ObjectEvent;
import net.cis.client.game.common.model.event.types.ObjectAwareEventType;
import net.cis.client.game.common.util.GlobalObjectStore;
import net.cis.common.model.base.AbstractNamedEntity;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.jme3.scene.Node;
public abstract class AbstractControlledObject<DO extends AbstractNamedEntity, SO>
{
protected final Log log;
public final DO dataObject;
protected SO sceneObject = null;
protected boolean addedToScene = false;
protected String debugDisplay = null;
protected AINode ai;
protected Node sceneNode;
public AbstractControlledObject(DO dataObject) {
this.dataObject = dataObject;
log = LogFactory.getLog(getClass());
}
public final void loadSceneObject()
{
if(isLoaded())
return;
log.trace("Loading scene object for " + this);
internalLoadSceneObject();
}
public final void unloadSceneObject()
{
if(!isLoaded())
return;
log.trace("Unloading scene object for " + this);
internalUnLoadSceneObject();
sceneObject = null;
}
public final void addToScene(IGameApplication simpleApp)
{
if(addedToScene)
return;
log.trace("Adding object to scene " + this);
addedToScene = internalAddToScene(simpleApp);
if(!addedToScene)
return;
if(this.dataObject == null)
log.error("DataObject is null for " + this);
else
GlobalObjectStore.<IDispatcher>getObject(IDispatcher.class).publish(new ObjectEvent(new ObjectAwareEventType("ObjectAddedToScene", this.dataObject.getId()), this));
}
public final void removeFromScene(IGameApplication simpleApp)
{
if(!addedToScene)
return;
log.trace("Removing object from scene " + this);
addedToScene = !internalRemoveFromScene(simpleApp);
if(addedToScene)
return;
if(this.dataObject == null)
log.error("DataObject is null for " + this);
else
GlobalObjectStore.<IDispatcher>getObject(IDispatcher.class).publish(new ObjectEvent(new ObjectAwareEventType("ObjectRemovedFromScene", this.dataObject.getId()), this));
}
public final void destroy()
{
if(addedToScene)
log.error("Object about to be destroyed, still in scene: " + this);
log.trace("Destroying object " + this);
if(this.dataObject == null)
log.error("DataObject is null for " + this);
else
GlobalObjectStore.<IDispatcher>getObject(IDispatcher.class).publish(new ObjectEvent(new ObjectAwareEventType("ObjectDestroyed", this.dataObject.getId()), this));
internalDestroy();
}
protected abstract void internalLoadSceneObject();
protected void internalUnLoadSceneObject(){};
protected abstract boolean internalAddToScene(IGameApplication simpleApp);
protected abstract boolean internalRemoveFromScene(IGameApplication simpleApp);
protected void internalDestroy(){};
public boolean isAddedToScene()
{
return addedToScene;
}
public SO getSceneObject() {
if (!isLoaded())
loadSceneObject();
return sceneObject;
}
public boolean isLoaded() {
return sceneObject != null;
}
@Override
public String toString()
{
String s = "";
if(dataObject == null)
s += "noData";
else
{
s += dataObject.getClass().getSimpleName();
if(dataObject instanceof AbstractNamedEntity)
s += ((AbstractNamedEntity)dataObject).getName();
}
s += "(ID:" + (dataObject == null ? "?" : dataObject.getId()) + ", AI:"+(ai!=null)+", L:"+isLoaded()+", InScene:"+isAddedToScene()+"): ";
s += sceneObject;
return s;
}
public String getDebugDisplay()
{
if(debugDisplay != null)
return debugDisplay;
else
return this.toString();
}
public void setDebugDisplay(String s)
{
debugDisplay =s;
}
public Node getSceneNode()
{
return this.sceneNode;
}
public void setSceneNode(Node sceneNode)
{
this.sceneNode = sceneNode;
}
public AINode getAINode()
{
return this.ai;
}
public void setAINode(AINode ai)
{
this.ai = ai;
}
}