//------------------------------------------------------------------------------------- SyncEntityStreamTemplateHandler::SyncEntityStreamTemplateHandler(Network::NetworkInterface & networkInterface): Task(), networkInterface_(networkInterface) { networkInterface.dispatcher().addTask(this); MemoryStream accountDefMemoryStream; ENGINE_COMPONENT_INFO& dbcfg = g_kbeSrvConfig.getDBMgr(); ScriptDefModule* scriptModule = EntityDef::findScriptModule(dbcfg.dbAccountEntityScriptType); if(scriptModule != NULL) { ScriptDefModule::PROPERTYDESCRIPTION_MAP& propertyDescrs = scriptModule->getPersistentPropertyDescriptions(); ScriptDefModule::PROPERTYDESCRIPTION_MAP::const_iterator iter = propertyDescrs.begin(); if(scriptModule->hasCell()) { Vector3 pos, dir; ADD_POSDIR_TO_STREAM(accountDefMemoryStream, pos, dir); } for(; iter != propertyDescrs.end(); ++iter) { PropertyDescription* propertyDescription = iter->second; accountDefMemoryStream << propertyDescription->getUType(); propertyDescription->addPersistentToStream(&accountDefMemoryStream, NULL); } } }
E* EntityApp<E>::createEntityCommon(const char* entityType, PyObject* params, bool isInitializeScript, ENTITY_ID eid, bool initProperty) { // 检查ID是否足够, 不足返回NULL if(eid <= 0 && idClient_.getSize() == 0) { PyErr_SetString(PyExc_SystemError, "EntityApp::createEntityCommon: is Failed. not enough entityIDs."); PyErr_PrintEx(0); return NULL; } ScriptDefModule* sm = EntityDef::findScriptModule(entityType); if(sm == NULL) { PyErr_Format(PyExc_TypeError, "EntityApp::createEntityCommon: entity [%s] not found.\n", entityType); PyErr_PrintEx(0); return NULL; } else if(componentType_ == CELLAPP_TYPE ? !sm->hasCell() : !sm->hasBase()) { PyErr_Format(PyExc_TypeError, "EntityApp::createEntityCommon: entity [%s] not found.\n", entityType); PyErr_PrintEx(0); return NULL; } PyObject* obj = sm->createObject(); // 判断是否要分配一个新的id ENTITY_ID id = eid; if(id <= 0) id = idClient_.alloc(); E* entity = onCreateEntityCommon(obj, sm, id); if(initProperty) entity->initProperty(); // 将entity加入entities pEntities_->add(id, entity); // 初始化脚本 if(isInitializeScript) entity->initializeEntity(params); SCRIPT_ERROR_CHECK(); if(g_debugEntity) { INFO_MSG(boost::format("EntityApp::createEntityCommon: new %1% (%2%) refc=%3%.\n") % entityType % id % obj->ob_refcnt); } else { INFO_MSG(boost::format("EntityApp::createEntityCommon: new %1% (%2%)\n") % entityType % id); } return entity; }
//------------------------------------------------------------------------------------- bool SyncEntityStreamTemplateHandler::process() { Components::COMPONENTS& cts = Components::getSingleton().getComponents(DBMGR_TYPE); Network::Channel* pChannel = NULL; if(cts.size() > 0) { Components::COMPONENTS::iterator ctiter = cts.begin(); if((*ctiter).pChannel == NULL) return true; pChannel = (*ctiter).pChannel; } if(pChannel == NULL) return true; MemoryStream accountDefMemoryStream; ENGINE_COMPONENT_INFO& dbcfg = g_kbeSrvConfig.getDBMgr(); ScriptDefModule* scriptModule = EntityDef::findScriptModule(dbcfg.dbAccountEntityScriptType); if(scriptModule == NULL) { delete this; return false; } ScriptDefModule::PROPERTYDESCRIPTION_MAP& propertyDescrs = scriptModule->getPersistentPropertyDescriptions(); ScriptDefModule::PROPERTYDESCRIPTION_MAP::const_iterator iter = propertyDescrs.begin(); if(scriptModule->hasCell()) { Vector3 pos, dir; ADD_POSDIR_TO_STREAM(accountDefMemoryStream, pos, dir); } for(; iter != propertyDescrs.end(); ++iter) { PropertyDescription* propertyDescription = iter->second; accountDefMemoryStream << propertyDescription->getUType(); propertyDescription->addPersistentToStream(&accountDefMemoryStream, NULL); } Network::Bundle* pBundle = Network::Bundle::ObjPool().createObject(); (*pBundle).newMessage(DbmgrInterface::syncEntityStreamTemplate); (*pBundle).append(accountDefMemoryStream); pChannel->send(pBundle); delete this; return false; }