|  |  |  | 
|---|
|  |  |  | import GameWorld | 
|---|
|  |  |  | import PlayerDBOper | 
|---|
|  |  |  | import IPY_GameServer | 
|---|
|  |  |  | import PlayerDBGSEvent | 
|---|
|  |  |  | import CrossChampionship | 
|---|
|  |  |  | import IpyGameDataPY | 
|---|
|  |  |  | import CrossRealmMsg | 
|---|
|  |  |  | import ShareDefine | 
|---|
|  |  |  | import PyGameData | 
|---|
|  |  |  | import ChConfig | 
|---|
|  |  |  | import types | 
|---|
|  |  |  | #--------------------------------------------------------------------- | 
|---|
|  |  |  | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | def CrossNotifyCode(serverGroupID, playerID, msgMark, msgParamList=[]): | 
|---|
|  |  |  | NotifyCodeCross(serverGroupID, playerID, msgMark, msgParamList) | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | def NotifyCodeCross(serverGroupID, playerID, msgMark, msgParamList=[]): | 
|---|
|  |  |  | crossNotifyList = [{"Type":ShareDefine.CrossNotify_Player, "Params":[playerID, msgMark, msgParamList]}] | 
|---|
|  |  |  | CrossNotify([serverGroupID], crossNotifyList) | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | def WorldNotifyCross(serverGroupIDList, country, msgMark, msgParamList=[]): | 
|---|
|  |  |  | crossNotifyList = [GetCrossWorldNotifyInfo(country, msgMark, msgParamList)] | 
|---|
|  |  |  | CrossNotify(serverGroupIDList, crossNotifyList) | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | def GetCrossWorldNotifyInfo(country, msgMark, msgParamList=[]): | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if notifyType == ShareDefine.CrossNotify_World: | 
|---|
|  |  |  | country, msgMark, msgParamList = params | 
|---|
|  |  |  | openServerDayLimit = IpyGameDataPY.GetFuncCfg("CrossRealmCfg", 1) | 
|---|
|  |  |  | if msgMark.startswith("CrossBattlefield"): | 
|---|
|  |  |  | openServerDayLimit = IpyGameDataPY.GetFuncCfg("CrossRealmCfg", 2) | 
|---|
|  |  |  | openServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerDay) + 1 | 
|---|
|  |  |  | if openServerDay < openServerDayLimit: | 
|---|
|  |  |  | GameWorld.DebugLog("开服天不足,不处理该跨服广播! openServerDay=%s < %s" % (openServerDay, openServerDayLimit)) | 
|---|
|  |  |  | continue | 
|---|
|  |  |  | WorldNotify(country, msgMark, msgParamList) | 
|---|
|  |  |  | elif notifyType == ShareDefine.CrossNotify_CrossAct: | 
|---|
|  |  |  | country, msgMark, msgParamList = params | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return NotifyCodeList | 
|---|
|  |  |  |  | 
|---|
|  |  |  | #------------------------------------------------------------------------------ | 
|---|
|  |  |  | def LoadDBPlayer(): | 
|---|
|  |  |  | if GameWorld.IsCrossServer(): | 
|---|
|  |  |  | return | 
|---|
|  |  |  | PlayerDBOper.FindDBOper(PlayerDBOper.Table_DBPlayer, {}, {"PlayerID":1, "AccID":1, "_id":0}, LoadDBPlayerRet) | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | def LoadDBPlayerRet(resultSetList, extendValueList): | 
|---|
|  |  |  | for resultDict in resultSetList: | 
|---|
|  |  |  | PyGameData.g_dbPlayerIDMap[resultDict["PlayerID"]] = resultDict["AccID"] | 
|---|
|  |  |  | GameWorld.Log("启动服务器加载DBPlayer玩家账号ID对应关系! %s, %s" % (len(PyGameData.g_dbPlayerIDMap), PyGameData.g_dbPlayerIDMap)) | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | def GetDBPlayerAccIDByID(playerID): | 
|---|
|  |  |  | ## 获取玩家表账号ID - 根据玩家ID, 可用于判断是否本服玩家 | 
|---|
|  |  |  | return PyGameData.g_dbPlayerIDMap.get(playerID, "") | 
|---|
|  |  |  |  | 
|---|
|  |  |  | #waring:以下使用的扩展属性字段记录的属性类型必须和MapServer一致 | 
|---|
|  |  |  | #------------------------------------------------------------------------------ | 
|---|
|  |  |  | 
|---|
|  |  |  | def GetFBFuncLineID(curPlayer): return curPlayer.GetExAttr3() | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ##VIP到期时间 | 
|---|
|  |  |  | def GetVIPExpireTime(curPlayer): return curPlayer.GetExAttr9() | 
|---|
|  |  |  | def SetVIPExpireTime(curPlayer, expireTime): return curPlayer.SetExAttr9(expireTime) | 
|---|
|  |  |  | def GetVIPExpireTime(curPlayer): return 0 | 
|---|
|  |  |  | def SetVIPExpireTime(curPlayer, expireTime): return | 
|---|
|  |  |  | def GetValidVIPLV(curPlayer): | 
|---|
|  |  |  | # @return: 返回当前有效的VIP等级 | 
|---|
|  |  |  | #    vipTime = GetVIPExpireTime(curPlayer) | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return ipyData.GetLimitLV() | 
|---|
|  |  |  |  | 
|---|
|  |  |  | # 因为MapServer玩家属性变更通知GameServer与功能开启通知触发时机有先后顺序,可能导致判断功能开启不准确,所以暂时记录该信息,临时用 | 
|---|
|  |  |  | g_playerOpenFuncInfo = {} # 玩家触发功能开启功能ID信息,{playerID:[funcID, ...], ...} | 
|---|
|  |  |  | ## 功能是否可用,该函数并不能确保百分百正确,只能大致判断,仅判断部分条件,如包含未判断的条件则不能确保百分百正确 | 
|---|
|  |  |  | def GetFuncCanUse(curPlayer, funcID): | 
|---|
|  |  |  | playerID = curPlayer.GetPlayerID() | 
|---|
|  |  |  | if playerID in g_playerOpenFuncInfo: | 
|---|
|  |  |  | if funcID in g_playerOpenFuncInfo[playerID]: | 
|---|
|  |  |  | return True | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ipyData = IpyGameDataPY.GetIpyGameData("FuncOpenLV", funcID) | 
|---|
|  |  |  | if not ipyData: | 
|---|
|  |  |  | return False | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if ipyData.GetLimitLV() and ipyData.GetLimitLV() > curPlayer.GetLV(): | 
|---|
|  |  |  | return False | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if ipyData.GetLimiRealmLV() and ipyData.GetLimiRealmLV() > curPlayer.GetOfficialRank(): | 
|---|
|  |  |  | return False | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if ipyData.GetLimitVIPLV() and ipyData.GetLimitVIPLV() > curPlayer.GetVIPLv(): | 
|---|
|  |  |  | return False | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return True | 
|---|
|  |  |  |  | 
|---|
|  |  |  | def DoFuncOpenLogic(curPlayer, funcIDList): | 
|---|
|  |  |  | global g_playerOpenFuncInfo | 
|---|
|  |  |  | if GameWorld.IsCrossServer(): | 
|---|
|  |  |  | return | 
|---|
|  |  |  | playerID = curPlayer.GetPlayerID() | 
|---|
|  |  |  | FuncOpenLogicDict = { | 
|---|
|  |  |  | ShareDefine.GameFuncID_Championship:lambda curObj:CrossChampionship.DoChampionshipOpen(curObj), | 
|---|
|  |  |  | } | 
|---|
|  |  |  | for funcID in funcIDList: | 
|---|
|  |  |  | if funcID in FuncOpenLogicDict: | 
|---|
|  |  |  | if playerID not in g_playerOpenFuncInfo: | 
|---|
|  |  |  | g_playerOpenFuncInfo[playerID] = [] | 
|---|
|  |  |  | openFuncIDList = g_playerOpenFuncInfo[playerID] | 
|---|
|  |  |  | if funcID not in openFuncIDList: | 
|---|
|  |  |  | openFuncIDList.append(funcID) | 
|---|
|  |  |  | GameWorld.DebugLog("触发功能开启逻辑! funcID=%s" % funcID, playerID) | 
|---|
|  |  |  | FuncOpenLogicDict[funcID](curPlayer) | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|