#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package CrossBattlefield # # @todo:¿ç·þÕ½³¡/¹ÅÉñÕ½³¡ # @author hxp # @date 2022-01-06 # @version 1.0 # # ÏêϸÃèÊö: ¿ç·þÕ½³¡/¹ÅÉñÕ½³¡ # #------------------------------------------------------------------------------- #"""Version = 2022-01-06 20:30""" #------------------------------------------------------------------------------- import datetime import PyGameData import CrossRealmPK import CrossRealmMsg import PlayerControl import PyDataManager import ChPyNetSendPack import CrossRealmPlayer import PlayerCompensation import PlayerViewCache import CrossBillboard import IpyGameDataPY import NetPackCommon import ShareDefine import GameWorld import PlayerFB import ChConfig import operator import time ''' ÈȸüÅäÖà Ð޸ĿªÆôʱ¼ä£¬Ö»Äܵȵ±Ìì¶¼½áÊøÁ˲ÅÄܸüУ¬¼´¸ôÌìÉúЧ£¬²»È»¿ÉÄܵ¼ÖÂÒѹºÂò³¡´ÎµÄÍæ¼Ò¹ºÂòÊý¾Ý¶ªÊ§ ÆäËûÅäÖÃÔÝÎÞÓ°Ï죬¿ÉÖ±½ÓÈȸü ºÏ·þ ¿ª·Åʱ¼äͬ¿ç·þPKÒ»Ñù£¬Èü¼¾½áÊøÆÚ¼ä²»¿É¹ºÂò£¬²»¿É¿ªÆô£¬¸ø·ÖÇøµ÷ÕûÌÚ³ö¿Õ¼ä£¬¹¦Äܲ»¿¼ÂÇ·ÖÇø±ä¸ü´øÀ´µÄÎÊÌâ ''' Def_RecType_CrossBattlefieldBuy = ShareDefine.Def_UniversalGameRecType_CrossBattlefieldBuy ''' Íæ¼Ò¿ªÆôµÄ¿ç·þÕ½³¡ ShareDefine.Def_UniversalGameRecType_CrossBattlefieldBuy time:time ¹ºÂòʱ¼ä value1:zoneID ·ÖÇøID value2:hmNum ʱ·Ö³¡´Î±àºÅ value3:playerID ¹ºÂòµÄÍæ¼ÒID value4:factionID ËùÑ¡ÔñµÄÕóÓªID StrValue3:[callPlayerID,...] ÕÙ¼¯À´µÄÍæ¼ÒID£¬°üº¬×Ô¼º ''' class CrossBattlefieldBuy(): ''' ¿ç·þÕ½³¡¹ºÂò¼Ç¼ ''' def __init__(self): self.Clear() return def Clear(self): self.buyTime = 0 self.hmNum = 0 self.zoneID = 0 self.playerID = 0 self.factionID = 0 self.callPlayerIDList = [] # ×Ó·þÓ㬿ç·þ·þÎñÆ÷ͬ²½Êý¾Ýʱ¸ºÖµ£» ²»´æ¿â£¬Íæ¼ÒÊôÐÔ»º´æÐÅÏ¢£¬±¾·þÍæ¼ÒÈ¡×Ô¼º·þÎñÆ÷×îлº´æ self.callPlayerDict = {} # {playerID:{attrName:value, ...}, ...} return def GetSyncClientServerString(self): self.callPlayerDict = {} for playerID in self.callPlayerIDList: curCache = PlayerViewCache.FindViewCache(playerID) if not curCache: continue cacheDict = PlayerViewCache.GetCachePropDataDict(curCache) self.callPlayerDict[playerID] = {"Name":cacheDict["Name"], "Job":cacheDict["Job"], "LV":cacheDict["LV"], "RealmLV":cacheDict["RealmLV"], "FightPower":cacheDict["FightPower"]} return {"buyTime":self.buyTime, "hmNum":self.hmNum, "zoneID":self.zoneID, "playerID":self.playerID, "factionID":self.factionID, "callPlayerIDList":self.callPlayerIDList, "callPlayerDict":self.callPlayerDict} def SetAttr(self, attrDict): for k, v in attrDict.items(): setattr(self, k, v) return def OnServerStart(): if not GameWorld.IsCrossServer(): return PyGameData.g_crossBattlefieldBuyInfo = {} universalRecMgr = GameWorld.GetUniversalRecMgr() recDataList = universalRecMgr.GetTypeList(Def_RecType_CrossBattlefieldBuy) GameWorld.Log("¼ÓÔØ¿ç·þÕ½³¡¹ºÂò¼Ç¼! %s" % recDataList.Count()) for index in xrange(recDataList.Count()): recData = recDataList.At(index) zoneID = recData.GetValue1() hmNum = recData.GetValue2() playerID = recData.GetValue3() factionID = recData.GetValue4() strValue3 = recData.GetStrValue3() buyRec = CrossBattlefieldBuy() buyRec.buyTime = recData.GetTime() buyRec.zoneID = zoneID buyRec.hmNum = hmNum buyRec.playerID = playerID buyRec.factionID = factionID buyRec.callPlayerIDList = eval(strValue3) if strValue3 else [] buyPlayerInfo = GetBuyPlayerInfo(zoneID, hmNum) buyPlayerInfo[playerID] = buyRec GameWorld.Log(" %s" % buyRec.GetSyncClientServerString()) return def OnServerClose(): if not GameWorld.IsCrossServer(): return universalRecMgr = GameWorld.GetUniversalRecMgr() universalRecMgr.Delete(Def_RecType_CrossBattlefieldBuy) GameWorld.Log("±£´æ¿ç·þÕ½³¡¹ºÂò¼Ç¼!") recDataList = universalRecMgr.GetTypeList(Def_RecType_CrossBattlefieldBuy) for _, buyHMInfo in PyGameData.g_crossBattlefieldBuyInfo.items(): for _, buyPlayerInfo in buyHMInfo.items(): for buyRec in buyPlayerInfo.values(): GameWorld.Log(" %s" % buyRec.GetSyncClientServerString()) recData = recDataList.AddRec() recData.SetTime(buyRec.buyTime) recData.SetValue1(buyRec.zoneID) recData.SetValue2(buyRec.hmNum) recData.SetValue3(buyRec.playerID) recData.SetValue4(buyRec.factionID) recData.SetStrValue3(str(buyRec.callPlayerIDList).replace(" ", "")) return def GetHMNum(openHour, openMinute): return openHour * 100 + openMinute def GetHMByNum(hmNum): return hmNum / 100, hmNum % 100 def OnPlayerLogin(curPlayer): serverGroupID = GameWorld.GetServerGroupID() zoneIpyData = CrossRealmPK.GetCrossPKServerGroupZone(serverGroupID) if not zoneIpyData: return zoneID = zoneIpyData.GetZoneID() SyncCrossBattlefieldBuyInfo(None, zoneID) return def DoOnDayEx(): if not GameWorld.IsCrossServer(): return PyGameData.g_crossBattlefieldBuyInfo = {} Sync_CrossBattlefieldDataToClientServer() return def DoOnWeekEx(): if not GameWorld.IsCrossServer(): return enterWeekMoneyItemID = IpyGameDataPY.GetFuncCfg("CrossBattlefieldBillboardJoin", 3) # ÖܲÎÓë°ñ¶îÍâ½±Àø»õ±ÒÎïÆ·ID enterWeekMoneyMultiDict = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldBillboardJoin", 4, {}) # ÖܲÎÓë°ñ¶îÍâ½±Àø»õ±ÒÃû´Î¶ÔÓ¦±¶Öµ enterWeekOrderAwardDict = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldBillboardJoin", 2, {}) # ÖܲÎÓë°ñÃû´Î¶ÔÓ¦½±ÀøÎïÆ·Áбí {"Ãû´Î":[[ÎïÆ·ID,¸öÊý,ÊÇ·ñÅÄÆ·], ...], ...} , Ãû´ÎÅäÖÃÖ§³Ö¶ÎÅäÖà callWeekOrderAwardDict = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldBillboard", 2, {}) # ÖÜÕÙ¼¯°ñÃû´Î¶ÔÓ¦½±ÀøÎïÆ·Áбí {"Ãû´Î":[[ÎïÆ·ID,¸öÊý,ÊÇ·ñÅÄÆ·], ...], ...} , Ãû´ÎÅäÖÃÖ§³Ö¶ÎÅäÖà scoreWeekOrderAwardDict = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldBillboard", 3, {}) # ÖÜ»ý·Ö°ñÃû´Î¶ÔÓ¦½±ÀøÎïÆ·Áбí {"Ãû´Î":[[ÎïÆ·ID,¸öÊý,ÊÇ·ñÅÄÆ·], ...], ...} , Ãû´ÎÅäÖÃÖ§³Ö¶ÎÅäÖà enterWeekMoneyMultiIntDict = {int(k):v for k, v in enterWeekMoneyMultiDict.items()} enterWeekOrderIntAwardDict = {int(k):v for k, v in enterWeekOrderAwardDict.items()} callWeekOrderIntAwardDict = {int(k):v for k, v in callWeekOrderAwardDict.items()} scoreWeekOrderIntAwardDict = {int(k):v for k, v in scoreWeekOrderAwardDict.items()} billboardDict = { ShareDefine.Def_CBT_BattlefieldWJoin:[enterWeekOrderIntAwardDict, "CrossBattlefieldEnterOrderWeek"], ShareDefine.Def_CBT_BattlefieldWCall:[callWeekOrderIntAwardDict, "CrossBattlefieldCallOrderWeek"], ShareDefine.Def_CBT_BattlefieldWScore:[scoreWeekOrderIntAwardDict, "CrossBattlefieldScoreOrderWeek"], } # ½áËãÖܰñ billboardMgr = PyDataManager.GetCrossBillboardManager() for billboardType, doInfo in billboardDict.items(): awardDict, mailKey = doInfo groupList = billboardMgr.GetBillboardGroupList(billboardType) GameWorld.Log("¹ýÖܽáËã¿ç·þÕ½³¡Öܰñ½±Àø: billboardType=%s,groupList=%s" % (billboardType, groupList)) for billboardType, groupValue1, groupValue2 in groupList: billboardObj = billboardMgr.GetCrossBillboard(billboardType, groupValue1, groupValue2) if not billboardObj: continue billboardObj.SortData() for i in xrange(billboardObj.GetCount()): billboardData = billboardObj.At(i) if not billboardData: continue playerID = billboardData.ID cmpValue = billboardData.CmpValue rank = i + 1 awardItemList = GameWorld.GetOrderValueByDict(awardDict, rank) paramList = [rank] if billboardType == ShareDefine.Def_CBT_BattlefieldWJoin and enterWeekMoneyItemID: moneyBaseCount, multiValue = GameWorld.GetOrderValueByDict(enterWeekMoneyMultiIntDict, rank) # ½±Àø»õ±Ò±¶Öµ #»ù´¡±£µ×Öµ£¨²»Í¬Ãû´Î¿ÉÄܲ»Ò»Ñù£© + Ãû´Î±¶ÂÊ*´ÎÊý awardMoneyCount = int(moneyBaseCount + multiValue * cmpValue) awardItemList.append([enterWeekMoneyItemID, awardMoneyCount, 0]) PlayerCompensation.SendMailByKey(mailKey, [playerID], awardItemList, paramList, crossMail=True) billboardObj.ClearData() return def GetCrossBattlefieldState(): return GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_DailyActionState % ShareDefine.DailyActionID_CrossBattlefield) def IsBattlefieldCallPlayer(playerID): ## ÊÇ·ñÕ½³¡ÕÙ¼¯Íæ¼Ò£¬°üº¬±»ÕÙ¼¯Íæ¼Ò for buyHMInfo in PyGameData.g_crossBattlefieldBuyInfo.values(): for buyPlayerInfo in buyHMInfo.values(): for buyRec in buyPlayerInfo.values(): if playerID in buyRec.callPlayerIDList: return True return False def GetBuyPlayerInfo(zoneID, hmNum): ## »ñȡս³¡¹ºÂòÕÙ¼¯³¡´ÎÍæ¼ÒÐÅÏ¢ ## @return: buyPlayerInfo={playerID:CrossBattlefieldBuy, ...} if zoneID not in PyGameData.g_crossBattlefieldBuyInfo: PyGameData.g_crossBattlefieldBuyInfo[zoneID] = {} buyHMInfo = PyGameData.g_crossBattlefieldBuyInfo[zoneID] if hmNum not in buyHMInfo: buyHMInfo[hmNum] = {} buyPlayerInfo = buyHMInfo[hmNum] return buyPlayerInfo def Sync_CrossBattlefieldDataToClientServer(serverGroupID=0): ''' ͬ²½¿ç·þÕ½³¡Êý¾Ýµ½×Ó·þÎñÆ÷ @param serverGroupID: Ϊ0ʱͬ²½ËùÓÐ×Ó·þ ''' GameWorld.Log("ͬ²½¸ø×Ó·þ¿ç·þÕ½³¡Êý¾Ý: syncServerGroupID=%s" % (serverGroupID)) if serverGroupID: ipyData = CrossRealmPK.GetCrossPKServerGroupZone(serverGroupID) if not ipyData: return crossZoneList = [ipyData] else: crossZoneName = GameWorld.GetCrossZoneName() crossZoneList = IpyGameDataPY.GetIpyGameDataByCondition("CrossZonePK", {"CrossZoneName":crossZoneName}, True) if not crossZoneList: return # ֪ͨ״̬ - È«ÇøÒ»Ö battlefieldState = GetCrossBattlefieldState() dataMsg = {"battlefieldState":battlefieldState} CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_BattlefieldState, dataMsg) for zoneIpyData in crossZoneList: zoneID = zoneIpyData.GetZoneID() serverGroupIDList = [serverGroupID] if serverGroupID else zoneIpyData.GetServerGroupIDList() # ֪ͨ¹ºÂòÐÅÏ¢ Send_CrossServerMsg_BattlefieldBuy(zoneID, serverGroupIDList) return def Send_CrossServerMsg_BattlefieldBuy(zoneID, serverGroupIDList, opData=None): # ֪ͨ×Ó·þ¹ºÂòÐÅÏ¢ buyHMInfo = PyGameData.g_crossBattlefieldBuyInfo.get(zoneID, {}) if opData: hmNum = GetHMNum(opData["openHour"], opData["openMinute"]) hmNumList = [hmNum] else: hmNumList = buyHMInfo.keys() syncBuyHMInfo = {} for hmNum in hmNumList: if hmNum not in buyHMInfo: continue buyPlayerInfo = buyHMInfo[hmNum] syncBuyPlayerInfo = {} for playerID, buyRec in buyPlayerInfo.items(): syncBuyPlayerInfo[playerID] = buyRec.GetSyncClientServerString() syncBuyHMInfo[hmNum] = syncBuyPlayerInfo sendMsg = {"zoneID":zoneID, "syncBuyHMInfo":syncBuyHMInfo, "opData":opData} CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_BattlefieldBuy, sendMsg, serverGroupIDList) return def OnMapServerInitOK(): # ֪ͨµØÍ¼·þÎñÆ÷״̬ SyncMapServerCrossBattlefieldBuyInfo() return def SyncMapServerCrossBattlefieldBuyInfo(): #if not GameWorld.IsCrossServer(): # return syncMapBuyInfo = {} for zoneID, buyHMInfo in PyGameData.g_crossBattlefieldBuyInfo.items(): syncMapBuyInfo[zoneID] = {} for hmNum, buyPlayerInfo in buyHMInfo.items(): buyInfo = {} for playerID, buyRec in buyPlayerInfo.items(): buyInfo[playerID] = {"callPlayerIDList":buyRec.callPlayerIDList, "factionID":buyRec.factionID} syncMapBuyInfo[zoneID][hmNum] = buyInfo GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_CrossBattlefieldCallTeamInfo, syncMapBuyInfo) return def OnMinuteProcess(): if not GameWorld.IsCrossServer(): return Dispose_CrossBattlefieldState() return def __GetCrossBattlefieldTime(isRefreshState=True): key = "CrossBattlefieldTimeInfo" CrossBattlefieldTimeInfo = IpyGameDataPY.GetConfigEx(key) serverTime = GameWorld.GetServerTime() reloadSign = "%d-%d-%d" % (serverTime.year, serverTime.month, serverTime.day) if CrossBattlefieldTimeInfo and CrossBattlefieldTimeInfo[0] == reloadSign: GameWorld.DebugLog("ÒѾ­¼ÓÔØ¹ý±¾ÈÕ¿ç·þÕ½³¡Ê±¼ä״̬ÐÅÏ¢£¡reloadSign=%s" % reloadSign) return False, CrossBattlefieldTimeInfo[1] sysOpenHMList = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldOpen", 1) callOpenHMList = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldOpen", 2) allOpenHMList = sysOpenHMList + callOpenHMList dailyIpyData = IpyGameDataPY.GetIpyGameData("DailyAction", ShareDefine.DailyActionID_CrossBattlefield) fbTotalMinutes = dailyIpyData.GetDuration() if dailyIpyData else 10 openNotifyMinuteList = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldOpen", 3) battleTimeInfoList = [] startDateStr = "%d-%d-%d" % (serverTime.year, serverTime.month, serverTime.day) for openHour, openMinute in allOpenHMList: openDateTime = datetime.datetime.strptime("%s %02d:%02d:00" % (startDateStr, openHour, openMinute), ChConfig.TYPE_Time_Format) closeDateTime = openDateTime + datetime.timedelta(minutes=fbTotalMinutes) notifyOpenTimeDict = {} for notifyOpenMinute in openNotifyMinuteList: notifyOpenDateTime = openDateTime + datetime.timedelta(minutes=-notifyOpenMinute) notifyOpenTimeDict[notifyOpenDateTime] = notifyOpenMinute battleTimeInfoList.append([openHour, openMinute, openDateTime, closeDateTime, notifyOpenTimeDict]) CrossBattlefieldTimeInfo = IpyGameDataPY.SetConfigEx(key, [reloadSign, battleTimeInfoList]) GameWorld.Log("±¾ÈÕ¿ç·þÕ½³¡Ê±¼ä״̬ÐÅÏ¢¼ÓÔØÍê±Ï!reloadSign=%s,isRefreshState=%s" % (reloadSign, isRefreshState)) GameWorld.Log(" allOpenHMList=%s,fbTotalMinutes=%s" % (allOpenHMList, fbTotalMinutes)) GameWorld.Log("=============================================================") if isRefreshState: Dispose_CrossBattlefieldState(True) return True, CrossBattlefieldTimeInfo[1] def Dispose_CrossBattlefieldState(reloadRefresh=False): isReload, battlefieldTimeList = __GetCrossBattlefieldTime(False) isReload = isReload or reloadRefresh # ÕâÀïʱ¼äÐ辫ȷµ½·ÖÖÓ£¬²»È»ºóÃæµÄ±È½Ï»áÆ¥Åä²»µ½ curDateTime = GameWorld.GetServerTime() curDateTime = datetime.datetime.strptime("%d-%d-%d %d:%d:00" % (curDateTime.year, curDateTime.month, curDateTime.day, curDateTime.hour, curDateTime.minute), ChConfig.TYPE_Time_Format) battlefieldState = 0 for openHour, openMinute, openDateTime, closeDateTime, notifyOpenTimeDict in battlefieldTimeList: # È«·þ¹ã²¥ÌáʾÐÅÏ¢ if curDateTime in notifyOpenTimeDict: notifyOpenMinute = notifyOpenTimeDict[curDateTime] __DoBattlefieldOpenNotify(openHour, openMinute, notifyOpenMinute) if openDateTime <= curDateTime < closeDateTime: battlefieldState = openHour * 100 + openMinute stateKey = ShareDefine.Def_Notify_WorldKey_DailyActionState % ShareDefine.DailyActionID_CrossBattlefield gameWorld = GameWorld.GetGameWorld() beforeState = gameWorld.GetDictByKey(stateKey) if not isReload and beforeState == battlefieldState: #ÒѾ­ÊÇÕâ¸ö״̬ÁË return GameWorld.SendMapServerMsgEx(stateKey, battlefieldState) #֪ͨMapserver,ÉèÖÃ×Öµä gameWorld.SetDict(stateKey, battlefieldState) #¸üÐÂ×ÖµäÖµ GameWorld.Log("¿ç·þÕ½³¡×´Ì¬±ä¸ü: beforeState=%s,battlefieldState=%s" % (beforeState, battlefieldState)) # ¿ªÆô¸±±¾ if battlefieldState and beforeState != battlefieldState: # ÒÆ³ýÒѾ­´æÔڵĸ±±¾Ïß· PyGameData.g_crossDynamicLineInfo.pop(ChConfig.Def_FBMapID_CrossBattlefield, None) crossZoneName = GameWorld.GetCrossZoneName() crossZoneList = IpyGameDataPY.GetIpyGameDataByCondition("CrossZonePK", {"CrossZoneName":crossZoneName}, True) if not crossZoneList: crossZoneList = [] hmNum = battlefieldState openHour, openMinute = GetHMByNum(hmNum) sysOpenHMList = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldOpen", 1) for zoneIpyData in crossZoneList: zoneID = zoneIpyData.GetZoneID() seasonState = gameWorld.GetDictByKey(ChConfig.Def_WorldKey_CrossPKZoneSeasonState % zoneID) if seasonState != 1: GameWorld.Log(" ¿ç·þPKÈü¼¾Î´¿ªÆôÖУ¬¿ç·þÕ½³¡²»¿ªÆô£¡ zoneID=%s" % zoneID) continue # ϵͳ¾ÖÈ·±£Ã¿¸öµÈ¼¶¶Î¶¼ÓÐÒ»³¡ if [openHour, openMinute] in sysOpenHMList: dynamicLineLVRangeDict = IpyGameDataPY.GetFuncEvalCfg("CrossDynamicLineMap", 4, {}) lvRangeInfoList = dynamicLineLVRangeDict.get(ChConfig.Def_FBMapID_CrossBattlefield, []) GameWorld.Log(" ¿ªÆôÕ½³¡ÏµÍ³¾Ö£¬È·±£Ã¿¸öµÈ¼¶¶Î¶¼ÓÐÒ»³¡: zoneID=%s,lvRangeInfoList=%s" % (zoneID, lvRangeInfoList)) if lvRangeInfoList: funcLineIDList = range(len(lvRangeInfoList)) PlayerFB.OpenCrossDynamicLineBySys(zoneID, ChConfig.Def_FBMapID_CrossBattlefield, funcLineIDList, True) # ÓйºÂòµÄ³¡´ÎĬÈÏÖ»¿ªÒ»³¡ else: buyHMInfo = PyGameData.g_crossBattlefieldBuyInfo.get(zoneID, {}) if hmNum in buyHMInfo and len(buyHMInfo[hmNum]) > 0: GameWorld.Log(" ÓÐÕÙ¼¯µÄ³¡´Î¿ªÆô·ÖÇøÕ½³¡! zoneID=%s" % (zoneID)) funcLineIDList = [0] PlayerFB.OpenCrossDynamicLineBySys(zoneID, ChConfig.Def_FBMapID_CrossBattlefield, funcLineIDList, True) else: GameWorld.Log(" ÎÞÕÙ¼¯µÄ³¡´Î²»¿ª·ÖÇøÕ½³¡! zoneID=%s" % (zoneID)) # ͬ²½×Ó·þÎñÆ÷ dataMsg = {"battlefieldState":battlefieldState} CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_BattlefieldState, dataMsg) return def __DoBattlefieldOpenNotify(openHour, openMinute, notifyOpenMinute): ''' Ö´Ðпç·þÕ½³¡¿ªÆô¹ã²¥ ¿ç·þPKÈü¼¾Î´¿ªÆô״̬Ï£¬¿ç·þÕ½³¡Í¬²½¹Ø±Õ£¬¹ÊÒ²²»¹ã²¥ »¹ÒªÏÞÖÆ¿ª·þÌ쿪Æô ''' gameWorld = GameWorld.GetGameWorld() sysOpenHMList = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldOpen", 1) if [openHour, openMinute] in sysOpenHMList: crossZoneName = GameWorld.GetCrossZoneName() crossZoneList = IpyGameDataPY.GetIpyGameDataByCondition("CrossZonePK", {"CrossZoneName":crossZoneName}, True) if not crossZoneList: return for zoneIpyData in crossZoneList: zoneID = zoneIpyData.GetZoneID() seasonState = gameWorld.GetDictByKey(ChConfig.Def_WorldKey_CrossPKZoneSeasonState % zoneID) if seasonState != 1: GameWorld.DebugLog("¿ç·þPKÈü¼¾Î´¿ªÆôÖУ¬¿ç·þÕ½³¡ÏµÍ³¿ªÆô¹ã²¥²»´¦Àí£¡") continue serverGroupIDList = zoneIpyData.GetServerGroupIDList() PlayerControl.WorldNotifyCross(serverGroupIDList, 0, "CrossBattlefieldOpenSys", [notifyOpenMinute]) return curHMNum = GetHMNum(openHour, openMinute) for zoneID, buyHMInfo in PyGameData.g_crossBattlefieldBuyInfo.items(): seasonState = gameWorld.GetDictByKey(ChConfig.Def_WorldKey_CrossPKZoneSeasonState % zoneID) if seasonState != 1: GameWorld.DebugLog("¿ç·þPKÈü¼¾Î´¿ªÆôÖУ¬¿ç·þÕ½³¡Íæ¼Ò¿ªÆô¹ã²¥²»´¦Àí£¡") continue zoneIpyData = CrossRealmPlayer.GetCrossZoneIpyDataByZoneID(ChConfig.Def_FBMapID_CrossBattlefield, zoneID) if zoneIpyData: continue serverGroupIDList = zoneIpyData.GetServerGroupIDList() if curHMNum not in buyHMInfo: continue buyPlayerInfo = buyHMInfo[curHMNum] if not buyPlayerInfo: continue matchTickSortList = sorted(buyPlayerInfo.values(), key=operator.attrgetter("buyTime")) buyRec = matchTickSortList[0] PlayerControl.WorldNotifyCross(serverGroupIDList, 0, "CrossBattlefieldOpenPlayer", [buyRec.playerName, notifyOpenMinute]) return def GetCrossBattlefieldOpenTime(zoneID): ## »ñÈ¡¿ç·þÕ½³¡¸±±¾µ±Ç°ÊÇ·ñ¿ª·ÅµÄʱ¼äµã # @return: None-µ±Ç°Î´¿ª·Å£» # @return: hour, minute - µ±Ç°¿ª·ÅÖеÄʱ¼äʱ·Ö£¬¿É½øÈë gameWorld = GameWorld.GetGameWorld() hmNum = GetCrossBattlefieldState() if not hmNum: return seasonState = gameWorld.GetDictByKey(ChConfig.Def_WorldKey_CrossPKZoneSeasonState % zoneID) if seasonState != 1: return openHour, openMinute = GetHMByNum(hmNum) sysOpenHMList = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldOpen", 1) isCallBattle = [openHour, openMinute] not in sysOpenHMList if isCallBattle: if zoneID not in PyGameData.g_crossBattlefieldBuyInfo: GameWorld.DebugLog("¸Ã·ÖÇøÃ»ÓÐʹÓÃÕÙ¼¯Á zoneID=%s" % zoneID) return buyHMInfo = PyGameData.g_crossBattlefieldBuyInfo[zoneID] if hmNum not in buyHMInfo: GameWorld.DebugLog("¸Ãʱ¶Î»¹Î´Ê¹ÓÃÕÙ¼¯Á zoneID=%s,hmNum=%s" % (zoneID, hmNum)) return return isCallBattle, openHour, openMinute def GetCallPlayerCopymapObj(playerID, serverGroupID, mapID, funcLineID, zoneID, copyMapPlayerMax, includeOffline, tick): ## »ñÈ¡Íæ¼ÒÕÙ¼¯Áî¶ÓÎé¶ÔÓ¦µÄ¸±±¾·ÖÏß ## @return tagCopyMapObj hmNum = GetCrossBattlefieldState() if not hmNum: return if mapID not in PyGameData.g_crossDynamicLineInfo: PyGameData.g_crossDynamicLineInfo[mapID] = {} zoneLineDict = PyGameData.g_crossDynamicLineInfo[mapID] # ¿ç·þ¶¯Ì¬Ïß·ÐÅÏ¢ {dataMapID:{(zoneID, funcLineID):[CrossFuncLineInfo, CrossFuncLineInfo, ...], ...}, ...} zoneLineKey = (zoneID, funcLineID) if zoneLineKey not in zoneLineDict: zoneLineDict[zoneLineKey] = [] funcLineObjList = zoneLineDict[zoneLineKey] if not funcLineObjList: return # ÕÙ¼¯Á´Î£¬Ã¿¸ö·ÖÇø¹Ì¶¨Ö»ÓÐÒ»³¡ for _, funcLineObj in enumerate(funcLineObjList, 1): realMapID, copyMapID = funcLineObj.realMapID, funcLineObj.copyMapID if not realMapID: continue key = (realMapID, copyMapID) if key not in PyGameData.g_crossDynamicLineCopyMapInfo: continue copyMapObj = PyGameData.g_crossDynamicLineCopyMapInfo[key] if copyMapObj.zoneID != zoneID: continue # ÕÙ¼¯Áî³ÉÔ±²»ÊÜÈËÊýÏÞÖÆ buyHMInfo = PyGameData.g_crossBattlefieldBuyInfo.get(zoneID, {}) if hmNum not in buyHMInfo: continue buyPlayerInfo = buyHMInfo[hmNum] for buyRec in buyPlayerInfo.values(): if playerID in buyRec.callPlayerIDList: GameWorld.DebugLog("ÕÙ¼¯Áî³ÉÔ±²»ÊÜÈËÊýÏÞÖÆ£¬¿É½øÈ룡 playerID=%s" % playerID) return copyMapObj canEnter = copyMapObj.OnRequestEnterCrossCopyMap(playerID, tick, copyMapPlayerMax, includeOffline) if canEnter: return copyMapObj return def ClientServerMsg_BattlefieldBuyOpen(serverGroupID, msgData): if not GameWorld.IsCrossServer(): return zoneIpyData = CrossRealmPK.GetCrossPKServerGroupZone(serverGroupID) if not zoneIpyData: return zoneID = zoneIpyData.GetZoneID() gameWorld = GameWorld.GetGameWorld() seasonState = gameWorld.GetDictByKey(ChConfig.Def_WorldKey_CrossPKZoneSeasonState % zoneID) if seasonState != 1: GameWorld.Log("¿ç·þPKÈü¼¾Î´¿ªÆôÖУ¬¿ç·þÕ½³¡Ò²²»ÄÜ¿ªÆô£¬ÎÞ·¨¹ºÂò£¡") return playerID = msgData["playerID"] # ½ÇÉ«ID playerName = msgData["playerName"] # Íæ¼ÒÃû job = msgData["playerJob"] # Ö°Òµ playerLV = msgData["playerLV"] # Ö°Òµ realmLV = msgData["realmLV"] # ¾³½ç fightPower = msgData["fightPower"] # Õ½¶·Á¦ buyOpenCountWeek = msgData["buyOpenCountWeek"] # ±¾ÖÜÒѹºÂòÕÙ¼¯³¡´Î openHour = msgData["openHour"] openMinute = msgData["openMinute"] faction = msgData["faction"] hmNum = GetHMNum(openHour, openMinute) if zoneID not in PyGameData.g_crossBattlefieldBuyInfo: PyGameData.g_crossBattlefieldBuyInfo[zoneID] = {} buyHMInfo = PyGameData.g_crossBattlefieldBuyInfo[zoneID] if hmNum not in buyHMInfo: buyHMInfo[hmNum] = {} buyPlayerInfo = buyHMInfo[hmNum] if playerID in buyPlayerInfo: GameWorld.Log("Íæ¼ÒÒѾ­¹ºÂò¹ý¸ÃÕÙ¼¯³¡´Î£¡ zoneID=%s,openHour=%s,openMinute=%s" % (zoneID, openHour, openMinute), playerID) return curFactionCount, othFactionCount = 0, 0 for callPlayerID, buyRec in buyPlayerInfo.items(): if buyRec.factionID == faction: curFactionCount += 1 else: othFactionCount += 1 if playerID in buyRec.callPlayerIDList: GameWorld.Log("Íæ¼ÒÒѾ­ÔÚ¸ÃÕÙ¼¯³¡´ÎÕóÓªÀ zoneID=%s,openHour=%s,openMinute=%s,callPlayerID=%s,callPlayerIDList=%s" % (zoneID, openHour, openMinute, callPlayerID, buyRec.callPlayerIDList), playerID) return if curFactionCount > othFactionCount: GameWorld.Log("ÕóӪƽºâÏÞÖÆ£¬²»¿ÉÔÙ¹ºÂò¸Ã¿ç·þÕ½³¡ÕóÓª£¡ zoneID=%s,openHour=%s,openMinute=%s,faction=%s,curFactionCount(%s) > othFactionCount(%s)" % (zoneID, openHour, openMinute, faction, curFactionCount, othFactionCount), playerID) return # ================ ¿ÉÒÔ¹ºÂò£¬ÒÔÏÂÖ´ÐÐÌí¼Ó¹ºÂò³¡´ÎÕóÓªÂß¼­ ================ # ¸üлº´æ curCache = PlayerViewCache.FindViewCache(playerID, True) if curCache: cacheDict = PlayerViewCache.GetCachePropDataDict(curCache) cacheDict["Name"] = playerName cacheDict["Job"] = job cacheDict["LV"] = playerLV cacheDict["RealmLV"] = realmLV cacheDict["FightPower"] = fightPower # ÐÂÔö³¡´Î¹ºÂò¼Ç¼ buyTime = int(time.time()) buyRec = CrossBattlefieldBuy() buyRec.buyTime = buyTime buyRec.zoneID = zoneID buyRec.hmNum = hmNum buyRec.playerID = playerID buyRec.factionID = faction buyRec.callPlayerIDList = [playerID] buyPlayerInfo[playerID] = buyRec # Éϰñ billboardCallCountLimit = IpyGameDataPY.GetFuncCfg("CrossBattlefieldBillboard", 1) # ÖÜÕÙ¼¯°ñÉϰñÖÁÉÙ´ÎÊý groupValue1, dataID, name1, name2 = zoneID, playerID, playerName, "" type2, value1, value2 = job, realmLV, 0 cmpValue = buyOpenCountWeek + 1 if cmpValue >= billboardCallCountLimit: CrossBillboard.UpdCrossBillboard(ShareDefine.Def_CBT_BattlefieldWCall, groupValue1, dataID, name1, name2, type2, value1, value2, cmpValue) SyncMapServerCrossBattlefieldBuyInfo() # ֪ͨ×Ó·þ serverGroupIDList = zoneIpyData.GetServerGroupIDList() msgData.update({"opType":"BuyOpen", "buyTime":buyTime}) Send_CrossServerMsg_BattlefieldBuy(zoneID, serverGroupIDList, msgData) return def ClientServerMsg_BattlefieldCallJoin(serverGroupID, msgData): # "openHour":openHour, "openMinute":openMinute, "buyPlayerID":buyPlayerID, "tagPlayerID":tagPlayerID, "playerID":playerID openHour = msgData["openHour"] openMinute = msgData["openMinute"] buyPlayerID = msgData["buyPlayerID"] tagPlayerID = msgData["tagPlayerID"] playerID = msgData["playerID"] zoneIpyData = CrossRealmPK.GetCrossPKServerGroupZone(serverGroupID) if not zoneIpyData: return zoneID = zoneIpyData.GetZoneID() hmNum = GetHMNum(openHour, openMinute) buyPlayerInfo = GetBuyPlayerInfo(zoneID, hmNum) if buyPlayerID not in buyPlayerInfo: GameWorld.ErrLog("¿ç·þÕ½³¡²»´æÔÚ¸ÃÍæ¼ÒµÄÕÙ¼¯¶ÓÎé! hmNum=%s,buyPlayerID=%s" % (hmNum, buyPlayerID), playerID) return buyRec = buyPlayerInfo[buyPlayerID] callTeamMemMax = IpyGameDataPY.GetFuncCfg("CrossBattlefieldCall", 1) if len(buyRec.callPlayerIDList) >= callTeamMemMax: GameWorld.ErrLog("¿ç·þÕ½³¡ÕÙ¼¯ÈËÊýÒÑÂú! hmNum=%s,buyPlayerID=%s,callPlayerIDList=%s" % (hmNum, buyPlayerID, buyRec.callPlayerIDList), playerID) return if tagPlayerID not in buyRec.callPlayerIDList: buyRec.callPlayerIDList.append(tagPlayerID) SyncMapServerCrossBattlefieldBuyInfo() serverGroupIDList = zoneIpyData.GetServerGroupIDList() msgData.update({"opType":"CallJoin"}) Send_CrossServerMsg_BattlefieldBuy(zoneID, serverGroupIDList, msgData) return def ClientServerMsg_BattlefieldCallKick(serverGroupID, msgData): # "openHour":openHour, "openMinute":openMinute, "buyPlayerID":buyPlayerID, "tagPlayerID":tagPlayerID, "playerID":playerID openHour = msgData["openHour"] openMinute = msgData["openMinute"] buyPlayerID = msgData["buyPlayerID"] tagPlayerID = msgData["tagPlayerID"] playerID = msgData["playerID"] zoneIpyData = CrossRealmPK.GetCrossPKServerGroupZone(serverGroupID) if not zoneIpyData: return zoneID = zoneIpyData.GetZoneID() hmNum = GetHMNum(openHour, openMinute) buyPlayerInfo = GetBuyPlayerInfo(zoneID, hmNum) if buyPlayerID not in buyPlayerInfo: GameWorld.ErrLog("¿ç·þÕ½³¡²»´æÔÚ¸ÃÍæ¼ÒµÄÕÙ¼¯¶ÓÎé! hmNum=%s,buyPlayerID=%s" % (hmNum, buyPlayerID), playerID) return buyRec = buyPlayerInfo[buyPlayerID] if tagPlayerID not in buyRec.callPlayerIDList: GameWorld.ErrLog("¿ç·þÕ½³¡ÕÙ¼¯¶ÓÎéûÓиÃÍæ¼Ò! hmNum=%s,buyPlayerID=%s,tagPlayerID=%s not in callPlayerIDList=%s" % (hmNum, buyPlayerID, tagPlayerID, buyRec.callPlayerIDList), playerID) return buyRec.callPlayerIDList.remove(tagPlayerID) SyncMapServerCrossBattlefieldBuyInfo() serverGroupIDList = zoneIpyData.GetServerGroupIDList() msgData.update({"opType":"CallKick"}) Send_CrossServerMsg_BattlefieldBuy(zoneID, serverGroupIDList, msgData) return def MapServer_CrossBattlefieldOver(msgList): ## ¿ç·þÕ½³¡µØÍ¼½áËã overTime = int(time.time()) hmNum = GetCrossBattlefieldState() fbPropertyID, zoneID, funcLineID, winnerFaction, superItemInfo, finalSuperItemPlayerID, finalSuperItemPlayerName, superItemPlayerIDList, scoreKingID, scoreKingName, battlePlayerList = msgList GameWorld.Log("¿ç·þÕ½³¡µØÍ¼Í¬²½½á¹û: hmNum=%s,zoneID=%s,funcLineID=%s,winnerFaction=%s,superItemInfo=%s,finalSuperItemPlayerID=%s,superItemPlayerIDList=%s,scoreKingID=%s,battlePlayerCount=%s" % (hmNum, zoneID, funcLineID, winnerFaction, superItemInfo, finalSuperItemPlayerID, superItemPlayerIDList, scoreKingID, len(battlePlayerList)), fbPropertyID) winnerOrderAwardDict = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldAward", 2, {}) # ʤÀû·½Ãû´Î¶ÔÓ¦½±ÀøÎïÆ·Áбí {"Ãû´Î":[[ÎïÆ·ID,¸öÊý,ÊÇ·ñÅÄÆ·], ...], ...} , Ãû´ÎÅäÖÃÖ§³Ö¶ÎÅäÖà loserOrderAwardDict = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldAward", 3, {}) # ʧ°Ü·½Ãû´Î¶ÔÓ¦½±ÀøÎïÆ·Áбí {"Ãû´Î":[[ÎïÆ·ID,¸öÊý,ÊÇ·ñÅÄÆ·], ...], ...} , Ãû´ÎÅäÖÃÖ§³Ö¶ÎÅäÖà winnerAwardList = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldAward", 4) # ʤÀû·½¹Ì¶¨½áËã½±ÀøÁбí [[ÎïÆ·ID,¸öÊý,ÊÇ·ñÅÄÆ·], ...] loserAwardList = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldAward", 5) # ʧ°Ü·½¹Ì¶¨½áËã½±ÀøÁбí [[ÎïÆ·ID,¸öÊý,ÊÇ·ñÅÄÆ·], ...] winnerOrderIntAwardDict = {int(k):v for k, v in winnerOrderAwardDict.items()} loserOrderIntAwardDict = {int(k):v for k, v in loserOrderAwardDict.items()} billboardEnterCountLimit = IpyGameDataPY.GetFuncCfg("CrossBattlefieldBillboardJoin", 1) # ÖܲÎÓë°ñÉϰñÖÁÉÙ´ÎÊý syncPlayerDataInfo = {} winnerPlayerIDList, loserPlayerIDList = [], [] for playerInfo in battlePlayerList: playerID, job, realmLV, name, \ isWinner, faction, rank, score, highScoreToday, highScoreWeekTotal, enterCountWeek, \ isCallOpen, isCalled, killCnt, ckillCntInfo, killBossCnt, killScoreKing, killGuardCnt, auraScore, superItemAwardCnt, \ factionBuffCollCnt, personBuffCollCnt, crystalCollCnt, wallCollCnt \ = playerInfo paramList = [rank] if faction == winnerFaction: winnerPlayerIDList.append(playerID) orderAwardMailKey = "CrossBattlefieldOrderWin" orderAwardItemList = GameWorld.GetOrderValueByDict(winnerOrderIntAwardDict, rank) GameWorld.Log(" »ñʤÕóÓªÍæ¼Ò: faction=%s,rank=%s,playerID=%s" % (faction, rank, playerID), fbPropertyID) else: loserPlayerIDList.append(playerID) orderAwardMailKey = "CrossBattlefieldOrderLose" orderAwardItemList = GameWorld.GetOrderValueByDict(loserOrderIntAwardDict, rank) GameWorld.Log(" ʧ°ÜÕóÓªÍæ¼Ò: faction=%s,rank=%s,playerID=%s" % (faction, rank, playerID), fbPropertyID) # ÅÅÃû½±ÀøÓʼþ PlayerCompensation.SendMailByKey(orderAwardMailKey, [playerID], orderAwardItemList, paramList, crossMail=True) # ¸üÐÂÖܲÎÓë°ñµ¥ groupValue1, dataID, name1, name2 = zoneID, playerID, name, "" type2, value1, value2 = job, realmLV, 0 enterCountWeek += 1 cmpValue = enterCountWeek if cmpValue >= billboardEnterCountLimit: CrossBillboard.UpdCrossBillboard(ShareDefine.Def_CBT_BattlefieldWJoin, groupValue1, dataID, name1, name2, type2, value1, value2, cmpValue) # ¸üÐÂÖܸ߷ְñµ¥ if score > highScoreToday: highScoreWeekTotal += (score - highScoreToday) highScoreToday = score cmpValue = highScoreWeekTotal CrossBillboard.UpdCrossBillboard(ShareDefine.Def_CBT_BattlefieldWScore, groupValue1, dataID, name1, name2, type2, value1, value2, cmpValue) GameWorld.Log(" Õ½³¡ÕóÓªÍæ¼Ò: faction=%s,isWinner=%s,rank=%s,playerID=%s,score=%s,highScoreToday=%s,highScoreWeekTotal=%s,enterCountWeek=%s,isCallOpen=%s,isCalled=%s" % (faction, isWinner, rank, playerID, score, highScoreToday, highScoreWeekTotal, enterCountWeek, isCallOpen, isCalled), fbPropertyID) syncPlayerDataInfo[playerID] = [isWinner, faction, rank, score, highScoreToday, highScoreWeekTotal, enterCountWeek, isCallOpen, isCalled, killCnt, ckillCntInfo, killBossCnt, killScoreKing, killGuardCnt, auraScore, superItemAwardCnt, factionBuffCollCnt, personBuffCollCnt, crystalCollCnt, wallCollCnt] # ²ÎÓë½±ÀøÓʼþ if winnerPlayerIDList: PlayerCompensation.SendMailByKey("CrossBattlefieldJoinWin", winnerPlayerIDList, winnerAwardList, crossMail=True) if loserPlayerIDList: PlayerCompensation.SendMailByKey("CrossBattlefieldJoinLose", loserPlayerIDList, loserAwardList, crossMail=True) # ´ó½±»ñµÃÕßÓʼþ superItemID, superItemCount = 0, 0 if superItemPlayerIDList and superItemInfo and len(superItemInfo) == 3: superItemID, superItemCount = superItemInfo[0], superItemInfo[1] for superItemPlayerID in superItemPlayerIDList: PlayerCompensation.SendMailByKey("CrossBattlefieldSuperAward", [superItemPlayerID], [superItemInfo], crossMail=True) crossZoneName = GameWorld.GetCrossZoneName() zoneIpyData = IpyGameDataPY.GetIpyGameData("CrossZonePK", crossZoneName, zoneID) serverGroupIDList = zoneIpyData.GetServerGroupIDList() if zoneIpyData else [] # ֪ͨ×Ó·þ¸üвÎÓëÍæ¼ÒÊý¾Ý sendMsg = {"zoneID":zoneID, "overTime":overTime, "syncPlayerDataInfo":syncPlayerDataInfo} CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_BattlefieldOver, sendMsg, serverGroupIDList) # ½áËã¹ã²¥ nextBattleTimeStr = "" openHour, openMinute = GetHMByNum(hmNum) sysOpenHMList = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldOpen", 1) callOpenHMList = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldOpen", 2) allOpenHMList = sysOpenHMList + callOpenHMList allOpenHMList.sort() if [openHour, openMinute] in allOpenHMList: nextOpenIndex = allOpenHMList.index([openHour, openMinute]) + 1 nextOpenHour, nextOpenMinute = allOpenHMList[nextOpenIndex] if len(allOpenHMList) > nextOpenIndex else allOpenHMList[0] nextBattleTimeStr = "%02d:%02d" % (nextOpenHour, nextOpenMinute) # ±¾·ÖÇøÈ«·þ£ºXXÕóӪʤÀû£¬xxxΪ±¾³¡»ý·ÖÍõ£¬xxx»ñµÃÁ˹ÅÉñ´ó½±XXX£¬Ï¸ö³¡´ÎÔ¤¼Æ½«ÔÚXXµã¿ª·Å¡£ if battlePlayerList: msgParamList = [winnerFaction, scoreKingName, finalSuperItemPlayerName, superItemID, superItemCount, nextBattleTimeStr] PlayerControl.WorldNotifyCross(serverGroupIDList, 0, "CrossBattlefieldOver", msgParamList) return #################################################################################################### def CrossServerMsg_BattlefieldState(msgData): battlefieldState = msgData["battlefieldState"] gameWorld = GameWorld.GetGameWorld() seasonState = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossPKSeasonState) beforeState = GetCrossBattlefieldState() beforeState = beforeState if (beforeState and seasonState == 1) else 0 realBattlefieldState = battlefieldState if (battlefieldState and seasonState == 1) else 0 GameWorld.DebugLog("ÊÕµ½¿ç·þ·þÎñÆ÷ͬ²½µÄÕ½³¡×´Ì¬: battlefieldState=%s,seasonState=%s,beforeState=%s,realBattlefieldState=%s" % (battlefieldState, seasonState, beforeState, realBattlefieldState)) key = ShareDefine.Def_Notify_WorldKey_DailyActionState % ShareDefine.DailyActionID_CrossBattlefield gameWorld.SetDict(key, realBattlefieldState) GameWorld.SendMapServerMsgEx(key, realBattlefieldState) return def CrossServerMsg_BattlefieldOver(msgData): GameWorld.DebugLog("ÊÕµ½¿ç·þ·þÎñÆ÷ͬ²½µÄÕ½³¡½áËãÐÅÏ¢: %s" % msgData) zoneID = msgData["zoneID"] overTime = msgData["overTime"] syncPlayerDataInfo = msgData["syncPlayerDataInfo"] gameWorld = GameWorld.GetGameWorld() pkZoneID = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossPKZoneID) if zoneID != pkZoneID: GameWorld.ErrLog("·Ç±¾·þËùÊô·ÖÇøµÄ¿ç·þÕ½³¡¹ºÂòÐÅÏ¢! pkZoneID(%s) != zoneID(%s) %s" % (pkZoneID, zoneID, str(msgData))) return for playerID, playerData in syncPlayerDataInfo.items(): if PlayerControl.GetDBPlayerAccIDByID(playerID): msgInfo = ["BattlefieldOver", [overTime] + playerData] CrossRealmPlayer.MapServer_QueryCrossPlayerResult(playerID, "CrossBattlefield", msgInfo) return def CrossServerMsg_BattlefieldBuy(msgData): GameWorld.DebugLog("ÊÕµ½¿ç·þ·þÎñÆ÷ͬ²½µÄÕ½³¡¹ºÂòÐÅÏ¢: %s" % msgData) zoneID = msgData["zoneID"] syncBuyHMInfo = msgData["syncBuyHMInfo"] opData = msgData.get("opData", {}) gameWorld = GameWorld.GetGameWorld() pkZoneID = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossPKZoneID) if zoneID != pkZoneID: GameWorld.ErrLog("·Ç±¾·þËùÊô·ÖÇøµÄ¿ç·þÕ½³¡¹ºÂòÐÅÏ¢! pkZoneID(%s) != zoneID(%s) %s" % (pkZoneID, zoneID, str(msgData))) return if not syncBuyHMInfo: PyGameData.g_crossBattlefieldBuyInfo.pop(zoneID, None) # ¸üÐÂÊý¾Ý for hmNum, syncBuyPlayerInfo in syncBuyHMInfo.items(): buyPlayerInfo = GetBuyPlayerInfo(zoneID, hmNum) for buyPlayerID, attrDict in syncBuyPlayerInfo.items(): buyRec = CrossBattlefieldBuy() buyRec.SetAttr(attrDict) buyPlayerInfo[buyPlayerID] = buyRec SyncMapServerCrossBattlefieldBuyInfo() if not opData or "opType" not in opData: SyncCrossBattlefieldBuyInfo(None, zoneID) return opType = opData["opType"] openHour = opData["openHour"] openMinute = opData["openMinute"] hmNum = GetHMNum(openHour, openMinute) SyncCrossBattlefieldBuyInfo(None, zoneID, hmNum) if opType == "BuyOpen": playerID = opData["playerID"] playerName = opData["playerName"] PlayerControl.WorldNotify(0, "CrossBattlefieldBuyOpen", [playerName, "%d:%02d" % (openHour, openMinute)]) if PlayerControl.GetDBPlayerAccIDByID(playerID): faction = opData["faction"] buyTime = opData["buyTime"] todayBuyOpenCount = opData["todayBuyOpenCount"] msgInfo = ["BattlefieldBuy", [openHour, openMinute, faction, todayBuyOpenCount, buyTime]] CrossRealmPlayer.MapServer_QueryCrossPlayerResult(playerID, "CrossBattlefield", msgInfo) elif opType == "CallJoin": pass elif opType == "CallKick": pass return def SyncCrossBattlefieldBuyInfo(curPlayer, zoneID, hmNum=None): ## ֪ͨս³¡ÕÙ¼¯³¡´Î¹ºÂòÐÅÏ¢ buyHMInfo = PyGameData.g_crossBattlefieldBuyInfo.get(zoneID, {}) hmNumList = [hmNum] if hmNum != None else buyHMInfo.keys() clientPack = ChPyNetSendPack.tagGCCrossBattlefieldBuyInfo() clientPack.HMBuyList = [] for hmNum in hmNumList: h, m = GetHMByNum(hmNum) hmPack = ChPyNetSendPack.tagGCCrossBattlefieldBuyHM() hmPack.Hour = h hmPack.Minute = m hmPack.BuyPlayerList = [] buyPlayerInfo = GetBuyPlayerInfo(zoneID, hmNum) for buyPlayerID, buyRec in buyPlayerInfo.items(): buyPlayerPack = ChPyNetSendPack.tagGCCrossBattlefieldBuyPlayer() buyPlayerPack.BuyPlayerID = buyPlayerID buyPlayerPack.Faction = buyRec.factionID buyPlayerPack.FactionPlayerList = [] for callPlayerID in buyRec.callPlayerIDList: playerPack = ChPyNetSendPack.tagGCCrossBattlefieldPlayer() playerPack.PlayerID = callPlayerID if callPlayerID in buyRec.callPlayerDict: factionPlayerInfo = buyRec.callPlayerDict[callPlayerID] fightPower = factionPlayerInfo["FightPower"] playerPack.PlayerName = factionPlayerInfo["Name"] playerPack.Job = factionPlayerInfo["Job"] playerPack.LV = factionPlayerInfo["LV"] playerPack.RealmLV = factionPlayerInfo["RealmLV"] playerPack.FightPower = fightPower % ShareDefine.Def_PerPointValue playerPack.FightPowerEx = fightPower / ShareDefine.Def_PerPointValue buyPlayerPack.FactionPlayerList.append(playerPack) buyPlayerPack.FactionPlayerCount = len(buyPlayerPack.FactionPlayerList) hmPack.BuyPlayerList.append(buyPlayerPack) hmPack.BuyPlayerCount = len(hmPack.BuyPlayerList) clientPack.HMBuyList.append(hmPack) clientPack.HMCount = len(clientPack.HMBuyList) if curPlayer: NetPackCommon.SendFakePack(curPlayer, clientPack) else: # ¹ã²¥È«·þÍæ¼Ò playerManager = GameWorld.GetPlayerManager() for i in xrange(playerManager.GetPlayerCount()): curPlayer = playerManager.GetPlayerByIndex(i) if curPlayer == None or not curPlayer.GetInitOK() or PlayerControl.GetIsTJG(curPlayer): continue NetPackCommon.SendFakePack(curPlayer, clientPack) return #// C0 07 ¿ç·þÕ½³¡¼ÓÈëÕÙ¼¯³¡´Î #tagCGCrossBattlefieldJoinByCall # #struct tagCGCrossBattlefieldJoinByCall #{ # tagHead Head; # BYTE Hour; //Õ½³¡¿ªÆôʱ # BYTE Minute; //Õ½³¡¿ªÆô·Ö # DWORD BuyPlayerID; //¼ÓÈëÄ¿±êÍæ¼ÒµÄÕÙ¼¯¶ÓÎ飬¼´¹ºÂòÕÙ¼¯³¡µÄÍæ¼ÒID #}; def OnCrossBattlefieldJoinByCall(index, clientData, tick): if GameWorld.IsCrossServer(): return curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) playerID = curPlayer.GetPlayerID() openHour = clientData.Hour openMinute = clientData.Minute buyPlayerID = clientData.BuyPlayerID tagPlayerID = playerID 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, openHour, openMinute) startDateTime = GameWorld.ChangeStrToDatetime(startTimeStr) endBuyDateTime = startDateTime + datetime.timedelta(minutes=-closeBuyMinute) if crossServerDateTime >= endBuyDateTime: GameWorld.Log("¸Ãʱ¼äµãÕ½³¡ÒѹرÕÕÙ¼¯£¬²»ÄÜÔÙÕÙ¼¯¼ÓÈë! openHour=%s,openMinute=%s,crossServerDateTime(%s) >= endBuyDateTime(%s)" % (openHour, openMinute, crossServerDateTime, endBuyDateTime), playerID) return serverGroupID = GameWorld.GetServerGroupID() zoneIpyData = CrossRealmPK.GetCrossPKServerGroupZone(serverGroupID) if not zoneIpyData: return zoneID = zoneIpyData.GetZoneID() hmNum = GetHMNum(openHour, openMinute) buyPlayerInfo = GetBuyPlayerInfo(zoneID, hmNum) if buyPlayerID not in buyPlayerInfo: GameWorld.ErrLog("²»´æÔÚ¸ÃÍæ¼ÒµÄ¿ç·þÕ½³¡ÕÙ¼¯¶ÓÎé! hmNum=%s,buyPlayerID=%s" % (hmNum, buyPlayerID), playerID) return buyRec = buyPlayerInfo[buyPlayerID] callTeamMemMax = IpyGameDataPY.GetFuncCfg("CrossBattlefieldCall", 1) if len(buyRec.callPlayerIDList) >= callTeamMemMax: GameWorld.DebugLog("ÕÙ¼¯ÈËÊýÒÑÂú! hmNum=%s,buyPlayerID=%s,callPlayerIDList=%s" % (hmNum, buyPlayerID, buyRec.callPlayerIDList), playerID) return # ÇëÇó²éѯ¿ç·þ·þÎñÆ÷ dataMsg = {"openHour":openHour, "openMinute":openMinute, "buyPlayerID":buyPlayerID, "tagPlayerID":tagPlayerID, "playerID":playerID} CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_BattlefieldCallJoin, dataMsg) return #// C0 08 ¿ç·þÕ½³¡ÕÙ¼¯³¡´ÎÌßÈË #tagCGCrossBattlefieldCallKick # #struct tagCGCrossBattlefieldCallKick #{ # tagHead Head; # BYTE Hour; //Õ½³¡¿ªÆôʱ # BYTE Minute; //Õ½³¡¿ªÆô·Ö # DWORD TagPlayerID; //Ä¿±êÍæ¼ÒID£¬¼´Òª±»Ìß³öÈ¥µÄÍæ¼ÒID #}; def OnCrossBattlefieldCallKick(index, clientData, tick): if GameWorld.IsCrossServer(): return curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) playerID = curPlayer.GetPlayerID() openHour = clientData.Hour openMinute = clientData.Minute tagPlayerID = clientData.TagPlayerID buyPlayerID = playerID if buyPlayerID == tagPlayerID: 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, openHour, openMinute) startDateTime = GameWorld.ChangeStrToDatetime(startTimeStr) endBuyDateTime = startDateTime + datetime.timedelta(minutes= -closeBuyMinute) if crossServerDateTime >= endBuyDateTime: GameWorld.Log("¸Ãʱ¼äµãÕ½³¡ÒѹرÕÕÙ¼¯£¬²»ÄÜÔÙÕÙ¼¯ÌßÈË! openHour=%s,openMinute=%s,crossServerDateTime(%s) >= endBuyDateTime(%s)" % (openHour, openMinute, crossServerDateTime, endBuyDateTime), playerID) return serverGroupID = GameWorld.GetServerGroupID() zoneIpyData = CrossRealmPK.GetCrossPKServerGroupZone(serverGroupID) if not zoneIpyData: return zoneID = zoneIpyData.GetZoneID() hmNum = GetHMNum(openHour, openMinute) buyPlayerInfo = GetBuyPlayerInfo(zoneID, hmNum) if buyPlayerID not in buyPlayerInfo: GameWorld.ErrLog("²»´æÔÚ¸ÃÍæ¼ÒµÄ¿ç·þÕ½³¡ÕÙ¼¯¶ÓÎé! hmNum=%s,buyPlayerID=%s" % (hmNum, buyPlayerID), playerID) return buyRec = buyPlayerInfo[buyPlayerID] if tagPlayerID not in buyRec.callPlayerIDList: GameWorld.DebugLog("¸ÃÕÙ¼¯¶ÓÎéûÓиÃÍæ¼Ò! hmNum=%s,buyPlayerID=%s,tagPlayerID=%s not in callPlayerIDList=%s" % (hmNum, buyPlayerID, tagPlayerID, buyRec.callPlayerIDList), playerID) return # ÇëÇó²éѯ¿ç·þ·þÎñÆ÷ dataMsg = {"openHour":openHour, "openMinute":openMinute, "buyPlayerID":buyPlayerID, "tagPlayerID":tagPlayerID, "playerID":playerID} CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_BattlefieldCallKick, dataMsg) return