From c2acfe7cf4641bc560a8454a985af16cf349f3ad Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 25 六月 2021 17:42:38 +0800
Subject: [PATCH] 5090 【主干】【BT2】【BT3】【bt2_1.100.1】【gt_1.100.7】循环活动优化-日期活动结束后周循环开启异常(修复活动日期时间头尾衔接导致的活动开启异常问题)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamilyRedPacket.py |  157 +++++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 123 insertions(+), 34 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamilyRedPacket.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamilyRedPacket.py
index 5027d3c..d462c82 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamilyRedPacket.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamilyRedPacket.py
@@ -19,15 +19,14 @@
 import IpyGameDataPY
 import IPY_GameWorld
 import ChPyNetSendPack
+import PlayerFeastRedPacket
 import NetPackCommon
 import PlayerVip
 import ShareDefine
+import CommFunc
 
 import time
 #---------------------------------------------------------------------
-
-Def_GoldPacket = 0 #主动发钻石红包
-
 
 (
 State_NoSend, #未发
@@ -46,10 +45,48 @@
 ## OnDay处理
 #  @param curPlayer
 #  @return None
-def RedPacketOnDay(curPlayer):
-    #发钻石红包额度重置
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyRedPacketGoldLimit, 0)
-    __NotifyGoldLimt(curPlayer)
+def RedPacketOnDay(curPlayer, onEventType):
+    if onEventType == ShareDefine.Def_OnEventType:
+        #发钻石红包额度重置
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyRedPacketGoldLimit, 0)
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ServerRedPacketGrabCnt, 0)
+        __NotifyGoldLimt(curPlayer)
+    elif onEventType == ShareDefine.Def_OnEventTypeEx:
+        oscDay = IpyGameDataPY.GetFuncCfg('OpenServerRedPacketCfg')
+        openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay)
+        if openServerDay < oscDay:
+            grabCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OSRedPacketCanGrabCnt, 0)
+            sendCnt = IpyGameDataPY.GetFuncCfg('OpenServerRedPacketCfg', 5)
+            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OSRedPacketCanGrabCnt, grabCnt+sendCnt)
+            NotifyOSRedPacket(curPlayer)
+    return
+
+def OnPlayerRecharge(curPlayer, orderCoin):
+    ## 玩家充值
+    
+    todayCoin = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TodayCTGCoinTotal)
+    # 每日首充红包
+    if todayCoin - orderCoin == 0:
+        dayFirstRedPacketID = IpyGameDataPY.GetFuncCfg("RechargeRedPacket", 1)
+        GameWorld.DebugLog("每日首充红包: dayFirstRedPacketID=%s" % dayFirstRedPacketID)
+        if dayFirstRedPacketID:
+            CreatRedPacketByID(curPlayer, dayFirstRedPacketID)
+    #else:
+    #    GameWorld.DebugLog("非每日首充: todayCoin=%s" % todayCoin)
+        
+    # 单笔充值红包
+    rmbRedPacketID = 0
+    rmbRedPackIDDict = IpyGameDataPY.GetFuncEvalCfg("RechargeRedPacket", 2, {})
+    rmbList = rmbRedPackIDDict.keys()
+    rmbList.sort()
+    for rmb in rmbList:
+        if orderCoin <= CommFunc.RMBToCoin(rmb):
+            rmbRedPacketID = rmbRedPackIDDict[rmb]
+            break
+        
+    if rmbRedPacketID:
+        GameWorld.DebugLog("单笔充值红包: orderRMB=%s,rmbRedPacketID=%s" % (orderCoin, rmbRedPacketID))
+        CreatRedPacketByID(curPlayer, rmbRedPacketID)
     return
 
 def CreatCacheRedPacktet(curPlayer):
@@ -64,36 +101,49 @@
     return
 
 
-def CreatRedPacketByID(curPlayer, redPacketID, state=State_NoSend, data=0):
-    #根据红包ID生成红包
+def CreatRedPacketByID(curPlayer, redPacketID, state=State_NoSend, data=0, wishInfo=""):
+    '''根据红包ID生成红包 - 外部功能调用接口
+    '''
     ipyData = IpyGameDataPY.GetIpyGameData('FamilyRedPack', redPacketID)
     if not ipyData:
         return
     getType = ipyData.GetGetType()
-    if getType == IpyGameDataPY.GetFuncCfg('OpenServerRedPacketType'):
+    if not getType:
+        return
+    if getType == ShareDefine.RedPackType_OpenServer:
         oscDay = IpyGameDataPY.GetFuncCfg('OpenServerRedPacketCfg')
         openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay)
         if openServerDay >= oscDay:
             GameWorld.DebugLog('    发开服红包,活动已过,不可发送!')
             return
