From dcec4a9b39a53106bd80dfb41fad83e7319e728e Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期一, 10 七月 2023 18:49:54 +0800
Subject: [PATCH] 9823 9265【主干】【小7】【骨折】跨服云购修改

---
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossLuckyCloudBuy.py |  108 ++++++++++++++++++++++-------------------------------
 1 files changed, 45 insertions(+), 63 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossLuckyCloudBuy.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossLuckyCloudBuy.py
index abc019c..fafbef3 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossLuckyCloudBuy.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossLuckyCloudBuy.py
@@ -263,41 +263,6 @@
                                    % (lotteryRec.lotteryNum, crossServerTime, GameWorld.ChangeTimeNumToStr(crossServerTime), 
                                       lotteryRec.lotteryTime, GameWorld.ChangeTimeNumToStr(lotteryRec.lotteryTime), passTime, MaxTime))
             
-    if not GameWorld.IsCrossServer():
-        return
-    
-    maxBuyCount = IpyGameDataPY.GetFuncCfg("LuckyCloudBuySet", 2)
-    doLotteryBuyCountPer = IpyGameDataPY.GetFuncCfg("LuckyCloudBuySet", 3)
-    doLotteryBuyCount = int(math.ceil(maxBuyCount * doLotteryBuyCountPer / 100.0))
-    
-    zoneLotteryInfo = {}
-    for zoneID, lotteryRecList in PyGameData.g_luckyCloudBuyLotteryDict.items():
-        if not lotteryRecList:
-            continue
-        lastLotteryRec = lotteryRecList[-1] # 取最后一个为最新一期
-        cfgID = lastLotteryRec.cfgID
-        if lastLotteryRec.lotteryNum:
-            GameWorld.Log("OnDay已开奖进入新一天第一轮! cfgID=%s,zoneID=%s" % (cfgID, zoneID))
-            DoStartNewRoundLuckyCloudBuy(cfgID, 1)
-            continue
-        buyRecList = PyGameData.g_luckyCloudBuyNumDict.get(zoneID, [])
-        buyCount = len(buyRecList)
-        if len(buyRecList) >= doLotteryBuyCount:
-            GameWorld.Log("OnDay未开奖但购买份数超过开奖保底份数! cfgID=%s,zoneID=%s,buyCount=%s >= %s" % (cfgID, zoneID, buyCount, doLotteryBuyCount))
-            DoLuckyCloudBuyLottery(lastLotteryRec, True, "OnDay")
-            continue
-        
-        GameWorld.Log("已购买份数不足开奖保底份数,重置为新一天的第一轮! cfgID=%s,zoneID=%s,buyCount=%s < %s" % (cfgID, zoneID, buyCount, doLotteryBuyCount))
-        lastLotteryRec.roundNum = 1
-        dataDict = {"Type":"ResetRound"}
-        dataDict.update(lastLotteryRec.GetString())
-        DataRecordPack.SendEventPack("LuckyCloudBuyLottery", dataDict)
-        zoneLotteryInfo[zoneID] = [lastLotteryRec.GetString()]
-        
-    # 广播子服轮次信息变更
-    if zoneLotteryInfo:
-        dataMsg = {"syncType":"Update", "zoneLotteryInfo":zoneLotteryInfo}
-        CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_LuckyCloudBuyLottery, dataMsg)
     return
 
 def DoLuckyCloudBuyLottery(lotteryRec, resetRound=False, sign=""):
@@ -382,21 +347,9 @@
     zoneLotteryInfo = {zoneID:[lotteryRec.GetString()]}
     dataMsg = {"syncType":"Update", "zoneLotteryInfo":zoneLotteryInfo}
     CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_LuckyCloudBuyLottery, dataMsg)
-        
-    actInfoDict = CrossActionControl.GetCrossActInfoByCfgID(ShareDefine.CrossActName_LuckyCloudBuy, cfgID)
-    if not actInfoDict or not actInfoDict[ShareDefine.ActKey_State]:
-        GameWorld.Log("    不在活动中了,不开下一轮! cfgID=%s" % cfgID)
-        return
-        
-    if roundNum >= IpyGameDataPY.GetFuncCfg("LuckyCloudBuySet", 1):
-        GameWorld.Log("    当日已达每日云购轮数上限,不开下一轮! roundNum=%s" % roundNum)
-        return
     
