From ec68dabc97521a7706344e7d038e9f08462f4fe8 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 16 十二月 2025 10:26:34 +0800
Subject: [PATCH] 16 卡牌服务端(删除多余备档报错防范;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorld.py |   86 +++++++++++++++++++++++++++++++++++++++----
 1 files changed, 78 insertions(+), 8 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorld.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorld.py
index ae8e33a..ea5120e 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorld.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorld.py
@@ -123,6 +123,10 @@
     #重新加载已经预存的脚本
     for name, reloadPath in sys.modules.items():
         try:
+            pathStr = str(reloadPath)
+            if "\\Lib\\" in pathStr or "\\DLLs\\" in pathStr:
+                #DebugLog("Py库脚本不重读,会引起类继承出现问题导致报错! %s, %s" % (name, reloadPath))
+                continue
             if name in ["PyGameData"]:
                 DebugLog("%s 模块不重读!" % name)
                 continue
@@ -507,7 +511,9 @@
 # @return 返回值. 是否通过检查
 # @remarks 概率相关, 这个事件是否能够出现
 def CanHappen(rate, maxRate=ShareDefine.Def_MaxRateValue):
-    if random.randint(0, maxRate -1) < rate:
+    if rate <= 0:
+        return 0
+    if rate >= maxRate or random.randint(0, maxRate -1) < rate:
         return 1
     
     return 0
@@ -972,6 +978,16 @@
     dateTimeB = datetime.datetime(dateTimeB.year, dateTimeB.month, dateTimeB.day, 0, 0, 0)
     return (dateTimeA - dateTimeB).days
 
+def GetEndTimeByZeroTime(startTime, addDays):
+    ## 获取结束时间,根据0点结束计算
+    # @param startTime: 起始时间戳
+    # @param addDays: 增加的天数,如果是1天实际为当天,即1代表当天
+    startDate = ChangeTimeNumToDatetime(startTime)
+    startZeroDate = datetime.datetime(startDate.year, startDate.month, startDate.day, 23, 59, 59)
+    startZeroTime = int(time.mktime(startZeroDate.timetuple()))
+    endTime = startTime + (startZeroTime - startTime) + max(addDays - 1, 0) * 24 * 3600
+    return endTime
+
 #---------------------------------------------------------------------
 ##获取与当前时间相差天数的datetime格式数据
 # @param diffDays 差距天数
@@ -1160,9 +1176,6 @@
     if npcObj == IPY_GameWorld.gnotSummon:
         return GetNPCManager().FindSummonNPCByID(curTagNPC.GetID())
     
-    elif npcObj == IPY_GameWorld.gnotTruck:
-        return GetNPCManager().FindTruckByID(curTagNPC.GetID())
-    
     elif npcObj == IPY_GameWorld.gnotPet:
         return GetNPCManager().FindPetByID(curTagNPC.GetID())
     
@@ -1280,6 +1293,22 @@
     LogUI.Msg('%s\t%s\tPyDebug:%s'%(par, playerID, msg))
     return
 
+def DebugLogEx(logFormat, *args):
+    ## DEBUG调试输出信息,只传入日志格式跟参数,非debug下不进行日志内容格式化
+    # @param logFormat: 日志内容格式,也可以直接传入完整的日志内容
+    # @param args: 日志参数,最后一个参数可以多传一个参数作为playerID用
+    if not __GameWorld.GetDebugLevel():
+        return
+    par = 0
+    playerID = 0
+    try:
+        msg = logFormat % args
+    except:
+        msg = logFormat % args[:-1]
+        playerID = args[-1]
+    LogUI.Msg('%s\t%s\tPyDebug:%s'%(par, playerID, msg))
+    return
+
 #---------------------------------------------------------------------
 ##获得当前服务器跨服ID
 # @param 无
@@ -1313,6 +1342,10 @@
 # @remarks 获得当前服务器的版本号
 def GetServerVersion():
     return GetGameWorld().GetServerVersion()
+
+def IsBattleServer():
+    ## 是否战斗服务器
+    return ToIntDef(ReadChConfig.GetPyMongoConfig("platform", "BattleServer"), 0) == 1
 
 def GetServerGroupID():
     ## 服务器组ID,必须唯一,代表这台物理服务器
@@ -1358,6 +1391,8 @@
 # @return
 def GetPlatform():
     return ReadChConfig.GetPyMongoConfig("platform", "PlatformName")
+
+def IsTestPlatform(platform): return platform in ["test", "yun"]
 
 #===============================================================================
 # ##获得当前服务器ID
@@ -1426,7 +1461,10 @@
 
 ##获取玩家所属平台
 def GetPlayerPlatform(curPlayer):
-    return curPlayer.GetAccountData().GetOperator()
+    appID = curPlayer.GetAccountData().GetOperator()
+    if not appID:
+        appID = GetAppIDByAccID(curPlayer.GetAccID())
+    return appID
 
 ##获取平台账号
 def GetPlatformAccID(gameAccID):
@@ -1434,6 +1472,10 @@
     paInfoList = infoList[:-2]
     platformAccID = Def_AccID_Split_Sign.join(paInfoList)
     return platformAccID
+def GetAppIDByAccID(gameAccID):
+    ## 根据账号获取appID
+    infoList = gameAccID.split(Def_AccID_Split_Sign)
+    return infoList[-2]
 
 def GetSessionID(curPlayer):
     return md5.md5(curPlayer.GetAccID() + curPlayer.GetAccountData().GetLastLoginTime() +'mobile').hexdigest()
@@ -1730,6 +1772,8 @@
     randList = []
     weight = 0
     for info in weightList:
+        if not info[0]:
+            continue
         weight += info[0]
         randList.append([weight, info[1] if len(info) == 2 else info[1:]])
     if not randList:
@@ -1931,7 +1975,7 @@
     ## 跨服服务器时间
     if IsCrossServer():
         return GetCurrentDataTimeStr()
-    lastCrossServerTime, lastServerTime, _ = PyGameData.g_crossServerTimeInfo
+    lastCrossServerTime, lastServerTime = PyGameData.g_crossServerTimeInfo
     if not lastCrossServerTime:
         return GetCurrentDataTimeStr()
     curTime = int(time.time())
@@ -2104,6 +2148,32 @@
     numValue += pow(10, dataIndex)*(dataValue - lastTagLV)
     return numValue
 
+def GetValue(dataValue, fromRight, bits):
+    '''获取某个数值中,从右往左数第x位开始,截图n位得到的数据
+    @param dataValue: 原始数值
+    @param fromRight: 从右往左数第x位开始,从1开始
+    @param bits: 截取n位
+    @return: 数值value
+    '''
+    lPow = pow(10, fromRight)
+    rPow = pow(10, fromRight - bits)
+    curValue = dataValue % lPow / rPow
+    return curValue
+
+def SetValue(dataValue, fromRight, bits, updValue):
+    '''修改某个数值,从右往左数第x位开始,截图n位得到的数据,替换为具体数值
+    @param dataValue: 原始数值
+    @param fromRight: 从右往左数第x位开始,从1开始
+    @param bits: 截取n位
+    @param updValue: 替换值
+    @return: 修改后的value值
+    '''
+    lPow = pow(10, fromRight)
+    rPow = pow(10, fromRight - bits)
+    leftValue = dataValue / lPow * lPow
+    rightValue = dataValue % rPow
+    return leftValue + updValue * rPow + rightValue
+    
 def GetBitValue(dataValue, index):
     """ 得到某个字节值中某一位(Bit)的值
     @param dataValue: 待取值的字节值
@@ -2388,8 +2458,8 @@
 def SendGameErrorEx(errType, msgInfo="", playerID=0):
     ErrLog("SendGameErrorEx: %s -> %s" % (errType, msgInfo), playerID)
     SendGameError(errType, msgInfo)
-    #if GetGameWorld().GetDebugLevel():
-    #    raise Exception("%s -> %s" % (errType, msgInfo))
+    if GetGameWorld().GetDebugLevel():
+        raise Exception("%s -> %s" % (errType, msgInfo))
     return
 
 def SendGameError(errType, msgInfo=""):

--
Gitblit v1.8.0