| | |
| | | PacketSubCMD_1=0x11
|
| | | PacketCallFunc_1=OnQueryOpenServerCampaignAward
|
| | |
|
| | |
|
| | | ;事件汇报
|
| | | [EventReport]
|
| | | ScriptName = EventReport.py
|
| | | Writer = hxp
|
| | | Releaser = hxp
|
| | | RegType = 0
|
| | | RegisterPackCount = 2
|
| | |
|
| | | PacketCMD_1=0xA1
|
| | | PacketSubCMD_1=0x01
|
| | | PacketCallFunc_1=ReceiveClientPCInfo
|
| | |
|
| | | PacketCMD_2=0xA2
|
| | | PacketSubCMD_2=0x19
|
| | | PacketCallFunc_2=OnSubmitBugSuggest
|
| | |
|
| | | ;装备分解
|
| | | [EquipDecompose]
|
| | | ScriptName = Player\PlayerEquipDecompose.py
|
| | |
| | | Def_Player_Dict_PlayerFromPID = "PlayerFromPID" # pid
|
| | | Def_Player_Dict_Account_Type = "account_type" # account_type
|
| | | Def_Player_Dict_FirstLogin = "FirstLogin" # 首登标记 0-未首登; 1-首登过
|
| | | Def_Player_Dict_RealLoginOK = "RealLoginOK" # 真正登录成功标记
|
| | | Def_GuideStateKeyCount = 8 # 引导状态key最大个数
|
| | | Def_Player_Dict_GuideState = "GuideState_%s" # 引导状态记录,参数为key个数编号
|
| | | Def_Player_Dict_VersionFix = "VersionFix_%s" # 版本修正标记,参数为key个数编号, 支持n个版本修正标记,每个key支持31个
|
| | |
| | | Def_Player_Dict_GameFuncAwardState = "GameFuncAwardState_%s" # 服务端功能开启领奖状态; 参数, key编号
|
| | | Def_Player_Dict_MissionFinish = "MissionFinish_%s" # 任务是否完成; 参数, 任务ID, 只会记录部分需要记录的任务ID
|
| | | Def_Player_Dict_FamilyArrestAwardState = "ArrestAwardState_103" # 家族悬赏奖励领取情况
|
| | | Def_Player_Dict_OtherDayLogin = "OtherDayLogin_105" # 非同一天二次登陆
|
| | | Def_Player_Dict_LoginValid = "LoginValid_106" # 新增有效登陆标记
|
| | | Def_Player_Dict_RequestAddFamilyCnt = "RequestAddFamilyCnt_107" # 已申请加入家族的个数
|
| | | Def_Player_Dict_RequestAddFamilyID = "AddFamilyID%s_108" # 申请加入的家族ID, %s为第几个
|
| | | Def_Player_Dict_LastFamilyID = "LastFamilyID" # 记录玩家上一个家族ID
|
| | |
| | | Def_Player_Dict_ActivityValueDay = "ActivityValueDay_117" #每日活跃值
|
| | | Def_Player_Dict_GiveActivityAward = "GiveActivityAward_118" #每日活跃值奖励领取
|
| | | Def_Player_CrazyBilling_VIP_Coin = "CrazyBillingVIPCoin_119" # 扶持账号真实充值
|
| | | Def_Player_Dict_LoginType = "LoginType_122" # 玩家登入方式
|
| | | Def_Player_Dict_CommonNewGuyCardState = "CommonNGCard_%s" # 通用新手卡使用记录, 参数为key编号, 二进制位存储
|
| | | Def_Player_Dict_IDNewGuyCardState = "IDNGCard_%s" # 绑定账号新手卡使用记录, 参数为key编号, 二进制位存储
|
| | | Def_Player_Dict_UseNewGuyCardState = "NGCardState_%s" # 是否使用过某类型的新手卡,参数为key编号, 二进制位存储
|
| | |
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # A1 01 玩家电脑信息 #tagCMPCInfo
|
| | |
|
| | | class tagCMPCInfo(Structure):
|
| | | Head = tagHead()
|
| | | PCOSLen = 0 #(BYTE PCOSLen)
|
| | | PCOS = "" #(String PCOS)// 操作系统
|
| | | ResolutionLen = 0 #(BYTE ResolutionLen)
|
| | | Resolution = "" #(String Resolution)// 分辨率
|
| | | BrowserLen = 0 #(BYTE BrowserLen)
|
| | | Browser = "" #(String Browser)// 浏览器
|
| | | ScribeTypeLen = 0 #(BYTE ScribeTypeLen)
|
| | | ScribeType = "" #(String ScribeType)// 记录类型
|
| | | ScribeDataLen = 0 #(BYTE ScribeDataLen)
|
| | | ScribeData = "" #(String ScribeData)// 记录扩展信息
|
| | | data = None
|
| | |
|
| | | def __init__(self):
|
| | | self.Clear()
|
| | | self.Head.Cmd = 0xA1
|
| | | self.Head.SubCmd = 0x01
|
| | | return
|
| | |
|
| | | def ReadData(self, _lpData, _pos=0, _Len=0):
|
| | | self.Clear()
|
| | | _pos = self.Head.ReadData(_lpData, _pos)
|
| | | self.PCOSLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.PCOS,_pos = CommFunc.ReadString(_lpData, _pos,self.PCOSLen)
|
| | | self.ResolutionLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.Resolution,_pos = CommFunc.ReadString(_lpData, _pos,self.ResolutionLen)
|
| | | self.BrowserLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.Browser,_pos = CommFunc.ReadString(_lpData, _pos,self.BrowserLen)
|
| | | self.ScribeTypeLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.ScribeType,_pos = CommFunc.ReadString(_lpData, _pos,self.ScribeTypeLen)
|
| | | self.ScribeDataLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.ScribeData,_pos = CommFunc.ReadString(_lpData, _pos,self.ScribeDataLen)
|
| | | return _pos
|
| | |
|
| | | def Clear(self):
|
| | | self.Head = tagHead()
|
| | | self.Head.Clear()
|
| | | self.Head.Cmd = 0xA1
|
| | | self.Head.SubCmd = 0x01
|
| | | self.PCOSLen = 0
|
| | | self.PCOS = ""
|
| | | self.ResolutionLen = 0
|
| | | self.Resolution = ""
|
| | | self.BrowserLen = 0
|
| | | self.Browser = ""
|
| | | self.ScribeTypeLen = 0
|
| | | self.ScribeType = ""
|
| | | self.ScribeDataLen = 0
|
| | | self.ScribeData = ""
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | length = 0
|
| | | length += self.Head.GetLength()
|
| | | length += 1
|
| | | length += len(self.PCOS)
|
| | | length += 1
|
| | | length += len(self.Resolution)
|
| | | length += 1
|
| | | length += len(self.Browser)
|
| | | length += 1
|
| | | length += len(self.ScribeType)
|
| | | length += 1
|
| | | length += len(self.ScribeData)
|
| | |
|
| | | return length
|
| | |
|
| | | def GetBuffer(self):
|
| | | data = ''
|
| | | data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
|
| | | data = CommFunc.WriteBYTE(data, self.PCOSLen)
|
| | | data = CommFunc.WriteString(data, self.PCOSLen, self.PCOS)
|
| | | data = CommFunc.WriteBYTE(data, self.ResolutionLen)
|
| | | data = CommFunc.WriteString(data, self.ResolutionLen, self.Resolution)
|
| | | data = CommFunc.WriteBYTE(data, self.BrowserLen)
|
| | | data = CommFunc.WriteString(data, self.BrowserLen, self.Browser)
|
| | | data = CommFunc.WriteBYTE(data, self.ScribeTypeLen)
|
| | | data = CommFunc.WriteString(data, self.ScribeTypeLen, self.ScribeType)
|
| | | data = CommFunc.WriteBYTE(data, self.ScribeDataLen)
|
| | | data = CommFunc.WriteString(data, self.ScribeDataLen, self.ScribeData)
|
| | | return data
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''
|
| | | Head:%s,
|
| | | PCOSLen:%d,
|
| | | PCOS:%s,
|
| | | ResolutionLen:%d,
|
| | | Resolution:%s,
|
| | | BrowserLen:%d,
|
| | | Browser:%s,
|
| | | ScribeTypeLen:%d,
|
| | | ScribeType:%s,
|
| | | ScribeDataLen:%d,
|
| | | ScribeData:%s
|
| | | '''\
|
| | | %(
|
| | | self.Head.OutputString(),
|
| | | self.PCOSLen,
|
| | | self.PCOS,
|
| | | self.ResolutionLen,
|
| | | self.Resolution,
|
| | | self.BrowserLen,
|
| | | self.Browser,
|
| | | self.ScribeTypeLen,
|
| | | self.ScribeType,
|
| | | self.ScribeDataLen,
|
| | | self.ScribeData
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | m_NAtagCMPCInfo=tagCMPCInfo()
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMPCInfo.Head.Cmd,m_NAtagCMPCInfo.Head.SubCmd))] = m_NAtagCMPCInfo
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # A1 23 查询充值次数 #tagCMQueryCoinToGoldCount
|
| | |
|
| | | class tagCMQueryCoinToGoldCount(Structure):
|
| | |
| | |
|
| | | m_NAtagCMViewBillboard=tagCMViewBillboard()
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMViewBillboard.Cmd,m_NAtagCMViewBillboard.SubCmd))] = m_NAtagCMViewBillboard
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # A2 19 游戏建议收集 #tagCMAdviceSubmit
|
| | |
|
| | | class tagCMAdviceSubmit(Structure):
|
| | | Head = tagHead()
|
| | | Type = 0 #(BYTE Type)//提交类型
|
| | | Len = 0 #(WORD Len)
|
| | | Content = "" #(String Content)//size = Len
|
| | | data = None
|
| | |
|
| | | def __init__(self):
|
| | | self.Clear()
|
| | | self.Head.Cmd = 0xA2
|
| | | self.Head.SubCmd = 0x19
|
| | | return
|
| | |
|
| | | def ReadData(self, _lpData, _pos=0, _Len=0):
|
| | | self.Clear()
|
| | | _pos = self.Head.ReadData(_lpData, _pos)
|
| | | self.Type,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.Len,_pos = CommFunc.ReadWORD(_lpData, _pos)
|
| | | self.Content,_pos = CommFunc.ReadString(_lpData, _pos,self.Len)
|
| | | return _pos
|
| | |
|
| | | def Clear(self):
|
| | | self.Head = tagHead()
|
| | | self.Head.Clear()
|
| | | self.Head.Cmd = 0xA2
|
| | | self.Head.SubCmd = 0x19
|
| | | self.Type = 0
|
| | | self.Len = 0
|
| | | self.Content = ""
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | length = 0
|
| | | length += self.Head.GetLength()
|
| | | length += 1
|
| | | length += 2
|
| | | length += len(self.Content)
|
| | |
|
| | | return length
|
| | |
|
| | | def GetBuffer(self):
|
| | | data = ''
|
| | | data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
|
| | | data = CommFunc.WriteBYTE(data, self.Type)
|
| | | data = CommFunc.WriteWORD(data, self.Len)
|
| | | data = CommFunc.WriteString(data, self.Len, self.Content)
|
| | | return data
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''
|
| | | Head:%s,
|
| | | Type:%d,
|
| | | Len:%d,
|
| | | Content:%s
|
| | | '''\
|
| | | %(
|
| | | self.Head.OutputString(),
|
| | | self.Type,
|
| | | self.Len,
|
| | | self.Content
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | m_NAtagCMAdviceSubmit=tagCMAdviceSubmit()
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMAdviceSubmit.Head.Cmd,m_NAtagCMAdviceSubmit.Head.SubCmd))] = m_NAtagCMAdviceSubmit
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | |
| | | GameWorld.GetGameWorld().EventShell_SendEventEx(eventTypeStr, len(eventTypeStr), dataStr, len(dataStr))
|
| | | return
|
| | |
|
| | |
|
| | | ## 二次非同天登陆
|
| | | # @param accID: 账号ID
|
| | | # @param ip: ip
|
| | | # @return: None
|
| | | def DR_OtherDayLogin(accID, ip, curPlayer):
|
| | | |
| | | dataDict = {'AccID':accID, 'IP':ip}
|
| | |
|
| | | #发送封包
|
| | | SendEventPack("OtherDayLogin", dataDict, curPlayer)
|
| | | return
|
| | |
|
| | |
|
| | | ## 登陆
|
| | | # @param curPlayer 玩家实例
|
| | | # @return: None
|
| | |
| | | #===========================================================================
|
| | | return
|
| | |
|
| | | #// A1 01 玩家电脑信息 #tagCMPCInfo
|
| | | #
|
| | | #struct tagCMPCInfo
|
| | | #{
|
| | | # tagHead Head;
|
| | | # BYTE PCOSLen; |
| | | # char PCOS[PCOSLen]; // 操作系统
|
| | | # BYTE ResolutionLen; |
| | | # char Resolution[ResolutionLen]; // 分辨率
|
| | | # BYTE BrowserLen; |
| | | # char Browser[BrowserLen]; // 浏览器
|
| | | # BYTE ScribeTypeLen; |
| | | # char ScribeType[ScribeTypeLen]; // 记录类型
|
| | | # BYTE ScribeDataLen; |
| | | # char ScribeData[ScribeDataLen]; // 记录扩展信息
|
| | | #};
|
| | | def ReceiveClientPCInfo(index, clientData, tick):
|
| | | #===========================================================================
|
| | | # curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
| | | # PCOS = clientData.PCOS
|
| | | # Resolution = clientData.Resolution
|
| | | # Browser = clientData.Browser
|
| | | # ScribeType = clientData.ScribeType
|
| | | # #ScribeData = clientData.ScribeData
|
| | | # |
| | | # GameWorld.DebugLog("ReceiveClientPCInfo %s" % ScribeType)
|
| | | # GameWorld.DebugLog(" PCOS=%s" % PCOS)
|
| | | # GameWorld.DebugLog(" Resolution=%s" % Resolution)
|
| | | # GameWorld.DebugLog(" Browser=%s" % Browser)
|
| | | # |
| | | # # 转化为对方所需格式
|
| | | # if PCOS and "Windows" in PCOS:
|
| | | # PCOS = " ".join(PCOS.split(" ")[:2])
|
| | | # |
| | | # # 转化为对方所需格式
|
| | | # if Resolution:
|
| | | # Resolution = "%s*%s" % eval(Resolution)
|
| | | # |
| | | # if ScribeType == ShareDefine.Def_UserAction_Login:
|
| | | # firstLogin = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FirstLogin)
|
| | | # if not firstLogin:
|
| | | # PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FirstLogin, 1)
|
| | | # WriteEvent_entry_firstlogin(curPlayer, Browser, Resolution, PCOS)
|
| | | # if curPlayer.GetLV() == 1:
|
| | | # WriteEvent_level_up(curPlayer) # 首登发送一次1级数据
|
| | | # GameWorld.DebugLog(" entry_firstlogin")
|
| | | # |
| | | # WriteEvent_login(curPlayer, Browser, Resolution, PCOS)
|
| | | #===========================================================================
|
| | | |
| | | return
|
| | |
|
| | | #// A2 19 游戏建议收集 #tagCMAdviceSubmit
|
| | | #
|
| | | #struct tagCMAdviceSubmit
|
| | | #{
|
| | | # tagHead Head;
|
| | | # BYTE Type; //提交类型
|
| | | # WORD Len;
|
| | | # char Content[Len]; //size = Len
|
| | | #};
|
| | | def OnSubmitBugSuggest(index, clientData, tick):
|
| | | #===========================================================================
|
| | | # curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
| | | # subType = clientData.Type
|
| | | # content = clientData.Content
|
| | | # eventName = Def_Custom_Events_Bug if subType == 0 else Def_Custom_Events_Suggest
|
| | | # WriteEvent_custom_events(curPlayer, eventName, content)
|
| | | # DataRecordPack.DR_BugSuggest(curPlayer, eventName, content)
|
| | | #===========================================================================
|
| | | return
|
| | |
|
| | | def GetScribeEvent_chr_level(curPlayer):
|
| | | transCnt, showLV = GameWorld.GetClientLV(curPlayer)
|
| | | return transCnt * 1000 + showLV
|
| | |
| | | PlayerEventCounter.UpdatePlayerLoginTime(curPlayer)
|
| | | return
|
| | |
|
| | | ##非同一天二次登陆
|
| | | # @param curPlayer 玩家实例
|
| | | # @return None
|
| | | def NoteOtherDayLogin(curPlayer):
|
| | | #记录过或者未登陆过 不记录
|
| | | if curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_OtherDayLogin) != 1:
|
| | | return
|
| | | |
| | | logoffTimeStr = curPlayer.GetLogoffTime().strip()
|
| | | loginTimeStr = curPlayer.GetLoginTime().strip()
|
| | | #curTimeStr = GameWorld.GetCurrentDataTimeStr()
|
| | | |
| | | #防范外部逻辑错误,或异常情况
|
| | | if logoffTimeStr in ['', '0'] or loginTimeStr in ['', '0']:
|
| | | return
|
| | | |
| | | logoffTimeDate = GameWorld.GetDateTimeByStr(logoffTimeStr.split()[0], ChConfig.TYPE_Time_Format_Day)
|
| | | |
| | | #同一天不记录
|
| | | if logoffTimeDate == GameWorld.GetDateTimeByStr(loginTimeStr.split()[0], ChConfig.TYPE_Time_Format_Day):
|
| | | return
|
| | | |
| | | #GameWorld.Log("OtherDayLogin offtime = %s" % logoffTimeDate)
|
| | | |
| | | DataRecordPack.DR_OtherDayLogin(curPlayer.GetAccID(), curPlayer.GetIP(), curPlayer)
|
| | | |
| | | #标记为已记录
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_OtherDayLogin, 2)
|
| | | |
| | | return
|
| | |
|
| | | #// A1 20 货币兑换 #tagCMMoneyExchange
|
| | | #
|
| | | #struct tagCMMoneyExchange
|
| | |
| | | def DoPlayerLogin(curPlayer, tick):
|
| | | #这里只做初始化逻辑
|
| | | curPlayer.SetDict(ChConfig.Def_PlayerKey_LoadMapIsLogin, 1)
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_RealLoginOK, 0) # 每次登录重置
|
| | |
|
| | | #通知时间
|
| | | Sync_PyServerDataTimeToClient(curPlayer)
|
| | |
| | | PlayerPrestigeSys.OnLogin(curPlayer)
|
| | | #DataRecordPack.DR_PlayerLogin(curPlayer)
|
| | | EventReport.WriteEvent_login(curPlayer)
|
| | | |
| | | |
| | | __FirstLoginOnEnter(curPlayer)
|
| | | |
| | | # 合服首登处理
|
| | | __DoMixServerFirstLogin(curPlayer)
|
| | | PlayerBillboard.BillboardOnLogin(curPlayer)
|
| | |
|
| | | #非同一天二次登陆, 应该放在该函数中的SetLoginTime之后
|
| | | NoteOtherDayLogin(curPlayer)
|
| | | |
| | | #上线时通知脱机挂时被击杀的离线时间
|
| | | __Sync_PlayerOffline(curPlayer, tick)
|
| | |
|
| | |
| | | #---玩家上线, 宠物逻辑处理---
|
| | | PetControl.DoLogic_PetInfo_OnLogin(curPlayer, tick)
|
| | | PlayerPet.OnPlayerPetLogin(curPlayer)
|
| | | |
| | | __FirstLoginOnEnter(curPlayer)
|
| | |
|
| | | #清空玩家万能背包中的任务物品
|
| | | ItemControler.ClearPackEventItem(curPlayer, IPY_GameWorld.rptAnyWhere)
|
| | |
| | | 该函数为地图最终登录成功才会执行到,以后一些功能类的登录处理建议均写到这里
|
| | | 旧的功能先不动( __DoPlayerLoginServer 函数中的功能),如果有登录相关的bug再考虑是否移动到此函数
|
| | | '''
|
| | | |
| | | if curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_RealLoginOK):
|
| | | #切地图的不处理,切地图的也会触发该函数
|
| | | return
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_RealLoginOK, 1)
|
| | | GameWorld.Log("MapServer->DoPlayerRealLoginOK", curPlayer.GetPlayerID())
|
| | |
|
| | | if GameWorld.IsCrossServer():
|
| | |
| | | return
|
| | |
|
| | | def __FirstLoginOnEnter(curPlayer):
|
| | | ## 首登处理,先return
|
| | | return
|
| | | ## 首登处理
|
| | | |
| | | playerID = curPlayer.GetID()
|
| | | if curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FirstLogin):
|
| | | return
|
| | |
|
| | | GameWorld.Log('玩家是第一次进入游戏', playerID)
|
| | | # 特殊说明: 如果地图没有完全初始化好,客户端断开或者异常等情况会触发RunGateGameServerMapServerKickOutPlayerNoSave
|
| | |
| | | #---补满血满魔---
|
| | | GameObj.SetHP(curPlayer, GameObj.GetMaxHP(curPlayer))
|
| | | curPlayer.SetMP(curPlayer.GetMaxMP())
|
| | | |
| | | #---给予玩家新手物品---
|
| | |
|
| | | #默认触发一次功能开启
|
| | | if curPlayer.GetLV() == 1:
|
| | |
| | | #玩家默认恶名值
|
| | | curPlayer.SetInfamyValue(ChConfig.Def_FirstLogin_InfamyValue)
|
| | |
|
| | | #标记已登陆过,用于非同一天二次登陆
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_OtherDayLogin, 1)
|
| | | |
| | | #curPlayer.SetDict("ThunderLogin", 1)
|
| | | #记录第一次登陆
|
| | | DataRecordPack.DR_FirstLogin(curPlayer.GetAccID(), curPlayer.GetIP(), curPlayer)
|
| | |
| | | mailList = IpyGameDataPY.GetFuncEvalCfg("MailLVAward", 2)
|
| | | for mailTypeKey, mailItemList in mailList:
|
| | | PlayerControl.SendMailByKey(mailTypeKey, [curPlayer.GetPlayerID()], mailItemList)
|
| | | |
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FirstLogin, 1)
|
| | | return
|
| | |
|
| | | ## 合服首登处理
|
| | | # @param curPlayer
|
| | | # @return None
|
| | | def __DoMixServerFirstLogin(curPlayer):
|
| | | ## 合服首登处理
|
| | | isMixServer = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_IsMixServer)
|
| | | if not isMixServer:
|
| | | return
|
| | |
| | | def PlayerDisconnect(index, tick):
|
| | | GameWorld.GetPsycoFunc(__Func_PlayerDisconnect)(index, tick)
|
| | | return
|
| | | #---------------------------------------------------------------------
|
| | |
|
| | | ##记录新增有效登陆玩家,登陆10分钟以上玩家才算有效
|
| | | # @param curPlayer 玩家实例
|
| | | # @return None
|
| | | def NoteLoginValid(curPlayer):
|
| | | if curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_LoginValid) == 1:
|
| | | #已记录
|
| | | return
|
| | | |
| | | #计算时间, 当前减去登陆时间
|
| | | diffTime = GameWorld.GetCurrentTime() - GameWorld.GetDateTimeByStr(curPlayer.GetLoginTime().strip())
|
| | | |
| | | #10分钟以上才算有效玩家
|
| | | if diffTime.days == 0 and diffTime.seconds < 10 * 60:
|
| | | return
|
| | | |
| | | DataRecordPack.DR_LoginValid(curPlayer.GetAccID(), curPlayer.GetIP(), curPlayer)
|
| | | |
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_LoginValid, 1)
|
| | | return
|
| | |
|
| | |
|
| | | ##C++封包触发, 玩家下线
|
| | | #@param index 玩家索引
|
| | |
| | |
|
| | | #流向记录玩家下线
|
| | | DataRecordPack.DR_PlayerDisconnect(curPlayer)
|
| | | |
| | | #记录新增有效登陆玩家
|
| | | NoteLoginValid(curPlayer)
|
| | |
|
| | | #VIP时间
|
| | | #PlayerVip.CalcVIPTimeByTick(curPlayer, tick, False)
|