+        isFamilyRedPacket = False
+    elif getType == ShareDefine.RedPackType_FeastSucc:
+        if not PlayerFeastRedPacket.GetFeastRedPacketState():
+            GameWorld.DebugLog('    非节日红包活动中,不可发送!')
+            return
+        isFamilyRedPacket = False
+    elif getType == ShareDefine.RedPackType_Server:
+        isFamilyRedPacket = False
     else:
         if not curPlayer.GetFamilyID():
             #没家族 先存起来,等进仙盟时再补发
             GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_FamilyRedPacketCache, redPacketID, 1)
             return
-    
-    DoCreatFamilyRedPacket(curPlayer, getType, ipyData.GetMoneyType(), ipyData.GetMoneyNum(), ipyData.GetPacketCnt(), state, '', data)
+        isFamilyRedPacket = True
+        
+    __DoCreatRedPacket(curPlayer, getType, ipyData.GetMoneyType(), ipyData.GetMoneyNum(), ipyData.GetPacketCnt(), state, wishInfo, data, isFamilyRedPacket)
     return
 
-## 生成红包
-def DoCreatFamilyRedPacket(curPlayer, getType, moneyType=2, awardNum=100, packetCnt=10, state=State_NoSend, wishInfo='', data=0):
-
-        
-    
+## 生成红包,注意外部不可直接调用该函数
+def __DoCreatRedPacket(curPlayer, getType, moneyType=2, awardNum=100, packetCnt=10, state=State_NoSend, wishInfo='', data=0, isFamilyRedPacket=True):
     playerID = curPlayer.GetPlayerID()
     packetCnt = min(packetCnt, awardNum)
     
-    if getType == Def_GoldPacket:
+    if isFamilyRedPacket and not curPlayer.GetFamilyID():
+        GameWorld.DebugLog("玩家无仙盟,无法发放归属仙盟的红包!getType=%s" % (getType), playerID)
+        return
+    
+    if getType == ShareDefine.RedPackType_GoldPacket:
         goldLimit = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyRedPacketGoldLimit, 0)
         familyRedPacketGoldLimit = IpyGameDataPY.GetFuncCfg('FamilyRedPacketGoldLimit')
         if awardNum + goldLimit > familyRedPacketGoldLimit:
@@ -117,13 +167,13 @@
 #            return
         
     #通知Gameserver生成红包
-    msg = str([playerID, getType, packetCnt, moneyType, awardNum, wishInfo, state, data])
-    GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, "CreatFamilyRedPacket", msg, len(msg))
-    GameWorld.DebugLog('    DoCreatFamilyRedPacket 通知Gameserver生成红包 msg=%s' % msg)
+    msg = str([playerID, getType, packetCnt, moneyType, awardNum, wishInfo, state, data, isFamilyRedPacket])
+    GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, "MapServer_CreatRedPacket", msg, len(msg))
+    GameWorld.DebugLog('    通知Gameserver生成红包 msg=%s' % msg)
     return
 
 
-#// A6 08 发家族红包 #tagCMSendFamilyRedPacket
+#// A6 08  发家族红包 #tagCMSendFamilyRedPacket
 #
 #struct     tagCMSendFamilyRedPacket
 #{
@@ -131,8 +181,8 @@
 #    DWORD        RedPacketID;    // 红包ID,没有发0
 #    WORD        PacketCnt;    // 红包数量
 #    WORD        MoneyNum;    //金钱数量
-#    WORD        WishLen;            //祝福语长度
-#    char        Wish[NameLen];        //size=WishLen
+#    char        Wish[33];        //祝福语
+#    BYTE        IsAnonymous;    //是否匿名
 #};
 ## 发家族红包
 def OnSendFamilyRedPacket(index, clientData, tick):
@@ -141,14 +191,16 @@
     packetCnt = clientData.PacketCnt
     moneyNum = clientData.MoneyNum
     wishInfo = clientData.Wish
+    isAnonymous = clientData.IsAnonymous
     if not redPacketID:
         #主动发的钻石红包 vip限制
         if not PlayerVip.GetPrivilegeValue(curPlayer, ChConfig.VIPPrivilege_FamilyGoldPack):
             GameWorld.DebugLog("主动发的钻石红包 VIP权限不足")
             return
-        DoCreatFamilyRedPacket(curPlayer, Def_GoldPacket, IPY_GameWorld.TYPE_Price_Gold_Money, moneyNum, packetCnt, State_NoGot, wishInfo)
+        __DoCreatRedPacket(curPlayer, ShareDefine.RedPackType_GoldPacket, IPY_GameWorld.TYPE_Price_Gold_Money, moneyNum, packetCnt, State_NoGot, wishInfo)
     else:
