From b00dae2f6043cf263b9f42f7ef24c6e2311f6345 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期五, 01 七月 2022 16:37:46 +0800 Subject: [PATCH] 9537 【越南】服务器中心接口2(事件汇报优化: 如果配置仅汇报,则仅配置中的事件ID才汇报) --- ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py | 174 ++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 files changed, 145 insertions(+), 29 deletions(-) diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py index 3cc7e7a..721975c 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py @@ -538,31 +538,73 @@ #--------------------------------------------------------------------- -def GetOperationActionDateStr(dateInfo, openServerDay): - '''获取运营活动对应日期,存数字代表开服天配置,需要转化为对应的日期 - @param dateInfo: 运营活动表配置的日期信息, 如果是纯数字代表开服天 - @param openServerDay: 当前开服天 - ''' - if not dateInfo: - curDateTime = datetime.datetime.today() - return "%d-%d-%d" % (curDateTime.year, curDateTime.month, curDateTime.day) - if dateInfo.startswith("W"): - curDateTime = datetime.datetime.today() - curWeekday = curDateTime.weekday() + 1 - actionWeekday = int(dateInfo[1:]) - actionDateTime = curDateTime + datetime.timedelta(days=(actionWeekday-curWeekday)) - return "%d-%d-%d" % (actionDateTime.year, actionDateTime.month, actionDateTime.day) - if dateInfo.startswith("Mix"): - diffDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_MixServerDay) + 1 - actionServerDay = int(dateInfo[3:]) - elif not dateInfo.isdigit(): - return dateInfo - else: - diffDay = openServerDay - actionServerDay = int(dateInfo) +def GetOperationActionDateStr(ipyData): + ## 获取运营活动对应日期,存数字代表开服天配置,需要转化为对应的日期 curDateTime = datetime.datetime.today() - actionDateTime = curDateTime + datetime.timedelta(days=(actionServerDay-diffDay)) - return "%d-%d-%d" % (actionDateTime.year, actionDateTime.month, actionDateTime.day) + startDateStr = ipyData.GetStartDate() + endDateStr = ipyData.GetEndDate() + if not startDateStr: + startDateStr = "%d-%d-%d" % (curDateTime.year, curDateTime.month, curDateTime.day) + if not endDateStr: + endDateStr = "%d-%d-%d" % (curDateTime.year, curDateTime.month, curDateTime.day) + + # 日期直接返回 + if startDateStr.count("-") == 2 and "W" not in startDateStr: + return startDateStr, endDateStr + + # 开服天 + if startDateStr.isdigit(): + diffDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerDay) + 1 + startDateTime = curDateTime + datetime.timedelta(days=(int(startDateStr)-diffDay)) + endDateTime = curDateTime + datetime.timedelta(days=(int(endDateStr)-diffDay)) + + # 合服天 + elif startDateStr.startswith("Mix"): + diffDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_MixServerDay) + 1 + startDateTime = curDateTime + datetime.timedelta(days=(int(startDateStr[3:])-diffDay)) + endDateTime = curDateTime + datetime.timedelta(days=(int(endDateStr[3:])-diffDay)) + + # 周循环, 直接配置 Wx 或 Wx|有效开始日期 或 Wx|有效结束日期 + elif startDateStr.startswith("W"): + curWeekday = curDateTime.weekday() + 1 + + startWeekDateInfo = startDateStr.split("|") + startWeekInfo = startWeekDateInfo[0] + startWeekday = int(startWeekInfo[1:]) + startDateTime = curDateTime + datetime.timedelta(days=(startWeekday-curWeekday)) + + # 限制开启循环日期 + if len(startWeekDateInfo) > 1: + startLoopDateStr = startWeekDateInfo[1] + startLoopDateTime = ChangeStrToDatetime(startLoopDateStr, ChConfig.TYPE_Time_YmdFormat) + if startLoopDateTime > startDateTime: + startDateTime = startLoopDateTime + + startWeekDay = startDateTime.weekday() + 1 # 实际开启活动是周几,不一定和配置的周几一样,可能从中间被截断开始 + + # 处理周循环的结束日期 + endWeekDateInfo = endDateStr.split("|") + endWeekInfo = endWeekDateInfo[0] + endWeekday = int(endWeekInfo[1:]) + endDateTime = startDateTime + datetime.timedelta(days=(endWeekday-startWeekDay)) + if len(endWeekDateInfo) > 1: + endLoopDateStr = endWeekDateInfo[1] + endLoopDateTime = ChangeStrToDatetime(endLoopDateStr, ChConfig.TYPE_Time_YmdFormat) + if endDateTime > endLoopDateTime: + endDateTime = endLoopDateTime + + # 只配置结束日期的时候可能导致开始日期计算出来比结束日期还大,即当前时间超过结束日期,且 配置还存在的情况 + if startDateTime > endDateTime: + startDateTime = endDateTime # 反正都无法开启,随便给个日期,不超过结束日期即可 + + # 默认 + else: + startDateTime = curDateTime + endDateTime = curDateTime + + startDateStr = "%d-%d-%d" % (startDateTime.year, startDateTime.month, startDateTime.day) + endDateStr = "%d-%d-%d" % (endDateTime.year, endDateTime.month, endDateTime.day) + return startDateStr, endDateStr ##获得系统时间 # @param 无意义 @@ -844,6 +886,8 @@ timeStr = datetime.datetime.strptime(timeStr, timeFormat).timetuple() return int(time.mktime(timeStr)) +def ChangeStrToDatetime(timeStr, timeFormat=ChConfig.TYPE_Time_Format): + return datetime.datetime.strptime(timeStr, timeFormat) ##获取与当前时间相差天数的datetime格式数据 # @param diffDays 差距天数 @@ -873,6 +917,17 @@ if IsCrossServer(): return ReadChConfig.GetPyMongoConfig("Merge", "CrossZoneName") return PyGameData.g_crossZoneName + +def GetCrossServerTimeStr(): + ## 跨服服务器时间 + if IsCrossServer(): + return GetCurrentDataTimeStr() + lastCrossServerTime, lastServerTime, _ = PyGameData.g_crossServerTimeInfo + if not lastCrossServerTime: + return GetCurrentDataTimeStr() + curTime = int(time.time()) + crossServerTime = lastCrossServerTime + (curTime - lastServerTime) + return ChangeTimeNumToStr(crossServerTime) ## 获取玩家的区服名,仅在跨服有效 # @param curPlayer 玩家实例 @@ -941,16 +996,59 @@ ## 从列表中产生物品,[[权重, object], ....] # @param weightList 待选列表 -def GetResultByWeightList(weightList): +def GetResultByWeightList(weightList, defValue=None): randList = [] weight = 0 for info in weightList: weight += info[0] randList.append([weight, info[1] if len(info) == 2 else info[1:]]) if not randList: - return + return defValue rate = random.randint(1, randList[-1][0]) - return GetResultByRiseList(randList, rate) + return GetResultByRiseList(randList, rate, defValue) + +## 获得对应数位的值 +# @param numValue 数值 +# @param dataIndex 数位索引 +# @return 获得的值 +def GetDataByDigitPlace(numValue, dataIndex): + return (numValue/pow(10, dataIndex))%10 + + +## 设置对应数位的值 +# @param numValue 数值 +# @param dataIndex 数位索引 +# @param dataValue 当前修改数值 +# @return 获得的值 +def ChangeDataByDigitPlace(numValue, dataIndex, dataValue): + + if dataValue < 0 or dataValue > 9 or dataIndex > ShareDefine.Def_PDictDigitCnt: + return numValue + + # 获得对应数位的值 + lastTagLV = GetDataByDigitPlace(numValue, dataIndex) + + numValue += pow(10, dataIndex)*(dataValue - lastTagLV) + return numValue + +def GetBitValue(dataValue, index): + """ 得到某个字节值中某一位(Bit)的值 + @param dataValue: 待取值的字节值 + @param index: 待读取位的序号,从右向左0开始,0-7为一个完整字节的8个位 + @return: 返回读取该位的值,0或1 + """ + return 1 if dataValue & (1 << index) else 0 + +def SetBitValue(dataValue, index, val): + """ 更改某个字节值中某一位(Bit)的值 + @param dataValue: 准备更改的字节原值 + @param index: 待更改位的序号,从右向左0开始,0-7为一个完整字节的8个位 + @param val: 目标位预更改的值,0或1 + @return: 返回更改后字节的值 + """ + if val: + return dataValue | (1 << index) + return dataValue & ~(1 << index) ## 根据字典key获取value值 # @return @@ -993,7 +1091,7 @@ # @param order 名次,从1开始 # @param isDefaultLast 找不到的名次是否默认取最后一名的 # @return obj or None -def GetOrderValueByDict(orderDict, order, isDefaultLast=True): +def GetOrderValueByDict(orderDict, order, isDefaultLast=True, defaultValue=None): if order in orderDict: return orderDict[order] @@ -1004,7 +1102,7 @@ return orderDict[dOrder] # 找不到的默认取最后一名 - return orderDict[orderList[-1]] if isDefaultLast else None + return orderDict[orderList[-1]] if isDefaultLast else defaultValue ##概率相关, 这个事件是否能够出现 # @param rate 基础几率 @@ -1028,6 +1126,24 @@ curPlayer.DebugAnswer(text) return +def CrossServerMsg_DebugAnswer(msgData): + playerID, text = msgData + curPlayer = GetPlayerManager().FindPlayerByID(playerID) + if not curPlayer: + return + curPlayer.DebugAnswer(text) + return + +def DebugAnswerCross(playerID, serverGroupID, text): + DebugLog(text) + text = text.decode(ShareDefine.Def_Game_Character_Encoding).encode(GetCharacterEncoding()) + + import CrossRealmMsg + dataMsg = [playerID, text] + serverGroupIDList = [serverGroupID] + CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_DebugAnswer, dataMsg, serverGroupIDList) + return + def GetMap(mapID): return IpyGameDataPY.GetIpyGameData("ChinMap", mapID) def GetNPCData(npcID): return IpyGameDataPY.GetIpyGameData("ChinNPC", npcID) -- Gitblit v1.8.0