game和lobby服务器事件配置ReloadCommonConfigEvent服务器MasterConnectStatusEventMasterForceShutDownEventMasterGraceShutDownEventServerWillShutDownEventServiceConnectEventServiceDisconnectEventServiceRegisterModuleEvent玩家ServerGetPlayerLockEventServerPlayerBornPosEventServerReleasePlayerLockEventServerReleasePlayerLockOnShutDownEventqueryPlayerDataEventsavePlayerDataEventsavePlayerDataOnShutDownEventmaster服务器事件配置NetGameCommonConfChangeEvent服务器ServerConnectedEventServerDisconnectEvent玩家PlayerLoginServerEventPlayerLogoutServerEventPlayerTransferServerEventservice服务器事件配置NetGameCommonConfChangeEvent服务器ServerConnectedEventServerDisconnectEventUpdateServerStatusEventmaster API配置HTTP服务器服务器管理service API配置HTTP服务器服务器管理lobby和game服务器API服务器玩家切服商城性能开关关服配置存档地图lobby服务器API主城模式master/service/game/lobby 公共API异步线程池mysql连接池redis连接池mongo连接池mysql连接池扩展redis连接池扩展mongo连接池扩展玩家通用通信client和game/lobby通信master和game/lobby通信service和service/master通信service和game/lobby通信运营指令在线人数日志等级服务器禁言,解除禁言踢出玩家封禁,解除封禁停服维护Hunter调试命令性能分析
术语说明
- game
游戏服
- lobby
大厅服
- 官方mod
存在于Apollo引擎中的mod,放在developer_mods目录下,比如处理登录相关的官方mod neteaseOnline,它在lobby/game引擎的developer_mods目录下。
game和lobby服务器事件
配置
ReloadCommonConfigEvent
描述
引擎重新加载配置后触发此事件。
返回值
空
备注
- 目前只用于引擎,用法详情见示例Mod shutdown
服务器
MasterConnectStatusEvent
描述
master成功连接到当前服务器事件.
参数
参数名 数据类型 说明 is_connect int 1代表连接建立,0代表连接中断 serverid int 当前lobby/game服务器id 返回值
空
备注
- 用法详情见示例Mod sample
MasterForceShutDownEvent
描述
强制关闭当前服务器时会触发本事件。只应用于引擎,不建议开发者使用。
返回值
空
备注
- 用法详情见示例Mod shutdown
MasterGraceShutDownEvent
描述
优雅关闭当前服务器时会触发本事件。只应用于引擎,不建议开发者使用。
返回值
空
备注
- 用法详情见示例Mod shutdown
ServerWillShutDownEvent
描述
游戏即将强制关闭触发本事件。事件回调函数需要好清理和存档工作,同时终止或强制join所有异步线程.
返回值
空
备注
- 用法详情见示例Mod neteaseDatabase
ServiceConnectEvent
描述
service与lobby/game的成功建立连接事件。
参数
参数名 数据类型 说明 serverid int service的服务器id 返回值
空
ServiceDisconnectEvent
描述
service与lobby/game断开连接事件。
参数
参数名 数据类型 说明 serverid int service的服务器id 返回值
空
ServiceRegisterModuleEvent
描述
service向lobby/game注册module。只应用于引擎,不建议开发者使用。
参数
参数名 数据类型 说明 serverid int service服务器id modulename str 模块名,是公共配置netgame_common.json中module_names中某个module 返回值
空
玩家
ServerGetPlayerLockEvent
描述
玩家登录到lobby/game过程中,获取玩家在线锁事件。事件触发时,玩家还处于开始登录阶段,还没有下载行为包,且没有在地图中出生。在线锁实质是redis中记录的玩家在线信息,redis key格式是“online_user_ + netease uid”,它是个hash表,包含两个hash key:serverid,proxyid。
参数
参数名 数据类型 说明 uid int 玩家的netease uid,玩家的唯一标识 serverid str 当前服务器id proxyid int 当前客户端连接的proxy服务器id 返回值
空
备注
- 目前只用于引擎,具体可以参见官方mod neteaseOnline
ServerPlayerBornPosEvent
描述
创建玩家对象过程中,设置玩家出生位置时触发本事件。
参数
参数名 数据类型 说明 userId int 玩家的netease uid dimensionId int 玩家出生dimension,支持修改 posx int 玩家出生位置,支持修改 posy int 玩家出生位置,支持修改 posz int 玩家出生位置,支持修改 deltax int 玩家motion位置,初始值为存档中的数据。若修改了posx/posy/posz,则建议设置为0。 deltay int 玩家motion位置,初始值为存档中的数据。若修改了posx/posy/posz,则建议设置为0。 deltaz int 玩家motion位置,初始值为存档中的数据。若修改了posx/posy/posz,则建议设置为0。 rotx int 玩家的rot,初始值为存档中的数据,支持修改 roty int 玩家的rot,初始值为存档中的数据,支持修改 ret bool 是否需要修改玩家初始位置,设置为True后其他数据的修改才会生效 返回值
空
备注
- 可以设置出生点位置。用法详情见示例Mod sample
ServerReleasePlayerLockEvent
描述
玩家下线过程中,释放在redis中的玩家在线锁事件。事件触发时,客户端同服务端断开了连接,玩家数据已经保存到地图,玩家已经不存在于mc的世界中。在线锁实质是redis中记录的玩家在线信息,redis key格式是“online_user_ + netease uid”,它是个hash表,包含两个hash key:serverid,proxyid。
参数
参数名 数据类型 说明 uid str 玩家的netease uid,玩家的唯一标识 返回值
空
备注
- 目前只用于引擎,具体可以参见官方mod neteaseOnline
ServerReleasePlayerLockOnShutDownEvent
描述
游戏强制关闭过程中,玩家强制下线时触发本事件。事件回调函数需要释放在redis中的玩家的在线锁。主要应用于lobby/game官方mod neteaseOnline。
参数
参数名 数据类型 说明 idx str 事件唯一id,回调时返回 uid str 玩家的netease uid,玩家的唯一标识 返回值
空
备注
- 目前只用于引擎,具体可以参见官方mod neteaseOnline
queryPlayerDataEvent
描述
玩家上线时,引擎读取玩家entity存档数据时触发本事件。不建议开发者使用本事件!只有【set_use_database_save】设置使用数据库存档后,本事件才有效。触发本事件,开发者需要从存档中读取玩家entity数据,然后通过【query_player_data_result】将修改后玩家entity数据设置回引擎。
参数
参数名 数据类型 说明 idx str 事件唯一id,【query_player_data_result】会使用到这个id playerKey str 玩家的netease uid,玩家的唯一标识 dbname str 数据库存档的前缀,可以通过【set_use_database_save】设置dbname 返回值
空
备注
- 不建议开发者使用本事件!用法详情见示例Mod neteaseDatabase
savePlayerDataEvent
描述
保存玩家数据事件,玩家下线时也会触发该事件。只有【set_use_database_save】 设置useDatabase为True时,本事件才生效。本事件的回调函数必须调用【save_player_data_result】函数,把存档状态告知引擎。
参数
参数名 数据类型 说明 idx str 引擎回调函数id,【save_player_data_result】会使用这个id playerKey str 玩家的netease uid,玩家的唯一标识 返回值
空
备注
- 可以用于定时将玩家数据存档,用法详情见示例Mod neteaseDatabase
savePlayerDataOnShutDownEvent
描述
游戏强制关闭过程中,玩家下线时会触发本事件。另外,只有【set_use_database_save】 设置useDatabase为True时,本事件才生效。本事件的回调函数必须调用【save_player_data_result】函数,把存档状态告知引擎。
参数
参数名 数据类型 说明 idx str 引擎回调函数id,【save_player_data_result】函数会使用这个id playerKey str 玩家的netease uid,玩家的唯一标识 返回值
空
备注
- 用于游戏关闭前把玩家数据存档,具体参见示例Mod neteaseDatabase。
master服务器事件
配置
NetGameCommonConfChangeEvent
描述
master公共配置netgame_common.json发生变化时触发。比如新增或删服服务器。
返回值
空
服务器
ServerConnectedEvent
描述
lobby/game/proxy成功建立连接时触发。
参数
参数名 数据类型 说明 serverId int 服务器id protocolVersion int 协议版本号 返回值
空
ServerDisconnectEvent
描述
lobby/game/proxy断开连接时触发。
参数
参数名 数据类型 说明 serverId int 服务器id 返回值
空
玩家
PlayerLoginServerEvent
描述
玩家开始登陆事件,此时master开始给玩家分配lobby/game。可以区分玩家是登录还是切服。
参数
参数名 数据类型 说明 serverId int 客户端连接的proxy服务器id neteaseId int 玩家的netease uid protocolVersion int 协议版本号 isTransfer bool True: 切服,False:登录 返回值
空
PlayerLogoutServerEvent
描述
玩家登出时触发,玩家在lobby/game下载行为包的过程中退出也会触发该事件。可以以区分玩家是登出还是切服。
参数
参数名 数据类型 说明 serverId int 客户端连接的proxy服务器id neteaseId int 玩家的netease uid isTransfer bool True: 切服,False:登出 返回值
空
PlayerTransferServerEvent
描述
玩家开始切服事件,此时master开始为玩家准备服务器,玩家还没切服完毕,后续可能切服失败。
参数
参数名 数据类型 说明 serverId int 客户端连接的proxy服务器id neteaseId int 玩家的netease uid targetServerId int 目标lobby/game服务器id targetServerType str 目标服务器类型,比如"game"或"lobby"。若targetServerId为0,则会从目标类型的多个服务器中随机选一个,作为目标服务器 protocolVersion int 协议版本号 transferParam str 切服参数。调用【TransferToOtherServer】或【TransferToOtherServerById】传入的切服参数。 返回值
空
service服务器事件
配置
NetGameCommonConfChangeEvent
描述
service公共配置netgame_common.json发生变化时触发。比如新增或删服服务器。
返回值
空
服务器
ServerConnectedEvent
描述
lobby/game/proxy成功建立连接时触发。
参数
参数名 数据类型 说明 serverId int 服务器id protocolVersion int 协议版本号 返回值
空
ServerDisconnectEvent
描述
lobby/game/proxy断开连接时触发。
参数
参数名 数据类型 说明 serverId int 服务器id 返回值
空
UpdateServerStatusEvent
描述
lobby/game/proxy状态发生变化时触发。
参数
参数名 数据类型 说明 服务器id的字符串 str 服务器状态。服务器状态如下:‘1’ 就绪状态,‘2’ 停止状态,‘3’ 准备状态。服务器状态为'1'时,服务器才可用,其他状态下,服务器不可用。 返回值
空
示例
xxxxxxxxxx
class TestService(ServiceSystem):
def __init__(self, namespace, systemName):
ServiceSystem.__init__(self, namespace, systemName)
self.ListenForEvent(
serviceApi.GetEngineNamespace(),
serviceApi.GetEngineSystemName(),
"UpdateServerStatusEvent",
self,
self.OnUpdateServerStatusEvent)
def OnUpdateServerStatusEvent(self, args):
print args
# 结果的一个示例:{'1000000':'1', '2000000':'3'}
# 含义:服务器id为1000000的服务器正常运行,服务器id为2000000的服务器处于准备状态。
master API
配置
GetCommonConfig
描述
获取公共配置netgame_common.json中内容,将该文件内容映射为一个dict。
返回值
数据类型 说明 dict 配置内容 示例
xxxxxxxxxx
import master.netgameApi as netMasterApi
conf = netMasterApi.GetCommonConfig()
serverlist = conf['serverlist'] #获取serverlist配置
bDebugLevel = conf['log_debug_level'] #获取日志等级配置
备注
- 取代【masterConf.netgameConf】,【masterConf.netgameConf】废弃。
IsService
描述
服务器是否是service服。
参数
参数名 数据类型 说明 serverId int 服务器id 返回值
数据类型 说明 bool True表示是service,False不是service 示例
xxxxxxxxxx
import master.netgameApi as netMasterApi
bService = netMasterApi.IsService(10)
备注
- 本api取代【masterConf.isService】,【masterConf.isService】废弃。
HTTP服务器
RegisterMasterHttp
描述
注册一个新的TTTP接口。
参数
参数名 数据类型 说明 url str 接口url binder instance 响应HTTP请求的实例 func function 响应HTTP请求的实例函数 返回值
空
示例
xxxxxxxxxx
import json
import master.masterHttp as masterHttp
class HttpHandler(object):
def __init__(self):
# 设置接口URI及回调
url = '/kick-user'
func = self.HttpTest
# 注册
masterHttp.RegisterMasterHttp(url, self, func)
def HttpTest(self, clientId, requestBody):
# clientId识别请求唯一id,SendHttpResponse中要携带该参数
# requestBody为post body内容。如果是json格式,则可以通过下面方式加载内容。
# import ujson as json
# request = json.loads(requestBody)
# 返回处理结果
response = '{"code":0,"message":"ok"}'
masterHttp.SendHttpResponse(clientId, response)
SendHttpRequestToService
描述
给service发送http请求。
参数
参数名 数据类型 说明 serverId int service的服务器id requestUrl str 请求url,例如“/test-reqeust” body str HTTP post body,是个json字符串 返回值
空
示例
xxxxxxxxxx
import json
import master.masterHttp as masterHttp
params = {
"message":"content",
"code":1
}
url = "/test-reqeust"
masterHttp.SendHttpRequestToService(10, url, json.dumps(params))
SendHttpResponse
描述
发送HTTP的Response。支持异步返回,返回时候指定请求传入的clientId。
参数
参数名 数据类型 说明 clientId int 请求唯一id,识别HTTP请求。 message str HTTP Response的内容 返回值
空
示例
xxxxxxxxxx
import json
import master.masterHttp as masterHttp
class HttpHandler(object):
def __init__(self):
# 设置接口URI及回调
url = '/kick-user'
func = self.HttpTest
# 注册
masterHttp.RegisterMasterHttp(url, self, func)
def HttpTest(self, clientId, requestBody):
# clientId识别请求唯一id,SendHttpResponse中要携带该参数
# requestBody为post body内容。如果是json格式,则可以通过下面方式加载内容。
# import ujson as json
# request = json.loads(requestBody)
# 返回处理结果
response = '{"code":0,"message":"ok"}'
masterHttp.SendHttpResponse(clientId, response)
服务器管理
GetAllServerStatus
描述
获取所有服务器的状态。只有状态2表示服务器正常服务,其他状态表示服务器不能服务。
返回值
数据类型 说明 dict key:int类型,服务器id,value:int类型,服务器状态。服务器状态如下:
1:断开连接状态
2:已连接状态
3:关服状态
4:优雅关服状态
6, 滚动更新中间状态,即将转换到状态7
7 也是滚动更新中间状态,即将转换到状态1或2示例
xxxxxxxxxx
import master.serverManager as serverManager
statusDict = serverManager.GetAllServerStatus()
GetAllServersOnlineNum
描述
获取所有服务器的在线人数。
返回值
数据类型 说明 dict key,int类型,表示服务器id,value,int类型,表示服务器在线人数 示例
xxxxxxxxxx
import master.serverManager as serverManager
onlineDict = serverManager.GetAllServersOnlineNum()
GetConnectedLobbyAndGameIds
描述
获取所有已经连接的lobby/game的服务器id列表。
返回值
数据类型 说明 list 服务器id列表,服务器id是int类型。 示例
xxxxxxxxxx
import master.serverManager as serverManager
idList = serverManager.GetConnectedLobbyAndGameIds()
GetOneServerStatus
描述
获取服务器状态。只有状态2表示服务器正常服务,其他状态表示服务器不能服务。
参数
参数名 数据类型 说明 serverId int 服务器id 返回值
数据类型 说明 int 服务器状态。服务器状态如下:
1:断开连接状态
2:已连接状态
3:关服状态
4:优雅关服状态
6, 滚动更新中间状态,即将转换到状态7
7 也是滚动更新中间状态,即将转换到状态1或2示例
xxxxxxxxxx
import master.serverManager as serverManager
status = serverManager.GetOneServerStatus(10)
GetOnlineNumByServerId
描述
获取服务器(lobby/game/proxy)的在线人数。
参数
参数名 数据类型 说明 serverId int 服务器id 返回值
数据类型 说明 int 在线人数 示例
xxxxxxxxxx
import master.serverManager as serverManager
num = serverManager.GetOnlineNumByServerId(10)
GetServerProtocolVersion
描述
获取服务器的协议版本号。多协议版本引擎中(比如同时支持1.14客户端和1.15客户端),需要把客户端分配到相同协议版本的lobby/game中。
参数
参数名 数据类型 说明 serverId int lobby/game服务器id 返回值
数据类型 说明 int 协议版本 示例
xxxxxxxxxx
import master.serverManager as serverManager
version = serverManager.GetServerProtocolVersion(10)
GetTotalOnlineNum
描述
获取总得在线人数。
返回值
数据类型 说明 int 在线人数 示例
xxxxxxxxxx
import master.serverManager as serverManager
num = serverManager.GetTotalOnlineNum()
IsConnectedServer
描述
master是否与lobby/game/proxy建立连接。
参数
参数名 数据类型 说明 serverId int 服务器id 返回值
数据类型 说明 bool True,已经建立连接;False未建立连接 示例
xxxxxxxxxx
import master.serverManager as serverManager
bConnect = serverManager.IsConnectedServer(10)
IsValidServer
描述
服务器是否有效。一种用途:master将玩家分配到服务器之前,会检查服务器是否有效,避免把玩家分配到一个即将关闭的服务器中。
参数
参数名 数据类型 说明 serverId int 服务器id 返回值
数据类型 说明 bool True,master已经同服务器建立链接,且服务器正在提供服务,不是即将关闭的服务。 示例
xxxxxxxxxx
import master.serverManager as serverManager
bValid = serverManager.IsValidServer(10)
StopServerByServerid
描述
关闭某个服务器。
参数
参数名 数据类型 说明 serverId int proxy/lobby/game服务器id actType int 1:强制踢出所有玩家后关服;2:等待所有玩家退出后关服 返回值
空
示例
xxxxxxxxxx
import master.serverManager as serverManager
serverManager.StopServerByServerid(10, 2)
service API
配置
GetCommonConfig
描述
获取公共配置netgame_common.json中内容,将该文件内容映射为一个dict。
返回值
数据类型 说明 dict 配置内容 示例
xxxxxxxxxx
import service.netgameApi as netServiceApi
conf = netServiceApi.GetCommonConfig()
serverlist = conf['serverlist'] #获取serverlist配置
serverlist = conf['log_debug_level'] #获取日志等级配置
备注
- 取代【serviceConf.netgameConf】,【serviceConf.netgameConf】废弃。
GetServerId
描述
获取服务器id。
返回值
数据类型 说明 int 服务器id,对应netgame_common.json中配置的serverid 示例
xxxxxxxxxx
import service.netgameApi as netServiceApi
serverId = netServiceApi.GetServerId()
GetServiceConfig
描述
获取service配置,该配置对应公共配置netgame_common.json中servicelist下对应service的配置。
返回值
数据类型 说明 dict 配置内容 示例
xxxxxxxxxx
import service.netgameApi as netServiceApi
serviceConf = netServiceApi.GetServiceConfig()
print serviceConf
# 结果实例如下:
# {
# "app_type": "service",
# "app_version": "1.15.0.release20191128",
# "http_port": 8520,
# "ip": "127.0.0.1",
# "mods": "service",
# "module_names": [
# "netease_salog_0",
# "netease_salog_1",
# "netease_uniqueid",
# "netease_stats_log_0",
# "netease_stats_log_1",
# "netease_stats_monitor"
# ],
# "serverid": 11,
# "type": "service"
# }
HTTP服务器
RegisterServiceHttp
描述
注册一个新的TTTP接口。
参数
参数名 数据类型 说明 url string 接口url binder instance 响应HTTP请求的实例 func function 响应HTTP请求的实例函数 返回值
空
示例
xxxxxxxxxx
import service.serviceHttp as serviceHttp
class HttpHandler(object):
def __init__(self):
# 设置接口URI及回调
url = '/kick-user'
func = self.HttpTest
# 注册
serviceHttp.RegisterServiceHttp(url, self, func)
def HttpTest(self, clientId, requestBody):
# clientId识别请求唯一id,send_http_response中要携带该参数
# requestBody为post body内容。如果是json格式,则可以通过下面方式加载内容。
# import ujson as json
# request = json.loads(requestBody)
# 返回处理结果
response = '{"code":0,"message":"ok"}'
serviceHttp.SendHttpResponse(clientId, response)
SendHttpRequestToMaster
描述
给master发送http请求。
参数
参数名 数据类型 说明 requestUrl string 请求url,例如“/test-reqeust” message string HTTP post body,是个json字符串 返回值
空
示例
xxxxxxxxxx
import service.serviceHttp as serviceHttp
params = {
"message":"content",
"code":1
url = "/test-reqeust"
serviceHttp.SendHttpRequestToMaster(url, json.dumps(params))
SendHttpResponse
描述
发送HTTP的Response。支持异步返回,返回时指定输入clientId。
参数
参数名 数据类型 说明 clientId int 请求唯一id,识别HTTP请求 message string HTTP Response的内容 返回值
空
示例
xxxxxxxxxx
import service.serviceHttp as serviceHttp
class HttpHandler(object):
def __init__(self):
# 设置接口URI及回调
url = '/kick-user'
func = self.HttpTest
# 注册
serviceHttp.RegisterServiceHttp(url, self, func)
def HttpTest(self, clientId, requestBody):
# clientId识别请求唯一id,send_http_response中要携带该参数
# requestBody为post body内容。如果是json格式,则可以通过下面方式加载内容。
# import ujson as json
# request = json.loads(requestBody)
# 返回处理结果
response = '{"code":0,"message":"ok"}'
serviceHttp.SendHttpResponse(clientId, response)
服务器管理
GetServerProtocolVersion
描述
获取服务器的协议版本号。多协议版本引擎中(比如同时支持1.14客户端和1.15客户端),需要把客户端分配到相同协议版本的lobby/game中。
参数
参数名 数据类型 说明 serverId int lobby/game服务器id 返回值
数据类型 说明 int 协议版本 示例
xxxxxxxxxx
import service.serverManager as serverManager
version = serverManager.GetServerProtocolVersion(10)
GetServersStatus
描述
获取所有lobby/game服务器的状态。只有状态1表示服务器正常服务,其他状态表示服务器不能服务。
返回值
数据类型 说明 dict key:int, 服务器id,value:int 服务器状态。服务器状态如下:
1:准备状态
2:停止状态
3:准备状态示例
xxxxxxxxxx
import service.serverManager as serverManager
statusDict = serverManager.GetServersStatus()
IsConnectedServer
描述
service是否与lobby/game/proxy建立连接。
参数
参数名 数据类型 说明 serverId int 服务器id 返回值
数据类型 说明 bool True,已经建立连接;False未建立连接 示例
xxxxxxxxxx
import service.serverManager as serverManager
bConnect = serverManager.IsConnectedServer(10)
lobby和game服务器API
服务器
CheckMasterExist
描述
检查服务器是否与master建立连接。
返回值
数据类型 说明 bool 是否与master建立连接 示例
xxxxxxxxxx
import lobbyGame.netgameApi as lobbyGameApi
exist = lobbyGameApi.CheckMasterExist()
GetOnlinePlayerNum
描述
获取当前服务器的在线人数。
返回值
数据类型 说明 int 当前服务器在线人数 示例
xxxxxxxxxx
import lobbyGame.netgameApi as lobbyGameApi
num = lobbyGameApi.GetOnlinePlayerNum()
IsShowDebugLog
描述
当前服务器是否打印debug等级的日志
返回值
数据类型 说明 bool True,打印debug log,否则不打印debug log 示例
xxxxxxxxxx
import lobbyGame.netgameApi as lobbyGameApi
bDebug = lobbyGameApi.IsShowDebugLog()
备注
- 基本无需关注
玩家
GetConnectingProxyIdOfPlayer
描述
获取玩家客户端连接的proxy服务器id。
参数
参数名 数据类型 说明 playerId str 玩家对象的entityId 返回值
数据类型 说明 int proxy服务器id 示例
xxxxxxxxxx
import lobbyGame.netgameApi as lobbyGameApi
nickname = lobbyGameApi.GetConnectingProxyIdOfPlayer(playerId)
GetPlayerLockResult
描述
把获取玩家在线锁结果告知给引擎层。本api应用于官方mod neteaseOnline,不建议开发者使用。
参数
参数名 数据类型 说明 id int 对应【ServerGetPlayerLockEvent】事件的传入唯一ID success bool 是否成功 返回值
空
示例
xxxxxxxxxx
import lobbyGame.netgameApi as lobbyGameApi
lobbyGameApi.GetPlayerLockResult(id, suc)
备注
- 用法详情见示例Mod online
GetPlayerNickname
描述
获取玩家的昵称。
参数
参数名 数据类型 说明 playerId str 玩家对象的entityId 返回值
数据类型 说明 str 昵称 示例
xxxxxxxxxx
import lobbyGame.netgameApi as lobbyGameApi
nickname = lobbyGameApi.GetPlayerNickname(playerId)
备注
- 用法详情见示例Mod sample
GetPlayerUid
描述
获取玩家的uid。
参数
参数名 数据类型 说明 playerId str 玩家对象的entityId 返回值
数据类型 说明 int 玩家的uid;玩家的唯一标识。 示例
xxxxxxxxxx
import lobbyGame.netgameApi as lobbyGameApi
uid = lobbyGameApi.GetPlayerUid(playerId)
备注
- 用法详情见示例Mod sample
ReleasePlayerLockResult
描述
把释放玩家在线锁结果告知给引擎层。本api应用于官方mod neteaseOnline,不建议开发者使用。
参数
参数名 数据类型 说明 id int 对应【ServerReleasePlayerLockEvent/ServerReleasePlayerLockOnShutDownEvent】事件传入的唯一ID success bool 是否成功 返回值
空
示例
xxxxxxxxxx
import lobbyGame.netgameApi as lobbyGameApi
lobbyGameApi.ReleasePlayerLockResult(id, suc)
备注
- 用法详情见示例Mod online
SetAutoRespawn
描述
设置是否启用自动重生逻辑。
参数
参数名 数据类型 说明 autoRespawn bool 是否启用自动重生逻辑 internalSeconds int 每隔多少秒,检查是否满足自动重生条件 minY int 高度低于多少,就会触发自动重生逻辑 x int 自动重生逻辑触发后,重生点的坐标 y int 自动重生逻辑触发后,重生点的坐标 z int 自动重生逻辑触发后,重生点的坐标 返回值
空
示例
xxxxxxxxxx
import lobbyGame.netgameApi as lobbyGameApi
lobbyGameApi.SetAutoRespawn(autoRespawn, internalSeconds, minY, x, y, z)
ShieldPlayerJoinText
描述
是否屏蔽客户端左上角 “xxx 加入了游戏”的提示。
参数
参数名 数据类型 说明 bShield bool True,不显示提示;False,显示提示 返回值
空
示例
xxxxxxxxxx
import lobbyGame.netgameApi as lobbyGameApi
lobbyGameApi.ShieldPlayerJoinText(True)
TryToKickoutPlayer
描述
把玩家踢下线,message中的文字会显示在客户端的断线提示中
参数
参数名 数据类型 说明 playerId str 玩家对象的entityId message str 踢掉玩家的理由,默认为空 返回值
空
示例
xxxxxxxxxx
import lobbyGame.netgameApi as lobbyGameApi
lobbyGameApi.TryToKickoutPlayer(playerId, "GM把你踢下线")
切服
TransferToOtherServer
描述
玩家转移到指定类型的服务器,假如同类服务器有多个,就根据负载均衡选择一个。
参数
参数名 数据类型 说明 playerId str 玩家对象的entityId typeName str 目标服务器的类型,netgame_commom.json中配置的type,比如lobby,game transferParam str 切服传入参数,默认空字符串。当玩家跳转到目标服务器触发AddServerPlayerEvent事件时,AddServerPlayerEvent事件会携带这个参数 返回值
空
示例
xxxxxxxxxx
import json
import lobbyGame.netgameApi as lobbyGameApi
transData = {'position' : [1,2,3]}
lobbyGameApi.TransferToOtherServer('123', 'game', json.dumps(transData))
TransferToOtherServerById
描述
玩家迁移到指定服务器id的服务器。
参数
参数名 数据类型 说明 playerId str 玩家对象的entityId serverId str 目标服务器id,对应netgame_common.json中配置的serverid transferParam str 切服传入参数,默认空字符串。当玩家跳转到目标服务器触发AddServerPlayerEvent事件时,AddServerPlayerEvent事件会携带这个参数 返回值
空
示例
xxxxxxxxxx
import json
import lobbyGame.netgameApi as lobbyGameApi
transData = {'position' : [1,2,3]}
lobbyGameApi.TransferToOtherServerById('123', 2000000, json.dumps(transData))
备注
- 用法详情见示例Mod sample
商城
NotifyClientToOpenShopUi
描述
通知客户端打开商城界面。
参数
参数名 数据类型 说明 playerId str 玩家对象的entityId 返回值
空
示例
xxxxxxxxxx
import lobbyGame.netgameApi as lobbyGameApi
lobbyGameApi.NotifyClientToOpenShopUi('123456')
性能开关
ChangeAllPerformanceSwitch
描述
整体关闭/打开预定义的游戏原生逻辑,所有的逻辑默认状态均为【开】(也就是is_disable=False),只有当调用此接口关闭之后,才会进入到【关】的状态,关闭这类原生逻辑能够提高服务器的性能,承载更高的同时在线人数,同时也会使一些生存服的玩法失效。另外,强烈建议在服务器初始化时调用此接口,同时不要在服务器运行中途修改。
参数
参数名 数据类型 说明 is_disable bool True代表【关】,False代表【开】 extra list 剔除掉不需要改变开关状态的具体功能的枚举值列表。默认为空 返回值
空
示例
xxxxxxxxxx
import lobbyGame.netgameApi as lobbyGameApi
lobbyGameApi.ChangeAllPerformanceSwitch(True)
备注
- 当extra的值为None的时候,默认影响到的开关不包括【LoadSavedEntityFromChunk】和【ScanNearbyEntityOnTick】。
ChangePerformanceSwitch
描述
关闭/打开某个游戏原生逻辑,所有的逻辑默认状态均为【开】(也就是is_disable=False),只有当调用此接口关闭之后,才会进入到【关】的状态,关闭这类原生逻辑能够提高服务器的性能,承载更高的同时在线人数,同时也会使一些生存服的玩法失效。另外,强烈建议在服务器初始化时调用此接口,同时不要在服务器运行中途修改。
参数
参数名 数据类型 说明 key int 具体功能的枚举值,详情见备注 isDisable bool True代表【关】,False代表【开】 返回值
空
示例
xxxxxxxxxx
import lobbyGame.netgameApi as lobbyGameApi
import lobbyGame.netgameConsts as netgameConsts
lobbyGameApi.ChangePerformanceSwitch(netgameConsts.DisableSwitch.ChunkLoadUsePriority, True)
备注
所有开关的枚举值以及涵义
xxxxxxxxxx
class DisableSwitch(object):
# 加载chunk时,是否根据chunk的坐标与当前在线玩家的坐标计算加权优先级(性能较低),disable后所有chunk的加载优先级相同
ChunkLoadUsePriority = 1
# 是否刷新红石帧,disable后红石不再刷新
RedstoneOnTick = 2
# 是否存档chunk,disable后对地图chunk的修改不会再存档到地图文件
ChunkSaveOnTick = 3
# 是否关闭服务器的移动开始/移动结束事件(性能较低),disable后服务器引擎层不再dispatch上述两个事件
WalkAnimPostEvent = 4
# 是否在登录完成后发送服务器配方表,disable后客户端无法收到登录后的配方表
RecipesSyncOnLogin = 5
# 是否执行滑翔状态的每帧刷新逻辑,disable后一旦进入滑翔状态,将会出现状态更新异常
UpdateGlidingOnTick = 6
# 是否执行背包/操作栏的每帧刷新逻辑,disable后服务器停止背包帧刷新
UpdateContainerOnTick = 7
# 是否执行物品推挤的每帧刷新逻辑,disable后无法推动地图上的物品
PushEntitiesOnTick = 8
# 是否执行entity在block中的每帧特殊判定逻辑,disable后传送门无法启动传送,另外被卡在方块中也不会掉血
UpdateInsideBlockOnTick = 9
# 是否执行entity在特殊地形上的每帧特殊判定逻辑,disable后站在仙人掌、熔岩石上面不会受伤(站在仙人掌侧面依旧会受伤)
BlockDamageOnTick = 10
# 是否每帧检查环境音的播放,disable之后从每帧检测降频到每秒检测
PlayAmbientSoundPerTick = 11
# 是否每帧刷新剩余无敌时间,disable之后会导致伤害判定异常,仅适合非战斗场景
UpdateHurtOnTick = 12
# 是否每帧检查entity属性变化并同步,disable之后从每帧检测降频到每秒检测
SendDirtyActorPerTick = 13
# 是否执行饥饿逻辑,disable之后饥饿不再按时间增长
ApplyExhaustionOnTick = 14
# 是否每帧检查人物朝向,disable之后,一些特殊NPC或怪物的朝向逻辑不再生效
UpdateInteractionOnTick = 15
# 是否每帧检查人物副手装备变化并同步,disable之后不再群发同步副手装备变化
UpdateOffhandItemOnTick = 16
# 是否每帧检查附近可捡取的物品道具,disable之后会捡不到经验球等物品
PickEntityOnTick = 17
# 是否每帧同步附近的道具箱等特殊物件的内容物,disable之后自带物品格的刷新会失效
SyncComplexItemOnTick = 18
# 是否每帧执行chunk的tick逻辑,disable之后从每帧执行降频到每秒执行
UpdateChunkPerTick = 19
# 是否在条件符合时,刷新生物群落,disable之后不会按群落刷新生物
SpawnMobsOnTick = 20
# 是否在条件符合时,清理多余的群落生物,disable之后群落生物不再回收
DespawnMobsOnTick = 21
# 是否每帧刷新天气相关的特殊block逻辑,disable之后,闪电、骷髅陷阱等不再刷新
UpdateBlocksOnTick = 22
# 是否每帧执行天气刷新逻辑,disable之后,天气不再刷新(打雷下雨)
UpdateWeatherOnTick = 23
# 是否每帧执行季节刷新逻辑,disable之后,季节不再刷新
UpdateSeasonOnTick = 24
# 是否每帧执行季节后处理逻辑,disable之后,会影响积雪等相关逻辑
BackgroundSeasonOnTick = 25
# 是否执行全局entity和自由entity的逻辑帧刷新,disable之后,所有不在player视野内的entity都会停止刷新
LevelEntityOnTick = 26
是否不加载chunk存档中的entity,disable之后,entity的存档将失效
LoadSavedEntityFromChunk = 27
# 是否每帧执行视野范围内的entity对象刷新,disable之后,服务器不再会将视野范围内的entity对象同步给客户端
ScanNearbyEntityOnTick = 28
关服
SetGracefulShutdownOk
描述
设置脚本层的优雅关机逻辑已经执行完毕,引擎可以开始优雅关机了。
返回值
空
示例
xxxxxxxxxx
import lobbyGame.netgameApi as lobbyGameApi
lobbyGameApi.SetGracefulShutdownOk()
备注
- 用法详情见示例Mod shutdown
SetShutdownOk
描述
设置脚本层的强制关机逻辑已经执行完毕,引擎可以开始强制关机了。
返回值
空
示例
xxxxxxxxxx
import lobbyGame.netgameApi as lobbyGameApi
lobbyGameApi.SetShutdownOk()
备注
- 用法详情见示例Mod shutdown
配置
GetCommonConfig
描述
获取公共配置netgame_common.json中内容,将该文件内容映射为一个dict。
返回值
数据类型 说明 dict 配置内容 示例
xxxxxxxxxx
import lobbyGame.netgameApi as lobbyGameApi
conf = lobbyGameApi.GetCommonConfig()
bDebugLevel = conf['log_debug_level'] #获取日志等级配置
备注
- 注意:lobby/game 公共配置中"serverlist"和"servicelist"配置不是最新的。
GetMongoConfig
描述
获取mongo数据库的连接参数,对应netgame_common.json中mongo配置
返回值
数据类型 说明 tuple (exist, host, user, password, database, port).exist:bool,是否存在mongo数据库配置; host:str, mongo数据库的地址;user:str,mongo数据库的访问用户; port:int, mongo数据库的端口; password:str,mongo数据库的访问密码;database:str,mongo数据库的数据库名 示例
xxxxxxxxxx
import lobbyGame.netgameApi as lobbyGameApi
exist, host, user, password, database, port = lobbyGameApi.GetMongoConfig()
GetMysqlConfig
描述
获取mysql数据库的连接参数,对应netgame_common.json中mysql配置
返回值
数据类型 说明 tuple (exist, host, user, password, database, port).exist:bool,是否存在mysql数据库配置; host:string, mysql数据库的地址;user:string,mysql数据库的访问用户; port:int, mysql数据库的端口; password:string,mysql数据库的访问密码;database:string,mysql数据库的数据库名 示例
xxxxxxxxxx
import lobbyGame.netgameApi as lobbyGameApi
exist, host, user, password, database, port = lobbyGameApi.GetMysqlConfig()
GetRedisConfig
描述
获取redis数据库的连接参数,对应netgame_common.json中redis配置
返回值
数据类型 说明 tuple (exist, host, port, password).exist:bool,是否存在redis配置; host:str, redis数据库的地址;port:int, redis数据库的端口; password:str,redis数据库的访问密码 示例
xxxxxxxxxx
import lobbyGame.netgameApi as lobbyGameApi
exist, host, port, password = lobbyGameApi.GetRedisConfig()
GetServerId
描述
获取服务器id。
返回值
数据类型 说明 int 服务器id,对应netgame_common.json中配置的serverid 示例
xxxxxxxxxx
import lobbyGame.netgameApi as lobbyGameApi
serverId = lobbyGameApi.GetServerId()
存档
QueryPlayerDataResult
描述
把mc地图中玩家存档字符串告知引擎。仅用于引擎,不建议使用本api。需要在queryPlayerDataEvent事件的监听函数中调用本api。
参数
参数名 数据类型 说明 dbCallIndex int 对应【queryPlayerDataEvent】事件的传入唯一ID success bool 是否成功 dataStr str mc地图中玩家存档字符串。 返回值
空
示例
xxxxxxxxxx
import lobbyGame.netgameApi as lobbyGameApi
lobbyGameApi.QueryPlayerDataResult(dbCallIndex, success, dataStr)
备注
- 用法详情见示例Mod neteaseDatabase
SavePlayerDataResult
描述
把玩家数据存档状态告知引擎。mod中需要把玩家数据保存到mysql/mongo中。在savePlayerDataOnShutDownEvent/savePlayerDataEvent事件的监听函数中调用本api。
参数
参数名 数据类型 说明 dbCallIndex int 【savePlayerDataEvent/savePlayerDataOnShutDownEvent】事件中传入唯一ID success bool 存档是否成功 返回值
空
示例
xxxxxxxxxx
import lobbyGame.netgameApi as lobbyGameApi
lobbyGameApi.SavePlayerDataResult(dbCallIndex, success)
备注
- 用法详情见示例Mod neteaseDatabase
SetUseDatabaseSave
描述
设置是否使用数据库定时存档。定时存档会定时触发savePlayerDataEvent事件。
参数
参数名 数据类型 说明 bUseDatabase bool 是否使用数据库 dbName str 30个字符内的英文字符串,建议使用项目英文名 internalSaveSecond int 触发定时存档的时间间隔,单位秒 返回值
空
示例
xxxxxxxxxx
import lobbyGame.netgameApi as lobbyGameApi
lobbyGameApi.SetUseDatabaseSave(True, 'test', 30)
备注
- 用法详情见示例Mod neteaseDatabase
地图
SetEnableLimitArea
描述
设置地图最大区域,超过区域的地形不再生成。
参数
参数名 数据类型 说明 limit bool 是否启用地区区域限制 x int 地图区域的中心点 y int 地图区域的中心点 z int 地图区域的中心点 offsetX int 地图区域在x方向和z方向的最大偏移 offsetZ int 地图区域在x方向和z方向的最大偏移 返回值
空
示例
xxxxxxxxxx
import lobbyGame.netgameApi as lobbyGameApi
lobbyGameApi.SetEnableLimitArea(limit, x, y, z, offsetX, offsetZ)
备注
- 真实应用中,请用墙壁把区域围起来。
SetLevelGameType
描述
强制设置游戏的玩法模式。
参数
参数名 数据类型 说明 mode int 0生存模式,1创造模式,2冒险模式 返回值
空
示例
xxxxxxxxxx
import lobbyGame.netgameApi as lobbyGameApi
lobbyGameApi.SetLevelGameType(2)
备注
- 真实应用中,请在服务器Mod初始化时调用此函数
lobby服务器API
主城模式
SetCityMode
描述
设置游戏为主城模式:包括有无法改变地形,不切换日夜,不改变天气,不刷新生物等限制。
参数
参数名 数据类型 说明 isCityMode bool 是否为主城模式 返回值
空
示例
xxxxxxxxxx
import lobby.netgameApi as lobbyApi
lobbyApi.SetCityMode(isCityMode)
备注
- 用法详情见示例Mod sample
master/service/game/lobby 公共API
myqsl、redis、mong连接池用于处理单个db实例,myqsl、redis、mong连接池扩展用于处理多个db实例。
异步线程池
EmitOrder
描述
添加一个异步任务。
参数
参数名 数据类型 说明 key string/int 相同key的任务,线程池顺序执行;不同key的任务,线程池会并行执行。可以确认某些任务按照顺序执行。 func function 任务对应的函数,该函数会在线程池中运行。该任务和主线程会并行执行,需要确认任务是线程安全的。函数必须返回一个元组,若返回为空则要求返回空元组("()")。函数输入参数是*args callback function 回调函数,它在主线程执行。func的返回值会是callback的实参 *args *args func函数的非关键字参数 返回值
空
示例
xxxxxxxxxx
import time
import apolloCommon.workerPool as workerPool
def Callbacks(idx, result):
print "callbacks",idx, result
def Test(idx):
print "test start %d" % idx
time.sleep(1)
print "test fin %d" % idx
result = idx + 5
return (idx, result)#任务必须有返回值。若没有返回值,请返回 "()"
ins = workerPool.ForkNewPool(4)
for i in xrange(4):
#添加异步任务。i为奇数的任务顺序执行,i为偶数的任务顺序执行。这两批任务并行执行。
ins.EmitOrder(i%2, Test, Callbacks, i)
ins.Finish(None) #等待线程池退出。
Finish
描述
等待线程池退出,线程池会执行完所有异步任务后退出,会阻塞主线程。建议Mod退出时执行。
参数
参数名 数据类型 说明 timeout int 等待线程池退出时间,单位秒。若为None,则会一直等待。建议用None。 返回值
空
示例
xxxxxxxxxx
import apolloCommon.workerPool as workerPool
ins = workerPool.ForkNewPool(4)
ins.Finish(None) #等待线程池退出。
ForkNewPool
描述
创建线程池,设置线程池大小。
参数
参数名 数据类型 说明 orderSize int 线程池的大小 返回值
数据类型 说明 MainPool 线程池实例 示例
xxxxxxxxxx
import apolloCommon.workerPool as workerPool
ins = workerPool.ForkNewPool(10)
mysql连接池
AsyncExecuteWithOrderKey
描述
添加一个异步mysql任务,执行所有mysql操作。
参数
参数名 数据类型 说明 orderKey str/int 相同的orderKey会顺序执行,不同的orderKey会并行执行 sql str mysql查询语句,格式化字符串 params tuple 填充sql callback function 回调函数,只有一个输入参数,它在主线程执行。func的返回值会是callback的实参。若func抛出异常,则callback输入参数是None 返回值
空
示例
xxxxxxxxxx
import apolloCommon.mysqlPool as mysqlPool
mysqlPool.InitDB(30)
def Cb(t):
print "cb", t
#添加异步任务。
mysqlPool.AsyncExecuteWithOrderKey('player', 'insert into player values (%s, %s)', (1, "test1"), Cb)
mysqlPool.Finish()
AsyncExecutemanyWithOrderKey
描述
添加一个异步mysql任务,针对同一条sql语句,使用paramsList中的每个参数各执行一次,并且返回成功修改/新建的记录数,其中任何一条语句执行失败,最终所有语句都会被执行失败,返回None
参数
参数名 数据类型 说明 orderKey string/int 相同的orderKey会顺序执行,不同的orderKey会并行执行 sql string mysql插入语句,格式化字符串 list list 填充sql的参数列表,每个元素都会被执行一次 callback function 回调函数,在主线程执行,只有唯一一个参数,成功修改/新建的记录数,假如sql执行失败,返回参数将会是None 返回值
空
示例
xxxxxxxxxx
import time
import apolloCommon.mysqlPool as mysqlPool
mysqlPool.InitDB(30)
def Cb(t):
print "cb", t
#添加异步任务。
mysqlPool.AsyncExecutemanyWithOrderKey('pay', 'insert into pay values (%s, %s)', [(1,"648"),(1,"328")], Cb)
for i in xrange(100):
mysqlPool.Tick()
time.sleep(0.2)
mysqlPool.Finish()
AsyncInsertOneWithOrderKey
描述
添加一个异步mysql任务,向主键为AUTO INCREASEl类型的表格中插入一条记录,并且返回新建记录的主键。
参数
参数名 数据类型 说明 orderKey string/int 相同的orderKey会顺序执行,不同的orderKey会并行执行 sql string mysql插入语句,格式化字符串 params tuple 填充sql callback function 回调函数,在主线程执行,只有唯一一个参数,是新建记录的主键,假如sql执行失败,返回参数将会是None 返回值
空
示例
xxxxxxxxxx
import apolloCommon.mysqlPool as mysqlPool
mysqlPool.InitDB(30)
def Cb(t):
print "cb", t
#添加异步任务。
mysqlPool.AsyncInsertOneWithOrderKey('pay', 'insert into pay values (%s, %s)', (1, "648"), Cb)
mysqlPool.Finish()
AsyncQueryWithOrderKey
描述
添加一个异步mysql任务,执行mysql查询。
参数
参数名 数据类型 说明 orderKey str/int 相同的orderKey会顺序执行,不同的orderKey会并行执行 sql str mysql查询语句,格式化字符串 params tuple 填充sql callback function 回调函数,只有一个输入参数,它在主线程执行。func的返回值会是callback的实参。若func抛出异常,则callback输入参数是None 返回值
空
示例
xxxxxxxxxx
import apolloCommon.mysqlPool as mysqlPool
mysqlPool.InitDB(30)
def Cb(t):
print "cb", t
#添加异步任务。
mysqlPool.AsyncQueryWithOrderKey('player', 'select uid,name from player where uid = %s', (1,), Cb)
#等价于
#mysqlPool.AsyncQuery('player', 'select uid,name from player where uid = %s', (1,), Cb)
#orderKey都是'player',两个任务顺序执行。
mysqlPool.AsyncQueryWithOrderKey('player', 'select uid,name from player where uid = %s', (1,), Cb)
mysqlPool.Finish()
Finish
描述
等待mysql线程池退出,会等待线程池中所有异步任务执行完毕后退出。
返回值
空
示例
xxxxxxxxxx
import apolloCommon.mysqlPool as mysqlPool
mysqlPool.Finish()
InitDB
描述
初始化myqsl连接池。要求公共配置 netgame_common.json中配置“mysql”。
参数
参数名 数据类型 说明 poolSize int 连接池大小 返回值
空
示例
xxxxxxxxxx
import apolloCommon.mysqlPool as mysqlPool
mysqlPool.InitDB(30)
备注
- netgame_common.json中部分配置的示例如下:
xxxxxxxxxx
"mysql": {
"database": "mod_test",
"host": "127.0.0.1",
"password": "test",
"port": 3306,
"user": "test"
},
redis连接池
AsyncDelete
描述
执行redis操作,删除某个redis key,相当于redis中执行命令:del key。
参数
参数名 数据类型 说明 key string redis中的key callback function 回调函数,输入参数是redis操作返回值,是个int,表示删除redis key的个数 ,它在主线程执行。可以不传入回调函数。若redis操作抛出异常,则callback输入参数是None 返回值
空
示例
xxxxxxxxxx
import apolloCommon.redisPool as redisPool
def Cb1(t):
print "cb", t
redisPool.InitDB(30) #建立连接池
keys = ("player_121", "player_122")
redisPool.AsyncDelete('player_121', cb1)
redisPool.Finish()
AsyncFuncWithKey
描述
添加一个异步redis任务。
参数
参数名 数据类型 说明 func function redis异步任务,可以没有返回值。该任务和主线程会并行执行,要求任务是线程安全的。第一个参数是一个redis长连接,是一个redis.StrictRedis实例,其他参数是*args orderKey str/int 相同的orderKey会顺序执行,不同的orderKey会并行执行 callback function 回调函数,只有一个输入参数,它在主线程执行。func的返回值是callback的输入参数。若func抛出异常,则callback输入参数是None *args *args func的其它非关键字参数 **kwargs **kwargs 暂无用,预留用。 返回值
空
示例
xxxxxxxxxx
import apolloCommon.redisPool as redisPool
redisPool.InitDB(30) #建立连接池
#回调,可以获取player的信息。这里只是打印结果。
def Cb1(t):
print "cb", t
#第一个参数是redis.StrictRedis实例。
def GetValueFromKey(conn, key):
return conn.get(key)
#插入一个任务,从redis中获取uid为123玩家的信息。
redisPool.AsyncFuncWithKey(GetValueFromKey, "player_123", Cb1, 123)
#插入同样任务,orderKey都是“player_123”,因此两个任务会顺序执行。
redisPool.AsyncFuncWithKey(GetValueFromKey, "player_123", Cb1, 123)
redisPool.Finish()
AsyncGet
描述
执行redis操作,获取key的value,相当于redis中执行命令:get key。
参数
参数名 数据类型 说明 key str redis中的key callback function 回调函数,默认为空。函数输入参数是redis key对应的value字符串,它在主线程执行。若redis操作抛出异常,则callback输入参数是None 返回值
空
示例
xxxxxxxxxx
import apolloCommon.redisPool as redisPool
def Cb1(t):
print "cb", t
redisPool.InitDB(30) #建立连接池
redisPool.AsyncGet("player_123", Cb1)
redisPool.Finish()
AsyncHgetall
描述
执行redis操作,获取key的value,相当于redis中执行命令:hgetall key。
参数
参数名 数据类型 说明 key string redis中的key callback function 回调函数,输入参数是redis key对应的值,是个dict,它在主线程执行。可以不传入回调函数。若redis操作抛出异常,则callback输入参数是None 返回值
空
示例
xxxxxxxxxx
import apolloCommon.redisPool as redisPool
def Cb1(t):
print "cb", t
redisPool.InitDB(30) #建立连接池
redisPool.AsyncHgetall("mplayer_123", Cb1)
redisPool.Finish()
AsyncMget
描述
执行redis操作,获取多个key的值,相当于redis中执行命令:mget key1 key2 ...。
参数
参数名 数据类型 说明 key list/tuple 多个redis中的key callback function 回调函数,默认为空。函数输入参数redis操作返回值, 是个列表,每个元素对应单个redis key的值,它在主线程执行。若redis操作抛出异常,则callback输入参数是None 返回值
空
示例
xxxxxxxxxx
import apolloCommon.redisPool as redisPool
def Cb1(t):
print "cb", t
redisPool.InitDB(30) #建立连接池
keys = ("player_121", "player_122")
redisPool.AsyncMget(keys, Cb1)
redisPool.Finish()
AsyncSet
描述
执行redis操作,设置key的值为value,相当于redis中执行命令:set key value。
参数
参数名 数据类型 说明 key string redis中的key value string redis中key的值 callback function 回调函数,默认为空。函数输入参数是redis操作返回值,True表示设置成功,False失败。 若redis操作抛出异常,则callback输入参数是None 返回值
空
示例
xxxxxxxxxx
import apolloCommon.redisPool as redisPool
redisPool.InitDB(30) #建立连接池
redisPool.AsyncSet('player_123', "{'name':'nickname'}")
redisPool.Finish()
Finish
描述
等待redis线程池退出,会等待线程池中所有异步任务执行完毕后退出。
返回值
空
示例
xxxxxxxxxx
import apolloCommon.redisPool as redisPool
redisPool.InitDB(30) #建立连接池
#添加异步任务。在redis中执行:set "key1", "value11"
redisPool.AsyncSet("key1", "value11")
redisPool.Finish()
InitDB
描述
初始化redis连接池。要求公共配置 netgame_common.json中配置“redis”。
参数
参数名 数据类型 说明 poolSize int 连接池大小 返回值
空
示例
xxxxxxxxxx
import apolloCommon.redisPool as redisPool
redisPool.InitDB(30)
备注
- netgame_common.json中部分配置的示例如下:
xxxxxxxxxx
"redis": {
"host": "127.0.0.1",
"password": "",
"port": 6379
},
mongo连接池
AsyncExecute
描述
添加一个异步mongo任务。
参数
参数名 数据类型 说明 collection str mongo中的一个集合,相同集合的所有操作串行执行,不同集合操作并行执行 func function mongo异步任务,可以没有返回值。该任务和主线程会并行执行,要求任务是线程安全的。第一个参数是一个mongo长连接,是pymongo.MongoClient连接池实例中的一个连接 callback function 回调函数,只有一个输入参数,它在主线程执行。func的返回值会是callback的实参。若func抛出异常,则callback输入参数是None *args *args func的其它非关键字参数 **kwargs **kwargs 暂无用,预留用。 返回值
空
示例
xxxxxxxxxx
import apolloCommon.mongoPool as mongoPool
mongoPool.InitDB(32)
def Insert(col):
postData = {
'title': 'Python and MongoDB',
'content': 'PyMongo is fun, you guys',
'author': 'Scott'
}
col.insert_one(postData)
def Cb(t):
print "cb", t
#添加异步任务。
mongoPool.AsyncExecute("test_col", Insert, Cb)
mongoPool.Finish()
AsyncExecuteWithOrderKey
描述
添加一个异步mongo任务。同async_execute区别是,可以显示设置orderKey。
参数
参数名 数据类型 说明 collection str mongo中的一个集合 func function mongo异步任务,可以没有返回值。该任务和主线程会并行执行,要求任务是线程安全的。第一个参数是一个mongo长连接,是pymongo.MongoClient连接池实例中的一个连接 orderKey str/int 相同的orderKey会顺序执行,不同的orderKey会并行执行 callback function 回调函数,只有一个输入参数,它在主线程执行。func的返回值会是callback的实参。若func抛出异常,则callback输入参数是None *args *args func的其它非关键字参数 **kwargs **kwargs 暂无用,预留用。 返回值
空
示例
xxxxxxxxxx
import apolloCommon.mongoPool as mongoPool
mongoPool.InitDB(32)
def Insert(col):
postData = {
'title': 'Python and MongoDB',
'content': 'PyMongo is fun, you guys',
'author': 'Scott'
}
col.insert_one(postData)
def Cb(t):
print "cb", t
#添加异步任务。
#下面操作相当于:mongoPool.AsyncExecute("test_col", Insert, Cb)
mongoPool.AsyncExecuteWithOrderKey("test_col", Insert, "test_col", Cb)
#添加相同任务,两个任务顺序执行。
mongoPool.AsyncExecuteWithOrderKey("test_col", Insert, "test_col", Cb)
mongoPool.Finish()
Finish
描述
等待mongo线程池退出,会等待线程池中所有异步任务执行完毕后退出。
返回值
空
示例
xxxxxxxxxx
import apolloCommon.mongoPool as mongoPool
mongoPool.InitDB(32)
mongoPool.Finish()
InitDB
描述
初始化mongo连接池。要求公共配置 netgame_common.json中配置“mongo”。
参数
参数名 数据类型 说明 poolSize int 连接池大小 返回值
空
示例
xxxxxxxxxx
import apolloCommon.mongoPool as mongoPool
mongoPool.InitDB(32)
备注
- netgame_common.json部分配置的示例如下:
xxxxxxxxxx
"mongo": {
"database": "test",
"host": "127.0.0.1",
"password": "test",
"port": 27017,
"user": "test"
},
mysql连接池扩展
AsyncExecuteWithOrderKey
描述
添加一个异步mysql任务,执行所有mysql操作。同AsyncExecute的区别是可以显示指定orderKey
参数
参数名 数据类型 说明 dbName string mysql db名字,名字在netgame_common.json中extra_mysql下配置,比如示例配置中 “mysql_test1” orderKey string/int 相同的orderKey会顺序执行,不同的orderKey会并行执行 sql string mysql查询语句,格式化字符串 params tuple 填充sql callback function 回调函数,只有一个输入参数,它在主线程执行。func的返回值会是callback的实参。若func抛出异常,则callback输入参数是None 返回值
空
示例
xxxxxxxxxx
import apolloCommon.extraMysqlPool as extraMysqlPool
extraMysqlPool.InitDB('mysql_test1', 30)
def Cb(t):
print "cb", t
#添加异步任务。
extraMysqlPool.AsyncExecuteWithOrderKey('mysql_test1', 'player', 'insert into player values (%s, %s)', (1, "test1"), Cb)
extraMysqlPool.Finish()
AsyncQueryWithOrderKey
描述
添加一个异步mysql任务,执行mysql查询。同AsyncQuery区别是可以显示指定orderKey。
参数
参数名 数据类型 说明 dbName string mysql db名字,名字在netgame_common.json中extra_mysql下配置,比如示例配置中 “mysql_test1” orderKey string/int 相同的orderKey会顺序执行,不同的orderKey会并行执行 sql string mysql查询语句,格式化字符串 params tuple 填充sql callback function 回调函数,只有一个输入参数,它在主线程执行。func的返回值会是callback的实参。若func抛出异常,则callback输入参数是None 返回值
空
示例
xxxxxxxxxx
import apolloCommon.extraMysqlPool as extraMysqlPool
extraMysqlPool.InitDB('mysql_test1', 30)
def Cb(t):
print "cb", t
#添加异步任务。
extraMysqlPool.AsyncQueryWithOrderKey('mysql_test1', 'player', 'select uid,name from player where uid = %s', (1,), Cb)
#orderKey都是'player',两个任务顺序执行。
extraMysqlPool.AsyncQueryWithOrderKey('mysql_test1','player', 'select uid,name from player where uid = %s', (1,), Cb)
extraMysqlPool.Finish()
Finish
描述
等待mysql线程池退出,会等待线程池中所有异步任务执行完毕后退出。
返回值
空
示例
xxxxxxxxxx
import apolloCommon.extraMysqlPool as extraMysqlPool
extraMysqlPool.Finish()
InitDB
描述
初始化mysql连接池。可以支持多个mysql实例,它可以同“mysql连接池”一起使用。要求公共配置 netgame_common.json中配置“extra_mysql”。
参数
参数名 数据类型 说明 dbName string mysql db名字,名字在netgame_common.json中extra_mysql下配置,比如示例配置中 “mysql_test1” poolSize int 连接池大小 返回值
空
示例
xxxxxxxxxx
import apolloCommon.extraMysqlPool as extraMysqlPool
extraMysqlPool.InitDB('mysql_test1', 30)
备注
- netgame_common.json中部分配置的示例如下:
xxxxxxxxxx
"mysql": {
"database": "mod_test",
"host": "127.0.0.1",
"password": "test",
"port": 3306,
"user": "test"
},
"extra_mysql":{
"test1":{
"database": "mysql_test1",
"host": "127.0.0.2",
"password": "test",
"port": 3306,
"user": "test"
},
"test2":{
"database": "mysql_test2",
"host": "127.0.0.3",
"password": "test",
"port": 3306,
"user": "test"
}
},
redis连接池扩展
AsyncDelete
描述
执行redis操作,删除某个redis key,相当于redis中执行命令:del key
参数
参数名 数据类型 说明 dbName str redis db名字,名字在netgame_common.json中extra_redis下配置,比如示例配置中 “extra_redis1” key str redis中的key callback function 回调函数,默认为空。函数输入参数是redis操作返回值,是个int,表示删除redis key的个数 ,它在主线程执行。若redis操作抛出异常,则callback输入参数是None 返回值
空
示例
xxxxxxxxxx
import apolloCommon.extraRedisPool as extraRedisPool
def Cb1(t):
print "cb", t
extraRedisPool.InitDB('extra_redis1', 30) #建立连接池
extraRedisPool.AsyncDelete('extra_redis1', 'player_121', Cb1)
extraRedisPool.Finish()
AsyncFuncWithKey
描述
添加一个异步redis任务。
参数
参数名 数据类型 说明 dbName str redis db名字,名字在netgame_common.json中extra_redis下配置,比如示例配置中 “extra_redis1” func function redis异步任务,可以没有返回值。该任务和主线程会并行执行,要求任务是线程安全的。第一个参数是一个redis长连接,是一个redis.StrictRedis实例,其他参数是*args orderKey str/int 相同的orderKey会顺序执行,不同的orderKey会并行执行 callback function 回调函数,只有一个输入参数,它在主线程执行。func的返回值是callback的输入参数。若func抛出异常,则callback输入参数是None *args *args func的其它非关键字参数 **kwargs **kwargs 暂无用,预留用。 返回值
空
示例
xxxxxxxxxx
import apolloCommon.extraRedisPool as extraRedisPool
extraRedisPool.InitDB('extra_redis1', 30) #建立连接池
#回调,可以获取player的信息。这里只是打印结果。
def Cb1(t):
print "cb", t
#第一个参数是redis.StrictRedis实例。
def GetValueFromKey(conn, key):
return conn.get(key)
#插入一个任务,从redis中获取uid为123玩家的信息。
extraRedisPool.AsyncFuncWithKey('extra_redis1', GetValueFromKey, 'player_123', Cb1, 123)
#插入同样任务,orderKey都是“player_123”,因此两个任务会顺序执行。
extraRedisPool.AsyncFuncWithKey('extra_redis1', GetValueFromKey, 'player_123', Cb1, 123)
extra_redispool.finish()
AsyncGet
描述
执行redis操作,获取key的value,相当于redis中执行命令:get key。
参数
参数名 数据类型 说明 dbName str redis db名字,名字在netgame_common.json中extra_redis下配置,比如示例配置中 “extra_redis1” key str redis中的key callback function 回调函数,默认为空。函数输入参数是redis key对应的value字符串,它在主线程执行。若redis操作抛出异常,则callback输入参数是None 返回值
空
示例
xxxxxxxxxx
import apolloCommon.extraRedisPool as extraRedisPool
def Cb1(t):
print "cb", t
extraRedisPool.InitDB('extra_redis1', 30) #建立连接池
extraRedisPool.AsyncGet('extra_redis1','player_123', Cb1)
extraRedisPool.Finish()
AsyncHgetall
描述
执行redis操作,获取key的value,相当于redis中执行命令:hgetall key。
参数
参数名 数据类型 说明 dbName str redis db名字,名字在netgame_common.json中extra_redis下配置,比如示例配置中 “extra_redis1” key str redis中的key callback function 回调函数,默认为空,函数输入参数是redis key对应的值,是个dict,它在主线程执行。若redis操作抛出异常,则callback输入参数是None 返回值
空
示例
xxxxxxxxxx
import apolloCommon.extraRedisPool as extraRedisPool
def Cb1(t):
print "cb", t
extraRedisPool.InitDB('extra_redis1', 30) #建立连接池
extraRedisPool.AsyncHgetall('extra_redis1', 'player_123', Cb1)
extraRedisPool.Finish()
AsyncMget
描述
执行redis操作,获取多个key的值,相当于redis中执行命令:mget key1 key2 ...。
参数
参数名 数据类型 说明 dbName str redis db名字,名字在netgame_common.json中extra_redis下配置,比如示例配置中 “extra_redis1” keys list/tuple 多个redis key callback function 回调函数,默认为空,函数输入参数redis操作返回值, 是个列表,每个元素对应单个redis key的值,它在主线程执行。若redis操作抛出异常,则callback输入参数是None 返回值
空
示例
xxxxxxxxxx
import apolloCommon.extraRedisPool as extraRedisPool
def Cb1(t):
print "cb", t
extraRedisPool.InitDB('extra_redis1', 30) #建立连接池
keys = ('player_121', 'player_122')
extraRedisPool.AsyncMget('extra_redis1', keys, Cb1)
extraRedisPool.Finish()
AsyncSet
描述
执行redis操作,设置key的值为value,相当于redis中执行命令:set key value。
参数
参数名 数据类型 说明 dbName str redis db名字,名字在netgame_common.json中extra_redis下配置,比如示例配置中 “extra_redis1” key str redis中的key value str redis中key的值 callback function 回调函数,默认为空。函数输入参数是redis操作返回值,True表示设置成功,False失败。 若redis操作抛出异常,则callback输入参数是None。 返回值
空
示例
xxxxxxxxxx
import apolloCommon.extraRedisPool as extraRedisPool
extraRedisPool.InitDB('extra_redis1', 30) #建立连接池
extraRedisPool.AsyncSet('extra_redis1', 'player_123', "{'name':'nickname'}")
extraRedisPool.Finish()
Finish
描述
等待redis db线程池退出,会等待线程池中所有异步任务执行完毕后退出。
返回值
空
示例
xxxxxxxxxx
import apolloCommon.extraRedisPool as extraRedisPool
extraRedisPool.InitDB('extra_redis1', 30) #建立连接池
#回调,可以获取player的信息。这里只是打印结果。
def Cb1(t):
print "cb", t
#第一个参数是redis.StrictRedis实例。
def GetValueFromKey(conn, key):
return conn.get(key)
#插入一个任务,从redis中获取uid为123玩家的信息。
extraRedisPool.AsyncFuncWithKey('extra_redis1', GetValueFromKey, 'player_123', Cb1, 123)
extraRedisPool.Finish()
InitDB
描述
初始化redis连接池,它可以同“redis连接池”一起使用。要求公共配置 netgame_common.json中配置“extra_redis”。
参数
参数名 数据类型 说明 dbName str redis db名字,名字在netgame_common.json中extra_redis下配置,比如示例配置中 “extra_redis1”。 poolSize int 连接池大小 返回值
空
示例
xxxxxxxxxx
import apolloCommon.extraRedisPool as extraRedisPool
extraRedisPool.InitDB('extra_redis1', 30)
备注
- netgame_common.json中部分配置的示例如下:
xxxxxxxxxx
"redis": {
"host": "127.0.0.1",
"password": "",
"port": 6379
},
"extra_redis": {
"extra_redis1":{
"host": "127.0.0.2",
"password": "",
"port": 6379
},
"extra_redis2":{
"host": "127.0.0.3",
"password": "",
"port": 6379
}
},
mongo连接池扩展
AsyncExecute
描述
添加一个异步mongo任务。
参数
参数名 数据类型 说明 dbName str mongo db名字,名字在netgame_common.json中extra_mongo下配置,比如示例配置中 “mongo_test1” collection str mongo中的一个集合,相同集合的所有操作串行执行,不同集合操作并行执行 func function mongo异步任务,可以没有返回值。该任务和主线程会并行执行,要求任务是线程安全的。第一个参数是一个mongo长连接,是pymongo.MongoClient连接池实例中的一个连接 callback function 回调函数,只有一个输入参数,它在主线程执行。func的返回值会是callback的实参。若func抛出异常,则callback输入参数是None *args *args func的非关键字参数 **kwargs **kwargs 暂无用,预留用。 返回值
空
示例
xxxxxxxxxx
import apolloCommon.extraMongoPool as extraMongoPool
extraMongoPool.InitDB('mongo_test1', 32)
def Insert(col):
postData = {
'title': 'Python and MongoDB',
'content': 'PyMongo is fun, you guys',
'author': 'Scott'
}
col.insert_one(postData)
def Cb(t):
print "cb", t
#添加异步任务。
extraMongoPool.AsyncExecute('mongo_test1', 'test_col', Insert, Cb)
extraMongoPool.Finish()
AsyncExecuteWithOrderKey
描述
添加一个异步mongo任务。同async_execute区别是,可以显示设置orderKey。
参数
参数名 数据类型 说明 dbName str mongo db名字,名字在netgame_common.json中extra_mongo下配置,比如示例配置中 “mongo_test1” collection str mongo中的一个集合 func function mongo异步任务,可以没有返回值。该任务和主线程会并行执行,要求任务是线程安全的。第一个参数是一个mongo长连接,是pymongo.MongoClient连接池实例中的一个连接,其他参数是*args orderKey str/int 相同的orderKey会顺序执行,不同的orderKey会并行执行 callback function 回调函数,只有一个输入参数,它在主线程执行。func的返回值会是callback的实参。若func抛出异常,则callback输入参数是None *args *args func的非关键字参数 **kwargs **kwargs 暂无用,预留 返回值
空
示例
xxxxxxxxxx
import apolloCommon.extraMongoPool as extraMongoPool
extraMongoPool.InitDB('mongo_test1', 32)
def Insert(col):
postData = {
'title': 'Python and MongoDB',
'content': 'PyMongo is fun, you guys',
'author': 'Scott'
}
col.insert_one(postData)
def Cb(t):
print "cb", t
#添加异步任务。
#下面操作相当于:apolloCommon.AsyncExecute('mongo_test1', 'test_col', Insert, Cb)
apolloCommon.AsyncExecuteWithOrderKey('mongo_test1', 'test_col', Insert, 'test_col', Cb)
#添加相同任务,两个任务顺序执行。
apolloCommon.AsyncExecuteWithOrderKey('mongo_test1', 'test_col', Insert, 'test_col', Cb)
apolloCommon.Finish()
Finish
描述
等待mongo线程池退出,会等待线程池中所有异步任务执行完毕后退出。
返回值
空
示例
xxxxxxxxxx
import apolloCommon.extraMongoPool as extraMongoPool
extraMongoPool.Finish()
InitDB
描述
初始化mongo连接池。可以支持多个mongo实例,它可以同“mongo连接池”一起使用。要求公共配置 netgame_common.json中配置“extra_mongo”。
参数
参数名 数据类型 说明 dbName str mongo db名字,名字在netgame_common.json中extra_mongo下配置,比如示例配置中 “mongo_test1” poolSize int 连接池大小 返回值
空
示例
xxxxxxxxxx
import apolloCommon.extraMongoPool as extraMongoPool
extraMongoPool.InitDB('mongo_test1', 30)
备注
- netgame_common.json部分配置的示例如下:
xxxxxxxxxx
"mongo": {
"database": "test",
"host": "127.0.0.1",
"password": "test",
"port": 27017,
"user": "test"
},
"extra_mongo":{
"testname1" : {
"database": "mongo_test1",
"host": "127.0.0.2",
"password": "test",
"port": 27017,
"user": "test"
},
"testname2" : {
"database": "mongo_test2",
"host": "127.0.0.3",
"password": "test",
"port": 27017,
"user": "test"
}
},
玩家
GetOnlineServerInfoOfMultiPlayers
描述
获取多个玩家在线信息
参数
参数名 数据类型 说明 uid list(int) 玩家的netease uid列表,列表不能超过100,若超过100,本api会抛出Exception。 callback function 回调函数,该函数会被异步执行。函数只需要一个参数,是list(dict)类型。每个dict包含的键以及含义说明:"uid":玩家的netease uid; "serverId":玩家所在lobby或game的服务器id, 若玩家不在线则为None;"proxyId":客户端连接的proxy服务器id, 若玩家不在线则为None。 返回值
空
示例
xxxxxxxxxx
def GetPlayersOnlineCb(args):
#若参数是:{["uid":123, "serverId" :2000000, "proxyId" :1000000},{"uid":234, "serverId" :None, "proxyId" :None}]
#参数含义:第一个玩家uid是123,玩家是在线的,所在lobby或game的服务器id是2000000,玩家连接的proxy服务器id是1000000;
# 第二个玩家玩家uid是234,玩家是离线的
print 'GetOnlineServerCb', args
import netgame.apolloCommon.commonNetgameApi as commonNetgameApi
commonNetgameApi.GetOnlineServerInfoOfMultiPlayers([123, 234], GetPlayersOnlineCb)
GetOnlineServerInfoOfPlayer
描述
获取玩家在线信息
参数
参数名 数据类型 说明 uid int 玩家的netease uid,玩家的唯一标识 callback function 回调函数,该函数会被异步执行。函数只需要一个参数,是dict类型。dict包含的键以及含义说明:"uid":玩家的netease uid; "serverId":玩家所在lobby或game的服务器id, 若玩家不在线则为None;"proxyId":客户端连接的proxy服务器id, 若玩家不在线则为None。 返回值
空
示例
xxxxxxxxxx
def GetOnlineCb(args):
#若参数是:{"uid":123, "serverId" :2000000, "proxyId" :1000000}
#参数含义:玩家uid是123,玩家是在线的,所在lobby或game的服务器id是2000000,玩家连接的proxy服务器id是1000000
#若参数是:{"uid":123, "serverId" :None, "proxyId" :None}
#参数含义:玩家uid是123,玩家是离线的
print 'GetOnlineServerCb', args
import netgame.apolloCommon.commonNetgameApi as commonNetgameApi
commonNetgameApi.GetOnlineServerInfoOfPlayer(123, GetOnlineCb)
ToPcUid
描述
将玩家的uid转换为pc平台的uid
参数
参数名 数据类型 说明 uid int 玩家的uid 返回值
数据类型 说明 int pc平台的玩家uid 示例
xxxxxxxxxx
ToPeUid
描述
将玩家的uid转换为pe平台的uid
参数
参数名 数据类型 说明 uid int 玩家的uid 返回值
数据类型 说明 int pe平台的玩家uid 示例
xxxxxxxxxx
通用
CheckNameValid
描述
判定一个输入的string是否通过了命名库敏感词检查,没有敏感词返回1,存在敏感词返回0。
参数
参数名 数据类型 说明 name str 需要做敏感词检查的string 返回值
数据类型 说明 int 1代表没有敏感词,0代表存在敏感词 示例
xxxxxxxxxx
import netgame.apolloCommon.commonNetgameApi as commonNetgameApi
isOk = commonNetgameApi.CheckNameValid("xxxxxx")
if not isOk:
print "输入中存在敏感词"
return
CheckWordsValid
描述
判定一个输入的string是否通过了通用库敏感词检查,没有敏感词返回1,存在敏感词返回0。
参数
参数名 数据类型 说明 words str 需要做敏感词检查的string 返回值
数据类型 说明 int 1代表没有敏感词,0代表存在敏感词 示例
xxxxxxxxxx
import netgame.apolloCommon.commonNetgameApi as commonNetgameApi
isOk = commonNetgameApi.CheckSensitiveByName("xxxxxx")
if not isOk:
print "输入中存在敏感词"
return
GetModJsonConfig
描述
根据脚本根目录读取mod.json配置文件。
参数
参数名 数据类型 说明 scriptRootName str python脚本的根目录名 返回值
数据类型 说明 dict mod.json里面的内容信息 示例
xxxxxxxxxx
#目录结构
# |-developer_mods
# |- neteaseNpcLobbyDev
# mod.json
# |- neteaseNpcLobby
import netgame.apolloCommon.commonNetgameApi as commonNetgameApi
confDict = commonNetgameApi.GetModJsonConfig("neteaseNpcLobby")
print confDict["description"]#打印mod.json中description配置内容。
#mod.json取出的字符串都是unicode编码。若是中文,需要手动转成UTF-8编码。转码方法如下:
npcName = confDict["name"].encode('utf-8')
GetModScriptRootDir
描述
获取脚本根目录的绝对路径。
参数
参数名 数据类型 说明 scriptRootName str python脚本的根目录名 返回值
数据类型 说明 str 脚本根目录的绝对路径 示例
xxxxxxxxxx
#目录结构
# |-developer_mods
# |- neteaseNpcLobbyDev
# mod.json
# |- neteaseNpcLobby
import netgame.apolloCommon.commonNetgameApi as commonNetgameApi
commonNetgameApi.GetModScriptRootDir("neteaseNpcLobby")
#结果:/home/fuzhu/netgame/app/template/lobby/lobby_lobby_2000000/developer_mods/neteaseNpcLobbyDev/
GetServerType
描述
获取服务器类型,对应netgame_common.json中相应服务器下的“type”配置。
返回值
数据类型 说明 str 服务器类型 示例
xxxxxxxxxx
#netgame_common.json中本服务器相关配置如下:
# ...
# "serverlist": [
# {
# "app_type": "game",
# "app_version": "1.16.0",
# "ip": "127.0.0.1",
# "master_port": 16000,
# "mods": "game_mod",
# "port": 15000,
# "serverid": 3000000,
# "type": "gameBattleA"
# },
# ...
# ]
# ...
import netgame.apolloCommon.commonNetgameApi as commonNetgameApi
commonNetgameApi.GetServerType() #结果是:"gameBattleA"
通信
client和game/lobby通信
NotifyToClient
描述
game/lobby接口,game/lobby送事件到指定客户端。
参数
参数名 数据类型 说明 targetId str 玩家对象的entityId eventName str 事件名 eventData dict 事件参数 返回值
空
示例
xxxxxxxxxx
#客户端给服务端发送消息的示例
#client mod
import client.extraClientApi as clientApi
ClientSystem = clientApi.GetClientSystemCls()
class testClient(ClientSystem):
def __init__(self,namespace,systemName):
ClientSystem.__init__(self, namespace, systemName)
self.ListenForEvent('serverNamespace', 'serverSystem', 'PlayerJoinOK', self, self.OnPlayerJoinOK)
#同一个事件,可以重复监听。收到事件后,两个监听函数都会调用。
self.ListenForEvent('serverNamespace', 'serverSystem', 'PlayerJoinOK', self, self.OnPlayerJoinOK2)
self.DefineEvent('PlayerJoin')#要先define这个event
def testNotify(self):
player = {}
player['uid'] = 123
player['name'] = 'nickname'
#然后才可以给服务端发送消息
self.NotifyToServer("PlayerJoin", data)
def OnPlayerJoinOK(self, args):
print 'OnPlayerJoinOK', args
def OnPlayerJoinOK2(self, args):
print 'OnPlayerJoinOK2', args
def Destroy(self):
self.ListenForEvent('serverNamespace', 'serverSystem', 'PlayerJoinOK', self, self.OnPlayerJoinOK)
self.UnListenForEvent('serverNamespace', 'serverSystem', 'PlayerJoinOK', self, self.OnPlayerJoinOK2)
#game/lobby mod
class testServer(ServerSystem):
def __init__(self, namespace, systemName):
ServerSystem.__init__(self, namespace, systemName)
self.DefineEvent('PlayerJoinOK')#要先define这个event
#监听clent请求
self.ListenForEvent('clientNamespace', 'clientSystem', 'PlayerJoin', self, self.OnPlayerJoin)
def OnPlayerJoin(self, args):
uid = args['uid']
name = args['name']
#然后才可以发送消息。
self.NotifyToClient("PlayerJoinOK", data)
def Destroy(self):
self.UnListenForEvent('clientNamespace', 'clientSystem', 'PlayerJoin', self, self.OnPlayerJoin)
NotifyToServer
描述
客户端接口,给lobby/game服务器发送事件。注意,玩家只能存在于一个game或lobby,不可能同时存在于两个服务器。
参数
参数名 数据类型 说明 eventName str 事件名 eventData dict 事件参数 返回值
空
示例
xxxxxxxxxx
#客户端给服务端发送消息的示例
#client mod
import client.extraClientApi as clientApi
ClientSystem = clientApi.GetClientSystemCls()
class testClient(ClientSystem):
def __init__(self,namespace,systemName):
ClientSystem.__init__(self, namespace, systemName)
self.ListenForEvent('serverNamespace', 'serverSystem', 'PlayerJoinOK', self, self.OnPlayerJoinOK)
#同一个事件,可以重复监听。收到事件后,两个监听函数都会调用。
self.ListenForEvent('serverNamespace', 'serverSystem', 'PlayerJoinOK', self, self.OnPlayerJoinOK2)
self.DefineEvent('PlayerJoin')#要先define这个event
def testNotify(self):
player = {}
player['uid'] = 123
player['name'] = 'nickname'
#然后才可以给服务端发送消息
self.NotifyToServer("PlayerJoin", data)
def OnPlayerJoinOK(self, args):
print 'OnPlayerJoinOK', args
def OnPlayerJoinOK2(self, args):
print 'OnPlayerJoinOK2', args
def Destroy(self):
self.ListenForEvent('serverNamespace', 'serverSystem', 'PlayerJoinOK', self, self.OnPlayerJoinOK)
self.UnListenForEvent('serverNamespace', 'serverSystem', 'PlayerJoinOK', self, self.OnPlayerJoinOK2)
#game/lobby mod
class testServer(ServerSystem):
def __init__(self, namespace, systemName):
ServerSystem.__init__(self, namespace, systemName)
self.DefineEvent('PlayerJoinOK')#要先define这个event
#监听clent请求
self.ListenForEvent('clientNamespace', 'clientSystem', 'PlayerJoin', self, self.OnPlayerJoin)
def OnPlayerJoin(self, args):
uid = args['uid']
name = args['name']
#然后才可以发送消息。
self.NotifyToClient("PlayerJoinOK", data)
def Destroy(self):
self.UnListenForEvent('clientNamespace', 'clientSystem', 'PlayerJoin', self, self.OnPlayerJoin)
master和game/lobby通信
NotifyToMaster
描述
lobby/game接口,lobby/game给master发事件。
参数
参数名 数据类型 说明 eventName str 事件名 eventData dict 事件参数 返回值
空
示例
xxxxxxxxxx
#master同game/lobby通信示例
#master mod
import server.extraMasterApi as masterApi
MasterSystem = masterApi.GetMasterSystemCls()
class testMaster(MasterSystem):
def __init__(self,namespace,systemName):
MasterSystem.__init__(self, namespace, systemName)
self.ListenForEvent('lobbyNamespace', 'lobbySystem', 'PlayerJoinOK', self, self.OnPlayerJoinOK)
#同一个事件,可以重复监听。收到事件后,两个监听函数都会调用。
self.ListenForEvent('lobbyNamespace', 'lobbySystem', 'PlayerJoinOK', self, self.OnPlayerJoinOK2)
self.DefineEvent('PlayerJoin')#要先define这个event
def testNotify(self):
player = {}
player['uid'] = 123
player['name'] = 'nickname'
#然后才可以给lobby发送消息
self.NotifyToServerNode(1, "PlayerJoin", data)
def OnPlayerJoinOK(self, args):
print 'OnPlayerJoinOK', args
def OnPlayerJoinOK2(self, args):
print 'OnPlayerJoinOK2', args
def Destroy(self):
self.ListenForEvent('lobbyNamespace', 'lobbyNamespace', 'PlayerJoinOK', self, self.OnPlayerJoinOK)
self.UnListenForEvent('lobbyNamespace', 'lobbyNamespace', 'PlayerJoinOK', self, self.OnPlayerJoinOK2)
#lobby mod
class lobbyServer(ServerSystem):
def __init__(self, namespace, systemName):
ServerSystem.__init__(self, namespace, systemName)
self.DefineEvent('PlayerJoinOK')#要先define这个event
#监听master请求
self.ListenForEvent('masterNamespace', 'masterSystem', 'PlayerJoin', self, self.OnPlayerJoin)
def OnPlayerJoin(self, args):
uid = args['uid']
name = args['name']
#然后才可以发送消息。
self.NotifyToMaster("PlayerJoinOK", data)
def Destroy(self):
self.UnListenForEvent('masterNamespace', 'masterNamespace', 'PlayerJoin', self, self.OnPlayerJoin)
NotifyToServerNode
描述
master接口,master给某个lobby/game发事件
参数
参数名 数据类型 说明 targetId int lobby/game的服务器id eventName str 事件名 eventData dict 事件参数 返回值
空
示例
xxxxxxxxxx
#master同game/lobby通信示例
#master mod
import server.extraMasterApi as masterApi
MasterSystem = masterApi.GetMasterSystemCls()
class testMaster(MasterSystem):
def __init__(self,namespace,systemName):
MasterSystem.__init__(self, namespace, systemName)
self.ListenForEvent('lobbyNamespace', 'lobbySystem', 'PlayerJoinOK', self, self.OnPlayerJoinOK)
#同一个事件,可以重复监听。收到事件后,两个监听函数都会调用。
self.ListenForEvent('lobbyNamespace', 'lobbySystem', 'PlayerJoinOK', self, self.OnPlayerJoinOK2)
self.DefineEvent('PlayerJoin')#要先define这个event
def testNotify(self):
player = {}
player['uid'] = 123
player['name'] = 'nickname'
#然后才可以给lobby发送消息
self.NotifyToServerNode(1, "PlayerJoin", data)
def OnPlayerJoinOK(self, args):
print 'OnPlayerJoinOK', args
def OnPlayerJoinOK2(self, args):
print 'OnPlayerJoinOK2', args
def Destroy(self):
self.ListenForEvent('lobbyNamespace', 'lobbyNamespace', 'PlayerJoinOK', self, self.OnPlayerJoinOK)
self.UnListenForEvent('lobbyNamespace', 'lobbyNamespace', 'PlayerJoinOK', self, self.OnPlayerJoinOK2)
#lobby mod
class lobbyServer(ServerSystem):
def __init__(self, namespace, systemName):
ServerSystem.__init__(self, namespace, systemName)
self.DefineEvent('PlayerJoinOK')#要先define这个event
#监听master请求
self.ListenForEvent('masterNamespace', 'masterSystem', 'PlayerJoin', self, self.OnPlayerJoin)
def OnPlayerJoin(self, args):
uid = args['uid']
name = args['name']
#然后才可以发送消息。
self.NotifyToMaster("PlayerJoinOK", data)
def Destroy(self):
self.UnListenForEvent('masterNamespace', 'masterNamespace', 'PlayerJoin', self, self.OnPlayerJoin)
service和service/master通信
RegisterRpcMethod
描述
service/master接口,用于注册一个监听函数。用于监听service/master发过来请求。要求公共配置netgame_common.json中配置service/master module_names信息。
参数
参数名 数据类型 说明 module str service/master所属模块, 公共配置netgame_common.json中module_names中某个module func function 监听函数 event str 事件名 返回值
空
示例
xxxxxxxxxx
#service同master通信示例.service同service通信与此类似,这里不重复了。
#service mod
import server.extraServiceApi as serviceApi
ServiceSystem = serviceApi.GetServiceSystemCls()
class testService(ServiceSystem):
def __init__(self,namespace,systemName):
ServiceSystem.__init__(self, namespace, systemName)
#注册service方法,注意一个事件只能注册一次,否则后面监听函数会覆盖前面监听函数
self.RegisterRpcMethod("idv_service", 'PlayerJoinOK', self.OnPlayerJoinOK)
def OnCallbackFromMaster(self, suc, args):
if not suc:
print 'OnCallback timeout'
return
print 'OnCallbackFromMaster success', args
def testNotify(self):
player = {}
player['uid'] = 123
player['name'] = 'nickname'
#然后才可以给master发送消息
self.RequestToService("master_module", "requestMaster", player, self.OnCallbackFromMaster, 2)
#给master的请求没有callback
self.RequestToService("master_module", "requestMaster2", player)
def OnPlayerJoinOK(self, serverId, callbackId, args):
print 'OnPlayerJoinOK', args
response = {}
response['result'] = 1
self.ResponseToServer(serverId, callbackId, response)
def Destroy(self):
pass
#master mod
import server.extraMasterApi as masterApi
MasterSystem = masterApi.GetMasterSystemCls()
class masterServer(MasterSystem):
def __init__(self, namespace, systemName):
ServerSystem.__init__(self, namespace, systemName)
#注册master方法,注意一个事件只能注册一次,否则后面监听函数会覆盖前面监听函数
self.RegisterRpcMethod("master_module", 'requestMaster', self.OnRequestMaster)
self.RegisterRpcMethod("master_module", 'requestMaster2', self.OnRequestMaster2)
def OnCallback(self, suc, args):
if not suc:
print 'OnCallback timeout'
return
print 'OnCallback success', args
def playerJoin(self):
data['uid'] = 123
data['nickname'] = 'test_name'
#给service发消息
self.RequestToService("idv_service", "PlayerJoinOK", data, self.OnCallback, 2)
def OnRequestMaster(self, serverId, callbackId, args):
print 'OnRequestMaster', args
response = {}
response['result'] = 'hello'
self.ResponseToServer(serverId, callbackId, response)
def OnRequestMaster2(self, serverId, callbackId, args):
print 'OnRequestMaster', args
def Destroy(self):
pass
RequestToService
描述
service/master接口,给service/master发请求。
参数
参数名 数据类型 说明 module str service/master所属模块, 公共配置netgame_common.json中module_names中某个module event str 事件名 eventData dict 事件参数 callback function 用于处理service/master返回消息, 默认为空,表示没有回调函数。回调函数参数包括:是否成功状态、service/master返回数据。若超时,则参数为False、None。 timeout int 回调函数超时时间,单位秒。默认是2s 返回值
空
示例
xxxxxxxxxx
#service同master通信示例.service同service通信与此类似,这里不重复了。
#service mod
import server.extraServiceApi as serviceApi
ServiceSystem = serviceApi.GetServiceSystemCls()
class testService(ServiceSystem):
def __init__(self,namespace,systemName):
ServiceSystem.__init__(self, namespace, systemName)
#注册service方法,注意一个事件只能注册一次,否则后面监听函数会覆盖前面监听函数
self.RegisterRpcMethod("idv_service", 'PlayerJoinOK', self.OnPlayerJoinOK)
def OnCallbackFromMaster(self, suc, args):
if not suc:
print 'OnCallback timeout'
return
print 'OnCallbackFromMaster success', args
def testNotify(self):
player = {}
player['uid'] = 123
player['name'] = 'nickname'
#然后才可以给master发送消息
self.RequestToService("master_module", "requestMaster", player, self.OnCallbackFromMaster, 2)
#给master的请求没有callback
self.RequestToService("master_module", "requestMaster2", player)
def OnPlayerJoinOK(self, serverId, callbackId, args):
print 'OnPlayerJoinOK', args
response = {}
response['result'] = 1
self.ResponseToServer(serverId, callbackId, response)
def Destroy(self):
pass
#master mod
import server.extraMasterApi as masterApi
MasterSystem = masterApi.GetMasterSystemCls()
class masterServer(MasterSystem):
def __init__(self, namespace, systemName):
ServerSystem.__init__(self, namespace, systemName)
#注册master方法,注意一个事件只能注册一次,否则后面监听函数会覆盖前面监听函数
self.RegisterRpcMethod("master_module", 'requestMaster', self.OnRequestMaster)
self.RegisterRpcMethod("master_module", 'requestMaster2', self.OnRequestMaster2)
def OnCallback(self, suc, args):
if not suc:
print 'OnCallback timeout'
return
print 'OnCallback success', args
def playerJoin(self):
data['uid'] = 123
data['nickname'] = 'test_name'
#给service发消息
self.RequestToService("idv_service", "PlayerJoinOK", data, self.OnCallback, 2)
def OnRequestMaster(self, serverId, callbackId, args):
print 'OnRequestMaster', args
response = {}
response['result'] = 'hello'
self.ResponseToServer(serverId, callbackId, response)
def OnRequestMaster2(self, serverId, callbackId, args):
print 'OnRequestMaster', args
def Destroy(self):
pass
ResponseToServer
描述
service/master接口,给service/master返回一个消息。若函数RequestToService的callback参数为空,则不能调用该接口。
参数
参数名 数据类型 说明 serverId int master/service服务器id callbackId int 回调函数id eventData dict 事件参数 返回值
空
示例
xxxxxxxxxx
#service同master通信示例.service同service通信与此类似,这里不重复了。
#service mod
import server.extraServiceApi as serviceApi
ServiceSystem = serviceApi.GetServiceSystemCls()
class testService(ServiceSystem):
def __init__(self,namespace,systemName):
ServiceSystem.__init__(self, namespace, systemName)
#注册service方法,注意一个事件只能注册一次,否则后面监听函数会覆盖前面监听函数
self.RegisterRpcMethod("idv_service", 'PlayerJoinOK', self.OnPlayerJoinOK)
def OnCallbackFromMaster(self, suc, args):
if not suc:
print 'OnCallback timeout'
return
print 'OnCallbackFromMaster success', args
def testNotify(self):
player = {}
player['uid'] = 123
player['name'] = 'nickname'
#然后才可以给master发送消息
self.RequestToService("master_module", "requestMaster", player, self.OnCallbackFromMaster, 2)
#给master的请求没有callback
self.RequestToService("master_module", "requestMaster2", player)
def OnPlayerJoinOK(self, serverId, callbackId, args):
print 'OnPlayerJoinOK', args
response = {}
response['result'] = 1
self.ResponseToServer(serverId, callbackId, response)
def Destroy(self):
pass
#master mod
import server.extraMasterApi as masterApi
MasterSystem = masterApi.GetMasterSystemCls()
class masterServer(MasterSystem):
def __init__(self, namespace, systemName):
ServerSystem.__init__(self, namespace, systemName)
#注册master方法,注意一个事件只能注册一次,否则后面监听函数会覆盖前面监听函数
self.RegisterRpcMethod("master_module", 'requestMaster', self.OnRequestMaster)
self.RegisterRpcMethod("master_module", 'requestMaster2', self.OnRequestMaster2)
def OnCallback(self, suc, args):
if not suc:
print 'OnCallback timeout'
return
print 'OnCallback success', args
def playerJoin(self):
data['uid'] = 123
data['nickname'] = 'test_name'
#给service发消息
self.RequestToService("idv_service", "PlayerJoinOK", data, self.OnCallback, 2)
def OnRequestMaster(self, serverId, callbackId, args):
print 'OnRequestMaster', args
response = {}
response['result'] = 'hello'
self.ResponseToServer(serverId, callbackId, response)
def OnRequestMaster2(self, serverId, callbackId, args):
print 'OnRequestMaster', args
def Destroy(self):
pass
service和game/lobby通信
NotifyToServerNode
描述
service接口,service给某个lobby/game发消息。
参数
参数名 数据类型 说明 targetId int lobby/game的服务器id eventName str 事件名 eventData dict 事件参数 返回值
空
示例
xxxxxxxxxx
#service同game/lobby通信示例
#service mod
import server.extraServiceApi as serviceApi
ServiceSystem = serviceApi.GetServiceSystemCls()
class testService(ServiceSystem):
def __init__(self,namespace,systemName):
ServiceSystem.__init__(self, namespace, systemName)
self.DefineEvent('PlayerJoin')#要先define这个event
#注册service方法,注意一个事件只能注册一次,否则后面监听函数会覆盖前面监听函数
self.RegisterRpcMethod("idv_service", 'PlayerJoinOK', self.OnPlayerJoinOK)
def testNotify(self):
player = {}
player['uid'] = 123
player['name'] = 'nickname'
#然后才可以给lobby发送消息
self.NotifyToServerNode(1, "PlayerJoin", data)
def OnPlayerJoinOK(self, serverId, callbackId, args):
print 'OnPlayerJoinOK', args
def Destroy(self):
pass
#lobby mod
class lobbyServer(ServerSystem):
def __init__(self, namespace, systemName):
ServerSystem.__init__(self, namespace, systemName)
#监听service请求
self.ListenForEvent('serviceNamespace', 'serviceSystem', 'PlayerJoin', self, self.OnPlayerJoin)
def OnPlayerJoin(self, args):
uid = args['uid']
name = args['name']
#给service发消息
self.RequestToService("idv_service", "PlayerJoinOK", data)
def Destroy(self):
self.UnListenForEvent('serviceNamespace', 'serviceSystem', 'PlayerJoin', self, self.OnPlayerJoin)
RegisterRpcMethod
描述
service接口,用于注册一个监听函数,用于监听lobby/game发过来请求。
参数
参数名 数据类型 说明 module str service所属模块, 公共配置netgame_common.json中module_names中某个module func function 监听函数 event str 事件名 返回值
空
示例
xxxxxxxxxx
#service同game/lobby通信示例
#service mod
import server.extraServiceApi as serviceApi
ServiceSystem = serviceApi.GetServiceSystemCls()
class testService(ServiceSystem):
def __init__(self,namespace,systemName):
ServiceSystem.__init__(self, namespace, systemName)
self.DefineEvent('PlayerJoin')#要先define这个event
#注册service方法,注意一个事件只能注册一次,否则后面监听函数会覆盖前面监听函数
self.RegisterRpcMethod("idv_service", 'PlayerJoinOK', self.OnPlayerJoinOK)
def testNotify(self):
player = {}
player['uid'] = 123
player['name'] = 'nickname'
#然后才可以给lobby发送消息
self.NotifyToServerNode(1, "PlayerJoin", data)
def OnPlayerJoinOK(self, serverId, callbackId, args):
print 'OnPlayerJoinOK', args
def Destroy(self):
pass
#lobby mod
class lobbyServer(ServerSystem):
def __init__(self, namespace, systemName):
ServerSystem.__init__(self, namespace, systemName)
#监听service请求
self.ListenForEvent('serviceNamespace', 'serviceSystem', 'PlayerJoin', self, self.OnPlayerJoin)
def OnPlayerJoin(self, args):
uid = args['uid']
name = args['name']
#给service发消息
self.RequestToService("idv_service", "PlayerJoinOK", data)
def Destroy(self):
self.UnListenForEvent('serviceNamespace', 'serviceSystem', 'PlayerJoin', self, self.OnPlayerJoin)
RegisterRpcMethodForMod
描述
用于注册一个监听函数,用于监听lobby/game发过来请求。直接使用service进程的type作为默认模块名
参数
参数名 数据类型 说明 method string 事件名 func function 监听函数 返回值
空
示例
xxxxxxxxxx
#service同game/lobby通信示例
#service mod
import server.extraServiceApi as serviceApi
ServiceSystem = serviceApi.GetServiceSystemCls()
class testService(ServiceSystem):
def __init__(self,namespace,systemName):
ServiceSystem.__init__(self, namespace, systemName)
self.DefineEvent('PlayerJoin')#要先define这个event
#注册service方法,注意一个事件只能注册一次,否则后面监听函数会覆盖前面监听函数
self.RegisterRpcMethodForMod('PlayerJoinOK', self.OnPlayerJoinOK)
def testNotify(self):
player = {}
player['uid'] = 123
player['name'] = 'nickname'
#然后才可以给lobby发送消息
self.NotifyToServerNode(1, "PlayerJoin", data)
def OnPlayerJoinOK(self, serverId, callbackId, args):
print 'OnPlayerJoinOK', args
def Destroy(self):
pass
#lobby mod
class lobbyServer(ServerSystem):
def __init__(self, namespace, systemName):
ServerSystem.__init__(self, namespace, systemName)
#监听service请求
self.ListenForEvent('serviceNamespace', 'serviceSystem', 'PlayerJoin', self, self.OnPlayerJoin)
def OnPlayerJoin(self, args):
uid = args['uid']
name = args['name']
#给service发消息
self.RequestToServiceMod("idv_service", "PlayerJoinOK", data)
def Destroy(self):
self.UnListenForEvent('serviceNamespace', 'serviceSystem', 'PlayerJoin', self, self.OnPlayerJoin)
RequestToService
描述
service/lobby/game接口,给service发请求。两个service间可以通过这个接口通信。
参数
参数名 数据类型 说明 module str service所属模块, 公共配置netgame_common.json中module_names中某个module event str 事件名 eventData dict 事件参数 callback function 用于处理service返回消息,默认为空,表示没有回调函数。回调函数参数包括:是否成功状态、service返回数据。若超时,则参数为False、None。 timeout int 回调函数超时时间,单位秒。默认是2s 返回值
空
示例
xxxxxxxxxx
#service同game/lobby通信示例
#service mod
import server.extraServiceApi as serviceApi
ServiceSystem = serviceApi.GetServiceSystemCls()
class testService(ServiceSystem):
def __init__(self,namespace,systemName):
ServiceSystem.__init__(self, namespace, systemName)
self.DefineEvent('PlayerJoin')#要先define这个event
#注册service方法,注意一个事件只能注册一次,否则后面监听函数会覆盖前面监听函数
self.RegisterRpcMethod("idv_service", 'PlayerJoinOK', self.OnPlayerJoinOK)
def testNotify(self):
player = {}
player['uid'] = 123
player['name'] = 'nickname'
#然后才可以给lobby发送消息
self.NotifyToServerNode(1, "PlayerJoin", player)
def OnPlayerJoinOK(self, serverId, callbackId, args):
print 'OnPlayerJoinOK', args
response = {}
response['result'] = 1
self.ResponseToServer(serverId, callbackId, response)
def Destroy(self):
pass
#lobby mod
class lobbyServer(ServerSystem):
def __init__(self, namespace, systemName):
ServerSystem.__init__(self, namespace, systemName)
def OnCallback(self, suc, args):
if not suc:
print 'OnCallback timeout'
return
print 'OnCallback success', args
def OnPlayerJoin(self, args):
uid = args['uid']
name = args['name']
#给service发消息
self.RequestToService("idv_service", "PlayerJoinOK", args, self.OnCallback, 2)
def Destroy(self):
self.UnListenForEvent('serviceNamespace', 'serviceSystem', 'PlayerJoin', self, self.OnPlayerJoin)
RequestToServiceMod
描述
给service发请求。两个service间可以通过这个接口通信。
参数
参数名 数据类型 说明 modname string service进程的type, 公共配置netgame_common.json中定义 method string 事件名 args dict 事件参数 callback function 用于处理service返回消息,默认为空,表示没有回调函数。回调函数参数包括:是否成功状态、service返回数据。若超时,则参数为False、None。 timeout int 回调函数超时时间,单位秒。默认是2s 返回值
空
示例
xxxxxxxxxx
#service同game/lobby通信示例
#service mod
import server.extraServiceApi as serviceApi
ServiceSystem = serviceApi.GetServiceSystemCls()
class testService(ServiceSystem):
def __init__(self,namespace,systemName):
ServiceSystem.__init__(self, namespace, systemName)
self.DefineEvent('PlayerJoin')#要先define这个event
#注册service方法,注意一个事件只能注册一次,否则后面监听函数会覆盖前面监听函数
self.RegisterRpcMethodForMod('PlayerJoinOK', self.OnPlayerJoinOK)
def testNotify(self):
player = {}
player['uid'] = 123
player['name'] = 'nickname'
#然后才可以给lobby发送消息
self.NotifyToServerNode(1, "PlayerJoin", player)
def OnPlayerJoinOK(self, serverId, callbackId, args):
print 'OnPlayerJoinOK', args
response = {}
response['result'] = 1
self.ResponseToServer(serverId, callbackId, response)
def Destroy(self):
pass
#lobby mod
class lobbyServer(ServerSystem):
def __init__(self, namespace, systemName):
ServerSystem.__init__(self, namespace, systemName)
def OnCallback(self, suc, args):
if not suc:
print 'OnCallback timeout'
return
print 'OnCallback success', args
def OnPlayerJoin(self, args):
uid = args['uid']
name = args['name']
#给service发消息
self.RequestToServiceMod("idv_service", "PlayerJoinOK", args, self.OnCallback, 2)
def Destroy(self):
self.UnListenForEvent('serviceNamespace', 'serviceSystem', 'PlayerJoin', self, self.OnPlayerJoin)
ResponseToServer
描述
service接口,给lobby/game返回一个消息。若函数RequestToService的callback参数为空,则不能调用该接口。
参数
参数名 数据类型 说明 serverId int lobby/game服务器id callbackId int 回调函数id eventData dict 事件参数 返回值
空
示例
xxxxxxxxxx
#service同game/lobby通信示例
#service mod
import server.extraServiceApi as serviceApi
ServiceSystem = serviceApi.GetServiceSystemCls()
class testService(ServiceSystem):
def __init__(self,namespace,systemName):
ServiceSystem.__init__(self, namespace, systemName)
self.DefineEvent('PlayerJoin')#要先define这个event
#注册service方法,注意一个事件只能注册一次,否则后面监听函数会覆盖前面监听函数
self.RegisterRpcMethod("idv_service", 'PlayerJoinOK', self.OnPlayerJoinOK)
def testNotify(self):
player = {}
player['uid'] = 123
player['name'] = 'nickname'
#然后才可以给lobby发送消息
self.NotifyToServerNode(1, "PlayerJoin", player)
def OnPlayerJoinOK(self, serverId, callbackId, args):
print 'OnPlayerJoinOK', args
response = {}
response['result'] = 1
self.ResponseToServer(serverId, callbackId, response)
def Destroy(self):
pass
#lobby mod
class lobbyServer(ServerSystem):
def __init__(self, namespace, systemName):
ServerSystem.__init__(self, namespace, systemName)
def OnCallback(self, suc, args):
if not suc:
print 'OnCallback timeout'
return
print 'OnCallback success', args
def OnPlayerJoin(self, args):
uid = args['uid']
name = args['name']
#给service发消息
self.RequestToService("idv_service", "PlayerJoinOK", args, self.OnCallback, 2)
def Destroy(self):
self.UnListenForEvent('serviceNamespace', 'serviceSystem', 'PlayerJoin', self, self.OnPlayerJoin)
运营指令
使用方法
xxxxxxxxxx
post url: http:masterip:masterport/baseurl
post body:
json格式,例如:
{
"serverid":3,
"ip":"192.168.43.170",
"port":12001,
"master_port":12002,
"type":"lobby"
}
response:
json格式,格式:
{
"code":1, #1是成功,2是失败
"message":"reason",#若是失败,则介绍失败原因
"entity":content #详细信息
}
开发者可以登录到master所在机器,用curl命令发请求,使用方式如下:
xxxxxxxxxx
curl -X POST http://masterip:masterport/baseurl -d 'postbody'
若通过"/online-num/query"指令获取game在线人数,则可以在master上发送如下curl命令:
xxxxxxxxxx
curl -X POST http://11.11.11.11:8503/online-num/query -d '{"server_type":"game"}'
若需要使用商城插件neteaseShop中查询订单运营指令(/check-single-order指令),则可以在master上发送如下curl命令:
xxxxxxxxxx
curl -X POST http://11.11.11.11:8503/check-single-order -d '{"orderid" : 1234,"uid" : 123456789}'
在线人数
/online-num/query
描述
获取proxy/lobby/game在线人数或获取总在线人数。
post body 参数
关键字 数据类型 说明 server_type string 服务器类型,比如"lobby","game","proxy",若不传入该值,则表示总在线人数 response entity参数
关键字 数据类型 说明 online_num int 在线人数 示例:
xxxxxxxxxx
post url: http://111.222.333.444:1101/online-num/query
post body:
{
"server_type":"game"
}
response:
{
"code": 1,
"entity": {
"online_num": 0
},
"message": ""
}
/online-num/query-by-server-id
描述
获取某个proxy/game/lobby在线人数
post body参数
关键字 数据类型 说明 server_id int 服务器id response entity参数
关键字 数据类型 说明 online_num int 在线人数 示例:
xxxxxxxxxx
post url: http://111.222.333.444:1101/online-num/query-by-server-id
post body:
{
"server_id":1
}
response:
{
"code": 1,
"entity": {
"online_num": 2
},
"message": ""
}
日志等级
/conf/set-log-debug-level
描述
开服工具日志等级设置为debug或info level等级
post body 参数
关键字 数据类型 说明 debug_level bool true:则日志设置为debug log level;false:日志设置为info log level 无response entity参数
示例:
xxxxxxxxxx
post url: http://111.222.333.444:1101/conf/set-log-debug-level
post body:
{
"debug_level":false
}
response:
{
"code": 1,
"entity": null,
"message": ""
}
/conf/set-server-log-debug-level
描述
设置某个服务器的日志等级。
post body 参数
关键字 数据类型 说明 server_id int 服务器id。可以是proxy、lobby、game、service的serverid。若为0,则表示master。 debug_level bool true:则日志设置为debug log level;false:日志设置为info log level 无response entity参数
示例:
xxxxxxxxxx
post url: http://111.222.333.444:1101/conf/set-server-log-debug-level
post body:
{
"server_id":1,
"debug_level":false
}
response:
{
"code": 1,
"entity": null,
"message": ""
}
服务器
/query-all-server-status
描述
查询所有服务器状态
无post body json参数
response entity参数 dict。key是服务器id,value是服务器状态。服务器状态有: 1:断开连接状态 2:已连接状态
3:关服状态 4:优雅关服状态
6, 滚动更新中间状态,即将转换到状态7
7 也是滚动更新中间状态,即将转换到状态1或2
xxxxxxxxxx
- 示例:
```
post url: http://111.222.333.444:1101/query-all-server-status
post body:
{
}
response:
{
"code": 1,
"entity": {
"1": 1,
"2": 1
}
"message": ""
}
```
/query-one-server-status
描述
查询某个服务器状态
post body 参数
关键字 数据类型 说明 serverId int proxy/lobby/game服务器id response entity参数
关键字 数据类型 说明 status int 服务器状态。服务器状态有:服务器状态如下:
1:断开连接状态
2:已连接状态
3:关服状态
4:优雅关服状态
6, 滚动更新中间状态,即将转换到状态7
7 也是滚动更新中间状态,即将转换到状态1或2示例:
xxxxxxxxxx
post url: http://111.222.333.444:1101/query-one-server-status
post body:
{
"serverId":1
}
response:
{
"message": "",
"code": 1,
"entity": {
"status": 1
}
}
禁言,解除禁言
/silent
描述
禁言某个玩家
post body json参数
关键字 数据类型 说明 neteaseId uint32 玩家id banTime int 禁言时间,单位为秒,-1表示永封 reason string 禁言原因 type string 禁言类型,可自定义,公屏禁言为 Commom
无response entity参数
示例:
xxxxxxxxxx
post url: http://111.222.333.444:1101/silent
post body:
{
"neteaseId":11111,
"banTime":40,
"reason":"玩家作弊",
"type":"Commom"
}
response:
{
"code": 1,
"entity": null,
"message": ""
}
/unban-silent
描述
解除某个玩家的禁言
post body json参数
关键字 数据类型 说明 neteaseId uint32 解除禁言玩家的uid type string 禁言类型,可自定义,公屏禁言为 Commom
无response entity参数
示例:
xxxxxxxxxx
post url: http://111.222.333.444:1101/unban-silent
post body:
{
"neteaseId":11111,
"type":"Commom"
}
response:
{
"code": 1,
"entity": null,
"message": ""
}
/global-silent
描述
全局公屏禁言开关
post body json参数
关键字 数据类型 说明 is_silent bool 全局禁言开关, true
表示开启全局禁言,false
表示关闭全局禁言reason string 禁言原因 无response entity参数
示例:
xxxxxxxxxx
post url: http://111.222.333.444:1101/global-silent
post body:
{
"is_silent":true,
"reason":"系统维护"
}
response:
{
"code": 1,
"entity": null,
"message": ""
}
踢出玩家
/kickout-user
描述
把某个玩家从游戏中踢出
post body json参数
关键字 数据类型 说明 neteaseId uint32 被踢出玩家的uid reason string 踢出原因 无response entity参数
示例:
xxxxxxxxxx
post url: http://111.222.333.444:1101/kickout-user
post body:
{
"neteaseId":11111,
"reason":"玩家作弊",
}
response:
{
"code": 1,
"entity": null,
"message": ""
}
封禁,解除封禁
/ban-user
描述
封禁某个玩家
post body json参数
关键字 数据类型 说明 neteaseId uint32 封禁玩家的uid banTime int 封禁时间,单位为秒,-1表示永封 reason string 封禁原因 无response entity参数
示例:
xxxxxxxxxx
post url: http://111.222.333.444:1101/ban-user
post body:
{
"neteaseId":11111,
"banTime":40,
"reason":"玩家作弊",
}
response:
{
"code": 1,
"entity": null,
"message": ""
}
/global-silent
描述
全服玩家禁言或解禁。它个【/ban-user】禁言是独立运作的,也就是说可以对某玩家禁言,然后全服禁言,但是全服解禁后,还需要用【/unban-user】给玩家解禁。
post body json参数
| 关键字 | 数据类型| 说明 | | ------------ | -----------| ------------ | | is_silent |int | 1 禁言;0 解禁 | reason |string | 封禁原因|
无response entity参数
示例:
xxxxxxxxxx
post url: http://111.222.333.444:1101/ban-user
post body:
{
"is_silent":1,
"reason":"全服禁言",
}
response:
{
"code": 1,
"entity": null,
"message": ""
}
/unban-user
描述
解除某个玩家的封禁
post body json参数
关键字 数据类型 说明 neteaseId uint32 解除封禁玩家的uid 无response entity参数
示例:
xxxxxxxxxx
post url: http://111.222.333.444:1101/unban-user
post body:
{
"neteaseId":11111,
}
response:
{
"code": 1,
"entity": null,
"message": ""
}
停服维护
/invalid-all-servers
描述
开启/关闭停服维护
post body json参数
关键字 数据类型 说明 invalid bool 停服维护开关, true
表示开启停服维护,false
表示关闭停服维护reason string 停服维护原因 无response entity参数
示例:
xxxxxxxxxx
post url: http://111.222.333.444:1101/invalid-all-servers
post body:
{
"invalid":true,
"reason":"停服维护",
}
response:
{
"code": 1,
"entity": null,
"message": ""
}
Hunter调试命令
/hunter-debug
描述
使目的服务器执行Python脚本,其结果打印到目的服务器的日志文件中,具体是"hunterDebug exec"日志的下面n行日志。
post body json参数
关键字 数据类型 说明 serverId int 服务器对应ID,0表示为master script string 服务器需要执行的python脚本,用 \n
换行command string 服务器需要执行的控制台命令 无response entity参数
示例:
xxxxxxxxxx
post url: http://111.222.333.444:1101/hunter-debug
post body:
{
"serverId":101,
"script":"import time\nprint time.time()"
}
response:
{
"code": 1,
"entity": null,
"message": ""
}
101服务器日志文件中包含下面日志:
[2019-06-03 10:21:29 INFO] Python:hunterDebug exec
[2019-06-03 10:21:29 INFO] Python:1559543269.12
性能分析
/check-memory-run
描述
检查服务器脚本层内存泄漏。需要执行两次指令,第一次生成快照,第二次生成同第一次的diff。
post body json参数
关键字 数据类型 说明 serverid int use_list list 通常是 ["tracemalloc", "objreport"] obj_names list 通常是空 无response entity参数
示例:
xxxxxxxxxx
post url: http://111.222.333.444:1101/check-memory-run
post body:
{
"serverid":101,
"use_list":["tracemalloc", "objreport"],
"obj_names":[]
}
response:
{
"code": 1,
"entity": null,
"message": ""
}
服务器日志文件包含下面日志:
[2019-09-11 17:09:33 INFO] Python:run_tracemalloc traceback
[2019-09-11 17:09:33 INFO] Python:[ Top 10 differences ]
[2019-09-11 17:09:33 INFO] Python:/tmp/tmpxlycSu/scripts/mod/server/memory/obj_report.py:43: size=12.0 KiB (+12.0 KiB), count=1 (+1), average=12.0 KiB
[2019-09-11 17:09:33 INFO] Python:/tmp/tmpxlycSu/scripts/mod/server/memory/obj_report.py:45: size=10.0 KiB (+10.0 KiB), count=11 (+11), average=992 B
[2019-09-11 17:09:33 INFO] Python:/tmp/tmpxlycSu/scripts/mod/server/memory/check_memory.py:61: size=10.0 KiB (+10.0 KiB), count=127 (+127), average=84 B
[2019-09-11 17:09:33 INFO] Python:/tmp/tmpxlycSu/scripts/mod/server/memory/obj_report.py:12: size=1736 B (+1736 B), count=6 (+6), average=289 B
[2019-09-11 17:09:33 INFO] Python:/tmp/tmpxlycSu/scripts/mod/server/memory/obj_report.py:6: size=1007 B (+1007 B), count=5 (+5), average=201 B
[2019-09-11 17:09:33 INFO] Python:/usr/local/lib/python2.7/site-packages/tracemalloc.py:380: size=864 B (+864 B), count=4 (+4), average=216 B
[2019-09-11 17:09:33 INFO] Python:/usr/local/lib/python2.7/json/decoder.py:380: size=704 B (+704 B), count=11 (+11), average=64 B
[2019-09-11 17:09:33 INFO] Python:/usr/local/lib/python2.7/site-packages/tracemalloc.py:518: size=672 B (+672 B), count=4 (+4), average=168 B
[2019-09-11 17:09:33 INFO] Python:<unknown>:0: size=650 B (+650 B), count=2 (+2), average=325 B
[2019-09-11 17:09:33 INFO] Python:/tmp/tmpxlycSu/scripts/mod/server/memory/check_memory.py:66: size=544 B (+544 B), count=1 (+1), average=544 B
[2019-09-11 17:09:33 INFO] Python:[QA] [DIFF_MORE]
[2019-09-11 17:09:33 INFO] Python:[QA] [DIFF_LESS]
[2019-09-11 17:09:33 INFO] Python:-2 <type 'tuple'>
日志说明,打印了两次【/check-memory】间,内存变化前十的文件,两次指令间,减少了2个tuple的实例。
/profile
描述
用于测量python函数占用cpu时间。需要执行两次指令,第一次开始profile,第二次生成性能数据文件。性能数据文件放到执行文件所在目录下的profile子目录中。性能数据文件名的格式:profile+生成文件的时间戳
post body json参数
关键字 数据类型 说明 serverId int bBegin bool true:开始profile;false:完成profile 无response entity参数
示例:
性能数据文件名:profile_1574325974
文件内容:
33 function calls in 0.000 seconds
Ordered by: internal time
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 0.000 0.000 {_log.logInfo}
2 0.000 0.000 0.000 0.000 logout.py:83(write)
1 0.000 0.000 0.000 0.000 logout.py:62(split_and_log)
1 0.000 0.000 0.000 0.000 netServerApp.py:17(TickApp)
1 0.000 0.000 0.000 0.000 Queue.py:93(empty)
1 0.000 0.000 0.000 0.000 timer.py:72(scheduler)
1 0.000 0.000 0.000 0.000 idvScript.modMaster.httpHandlerSys:141(Update)
1 0.000 0.000 0.000 0.000 async_task_pool.py:293(schedule)
1 0.000 0.000 0.000 0.000 netgameApp.py:3(Tick)
1 0.000 0.000 0.000 0.000 async_task_pool.py:302(exec_callback)
2 0.000 0.000 0.000 0.000 {len}
1 0.000 0.000 0.000 0.000 baseApp.py:73(ClearNeedsUpdate)
5 0.000 0.000 0.000 0.000 {method 'has_key' of 'dict' objects}
1 0.000 0.000 0.000 0.000 {time.time}
1 0.000 0.000 0.000 0.000 {method 'acquire' of 'thread.lock' objects}
1 0.000 0.000 0.000 0.000 {method 'replace' of 'str' objects}
2 0.000 0.000 0.000 0.000 {method 'splitlines' of 'str' objects}
1 0.000 0.000 0.000 0.000 mongopool.py:194(tick)
1 0.000 0.000 0.000 0.000 redispool.py:274(do_tick)
1 0.000 0.000 0.000 0.000 Queue.py:200(_qsize)
1 0.000 0.000 0.000 0.000 memoryScripts.MasterMemorySys:21(Update)
1 0.000 0.000 0.000 0.000 {method 'release' of 'thread.lock' objects}
1 0.000 0.000 0.000 0.000 redispool.py:271(tick)
3 0.000 0.000 0.000 0.000 baseSystem.py:86(Update)
内容解读:
第一行:33个函数调用被监控,这些函数占用cpu总运行时间为0.000秒
接下来输出个字段含义:
ncalls:表示函数调用的次数;
tottime:表示指定函数的总的运行时间,除掉函数中调用子函数的运行时间;
percall:(第一个percall)等于 tottime/ncalls;
cumtime:表示该函数及其所有子函数的调用运行的时间,即函数开始调用到返回的时间;
percall:(第二个percall)即函数运行一次的平均时间,等于 cumtime/ncalls;
filename:lineno(function):每个函数调用的具体信息;