| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #---------------------------------------------------------------------  | 
| #  | 
| #---------------------------------------------------------------------  | 
| ##@package PlayerFamilyRedPacket  | 
| # @todo: Íæ¼Ò¼Ò×åºì°ü  | 
| #  | 
| # @author: xdh  | 
| # @date 2017-08-31  | 
| # @version 1.0  | 
| #  | 
| #---------------------------------------------------------------------  | 
| #"""Version = 2017-08-31 16:00"""  | 
| #---------------------------------------------------------------------  | 
| import GameWorld  | 
| import PlayerControl  | 
| import ChConfig  | 
| import IpyGameDataPY  | 
| import IPY_GameWorld  | 
| import ChPyNetSendPack  | 
| import PlayerFeastRedPacket  | 
| import NetPackCommon  | 
| import PlayerVip  | 
| import ShareDefine  | 
| import CommFunc  | 
|   | 
| import time  | 
| #---------------------------------------------------------------------  | 
|   | 
| (  | 
| State_NoSend, #δ·¢  | 
| State_NoGot, #δÁìÈ¡  | 
| State_HasGot, #ÒÑÁìÈ¡  | 
| State_HasAllGot, #È«²¿ÁìÍê  | 
| ) = range(4)  | 
|   | 
|   | 
| ## Íæ¼ÒµÇ¼  | 
| def OnPlayerLogin(curPlayer):  | 
|     __NotifyGoldLimt(curPlayer)  | 
|     NotifyOSRedPacket(curPlayer)  | 
|     return  | 
|   | 
| ## OnDay´¦Àí  | 
| #  @param curPlayer  | 
| #  @return None  | 
| 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):  | 
|     #¼ÓÈëÏÉÃ˺󣬷¢·Å´ý·¢µÄºì°ü  | 
|     ipyMgr = IpyGameDataPY.IPY_Data()  | 
|     for i in xrange(ipyMgr.GetFamilyRedPackCount()):  | 
|         ipyData = ipyMgr.GetFamilyRedPackByIndex(i)  | 
|         redPacketID = ipyData.GetID()  | 
|         if GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_FamilyRedPacketCache, redPacketID):  | 
|             CreatRedPacketByID(curPlayer, redPacketID)  | 
|             GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_FamilyRedPacketCache, redPacketID, 0)  | 
|     return  | 
|   | 
|   | 
| def CreatRedPacketByID(curPlayer, redPacketID, state=State_NoSend, data=0, wishInfo=""):  | 
|     '''¸ù¾Ýºì°üIDÉú³Éºì°ü - Íⲿ¹¦Äܵ÷ÓÃ½Ó¿Ú  | 
|     '''  | 
|     ipyData = IpyGameDataPY.GetIpyGameData('FamilyRedPack', redPacketID)  | 
|     if not ipyData:  | 
|         return  | 
|     getType = ipyData.GetGetType()  | 
|     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  | 
|         isFamilyRedPacket = True  | 
|           | 
|     __DoCreatRedPacket(curPlayer, getType, ipyData.GetMoneyType(), ipyData.GetMoneyNum(), ipyData.GetPacketCnt(), state, wishInfo, data, isFamilyRedPacket)  | 
|     return  | 
|   | 
| ## Éú³Éºì°ü£¬×¢ÒâÍⲿ²»¿ÉÖ±½Óµ÷Óøú¯Êý  | 
| 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 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:  | 
|             GameWorld.DebugLog('    Ö÷¶¯·¢ÏÉÃË×êʯºì°ü£¬¶î¶ÈÒѳ¬%s,²»¿É·¢ËÍ£¡' % familyRedPacketGoldLimit, playerID)  | 
|             return  | 
|         if not PlayerControl.HaveMoney(curPlayer, ShareDefine.TYPE_Price_BourseMoney, awardNum):  | 
|             curBourseMoney = PlayerControl.GetMoney(curPlayer, ShareDefine.TYPE_Price_BourseMoney)  | 
|             GameWorld.Log(" ²»ÄÜ·¢×êʯºì°ü no enough bourse money! priceCount=%s,curBourseMoney=%s"   | 
|                               % (awardNum, curBourseMoney), playerID)  | 
|             return  | 
|         if not PlayerControl.PayMoney(curPlayer, moneyType, awardNum, ChConfig.Def_Cost_FamilyRedPacket):  | 
|             return  | 
|           | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyRedPacketGoldLimit, goldLimit + awardNum)  | 
|         #֪ͨ  | 
|         __NotifyGoldLimt(curPlayer)  | 
| #    else:  | 
| #        commonCntLimit = IpyGameDataPY.GetFuncCfg('FamilyRedPacketCnt')  | 
| #        if packetCnt < commonCntLimit:  | 
| #            GameWorld.DebugLog('    ·¢ÆÕͨÏÉÃ˺ì°ü£¬ÊýÁ¿²»ÄÜÉÙÓÚ%s£¡' % commonCntLimit, playerID)  | 
| #            return  | 
|           | 
|     #֪ͨGameserverÉú³Éºì°ü  | 
|     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  | 
| #  | 
| #struct     tagCMSendFamilyRedPacket  | 
| #{  | 
| #    tagHead        Head;  | 
| #    DWORD        RedPacketID;    // ºì°üID,ûÓз¢0  | 
| #    WORD        PacketCnt;    // ºì°üÊýÁ¿  | 
| #    WORD        MoneyNum;    //½ðÇ®ÊýÁ¿  | 
| #    char        Wish[33];        //×£¸£Óï  | 
| #    BYTE        IsAnonymous;    //ÊÇ·ñÄäÃû  | 
| #};  | 
| ## ·¢¼Ò×åºì°ü  | 
| def OnSendFamilyRedPacket(index, clientData, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     redPacketID = clientData.RedPacketID  | 
|     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  | 
|         __DoCreatRedPacket(curPlayer, ShareDefine.RedPackType_GoldPacket, IPY_GameWorld.TYPE_Price_Gold_Money, moneyNum, packetCnt, State_NoGot, wishInfo)  | 
|     else:  | 
|         # ×¢Ò⣺¸Ãº¯Êý·¢·ÅµÄÊÇÒÑ´´½¨µÄºì°ü£¬¸Ã²Ù×÷Ö»ÊǰѸúì°ü¿ª·Å¸øÍæ¼Ò¿ÉÇÀ  | 
|         msg = str([curPlayer.GetPlayerID(), redPacketID, packetCnt, isAnonymous])  | 
|         GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, "SendFamilyRedPacket", msg, len(msg))  | 
|     return  | 
|   | 
|   | 
|   | 
| ## Í¨ÖªÇÀºì°ü×êʯ¶î¶È  | 
| def __NotifyGoldLimt(curPlayer):  | 
|     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  | 
|   | 
| ## Í¨ÖªÇÀºì°ü´ÎÊý  | 
| def NotifyOSRedPacket(curPlayer):  | 
|     packData = ChPyNetSendPack.tagMCOpenServerRedPacketInfo()  | 
|     packData.Clear()  | 
|     packData.MoneyNum = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OSRedPacketGrabMoney, 0)  | 
|     packData.GrabCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OSRedPacketCanGrabCnt, 0)  | 
|     startTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OSRedPacketStartTime, 0)  | 
|     if not startTime:  | 
|         createRoleTime = curPlayer.GetCreateRoleTime()  | 
|         startTime = GameWorld.ChangeTimeStrToNum(createRoleTime)  | 
|     packData.StartTime = startTime  | 
|       | 
|     NetPackCommon.SendFakePack(curPlayer, packData)  | 
|     return  | 
|   | 
|   | 
| #// AB 12 ÇÀºì°ü #tagCMGrabFamilyRedPacket  | 
| #  | 
| #struct    tagCMGrabFamilyRedPacket  | 
| #{  | 
| #    tagHead        Head;  | 
| #    DWORD        RedPaketID;         // ºì°üID  | 
| #    BYTE        GetWay;            //»ñµÃ;¾¶  | 
| #};  | 
| def OnGrabFamilyRedPacket(index, clientData, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     redPacketID = clientData.RedPaketID  | 
|     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('    ÇÀºì°ü redPacketID=%s,getWay=%s,canGrabCnt=%s' % (redPacketID, reqGetWay, canGrabCnt))  | 
|     return  | 
|   | 
|   | 
| def GetOSCanGrabCnt(curPlayer):  | 
|     #»ñÈ¡¿ª·þºì°ü¿ÉÇÀ´ÎÊý  | 
| #    oscDay = IpyGameDataPY.GetFuncCfg('OpenServerRedPacketCfg')  | 
| #    openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay)  | 
| #    if openServerDay >= oscDay:  | 
| #        return 0  | 
|     #curGrabCnt =   | 
|     return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OSRedPacketCanGrabCnt, 0)  | 
| #    createRoleTime = curPlayer.GetCreateRoleTime()  | 
| #    createRoleTimeNum = GameWorld.ChangeTimeStrToNum(createRoleTime)  | 
| #    curTime = int(time.time())  | 
| #    rangeTime = IpyGameDataPY.GetFuncCfg('OpenServerRedPacketCfg', 3)  | 
| #    initCnt = IpyGameDataPY.GetFuncCfg('OpenServerRedPacketCfg', 2)  | 
| #    return (curTime - createRoleTimeNum)/rangeTime + initCnt - curGrabCnt  | 
|       | 
| def GrabOSRedPacketResult(curPlayer, moneyNum, isSelf):  | 
|     ##ÇÀ¿ª·þºì°ü½á¹û  | 
|     grabNum = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OSRedPacketGrabMoney, 0)  | 
|     newGrabNum = grabNum+moneyNum  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OSRedPacketGrabMoney, newGrabNum)  | 
|     #¹ã²¥  | 
|     needSysOSRAllMoneyList = IpyGameDataPY.GetFuncEvalCfg('OSRAllMoneySys')  | 
|     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, 'OpenRedBag1', [curPlayer.GetName(), newGrabNum])  | 
|       | 
|     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()))  | 
|       | 
|       | 
|     #֪ͨ  | 
|     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  | 
|     oscDay = IpyGameDataPY.GetFuncCfg('OpenServerRedPacketCfg')  | 
|     openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay)  | 
|     if openServerDay >= oscDay:  | 
|         return  | 
|     grabCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OSRedPacketCanGrabCnt, 0)  | 
|     limitCnt = IpyGameDataPY.GetFuncCfg('OpenServerRedPacketCfg', 4)  | 
|     if grabCnt >= limitCnt:  | 
|         return  | 
|     startTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OSRedPacketStartTime, 0)  | 
|     if not startTime:  | 
|         newCnt = IpyGameDataPY.GetFuncCfg('OpenServerRedPacketCfg', 2)  | 
|         createRoleTime = curPlayer.GetCreateRoleTime()  | 
|         curTime = GameWorld.ChangeTimeStrToNum(createRoleTime)  | 
|     else:  | 
|         curTime = int(time.time())  | 
|         passTime = curTime - startTime  | 
|         rangeTime = IpyGameDataPY.GetFuncCfg('OpenServerRedPacketCfg', 3)  | 
|         addCnt = passTime / rangeTime  | 
|         if addCnt <= 0:#·ÀÖ¹²âÊÔµ÷ʱ¼äµ¼ÖÂÒì³£  | 
|             return  | 
|         newCnt = min(limitCnt, grabCnt+addCnt)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OSRedPacketCanGrabCnt, newCnt)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OSRedPacketStartTime, curTime)  | 
|     NotifyOSRedPacket(curPlayer)  | 
|     return |