#!/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 import PlayerGubao 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 sysOpenHMList = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldOpen", 1) if [hour, minute] in sysOpenHMList: if PlayerControl.GetCrossMapID(curPlayer) != ChConfig.Def_FBMapID_CrossBattlefield: GameWorld.DebugLog("ϵͳ³¡´ÎÕÙ¼¯Ö»ÄÜÔÚ¿ç·þÕ½³¡µØÍ¼Ê±¿ÉÕÙ¼¯! CrossMapID=%s" % PlayerControl.GetCrossMapID(curPlayer), playerID) return else: 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 canBuyStartHour = 5 curServerTime = GameWorld.GetCurrentTime() if crossServerDateTime.hour < canBuyStartHour or curServerTime.hour < canBuyStartHour: PlayerControl.NotifyCode(curPlayer, "CrossBattlefieldBuyLimit") GameWorld.Log("¿ç·þ·þÎñÆ÷¼°±¾·þ·þÎñÆ÷Ð賬¹ý%sµãºó¿É¹ºÂò! crossServerHour=%s,curServerHour=%s" % (canBuyStartHour, crossServerDateTime.hour, curServerTime.hour), 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(), "face":curPlayer.GetFace(), "facePic":curPlayer.GetFacePic(), "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, teamID, \ 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,teamID=%s,isCallOpen=%s,isCalled=%s" % (isWinner, faction, rank, score, teamID, 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) PlayerGubao.AddGubaoItemEffValue(curPlayer, PlayerGubao.GubaoEffType_CrossBattlefield, 1) 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 or teamID: 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) clientPack.ZoneID = CrossRealmPlayer.GetCrossPlayerZoneID(curPlayer, ChConfig.Def_FBMapID_CrossBattlefield) NetPackCommon.SendFakePack(curPlayer, clientPack) return