//------------------------------------------------------------------------------------- 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 Base::onTeleportCB(Mercury::Channel* pChannel, SPACE_ID spaceID) { if(spaceID > 0) { onTeleportSuccess(spaceID); } else { onTeleportFailure(); } }