#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package Player.PlayerAssist # # @todo:ЭÖúϵͳ # @author hxp # @date 2019-12-06 # @version 1.0 # # ÏêϸÃèÊö: ЭÖúϵͳ # #------------------------------------------------------------------------------- #"""Version = 2019-12-06 21:00""" #------------------------------------------------------------------------------- import PlayerFriend import PyDataManager import IpyGameDataPY import NetPackCommon import CrossRealmMsg import PyGameDataStruct import PlayerFBHelpBattle import ChPyNetSendPack import PlayerControl import PlayerFamily import ShareDefine import PlayerTeam import GameWorld import ChConfig import uuid import time # ЭÖúÀàÐÍ ( AssistType_Unknown, AssistType_Boss, # boss AssistType_TeamFB, # ×é¶Ó¸±±¾ ) = range(3) def RemoveOutofdateAssistThanks(): ## ÒÆ³ý¹ýÆÚµÄδÍê½á¸ÐлÊý¾Ý timeoutDate = GameWorld.GetDatetimeByDiffDays(-7) assistThanksMgr = PyDataManager.GetPlayerAssistThanksPyManager() maxDoCount = len(assistThanksMgr.allAssistThanksList) syncPlayerIDList = [] removeCountTotal, delNoThanksCount, delUnGetThanksCount = 0, 0, 0 doCount = 0 while doCount < maxDoCount and assistThanksMgr.allAssistThanksList: doCount += 1 thanks = assistThanksMgr.allAssistThanksList[0] thanksDate = GameWorld.ChangeStrToDatetime(thanks.TimeStr) if thanksDate > timeoutDate: break removeCountTotal += 1 # ÒÆ³ý¹ýÆÚµÄ¸ÐлÊý¾Ý popThanks = assistThanksMgr.allAssistThanksList.pop(0) playerID = popThanks.PlayerID GUID = popThanks.GUID assistPlayerIDList = popThanks.AssistPlayerDict.keys() if playerID in assistThanksMgr.playerThanksDict: playerThanksList = assistThanksMgr.playerThanksDict[playerID] for i, thanks in enumerate(playerThanksList): if GUID == thanks.GUID: delNoThanksCount += 1 playerThanksList.pop(i) #GameWorld.DebugLog(" ÒÆ³ýδ¸ÐлµÄÊý¾Ý: i=%s,GUID=%s,len=%s" % (i, thanks.GUID, len(playerThanksList))) break for assistPlayerID in assistPlayerIDList: if assistPlayerID not in assistThanksMgr.assistPlayerThanksDict: continue assistThanksList = assistThanksMgr.assistPlayerThanksDict[assistPlayerID] for i, thanks in enumerate(assistThanksList): if GUID == thanks.GUID: delUnGetThanksCount += 1 assistThanksList.pop(i) #GameWorld.DebugLog(" ÒÆ³ýδ½ÓÊܸÐлµÄÊý¾Ý: i=%s,GUID=%s,assistPlayerID=%s,len=%s" % (i, thanks.GUID, assistPlayerID, len(assistThanksList))) if assistPlayerID not in syncPlayerIDList: syncPlayerIDList.append(assistPlayerID) break playerMgr = GameWorld.GetPlayerManager() for playerID in syncPlayerIDList: assistPlayer = playerMgr.FindPlayerByID(playerID) if assistPlayer: SyncCanGetAssistThanksGiftCount(assistPlayer, isForce=True) if removeCountTotal: GameWorld.DebugLog("ÒÆ³ý¹ýÆÚµÄδÍê½á¸ÐлÊý¾Ý: doCount=%s,maxDoCount=%s,removeCountTotal=%s,delNoThanksCount=%s,delUnGetThanksCount=%s,remainCount=%s" % (doCount, maxDoCount, removeCountTotal, delNoThanksCount, delUnGetThanksCount, len(assistThanksMgr.allAssistThanksList))) return def OnPlayerLoginCrossServer(curPlayer): # ¿ç·þµÇ¼´¦Àí playerID = curPlayer.GetPlayerID() tagPlayerID = PlayerControl.GetAssistTagPlayerID(curPlayer) if tagPlayerID and not GameWorld.GetPlayerManager().FindPlayerByID(tagPlayerID): serverGroupID = PlayerControl.GetPlayerServerGroupID(curPlayer) sendMsg = {"queryType":"ResetPlayerAssist", "queryData":[playerID, tagPlayerID]} CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossAssist, sendMsg, [serverGroupID]) return def OnPlayerLogin(curPlayer): ## Íæ¼ÒÉÏÏß SyncCanGetAssistThanksGiftCount(curPlayer) familyID = curPlayer.GetFamilyID() playerID = curPlayer.GetPlayerID() assistMgr = PyDataManager.GetPlayerAssistPyManager() # ½«×Ô¼º·¢²¼µÄÖØÐ¼¤»î²¢Í¨ÖªÆäËûÍæ¼Ò if playerID in assistMgr.playerAssistDict: playerAssistList = assistMgr.playerAssistDict[playerID] serverAssistList, familyAssistList = [], [] for assistObj in playerAssistList: assistObj.OffLineTime = 0 # ÉèÖÃΪ·ÇÀëÏß if not assistObj.FamilyID: serverAssistList.append(assistObj) elif familyID and familyID == assistObj.FamilyID: familyAssistList.append(assistObj) if familyAssistList: PlayerFamily.SendFamilyFakePack(familyID, GetAssistInfoListPack(familyAssistList), [playerID]) if serverAssistList: SyncServerAssist(serverAssistList) # È«·þ·þÎñÆ÷ЭÖú¡¢ÏÉÃËЭÖú ֪ͨ×Ô¼º syncAssistList = [] for assistObj in assistMgr.allAssistDict.values(): if assistObj.OffLineTime: continue if assistObj.FamilyID and assistObj.FamilyID != familyID: continue syncAssistList.append(assistObj) if syncAssistList: NetPackCommon.SendFakePack(curPlayer, GetAssistInfoListPack(syncAssistList)) # ûÓÐЭÖúÖеÄÐÅÏ¢ if playerID in assistMgr.playerAssistingDict: assistObj = assistMgr.playerAssistingDict[playerID] tagPlayerID = assistObj.PlayerID GameWorld.DebugLog("·ÇÍÑ»úÉÏÏߣ¬¼ÌÐøÐ­Öú!tagPlayerID=%s" % tagPlayerID, playerID) PlayerControl.SetAssistTagPlayerID(curPlayer, tagPlayerID) assistPack = ChPyNetSendPack.tagGCAssistingInfo() assistPack.AssistGUID = assistObj.GUID NetPackCommon.SendFakePack(curPlayer, assistPack) return def OnLeaveServer(curPlayer): ## Íæ¼ÒÀëÏß familyID = curPlayer.GetFamilyID() if PlayerControl.GetAssistTagPlayerID(curPlayer): PlayerControl.SetAssistTagPlayerID(curPlayer, 0) assistMgr = PyDataManager.GetPlayerAssistPyManager() playerID = curPlayer.GetPlayerID() if playerID not in assistMgr.playerAssistDict: #GameWorld.DebugLog("Íæ¼ÒûÓз¢²¼¹ýЭÖú£¬ÀëÏß²»´¦Àí!", playerID) return playerAssistList = assistMgr.playerAssistDict[playerID] # ÔÝÊ±ÒÆ³ýÀëÏßÍæ¼Ò·¢²¼µÄ²»´æ¿âЭÖúÐÅÏ¢£¬²»ÔÙÈÃÆäËûÃËÓѼÌÐøÇ°ÍùЭÖú£¬ÒѾ­ÔÚЭÖúµÄ²»Ó°Ïì for assistObj in playerAssistList: if assistObj.IsSaveDB: continue assistObj.OffLineTime = int(time.time()) if not assistObj.FamilyID: SyncServerClearAssist(assistObj.GUID) elif familyID and familyID == assistObj.FamilyID: SyncFamilyClearAssist(familyID, assistObj.GUID) GameWorld.DebugLog("Íæ¼ÒÏÂÏߣ¬ÔÝʱ´ÓЭÖúÁбíÒÆ³ýÍæ¼Ò·¢²¼µÄЭÖú: %s" % assistObj.GUID) return def OnPlayerLeaveFamily(familyID, leavePlayerID, leavePlayer): ## Íæ¼ÒÀ뿪ÏÉÃË ## @param leavePlayer: ¿ÉÄܲ»ÔÚÏßΪNone assistMgr = PyDataManager.GetPlayerAssistPyManager() # Íæ¼Ò·¢²¼µÄ if leavePlayerID in assistMgr.playerAssistDict: playerAssistList = assistMgr.playerAssistDict[leavePlayerID] for assistObj in playerAssistList[::-1]: if assistObj.FamilyID: OnCancelPlayerRequestAssist(assistObj, "LeaveFamily", True) # Íæ¼ÒЭÖúÖÐµÄ if leavePlayerID in assistMgr.playerAssistingDict: assistObj = assistMgr.playerAssistingDict[leavePlayerID] if assistObj.FamilyID: OnCancelPlayerAssist(leavePlayer, leavePlayerID, assistObj, "LeaveFamily", True) return def OnPlayerTeamChange(curPlayer): ## Íæ¼Ò¶ÓÎé±ä¸ü if curPlayer.GetTeamID(): return playerID = curPlayer.GetPlayerID() assistMgr = PyDataManager.GetPlayerAssistPyManager() if playerID not in assistMgr.playerAssistDict: return playerAssistList = assistMgr.playerAssistDict[playerID] for assistObj in playerAssistList[::-1]: gameMap = GameWorld.GetMap(assistObj.MapID) if gameMap and gameMap.GetMapFBType() == ChConfig.fbtTeam: OnCancelPlayerRequestAssist(assistObj, "LeaveTeam", True) return def OnInitAssistData(dbData, isSaveDB, serverGroupID=0): ## ¼ÓÔØÐ­ÖúÊý¾Ý¶îÍâ´¦Àí setattr(dbData, "IsSaveDB", isSaveDB) # ÊÇ·ñ±£´æÊý¾Ý¿â£¬ÀëÏß¿ÉЭÖúµÄÐèÒª´æ¿â£¬ÈçÍÚ¿óÀà setattr(dbData, "ObjID", 0) # NPCʵÀýID setattr(dbData, "ServerGroupID", serverGroupID) setattr(dbData, "OffLineTime", 0) # ·¢²¼Íæ¼ÒÀëÏßʱ¼ä´Á setattr(dbData, "Face", 0) setattr(dbData, "FacePic", 0) assistType = AssistType_Unknown if dbData.NPCID: assistType = AssistType_Boss else: assMapID = dbData.MapID gameMap = GameWorld.GetMap(assMapID) if gameMap and gameMap.GetMapFBType() == ChConfig.fbtTeam: assistType = AssistType_TeamFB setattr(dbData, "AssistType", assistType) # ЭÖúÀàÐÍ setattr(dbData, "AssistPlayerIDList", []) # ЭÖúÖеÄÍæ¼ÒIDÁбí return def OnInitAssistThanksData(thanksMgr, dbData): ## ³õʼ»¯Ð­Öú¸ÐлÊý¾Ý¶îÍâ´¦Àí setattr(dbData, "Face", 0) setattr(dbData, "FacePic", 0) setattr(dbData, "AssistPlayerDict", {}) if dbData.AssistPlayer and dbData.AssistPlayer.startswith("{") and dbData.AssistPlayer.endswith("}"): dbData.AssistPlayerDict = eval(dbData.AssistPlayer) thanksMgr.allAssistThanksList.append(dbData) # δ¸ÐлµÄ if not dbData.ThanksState: playerID = dbData.PlayerID if playerID not in thanksMgr.playerThanksDict: thanksMgr.playerThanksDict[playerID] = [] playerThanksList = thanksMgr.playerThanksDict[playerID] playerThanksList.append(dbData) for assistPlayerID, assistPlayerInfo in dbData.AssistPlayerDict.items(): if "IsGet" in assistPlayerInfo: # ÒѾ­½ÓÊܸÐл½±ÀøµÄ²»ÔÙ´¦Àí continue if assistPlayerID not in thanksMgr.assistPlayerThanksDict: thanksMgr.assistPlayerThanksDict[assistPlayerID] = [] assistPlayerThanksList = thanksMgr.assistPlayerThanksDict[assistPlayerID] assistPlayerThanksList.append(dbData) return def OnSaveAssistThanksData(dbData): ## ЭÖú¸Ðл±£´æÊý¾Ý¶îÍâ´¦Àí dbData.AssistPlayer = str(dbData.AssistPlayerDict) dbData.AssistPlayerLen = len(dbData.AssistPlayer) return #// B0 12 ¿ªÊ¼Ð­ÖúBoss #tagCGStartAssistBoss # #struct tagCGStartAssistBoss # #{ # tagHead Head; # char AssistGUID[40]; //ЭÖúGUID #}; def OnStartAssistBoss(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) assistGUID = clientData.AssistGUID assistMgr = PyDataManager.GetPlayerAssistPyManager() if assistGUID not in assistMgr.allAssistDict: GameWorld.DebugLog("²»´æÔÚ¸ÃЭÖú!assistGUID=%s" % assistGUID) return assistObj = assistMgr.allAssistDict[assistGUID] if assistObj.AssistType != AssistType_Boss: return if assistObj.PlayerID == curPlayer.GetPlayerID(): GameWorld.DebugLog("²»ÄÜЭÖú×Ô¼º!") return isCrossBoss = assistObj.MapID in ChConfig.Def_CrossMapIDList if isCrossBoss: pass else: if assistObj.FamilyID != curPlayer.GetFamilyID(): GameWorld.DebugLog("·ÇͬÃËÍæ¼Ò²»ÄÜЭÖú!") return playerMapID = curPlayer.GetMapID() mapID = assistObj.MapID lineID = assistObj.LineID playerMap = GameWorld.GetMap(playerMapID) if not playerMap: return if playerMap.GetMapFBType() != ChConfig.fbtNull: if mapID == ChConfig.Def_FBMapID_SealDemon: playerLineID = PlayerControl.GetFBFuncLineID(curPlayer) else: playerLineID = curPlayer.GetFBID() if playerMapID != mapID or playerLineID != lineID: #¸±±¾ÖÐÎÞ·¨Ð­Öú PlayerControl.NotifyCode(curPlayer, "AssistFBLimit") return if isCrossBoss: tagPlayerID = assistObj.PlayerID assistPlayerID = curPlayer.GetPlayerID() assistPlayerName = curPlayer.GetName() isFriend = PlayerFriend.IsFriend(assistPlayerID, tagPlayerID) sendMsg = {"queryType":"StartAssistBoss", "queryData":[assistGUID, assistPlayerID, assistPlayerName, isFriend]} CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_CrossAssist, sendMsg) return # É趨ЭÖú±ØÐëÀ뿪¶ÓÎé tagMap = GameWorld.GetMap(mapID) if not tagMap: return if tagMap.GetMapFBType() != ChConfig.fbtTeam: curTeam = curPlayer.GetTeam() if curTeam: PlayerTeam.DoPlayerLeaveTeam(curPlayer, curTeam, tick) SetPlayerStartAssistBoss(curPlayer, assistObj) return #// B0 13 È¡ÏûЭÖúBoss #tagCGCancelAssistBoss # #struct tagCGCancelAssistBoss # #{ # tagHead Head; # char AssistGUID[40]; //ЭÖúGUID #}; def OnCancelAssistBoss(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) assistGUID = clientData.AssistGUID playerID = curPlayer.GetPlayerID() assistMgr = PyDataManager.GetPlayerAssistPyManager() if playerID not in assistMgr.playerAssistingDict: GameWorld.DebugLog("ûÓÐÔÚЭÖúÖУ¬ÎÞÐèÈ¡Ïû!", playerID) return assistObj = assistMgr.playerAssistingDict[playerID] if assistGUID != assistObj.GUID: GameWorld.DebugLog("·ÇÕýÔÚЭÖúÖеÄGUID£¬²»ÄÜÈ¡Ïû!assistGUID=%s,assisting=%s" % (assistGUID, assistObj.GUID), playerID) return OnCancelPlayerAssist(curPlayer, curPlayer.GetPlayerID(), assistObj, "ClientCancel", True) return def SetPlayerStartAssistBoss(curPlayer, assistObj): ## Íæ¼Ò¿ªÊ¼Ð­Öú boss assistGUID = assistObj.GUID tagPlayerID = assistObj.PlayerID mapID = assistObj.MapID lineID = assistObj.LineID npcID = assistObj.NPCID objID = assistObj.ObjID tagPlayer = GameWorld.GetPlayerManager().FindPlayerByID(tagPlayerID) if not tagPlayer: GameWorld.DebugLog("Íæ¼ÒÒÑÀëÏߣ¬ÎÞ·¨Ð­Öú!tagPlayerID=%s" % (tagPlayerID)) return if tagPlayer.GetMapID() != mapID: GameWorld.DebugLog("Ä¿±êÍæ¼ÒÒѲ»ÔÚÇëÇóЭÖúµÄµØÍ¼£¬ÎÞ·¨Ð­Öú!tagPlayerID=%s" % (tagPlayerID)) return playerID = curPlayer.GetPlayerID() # ÉèÖÃÐÂЭÖú֮ǰÐèÒªÏÈÈ¡ÏûÕýÔÚ½øÐÐÖеÄЭÖú assistMgr = PyDataManager.GetPlayerAssistPyManager() if playerID in assistMgr.playerAssistingDict: assistingObj = assistMgr.playerAssistingDict[playerID] if assistGUID != assistingObj.GUID: OnCancelPlayerAssist(curPlayer, playerID, assistingObj, "StartNewAssistBoss", True) assistMgr.playerAssistingDict[playerID] = assistObj #if playerID in assistObj.AssistPlayerIDList: # GameWorld.DebugLog("ÒѾ­ÔÚЭÖúÖÐ!", playerID) # return if playerID not in assistObj.AssistPlayerIDList: assistObj.AssistPlayerIDList.append(playerID) GameWorld.DebugLog("¿ªÊ¼Ð­Öú: tagPlayerID=%s,mapID=%s,lineID=%s,npcID=%s,objID=%s" % (tagPlayerID, mapID, lineID, npcID, objID), playerID) # ÉèÖÃЭÖú PlayerControl.SetAssistTagPlayerID(curPlayer, tagPlayerID) # ֪ͨĿ±êÍæ¼Ò assistPlayerID = curPlayer.GetPlayerID() assistPlayerName = curPlayer.GetName() # xxx¿ªÊ¼Ð­ÖúÄã PlayerControl.NotifyCode(tagPlayer, "AssistStart", [assistPlayerName]) tagPlayerName = tagPlayer.GetName() tagTeamID = tagPlayer.GetTeamID() isFriend = PlayerFriend.IsFriend(assistPlayerID, tagPlayerID) serverGroupID = GameWorld.GetServerGroupID() assistData = [mapID, "Start", assistGUID, assistPlayerID, assistPlayerName, isFriend, tagPlayerID, tagPlayerName, tagTeamID, lineID, objID, npcID, serverGroupID] GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_AssistBoss, assistData) return def ClientServerMsg_StartAssistBoss(serverGroupID, queryType, queryData): ## ÊÕµ½×Ó·þÏûÏ¢ - ¿ªÊ¼Ð­Öúboss ## @return: ÊÇ·ñͬ²½É¾³ýGUID assistGUID, assistPlayerID, assistPlayerName, isFriend = queryData assistMgr = PyDataManager.GetPlayerAssistPyManager() if assistGUID not in assistMgr.allAssistDict: GameWorld.Log("²»´æÔÚ¸ÃЭÖú!assistGUID=%s" % assistGUID) reason, isGameServer = "AssistGUIDNotExist", True sendMsg = {"queryType":"CancelPlayerRequestAssist", "queryData":[assistGUID, reason, isGameServer]} CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossAssist, sendMsg, [serverGroupID]) return assistObj = assistMgr.allAssistDict[assistGUID] if assistObj.AssistType != AssistType_Boss: return if assistObj.PlayerID == assistPlayerID: GameWorld.DebugLog("²»ÄÜЭÖú×Ô¼º!") return assistPlayer = GameWorld.GetPlayerManager().FindPlayerByID(assistPlayerID) # Èç¹ûÊÇÔÚ¿ç·þ·þÎñÆ÷ if assistPlayer: playerMapID = assistPlayer.GetMapID() mapID = assistObj.MapID lineID = assistObj.LineID playerMap = GameWorld.GetMap(playerMapID) if not playerMap: return if playerMap.GetMapFBType() != ChConfig.fbtNull: playerLineID = assistPlayer.GetFBID() if playerMapID != mapID or playerLineID != lineID: #¸±±¾ÖÐÎÞ·¨Ð­Öú PlayerControl.NotifyCode(assistPlayer, "AssistFBLimit") return tagPlayerID = assistObj.PlayerID mapID = assistObj.MapID lineID = assistObj.LineID npcID = assistObj.NPCID objID = assistObj.ObjID tagPlayer = GameWorld.GetPlayerManager().FindPlayerByID(tagPlayerID) if not tagPlayer: GameWorld.Log("Íæ¼ÒÒÑÀëÏߣ¬ÎÞ·¨Ð­Öú!tagPlayerID=%s" % (tagPlayerID)) OnCancelPlayerRequestAssist(assistObj, "CrossPlayerOffline", True) return if tagPlayer.GetMapID() != mapID: GameWorld.DebugLog("Ä¿±êÍæ¼ÒÒѲ»ÔÚÇëÇóЭÖúµÄµØÍ¼£¬ÎÞ·¨Ð­Öú!tagPlayerID=%s" % (tagPlayerID)) return # ÉèÖÃÐÂЭÖú֮ǰÐèÒªÏÈÈ¡ÏûÕýÔÚ½øÐÐÖеÄЭÖú if assistPlayerID in assistMgr.playerAssistingDict: assistingObj = assistMgr.playerAssistingDict[assistPlayerID] if assistGUID != assistingObj.GUID: OnCancelPlayerAssist(assistPlayer, assistPlayerID, assistingObj, "StartNewAssistBoss", True) assistMgr.playerAssistingDict[assistPlayerID] = assistObj if assistPlayerID not in assistObj.AssistPlayerIDList: assistObj.AssistPlayerIDList.append(assistPlayerID) GameWorld.DebugLog("¿ªÊ¼Ð­Öú: tagPlayerID=%s,mapID=%s,lineID=%s,npcID=%s,objID=%s" % (tagPlayerID, mapID, lineID, npcID, objID), assistPlayerID) # ÉèÖÃЭÖú if assistPlayer: PlayerControl.SetAssistTagPlayerID(assistPlayer, tagPlayerID) # ֪ͨĿ±êÍæ¼Ò # xxx¿ªÊ¼Ð­ÖúÄã PlayerControl.NotifyCode(tagPlayer, "AssistStart", [assistPlayerName]) tagPlayerName = tagPlayer.GetName() tagTeamID = tagPlayer.GetTeamID() assistData = [mapID, "Start", assistGUID, assistPlayerID, assistPlayerName, isFriend, tagPlayerID, tagPlayerName, tagTeamID, lineID, objID, npcID, serverGroupID] GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_AssistBoss, assistData) return def OnAddAssistBossPlayerOK(queryData): ## Ìí¼ÓЭÖúBossµÄÍæ¼Ò³É¹¦£¬Í¨ÖªÐ­ÖúÍæ¼Ò¿ÉÒÔǰÍù assistGUID, assistPlayerID, tagPlayerID, serverGroupID = queryData if GameWorld.IsCrossServer(): sendMsg = {"queryType":"AddAssistBossPlayerOK", "queryData":[assistGUID, assistPlayerID, tagPlayerID]} CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossAssist, sendMsg, [serverGroupID]) return assistPlayer = GameWorld.GetPlayerManager().FindPlayerByID(assistPlayerID) if not assistPlayer: return assistPack = ChPyNetSendPack.tagGCAssistingInfo() assistPack.AssistGUID = assistGUID NetPackCommon.SendFakePack(assistPlayer, assistPack) return def CrossServerMsg_AddAssistBossPlayerOK(queryType, queryData): ## ÊÕµ½¿ç·þ·þÎñÆ÷ - Ìí¼ÓЭÖúboss³É¹¦ assistGUID, assistPlayerID, tagPlayerID = queryData assistPlayer = GameWorld.GetPlayerManager().FindPlayerByID(assistPlayerID) if not assistPlayer: return assistMgr = PyDataManager.GetPlayerAssistPyManager() if assistGUID not in assistMgr.allAssistDict: GameWorld.DebugLog("²»´æÔÚ¸ÃЭÖú!assistGUID=%s" % assistGUID) return assistObj = assistMgr.allAssistDict[assistGUID] # ÉèÖÃЭÖú PlayerControl.SetAssistTagPlayerID(assistPlayer, tagPlayerID) if assistPlayerID in assistMgr.playerAssistingDict: assistingObj = assistMgr.playerAssistingDict[assistPlayerID] if assistGUID != assistingObj.GUID: OnCancelPlayerAssist(assistPlayer, assistPlayerID, assistingObj, "StartNewAssistBoss", True) assistMgr.playerAssistingDict[assistPlayerID] = assistObj if assistPlayerID not in assistObj.AssistPlayerIDList: assistObj.AssistPlayerIDList.append(assistPlayerID) assistPack = ChPyNetSendPack.tagGCAssistingInfo() assistPack.AssistGUID = assistGUID NetPackCommon.SendFakePack(assistPlayer, assistPack) return def MapServer_PlayerAssistLogic(curPlayer, msgList, tick): ## µØÍ¼Í¬²½µÄЭÖúÐÅÏ¢Âß¼­´¦Àí playerID = 0 if not curPlayer else curPlayer.GetPlayerID() familyID = 0 if not curPlayer else curPlayer.GetFamilyID() queryType, queryData = msgList #result = [] GameWorld.Log("ÊÕµ½µØÍ¼Ð­ÖúÐÅÏ¢: familyID=%s,queryType=%s,queryData=%s" % (familyID, queryType, queryData), playerID) # ÇëÇóЭÖúboss if queryType == "RequestAssistBoss": __DoRequestAssistBoss(curPlayer, queryData) return # Ìí¼ÓЭÖúBossµÄÍæ¼Ò³É¹¦ elif queryType == "AddAssistBossPlayerOK": OnAddAssistBossPlayerOK(queryData) return # È¡ÏûbossЭÖú·¢²¼ elif queryType == "OnCancelBossRequestAssist": mapID, lineID, npcID, objID, reason = queryData assistMgr = PyDataManager.GetPlayerAssistPyManager() if playerID in assistMgr.playerAssistDict: playerAssistList = assistMgr.playerAssistDict[playerID] for assistObj in playerAssistList: if assistObj.MapID == mapID and assistObj.LineID == lineID and assistObj.NPCID == npcID and assistObj.ObjID == objID: OnCancelPlayerRequestAssist(assistObj, reason, False) break return # È¡ÏûЭÖúBoss elif queryType == "OnCancelBossAssist": mapID, lineID, npcID, objID, reason = queryData assistMgr = PyDataManager.GetPlayerAssistPyManager() if playerID in assistMgr.playerAssistingDict: assistObj = assistMgr.playerAssistingDict[playerID] if assistObj.MapID == mapID and assistObj.LineID == lineID and assistObj.NPCID == npcID and assistObj.ObjID == objID: OnCancelPlayerAssist(curPlayer, playerID, assistObj, reason, False) return # bossЭÖú½áÊø elif queryType == "OnBossAssistOver": __DoBossAssistOver(queryData) return # ¸±±¾Ð­Öú½áÊø elif queryType == "OnFBAssistOver": __DoFBAssistOver(queryData) return ## ------------------------------------------------------------------------------------------- # ÇëÇóЭÖú×é¶Ó¸±±¾ elif queryType == "RequestAssistTeamFB": __DoRequestAssistTeamFB(curPlayer, queryData) return # ¿ªÊ¼Ð­Öú×é¶Ó¸±±¾ elif queryType == "OnStartAssistTeamFB": mapID, lineID, tagPlayerID = queryData GameWorld.DebugLog(" ¿ªÊ¼Ð­Öú¸±±¾: mapID=%s,lineID=%s,tagPlayerID=%s" % (mapID, lineID, tagPlayerID), playerID) # ¸±±¾Ð­ÖúÔÝʱֻ´¦ÀíÉèÖÃЭÖúÄ¿±êID PlayerControl.SetAssistTagPlayerID(curPlayer, tagPlayerID) return # È¡ÏûЭÖú×é¶Ó¸±±¾ elif queryType == "OnCancelAssistTeamFB": mapID, lineID, reason = queryData GameWorld.DebugLog(" ¿ªÊ¼Ð­Öú¸±±¾: mapID=%s,lineID=%s,reason=%s" % (mapID, lineID, reason), playerID) # ¸±±¾Ð­ÖúÔÝʱֻ´¦ÀíÉèÖÃЭÖúÄ¿±êID PlayerControl.SetAssistTagPlayerID(curPlayer, 0) return #QueryPlayerResult_PlayerAssist(curPlayer, queryType, queryData, result) return def QueryPlayerResult_PlayerAssist(curPlayer, queryType, queryData, result=[]): if not curPlayer: return resultMsg = str([queryType, queryData, result]) curPlayer.MapServer_QueryPlayerResult(0, 0, "PlayerAssist", resultMsg, len(resultMsg)) GameWorld.DebugLog("ЭÖúÐÅÏ¢·¢ËÍ MapServer: playerID=%s,queryType=%s,queryData=%s" % (curPlayer.GetPlayerID(), queryType, queryData)) return def __DoRequestAssistBoss(curPlayer, queryData): ## ÇëÇóЭÖúBoss isCrossServer = GameWorld.IsCrossServer() familyID = curPlayer.GetFamilyID() if not familyID and not isCrossServer: return mapID, lineID, npcID, objID, npcLV, serverGroupID = queryData playerID = curPlayer.GetPlayerID() reqAssistObj = None addNewAssist = False assistMgr = PyDataManager.GetPlayerAssistPyManager() if playerID in assistMgr.playerAssistDict: playerAssistList = assistMgr.playerAssistDict[playerID] for assistObj in playerAssistList: if assistObj.AssistType != AssistType_Boss: continue if npcID != assistObj.NPCID or lineID != assistObj.LineID or objID != assistObj.ObjID: OnCancelPlayerRequestAssist(assistObj, "RequestNewAssistBoss", True) else: reqAssistObj = assistObj break if not reqAssistObj: addNewAssist = True reqAssistObj = __AddNewAssist(assistMgr, curPlayer, mapID, lineID, npcID, objID, serverGroupID=serverGroupID) if not reqAssistObj: return # ÇóÖúÐÅÏ¢ÒÑ·¢ËÍ£¬ÇëµÈ´ýÃËÓÑÖ§Ô® PlayerControl.NotifyCode(curPlayer, "AssistRequestOK") requestCount = 1 if not addNewAssist: requestCount = min(curPlayer.GetDictByKey("AssistBossRequestCount") + 1, 999) curPlayer.SetDict("AssistBossRequestCount", requestCount) notifyNum = (requestCount - 1) % 3 if isCrossServer: GUID = reqAssistObj.GUID sendMsg = {"queryType":"RequestAssistBoss", "queryData":[mapID, lineID, npcID, objID, npcLV, playerID, notifyNum, GUID]} CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossAssist, sendMsg, [serverGroupID]) else: # ֪ͨ±¾ÏÉÃËÍæ¼Ò PlayerFamily.SendFamilyFakePack(familyID, GetAssistInfoListPack([reqAssistObj])) # ¹ã²¥ÏÉÃËÇëÇó PlayerControl.FamilyNotify(familyID, "AssistBossRequest%s" % notifyNum, [curPlayer.GetName(), mapID, npcLV, npcID]) return def CrossServerMsg_RequestAssistBoss(queryType, queryData): mapID, lineID, npcID, objID, npcLV, playerID, notifyNum, GUID = queryData curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID) if not curPlayer: return reqAssistObj = None addNewAssist = False assistMgr = PyDataManager.GetPlayerAssistPyManager() if playerID in assistMgr.playerAssistDict: playerAssistList = assistMgr.playerAssistDict[playerID] for assistObj in playerAssistList: if assistObj.AssistType != AssistType_Boss: continue if npcID != assistObj.NPCID or lineID != assistObj.LineID or objID != assistObj.ObjID: OnCancelPlayerRequestAssist(assistObj, "RequestNewAssistBoss", True) else: reqAssistObj = assistObj break if not reqAssistObj: addNewAssist = True reqAssistObj = __AddNewAssist(assistMgr, curPlayer, mapID, lineID, npcID, objID, assistGUID=GUID) GameWorld.Log("ÊÕµ½¿ç·þÇëÇóЭÖúboss: %s mapID=%s,lineID=%s,npcID=%s,objID=%s,addNewAssist=%s,GUID=%s" % (queryType, mapID, lineID, npcID, objID, addNewAssist, GUID), playerID) if not reqAssistObj: return # ֪ͨ±¾·þÍæ¼Ò SyncServerAssist([reqAssistObj]) # ¹ã²¥ÇëÇó PlayerControl.WorldNotify(0, "AssistBossRequest%s" % notifyNum, [curPlayer.GetName(), mapID, npcLV, npcID]) return def CrossServerMsg_CrossAssist(msgData, tick): ## ÊÕµ½¿ç·þ·þÎñÆ÷ÏûÏ¢ - ЭÖúÐÅÏ¢ queryType = msgData["queryType"] queryData = msgData["queryData"] # ÇëÇóЭÖúboss if queryType == "RequestAssistBoss": CrossServerMsg_RequestAssistBoss(queryType, queryData) return # Ìí¼ÓЭÖúboss³É¹¦ if queryType == "AddAssistBossPlayerOK": CrossServerMsg_AddAssistBossPlayerOK(queryType, queryData) return # È¡ÏûЭÖúÇëÇó if queryType == "CancelPlayerRequestAssist": CrossServerMsg_CancelPlayerRequestAssist(queryType, queryData) return # È¡ÏûЭÖú if queryType == "CancelPlayerAssist": CrossServerMsg_CancelPlayerAssist(queryType, queryData) return # bossЭÖú½áÊø if queryType == "BossAssistOver": CrossServerMsg_BossAssistOver(queryType, queryData) return # ÖØÖÃÍæ¼ÒЭÖú if queryType == "ResetPlayerAssist": CrossServerMsg_ResetPlayerAssist(queryType, queryData) return return def ClientServerMsg_CrossAssist(serverGroupID, msgData, tick): ## ÊÕµ½×Ó·þ·þÎñÆ÷ÏûÏ¢ - ЭÖúÐÅÏ¢ queryType = msgData["queryType"] queryData = msgData["queryData"] # ¿ªÊ¼Ð­Öúboss if queryType == "StartAssistBoss": ClientServerMsg_StartAssistBoss(serverGroupID, queryType, queryData) return return def __DoRequestAssistTeamFB(curPlayer, queryData): ## ÇëÇóЭÖú×é¶Ó¸±±¾ familyID = curPlayer.GetFamilyID() if not familyID: return mapID, lineID = queryData playerID = curPlayer.GetPlayerID() reqAssistObj = None addNewAssist = False assistMgr = PyDataManager.GetPlayerAssistPyManager() if playerID in assistMgr.playerAssistDict: playerAssistList = assistMgr.playerAssistDict[playerID] for assistObj in playerAssistList: if assistObj.AssistType != AssistType_TeamFB: continue if mapID != assistObj.MapID or lineID != assistObj.LineID: OnCancelPlayerRequestAssist(assistObj, "RequestNewAssistTeamFB", True) else: reqAssistObj = assistObj break if not reqAssistObj: addNewAssist = True reqAssistObj = __AddNewAssist(assistMgr, curPlayer, mapID, lineID) if not reqAssistObj: return # ֪ͨ±¾ÏÉÃËÍæ¼Ò PlayerFamily.SendFamilyFakePack(familyID, GetAssistInfoListPack([reqAssistObj])) # ÇóÖúÐÅÏ¢ÒÑ·¢ËÍ£¬ÇëµÈ´ýÃËÓÑÖ§Ô® PlayerControl.NotifyCode(curPlayer, "AssistRequestOK") # ¹ã²¥ÏÉÃËÇëÇó requestCount = 1 if not addNewAssist: requestCount = min(curPlayer.GetDictByKey("AssistFBRequestCount") + 1, 999) curPlayer.SetDict("AssistFBRequestCount", requestCount) notifyNum = (requestCount - 1) % 3 PlayerControl.FamilyNotify(familyID, "AssistFBRequest%s" % notifyNum, [curPlayer.GetName(), mapID]) return def __AddNewAssist(assistMgr, curPlayer, mapID, lineID, npcID=0, objID=0, exData="", isSaveDB=0, assistGUID="", serverGroupID=0): ## Ìí¼ÓÐÂЭÖúÇëÇó if not assistGUID: assistGUID = str(uuid.uuid1()) crossAssist = mapID in ChConfig.Def_CrossMapIDList familyID = 0 if crossAssist else curPlayer.GetFamilyID() playerID = curPlayer.GetPlayerID() assistObj = PyGameDataStruct.tagDBAssist() assistObj.GUID = assistGUID assistObj.FamilyID = familyID assistObj.PlayerID = playerID assistObj.PlayerName = curPlayer.GetName() assistObj.Job = curPlayer.GetJob() assistObj.LV = curPlayer.GetLV() assistObj.RealmLV = curPlayer.GetOfficialRank() assistObj.MapID = mapID assistObj.LineID = lineID assistObj.NPCID = npcID assistObj.ExData = exData assistObj.ExDataLen = len(exData) # ÒÔÏÂÊÇ·ÇDB×Ö¶ÎÊôÐÔ OnInitAssistData(assistObj, isSaveDB, serverGroupID) assistObj.ObjID = objID assistObj.Face = curPlayer.GetFace() assistObj.FacePic = curPlayer.GetFacePic() #assistMgr = PyDataManager.GetPlayerAssistPyManager() assistMgr.allAssistDict[assistGUID] = assistObj if playerID not in assistMgr.playerAssistDict: assistMgr.playerAssistDict[playerID] = [] playerAssistList = assistMgr.playerAssistDict[playerID] playerAssistList.append(assistObj) GameWorld.DebugLog(" Ôö¼ÓÐÂЭÖúÇëÇó: familyID=%s,mapID=%s,lineID=%s,npcID=%s,objID=%s,exData=%s,assistGUID=%s" % (familyID, mapID, lineID, npcID, objID, exData, assistGUID), playerID) return assistObj def GetAssistInfoListPack(familyAssistList): ## ЭÖúÁбí·â°üÊý¾Ý assistList = [] for assistObj in familyAssistList: assistInfo = ChPyNetSendPack.tagGCAssistInfo() assistInfo.AssistGUID = assistObj.GUID assistInfo.PlayerID = assistObj.PlayerID assistInfo.PlayerName = assistObj.PlayerName assistInfo.Job = assistObj.Job assistInfo.LV = assistObj.LV assistInfo.RealmLV = assistObj.RealmLV assistInfo.Face = assistObj.Face assistInfo.FacePic = assistObj.FacePic assistInfo.MapID = assistObj.MapID assistInfo.LineID = assistObj.LineID assistInfo.NPCID = assistObj.NPCID assistInfo.ExData = assistObj.ExData assistInfo.ExDataLen = len(assistObj.ExData) assistList.append(assistInfo) infoListPack = ChPyNetSendPack.tagGCAssistInfoList() infoListPack.AssistInfoList = assistList infoListPack.Count = len(assistList) return infoListPack def OnCancelPlayerRequestAssist(assistObj, reason, isGameServer): '''È¡ÏûÍæ¼ÒЭÖú - ·¢²¼·½ MapServer ´¥·¢È¡Ïû 1. ¹¥»÷ÁËÁíÒ»Ö»boss 2. ÖØÐ·¢²¼ÁËÁíÒ»ÌõЭÖúboss/×é¶Ó¸±±¾ 3. ½øÈëЭÖú״̬£¬¼´±¾À´ÔÚ´òͬһֻboss£¬ºóÃæÖ±½Ó¸ÄΪЭÖú 4. Í˳öÁË·¢²¼Ð­ÖúµØÍ¼ GameServer ´¥·¢È¡Ïû 5. ±»Ìß/Í˳öÏÉÃË ''' assistGUID = assistObj.GUID playerID = assistObj.PlayerID familyID = assistObj.FamilyID assistType = assistObj.AssistType mapID = assistObj.MapID lineID = assistObj.LineID npcID = assistObj.NPCID objID = assistObj.ObjID serverGroupID = assistObj.ServerGroupID GameWorld.DebugLog("È¡Ïû·¢²¼µÄЭÖúÇëÇó: mapID=%s,lineID=%s,npcID=%s,objID=%s,reason=%s,isGameServer=%s, %s, serverGroupID=%s" % (mapID, lineID, npcID, objID, reason, isGameServer, assistGUID, serverGroupID)) assistMgr = PyDataManager.GetPlayerAssistPyManager() if assistGUID not in assistMgr.allAssistDict: return assistMgr.allAssistDict.pop(assistGUID) if playerID in assistMgr.playerAssistDict: playerAssistList = assistMgr.playerAssistDict[playerID] if assistObj in playerAssistList: playerAssistList.remove(assistObj) # È¡ÏûbossЭÖú if assistType == AssistType_Boss: # Ç¿ÖÆÈ¡ÏûÕýÔÚЭÖúÖеÄÍæ¼Ò playerMgr = GameWorld.GetPlayerManager() for assPlayerID in assistObj.AssistPlayerIDList[::-1]: assistObj.AssistPlayerIDList.remove(assPlayerID) if assPlayerID in assistMgr.playerAssistingDict: assistingObj = assistMgr.playerAssistingDict[assPlayerID] if assistingObj.GUID == assistGUID: assPlayer = playerMgr.FindPlayerByID(assPlayerID) OnCancelPlayerAssist(assPlayer, assPlayerID, assistObj, reason, isGameServer, isNotify=False) # ·¢²¼·½È¡Ïû²»ÐèҪ֪ͨµØÍ¼£¬¶ÔµØÍ¼·¢²¼Íæ¼ÒûÓÐÓ°Ï죬¿É¼ÌÐø¹¥»÷boss # È¡Ïû¸±±¾Ð­Öú elif assistType == AssistType_TeamFB: # Ôݲ»ÐèÒª´¦Àí pass # ·Å×îºó if familyID: SyncFamilyClearAssist(familyID, assistGUID) if GameWorld.IsCrossServer() and serverGroupID: sendMsg = {"queryType":"CancelPlayerRequestAssist", "queryData":[assistGUID, reason, isGameServer]} CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossAssist, sendMsg, [serverGroupID]) return def CrossServerMsg_CancelPlayerRequestAssist(queryType, queryData): ## ÊÕµ½¿ç·þ·þÎñÆ÷ - È¡ÏûЭÖúÇëÇó assistGUID, reason, isGameServer = queryData assistMgr = PyDataManager.GetPlayerAssistPyManager() if assistGUID not in assistMgr.allAssistDict: return assistObj = assistMgr.allAssistDict.pop(assistGUID) playerID = assistObj.PlayerID assistType = assistObj.AssistType GameWorld.Log("ÊÕµ½¿ç·þÈ¡ÏûЭÖúbossÇëÇó: %s assistGUID=%s,reason=%s,isGameServer=%s" % (queryType, assistGUID, reason, isGameServer), playerID) if playerID in assistMgr.playerAssistDict: playerAssistList = assistMgr.playerAssistDict[playerID] if assistObj in playerAssistList: playerAssistList.remove(assistObj) # È¡ÏûbossЭÖú if assistType == AssistType_Boss: # Ç¿ÖÆÈ¡ÏûÕýÔÚЭÖúÖеÄÍæ¼Ò playerMgr = GameWorld.GetPlayerManager() for assPlayerID in assistObj.AssistPlayerIDList[::-1]: assistObj.AssistPlayerIDList.remove(assPlayerID) if assPlayerID in assistMgr.playerAssistingDict: assistingObj = assistMgr.playerAssistingDict[assPlayerID] if assistingObj.GUID == assistGUID: assPlayer = playerMgr.FindPlayerByID(assPlayerID) OnCancelPlayerAssist(assPlayer, assPlayerID, assistObj, reason, isGameServer, isNotify=False) SyncServerClearAssist(assistGUID) return def OnCancelPlayerAssist(cancelPlayer, cancelPlayerID, assistObj, reason, isGameServer, isNotify=True): '''È¡ÏûÍæ¼ÒЭÖú - ЭÖú·½ MapServer ´¥·¢È¡Ïû 1. ¹¥»÷ÁËÁíÒ»Ö»boss 2. Í˳öÁ˵±Ç°Ð­ÖúµÄЭÖúµØÍ¼ GameServer ´¥·¢È¡Ïû 3. ÖØÐÂЭÖúÁËÁíÒ»ÌõЭÖúboss/×é¶Ó¸±±¾ 4. ±»Ìß/Í˳öÏÉÃË 5. Ö÷¶¯µãÈ¡Ïû ÆäËû£¬·¢²¼·½È¡Ïû·½Ê½ 6. ·¢²¼·½È¡ÏûÁË·¢²¼µÄЭÖú ''' assistGUID = assistObj.GUID tagPlayerID = assistObj.PlayerID mapID = assistObj.MapID lineID = assistObj.LineID npcID = assistObj.NPCID objID = assistObj.ObjID serverGroupID = assistObj.ServerGroupID GameWorld.DebugLog("È¡ÏûЭÖú: tagPlayerID=%s,mapID=%s,lineID=%s,npcID=%s,objID=%s,reason=%s,isGameServer=%s, %s" % (tagPlayerID, mapID, lineID, npcID, objID, reason, isGameServer, assistGUID), cancelPlayerID) assistMgr = PyDataManager.GetPlayerAssistPyManager() if cancelPlayerID in assistMgr.playerAssistingDict: assistMgr.playerAssistingDict.pop(cancelPlayerID) if cancelPlayerID in assistObj.AssistPlayerIDList: assistObj.AssistPlayerIDList.remove(cancelPlayerID) if cancelPlayer: isTagPlayerReason = reason.startswith("RequestPlayerCancel_") PlayerControl.SetAssistTagPlayerID(cancelPlayer, 0) overPack = ChPyNetSendPack.tagGCAssistOver() overPack.IsTagPlayerReason = isTagPlayerReason overPack.Reason = reason[len("RequestPlayerCancel_"):] if isTagPlayerReason else reason overPack.ReasonLen = len(overPack.Reason) overPack.AssistGUID = assistGUID NetPackCommon.SendFakePack(cancelPlayer, overPack) # È¡ÏûbossЭÖú if assistObj.AssistType == AssistType_Boss: # GameServerÈ¡ÏûµÄÐèҪ֪ͨЭÖúbossµØÍ¼£¬É¾³ýЭÖúÍæ¼Ò¼Ç¼ if isGameServer: assistData = [mapID, "Cancel", cancelPlayerID, lineID, objID, npcID] GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_AssistBoss, assistData) if isNotify and cancelPlayer: tagPlayer = GameWorld.GetPlayerManager().FindPlayerByID(tagPlayerID) if tagPlayer: # xxxÈ¡Ïû¶ÔÄãЭÖú PlayerControl.NotifyCode(tagPlayer, "AssistCancel", [cancelPlayer.GetName()]) # È¡Ïû¸±±¾Ð­Öú elif assistObj.AssistType == AssistType_TeamFB: pass if GameWorld.IsCrossServer() and serverGroupID: sendMsg = {"queryType":"CancelPlayerAssist", "queryData":[assistGUID, reason, isGameServer, cancelPlayerID]} CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossAssist, sendMsg, [serverGroupID]) return def CrossServerMsg_CancelPlayerAssist(queryType, queryData): ## ÊÕµ½¿ç·þ·þÎñÆ÷ - È¡ÏûÍæ¼ÒЭÖú assistGUID, reason, isGameServer, cancelPlayerID = queryData assistMgr = PyDataManager.GetPlayerAssistPyManager() if assistGUID not in assistMgr.allAssistDict: return GameWorld.Log("ÊÕµ½¿ç·þÈ¡ÏûÍæ¼ÒЭÖú: %s assistGUID=%s,reason=%s,isGameServer=%s" % (queryType, assistGUID, reason, isGameServer), cancelPlayerID) cancelPlayer = GameWorld.GetPlayerManager().FindPlayerByID(cancelPlayerID) if not cancelPlayer: return PlayerControl.SetAssistTagPlayerID(cancelPlayer, 0) return def CrossServerMsg_ResetPlayerAssist(queryType, queryData): ## ÊÕµ½¿ç·þ·þÎñÆ÷ - ÖØÖÃÍæ¼ÒЭÖú ## playerID, tagPlayerID = queryData GameWorld.Log("ÊÕµ½¿ç·þÖØÖÃÍæ¼ÒЭÖú: playerID=%s,tagPlayerID=%s" % (playerID, tagPlayerID), playerID) curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID) if not curPlayer: return PlayerControl.SetAssistTagPlayerID(curPlayer, 0) return def __DoBossAssistOver(queryData): ## bossЭÖú½áÊø£¬Ò»°ãÊÇboss±»»÷ɱ »ò ±»ÏµÍ³ mapID, lineID, npcID, objID, noAssistPlayerIDList, assistAwardItemID, assistAwardResult = queryData isCrossServer = GameWorld.IsCrossServer() assistMgr = PyDataManager.GetPlayerAssistPyManager() for noAssistPlayerID in noAssistPlayerIDList: if noAssistPlayerID not in assistMgr.playerAssistDict: continue playerAssistList = assistMgr.playerAssistDict[noAssistPlayerID] for assistObj in playerAssistList: if assistObj.MapID == mapID and assistObj.LineID == lineID and assistObj.NPCID == npcID and assistObj.ObjID == objID: OnCancelPlayerRequestAssist(assistObj, "BossAssistOver", False) # ¿ç·þ·þÎñÆ÷ͬ²½µ½×Ó·þ½áËã½±Àø if isCrossServer and noAssistPlayerID in assistAwardResult: assistPlayerDict = assistAwardResult[noAssistPlayerID] serverGroupID = assistObj.ServerGroupID sendMsg = {"queryType":"BossAssistOver", "queryData":[mapID, lineID, npcID, noAssistPlayerID, assistAwardItemID, assistPlayerDict]} CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossAssist, sendMsg, [serverGroupID]) break if not assistAwardItemID or not assistAwardResult: return if isCrossServer: return # ÐÂÔö¸ÐлÊý¾Ý playerMgr = GameWorld.GetPlayerManager() for playerID, assistPlayerDict in assistAwardResult.items(): curPlayer = playerMgr.FindPlayerByID(playerID) if not curPlayer: continue AddNewAssistThanks(curPlayer, assistAwardItemID, mapID, lineID, assistPlayerDict, npcID) return def CrossServerMsg_BossAssistOver(queryType, queryData): ## ÊÕµ½¿ç·þ·þÎñÆ÷ - bossЭÖú½áÊø mapID, lineID, npcID, noAssistPlayerID, assistAwardItemID, assistPlayerDict = queryData GameWorld.Log("ÊÕµ½¿ç·þbossЭÖú½áÊø: mapID=%s,lineID=%s,npcID=%s,assistAwardItemID=%s,assistPlayerDict=%s" % (mapID, lineID, npcID, assistAwardItemID, assistPlayerDict), noAssistPlayerID) # ÐÂÔö¸ÐлÊý¾Ý playerMgr = GameWorld.GetPlayerManager() curPlayer = playerMgr.FindPlayerByID(noAssistPlayerID) if not curPlayer: return AddNewAssistThanks(curPlayer, assistAwardItemID, mapID, lineID, assistPlayerDict, npcID) # ֪ͨµØÍ¼Íæ¼Ò¸ø ЭÖúÀñºÐ queryData = [assistAwardItemID] QueryPlayerResult_PlayerAssist(curPlayer, "CrossNoAssistPlayerAward", queryData) # ֪ͨµØÍ¼Íæ¼Ò¸ø »îÔ¾»ý·Ö for assistPlayerID, assistInfo in assistPlayerDict.items(): assistPlayer = playerMgr.FindPlayerByID(assistPlayerID) if not assistPlayer: continue if "AssistMoney" not in assistInfo: continue assistMoney = assistInfo["AssistMoney"] isFriend = assistInfo["IsFriend"] queryData = [assistMoney, isFriend] QueryPlayerResult_PlayerAssist(assistPlayer, "CrossAssistPlayerAward", queryData) return def __DoFBAssistOver(queryData): ## ¸±±¾Ð­Öú½áÊø mapID, lineID, noAssistPlayerID, assistAwardItemID, assistPlayerDict = queryData assistMgr = PyDataManager.GetPlayerAssistPyManager() if noAssistPlayerID not in assistMgr.playerAssistDict: return playerAssistList = assistMgr.playerAssistDict[noAssistPlayerID] for assistObj in playerAssistList: if assistObj.MapID == mapID and assistObj.LineID == lineID: OnCancelPlayerRequestAssist(assistObj, "FBAssistOver", False) break if not assistAwardItemID or not assistPlayerDict: return # ÐÂÔö¸ÐлÊý¾Ý curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(noAssistPlayerID) if curPlayer: AddNewAssistThanks(curPlayer, assistAwardItemID, mapID, lineID, assistPlayerDict) return def AddNewAssistThanks(curPlayer, itemID, mapID, lineID, assistPlayerDict, npcID=0, exData=""): ## Ìí¼ÓЭÖú¸ÐлÊý¾Ý playerID = curPlayer.GetPlayerID() newThanks = PyGameDataStruct.tagDBAssistThanks() newThanks.GUID = str(uuid.uuid1()) newThanks.ItemID = itemID newThanks.FamilyID = curPlayer.GetFamilyID() newThanks.PlayerID = playerID newThanks.PlayerName = curPlayer.GetName() newThanks.Job = curPlayer.GetJob() newThanks.LV = curPlayer.GetLV() newThanks.RealmLV = curPlayer.GetOfficialRank() newThanks.MapID = mapID newThanks.LineID = lineID newThanks.NPCID = npcID newThanks.ExData = exData newThanks.ExDataLen = len(exData) newThanks.DailyDateStr = GameWorld.GetDailyDateStr() newThanks.TimeStr = GameWorld.GetCurrentDataTimeStr() newThanks.AssistPlayer = str(assistPlayerDict) newThanks.AssistPlayerLen = len(newThanks.AssistPlayer) assistThanksMgr = PyDataManager.GetPlayerAssistThanksPyManager() OnInitAssistThanksData(assistThanksMgr, newThanks) newThanks.Face = curPlayer.GetFace() newThanks.FacePic = curPlayer.GetFacePic() GameWorld.DebugLog("Ôö¼ÓЭÖú¸Ðл: itemID=%s,mapID=%s,lineID=%s,npcID=%s,exData=%s" % (itemID, mapID, lineID, npcID, exData), playerID) return #// B0 14 ʹÓÃЭÖú¸ÐлÀñºÐ #tagCGUseAssistThanksGift # #struct tagCGUseAssistThanksGift # #{ # tagHead Head; # DWORD ItemID; # BYTE IsPreview; //ÊÇ·ñÔ¤ÀÀ£¬·ÇÔ¤ÀÀ¼´È·ÈÏʹÓà #}; def OnUseAssistThanksGift(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) itemID = clientData.ItemID isPreview = clientData.IsPreview playerID = curPlayer.GetPlayerID() assistThanksMgr = PyDataManager.GetPlayerAssistThanksPyManager() useThanks = None if playerID not in assistThanksMgr.playerThanksDict: GameWorld.ErrLog("Íæ¼ÒûÓпÉʹÓõÄЭÖú¸ÐлÀñºÐ!", playerID) else: playerThanksList = assistThanksMgr.playerThanksDict[playerID] for thanks in playerThanksList: if itemID == thanks.ItemID: useThanks = thanks break if not useThanks: GameWorld.ErrLog("Íæ¼ÒûÓиÃЭÖú¸ÐлÀñºÐ!itemID=%s" % (itemID), playerID) #20210226 ÓÅ»¯ÎªÕÒ²»µ½Ð­ÖúÐÅÏ¢Ò²¿ÉÒÔʹÓ㬷ÀÖ¹µØÍ¼¿Û³ýÎïÆ·Ê§°Üµ¼ÖÂЭÖúÀñºÐÒ»Ö±Áô×ŶøÎÞ·¨Ê¹Óà #return GameWorld.DebugLog("Íæ¼ÒʹÓÃЭÖú¸ÐлÀñºÐ!itemID=%s,isPreview=%s" % (itemID, isPreview), playerID) # Ô¤ÀÀ if isPreview: previewPack = ChPyNetSendPack.tagGCUseAssistThanksGiftPreview() if not useThanks: previewPack.ItemID = itemID previewPack.MapID = 31140 # ÔÝËæÒâ¸øÒ»¸ö¿ÉЭÖúµÄµØÍ¼ID NetPackCommon.SendFakePack(curPlayer, previewPack) return previewPack.ItemID = useThanks.ItemID previewPack.MapID = useThanks.MapID previewPack.LineID = useThanks.LineID previewPack.NPCID = useThanks.NPCID previewPack.ExData = useThanks.ExData previewPack.ExDataLen = useThanks.ExDataLen previewPack.AssistPlayerList = [] for assistPlayerID, assistPlayerInfoDict in useThanks.AssistPlayerDict.items(): if "PlayerName" not in assistPlayerInfoDict: continue assistPlayerInfo = ChPyNetSendPack.tagGCAssistPlayerInfo() assistPlayerInfo.PlayerID = assistPlayerID assistPlayerInfo.PlayerName = assistPlayerInfoDict["PlayerName"] assistPlayerInfo.Job = assistPlayerInfoDict["Job"] assistPlayerInfo.LV = assistPlayerInfoDict["LV"] assistPlayerInfo.RealmLV = assistPlayerInfoDict["RealmLV"] assistPlayerInfo.Face = assistPlayerInfoDict.get("Face", 0) assistPlayerInfo.FacePic = assistPlayerInfoDict.get("FacePic", 0) previewPack.AssistPlayerList.append(assistPlayerInfo) previewPack.AssistPlayerCount = len(previewPack.AssistPlayerList) NetPackCommon.SendFakePack(curPlayer, previewPack) return ipyData = IpyGameDataPY.GetIpyGameData("AssistThanksGift", itemID) if not ipyData: return queryData = [itemID] QueryPlayerResult_PlayerAssist(curPlayer, "UseAssistThanksGift", queryData) if not useThanks: return useThanks.ThanksState = 1 # ÉèÖÃΪÒѸÐл playerThanksList.remove(useThanks) # ÒÆ³ýÒѸÐл # ֪ͨЭÖúÍæ¼Ò¿É½ÓÊյĸÐл¸öÊý playerMgr = GameWorld.GetPlayerManager() for assistPlayerID in useThanks.AssistPlayerDict.keys(): assistPlayer = playerMgr.FindPlayerByID(assistPlayerID) if assistPlayer: SyncCanGetAssistThanksGiftCount(assistPlayer) return #// B0 15 ½ÓÊÕЭÖú¸ÐлÀñÎï #tagCGGetAssistThanksGift # #struct tagCGGetAssistThanksGift # #{ # tagHead Head; # BYTE IsPreview; //ÊÇ·ñÔ¤ÀÀ£¬·ÇÔ¤ÀÀ¼´È·ÈÏÁìÈ¡£¬ÎÞ¶îÍâ½±ÀøÈ·ÈÏʱҲÐèÒª»Ø¸´ÁìÈ¡°ü´ú±íÒѶÁ #}; def OnGetAssistThanksGift(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) isPreview = clientData.IsPreview playerID = curPlayer.GetPlayerID() assistThanksMgr = PyDataManager.GetPlayerAssistThanksPyManager() if playerID not in assistThanksMgr.assistPlayerThanksDict: GameWorld.ErrLog("Íæ¼ÒûÓпɽÓÊÕ¸ÐлµÄЭÖú¸ÐлÀñºÐ!", playerID) return assistPlayerThanksList = assistThanksMgr.assistPlayerThanksDict[playerID] getThanks = None for thanks in assistPlayerThanksList: if thanks.ThanksState: getThanks = thanks break if not getThanks: GameWorld.ErrLog("ÕÒ²»µ½Íæ¼Ò¿É½ÓÊÕ¸ÐлµÄЭÖú¸ÐлÀñºÐ!", playerID) return itemID = getThanks.ItemID ipyData = IpyGameDataPY.GetIpyGameData("AssistThanksGift", itemID) if not ipyData: return if playerID not in getThanks.AssistPlayerDict: return assistPlayerInfoDict = getThanks.AssistPlayerDict[playerID] todayGiftCount = assistPlayerInfoDict.get("TodayGiftCount", 0) # ¸ÃÀñºÐµ±ÈÕÒÑÁìÈ¡¶îÍâ½±Àø´ÎÊý isExtraAward = 1 if todayGiftCount < ipyData.GetAssistAwardCount() else 0 GameWorld.DebugLog("½ÓÊÕЭÖú¸ÐлÀñÎï: itemID=%s,isPreview=%s,isExtraAward=%s,DailyDateStr=%s" % (itemID, isPreview, isExtraAward, getThanks.DailyDateStr), playerID) # Ô¤ÀÀ if isPreview: previewPack = ChPyNetSendPack.tagGCGetAssistThanksGiftPreview() previewPack.ItemID = getThanks.ItemID previewPack.PlayerID = getThanks.PlayerID previewPack.PlayerName = getThanks.PlayerName previewPack.Job = getThanks.Job previewPack.LV = getThanks.LV previewPack.RealmLV = getThanks.RealmLV previewPack.Face = getThanks.Face previewPack.FacePic = getThanks.FacePic previewPack.MapID = getThanks.MapID previewPack.LineID = getThanks.LineID previewPack.NPCID = getThanks.NPCID previewPack.ExData = getThanks.ExData previewPack.ExDataLen = len(getThanks.ExData) previewPack.TimeStr = getThanks.TimeStr previewPack.ExtraAward = isExtraAward NetPackCommon.SendFakePack(curPlayer, previewPack) return assistPlayerInfoDict["IsGet"] = 1 isAllGet = True for playerDict in getThanks.AssistPlayerDict.values(): if "IsGet" not in playerDict: isAllGet = False break # ËùÓÐÈ˶¼½ÓÊÕ¸ÐлÁË£¬É¾³ý¸ÃЭÖú¸ÐлÊý¾Ý if isAllGet: GameWorld.DebugLog(" ËùÓÐÈ˶¼¸ÐлÁË£¬ÒƳý¸ÃЭÖú¸Ðл!", playerID) if getThanks in assistThanksMgr.allAssistThanksList: assistThanksMgr.allAssistThanksList.remove(getThanks) assistPlayerThanksList.remove(getThanks) # ÒÆ³ý updateTodayGiftCount = todayGiftCount + 1 # ¸üе±Ìì¸ÃÀñºÐIDÒÑÁìÈ¡´ÎÊý for thanks in assistPlayerThanksList: if getThanks.DailyDateStr != thanks.DailyDateStr or getThanks.ItemID != thanks.ItemID: continue if playerID not in thanks.AssistPlayerDict: continue assistPlayerInfoDict = thanks.AssistPlayerDict[playerID] assistPlayerInfoDict["TodayGiftCount"] = updateTodayGiftCount SyncCanGetAssistThanksGiftCount(curPlayer, True) isCurDailyDate = getThanks.DailyDateStr == GameWorld.GetDailyDateStr() # Èç¹ûÊǾµÏñЭÖúµÄ£¬¸üнñÈÕ½ÓÊÕ¸ÐлÀñºÐ´ÎÊý if isCurDailyDate: if IpyGameDataPY.GetIpyGameDataNotLog("FBHelpBattle", getThanks.MapID, getThanks.LineID): PlayerFBHelpBattle.UpdateGetThanksGiftCountDict(curPlayer, itemID, updateTodayGiftCount) # ֪ͨµØÍ¼ queryData = [itemID, isExtraAward, isCurDailyDate, updateTodayGiftCount] QueryPlayerResult_PlayerAssist(curPlayer, "GetAssistThanksGift", queryData) return def SyncCanGetAssistThanksGiftCount(curPlayer, isForce=False): ## ֪ͨ¿É½ÓÊÕЭÖú¸ÐлÀñÎï¸öÊý playerID = curPlayer.GetPlayerID() assistThanksMgr = PyDataManager.GetPlayerAssistThanksPyManager() if playerID not in assistThanksMgr.assistPlayerThanksDict: return assistPlayerThanksList = assistThanksMgr.assistPlayerThanksDict[playerID] canGetCount = 0 for thanks in assistPlayerThanksList: if thanks.ThanksState: canGetCount += 1 if not canGetCount and not isForce: return countPack = ChPyNetSendPack.tagGCCanGetAssistThanksGiftCount() countPack.CanGetCount = canGetCount NetPackCommon.SendFakePack(curPlayer, countPack) return def SyncFamilyAssist(curPlayer): ## ͬ²½µ±Ç°ÏÉÃËËùÓÐЭÖúÇëÇóÐÅÏ¢ familyID = curPlayer.GetFamilyID() if not familyID: return assistMgr = PyDataManager.GetPlayerAssistPyManager() familyAssistList = [] for assistObj in assistMgr.allAssistDict.values(): if not assistObj.FamilyID or familyID != assistObj.FamilyID or assistObj.OffLineTime: continue familyAssistList.append(assistObj) if not familyAssistList: return NetPackCommon.SendFakePack(curPlayer, GetAssistInfoListPack(familyAssistList)) return def SyncFamilyClearAssist(familyID, assistGUID): # ·â°ü֪ͨÏÉÃËÇå³ýЭÖú clearPack = ChPyNetSendPack.tagGCClearAssist() clearPack.AssistGUID = assistGUID PlayerFamily.SendFamilyFakePack(familyID, clearPack) return def SyncServerAssist(assistList): # ֪ͨ±¾·þÍæ¼ÒЭÖúÇëÇóÐÅÏ¢ funcLimitLV = PlayerControl.GetFuncLimitLV(ShareDefine.GameFuncID_PenglaiBoss) clientPack = GetAssistInfoListPack(assistList) playerManager = GameWorld.GetPlayerManager() for i in xrange(playerManager.GetActivePlayerCount()): player = playerManager.GetActivePlayerAt(i) if player == None: continue if player.GetLV() < funcLimitLV: continue if PlayerControl.GetIsTJG(player): continue NetPackCommon.SendFakePack(player, clientPack) return def SyncServerClearAssist(assistGUID): # ֪ͨ±¾·þÍæ¼ÒÇå³ýЭÖú clearPack = ChPyNetSendPack.tagGCClearAssist() clearPack.AssistGUID = assistGUID funcLimitLV = PlayerControl.GetFuncLimitLV(ShareDefine.GameFuncID_PenglaiBoss) playerManager = GameWorld.GetPlayerManager() for i in xrange(playerManager.GetActivePlayerCount()): player = playerManager.GetActivePlayerAt(i) if player == None: continue if player.GetLV() < funcLimitLV: continue if PlayerControl.GetIsTJG(player): continue NetPackCommon.SendFakePack(player, clearPack) return