KBEngine |
KBEngine模块
KBEngine模块提供了Python脚本访问实体的部分,特别是它提供了定时器的注册与移除, 以及实体的创建。类
Base |
Proxy |
成员函数
def addWatcher( path, dataType, getFunction ): |
def address( ): |
def MemoryStream( ): |
def charge( ordersID, dbID, byteDatas, pycallback ): |
def createBase( ): |
def createBaseAnywhere( entityType, *params, callback ): |
def createBaseRemotely( entityType, baseMB, *params, callback ): |
def createBaseFromDBID( entityType, dbID, callback, dbInterfaceName ): |
def createBaseAnywhereFromDBID( entityType, dbID, callback, dbInterfaceName ): |
def createBaseRemotelyFromDBID( entityType, dbID, baseMB, callback, dbInterfaceName ): |
def createBaseLocally( entityType, *params ): |
def createEntity( ): |
def debugTracing( ): |
def delWatcher( path ): |
def deleteBaseByDBID( entityType, dbID, callback, dbInterfaceName ): |
def deregisterReadFileDescriptor( fileDescriptor ): |
def deregisterWriteFileDescriptor( fileDescriptor ): |
def executeRawDatabaseCommand( command, callback, threadID, dbInterfaceName ): |
def genUUID64( ): |
def getResFullPath( res ): |
def getWatcher( path ): |
def getWatcherDir( path ): |
def getAppFlags( ): |
def hasRes( res ): |
def isShuttingDown( ): |
def listPathRes( path, extension ): |
def lookUpBaseByDBID( entityType, dbID, callback, dbInterfaceName ): |
def matchPath( res ): |
def open( res, mode ): |
def publish( ): |
def quantumPassedPercent( ): |
def registerReadFileDescriptor( fileDescriptor, callback ): |
def registerWriteFileDescriptor( fileDescriptor, callback ): |
def reloadScript( fullReload ): |
def scriptLogType( logType ): |
def setAppFlags( flags ): |
def time( ): |
回调函数
def onBaseAppReady( isBootstrap ): |
def onBaseAppShutDown( state ): |
def onCellAppDeath( addr ): |
def onFini( ): |
def onBaseAppData( key, value ): |
def onBaseAppDataDel( key ): |
def onGlobalData( key, value ): |
def onGlobalDataDel( key ): |
def onInit( isReload ): |
def onLoseChargeCB( orderID, dbID, success, datas ): |
def onReadyForLogin( isBootstrap ): |
def onReadyForShutDown( ): |
def onAutoLoadEntityCreate( entityType, dbID ): |
属性
成员函数文档
def addWatcher( path, dataType, getFunction ):
与调试监视系统交互,允许用户向监视系统注册一个监视变量。
例:
>>> def countPlayers( ): >>> i = 0 >>> for e in KBEngine.entities.values(): >>> if e.__class__.__name__ == "Avatar": >>> i += 1 >>> return i >>> >>> KBEngine.addWatcher( "players", "UINT32", countPlayers )
这个函数添加一个监视变量在"scripts/players"监视路径之下。函数countPlayers在观察者观察时被调用。
参数:
path | 创建监视的路径。 |
dataType | 监视变量的值类型。参考: 基本类型 |
getFunction | 这个函数当观察者检索该变量时调用。 这个函数不带参数返回一个代表监视变量的值。 |
def address( ):
返回内部网络接口的地址。
def MemoryStream( ):
返回一个新的MemoryStream对象。
MemoryStream对象存储的是二进制信息,提供这个类型是为了让用户能够方便的序列化与反序列化Python基本类型同时能与KBEngine底层序列化规则相同。
例如:你可以使用这个对象构造一个KBEngine能解析的网络数据包。
用法:
>>> s = KBEngine.MemoryStream() >>> s >>> b'' >>> s.append("UINT32", 1) >>> s.pop("UINT32") >>> 1
目前MemoryStream能够支持的类型仅为基本数据类型。参考: 基本类型
def charge( ordersID, dbID, byteDatas, pycallback ):
计费接口。
参数:
ordersID | string,订单ID。 |
dbID | uint64,实体的databaseID。 |
byteDatas | bytes,附带数据,由开发者自己解析和定义。 |
pycallback |
计费回调。 计费回调原型: (当在interfaces中调用KBEngine.chargeResponse后,如果某个订单设置过回调则该回调被调用) def on**ChargeCB(self, orderID, dbID, success, datas): ordersID:string,订单ID dbID:uint64,通常为entity的databaseID success:bool,是否成功 datas:bytes,附带数据,由开发者自己解析和定义 |
def createBase( ):
def createBaseAnywhere( entityType, params, callback ):
创建一个新的Base实体, 服务端可能选择任何的Baseapp来创建Base实体。
这个方法应作为KBEngine.createBaseLocally的首选, 这样服务端会灵活地选择一个合适的Baseapp来创建实体。
函数参数需要提供创建的实体的类型,还有一个Python字典作为参数来初始化实体的值。
这个Python字典不需要用户提供所有的属性,没有提供的属性默认为实体定义文件".def"提供的默认值。
例子:
params = { "name" : "kbe", # base, BASE_AND_CLIENT "HP" : 100, # cell, ALL_CLIENT, in cellData "tmp" : "tmp" # baseEntity.tmp } def onCreateBaseCallback(entity) print(entity) createBaseAnywhere("Avatar", params, onCreateBaseCallback)
参数:
entityType |
string,指定要创建的Base实体的类型。有效的实体类型在 |
params | 可选参数, 一个Python字典对象。 如果一个指定的键是一个Base属性,他的值会用来初始化这个Base实体的属性。 如果这个键是一个Cell属性,它会被添加到Base实体的'cellData'属性,这个'cellData'属性是一个Python字典, 然后在后面会用来初始化cell实体的属性。 |
callback | callback是一个可选的回调函数,当实体完成创建时被调用。回调函数带有一个参数,当成功的时候是Base实体的mailbox,失败时是None。 |
返回:
通过回调返回Base实体的mailbox。 |
def createBaseRemotely( entityType, baseMB, params, callback ):
通过baseMB参数在一个指定的baseapp上创建一个新的Base实体。
应该将KBEngine.createBaseAnywhere方法作为首选。
函数参数需要提供创建的实体的类型,还有一个Python字典作为参数来初始化实体的值。
这个Python字典不需要用户提供所有的属性,没有提供的属性默认为实体定义文件".def"提供的默认值。
例子:
params = { "name" : "kbe", # base, BASE_AND_CLIENT "HP" : 100, # cell, ALL_CLIENT, in cellData "tmp" : "tmp" # baseEntity.tmp } def onCreateBaseCallback(entity) print(entity) createBaseRemotely("Avatar", baseMailbox, params, onCreateBaseCallback)
参数:
entityType |
string,指定要创建的Base实体的类型。有效的实体类型在 |
baseMB | BaseMailbox,这是一个Base的Mailbox。实体将被创建在该Base对应的Baseapp进程上。 |
params | 可选参数, 一个Python字典对象。 如果一个指定的键是一个Base属性,他的值会用来初始化这个Base实体的属性。 如果这个键是一个Cell属性,它会被添加到Base实体的'cellData'属性,这个'cellData'属性是一个Python字典, 然后在后面会用来初始化cell实体的属性。 |
callback | callback是一个可选的回调函数,当实体完成创建时被调用。回调函数带有一个参数,当成功的时候是Base实体的mailbox,失败时是None。 |
返回:
通过回调返回Base实体的mailbox。 |
def createBaseFromDBID( entityType, dbID, callback, dbInterfaceName ):
参数:
entityType |
string,指定要加载的Base实体类型。实体类型在 |
dbID | 指定要创建的实体的数据库ID。这个实体的数据库ID存储在该实体的databaseID属性。 |
callback |
这是一个可选的回调函数,当操作完成的时候它会被调用。回调函数带有3个参数:baseRef,databaseID和wasActive。
如果操作成功,baseRef会是一个mailbox或者是新创建的Base实体的直接引用,databaseID会是实体的数据库ID,无论该实体是否已经激活 wasActive都会有所指示,如果wasActive是True则baseRef是已经存在的实体的引用(已经从数据库检出)。如果操作失败这三个参数的值,baseRef将会是None,databaseID将会是0,wasActive将会是False。 失败最常见的原因是实体在数据库里不存在,但偶尔也会出现其它错误比如说超时或者是分配ID失败。 |
dbInterfaceName | string,可选参数,指定由某个数据库接口来完成, 默认使用"default"接口。数据库接口由kbengine_defaults.xml->dbmgr->databaseInterfaces中定义。 |
def createBaseAnywhereFromDBID( entityType, dbID, callback, dbInterfaceName ):
从数据库里加载数据创建一个Base实体。 服务端可能选择任何的Baseapp来创建Base实体。
使用这个函数将有助于BaseApps负载平衡。
如果该实体已经从数据库检出,那么将返回这个存在的Base实体的引用。
参数:
entityType |
string,指定要创建的Base实体的类型。有效的实体类型在 |
dbID | 这是一个指定要创建的实体的数据库ID。这个实体的数据库ID存储在该实体的databaseID属性。 |
callback |
这是一个可选的回调函数,当操作完成的时候它会被调用。回调函数带有3个参数:baseRef,databaseID和wasActive。
如果操作成功,baseRef会是一个mailbox或者是新创建的Base实体的直接引用,databaseID会是实体的数据库ID,无论该实体是否已经激活 wasActive都会有所指示,如果wasActive是True则baseRef是已经存在的实体的引用(已经从数据库检出)。如果操作失败这三个参数的值,baseRef将会是None,databaseID将会是0,wasActive将会是False。 失败最常见的原因是实体在数据库里不存在,但偶尔也会出现其它错误比如说超时或者是分配ID失败。 |
dbInterfaceName | string,可选参数,指定由某个数据库接口来完成, 默认使用"default"接口。数据库接口由kbengine_defaults.xml->dbmgr->databaseInterfaces中定义。 |
返回:
通过回调返回Base实体的mailbox。 |
def createBaseRemotelyFromDBID( entityType, dbID, baseMB, callback, dbInterfaceName ):
参数:
entityType |
string,指定要创建的Base实体的类型。有效的实体类型在 |
dbID | 这是一个指定要创建的实体的数据库ID。这个实体的数据库ID存储在该实体的databaseID属性。 |
baseMB | BaseMailbox,这是一个Base的Mailbox。实体将被创建在该Base对应的Baseapp进程上。 |
callback |
这是一个可选的回调函数,当操作完成的时候它会被调用。回调函数带有3个参数:baseRef,databaseID和wasActive。
如果操作成功,baseRef会是一个mailbox或者是新创建的Base实体的直接引用,databaseID会是实体的数据库ID,无论该实体是否已经激活 wasActive都会有所指示,如果wasActive是True则baseRef是已经存在的实体的引用(已经从数据库检出)。如果操作失败这三个参数的值,baseRef将会是None,databaseID将会是0,wasActive将会是False。 失败最常见的原因是实体在数据库里不存在,但偶尔也会出现其它错误比如说超时或者是分配ID失败。 |
dbInterfaceName | string,可选参数,指定由某个数据库接口来完成, 默认使用"default"接口。数据库接口由kbengine_defaults.xml->dbmgr->databaseInterfaces中定义。 |
返回:
通过回调返回Base实体的mailbox。 |
def createBaseLocally( entityType, params ):
创建一个新的Base实体。
函数参数需要提供创建的实体的类型,还有一个Python字典作为参数来初始化实体的值。
这个Python字典不需要用户提供所有的属性,没有提供的属性默认为实体定义文件".def"提供的默认值。
KBEngine.createBaseAnywhere应该作为这个方法的首选,因为服务端可以灵活地 在合适的Baseapp上创建实体。
例子:
params = { "name" : "kbe", # base, BASE_AND_CLIENT "HP" : 100, # cell, ALL_CLIENT, in cellData "tmp" : "tmp" # baseEntity.tmp } baseEntity = createBaseLocally("Avatar", params)
参数:
entityType |
string,指定要创建的Base实体的类型。有效的实体类型在 |
params | 可选参数, 一个Python字典对象。 如果一个指定的键是一个Base属性,他的值会用来初始化这个Base实体的属性。 如果这个键是一个Cell属性,它会被添加到Base实体的'cellData'属性,这个'cellData'属性是一个Python字典, 然后在后面会用来初始化cell实体的属性。 |
返回:
新创建的Base实体(参考Base) |
def createEntity( ):
def debugTracing( ):
输出当前KBEngine追踪的Python扩展对象计数器。
扩展对象包括:固定字典、固定数组、Entity、Mailbox...
在服务端正常关闭时如果计数器不为零,此时说明泄露已存在,日志将会输出错误信息。
ERROR cellapp [0x0000cd64] [2014-11-12 00:38:07,300] - PyGC::debugTracing(): FixedArray : leaked(128)
ERROR cellapp [0x0000cd64] [2014-11-12 00:38:07,300] - PyGC::debugTracing(): EntityMailbox : leaked(8)
参数:
path | 要删除的变量的路径。 |
def delWatcher( path ):
与调试监视系统交互,允许用户在脚本删除监视的变量。
参数:
path | 要删除的变量的路径。 |
def deleteBaseByDBID( entityType, dbID, callback, dbInterfaceName ):
从数据库删除指定的实体(包括属性所产生的子表数据),如果实体没有从数据库检出则删除成功, 如果实体已经从数据库检出那么KBEngine服务系统将会删除失败,并且从回调中返回 Base实体的mailbox。
参数:
entityType |
string,指定要删除的Base实体的类型。有效的实体类型在 |
dbID | 指定要删除的实体的数据库ID。这个实体的数据库ID存储在该实体的databaseID属性。 |
callback | callback是一个可选的回调函数,只有一个参数,当实体没有从数据库检出时将会成功删除数据,参数是True。如果实体已经从数据库检出那么参数是Base实体的mailbox。 |
dbInterfaceName | string,可选参数,指定由某个数据库接口来完成, 默认使用"default"接口。数据库接口由kbengine_defaults.xml->dbmgr->databaseInterfaces中定义。 |
def deregisterReadFileDescriptor( fileDescriptor ):
注销已经通过KBEngine.registerReadFileDescriptor注册的回调。
例子:
http://www.kbengine.org/assets/other/py/Poller.py
参数:
fileDescriptor | socket描述符/文件描述符。 |
def deregisterWriteFileDescriptor( fileDescriptor ):
注销已经通过KBEngine.registerWriteFileDescriptor注册的回调。
例子:
http://www.kbengine.org/assets/other/py/Poller.py
参数:
fileDescriptor | socket描述符/文件描述符。 |
def executeRawDatabaseCommand( command, callback, threadID, dbInterfaceName ):
这个脚本函数在数据库上执行原始数据库命令,该命令将直接由相关数据库进行解析。
请注意使用该函数修改实体数据可能不生效,因为如果实体已经检出,被修改过的实体数据将仍会被实体存档而导致覆盖。
强烈不推荐这个函数用于读取或修改实体数据。
参数:
command | 这个数据库命令将会因为不同数据库配置方案而不同。对于方案为MySQL数据库它是一个SQL查询语句。 |
callback |
可选参数,带有命令执行结果的回调对象(比如说是一个函数)。这个回调带有4个参数:结果集合,影响的行数,自増长值,错误信息。
insertid对应的是“自増长值”,类似于实体的databaseID,当成功的向一张带有自増长类型字段的表中插入数据时,它返回该数据在插入时自増长字段所被赋于的值。 |
threadID |
int32,可选参数,指定一个线程来处理本条命令。用户可以通过这个参数控制某一类命令的执行先后顺序(dbmgr是多线程处理的),默认是不指定,如果threadID是实体的ID, 那么将加入到该实体的存档队列中由线程逐条写入。 |
dbInterfaceName | string,可选参数,指定由某个数据库接口来完成, 默认使用"default"接口。数据库接口由kbengine_defaults.xml->dbmgr->databaseInterfaces中定义。 |
def genUUID64( ):
该函数生成一个64位的唯一ID。
注意:这个函数依赖于Baseapps服务进程启动参数gus,请正确设置启动参数保持唯一性。
另外如果gus超过65535则该函数只能在当前进程上保持唯一性。
用途:
多个服务进程上产生唯一物品ID并且在合服时不会产生冲突。
多个服务进程上产生一个房间ID,不需要进行唯一性校验。
返回:
返回一个64位的integer。 |
def getResFullPath( res ):
参数:
res | string,资源的相对路径。 |
返回:
string,如果存在返回资源的绝对路径,否则返回空。 |
def getWatcher( path ):
从KBEngine调试系统中获取一个监视变量的值。
例子:在baseapp1的Python命令行输入:
>>>KBEngine.getWatcher("/root/stats/runningTime")
12673648533
>>>KBEngine.getWatcher("/root/scripts/players")
32133
参数:
path | string,该变量的绝对路径包括变量名(可以在GUIConsole的watcher页查看)。 |
返回:
该变量的值。 |
def getWatcherDir( path ):
从KBEngine调试系统中获取一个监视目录下的元素列表(目录、变量名)。
例子:在baseapp1的Python命令行输入:
>>>KBEngine.getWatcher("/root")
('stats', 'objectPools', 'network', 'syspaths', 'ThreadPool', 'cprofiles', 'scripts', 'numProxices', 'componentID', 'componentType', 'uid', 'numClients', 'globalOrder', 'username', 'load', 'gametime', 'entitiesSize', 'groupOrder')
参数:
path | string,该变量的绝对路径(可以在GUIConsole的watcher页查看)。 |
返回:
监视目录下的元素列表(目录、变量名)。 |
def getAppFlags( ):
返回:
KBEngine.APP_FLAGS_*。 |
def hasRes( res ):
使用这个接口可以判断一个相对路径的资源是否存在。
注意:资源必须在KBE_RES_PATH之下才可以访问到。
例子:
>>>KBEngine.hasRes("scripts/entities.xml")
True
参数:
res | string,资源的相对路径。 |
返回:
BOOL, 存在返回True,否则返回False。 |
def isShuttingDown( ):
返回:
系统正在关闭返回True,否则返回False。 |
def listPathRes( path, extension ):
获得一个资源目录下的资源列表。
注意:资源必须在KBE_RES_PATH之下才可以访问到。
例子:
>>>KBEngine.listPathRes("scripts/cell/interfaces")
('/home/kbe/kbengine/demo/res/scripts/cell/interfaces/AI.py', '/home/kbe/kbengine/demo/res/scripts/cell/interfaces/新建文本文档.txt')
>>>KBEngine.listPathRes("scripts/cell/interfaces", "txt")
('/home/kbe/kbengine/demo/res/scripts/cell/interfaces/新建文本文档.txt')
>>>KBEngine.listPathRes("scripts/cell/interfaces", "txt|py")
('/home/kbe/kbengine/demo/res/scripts/cell/interfaces/AI.py', '/home/kbe/kbengine/demo/res/scripts/cell/interfaces/新建文本文档.txt')
>>>KBEngine.listPathRes("scripts/cell/interfaces", ("txt", "py"))
('/home/kbe/kbengine/demo/res/scripts/cell/interfaces/AI.py', '/home/kbe/kbengine/demo/res/scripts/cell/interfaces/新建文本文档.txt')
参数:
res | string,资源的相对路径。 |
extension | string,可选参数,扩展名。 |
返回:
Tuple, 资源列表。 |
def lookUpBaseByDBID( entityType, dbID, callback, dbInterfaceName ):
参数:
entityType |
string,指定要查询的Base实体的类型。有效的实体类型在 |
dbID | 指定要查询的Base实体的数据库ID。这个实体的数据库ID存储在该实体的databaseID属性。 |
callback | callback只有一个参数,当实体没有从数据库检出时将会返回True。如果实体已经从数据库检出那么将返回Base实体的mailbox, 其他任何情况返回False。 |
dbInterfaceName | string,可选参数,指定由某个数据库接口来完成, 默认使用"default"接口。数据库接口由kbengine_defaults.xml->dbmgr->databaseInterfaces中定义。 |
def matchPath( res ):
使用相对路径的资源获得资源的绝对路径。
注意:资源必须在KBE_RES_PATH之下才可以访问到。
例子:
>>>KBEngine.matchPath("scripts/entities.xml")
'/home/kbe/kbengine/demo/res/scripts/entities.xml'
参数:
res | string,资源的相对路径(包括资源名称)。 |
返回:
string, 资源的绝对路径。 |
def open( res, mode ):
参数:
res | string,资源的相对路径。 |
mode |
string,文件操作模式: w 以写方式打开, a 以追加模式打开 (从 EOF 开始, 必要时创建新文件) r+ 以读写模式打开 w+ 以读写模式打开 (参见 w ) a+ 以读写模式打开 (参见 a ) rb 以二进制读模式打开 wb 以二进制写模式打开 (参见 w ) ab 以二进制追加模式打开 (参见 a ) rb+ 以二进制读写模式打开 (参见 r+ ) wb+ 以二进制读写模式打开 (参见 w+ ) ab+ 以二进制读写模式打开 (参见 a+ ) |
def publish( ):
这个接口返回当前服务端发行模式。
返回:
int8,0:debug,1:release,其它可自定义。 |
def quantumPassedPercent( ):
返回取得当前tick占用一个时钟周期的百分比。
返回:
返回取得当前tick占用一个时钟周期的百分比。 |
def registerReadFileDescriptor( fileDescriptor, callback ):
参数:
fileDescriptor | socket描述符/文件描述符。 |
callback | 一个回调函数,socket描述符/文件描述符作为它的唯一参数。 |
def registerWriteFileDescriptor( fileDescriptor, callback ):
参数:
fileDescriptor | socket描述符/文件描述符。 |
callback | 一个回调函数,socket描述符/文件描述符作为它的唯一参数。 |
def reloadScript( fullReload ):
重新加载与实体和自定义数据类型相关的Python模块。当前实体类会设置为新加载的类。 这个方法应该只用于开发模式,对于产品模式不合适。下面几点应该注意:
1)重载脚本仅仅能在Baseapp上执行, 用户应该确保所有的服务端组件加载完成。
2)自定义类型在脚本重载后应该确保内存中已经实例化的对象也被更新,下面是一个例子:
for e in KBEngine.entities.values(): if type( e ) is Avatar.Avatar: e.customData.__class__ = CustomClass当这个方法完成时 KBEngine.onInit( True ) 被调用。
参数:
fullReload | 可选的boolean参数,指定是否同时重新加载实体定义。如果这个参数为False,则实体定义不会被重新加载。默认为True。 |
返回:
重新加载成功返回True,否则返回False。 |
def scriptLogType( logType ):
设置当前Python.print输出的信息类型(参考: KBEngine.LOG_TYPE_*)。
def setAppFlags( flags ):
设置当前引擎APP的标记。
KBEngine.APP_FLAGS_NONE // 默认的(未设置标记)
KBEngine.APP_FLAGS_NOT_PARTCIPATING_LOAD_BALANCING //不参与负载均衡
例如:
KBEngine.setAppFlags(KBEngine.APP_FLAGS_NOT_PARTCIPATING_LOAD_BALANCING | KBEngine.APP_FLAGS_*)
def time( ):
这个方法返回当前游戏的时间(周期数)。
返回:
uint32,当前游戏的时间,这里指周期数,周期受频率影响,频率由配置文件kbengine.xml或者kbengine_defaults.xml->gameUpdateHertz决定。 |
回调函数文档
def onBaseAppReady( isBootstrap ):
参数:
isBootstrap | bool,是否为第一个启动的Baseapp。 |
def onBaseAppShutDown( state ):
参数:
state | 如果state为0,意指在断开所有客户端之前,如果state为1,意指在将所有实体写入数据库之前,如果state为2,意指在所有实体被写入数据库之后。 |
def onCellAppDeath( addr ):
参数:
addr |
死亡的cellapp地址。 tuple:(ip, port) 网络字节序 |
def onFini( ):
def onBaseAppData( key, value ):
参数:
key | 被改变数据的键。 |
value | 被改变数据的值。 |
def onBaseAppDataDel( key ):
参数:
key | 被删除数据的键。 |
def onGlobalData( key, value ):
参数:
key | 被改变数据的键。 |
value | 被改变数据的值。 |
def onGlobalDataDel( key ):
参数:
key | 被删除数据的键。 |
def onInit( isReload ):
参数:
isReload | bool,是否是被重写加载脚本后触发的。 |
def onLoseChargeCB( orderID, dbID, success, datas ):
当在interfaces中调用KBEngine.chargeResponse后,如果该订单丢失或者是不明interfaces未被记录的订单会收到此回调通知。
注意:该回调接口必须实现在入口模块(kbengine_defaults.xml->entryScriptFile)中。
参数:
ordersID | string,订单ID。 |
dbID | uint64,实体的数据库ID, 参见: Base.databaseID。 |
success | bool,是否成功。 |
datas | bytes,附带信息。 |
def onReadyForLogin( isBootstrap ):
当引擎启动并初始化完成后会一直调用此接口询问脚本层是否准备完毕,如果脚本层准备完毕则loginapp允许客户端登录。
注意:该回调接口必须实现在入口模块(kbengine_defaults.xml->entryScriptFile)中。
参数:
isBootstrap | bool,是否为第一个启动的Baseapp。 |
返回:
返回值大于等于1.0则脚本层准备完成,否则返回准备的进度值0.0~1.0。 |
def onReadyForShutDown( ):
如果这个函数在脚本中有实现,当进程准备退出时,该回调函数被调用。
可以通过该回调控制进程退出的时机。
注意:该回调接口必须实现在入口模块(kbengine_defaults.xml->entryScriptFile)中。
返回:
bool,如果返回True,则允许进入进程退出流程,返回其它值则进程会过一段时间后再次询问。 |
def onAutoLoadEntityCreate( entityType, dbID ):
自动加载的实体创建时的回调,如果脚本层实现此回调,那么实体由脚本层创建,否则引擎默认使用createBaseAnywhereFromDBID来创建实体。
这个回调被调用是由于Base.writeToDB时设置了实体自动加载。
注:该回调优先于onBaseAppReady执行,可在onBaseAppReady时检查是否已加载实体。
参数:
entityType |
string,指定要查询的Base实体的类型。有效的实体类型在 |
dbID | 指定要查询的Base实体的数据库ID。这个实体的数据库ID存储在该实体的databaseID属性。 |
属性文档
LOG_ON_ACCEPT
LOG_ON_REJECT
LOG_ON_WAIT_FOR_DESTROY
这个常量由Proxy.onLogOnAttempt返回,当前请求client将会等待直到Proxy实体完全销毁,底层再完成后续绑定过程。 在这返回之前Proxy.destroy或者Proxy.destroyCellEntity 应该被调用。
LOG_TYPE_DBG
LOG_TYPE_ERR
LOG_TYPE_INFO
LOG_TYPE_NORMAL
LOG_TYPE_WAR
NEXT_ONLY
这个常量用于Base.shouldAutoBackup和Base.shouldAutoArchive属性。这个值意指在下一次认为可以的时候自动备份该实体,然后这个属性自动设为False(0)。
component
这是正运行在当前Python环境的组件。(至今为止)可能值有'cell', 'base', 'client', 'database', 'bot' 和 'editor'。
entities
entities是一个字典对象,包含当前进程上所有的实体。
调试泄露的实体(调用过destroy却没有释放内存的实体,通常是由于被引用导致无法释放):
>>> KBEngine.entities.garbages.items() [(1025, Avatar object at 0x7f92431ceae8.)]
>>> e = _[0][1] >>> import gc >>> gc.get_referents(e) [{'spacesIsOk': True, 'bootstrapIdx': 1},]
调试泄露的KBEngine封装的Python对象:
KBEngine.debugTracing
类型:
Entities |
baseAppData
这个属性包含一个类字典的对象,这个对象会在所有的BaseApps之间自动同步。 当字典的一个值被修改,这个修改会广播到所有的BaseApps。
例子:
KBEngine.baseAppData[ "hello" ] = "there"
其余BaseApps可以访问下面的:
print KBEngine.baseAppData[ "hello" ]
键和值可以是任意类型,但这些类型必须在所有目标组件上能够被封装和被拆封。
当一个值被改变或被删除,一个回调函数会在所有组件被调用。 参看:KBEngine.onBaseAppData和KBEngine.onDelBaseAppData。
注意:只有顶层的值才会被广播,如果你有一个值(比如一个列表),它改变了内部的值(比如只是改变一个数),这个信息不会被广播。
不要进行下面的操作:
KBEngine.baseAppData[ "list" ] = [1, 2, 3] KBEngine.baseAppData[ "list" ][1] = 7这样,本地访问是[1, 7, 3],远程访问是[1, 2, 3]。
globalData
这个属性包含一个类字典的对象,这个对象会在所有的BaseApps和CellApps之间自动同步。 当字典的一个值被修改,这个修改会广播到所有的BaseApps和CellApps。
例子:
KBEngine.globalData[ "hello" ] = "there"
其余Baseapp或者Cellapp可以访问下面的:
print KBEngine.globalData[ "hello" ]
键和值可以是任意类型,但这些类型必须在所有目标组件上能够被封装和被拆封。
当一个值被改变或被删除,一个回调函数会在所有组件被调用。 参看:KBEngine.onGlobalData和KBEngine.onGlobalDataDel。
注意:只有顶层的值才会被广播,如果你有一个值(比如一个列表),它改变了内部的值(比如只是改变一个数),这个信息不会被广播。
不要进行下面的操作:
KBEngine.globalData[ "list" ] = [1, 2, 3] KBEngine.globalData[ "list" ][1] = 7这样,本地访问是[1, 7, 3],远程访问是[1, 2, 3]。