From bd6221811f055ff6fb6c3a58b308d48fbca2465a Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期二, 10 十二月 2019 21:32:18 +0800 Subject: [PATCH] 8346 【恺英】【后端】协助系统(感谢系统) --- ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerAssist.py | 292 ++++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 270 insertions(+), 22 deletions(-) diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerAssist.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerAssist.py index 91db9e4..d1dba0a 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerAssist.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerAssist.py @@ -15,7 +15,9 @@ #"""Version = 2019-12-06 21:00""" #------------------------------------------------------------------------------- +import PlayerFriend import PyDataManager +import IpyGameDataPY import NetPackCommon import PyGameDataStruct import ChPyNetSendPack @@ -39,6 +41,8 @@ def OnPlayerLogin(curPlayer, isTJ=False): ## 玩家上线 # @param isTJ: 是否脱机上线 + + SyncCanGetAssistThanksGiftCount(curPlayer) familyID = curPlayer.GetFamilyID() playerID = curPlayer.GetPlayerID() @@ -155,6 +159,41 @@ assistType = AssistType_TeamFB setattr(dbData, "AssistType", assistType) # 协助类型 setattr(dbData, "AssistPlayerIDList", []) # 协助中的玩家ID列表 + return + +def OnInitAssistThanksData(thanksMgr, dbData): + ## 初始化协助感谢数据额外处理 + 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) + + # 已经感谢的 + else: + 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 @@ -277,7 +316,8 @@ tagPlayerName = tagPlayer.GetName() tagTeamID = tagPlayer.GetTeamID() - assistData = [mapID, "Start", assistGUID, assistPlayerID, assistPlayerName, tagPlayerID, tagPlayerName, tagTeamID, lineID, objID, npcID] + isFriend = PlayerFriend.IsFriend(assistPlayerID, tagPlayerID) + assistData = [mapID, "Start", assistGUID, assistPlayerID, assistPlayerName, isFriend, tagPlayerID, tagPlayerName, tagTeamID, lineID, objID, npcID] GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_AssistBoss, assistData) return @@ -322,17 +362,16 @@ # 取消boss协助发布 elif queryType == "OnCancelBossRequestAssist": - mapID, lineID, npcID, objID, reason, cancelPlayerIDList = queryData + mapID, lineID, npcID, objID, reason = queryData assistMgr = PyDataManager.GetPlayerAssistPyManager() - for cancelPlayerID in cancelPlayerIDList: - if cancelPlayerID in assistMgr.playerNoSaveDBAssistDict: - playerAssistList = assistMgr.playerNoSaveDBAssistDict[cancelPlayerID] - 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 + if playerID in assistMgr.playerNoSaveDBAssistDict: + playerAssistList = assistMgr.playerNoSaveDBAssistDict[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 @@ -341,6 +380,11 @@ 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 ## ------------------------------------------------------------------------------------------- @@ -358,13 +402,13 @@ #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 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 @@ -619,6 +663,61 @@ return +def __DoBossAssistOver(queryData): + ## boss协助结束,一般是boss被击杀 或 被系统 + mapID, lineID, npcID, objID, noAssistPlayerIDList, assistAwardItemID, assistAwardResult = queryData + assistMgr = PyDataManager.GetPlayerAssistPyManager() + for noAssistPlayerID in noAssistPlayerIDList: + if noAssistPlayerID not in assistMgr.playerNoSaveDBAssistDict: + continue + playerAssistList = assistMgr.playerNoSaveDBAssistDict[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) + break + + if not assistAwardResult: + return + + # 新增感谢数据 + playerMgr = GameWorld.GetPlayerManager() + for playerID, assistPlayerDict in assistAwardResult.items(): + curPlayer = playerMgr.FindPlayerByID(playerID) + if not curPlayer: + continue + __AddAssistThanks(curPlayer, assistAwardItemID, mapID, lineID, assistPlayerDict, npcID) + + return + +def __AddAssistThanks(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) + + GameWorld.DebugLog("增加协助感谢: mapID=%s,lineID=%s,npcID=%s,exData=%s" % (mapID, lineID, npcID, exData), playerID) + return + #// B0 14 使用协助感谢礼盒 #tagCGUseAssistThanksGift # #struct tagCGUseAssistThanksGift @@ -626,27 +725,176 @@ #{ # tagHead Head; # DWORD ItemID; -# char GiftGUID[40]; //预览时GUID不发,确认使用时需发送预览返回的GUID +# BYTE IsPreview; //是否预览,非预览即确认使用 #}; def OnUseAssistThanksGift(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) itemID = clientData.ItemID - giftGUID = clientData.GiftGUID + isPreview = clientData.IsPreview + + playerID = curPlayer.GetPlayerID() + assistThanksMgr = PyDataManager.GetPlayerAssistThanksPyManager() + if playerID not in assistThanksMgr.playerThanksDict: + GameWorld.ErrLog("玩家没有可使用的协助感谢礼盒!", playerID) + return + useThanks = None + playerThanksList = assistThanksMgr.playerThanksDict[playerID] + for thanks in playerThanksList: + if itemID == thanks.ItemID: + useThanks = thanks + break + if not useThanks: + GameWorld.ErrLog("玩家没有该协助感谢礼盒!itemID=%s" % (itemID), playerID) + return + + GameWorld.DebugLog("玩家使用协助感谢礼盒!itemID=%s,isPreview=%s" % (itemID, isPreview), playerID) + # 预览 + if isPreview: + previewPack = ChPyNetSendPack.tagGCUseAssistThanksGiftPreview() + 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"] + previewPack.AssistPlayerList.append(assistPlayerInfo) + previewPack.AssistPlayerCount = len(previewPack.AssistPlayerList) + NetPackCommon.SendFakePack(curPlayer, previewPack) + return + + ipyData = IpyGameDataPY.GetIpyGameData("AssistThanksGift", itemID) + if not ipyData: + return + + useThanks.ThanksState = 1 # 设置为已感谢 + playerThanksList.remove(useThanks) # 移除已感谢 + queryData = [itemID] + QueryPlayerResult_PlayerAssist(curPlayer, "UseAssistThanksGift", queryData) + + # 加入协助玩家接收感谢列表 + playerMgr = GameWorld.GetPlayerManager() + for assistPlayerID in useThanks.AssistPlayerDict.keys(): + if assistPlayerID not in assistThanksMgr.assistPlayerThanksDict: + assistThanksMgr.assistPlayerThanksDict[assistPlayerID] = [] + assistPlayerThanksList = assistThanksMgr.assistPlayerThanksDict[assistPlayerID] + assistPlayerThanksList.append(useThanks) + assistPlayer = playerMgr.FindPlayerByID(assistPlayerID) + if assistPlayer: + SyncCanGetAssistThanksGiftCount(assistPlayer, len(assistPlayerThanksList)) return -#// B0 15 领取协助感谢礼物 #tagCGGetAssistThanksGift +#// B0 15 接收协助感谢礼物 #tagCGGetAssistThanksGift # #struct tagCGGetAssistThanksGift # #{ # tagHead Head; -# char GiftGUID[40]; //礼盒GUID +# BYTE IsPreview; //是否预览,非预览即确认领取,无额外奖励确认时也需要回复领取包代表已读 #}; def OnGetAssistThanksGift(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) - giftGUID = clientData.GiftGUID + isPreview = clientData.IsPreview + + playerID = curPlayer.GetPlayerID() + assistThanksMgr = PyDataManager.GetPlayerAssistThanksPyManager() + if playerID not in assistThanksMgr.assistPlayerThanksDict: + GameWorld.ErrLog("玩家没有可接收感谢的协助感谢礼盒!", playerID) + return + assistPlayerThanksList = assistThanksMgr.assistPlayerThanksDict[playerID] + if not assistPlayerThanksList: + return + getThanks = assistPlayerThanksList[0] # 默认接收第一个 + 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.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.pop(0) # 移除 + + 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, len(assistPlayerThanksList)) + + # 通知地图 + isCurDailyDate = getThanks.DailyDateStr == GameWorld.GetDailyDateStr() + queryData = [itemID, isExtraAward, isCurDailyDate, updateTodayGiftCount] + QueryPlayerResult_PlayerAssist(curPlayer, "GetAssistThanksGift", queryData) return +def SyncCanGetAssistThanksGiftCount(curPlayer, canGetCount=None): + ## 通知可接收协助感谢礼物个数 + if canGetCount == None: + playerID = curPlayer.GetPlayerID() + assistThanksMgr = PyDataManager.GetPlayerAssistThanksPyManager() + if playerID not in assistThanksMgr.assistPlayerThanksDict: + return + assistPlayerThanksList = assistThanksMgr.assistPlayerThanksDict[playerID] + if not assistPlayerThanksList: + return + canGetCount = len(assistPlayerThanksList) + countPack = ChPyNetSendPack.tagGCCanGetAssistThanksGiftCount() + countPack.CanGetCount = canGetCount + NetPackCommon.SendFakePack(curPlayer, countPack) + return + def SyncFamilyAssist(curPlayer): ## 同步当前仙盟所有协助请求信息 familyID = curPlayer.GetFamilyID() -- Gitblit v1.8.0