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