From 5300950136a7d0556945fbd0cb953b331ee79f2c Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 29 一月 2019 16:07:46 +0800
Subject: [PATCH] 6087 【后端】【1.5.200】春节红包雨活动(初版)
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFB.py | 3
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamilyRedPacket.py | 64 +++--
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py | 16 +
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBLogic.py | 3
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTalk.py | 3
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerDiceEx.py | 5
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py | 4
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamilyRedPacket.py | 245 ++++++++++++++++---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_GrabFamilyRedPacketResult.py | 10
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_PlayerBuyZhenQi.py | 2
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCrossRealmPK.py | 2
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/QuestRunner.py | 1
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py | 2
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetRedPacket.py | 91 +++++++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py | 2
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py | 2
ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/SetRedPacket.py | 49 ++++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFeastRedPacket.py | 157 +++++++++++++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerSuccess.py | 41 +++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py | 6
20 files changed, 632 insertions(+), 76 deletions(-)
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/SetRedPacket.py b/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/SetRedPacket.py
new file mode 100644
index 0000000..91c1464
--- /dev/null
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/SetRedPacket.py
@@ -0,0 +1,49 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package GM.Commands.SetRedPacket
+#
+# @todo:设置红包
+# @author hxp
+# @date 2019-01-29
+# @version 1.0
+#
+# 详细描述: 设置红包
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2019-01-29 16:00"""
+#-------------------------------------------------------------------------------
+
+import PlayerFamilyRedPacket
+import ShareDefine
+import GameWorld
+
+
+## GM命令执行入口
+# @param curPlayer 当前玩家
+# @param paramList 参数列表
+# @return None or True
+# @remarks 函数详细说明.
+def OnExec(curPlayer, paramList):
+ if not paramList:
+ return
+
+ # 重置所有红包数据
+ if len(paramList) == 1 and paramList[0] == 0:
+ GameWorld.DebugAnswer(curPlayer, "清除所有红包领取记录")
+ PlayerFamilyRedPacket.g_allRecordDict = {}
+ PlayerFamilyRedPacket.g_grabDataDict = {}
+ PlayerFamilyRedPacket.g_redPackCountDict = {}
+
+ recordType = ShareDefine.Def_UniversalGameRecType_FamilyRedPacketGrabRecord
+ universalRecMgr = GameWorld.GetUniversalRecMgr()
+ universalRecMgr.Delete(recordType)
+ PlayerFamilyRedPacket.NotifyRedPacketInfo(curPlayer)
+ return
+
+
+ return
+
+
+
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py
index 0064807..74a25aa 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py
@@ -36,6 +36,7 @@
import PlayerXMZZ
import PlayerFamilySWRH
import GameWorldBoss
+import PlayerFamilyRedPacket
import PlayerFairyCeremony
import PlayerNewFairyCeremony
import GameWorldProcess
@@ -87,6 +88,12 @@
ipyData = operationActionDict[ShareDefine.OperationActionName_RealmPoint][0]
if ipyData:
Sync_OperationAction_RealmPoint(ipyData, curPlayer)
+ # 节日红包活动进行中
+ if ShareDefine.OperationActionName_FeastRedPacket in operationActionDict:
+ ipyData = operationActionDict[ShareDefine.OperationActionName_FeastRedPacket][0]
+ if ipyData:
+ PlayerFamilyRedPacket.Sync_FeastRedPacket(ipyData, curPlayer)
+
return
def SendMapServerOperationActionState():
@@ -446,6 +453,7 @@
dbOperationActIDKey = PlayerDBGSEvent.Def_OperationActID % actName
curActID = sendMapServerMsgDict.get(ShareDefine.ActKey_ID)
+ dayIndex = sendMapServerMsgDict.get(ShareDefine.ActKey_DayIndex, 0)
if curActID and PlayerDBGSEvent.GetDBGSTrig_ByKey(dbOperationActIDKey) != curActID:
PlayerDBGSEvent.SetDBGSTrig_ByKey(dbOperationActIDKey, curActID)
if actName in ShareDefine.NeedWorldLVOperationActNameList:
@@ -463,6 +471,10 @@
elif actName == ShareDefine.OperationActionName_NewFairyCeremony:
#重置仙界盛典
PlayerNewFairyCeremony.ResetNewFairyCeremony()
+ elif actName == ShareDefine.OperationActionName_FeastRedPacket:
+ #重置节日红包
+ if ipyData and dayIndex == 0:
+ PlayerFamilyRedPacket.OnResetFeastRedPacket(ipyData)
elif actName == ShareDefine.OperationActionName_FlashSale:
#限时抢购重置购买次数 本次活动每场不能重复
#dayIndex = sendMapServerMsgDict.get(ShareDefine.ActKey_DayIndex, 0)
@@ -497,7 +509,9 @@
elif actName == ShareDefine.OperationActionName_RealmPoint:
if isReload and ipyData:
Sync_OperationAction_RealmPoint(ipyData)
-
+ elif actName == ShareDefine.OperationActionName_FeastRedPacket:
+ if isReload and ipyData:
+ PlayerFamilyRedPacket.Sync_FeastRedPacket(ipyData)
#通知Mapserver,设置字典
#GameWorld.SendMapServerMsgEx(dictName, state) # 运营活动不单独通知活动状态,需与活动信息整合后一起通知
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py
index fa29cda..4a71a97 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py
@@ -357,6 +357,8 @@
PlayerTeam.DoCountdownLeaveTeamLogic(tick)
#副本助战
PlayerFBHelpBattle.OnMinuteProcess()
+ #红包
+ PlayerFamilyRedPacket.OnRedPacketMinuteProcess()
#每5分钟触发一次仙盟总战力更新
if curMinute % 5 == 0:
PlayerFamily.UpdFamilyTotalFightPower()
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamilyRedPacket.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamilyRedPacket.py
index 80e0bc0..169174c 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamilyRedPacket.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamilyRedPacket.py
@@ -31,16 +31,22 @@
import time
import random
+import datetime
+'''
+红包暂定有效期24小时,过天清除过期的红包,如果是玩家发放的返还未领取的货币
+上线同步所有红包信息,红包变化实时广播全服在线玩家
+'''
#Def_UniversalGameRecType_FamilyRedPacketAllRecord
-#value1 红包唯一ID
-#value2 家族ID
+#Time 创建红包时间,非红包实际开放领取时间,如果红包表有配置系统发放时间,则该时间存配表时间,没有的话存创建时的服务器时间
+#value1 红包唯一ID,该ID为实例ID,非配表的红包ID
+#value2 家族ID,0代表全服红包
#value3 总额度*10+金钱类型
#value4 状态
-#value5 时间,用来判断是否过期删除的
-#strValue1 创建者ID|创建者名字|创建者职业|获得途径
+#value5 时间,用来判断是否过期删除的,实际开放该红包领取的时间
+#strValue1 创建者ID|创建者名字|创建者职业|获得途径(红包类型)
#strValue2 可抢总个数
-#strValue3 祝福语
+#strValue3 祝福语,玩家自己编辑的内容
#Def_UniversalGameRecType_FamilyRedPacketGrabRecord
#value1 红包唯一ID
@@ -59,7 +65,10 @@
g_allRecordDict = {} #{红包ID:recData, ...}
g_grabDataDict = {} #{红包ID:{playerid:[抢到的钱,名字,job]}, ...}
-g_osRedCnt = 0 #开服红包个数
+g_redPackCountDict = {} #有限制最大红包个数的类型对应当前红包数 {类型组对应记录编号:当前个数, ...}
+
+DBKey_RedPacketSend = "RedPacketSend_%s" # 系统定时红包是否已发放, 参数红包ID
+
## 玩家登录
# @param None
# @return None
@@ -76,14 +85,157 @@
return
+##---------------------------------------- 节日红包 -----------------------------------------------
+
+def OnResetFeastRedPacket(ipyData):
+ ## 重置节日红包状态
+
+ if not ipyData:
+ return
+
+ dayRedPackIDList = ipyData.GetRedPacketIDList()
+ GameWorld.DebugLog("重置红包发放状态: dayRedPackIDList=%s" % dayRedPackIDList)
+ for redPackIDList in dayRedPackIDList:
+ for redPackID in redPackIDList:
+ if PlayerDBGSEvent.GetDBGSTrig_ByKey(DBKey_RedPacketSend % redPackID):
+ PlayerDBGSEvent.SetDBGSTrig_ByKey(DBKey_RedPacketSend % redPackID, 0)
+
+ return
+
+def __GetTodayRedPacketByTimeList():
+ key = "TodayRedPacketByTime"
+ openServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerDay) + 1
+ TodayRedPacketByTimeInfo = IpyGameDataPY.GetConfigEx(key)
+ if TodayRedPacketByTimeInfo and TodayRedPacketByTimeInfo[0] == openServerDay:
+ #GameWorld.DebugLog("已经加载过本日系统定时发放的红包! openServerDay=%s" % openServerDay)
+ return TodayRedPacketByTimeInfo[1]
+
+ redPacketByTimeList = []
+ serverTime = GameWorld.GetServerTime()
+
+ GameWorld.Log("===== 加载今天系统定时发放红包信息 ===== openServerDay=%s" % openServerDay)
+
+ ipyDataMgr = IpyGameDataPY.IPY_Data()
+ for index in xrange(ipyDataMgr.GetFamilyRedPackCount()):
+ ipyData = ipyDataMgr.GetFamilyRedPackByIndex(index)
+ redPackID = ipyData.GetID()
+ openTimeStr = ipyData.GetPacketOpenTime()
+ if not openTimeStr:
+ #GameWorld.DebugLog("非定时发放的红包!redPackID=%s" % (redPackID))
+ continue
+
+ openDateTime = datetime.datetime.strptime("%s:00" % openTimeStr, ChConfig.TYPE_Time_Format)
+ if openDateTime.year != serverTime.year or openDateTime.month != serverTime.month or openDateTime.day != serverTime.day:
+ #GameWorld.DebugLog("非今日定时发放的红包!redPackID=%s" % (redPackID))
+ continue
+
+ endDateTime = None
+ validMinutes = ipyData.GetValidMinutes()
+ if validMinutes:
+ endDateTime = openDateTime + + datetime.timedelta(minutes=validMinutes)
+
+ redPacketByTimeList.append([redPackID, openDateTime, endDateTime])
+
+ GameWorld.Log(" 增加本日定时发放系统红包信息: redPackID=%s, %s" % (redPackID, openTimeStr))
+
+ TodayRedPacketByTimeInfo = IpyGameDataPY.SetConfigEx(key, [openServerDay, redPacketByTimeList])
+ GameWorld.Log("本日系统定时发放的红包加载完毕!")
+ GameWorld.Log("=============================================================")
+ return TodayRedPacketByTimeInfo[1]
+
+def OnRedPacketMinuteProcess():
+ ## 每分钟处理,定时发放系统红包
+
+ todayRedPacketByTimeList = __GetTodayRedPacketByTimeList()
+ if not todayRedPacketByTimeList:
+ return
+
+ serverTime = GameWorld.GetServerTime()
+
+ for redPacketOpenInfo in todayRedPacketByTimeList:
+ redPackID, openDateTime, endDateTime = redPacketOpenInfo
+
+ if serverTime < openDateTime or (endDateTime and serverTime >= endDateTime):
+ #GameWorld.DebugLog("非红包发放时段! redPackID=%s, openDateTime=%s, endDateTime=%s" % (redPackID, openDateTime, endDateTime))
+ continue
+
+ if PlayerDBGSEvent.GetDBGSTrig_ByKey(DBKey_RedPacketSend % redPackID):
+ #GameWorld.DebugLog("红包已发放过! redPackID=%s" % (redPackID))
+ continue
+ CreateSystemRedPacket(redPackID)
+
+ return
+
+def Sync_FeastRedPacket(ipyData, curPlayer=None):
+ ## 同步节日红包活动信息
+
+ if not ipyData:
+ return
+
+ openServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerDay) + 1
+ feastPack = ChPyNetSendPack.tagGCFeastRedPacketInfo()
+ feastPack.StartDate = GameWorld.GetOperationActionDateStr(ipyData.GetStartDate(), openServerDay)
+ feastPack.EndtDate = GameWorld.GetOperationActionDateStr(ipyData.GetEndDate(), openServerDay)
+ feastPack.LimitLV = ipyData.GetLVLimit()
+ feastPack.ResetType = ipyData.GetResetType()
+ feastPack.RedPacketDayList = []
+ for redPacketIDList in ipyData.GetRedPacketIDList():
+ dayInfo = ChPyNetSendPack.tagGCFeastRedPacketDay()
+ dayInfo.RedPacketIDList = redPacketIDList
+ dayInfo.RedPacketCount = len(dayInfo.RedPacketIDList)
+ feastPack.RedPacketDayList.append(dayInfo)
+ feastPack.RedPacketDays = len(feastPack.RedPacketDayList)
+
+ if not curPlayer:
+ # 全服广播在线玩家
+ playerManager = GameWorld.GetPlayerManager()
+ for i in xrange(playerManager.GetActivePlayerCount()):
+ curPlayer = playerManager.GetActivePlayerAt(i)
+ if curPlayer == None or not curPlayer.GetInitOK():
+ continue
+ NetPackCommon.SendFakePack(curPlayer, feastPack)
+ else:
+ NetPackCommon.SendFakePack(curPlayer, feastPack)
+ return
+
+##--------------------------------------------------------------------------------------------------
+
+def CreateSystemRedPacket(redPackID):
+ ## 发放系统红包
+ ipyData = IpyGameDataPY.GetIpyGameData('FamilyRedPack', redPackID)
+ if not ipyData:
+ return
+ getType = ipyData.GetGetType()
+ moneyType = ipyData.GetMoneyType()
+ outputNum = ipyData.GetMoneyNum()
+ packetCnt = ipyData.GetPacketCnt()
+ openTime = ipyData.GetPacketOpenTime() # 如果有指定发放时间的
+ sysCreateTime = GameWorld.ChangeTimeStrToNum("%s:00" % openTime) if openTime else None
+
+ state = State_NoGot # 暂直接设定已发放
+ if ipyData.GetPacketOpenTime():
+ PlayerDBGSEvent.SetDBGSTrig_ByKey(DBKey_RedPacketSend % redPackID, 1)
+ GameWorld.DebugLog("定时发放的红包,设置已发放! redPackID=%s" % redPackID)
+
+ job = 0
+ jobRank = 0
+ playerName = ""
+ playerID = 0
+ familyID = 0
+ family = None
+
+ redPacketRecData = __SaveNewRedRecord(familyID, playerID, playerName, job, jobRank, getType, moneyType, outputNum, packetCnt, state, sysCreateTime=sysCreateTime)
+ #通知
+ __NotifyFamilyRedPacketInfo(family, redPacketRecData, [])
+ return
## 生成新红包
-def CreatFamilyRedPacket(msgList):
- playerID, getType, packetCnt, moneyType, outputNum, wishStr, state, data = msgList
+def MapServer_CreatRedPacket(msgList):
+ playerID, getType, packetCnt, moneyType, outputNum, wishStr, state, data, isFamilyRedPacket = msgList
curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID)
if not curPlayer:
return
- if getType == IpyGameDataPY.GetFuncCfg('OpenServerRedPacketType'):
+ if not isFamilyRedPacket:
familyID = 0
family = None
else:
@@ -113,7 +265,10 @@
elif data in IpyGameDataPY.GetFuncEvalCfg('OSRSuccess'):
PlayerControl.WorldNotify(0, 'OpenRedBag3', [playerName, data, outputNum])
#大于200额度的红包
- if outputNum >= IpyGameDataPY.GetFuncCfg('OpenServerRedPacketRain'):
+ getTypeRainDict = IpyGameDataPY.GetFuncEvalCfg('OpenServerRedPacketRain', 2, {})
+ if str(getType) in getTypeRainDict:
+ PlayerControl.WorldNotify(0, getTypeRainDict[str(getType)])
+ elif outputNum >= IpyGameDataPY.GetFuncCfg('OpenServerRedPacketRain'):
PlayerControl.WorldNotify(0, 'OSRedpackSfx')
return
@@ -144,19 +299,21 @@
return
## 记录新红包数据
-def __SaveNewRedRecord(familyID, ownerid, playerName, job, jobRank, getType, moneyType, outputNum, packetCnt,state=State_NoSend, wishStr=''):
+def __SaveNewRedRecord(familyID, ownerid, playerName, job, jobRank, getType, moneyType, outputNum, packetCnt,state=State_NoSend, wishStr='', sysCreateTime=None):
global g_allRecordDict
- global g_osRedCnt
+ global g_redPackCountDict
job = job + jobRank * 10 #个位是job 十位百位是jobrank
recordType = ShareDefine.Def_UniversalGameRecType_FamilyRedPacketAllRecord
universalRecMgr = GameWorld.GetUniversalRecMgr()
recordList = universalRecMgr.GetTypeList(recordType)
- if getType == IpyGameDataPY.GetFuncCfg('OpenServerRedPacketType'):
- if not __CheckOSRedPacketCnt(recordList):
- return
- if g_osRedCnt:
- g_osRedCnt += 1
-
+ for maxCountKeyNum, getTypeList in ShareDefine.RedPackMaxCountDict.items():
+ if getType in getTypeList:
+ if not __CheckOSRedPacketCnt(recordList, maxCountKeyNum, getTypeList):
+ return
+ g_redPackCountDict[maxCountKeyNum] = g_redPackCountDict.get(maxCountKeyNum, 0) + 1
+ GameWorld.DebugLog("当前红包数: g_redPackCountDict=%s" % g_redPackCountDict)
+ break
+
recData = recordList.AddRec()
@@ -169,29 +326,29 @@
PlayerDBGSEvent.SetDBGSTrig_ByKey(DB_RedPacketID, redPacketID)
curTimeNum = int(time.time())
- recData.SetTime(curTimeNum)
+ recData.SetTime(sysCreateTime if sysCreateTime else curTimeNum) # 为方便前端对比配表设置的发放红包时间,如果有配置的时间,则创建时间默认取配表的
recData.SetValue1(redPacketID) #红包唯一ID
recData.SetValue2(familyID) #家族ID
recData.SetValue3(moneyType + outputNum * 10) #总额度*10+金钱类型
recData.SetValue4(state) #是否已发
- recData.SetValue5(curTimeNum)
+ recData.SetValue5(curTimeNum) #该时间为开放领取的时间,不一定等于创建时间
recData.SetStrValue1('%s|%s|%s|%s'%(ownerid,playerName,job,getType)) #创建者ID|创建者名字|创建者职业|途径
recData.SetStrValue2(str(packetCnt))#可抢总个数
recData.SetStrValue3(wishStr)#祝福语
g_allRecordDict[redPacketID] = recData
- GameWorld.Log(" 生成新的红包familyID=%s, redPacketID =%s!ownerid=%s, ownername=%s,getType=%s,moneyType=%s,outputNum=%s,packetCnt=%s" % (familyID, redPacketID, ownerid, playerName, getType, moneyType, outputNum, packetCnt))
+ GameWorld.Log("生成新的红包: familyID=%s,redPacketID=%s,ownerid=%s,ownername=%s,getType=%s,moneyType=%s,outputNum=%s,packetCnt=%s" % (familyID, redPacketID, ownerid, playerName, getType, moneyType, outputNum, packetCnt))
return recData
-def __CheckOSRedPacketCnt(recordList):
+def __CheckOSRedPacketCnt(recordList, maxCountKeyNum, getTypeList):
global g_grabDataDict
global g_allRecordDict
- global g_osRedCnt
+ global g_redPackCountDict
##开服红包个数是否达上限
- openServerRedPacketCnt = IpyGameDataPY.GetFuncCfg('OpenServerRedPacketCnt')
- if g_osRedCnt and g_osRedCnt < openServerRedPacketCnt + 10:
+ curRedCnt = g_redPackCountDict.get(maxCountKeyNum, 0)
+ openServerRedPacketCnt = IpyGameDataPY.GetFuncCfg('OpenServerRedPacketCnt', 1) # 直接用开服红包这个配置作为通用配置
+ if curRedCnt and curRedCnt < openServerRedPacketCnt + 10:
return True
- OpenServerRedPacketType = IpyGameDataPY.GetFuncCfg('OpenServerRedPacketType')
allCnt = recordList.Count()
curCnt = 0
@@ -201,20 +358,20 @@
strValue1 = universalRecData.GetStrValue1()
strValue1List = strValue1.split('|')
getWay = int(strValue1List[3])
- if getWay != OpenServerRedPacketType:
+ if getWay not in getTypeList:
continue
redPacketID = universalRecData.GetValue1()
curCnt += 1
if len(delRedPacketIDList) < 10:
delRedPacketIDList.append(redPacketID)
- elif g_osRedCnt:
+ elif curRedCnt:
break
if not delRedPacketIDList:
return True
- if not g_osRedCnt:
- g_osRedCnt = curCnt
+ if not curRedCnt:
+ curRedCnt = curCnt
- if g_osRedCnt < openServerRedPacketCnt + 10:
+ if curRedCnt < openServerRedPacketCnt + 10:
return True
delCnt = 0
@@ -227,7 +384,7 @@
delCnt +=1
g_grabDataDict.pop(delRedPacketID, 0)
g_allRecordDict.pop(delRedPacketID, 0)
- g_osRedCnt -= delCnt
+ curRedCnt -= delCnt
recordType = ShareDefine.Def_UniversalGameRecType_FamilyRedPacketGrabRecord
@@ -276,7 +433,7 @@
def SendFamilyRedPacket(msgList):
- '''发系统赠送的红包'''
+ '''发系统赠送的红包,该红包已存在,只是状态未发放,由归属玩家自由选择发放时机'''
playerID, redPacketID, packetCnt = msgList
curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID)
if not curPlayer:
@@ -326,7 +483,7 @@
## 抢红包
def DoGrabFamilyRedPacket(curPlayer, msgList):
global g_grabDataDict
- redPacketID, OSCanGrabCnt = msgList
+ redPacketID, reqGetWay, canGrabCnt = msgList
playerID= curPlayer.GetPlayerID()
job = curPlayer.GetJob()
@@ -374,15 +531,19 @@
getWay = int(strValue1List[3])
owerID = int(strValue1List[0])
isSelf = owerID == playerID
- if getWay == IpyGameDataPY.GetFuncCfg('OpenServerRedPacketType'):
- #开服红包需要判断次数
- if not isSelf and OSCanGrabCnt <= 0:
- GameWorld.DebugLog(' 抢开服红包,次数不足!!')
- return
+ if not isSelf and canGrabCnt != -1 and canGrabCnt <= 0:
+ GameWorld.DebugLog(' 抢开服红包,次数不足!!')
+ return
+ if reqGetWay != getWay:
+ GameWorld.ErrLog("领取的红包类型不一致,无法领取! reqGetWay=%s,getWay=%s" % (reqGetWay, getWay))
+ return
+ if getWay == ShareDefine.RedPackType_OpenServer:
getNumformula = IpyGameDataPY.GetFuncCompileCfg('OpenRedRacketOutNum')
+ elif getWay in ShareDefine.FeastRedPackType:
+ getNumformula = IpyGameDataPY.GetFuncCompileCfg('FeastRedPacket', 2)
else:
getNumformula = IpyGameDataPY.GetFuncCompileCfg('FamilyRedRacketOutNum')
-
+
getMoney = eval(getNumformula) if remainPacketCnt > 1 else remainNum
GameWorld.DebugLog(" 该玩家抢到红包=%s!"%getMoney, playerID)
grabRecordDict[playerID] = [getMoney, playerName, job]
@@ -451,8 +612,8 @@
def __CheckGrabRecData():
global g_grabDataDict
global g_allRecordDict
- global g_osRedCnt
- g_osRedCnt = 0
+ global g_redPackCountDict
+ g_redPackCountDict = {}
universalRecMgr = GameWorld.GetUniversalRecMgr()
allRecordList = universalRecMgr.GetTypeList(ShareDefine.Def_UniversalGameRecType_FamilyRedPacketAllRecord)
allCnt = allRecordList.Count()
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py
index d72f77f..bac4ef9 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py
@@ -748,8 +748,8 @@
return
#生成仙盟红包
- if callName == 'CreatFamilyRedPacket':
- PlayerFamilyRedPacket.CreatFamilyRedPacket(eval(resultName))
+ if callName == "MapServer_CreatRedPacket":
+ PlayerFamilyRedPacket.MapServer_CreatRedPacket(eval(resultName))
return
#发仙盟红包
if callName == 'SendFamilyRedPacket':
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_PlayerBuyZhenQi.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_PlayerBuyZhenQi.py
index 248ab4f..e5290a0 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_PlayerBuyZhenQi.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_PlayerBuyZhenQi.py
@@ -163,6 +163,8 @@
return
#成就
PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_Pray, 1, [buyType])
+ PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_FeastRedPack_Pray, 1)
+
# 每日活动
PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_Pray)
PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_Pray, 1)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/QuestRunner.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/QuestRunner.py
index fd8f148..fe8a47b 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/QuestRunner.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/QuestRunner.py
@@ -5239,6 +5239,7 @@
GameWorld.Log(' 跑环完成触发活跃度 missionType=%s'%missionType, curPlayer.GetPlayerID())
if missionType == QuestCommon.Def_Mission_Type_RunDaily:
PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_DailyRunMission, addCnt)
+ PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_FeastRedPack_TaskCRun, addCnt)
PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_TaskCRun, addCnt)
PlayerBossReborn.AddBossRebornActionCnt(curPlayer, ChConfig.Def_BRAct_RunTask, addCnt)
PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_RunTask, addCnt)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetRedPacket.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetRedPacket.py
new file mode 100644
index 0000000..b93b483
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetRedPacket.py
@@ -0,0 +1,91 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package GM.Commands.SetRedPacket
+#
+# @todo:设置红包
+# @author hxp
+# @date 2019-01-29
+# @version 1.0
+#
+# 详细描述: 设置红包
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2019-01-29 16:00"""
+#-------------------------------------------------------------------------------
+
+import GameWorld
+import PlayerControl
+import ChConfig
+import PlayerFamilyRedPacket
+import IpyGameDataPY
+import PlayerSuccess
+
+## GM命令执行入口
+# @param curPlayer 当前玩家
+# @param paramList 参数列表
+# @return None or True
+# @remarks 函数详细说明.
+def OnExec(curPlayer, paramList):
+ if not paramList:
+ GameWorld.DebugAnswer(curPlayer, "重置红包:SetRedPacket 0")
+ GameWorld.DebugAnswer(curPlayer, "SetRedPacket 红包功能 可抢个数 已抢额度")
+ GameWorld.DebugAnswer(curPlayer, "红包功能: 1-开服红包;2-节日红包")
+ return
+
+ # 重置所有红包数据
+ if len(paramList) == 1 and paramList[0] == 0:
+ __DOResetSuccRedPack(curPlayer)
+ __DoResetRedPackFunc(curPlayer, 1, None, 0)
+ __DoResetRedPackFunc(curPlayer, 2, None, 0)
+ curPlayer.GameServer_GMCmd("SetRedPacket 0") # 发送到GameServer清除红包
+ return
+
+ if len(paramList) == 3:
+ redPackFuncType, grabCount, grabMoney = paramList
+ __DoResetRedPackFunc(curPlayer, redPackFuncType, grabCount, grabMoney)
+ return
+
+ return
+
+def __DOResetSuccRedPack(curPlayer):
+ ## 重置红包成就发放记录,不重置进度
+ resetList = []
+ ipyDataMgr = IpyGameDataPY.IPY_Data()
+ for index in xrange(ipyDataMgr.GetSuccessCount()):
+ succData = ipyDataMgr.GetSuccessByIndex(index)
+ succID = succData.ID
+ succType = succData.Type
+ condition = succData.Condition
+ if not succData.RedPacketID:
+ continue
+ if not PlayerSuccess.GetSuccFinishValue(curPlayer, succType, condition):
+ continue
+ #SetSuccFinishValue(curPlayer, succType, condition, 0)
+ if PlayerSuccess.GetSuccHasGot(curPlayer, succID):
+ PlayerSuccess.SetSuccFinish(curPlayer, succID, True)
+ PlayerSuccess.SetSuccHasGot(curPlayer, succID, False)
+ resetList.append(succID)
+
+ if resetList:
+ PlayerSuccess.Sync_SuccTypeIndexAwardRecord(curPlayer, resetList, True)
+ PlayerSuccess.Sync_SuccessInfo(curPlayer, resetList, True)
+
+ return
+
+def __DoResetRedPackFunc(curPlayer, redPackFuncType, grabCount, grabMoney):
+ if redPackFuncType == 1:
+ if not isinstance(grabCount, int):
+ grabCount = IpyGameDataPY.GetFuncCfg('OpenServerRedPacketCfg', 5)
+ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OSRedPacketCanGrabCnt, grabCount)
+ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OSRedPacketGrabMoney, grabMoney)
+ PlayerFamilyRedPacket.NotifyOSRedPacket(curPlayer)
+ elif redPackFuncType == 2:
+ if not isinstance(grabCount, int):
+ grabCount = IpyGameDataPY.GetFuncCfg('FeastRedPacket', 1)
+ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OSRedPacketCanGrabCnt, grabCount)
+ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OSRedPacketGrabMoney, grabMoney)
+ return
+
+
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBLogic.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBLogic.py
index 47c47c3..455d613 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBLogic.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBLogic.py
@@ -18,6 +18,7 @@
import IPY_GameWorld
import PlayerControl
import GameWorldProcess
+import PlayerSuccess
import ReadChConfig
import ShareDefine
import FBCommon
@@ -522,6 +523,8 @@
#注册进入这个副本的玩家
gameFBMgr.AddFBPlayer(curPlayerID)
+
+ PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_FeastRedPack_EnterMap, 1, [gameMapID])
return
def DoEnterFB(curPlayer, tick):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
index 206b900..fb39eda 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
@@ -2153,6 +2153,7 @@
dataDict = {"objID":npcID, "bossID":npcID, "touchCnt":newCnt,
"AccID":curPlayer.GetAccID(), "PlayerID":curPlayer.GetPlayerID()}
DataRecordPack.SendEventPack("AddKillBossCnt", dataDict, curPlayer)
+ PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_FeastRedPack_KillBoss, 1, [limitIndex])
if isCrossServer:
return
@@ -5038,6 +5039,7 @@
else:
if curNPC.GetLV()>=curPlayer.GetLV() - IpyGameDataPY.GetFuncCfg('DailyQuestKillMonster'):
PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_KillNPC)
+ PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_FeastRedPack_KillSpecificNPC, 1, [npcID])
if ChConfig.IsGameBoss(curNPC):
OnPlayerKillBoss(curPlayer, npcID, mapID, False)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
index 44ae1ea..10416bf 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -104,6 +104,7 @@
import PlayerSpringSale
import PlayerFairyCeremony
import PlayerNewFairyCeremony
+import PlayerFeastRedPacket
import CrossRealmPlayer
import ChNetSendPack
import FamilyRobBoss
@@ -682,6 +683,7 @@
PlayerRune.PlayerRuneLogin(curPlayer)
# 仙盟红包登录通知
PlayerFamilyRedPacket.OnPlayerLogin(curPlayer)
+ PlayerFeastRedPacket.DoPlayerOnLogin(curPlayer)
# 法宝登录通知
PlayerMagicWeapon.PlayerMagicWeaponLogin(curPlayer)
# 商店物品购买次数登录通知
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCrossRealmPK.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCrossRealmPK.py
index 226837f..eae412f 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCrossRealmPK.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCrossRealmPK.py
@@ -27,6 +27,7 @@
import PlayerWeekParty
import IPY_GameWorld
import ItemControler
+import PlayerSuccess
import ItemCommon
import GameWorld
import ChConfig
@@ -314,6 +315,7 @@
GameWorld.Log(" 增加今日已获胜次数: todayWinCount=%s" % todayWinCount, playerID)
PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_CrossReamPK)
PlayerWeekParty.AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_CrossPK, 1)
+ PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_FeastRedPack_CrossPK, 1)
else:
GameWorld.Log(" 不同天的PK结算不增加今日PK次数! ", playerID)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerDiceEx.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerDiceEx.py
index ea7febe..643d7c1 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerDiceEx.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerDiceEx.py
@@ -13,7 +13,8 @@
#
# 详细描述: 我要太极
#---------------------------------------------------------------------
-"""Version = 2016-09-26 20:00"""
+#"""Version = 2016-09-26 20:00"""
+#---------------------------------------------------------------------
import GameWorld
import IPY_GameWorld
@@ -25,6 +26,7 @@
import ChConfig
import IpyGameDataPY
import PlayerActivity
+import PlayerSuccess
import ItemCommon
@@ -70,6 +72,7 @@
return
if not __DoDicelogic(curPlayer):
return
+ PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_FeastRedPack_Dice, 1)
elif diceType == 1:
if not diceResult:
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
index aee1e7a..a13bec7 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
@@ -85,6 +85,7 @@
import PlayerFlashGiftbag
import PlayerFairyCeremony
import PlayerNewFairyCeremony
+import PlayerFeastRedPacket
import PlayerRefineStove
import PlayerFlashSale
import PlayerWishingWell
@@ -1316,7 +1317,10 @@
elif actionName == ShareDefine.OperationActionName_FeastWeekParty:
PlayerFeastWeekParty.RefreshOperationAction_FeastWeekParty()
-
+
+ elif actionName == ShareDefine.OperationActionName_FeastRedPacket:
+ PlayerFeastRedPacket.RefreshOperationAction_FeastRedPacket()
+
return
if msgValue.isdigit():
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFB.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFB.py
index a287676..acf9183 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFB.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFB.py
@@ -32,6 +32,7 @@
import FBLogic
import ChPyNetSendPack
import NetPackCommon
+import PlayerSuccess
import ItemCommon
import IpyGameDataPY
import ShareDefine
@@ -332,6 +333,8 @@
if not FBLogic.OnPlayerFBSweepAsk(curPlayer, mapID, lineID, cnt, isFinish, dataEx):
return
+ PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_FeastRedPack_FBSweep, 1, [mapID])
+
#扣除扫荡道具
if sweepCostindexList and sweepCostCnt:
ItemCommon.ReduceItem(curPlayer, itemPack, sweepCostindexList, sweepCostCnt, False, 'FBSweepCostItem')
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 a608139..db0a347 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,13 @@
import IpyGameDataPY
import IPY_GameWorld
import ChPyNetSendPack
+import PlayerFeastRedPacket
import NetPackCommon
import PlayerVip
import ShareDefine
import time
#---------------------------------------------------------------------
-
-Def_GoldPacket = 0 #主动发钻石红包
-
(
State_NoSend, #未发
@@ -73,36 +71,47 @@
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
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:
@@ -126,9 +135,9 @@
# 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
@@ -155,8 +164,9 @@
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])
GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, "SendFamilyRedPacket", msg, len(msg))
return
@@ -187,21 +197,27 @@
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)
+ 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(' 抢红包 getWay=%s,canGrabCnt=%s' % (reqGetWay, canGrabCnt))
return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFeastRedPacket.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFeastRedPacket.py
new file mode 100644
index 0000000..1da576a
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFeastRedPacket.py
@@ -0,0 +1,157 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package Player.PlayerFeastRedPacket
+#
+# @todo:节日红包
+# @author hxp
+# @date 2019-01-29
+# @version 1.0
+#
+# 详细描述: 节日红包
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2019-01-29 16:00"""
+#-------------------------------------------------------------------------------
+
+import GameWorld
+import PyGameData
+import PlayerControl
+import IpyGameDataPY
+import PlayerSuccess
+import ChPyNetSendPack
+import NetPackCommon
+import ShareDefine
+import ChConfig
+
+def DoPlayerOnLogin(curPlayer):
+ if not GetFeastRedPacketState():
+ return
+ isReset = __CheckPlayerFeastRedPacketAction(curPlayer)
+ if not isReset:
+ Sync_FeastRedPackInfo(curPlayer)
+ return
+
+def RefreshOperationAction_FeastRedPacket():
+ __UpdTodayFeastSuccIDList()
+
+ playerManager = GameWorld.GetPlayerManager()
+ for i in xrange(playerManager.OnlineCount()):
+ curPlayer = playerManager.OnlineAt(i)
+ if curPlayer == None or not curPlayer.GetInitOK():
+ continue
+ __CheckPlayerFeastRedPacketAction(curPlayer)
+
+ return
+
+def __UpdTodayFeastSuccIDList():
+ feastRedPacketInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FeastRedPacket, {})
+ state = feastRedPacketInfo.get(ShareDefine.ActKey_State, 0)
+ dayIndex = feastRedPacketInfo.get(ShareDefine.ActKey_DayIndex, 0)
+ if not state:
+ return
+
+ feastDay = dayIndex + 1
+ feastIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActFeastRedPacketSucc", feastDay)
+ if not feastIpyDataList:
+ return
+
+ succIDList = []
+ for feastIpyData in feastIpyDataList:
+ succIDList += list(feastIpyData.GetFeastSuccIDList())
+
+ GameWorld.DebugLog(" 更新今日节日红包成就ID列表: %s" % succIDList)
+ IpyGameDataPY.SetConfigEx("TodayFeastSuccIDList", succIDList)
+ return
+def GetTodayFeastSuccIDList(): return IpyGameDataPY.GetConfigEx("TodayFeastSuccIDList")
+
+def __CheckPlayerFeastRedPacketAction(curPlayer):
+ ## 检查玩家节日红包活动数据信息
+
+ playerID = curPlayer.GetPlayerID()
+
+ feastRedPacketInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FeastRedPacket, {})
+ curActID = feastRedPacketInfo.get(ShareDefine.ActKey_ID, 0)
+ state = feastRedPacketInfo.get(ShareDefine.ActKey_State, 0)
+ dayIndex = feastRedPacketInfo.get(ShareDefine.ActKey_DayIndex, 0)
+
+ playerActID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastRedPacketActID) # 玩家身上的活动ID
+
+ # 活动ID 相同的话不处理
+ if curActID == playerActID:
+ GameWorld.DebugLog("红包节日活动ID不变,不处理!", playerID)
+ return
+ GameWorld.DebugLog("重置玩家红包节日活动! curActID=%s,playerActID=%s,state=%s,dayIndex=%s" % (curActID, playerActID, state, dayIndex), playerID)
+
+ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastRedPacketActID, curActID)
+ dayCanGrabCount = IpyGameDataPY.GetFuncCfg('FeastRedPacket', 1)
+ # 非第一天只重置每日次数,且次数可以累加
+ if dayIndex == 0:
+ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastRedPacketGrabMoney, 0)
+ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastRedPacketCanGrabCnt, dayCanGrabCount)
+ GameWorld.DebugLog(" 首日重置次数及金额!", playerID)
+ else:
+ remainGrabCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastRedPacketCanGrabCnt)
+ setTotalCanGrabCnt = remainGrabCnt + dayCanGrabCount
+ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastRedPacketCanGrabCnt, setTotalCanGrabCnt)
+ GameWorld.DebugLog(" 非首日重置次数! remainGrabCnt=%s,setTotalCanGrabCnt=%s" % (remainGrabCnt, setTotalCanGrabCnt), playerID)
+
+ # 重置相关成就
+ resetSuccIDList = []
+ ipyDataMgr = IpyGameDataPY.IPY_Data()
+ for index in xrange(ipyDataMgr.GetActFeastRedPacketSuccCount()):
+ ipyData = ipyDataMgr.GetActFeastRedPacketSuccByIndex(index)
+ feastDay = ipyData.GetFeastDay()
+ feastDayIndex = feastDay - 1
+ if feastDayIndex == 0 or feastDayIndex == dayIndex:
+ for succID in ipyData.GetFeastSuccIDList():
+ if succID not in resetSuccIDList:
+ resetSuccIDList.append(succID)
+ PlayerSuccess.DoResetSuccessIDList(curPlayer, resetSuccIDList)
+
+ Sync_FeastRedPackInfo(curPlayer)
+ return True
+
+def GetFeastRedPacketState():
+ ## 节日红包活动状态
+ feastRedPacketInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FeastRedPacket, {})
+ return feastRedPacketInfo.get(ShareDefine.ActKey_State, 0)
+
+def GetFeastSuccRedPacketCanGrabCnt(curPlayer):
+ ## 节日成就红包可领取次数
+ return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastRedPacketCanGrabCnt)
+
+def GrabFeastRedPacketResult(curPlayer, moneyNum, getWay, isSelf):
+ ##抢节日红包结果
+ grabNum = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastRedPacketGrabMoney)
+ newGrabNum = grabNum + moneyNum
+ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastRedPacketGrabMoney, newGrabNum)
+
+ #广播
+ needSysOSRAllMoneyList = IpyGameDataPY.GetFuncEvalCfg('FeastRedPacket', 3)
+ lastIndex = -1
+ newIndex = -1
+ for i, num in enumerate(needSysOSRAllMoneyList):
+ if grabNum >= num:
+ lastIndex = i
+ if newGrabNum >= num:
+ newIndex = i
+ if newIndex != -1 and newIndex > lastIndex:
+ PlayerControl.WorldNotify(0, 'ActivityOpenRedBag1', [curPlayer.GetName(), newGrabNum])
+
+ if not isSelf and getWay == ShareDefine.RedPackType_FeastSucc: #抢自己的红包不扣次数
+ grabCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastRedPacketCanGrabCnt)
+ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastRedPacketCanGrabCnt, max(0, grabCnt - 1))
+
+ Sync_FeastRedPackInfo(curPlayer)
+ return
+
+def Sync_FeastRedPackInfo(curPlayer):
+ #// AB 25 节日红包信息 #tagMCFeastRedPackInfo
+ pack = ChPyNetSendPack.tagMCFeastRedPackInfo()
+ pack.MoneyNum = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastRedPacketGrabMoney)
+ pack.GrabCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastRedPacketCanGrabCnt)
+ NetPackCommon.SendFakePack(curPlayer, pack)
+ return
+
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerSuccess.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerSuccess.py
index 0597d42..bb509e0 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerSuccess.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerSuccess.py
@@ -43,6 +43,7 @@
import Operate_EquipStone
import Operate_EquipWash
import Operate_EquipSuitCompose
+import PlayerFeastRedPacket
import PlayerDogz
import QuestCommon
import DataRecordPack
@@ -440,6 +441,29 @@
Sync_SuccessInfo(curPlayer, resetList, True)
return
+def DoResetSuccessIDList(curPlayer, resetSuccIDList):
+ ## 重置成就相关数据
+ if not resetSuccIDList:
+ return
+ resetList = []
+ for succID in resetSuccIDList:
+ succData = GetSuccDataMng().GetSuccessData(succID)
+ if not succData:
+ continue
+ succType = succData.succType
+ condition = succData.condition
+ if not GetSuccFinishValue(curPlayer, succType, condition):
+ continue
+ SetSuccFinishValue(curPlayer, succType, condition, 0)
+ SetSuccFinish(curPlayer, succID, False)
+ SetSuccHasGot(curPlayer, succID, False)
+ resetList.append(succID)
+ GameWorld.DebugLog(" 重置成就类型: succType=%s,succID=%s" % (succType, succID))
+ if resetList:
+ Sync_SuccTypeIndexAwardRecord(curPlayer, resetList, True)
+ Sync_SuccessInfo(curPlayer, resetList, True)
+ return
+
## 成就OnDay
# @param curPlayer
# @return
@@ -559,6 +583,9 @@
def UptateSuccessProgress(curPlayer, successType, newCnt, condition=[]):
if successType not in ShareDefine.SuccessTypeList:
return
+ if successType in ShareDefine.FeastRedPackSuccessTypeList:
+ if not PlayerFeastRedPacket.GetFeastRedPacketState():
+ return
succInfoList = GetSuccDataMng().GetSuccDataByType(successType)
if not succInfoList:
return
@@ -580,6 +607,11 @@
succID = succDataObj.succID
cond = succDataObj.condition
+ if successType in ShareDefine.FeastRedPackSuccessTypeList:
+ todayFeastSuccIDList = PlayerFeastRedPacket.GetTodayFeastSuccIDList()
+ if not todayFeastSuccIDList or succID not in todayFeastSuccIDList:
+ #GameWorld.DebugLog(" 非今日节日红包成就,不增加进度! succID=%s,todayFeastSuccIDList=%s" % (succID, todayFeastSuccIDList))
+ return
isUnDownCheck = successType in ShareDefine.UnDownCheckSuccessTypeList
isContain = successType in ShareDefine.ContainSuccessTypeList
# 已完成的不再检查
@@ -650,7 +682,14 @@
def DoAddSuccessProgress(curPlayer, successType, addCnt, condition=[], delayCalc=True):
#GameWorld.DebugLog("DoAddSuccessProgress type=%s,addCnt=%s,condition=%s"
# % (successType, addCnt, condition), curPlayer.GetPlayerID())
-
+ if GameWorld.IsCrossServer():
+ return
+
+ if successType in ShareDefine.FeastRedPackSuccessTypeList:
+ if not PlayerFeastRedPacket.GetFeastRedPacketState():
+ #GameWorld.DebugLog("非节日红包活动时间,不增加成就!successType=%s" % successType)
+ return
+
playerID = curPlayer.GetID()
if delayCalc and successType not in ShareDefine.NeedResetSuccessTypeList:
if playerID not in PyGameData.g_delaySuccessDict:
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTalk.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTalk.py
index a8b9ca5..b83e73d 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTalk.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTalk.py
@@ -105,7 +105,8 @@
extras = GetTalkExtraValue(curPlayer)
curPlayer.ChatGong(content, 0, extras)
#世界频道发言成就
- PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_TalkWorld, 1)
+ #PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_TalkWorld, 1)
+ PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_FeastRedPack_TalkWorld, 1)
return
## 国家频道(封包参数)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_GrabFamilyRedPacketResult.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_GrabFamilyRedPacketResult.py
index 82bde37..d6bffb9 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_GrabFamilyRedPacketResult.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_GrabFamilyRedPacketResult.py
@@ -17,8 +17,10 @@
import ChConfig
import PlayerControl
-import IpyGameDataPY
import PlayerFamilyRedPacket
+import PlayerFeastRedPacket
+import ShareDefine
+import GameWorld
#---------------------------------------------------------------------
@@ -44,12 +46,14 @@
# @return None
# @remarks 函数详细说明.
def DoResult(curPlayer, callFunName, funResult, tick):
- #GameWorld.DebugLog("GY_Query_GrabFamilyRedPacketResult funResult=%s" % funResult)
moneyType, moneyNum, getWay, isSelf = eval(funResult)
+ #GameWorld.DebugLog("GY_Query_GrabFamilyRedPacketResult moneyType=%s, moneyNum=%s, getWay=%s, isSelf=%s" % (moneyType, moneyNum, getWay, isSelf))
if moneyNum:
PlayerControl.GiveMoney(curPlayer, moneyType, moneyNum, ChConfig.Def_GiveMoney_RedPacket)
- if getWay == IpyGameDataPY.GetFuncCfg('OpenServerRedPacketType'):
+ if getWay == ShareDefine.RedPackType_OpenServer:
PlayerFamilyRedPacket.GrabOSRedPacketResult(curPlayer, moneyNum, isSelf)
+ elif getWay in ShareDefine.FeastRedPackType:
+ PlayerFeastRedPacket.GrabFeastRedPacketResult(curPlayer, moneyNum, getWay, isSelf)
return
--
Gitblit v1.8.0