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