//------------------------------------------------------------------------------------- PyObject* Cellapp::__py_createEntity(PyObject* self, PyObject* args) { PyObject* params = NULL; char* entityType = NULL; SPACE_ID spaceID; PyObject* position, *direction; if(!PyArg_ParseTuple(args, "s|I|O|O|O", &entityType, &spaceID, &position, &direction, ¶ms)) { PyErr_Format(PyExc_TypeError, "KBEngine::createEntity: args is error! args[scriptName, spaceID, position, direction, states]."); PyErr_PrintEx(0); S_Return; } if(entityType == NULL || strlen(entityType) == 0) { PyErr_Format(PyExc_TypeError, "KBEngine::createEntity: entityType is NULL."); PyErr_PrintEx(0); S_Return; } Space* space = Spaces::findSpace(spaceID); if(space == NULL) { PyErr_Format(PyExc_TypeError, "KBEngine::createEntity: spaceID %ld not found.", spaceID); PyErr_PrintEx(0); S_Return; } // 创建entity Entity* pEntity = Cellapp::getSingleton().createEntityCommon(entityType, params, false, 0); if(pEntity != NULL) { Py_INCREF(pEntity); pEntity->initializeEntity(params); pEntity->pySetPosition(position); pEntity->pySetDirection(direction); // 添加到space space->addEntity(pEntity); } //Py_XDECREF(params); return pEntity; }
//------------------------------------------------------------------------------------- void FMH_Baseapp_onEntityGetCellFrom_onCreateInNewSpaceFromBaseapp::process() { KBE_ASSERT(_e != NULL); Space* space = Spaces::findSpace(_spaceID); if(space == NULL) { ERROR_MSG(boost::format("FMH_Baseapp_onEntityGetCell::process: not found space(%1%), %2% %3%.\n") % _spaceID % _e->getScriptName() % _e->getID()); return; } // Ìí¼Óµ½space space->addEntity(_e); _e->initializeEntity(params_); Py_XDECREF(params_); }
//------------------------------------------------------------------------------------- void Entity::teleport(PyObject_ptr nearbyMBRef, Position3D& pos, Direction3D& dir) { SPACE_ID lastSpaceID = this->getSpaceID(); // 如果为None则是entity自己想在本space上跳转到某位置 if(nearbyMBRef == Py_None) { this->setPositionAndDirection(pos, dir); } else { //EntityMailbox* mb = NULL; SPACE_ID spaceID = 0; // 如果是entity则一定是在本cellapp上, 可以直接进行操作 if(PyObject_TypeCheck(nearbyMBRef, Entity::getScriptType())) { Entity* entity = static_cast<Entity*>(nearbyMBRef); spaceID = entity->getSpaceID(); if(spaceID == this->getSpaceID()) { this->setPositionAndDirection(pos, dir); onTeleportSuccess(nearbyMBRef, lastSpaceID); } else { this->setPositionAndDirection(pos, dir); Space* currspace = Spaces::findSpace(this->getSpaceID()); Space* space = Spaces::findSpace(spaceID); currspace->removeEntity(this); space->addEntity(this); onTeleportSuccess(nearbyMBRef, lastSpaceID); } } else { if(PyObject_TypeCheck(nearbyMBRef, EntityMailbox::getScriptType())) { } } } }
//------------------------------------------------------------------------------------- void Entity::teleportFromBaseapp(Mercury::Channel* pChannel, COMPONENT_ID cellAppID, ENTITY_ID targetEntityID, COMPONENT_ID sourceBaseAppID) { DEBUG_MSG(boost::format("%1%::teleportFromBaseapp: %2%, targetEntityID=%3%, cell=%4%, sourceBaseAppID=%5%.\n") % this->getScriptName() % this->getID() % targetEntityID % cellAppID % sourceBaseAppID); SPACE_ID lastSpaceID = this->getSpaceID(); // 如果不在一个cell上 if(cellAppID != g_componentID) { Components::ComponentInfos* cinfos = Components::getSingleton().findComponent(cellAppID); if(cinfos == NULL || cinfos->pChannel == NULL) { ERROR_MSG(boost::format("%1%::teleportFromBaseapp: %2%, teleport is error, not found cellapp, targetEntityID, cellAppID=%3%.\n") % this->getScriptName() % this->getID() % targetEntityID % cellAppID); _sendBaseTeleportResult(this->getID(), sourceBaseAppID, 0, lastSpaceID); return; } } else { Entity* entity = Cellapp::getSingleton().findEntity(targetEntityID); if(entity == NULL || entity->isDestroyed()) { ERROR_MSG(boost::format("%1%::teleportFromBaseapp: %2%, can't found targetEntity(%3%).\n") % this->getScriptName() % this->getID() % targetEntityID); _sendBaseTeleportResult(this->getID(), sourceBaseAppID, 0, lastSpaceID); return; } // 找到space SPACE_ID spaceID = entity->getSpaceID(); // 如果是不同space跳转 if(spaceID != this->getSpaceID()) { Space* space = Spaces::findSpace(spaceID); if(space == NULL) { ERROR_MSG(boost::format("%1%::teleportFromBaseapp: %2%, can't found space(%3%).\n") % this->getScriptName() % this->getID() % spaceID); _sendBaseTeleportResult(this->getID(), sourceBaseAppID, 0, lastSpaceID); return; } Space* currspace = Spaces::findSpace(this->getSpaceID()); currspace->removeEntity(this); space->addEntity(this); _sendBaseTeleportResult(this->getID(), sourceBaseAppID, spaceID, lastSpaceID); } else { WARNING_MSG(boost::format("%1%::teleportFromBaseapp: %2% targetSpace(%3%) == currSpaceID(%4%).\n") % this->getScriptName() % this->getID() % spaceID % this->getSpaceID()); _sendBaseTeleportResult(this->getID(), sourceBaseAppID, spaceID, lastSpaceID); } } }