hxp
2021-04-14 9ed7a50c30881fd97a44c9fef82e1e4d97fcdff8
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamilyRedPacket.py
@@ -45,7 +45,7 @@
#value4    ״̬
#value5    时间,用来判断是否过期删除的,实际开放该红包领取的时间
#strValue1 创建者ID|创建者名字|创建者职业|获得途径(红包类型)
#strValue2 可抢总个数
#strValue2 可抢总个数|是否匿名(默认不匿名兼容老数据)
#strValue3 祝福语,玩家自己编辑的内容
#Def_UniversalGameRecType_FamilyRedPacketGrabRecord
@@ -68,6 +68,7 @@
g_redPackCountDict = {} #有限制最大红包个数的类型对应当前红包数 {类型组对应记录编号:当前个数, ...}
DBKey_RedPacketSend = "RedPacketSend_%s" # 系统定时红包是否已发放, 参数红包ID
DBKey_RedPacketSystemDayCount = "RedPacketSystemDayCount" # 全服系统红包已发放个数
## 玩家登录
#  @param None
@@ -82,7 +83,8 @@
#  @return None
def DoOnDay():
    __CheckGrabRecData()
    PlayerDBGSEvent.SetDBGSTrig_ByKey(DBKey_RedPacketSystemDayCount, 0) # 重置每日全服系统红包发放个数
    RandTodayServerSystemRedPacketSendTime()
    return
##---------------------------------------- 节日红包 -----------------------------------------------
@@ -150,6 +152,8 @@
def OnRedPacketMinuteProcess():
    ## 每分钟处理,定时发放系统红包
    
    CheckSendServerSystemRedPacket()
    todayRedPacketByTimeList = __GetTodayRedPacketByTimeList()
    if not todayRedPacketByTimeList:
        return
@@ -203,6 +207,89 @@
    return
##--------------------------------------------------------------------------------------------------
##---------------------------------------- 全服系统红包  ---------------------------------------------
def RandTodayServerSystemRedPacketSendTime():
    ## 随机生成今日全服系统红包发放时间点
    sendTimeList = []
    sysRedPackketSendCountToday = PlayerDBGSEvent.GetDBGSTrig_ByKey(DBKey_RedPacketSystemDayCount)
    maxCount = IpyGameDataPY.GetFuncCfg("ServerSysRedPacket", 1)
    needSendCount = max(0, maxCount - sysRedPackketSendCountToday)
    GameWorld.Log("随机生成发放全服系统红包时间! maxCount=%s,sysRedPackketSendCountToday=%s,needSendCount=%s"
                  % (maxCount, sysRedPackketSendCountToday, needSendCount))
    if needSendCount > 0:
        startHour, endHour = IpyGameDataPY.GetFuncEvalCfg("ServerSysRedPacket", 3)
        serverTime = GameWorld.GetServerTime()
        year, month, day = serverTime.year, serverTime.month, serverTime.day
        startDateTime = datetime.datetime(year, month, day, startHour)
        if endHour == 0:
            endDateTime = datetime.datetime(year, month, day) + datetime.timedelta(days=1)
        else:
            endDateTime = datetime.datetime(year, month, day, endHour)
        totalSeconds = (endDateTime - startDateTime).seconds # 可处理的总秒数
        aveSeconds = totalSeconds / maxCount # 平均间隔
        GameWorld.Log("    startDateTime=%s" % startDateTime)
        GameWorld.Log("    endDateTime=%s" % endDateTime)
        GameWorld.Log("    totalSeconds=%s,aveSeconds=%s" % (totalSeconds, aveSeconds))
        nextStartDateTime = startDateTime
        for _ in xrange(maxCount):
            randSeconds = random.randint(60, aveSeconds - 60) # 前后扣掉1分钟,防止随机到同分钟
            randSendDateTime = nextStartDateTime + datetime.timedelta(seconds=randSeconds)
            if randSendDateTime > serverTime:
                sendTimeList.append(randSendDateTime)
            GameWorld.Log("    随机起始时间=%s,randSeconds=%s,随机发放时间=%s" % (nextStartDateTime, randSeconds, randSendDateTime))
            nextStartDateTime += datetime.timedelta(seconds=aveSeconds)
    GameWorld.Log("    sendTimeList=%s" % sendTimeList)
    IpyGameDataPY.SetConfigEx("ServerSystemRedPacketSendTime", sendTimeList)
    return sendTimeList
