#!/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  
 | 
  
 |