-    nextRoundNum = 1 if resetRound else (roundNum + 1)
-    GameWorld.Log("幸运云购开启下一轮! cfgID=%s,zoneID=%s,roundNum=%s,resetRound=%s,nextRoundNum=%s" 
-                  % (cfgID, zoneID, roundNum, resetRound, nextRoundNum))
     # 开始下一轮
-    return DoStartNewRoundLuckyCloudBuy(cfgID, nextRoundNum)
+    return DoStartNewRoundLuckyCloudBuy(cfgID, resetRound, roundNum)
 
 def GetMailBuyNums(buyNumList):
     buyNumList.sort()
@@ -426,14 +379,16 @@
         
     return buyNums
 
-def OnLuckyCloudBuyReset(ipyData, state):
-    ## 云购重置
+def OnLuckyCloudBuyStateChange(ipyData, actIDChange, state):
+    ## 云购状态变更
+    
     cfgID = ipyData.GetCfgID()
     zoneID = ipyData.GetZoneID()
     
     startNewLottery = False
     lotteryRecList = PyGameData.g_luckyCloudBuyLotteryDict.get(zoneID, [])
     lastLotteryRec = None if not lotteryRecList else lotteryRecList[-1]
+    # 最后一场未开奖
     if lastLotteryRec and not lastLotteryRec.lotteryNum:
         buyRecList = PyGameData.g_luckyCloudBuyNumDict.get(zoneID, [])
         if buyRecList:
@@ -445,46 +400,59 @@
             if popLotteryRec:
                 GameWorld.Log("移除无效轮次信息 %s" % popLotteryRec.GetString())
                 
+    # 变更为活动中且未开启新轮次
     if state and not startNewLottery:
-        GameWorld.Log("幸运云购重置,当前没有未开奖的轮次,直接开启新一轮! cfgID=%s,zoneID=%s" % (cfgID, zoneID))
-        DoStartNewRoundLuckyCloudBuy(cfgID, 1)
+        GameWorld.Log("幸运云购重置,当前没有未开奖的轮次,直接开启新一轮! cfgID=%s,zoneID=%s,state=%s" % (cfgID, zoneID, state))
+        DoStartNewRoundLuckyCloudBuy(cfgID, True)
         
     return
 
-def DoStartNewRoundLuckyCloudBuy(cfgID, roundNum):
+def DoStartNewRoundLuckyCloudBuy(cfgID, resetRound, roundNum=0):
     # 开启新一轮云购
-    
+        
     actInfoDict = CrossActionControl.GetCrossActInfoByCfgID(ShareDefine.CrossActName_LuckyCloudBuy, cfgID)
     if not actInfoDict or not actInfoDict[ShareDefine.ActKey_State]:
-        GameWorld.ErrLog("幸运云购非活动中,无法开启! cfgID=%s, roundNum=%s" % (cfgID, roundNum))
+        GameWorld.ErrLog("幸运云购非活动中,无法开启新轮次! cfgID=%s, roundNum=%s" % (cfgID, roundNum))
         return
+    state = actInfoDict[ShareDefine.ActKey_State]
     
     actIpyData = IpyGameDataPY.GetIpyGameData("CrossActLuckyCloudBuy", cfgID)
     if not actIpyData:
         return
     zoneID = actIpyData.GetZoneID()
     serverIDRangeList = actIpyData.GetServerIDRangeList()
+    roundMaxList = actIpyData.GetRoundMaxList()
     templateIDList = actIpyData.GetTemplateIDList()
-    if not templateIDList:
+    if not roundMaxList or not templateIDList:
         return
     
-    dayIndex = actInfoDict.get(ShareDefine.ActKey_DayIndex, 0)
-    templateID = templateIDList[dayIndex] if len(templateIDList) > dayIndex else templateIDList[-1]
+    sIndex = state - 1
+    roundMax = roundMaxList[sIndex] if len(roundMaxList) > sIndex else roundMaxList[-1]
+    if not resetRound and roundMax and roundNum >= roundMax:
+        GameWorld.Log("    已达云购轮数上限,不开下一轮! cfgID=%s,state=%s,roundNum=%s" % (cfgID, state, roundNum))
+        return
+    
+    templateID = templateIDList[sIndex] if len(templateIDList) > sIndex else templateIDList[-1]
     templateIpyData = IpyGameDataPY.GetIpyGameData("CrossActLuckyCloudBuyTemplate", templateID)
     if not templateIpyData:
         return
     