-        msg = str([curPlayer.GetPlayerID(), redPacketID, packetCnt])
+        # 注意:该函数发放的是已创建的红包,该操作只是把该红包开放给玩家可抢
+        msg = str([curPlayer.GetPlayerID(), redPacketID, packetCnt, isAnonymous])
         GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, "SendFamilyRedPacket", msg, len(msg))
     return
 
@@ -159,6 +211,7 @@
     packData = ChPyNetSendPack.tagMCFamilyRedPacketGoldLimit()
     packData.Clear()
     packData.HasSendGold = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyRedPacketGoldLimit, 0)
+    packData.ServerGrabCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ServerRedPacketGrabCnt)
     NetPackCommon.SendFakePack(curPlayer, packData)
     return
 
@@ -178,21 +231,29 @@
     return
 
 
-#// A4 04 抢家族红包 #tagCGGrabFamilyRedPacket
+#// AB 12 抢红包 #tagCMGrabFamilyRedPacket
 #
-#struct    tagCGGrabFamilyRedPacket
+#struct    tagCMGrabFamilyRedPacket
 #{
 #    tagHead        Head;
 #    DWORD        RedPaketID;         // 红包ID
+#    BYTE        GetWay;            //获得途径
 #};
-## 抢红包
 def OnGrabFamilyRedPacket(index, clientData, tick):
     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
     redPacketID = clientData.RedPaketID
-    OSCanGrabCnt = GetOSCanGrabCnt(curPlayer)
-    msg = str([redPacketID, OSCanGrabCnt])
+    reqGetWay = clientData.GetWay
+    if reqGetWay == ShareDefine.RedPackType_OpenServer:
+        canGrabCnt = GetOSCanGrabCnt(curPlayer)
+    elif reqGetWay == ShareDefine.RedPackType_FeastSucc:
+        canGrabCnt = PlayerFeastRedPacket.GetFeastSuccRedPacketCanGrabCnt(curPlayer)
+    elif reqGetWay == ShareDefine.RedPackType_Server:
+        canGrabCnt = GetServerRedPackCanGrabCnt(curPlayer)
+    else:
+        canGrabCnt = -1
+    msg = str([redPacketID, reqGetWay, canGrabCnt])
     GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, "GrabFamilyRedPacket", msg, len(msg))
-    GameWorld.DebugLog('    抢红包 OSCanGrabCnt=%s'%OSCanGrabCnt)
+    GameWorld.DebugLog('    抢红包 redPacketID=%s,getWay=%s,canGrabCnt=%s' % (redPacketID, reqGetWay, canGrabCnt))
     return
 
 
@@ -231,15 +292,43 @@
     if not isSelf: #抢自己的红包不扣次数
         grabCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OSRedPacketCanGrabCnt, 0)
         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OSRedPacketCanGrabCnt, max(0, grabCnt-1))
-        if grabCnt == IpyGameDataPY.GetFuncCfg('OpenServerRedPacketCfg', 4):
-            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OSRedPacketStartTime, int(time.time()))
+#        if grabCnt == IpyGameDataPY.GetFuncCfg('OpenServerRedPacketCfg', 4):
+#            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OSRedPacketStartTime, int(time.time()))
     
     
     #通知
     NotifyOSRedPacket(curPlayer)
     return
 
+def GetServerRedPackCanGrabCnt(curPlayer):
+    #获取全服红包可抢次数
+    # @return: -1为不限
+    vipLVMaxGrabCntDict = IpyGameDataPY.GetFuncEvalCfg("RechargeRedPacket", 3, {})
+    vipLVList = [int(vipStr) for vipStr in vipLVMaxGrabCntDict.keys()]
+    vipLVList.sort()
+    for vipLV in vipLVList:
+        if curPlayer.GetVIPLv() <= vipLV:
+            maxGrabCnt = vipLVMaxGrabCntDict[str(vipLV)]
+            if not maxGrabCnt:
+                return -1
+            todayGrabCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ServerRedPacketGrabCnt)
+            return max(0, maxGrabCnt - todayGrabCnt)
+    return 0
+
+def GrabServerRedPacketResult(curPlayer, moneyNum, isSelf):
+    ##抢全服红包结果
+    
+    if isSelf:
+        return
+    
+    grabCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ServerRedPacketGrabCnt)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ServerRedPacketGrabCnt, grabCnt + 1)
+    
+    __NotifyGoldLimt(curPlayer)
+    return
+
 def ProcessOSRedPacket(curPlayer, tick):
+    return
     #开服红包恢复次数
     if not GameWorld.SetPlayerTickTime(curPlayer, ChConfig.TYPE_Player_Tick_OSRedPacket, tick):
         return

--
Gitblit v1.8.0