def CheckSendServerSystemRedPacket():
    ## 检查发送今日全服系统红包
    sendTimeList = IpyGameDataPY.GetConfigEx("ServerSystemRedPacketSendTime")
    if sendTimeList == None:
        sendTimeList = RandTodayServerSystemRedPacketSendTime()
    if not sendTimeList:
        #GameWorld.DebugLog("没有随机发放系统红包时间了!")
        return
    serverTime = GameWorld.GetServerTime()
    nextSendTime = sendTimeList[0]
    if serverTime.hour == nextSendTime.hour and serverTime.minute == nextSendTime.minute:
        sendTimeList.pop(0)
        randSysRedPacketList = IpyGameDataPY.GetFuncEvalCfg("ServerSysRedPacket", 2)
        redPackID = GameWorld.GetResultByRandomList(randSysRedPacketList)
        if not redPackID:
            return
        CreateSystemRedPacket(redPackID)
        sysRedPackketSendCountToday = PlayerDBGSEvent.GetDBGSTrig_ByKey(DBKey_RedPacketSystemDayCount) + 1
        PlayerDBGSEvent.SetDBGSTrig_ByKey(DBKey_RedPacketSystemDayCount, sysRedPackketSendCountToday)
        GameWorld.Log("发放全服系统红包: redPackID=%s, sysRedPackketSendCountToday=%s" % (redPackID, sysRedPackketSendCountToday))
        maxCount = IpyGameDataPY.GetFuncCfg("ServerSysRedPacket", 1)
        if sysRedPackketSendCountToday >= maxCount:
            IpyGameDataPY.SetConfigEx("ServerSystemRedPacketSendTime", [])
            GameWorld.Log("    今日全服系统红包已经全部发完了! maxCount=%s" % maxCount)
    elif nextSendTime < serverTime:
        sendTimeList.pop(0)
        #GameWorld.DebugLog("发放系统红包时间过期了!serverTime=%s, nextSendTime=%s" % (serverTime, nextSendTime))
    #else:
    #    GameWorld.DebugLog("非发放系统红包时间!serverTime=%s, nextSendTime=%s" % (serverTime, nextSendTime))
    return
##--------------------------------------------------------------------------------------------------
def CreateSystemRedPacket(redPackID):
    ## 发放系统红包
@@ -216,10 +303,14 @@
    openTime = ipyData.GetPacketOpenTime() # 如果有指定发放时间的
    sysCreateTime = GameWorld.ChangeTimeStrToNum("%s:00" % openTime) if openTime else None
    
    isAnonymous = 0
    state = State_NoGot # 暂直接设定已发放
    if ipyData.GetPacketOpenTime():
        PlayerDBGSEvent.SetDBGSTrig_ByKey(DBKey_RedPacketSend % redPackID, 1)
        GameWorld.DebugLog("定时发放的红包,设置已发放! redPackID=%s" % redPackID)
    if getType == ShareDefine.RedPackType_Server:
        isAnonymous = 1
        
    job = 0
    jobRank = 0
@@ -227,7 +318,7 @@
    playerID = 0
    family = None
    
    __SaveNewRedRecord(family, playerID, playerName, job, jobRank, getType, moneyType, outputNum, packetCnt, state, sysCreateTime=sysCreateTime)
    __SaveNewRedRecord(family, playerID, playerName, job, jobRank, getType, moneyType, outputNum, packetCnt, state, sysCreateTime=sysCreateTime, isAnonymous=isAnonymous)
    return
## 生成新红包
@@ -283,7 +374,7 @@
    return
## 记录新红包数据
def __SaveNewRedRecord(family, ownerid, playerName, job, jobRank, getType, moneyType, outputNum, packetCnt,state=State_NoSend, wishStr='', sysCreateTime=None, data=0):
def __SaveNewRedRecord(family, ownerid, playerName, job, jobRank, getType, moneyType, outputNum, packetCnt,state=State_NoSend, wishStr='', sysCreateTime=None, data=0, isAnonymous=0):
    global g_allRecordDict
    global g_redPackCountDict
    recordType = ShareDefine.Def_UniversalGameRecType_FamilyRedPacketAllRecord
