int ScriptObject::CreateWavefrontModel(float x, float y, float z, std::string path, std::string filename)
{
    Object *object = new DreiDObject(_objectIndex,x,y,z);
    std::string dPath = GetPath() + path;
    object->To3D()->LoadObjModelData(dPath.c_str(), filename.c_str());
    return _AddObject(object);
}
bool SpatialIndexManager::_AddObject(Object *newObject)
{
    uint32 finalBucket = getGrid()->AddObject(newObject);

    //DLOG(info) << "SpatialIndexManager::AddObject :: Object " << newObject->getId() << " added to bucket " <<  finalBucket;

    if(finalBucket == 0xffffffff)    {
        DLOG(info) << "SpatialIndexManager::AddObject :: Object " << newObject->getId() << " could not be added to the bucket because the bucket was invalid " <<  finalBucket;
        return false;
    }

	if(newObject->getType() == ObjType_Player)	{
		//enforce proper handling of players!!
		PlayerObject* player = static_cast<PlayerObject*>(newObject);
		_AddObject(player);
	}
   
	//get all Players in range and register as necessary

    ObjectListType playerList;
    getGrid()->GetPlayerViewingRangeCellContents(finalBucket, &playerList);

    for(ObjectListType::iterator i = playerList.begin(); i != playerList.end(); i++)    {
        PlayerObject* otherPlayer = static_cast<PlayerObject*>((*i));
        sendCreateObject(newObject,otherPlayer, false);

        if((newObject->getType() == ObjType_Creature) || (newObject->getType() == ObjType_NPC))	{
            gContainerManager->registerPlayerToContainer(newObject, otherPlayer);
        }
    }

    return true;
}
void SpatialIndexManager::UpdateObject(Object *updateObject)
{

    uint32 oldBucket = updateObject->getGridBucket();
    uint32 newBucket = getGrid()->getCellId(updateObject->getWorldPosition().x, updateObject->getWorldPosition().z);

    // now process the spatial index update
    if(newBucket != oldBucket)	{
        DLOG(info) << "ContainerManager::UpdateObject :: " << updateObject->getId() <<"normal movement from bucket" << oldBucket << " to bucket" << newBucket;
        
        // test how much we moved if only one grid proceed normally
        if((newBucket == (oldBucket +1)) || (newBucket == (oldBucket -1)) ||
           (newBucket == (oldBucket + GRIDWIDTH)) || (newBucket == (oldBucket - GRIDWIDTH))	 ||
           (newBucket == (oldBucket + GRIDWIDTH +1)) || (newBucket == (oldBucket + GRIDWIDTH -1)) ||
           (newBucket == (oldBucket - GRIDWIDTH +1)) || (newBucket == (oldBucket - GRIDWIDTH -1)))	{
            // sets the new gridcell, updates subcells
            getGrid()->UpdateObject(updateObject);

            // remove us from the row we left
            _UpdateBackCells(updateObject,oldBucket);

            // create us for the row in which direction we moved
            _UpdateFrontCells(updateObject,oldBucket);
        } else {
            // we teleported destroy all and create everything new
            DLOG(info) << "ContainerManager::UpdateObject :: " << updateObject->getId() <<"teleportation from bucket" << oldBucket << " to bucket" << newBucket;

            // remove us from everything
            RemoveObjectFromWorld(updateObject);

            // sets the new gridcell, updates subcells
            getGrid()->AddObject(updateObject);

            // and add us freshly to the world
            _AddObject(updateObject);
        }
    }
    
    // Make sure to update any regions the object may be entering or leaving.
    getGrid()->updateRegions(updateObject);
}
int ScriptObject::CreateLoadingObject(float x, float y, float z, float sx, float sy, uint16 texture, bool depth)
{
    Object *object = new LoadingObject(_objectIndex, x, y, z, sx, sy, texture, depth);
    return _AddObject(object);
}
///- Objects
int ScriptObject::CreateObject(float x, float y, float z, float sx, float sy, uint16 tex, bool depth, bool ortho, bool clickable)
{
    Object *object = new PlanarObject(_objectIndex, x, y, z, sx, sy, tex, depth, ortho, clickable);
    return _AddObject(object);
}