#!/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)
|
return
|
|
#// C1 09 ¿ç·þÕ½³¡¹ºÂò¿ªÆô³¡´Î #tagCMCrossBattlefieldBuyOpen
|
#
|
#struct tagCMCrossBattlefieldBuyOpen
|
#{
|
# tagHead Head;
|
# BYTE Hour; //Õ½³¡¿ªÆôʱ
|
# BYTE Minute; //Õ½³¡¿ªÆô·Ö
|
# BYTE Faction; //ÕóÓª 1-ºì£»2-À¶
|
#};
|
def OnCrossBattlefieldBuyOpen(index, clientData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
playerID = curPlayer.GetPlayerID()
|
hour = clientData.Hour
|
minute = clientData.Minute
|
faction = clientData.Faction
|
|
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,
|
"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)
|
SyncCrossBattlefieldPlayerInfo(curPlayer)
|
|
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)
|
|
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)
|
SyncCrossBattlefieldPlayerInfo(curPlayer)
|
|
if isSameWeek:
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_Battlefield_EnterCountWeek, enterCountWeek)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_Battlefield_HighScoreTotalWeek, highScoreWeekTotal)
|
|
# ³É¾Í
|
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)
|
NetPackCommon.SendFakePack(curPlayer, clientPack)
|
return
|
|