From 9684c4b7c4fdad50a85e506207239ac89545d06c Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期四, 20 五月 2021 18:22:45 +0800
Subject: [PATCH] 5071 【BT2】【主干】【gt_1.100.6】外网出现boss无法死亡。(添加死亡检查日志明细)

---
 ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py |  218 ++++++++++++++++++++++++++++++++++++++++--------------
 1 files changed, 162 insertions(+), 56 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py
index 2dbdcdb..3cc7e7a 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py
@@ -15,12 +15,10 @@
 # @change: "2013-03-20 18:00" Alee 添加DEBUG输出函数DebugLog
 # @change: "2013-09-10 20:10" Alee 函数DebugLog改用GetDebugLevel才有效
 # @change: "2014-05-16 10:30" xmnathan 增加交易所管理器接口
-# @change: "2014-08-01 15:30" xmnathan 增加天梯竞技场管理器接口
 # @change: "2014-09-22 10:00" xmnathan 增加GM工具补偿管理器接口
 # @change: "2015-01-14 00:30" hxp 增加服务器平台区服ID获取
 # @change: "2015-01-14 20:30" hxp 增加CanHappen函数
 # @change: "2015-06-08 20:30" hxp 增加获取channelCode
-# @change: "2015-09-24 16:00" hxp 增加IsMergeOpen
 # @change: "2015-10-22 23:00" hxp 增加获取子服serverID
 # @change: "2016-03-28 17:00" hxp 增加创角改名GetPlayerFullName
 # @change: "2016-07-18 19:00" hxp 增加获取平台账号
@@ -33,6 +31,7 @@
 import IpyGameDataPY
 import PyGameData
 import ReadChConfig
+import PlayerDBGSEvent
 import ConfigParser
 import GameConfig
 import ShareDefine
@@ -44,6 +43,7 @@
 import time
 import random
 import copy
+import urllib
 #import psyco
 #---------------------------------------------------------------------
 GameWorldData = IPY_GameServer.IPY_GameWorld()
@@ -303,14 +303,6 @@
     global GameWorldData
     return GameWorldData.GetBourseManager()
 
-## 竞技场管理器
-#  @param 
-#  @return HightLadderMgr
-#  @remarks 函数详细说明.
-def GetHightLadderMgr():
-    global GameWorldData
-    return GameWorldData.GetHighLadderManager()
-
 ## GM工具补偿管理器
 #  @param 
 #  @return HightLadderMgr
@@ -418,18 +410,8 @@
     return GetGameWorld().GetServerVersion()
 
 def GetServerGroupID():
-    # 服务器组ID: 代表一台服务器中包含的合服、混服的各平台区服组成的一个独立游戏区服服务器环境, 用某个ID来代表此服务器
-    #            在跨服环境中,此ID就是代表来自同一台服务器子服的玩家
-    # 服务器组ID生成规则: DB平台标识对应编号 * 1000000 + DB配置的ServerID
-    # ServerID支持范围: 1~999999
-    # 平台编号支持范围:1~2000
-    platform = GetPlatform()
-    serverNum = GetPlatformServerNum(platform)
-    if not serverNum:
-        return 0
-    serverNum = max(1, min(2000, serverNum))
-    serverID = max(1, min(999999, GetServerID()))
-    return serverNum * 1000000 + serverID
+    ## 服务器组ID,必须唯一,代表这台物理服务器
+    return ToIntDef(ReadChConfig.GetPyMongoConfig("platform", "GroupID"), 0)
 
 def GetPlatformServerNum(platform):
     # 获取服务器的平台编号
@@ -447,15 +429,19 @@
 def GetPlatform():
     return ReadChConfig.GetPyMongoConfig("platform", "PlatformName")
 
-##获得当前服务器ID
-# @param 无
-# @return
-def GetServerID():
-    return ToIntDef(GetServerSID()[1:], 0)
+#===============================================================================
+# ##获得当前服务器ID
+# # @param 无
+# # @return
+# def GetServerID():
+#    return ToIntDef(GetServerSID()[1:], 0)
+#===============================================================================
 
-def GetServerSID():
-    ##获得当前服务器ID, 带s的
-    return ReadChConfig.GetPyMongoConfig("platform", "ServerID")
+#===============================================================================
+# def GetServerSID():
+#    ##获得当前服务器ID, 带s的
+#    return ReadChConfig.GetPyMongoConfig("platform", "ServerID")
+#===============================================================================
 
 Def_AccID_Split_Sign = "@"
 
