| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| ##@package Player.PlayerCrossBattlefield  | 
| #  | 
| # @todo:¿ç·þÕ½³¡/¹ÅÉñÕ½³¡  | 
| # @author hxp  | 
| # @date 2022-01-06  | 
| # @version 1.0  | 
| #  | 
| # ÏêϸÃèÊö: ¿ç·þÕ½³¡/¹ÅÉñÕ½³¡  | 
| #  | 
| #-------------------------------------------------------------------------------  | 
| #"""Version = 2022-01-06 20:30"""  | 
| #-------------------------------------------------------------------------------  | 
| import GameWorld  | 
| import ShareDefine  | 
| import PlayerControl  | 
| import IpyGameDataPY  | 
| import datetime  | 
| import CrossRealmPlayer  | 
| import ChConfig  | 
| import ItemCommon  | 
| import IPY_GameWorld  | 
| import ChPyNetSendPack  | 
| import NetPackCommon  | 
| import ItemControler  | 
| import PlayerActivity  | 
| import PlayerSuccess  | 
|   | 
|   | 
| def DoPlayerLogin(curPlayer):  | 
|     if GameWorld.IsCrossServer():  | 
|         return  | 
|     SyncCrossBattlefieldPlayerInfo(curPlayer)  | 
|     return  | 
|   | 
| def DoPlayerOnDay(curPlayer):  | 
|     if GameWorld.IsCrossServer():  | 
|         return  | 
|       | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_Battlefield_HighScoreToday, 0)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_Battlefield_BuyOpenCountToday, 0)  | 
|       | 
|     SyncCrossBattlefieldPlayerInfo(curPlayer)  | 
|     return  | 
|   | 
| def DoPlayerOnWeek(curPlayer):  | 
|     if GameWorld.IsCrossServer():  | 
|         return  | 
|       | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_Battlefield_EnterCountWeek, 0)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_Battlefield_BuyOpenCountWeek, 0)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_Battlefield_HighScoreTotalWeek, 0)  | 
|     SyncCrossBattlefieldPlayerInfo(curPlayer)  | 
|     return  | 
|   | 
| #// C1 09 ¿ç·þÕ½³¡¹ºÂò¿ªÆô³¡´Î #tagCMCrossBattlefieldBuyOpen  | 
| #  | 
| #struct    tagCMCrossBattlefieldBuyOpen  | 
| #{  | 
| #    tagHead        Head;  | 
| #    BYTE    Hour;        //Õ½³¡¿ªÆôʱ  | 
| #    BYTE    Minute;        //Õ½³¡¿ªÆô·Ö  | 
| #    BYTE    Faction;        //ÕóÓª 1-ºì£»2-À¶  | 
| #    BYTE    ServerOnly;    //ÊÇ·ñ½ö±¾·þÍæ¼Ò¿É¼ÓÈ룬0-·ñ£¬1-ÊÇ  | 
| #};  | 
| def OnCrossBattlefieldBuyOpen(index, clientData, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     playerID = curPlayer.GetPlayerID()  | 
|     hour = clientData.Hour  | 
|     minute = clientData.Minute  | 
|     faction = clientData.Faction  | 
|     serverOnly = clientData.ServerOnly  | 
|       | 
|     if GameWorld.IsCrossServer():  | 
|         GameWorld.DebugLog("¿ç·þ·þÎñÆ÷ÎÞ·¨·¢ÆðÆ¥Åä!", playerID)  | 
|         return  | 
|       | 
|     if not CrossRealmPlayer.IsCrossServerOpen():  | 
|         PlayerControl.NotifyCode(curPlayer, "CrossMatching18")  | 
|         return  | 
|       | 
|     if faction not in [ChConfig.CampType_Justice, ChConfig.CampType_Evil]:  | 
|         GameWorld.DebugLog("ûÓиÃÕ½³¡ÕóӪѡÔñ! faction=%s" % faction, playerID)  | 
|         return  | 
|       | 
|     callOpenHMList = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldOpen", 2)  | 
|     if [hour, minute] not in callOpenHMList:  | 
|         GameWorld.Log("·Ç¿ÉÕÙ¼¯µÄÕ½³¡³¡´Î! hour=%s,minute=%s,callOpenHMList=%s" % (hour, minute, callOpenHMList), playerID)  | 
|         return  | 
|       | 
|     closeBuyMinute = IpyGameDataPY.GetFuncCfg("CrossBattlefieldOpen", 4) # ¿ªÆôǰX·ÖÖÓºó¹Ø±Õ¹ºÂò  | 
|     crossServerTimeStr = GameWorld.GetCrossServerTimeStr()  | 
|     crossServerDateTime = GameWorld.ChangeStrToDatetime(crossServerTimeStr)  | 
|       | 
|     startTimeStr = "%s-%s-%s %s:%s:00" % (crossServerDateTime.year, crossServerDateTime.month, crossServerDateTime.day, hour, minute)  | 
|     startDateTime = GameWorld.ChangeStrToDatetime(startTimeStr)  | 
|     endBuyDateTime = startDateTime + datetime.timedelta(minutes= -closeBuyMinute)  | 
|     if crossServerDateTime >= endBuyDateTime:  | 
|         GameWorld.Log("¸Ãʱ¼äµãÕ½³¡ÒѹرÕÕÙ¼¯£¬²»ÄÜÔÙÕÙ¼¯! hour=%s,minute=%s,crossServerDateTime(%s) >= endBuyDateTime(%s)"   | 
|                       % (hour, minute, crossServerDateTime, endBuyDateTime), playerID)  | 
|         return  | 
|       | 
|     moneyBuyMaxCount, moneyType, moneyCount = 0, 0, 0  | 
|     todayBuyOpenCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Battlefield_BuyOpenCountToday)  | 
|     buyOpenMoneyInfo = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldBuyOpen", 1)  | 
|     if len(buyOpenMoneyInfo) == 3:  | 
|         moneyBuyMaxCount, moneyType, moneyCount = buyOpenMoneyInfo  | 
|           | 
|     # ¹ºÂòÏûºÄ»õ±Ò  | 
|     if todayBuyOpenCount < moneyBuyMaxCount:  | 
|         if not PlayerControl.HaveMoney(curPlayer, moneyType, moneyCount):  | 
|             GameWorld.DebugLog("¿ç·þÕ½³¡ÕÙ¼¯¿ªÆô»õ±Ò²»×ã! moneyType=%s,moneyCount=%s" % (moneyType, moneyCount), playerID)  | 
|             return  | 
|     else:  | 
|         costItemID = IpyGameDataPY.GetFuncCfg("CrossBattlefieldBuyOpen", 2)  | 
|         costItem = ItemCommon.FindItemInPackByItemID(curPlayer, costItemID, IPY_GameWorld.rptItem)  | 
|         if not ItemCommon.CheckItemCanUse(costItem):  | 
|             GameWorld.DebugLog("¿ç·þÕ½³¡ÕÙ¼¯¿ªÆôµÀ¾ß²»×ã! costItemID=%s" % costItemID, playerID)  | 
|             return  | 
|           | 
|     if not GameWorld.SetPlayerTickTime(curPlayer, ChConfig.TYPE_Player_Tick_Battlefield, tick):  | 
|         PlayerControl.NotifyCode(curPlayer, "RequestLater")  | 
|         return  | 
|       | 
|     dataMsg = {"openHour":hour, "openMinute":minute, "faction":faction, "todayBuyOpenCount":todayBuyOpenCount,  | 
|                "serverOnly":serverOnly,  | 
|                "accID":curPlayer.GetAccID(),  | 
|                "playerID":playerID,  | 
|                "playerName":CrossRealmPlayer.GetCrossPlayerName(curPlayer),  | 
|                "playerJob":curPlayer.GetJob(),  | 
|                "playerLV":curPlayer.GetLV(),  | 
|                "realmLV":curPlayer.GetOfficialRank(),  | 
|                "fightPower":PlayerControl.GetFightPower(curPlayer),  | 
|                "buyOpenCountWeek":curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Battlefield_BuyOpenCountWeek)  | 
|                }  | 
|     GameWorld.SendMsgToCrossServer(ShareDefine.ClientServerMsg_BattlefieldBuyOpen, dataMsg)  | 
|     return  | 
|   | 
| def GameServer_CrossBattlefield_DoResult(curPlayer, msgData):  | 
|     msgType, dataMsg = msgData[:2]  | 
|     #ret = msgData[2] if len(msgData) > 2 else None  | 
|       | 
|     ## Õ½³¡¹ºÂò¿ªÆô³¡´Î   | 
|     if msgType == "BattlefieldBuy":  | 
|         __DoBattlefieldBuy(curPlayer, dataMsg)  | 
|                   | 
|     elif msgType == "BattlefieldOver":  | 
|         __DoBattlefieldOver(curPlayer, dataMsg)  | 
|           | 
|     return  | 
|   | 
| def __DoBattlefieldBuy(curPlayer, dataMsg):  | 
|       | 
|     playerID = curPlayer.GetPlayerID()  | 
|     openHour, openMinute, faction, todayBuyOpenCount, buyTime = dataMsg  | 
|     updTodayBuyOpenCount, updWeekBuyOpenCount = 0, 0  | 
|       | 
|     isToday = GameWorld.CheckTimeIsSameServerDayEx(buyTime)  | 
|     if isToday:  | 
|         todayBuyOpenCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Battlefield_BuyOpenCountToday)  | 
|         updTodayBuyOpenCount = todayBuyOpenCount + 1  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_Battlefield_BuyOpenCountToday, updTodayBuyOpenCount)  | 
|           | 
|     isSameWeek = GameWorld.CheckTimeIsSameWeek(buyTime)  | 
|     if isSameWeek:  | 
|         weekBuyOpenCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Battlefield_BuyOpenCountWeek)  | 
|         updWeekBuyOpenCount = weekBuyOpenCount + 1  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_Battlefield_BuyOpenCountWeek, updWeekBuyOpenCount)  | 
|     SyncCrossBattlefieldPlayerInfo(curPlayer)  | 
|       | 
|     GameWorld.Log("¹ºÂòÕÙ¼¯¿ç·þÕ½³¡½á¹û: openHour=%s,openMinute=%s,faction=%s,updTodayBuyOpenCount=%s,updWeekBuyOpenCount=%s,buyTime=%s,isToday=%s,isSameWeek=%s"   | 
|                   % (openHour, openMinute, faction, updTodayBuyOpenCount, updWeekBuyOpenCount, GameWorld.ChangeTimeNumToStr(buyTime), isToday, isSameWeek), playerID)  | 
|       | 
|     moneyBuyMaxCount, moneyType, moneyCount = 0, 0, 0  | 
|     buyOpenMoneyInfo = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldBuyOpen", 1)  | 
|     if len(buyOpenMoneyInfo) == 3:  | 
|         moneyBuyMaxCount, moneyType, moneyCount = buyOpenMoneyInfo  | 
|           | 
|     infoDict = {ChConfig.Def_Cost_Reason_SonKey:"BattlefieldBuyOpen", "buyTime":buyTime, "isToday":isToday, "isSameWeek":isSameWeek,   | 
|                 "updTodayBuyOpenCount":updTodayBuyOpenCount, "updWeekBuyOpenCount":updWeekBuyOpenCount}  | 
|     # ¹ºÂòÏûºÄ»õ±Ò  | 
|     if todayBuyOpenCount < moneyBuyMaxCount:  | 
|         if not PlayerControl.PayMoney(curPlayer, moneyType, moneyCount, ChConfig.Def_Cost_CrossBattlefield, infoDict):  | 
|             return  | 
|     else:  | 
|         costItemID = IpyGameDataPY.GetFuncCfg("CrossBattlefieldBuyOpen", 2)  | 
|         costItem = ItemCommon.FindItemInPackByItemID(curPlayer, costItemID, IPY_GameWorld.rptItem)  | 
|         if not ItemCommon.CheckItemCanUse(costItem):  | 
|             costItem = ItemCommon.FindItemInPackByItemID(curPlayer, costItemID, IPY_GameWorld.rptWarehouse)  | 
|         if not ItemCommon.CheckItemCanUse(costItem):  | 
|             return  | 
|         ItemCommon.DelItem(curPlayer, costItem, 1, True, "CrossBattlefield", infoDict)  | 
|           | 
|     # ¹Ì¶¨Àñ°ü  | 
|     buyAwardItemList = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldBuyOpen", 3)  | 
|     ItemControler.GivePlayerItemOrMail(curPlayer, buyAwardItemList)  | 
|       | 
|     PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_Battlefield_CallOpen, 1)  | 
|     return  | 
|   | 
| def __DoBattlefieldOver(curPlayer, dataMsg):  | 
|       | 
|     playerID = curPlayer.GetPlayerID()  | 
|     overTime, \  | 
|         isWinner, faction, rank, score, highScoreToday, highScoreWeekTotal, enterCountWeek, \  | 
|         isCallOpen, isCalled, killCnt, ckillCntInfo, killBossCnt, killScoreKing, killGuardCnt, auraScore, superItemAwardCnt, \  | 
|         factionBuffCollCnt, personBuffCollCnt, crystalCollCnt, wallCollCnt = dataMsg  | 
|           | 
|     isToday = GameWorld.CheckTimeIsSameServerDayEx(overTime)  | 
|     isSameWeek = GameWorld.CheckTimeIsSameWeek(overTime)  | 
|     GameWorld.Log("¿ç·þÕ½³¡½áËãÍæ¼Ò½á¹û: highScoreToday=%s,highScoreWeekTotal=%s,enterCountWeek=%s,overTime=%s,isToday=%s,isSameWeek=%s"   | 
|                   % (highScoreToday, highScoreWeekTotal, enterCountWeek, GameWorld.ChangeTimeNumToStr(overTime), isToday, isSameWeek), playerID)  | 
|     GameWorld.Log("    isWinner=%s,faction=%s,rank=%s,score=%s,isCallOpen=%s,isCalled=%s" % (isWinner, faction, rank, score, isCallOpen, isCalled), playerID)  | 
|     GameWorld.Log("    killCnt=%s,ckillCntInfo=%s,killBossCnt=%s,killScoreKing=%s,killGuardCnt=%s,auraScore=%s,superItemAwardCnt=%s"   | 
|                   % (killCnt, ckillCntInfo, killBossCnt, killScoreKing, killGuardCnt, auraScore, superItemAwardCnt), playerID)  | 
|     GameWorld.Log("    factionBuffCollCnt=%s,personBuffCollCnt=%s,crystalCollCnt=%s,wallCollCnt=%s"   | 
|                   % (factionBuffCollCnt, personBuffCollCnt, crystalCollCnt, wallCollCnt), playerID)  | 
|       | 
|     if isToday:  | 
|         addCnt = 1  | 
|         # ÕÙ¼¯½øÈëÓÉÓÚÊÇÃâ·Ñ½øÈ룬²»ÐèÒªÔö¼ÓÈÕ³£´ÎÊý£¬Ö±½ÓÔö¼ÓÈÕ³£»îÔ¾  | 
|         if isCallOpen or isCalled:  | 
|             activityNum = PlayerActivity.GetActivityNum(PlayerActivity.RelatedType_1, ShareDefine.DailyActionID_CrossBattlefield)  | 
|             PlayerActivity.AddActivityFinishCnt(curPlayer, activityNum, None, addCnt)  | 
|         # ·ÇÕÙ¼¯¶ÒÈë½øÈëµÄÐèÒªÔö¼ÓÈÕ³£´ÎÊý  | 
|         else:  | 
|             PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_CrossBattlefield, addCnt)  | 
|               | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_Battlefield_HighScoreToday, highScoreToday)  | 
|           | 
|     if isSameWeek:  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_Battlefield_EnterCountWeek, enterCountWeek)  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_Battlefield_HighScoreTotalWeek, highScoreWeekTotal)  | 
|     SyncCrossBattlefieldPlayerInfo(curPlayer)  | 
|       | 
|     # ³É¾Í  | 
|     PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_Battlefield_Join, 1)  | 
|     if isCalled:  | 
|         PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_Battlefield_Called, 1)  | 
|     if isWinner:  | 
|         if faction == ShareDefine.CampType_Justice:  | 
|             PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_Battlefield_WinJ, 1)  | 
|         elif faction == ShareDefine.CampType_Evil:  | 
|             PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_Battlefield_WinE, 1)  | 
|     if killCnt > 0:  | 
|         PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_Battlefield_KillCnt, killCnt)  | 
|     for ckillCnt, addCnt in ckillCntInfo.items():  | 
|         PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_Battlefield_CKillCnt, addCnt, [ckillCnt])  | 
|     if killBossCnt > 0:  | 
|         PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_Battlefield_KillBoss, killBossCnt)  | 
|     if killScoreKing > 0:  | 
|         PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_Battlefield_KillScoreKing, killScoreKing)  | 
|     if killGuardCnt > 0:  | 
|         PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_Battlefield_KillGuard, killGuardCnt)  | 
|     if score > 0:  | 
|         PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_Battlefield_Score, score)  | 
|         PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_Battlefield_ScoreMore, 1, [score])  | 
|     if auraScore > 0:  | 
|         PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_Battlefield_AuraScore, auraScore)  | 
|     if superItemAwardCnt > 0:  | 
|         PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_Battlefield_SuperItem, superItemAwardCnt)  | 
|     if factionBuffCollCnt > 0:      | 
|         PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_Battlefield_FactionBuff, factionBuffCollCnt)  | 
|     if personBuffCollCnt > 0:      | 
|         PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_Battlefield_PersonBuff, personBuffCollCnt)  | 
|     if crystalCollCnt > 0:  | 
|         PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_Battlefield_Crystal, crystalCollCnt)  | 
|     if wallCollCnt > 0:  | 
|         PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_Battlefield_Wall, wallCollCnt)  | 
|     return  | 
|   | 
| def SyncCrossBattlefieldPlayerInfo(curPlayer):  | 
|     clientPack = ChPyNetSendPack.tagMCCrossBattlefieldPlayerInfo()  | 
|     clientPack.BuyOpenCountToday = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Battlefield_BuyOpenCountToday)  | 
|     clientPack.HighScoreToday = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Battlefield_HighScoreToday)  | 
|     clientPack.EnterCountWeek = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Battlefield_EnterCountWeek)  | 
|     clientPack.BuyOpenCountWeek = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Battlefield_BuyOpenCountWeek)  | 
|     clientPack.HighScoreTotalWeek = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Battlefield_HighScoreTotalWeek)  | 
|     NetPackCommon.SendFakePack(curPlayer, clientPack)  | 
|     return  | 
|   |