+    if resetRound:
+        nextRoundNum = 1
+    else:
+        nextRoundNum = roundNum + 1
+        
     superItemWeightInfo = templateIpyData.GetSuperItemWeightInfo()
     superItemInfo = GameWorld.GetResultByWeightList(superItemWeightInfo)
     if not superItemInfo or len(superItemInfo) < 3:
-        GameWorld.ErrLog("幸运云购生成大奖失败! zoneID=%s,roundNum=%s,superItemInfo=%s" % (zoneID, roundNum, superItemInfo))
+        GameWorld.ErrLog("幸运云购生成大奖失败! cfgID=%s,zoneID=%s,nextRoundNum=%s,superItemInfo=%s" % (cfgID, zoneID, nextRoundNum, superItemInfo))
         return
     
     lotteryRec = LuckyCloudBuyLottery()
     lotteryRec.idTime = int(time.time())
     lotteryRec.cfgID = cfgID
     lotteryRec.zoneID = zoneID
-    lotteryRec.roundNum = roundNum
+    lotteryRec.roundNum = nextRoundNum
     
     lotteryRec.serverIDRangeList = serverIDRangeList
     lotteryRec.superItemInfo = superItemInfo
@@ -494,11 +462,12 @@
     lotteryRecList = PyGameData.g_luckyCloudBuyLotteryDict[zoneID]
     lotteryRecList.append(lotteryRec)
     
-    PyGameData.g_luckyCloudBuyNumDict[zoneID] = [] # 新一轮情况购买记录
+    PyGameData.g_luckyCloudBuyNumDict[zoneID] = [] # 新一轮清空购买记录
     
     dataDict = {"Type":"NewRound"}
     dataDict.update(lotteryRec.GetString())
     DataRecordPack.SendEventPack("LuckyCloudBuyLottery", dataDict)
+    GameWorld.Log("幸运云购开启新轮次! cfgID=%s,zoneID=%s,state=%s,nextRoundNum=%s,superItemInfo=%s" % (cfgID, zoneID, state, nextRoundNum, superItemInfo))
     
     # 广播子服开奖信息
     zoneLotteryInfo = {zoneID:[lotteryRec.GetString()]}
@@ -879,9 +848,9 @@
     actInfo = CrossActionControl.GetCrossActInfoByServerGroupID(ShareDefine.CrossActName_LuckyCloudBuy, serverGroupID)
     if not actInfo:
         return
-    state = actInfo.get(ShareDefine.ActKey_State)
+    #state = actInfo.get(ShareDefine.ActKey_State)
     ipyDataInfo = actInfo.get(ShareDefine.ActKey_IpyDataInfo)
-    if not state or not ipyDataInfo:
+    if not ipyDataInfo:
         return
     zoneID = ipyDataInfo.get("ZoneID")
     if not zoneID:
@@ -904,6 +873,17 @@
     if not lotteryRec:
         return
     
+    roundTimeList = []
+    StartTimeList = ipyDataInfo.get("StartTimeList")
+    EndTimeList = ipyDataInfo.get("EndTimeList")
+    RoundMaxList = ipyDataInfo.get("RoundMaxList")
+    for i, startTime in enumerate(StartTimeList):
+        roundTime = ChPyNetSendPack.tagGCLuckyCloudBuyRoundTime()
+        roundTime.StartTime = startTime
+        roundTime.EndtTime = EndTimeList[i] if len(EndTimeList) > i else ""
+        roundTime.RoundMax = RoundMaxList[i] if len(RoundMaxList) > i else 0
+        roundTimeList.append(roundTime)
+        
     superItemInfo = lotteryRec.superItemInfo + [0, 0, 0, 0, 0]
     superItemID, superItemCount, _, moneyType, moneyValue = superItemInfo[:5]
     clientPack = ChPyNetSendPack.tagGCLuckyCloudBuyRoundInfo()
@@ -911,6 +891,8 @@
     clientPack.StartDate = ipyDataInfo.get("StartDate", "")
     clientPack.EndtDate = ipyDataInfo.get("EndDate", "")
     clientPack.LVLimit = ipyDataInfo.get("LVLimit", 0)
+    clientPack.RoundTimeList = roundTimeList
+    clientPack.RoundTimeCount = len(clientPack.RoundTimeList)
     clientPack.RoundID = lotteryRec.idTime
     clientPack.RoundNum = lotteryRec.roundNum
     clientPack.SuperItemID = superItemID

--
Gitblit v1.8.0