@@ -477,17 +463,31 @@
 def GetPlayerMainServerID(accIDPlatform):
     # 玩家合服后所属主服ID
     # @param accIDPlatform: 玩家账号所属的平台
-    #===========================================================================
-    # mainServerID = ToIntDef(ReadChConfig.GetPyMongoConfig("platform", "%sMainServerID" % accIDPlatform), None)
-    # if mainServerID != None:
-    #    return mainServerID
-    #===========================================================================
-    return GetServerID()
+    mainServerID = ToIntDef(ReadChConfig.GetPyMongoConfig("platform", "%sMainServerID" % accIDPlatform), None)
+    if mainServerID != None:
+        return mainServerID
+    return 0
+
+
+#===============================================================================
+# 平台ID = appid
+# 运营ID = spid
+# 服务器账号更改
+# 原先账号组合为
+# 运营提供的玩家账号ID + 平台ID + 区服组成
+# 
+# 因为IOS和安卓在支持混服的情况下,还要能支持同一个角色号,故引入一个新的运营ID(客户端打包配置),以保证玩家账号为同一个
+# 账号组合变更
+# 运营提供的玩家账号ID + 运营ID + 区服组成
+# 
+# 原游戏中获取平台ID接口变更
+# 1. db 从数据库中的账号表获取AppID
+# 2. GameServer和MapServer 接口改为GetOperator 参考 GetPlayerPlatform
+#===============================================================================
 
 ##获取玩家所属平台
-def GetPlayerPlatform(gameAccID):
-    infoList = gameAccID.split(Def_AccID_Split_Sign)
-    return "" if len(infoList) < 3 else infoList[-2]
+def GetPlayerPlatform(curPlayer):
+    return curPlayer.GetAccountInfo().GetOperator()
 
 ##获取平台账号
 def GetPlatformAccID(gameAccID):
@@ -537,12 +537,44 @@
     return tagPlayer.GetRealMapID()
 
 #---------------------------------------------------------------------
+
+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)
+    curDateTime = datetime.datetime.today()
+    actionDateTime = curDateTime + datetime.timedelta(days=(actionServerDay-diffDay))
+    return "%d-%d-%d" % (actionDateTime.year, actionDateTime.month, actionDateTime.day)
+
 ##获得系统时间
 # @param 无意义
 # @return 系统时间
 # @remarks 获得系统时间
 def GetServerTime():
     return datetime.datetime.today()
+
+def GetWeekOfYear():
+    ## 一年中的第几周, 1代表第1周
+    return datetime.datetime.isocalendar(datetime.datetime.today())[1]
+
 #---------------------------------------------------------------------
 ##获取2个时间之间差异的TimeDelta类实例
 # @param compareTimeStr 比较的时间字符, 如"2010-05-26 11:21:25"
@@ -820,23 +852,27 @@
 def GetDatetimeBySubDays(diffDays):
     return datetime.datetime.today() - datetime.timedelta(days = diffDays)
 
+def GetDailyDateStr():
+    ## 获取日常日期 yyyy-MM-dd
+    curDate = GetServerTime()
+    if curDate.hour >= ShareDefine.Def_OnEventHour:
+        return "%d-%s-%s" % (curDate.year, curDate.month, curDate.day)
+    preDate = curDate - datetime.timedelta(days = -1) # 属于前一天
+    return "%s-%s-%s" % (preDate.year, preDate.month, preDate.day)
 
-## 是否跨服服务器
-#  @param None None
-#  @return
-def IsMergeServer():
-    config = GameConfig.GetConfig()
-        
-    return config.get('IsMergeWarServe', 0)
+def IsCrossServer():
+    ## 是否跨服服务器
+    return ToIntDef(ReadChConfig.GetPyMongoConfig("Merge", "IsMergeServer"), 0)
 
-## 是否开启跨服活动
-#  @param None None
-#  @return
-def IsMergeOpen():
-    config = GameConfig.GetConfig()
-    # 如果跨服服务器IP有配置, 或本身就是跨服服务器, 则代表开启
-    return True if (config.get('MergeServerIP') or config.get('IsMergeWarServe')) else False
+def IsCrossRealmOpen():
+    ## 是否开启跨服活动
+    return ReadChConfig.GetPyMongoConfig("Merge", "MergeServerIP") or IsCrossServer()
 