@@ -317,7 +408,7 @@
    recData.SetValue4(state) #是否已发
    recData.SetValue5(curTimeNum) #该时间为开放领取的时间,不一定等于创建时间
    recData.SetStrValue1('%s|%s|%s|%s'%(ownerid,playerName,job,getType)) #创建者ID|创建者名字|创建者职业|途径
    recData.SetStrValue2(str(packetCnt))#可抢总个数
    recData.SetStrValue2('%s|%s' % (packetCnt, int(isAnonymous)))#可抢总个数|是否匿名
    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))
@@ -335,8 +426,9 @@
        #大于200额度的红包
        getTypeRainDict = IpyGameDataPY.GetFuncEvalCfg('OpenServerRedPacketRain', 2, {})
        if str(getType) in getTypeRainDict:
            PlayerControl.WorldNotify(0, getTypeRainDict[str(getType)])
        elif outputNum >= IpyGameDataPY.GetFuncCfg('OpenServerRedPacketRain'):
            PlayerControl.WorldNotify(0, getTypeRainDict[str(getType)])
        elif outputNum >= IpyGameDataPY.GetFuncCfg('OpenServerRedPacketRain') \
            and getType not in [ShareDefine.RedPackType_Server]:
            PlayerControl.WorldNotify(0, 'OSRedpackSfx', [getType])   
            
    return recData
@@ -436,7 +528,7 @@
def SendFamilyRedPacket(msgList):
    '''发系统赠送的红包,该红包已存在,只是状态未发放,由归属玩家自由选择发放时机'''
    playerID, redPacketID, packetCnt = msgList
    playerID, redPacketID, packetCnt, isAnonymous = msgList
    curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID)
    if not curPlayer:
        return
@@ -468,7 +560,7 @@
        return
    
    recData.SetValue4(State_NoGot)
    recData.SetStrValue2(str(packetCnt))
    recData.SetStrValue2('%s|%s' % (packetCnt, int(isAnonymous)))
    #更新时间
    curTimeNum = int(time.time())
    recData.SetValue5(curTimeNum)
@@ -511,7 +603,9 @@
    
    value3 = redPacketRecData.GetValue3()
    moneyType, totalMoney =value3%10, value3/10
    packetCnt = int(redPacketRecData.GetStrValue2())
    strValue2 = redPacketRecData.GetStrValue2()
    strValue2List = strValue2.split('|')
    packetCnt = int(strValue2List[0])
    
    #找该红包的抢信息
    grabRecordDict = __GetGrabRecord(redPacketID)
@@ -546,7 +640,7 @@
    if reqGetWay != getWay:
        GameWorld.ErrLog("领取的红包类型不一致,无法领取! reqGetWay=%s,getWay=%s" % (reqGetWay, getWay))
        return
    if getWay == ShareDefine.RedPackType_OpenServer:
    if getWay in [ShareDefine.RedPackType_OpenServer, ShareDefine.RedPackType_Server]:
        getNumformula = IpyGameDataPY.GetFuncCompileCfg('OpenRedRacketOutNum')
    elif getWay in ShareDefine.FeastRedPackType:
        getNumformula = IpyGameDataPY.GetFuncCompileCfg('FeastRedPacket', 2)
@@ -817,7 +911,10 @@
            #GameWorld.DebugLog("已抢或抢完的不发: RedPacketID=%s,state=%s" % (packetInfo.RedPacketID, state))
            continue
        packetInfo.State = state
        packetInfo.PacketCnt = int(packetData.GetStrValue2())
        strValue2 = packetData.GetStrValue2()
        strValue2List = strValue2.split('|')
        packetInfo.PacketCnt = int(strValue2List[0])
        packetInfo.IsAnonymous = int(strValue2List[1]) if len(strValue2List) > 1 else 0
        
        packetInfo.Wish = packetData.GetStrValue3()
        sendPack.RedPacketInfo.append(packetInfo)