| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| ##@package Player.CrossActCTGBillboard  | 
| #  | 
| # @todo:¿ç·þÔËÓª»î¶¯ - ³äÖµÅÅÐÐ  | 
| # @author hxp  | 
| # @date 2020-01-13  | 
| # @version 1.0  | 
| #  | 
| # ÏêϸÃèÊö: ¿ç·þÔËÓª»î¶¯ - ³äÖµÅÅÐÐ  | 
| #  | 
| #-------------------------------------------------------------------------------  | 
| #"""Version = 2020-01-13 17:00"""  | 
| #-------------------------------------------------------------------------------  | 
|   | 
| import ChConfig  | 
| import ShareDefine  | 
| import PlayerControl  | 
| import NetPackCommon  | 
| import PlayerBillboard  | 
| import CrossRealmPlayer  | 
| import ChPyNetSendPack  | 
| import ItemControler  | 
| import IPY_GameWorld  | 
| import IpyGameDataPY  | 
| import GameWorld  | 
| import CommFunc  | 
|   | 
| def OnPlayerLogin(curPlayer):  | 
|     isReset = __CheckPlayerCrossActCTGBillboard(curPlayer)  | 
|     if not isReset:  | 
|         actInfo = CrossRealmPlayer.GetPlayerCrossActInfo(curPlayer, ShareDefine.CrossActName_CTGBillboard)  | 
|         # »î¶¯ÖÐͬ²½»î¶¯ÐÅÏ¢  | 
|         if actInfo.get(ShareDefine.ActKey_State):  | 
|             Sync_CrossActCTGBillboardInfo(curPlayer)  | 
|             Sync_CrossActCTGBillboardPlayerInfo(curPlayer)  | 
|             UpdateCTGRMBCrossBillboard(curPlayer, actInfo)  | 
|     return  | 
|   | 
| def RefreshCrossActCTGBillboardInfo():  | 
|     ## ÊÕµ½GameServerͬ²½µÄ»î¶¯ÐÅÏ¢£¬Ë¢Ð»ÐÅÏ¢  | 
|     playerManager = GameWorld.GetPlayerManager()  | 
|     for index in xrange(playerManager.GetPlayerCount()):  | 
|         curPlayer = playerManager.GetPlayerByIndex(index)  | 
|         if curPlayer.GetID() == 0:  | 
|             continue  | 
|         __CheckPlayerCrossActCTGBillboard(curPlayer)  | 
|     return  | 
|   | 
| def __CheckPlayerCrossActCTGBillboard(curPlayer):  | 
|     ## ¼ì²éÍæ¼ÒÀۼƳäÖµ»î¶¯Êý¾ÝÐÅÏ¢  | 
|       | 
|     playerID = curPlayer.GetPlayerID()  | 
|       | 
|     actInfo = CrossRealmPlayer.GetPlayerCrossActInfo(curPlayer, ShareDefine.CrossActName_CTGBillboard)  | 
|     cfgID = actInfo.get(ShareDefine.ActKey_CfgID, 0)  | 
|     actID = actInfo.get(ShareDefine.ActKey_ID, 0)  | 
|     state = actInfo.get(ShareDefine.ActKey_State, 0)  | 
|     dayIndex = actInfo.get(ShareDefine.ActKey_DayIndex, 0)  | 
|     templateID = actInfo.get(ShareDefine.ActKey_TemplateID, 0)  | 
|       | 
|     playerActID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CA_CTGBillboardID) # Íæ¼ÒÉíÉϵĻID  | 
|     playerTemplateID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CA_CTGBillboardTemplateID)  | 
|       | 
|     # »î¶¯ID ÏàͬµÄ»°²»´¦Àí  | 
|     if actID == playerActID:  | 
|         GameWorld.DebugLog("¿ç·þ³äÖµÅÅÐлID²»±ä£¬²»´¦Àí£¡cfgID=%s,dayIndex=%s,templateID=%s" % (cfgID, dayIndex, templateID), playerID)  | 
|         if state:  | 
|             if playerTemplateID != templateID and templateID:  | 
|                 PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CA_CTGBillboardTemplateID, templateID)  | 
|                 GameWorld.DebugLog("    »î¶¯Ä£°åID±ä¸ü£¬¸üÐÂÍæ¼ÒÉíÉÏÄ£°åID¼Ç¼£¡playerTemplateID=%s,updTemplateID=%s"   | 
|                                    % (playerTemplateID, templateID), playerID)  | 
|                 Sync_CrossActCTGBillboardInfo(curPlayer)  | 
|                   | 
|         return  | 
|       | 
|     GameWorld.DebugLog("¿ç·þ³äÖµÅÅÐÐ»î¶¯ÖØÖÃ! cfgID=%s,actID=%s,playerActID=%s,state=%s" % (cfgID, actID, playerActID, state), playerID)  | 
|       | 
|     if not state:  | 
|         CrossRealmPlayer.NotifyCrossActEnd(curPlayer, ShareDefine.CrossActName_CTGBillboard)  | 
|           | 
|     if playerActID and playerTemplateID:  | 
|         __SendDabiaoAwardMail(curPlayer, playerTemplateID)  | 
|           | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CA_CTGBillboardID, actID)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CA_CTGBillboardTemplateID, templateID)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CA_CTGBillboardRMB, 0)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CA_CTGBillboardAward, 0)  | 
|       | 
|     Sync_CrossActCTGBillboardInfo(curPlayer)  | 
|     Sync_CrossActCTGBillboardPlayerInfo(curPlayer)  | 
|     return True  | 
|   | 
| def __SendDabiaoAwardMail(curPlayer, playerTemplateID):  | 
|     ## ²¹·¢Î´ÁìÈ¡µÄ´ï±ê½±Àø  | 
|       | 
|     totalRMB = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CA_CTGBillboardRMB)  | 
|     if not totalRMB:  | 
|         return  | 
|       | 
|     ipyDataList = IpyGameDataPY.GetIpyGameDataList("CrossActCTGBillboardDabiao", playerTemplateID)  | 
|     if not ipyDataList:  | 
|         return  | 
|       | 
|     playerID = curPlayer.GetPlayerID()  | 
|     awardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CA_CTGBillboardAward)  | 
|     batchPlayerIDList, batchAddItemList, batchParamList = [], [], []  | 
|     for ipyData in ipyDataList:  | 
|         ctgNeed = ipyData.GetCTGNeed()  | 
|         awardIndex = ipyData.GetAwardIndex()  | 
|         if totalRMB < CommFunc.RMBToCoin(ctgNeed):  | 
|             continue  | 
|         if awardRecord & pow(2, awardIndex):  | 
|             continue  | 
|         batchPlayerIDList.append([playerID])  | 
|         batchAddItemList.append(ipyData.GetAwardItemList())  | 
|         batchParamList.append([ctgNeed])  | 
|         awardRecord = awardRecord | pow(2, awardIndex)  | 
|           | 
|     if not batchPlayerIDList:  | 
|         return  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CA_CTGBillboardAward, awardRecord)  | 
|       | 
|     GameWorld.DebugLog("²¹·¢¿ç·þ³äÖµÅÅÐлδÁìÈ¡´ï±ê½±Àø!", playerID)  | 
|     PlayerControl.SendMailBatch("CACTGBillboardDabiao", batchPlayerIDList, batchAddItemList, batchParamList)  | 
|     return  | 
|   | 
| def GetDabiaoAward(curPlayer, awardIndex):  | 
|     ## ÊÖ¶¯ÁìÈ¡´ï±ê½±Àø  | 
|       | 
|     actInfo = CrossRealmPlayer.GetPlayerCrossActInfo(curPlayer, ShareDefine.CrossActName_CTGBillboard)  | 
|     state = actInfo.get(ShareDefine.ActKey_State, 0)  | 
|     if not state:  | 
|         GameWorld.DebugLog("·Ç»î¶¯ÖÐ")  | 
|         return  | 
|       | 
|     totalRMB = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CA_CTGBillboardRMB)  | 
|     awardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CA_CTGBillboardAward)  | 
|     if awardRecord & pow(2, awardIndex):  | 
|         GameWorld.DebugLog("ÒÑÁìÈ¡¹ý¸Ã½±Àø! awardIndex=%s" % awardIndex)  | 
|         return  | 
|           | 
|     playerTemplateID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CA_CTGBillboardTemplateID)  | 
|     ipyDataList = IpyGameDataPY.GetIpyGameDataList("CrossActCTGBillboardDabiao", playerTemplateID)  | 
|     if not ipyDataList:  | 
|         return  | 
|       | 
|     awardItemList = []  | 
|     for ipyData in ipyDataList:  | 
|         ctgNeed = CommFunc.RMBToCoin(ipyData.GetCTGNeed())  | 
|         if awardIndex == ipyData.GetAwardIndex():  | 
|             if totalRMB < ctgNeed:  | 
|                 GameWorld.DebugLog("³äÖµ¶î¶Èδ´ï±ê£¬ÎÞ·¨ÁìÈ¡! awardIndex=%s,totalRMB=%s,ctgNeed=%s"   | 
|                                    % (awardIndex, totalRMB, ctgNeed))  | 
|                 return  | 
|             awardItemList = ipyData.GetAwardItemList()  | 
|             break  | 
|           | 
|     GameWorld.DebugLog("ÁìÈ¡¿ç·þ³äÖµ»î¶¯´ï±ê½±Àø£¡awardIndex=%s,awardItemList=%s" % (awardIndex, awardItemList))  | 
|     if not awardItemList:  | 
|         return  | 
|       | 
|     if not ItemControler.CheckPackSpaceEnough(curPlayer, awardItemList):  | 
|         return  | 
|       | 
|     updAwardRecord = awardRecord | pow(2, awardIndex)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CA_CTGBillboardAward, updAwardRecord)  | 
|     Sync_CrossActCTGBillboardPlayerInfo(curPlayer)  | 
|       | 
|     for itemID, itemCount, isAuctionItem in awardItemList:  | 
|         ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, isAuctionItem, [IPY_GameWorld.rptItem],   | 
|                                      event=["CrossActCTGBillboard", False, {}])  | 
|           | 
|     return  | 
|   | 
| def AddCTGRMB(curPlayer, addRMB):  | 
|     ## Ôö¼Ó»î¶¯ÒÑÀۼƳäÖµRMB  | 
|     actInfo = CrossRealmPlayer.GetPlayerCrossActInfo(curPlayer, ShareDefine.CrossActName_CTGBillboard)   | 
|     if not actInfo:  | 
|         return  | 
|       | 
|     if not actInfo.get(ShareDefine.ActKey_State):  | 
|         GameWorld.DebugLog("Íæ¼ÒÇø·þID¿ç·þ³äÖµÅÅÐзǻÖÐ!playerServerID=%s" % GameWorld.GetPlayerServerID(curPlayer))  | 
|         return  | 
|       | 
|     totalRMB = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CA_CTGBillboardRMB) + addRMB  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CA_CTGBillboardRMB, totalRMB)  | 
|       | 
|     GameWorld.DebugLog("¿ç·þ³äÖµÅÅÐлÔö¼ÓÍæ¼ÒÀۼƳäÖµRMB: addRMB=%s,totalRMB=%s" % (addRMB, totalRMB), curPlayer.GetPlayerID())  | 
|     Sync_CrossActCTGBillboardPlayerInfo(curPlayer)  | 
|     UpdateCTGRMBCrossBillboard(curPlayer, actInfo)  | 
|     return  | 
|   | 
| def UpdateCTGRMBCrossBillboard(curPlayer, actInfo):  | 
|     ## ¸üпç·þ³äÖµ»î¶¯°ñ  | 
|     totalRMB = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CA_CTGBillboardRMB)  | 
|     if not totalRMB:  | 
|         return  | 
|     cfgID = actInfo.get(ShareDefine.ActKey_CfgID, 0)  | 
|     if not cfgID:  | 
|         return  | 
|     cmpValue = totalRMB  | 
|     PlayerBillboard.UpdatePlayerCrossBillboard(curPlayer, ShareDefine.Def_CBT_ActCTG, cfgID, cmpValue)  | 
|     return  | 
|   | 
| def Sync_CrossActCTGBillboardPlayerInfo(curPlayer):  | 
|     ## Í¨Öª»î¶¯Íæ¼ÒÊý¾ÝÐÅÏ¢  | 
|     playerActInfo = ChPyNetSendPack.tagMCCACTGBillboardPlayerInfo()  | 
|     playerActInfo.CTGRMBTotal = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CA_CTGBillboardRMB)  | 
|     playerActInfo.DabiaoAwardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CA_CTGBillboardAward)  | 
|     NetPackCommon.SendFakePack(curPlayer, playerActInfo)  | 
|     return  | 
|   | 
| def Sync_CrossActCTGBillboardInfo(curPlayer):  | 
|     ## Í¨Öª»î¶¯ÐÅÏ¢  | 
|       | 
|     actInfo = CrossRealmPlayer.GetPlayerCrossActInfo(curPlayer, ShareDefine.CrossActName_CTGBillboard)  | 
|     if not actInfo:  | 
|         return  | 
|       | 
|     if not actInfo.get(ShareDefine.ActKey_State):  | 
|         return  | 
|       | 
|     ipyDataDict = actInfo.get(ShareDefine.ActKey_IpyDataInfo, {})  | 
|     if not ipyDataDict:  | 
|         return 0  | 
|       | 
|     templateIDList = ipyDataDict.get("TemplateIDList", [])  | 
|     if not templateIDList:  | 
|         return  | 
|       | 
|     actPack = ChPyNetSendPack.tagMCCACTGBillboardInfo()  | 
|     actPack.ServerIDRangeInfo = str(actInfo.get(ShareDefine.ActKey_ServerIDRangeList, []))  | 
|     actPack.ServerInfoLen = len(actPack.ServerIDRangeInfo)  | 
|     actPack.GroupValue1 = actInfo.get(ShareDefine.ActKey_CfgID, 0)  | 
|     actPack.StartDate = ipyDataDict.get("StartDate", "")  | 
|     actPack.EndtDate = ipyDataDict.get("EndDate", "")  | 
|     actPack.TemplateID = actInfo.get(ShareDefine.ActKey_TemplateID, 0)  | 
|     actPack.TempInfo = []  | 
|     for templateID in templateIDList:  | 
|         tempInfo = ChPyNetSendPack.tagMCCACTGBillboardTempInfo()  | 
|           | 
|         # ´ï±ê  | 
|         tempInfo.TemplateID = templateID  | 
|         tempInfo.DabiaoAwardInfo = []  | 
|         dabiaoIpyDataList = IpyGameDataPY.GetIpyGameDataList("CrossActCTGBillboardDabiao", templateID)  | 
|         if dabiaoIpyDataList:  | 
|             for dabiaoIpyData in dabiaoIpyDataList:  | 
|                 dabiaoInfo = ChPyNetSendPack.tagMCCACTGBillboardDabiao()  | 
|                 dabiaoInfo.NeedRMB = dabiaoIpyData.GetCTGNeed()  | 
|                 dabiaoInfo.AwardIndex = dabiaoIpyData.GetAwardIndex()  | 
|                 dabiaoInfo.AwardItemList = []  | 
|                 for itemID, itemCount, isBind in dabiaoIpyData.GetAwardItemList():  | 
|                     itemInfo = ChPyNetSendPack.tagMCCACTGBillboardAwardItem()  | 
|                     itemInfo.ItemID = itemID  | 
|                     itemInfo.ItemCount = itemCount  | 
|                     itemInfo.IsBind = isBind  | 
|                     dabiaoInfo.AwardItemList.append(itemInfo)  | 
|                 dabiaoInfo.AwardItemCount = len(dabiaoInfo.AwardItemList)  | 
|                 tempInfo.DabiaoAwardInfo.append(dabiaoInfo)  | 
|         tempInfo.DabiaoAwardCount = len(tempInfo.DabiaoAwardInfo)  | 
|           | 
|         # ÅÅÐÐ  | 
|         tempInfo.OrderAwardInfo = []  | 
|         orderIpyDataList = IpyGameDataPY.GetIpyGameDataList("CrossActCTGBillboardOrder", templateID)  | 
|         if orderIpyDataList:  | 
|             for orderIpyData in orderIpyDataList:  | 
|                 orderInfo = ChPyNetSendPack.tagMCCACTGBillboardOrder()  | 
|                 orderInfo.OrderA = orderIpyData.GetOrderA()  | 
|                 orderInfo.OrderB = orderIpyData.GetOrderB()  | 
|                 orderInfo.NeedRMB = orderIpyData.GetCTGAtleast()  | 
|                 orderInfo.AwardItemList = []  | 
|                 for itemID, itemCount, isBind in orderIpyData.GetAwardItemList():  | 
|                     itemInfo = ChPyNetSendPack.tagMCCACTGBillboardAwardItem()  | 
|                     itemInfo.ItemID = itemID  | 
|                     itemInfo.ItemCount = itemCount  | 
|                     itemInfo.IsBind = isBind  | 
|                     orderInfo.AwardItemList.append(itemInfo)  | 
|                 orderInfo.AwardItemCount = len(orderInfo.AwardItemList)  | 
|                 tempInfo.OrderAwardInfo.append(orderInfo)  | 
|         tempInfo.OrderAwardCount = len(tempInfo.OrderAwardInfo)  | 
|           | 
|         actPack.TempInfo.append(tempInfo)  | 
|           | 
|     actPack.TemplateCount = len(actPack.TempInfo)  | 
|     NetPackCommon.SendFakePack(curPlayer, actPack)  | 
|     return  |