+def GetCrossZoneName():
+    ## 跨服服务器分区名,标记一起跨服分区的名字,配置在跨服服务器,子服不用配置,由跨服服务器同步
+    if IsCrossServer():
+        return ReadChConfig.GetPyMongoConfig("Merge", "CrossZoneName")
+    return PyGameData.g_crossZoneName
 
 ## 获取玩家的区服名,仅在跨服有效
 #  @param curPlayer 玩家实例
@@ -884,8 +920,9 @@
 #  @param itemList 待选列表
 #  @return object
 def GetResultByRandomList(randList, defValue=None, maxRateValue=ChConfig.Def_MaxRateValue):
-    rate = random.randint(0, maxRateValue)
-    
+    if not randList:
+        return defValue
+    rate = random.randint(0, randList[-1][0])
     return GetResultByRiseList(randList, rate, defValue)
 
 ## 增长列表(类似饼图)从中获得指定的信息
@@ -901,6 +938,19 @@
         return smallList[1]
     
     return defValue
+
+## 从列表中产生物品,[[权重, object], ....]
+#  @param weightList 待选列表
+def GetResultByWeightList(weightList):
+    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
+    rate = random.randint(1, randList[-1][0])
+    return GetResultByRiseList(randList, rate)
 
 ## 根据字典key获取value值
 #  @return 
@@ -937,6 +987,24 @@
         adict[key] = value + bdict.pop(key)
     adict.update(bdict)
     return adict
+
+## 根据排行获取名次对应值
+#  @param orderDict {名次:obj, ...} 名次支持段跳跃
+#  @param order 名次,从1开始
+#  @param isDefaultLast 找不到的名次是否默认取最后一名的
+#  @return obj or None
+def GetOrderValueByDict(orderDict, order, isDefaultLast=True):
+    if order in orderDict:
+        return orderDict[order]
+    
+    orderList = sorted(orderDict.keys())
+    if order > 0:
+        for dOrder in orderList:
+            if order <= dOrder:
+                return orderDict[dOrder]
+        
+    # 找不到的默认取最后一名
+    return orderDict[orderList[-1]] if isDefaultLast else None
 
 ##概率相关, 这个事件是否能够出现
 # @param rate 基础几率
@@ -987,4 +1055,42 @@
     except:
         return inputText
     
-    return inputText
\ No newline at end of file
+    return inputText
+
+# 服务器默认GBK,转配置编码如UTF8,一般用于与显示层交互,不判断是否base64
+def CodeToGBK(inputText):
+    encodingList = ReadChConfig.GetEvalChConfig("EncodingTex")
+    
+    if len(encodingList) != 2:
+        ErrLog("EncodingTex.txt Error len != 2")
+        return inputText
+    
+    try:
+        return inputText.decode(GetCharacterEncoding()).encode(ShareDefine.Def_Game_Character_Encoding)
+    except:
+        return inputText
+    
+    return inputText
+
+def RaiseException(errorMsg, playerID=0):
+    ## 处理抛出异常信息,debug下直接抛出异常报错信息,否则发送运维邮件提醒
+    ErrLog(errorMsg, playerID)
+    if GetGameWorld().GetDebugLevel():
+        raise Exception(errorMsg)
+    else:
+        SendGameError("GameServerRaiseException", errorMsg)
+    return
+
+def SendGameError(errType, msgInfo=""):
+    ''' 向运维发送邮件,用于需要紧急处理的信息
+    @param errType: 错误类型,自定义即可
+    @param msgInfo: 错误信息,可选
+    '''
+    getUrl = ReadChConfig.GetPyMongoConfig("EventReport", "OpenStateUrl")
+    groupID = ReadChConfig.GetPyMongoConfig("platform", "GroupID")
+    userDBName = ReadChConfig.GetPyMongoConfig("connect", "USER_DB_NAME")
+    getUrl = getUrl + "?Type=%s&groupID=%s&userDBName=%s"%(errType, groupID, userDBName)
+    if msgInfo:
+        getUrl = getUrl + "&MsgInfo=%s" % urllib.quote_plus(msgInfo)
+    GetGameWorld().EventReport_EventReport("", "", "", "", 0, getUrl)
+    return

--
Gitblit v1.8.0