From cb971e24c5e3f6bb023740db543d8631bd97a134 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期五, 21 六月 2024 11:45:34 +0800 Subject: [PATCH] 10173 【主干】【香港】【越南】任务活动增加任务类型(击杀跨服蓬莱4; 击杀跨服魔化之地5) --- ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py | 198 +++++++++++++++++++++++++++++++++++++++++-------- 1 files changed, 165 insertions(+), 33 deletions(-) diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py index 3cc7e7a..513bc0e 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py @@ -118,6 +118,14 @@ except ValueError: return defValue +def ToFloat(input, defValue = 0): + try: + result = float(input) + return result + + except ValueError: + return defValue + ## 判断2个对象是否同国籍 # @param srcObj 起点对象 # @param desObj 目标对象 @@ -449,8 +457,8 @@ ##获取玩家所属区服ID # @param curPlayer # @return -def GetPlayerServerID(curPlayer): - accID = curPlayer.GetAccID() +def GetPlayerServerID(curPlayer): return GetAccIDServerID(curPlayer.GetAccID()) +def GetAccIDServerID(accID): infoList = accID.split(Def_AccID_Split_Sign) return 0 if len(infoList) < 3 else int(infoList[-1][1:]) @@ -538,31 +546,80 @@ #--------------------------------------------------------------------- -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 GetTemplateID(ipyData, cfgID, dayIndex): + if cfgID == None or dayIndex == None or not ipyData: + return 0 + templateIDList = ipyData.GetTemplateIDList() + templateID = templateIDList[-1] if dayIndex >= len(templateIDList) else templateIDList[dayIndex] + return templateID + +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 +901,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 +932,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 +1011,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 +1106,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 +1117,7 @@ return orderDict[dOrder] # 找不到的默认取最后一名 - return orderDict[orderList[-1]] if isDefaultLast else None + return orderDict[orderList[-1]] if isDefaultLast else defaultValue ##概率相关, 这个事件是否能够出现 # @param rate 基础几率 @@ -1017,17 +1130,36 @@ return 0 -def DebugAnswer(curPlayer, text): +def DebugAnswer(curPlayer, text, isLog=True): '''转码后再发DebugAnswer''' #=========================================================================== # if not GetGameWorld().GetDebugLevel(): # return #=========================================================================== - DebugLog(text) + if isLog: + DebugLog(text) text = text.decode(ShareDefine.Def_Game_Character_Encoding).encode(GetCharacterEncoding()) 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