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/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCHurtManager.py | 92 ++++++++++++++++++++++++++++++++++----------- 1 files changed, 69 insertions(+), 23 deletions(-) diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCHurtManager.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCHurtManager.py index 7e39069..2af4573 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCHurtManager.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCHurtManager.py @@ -30,6 +30,7 @@ import ShareDefine import PlayerTeam import NPCCommon +import FBCommon import ChConfig import time @@ -44,6 +45,7 @@ self.__hurtType = ChConfig.Def_NPCHurtTypePlayer # 均默认是玩家 self.__hurtName = "" self.__hurtValue = 0 + self.__isFriend = 0 return def GetValueID(self): return self.__hurtID @@ -54,6 +56,8 @@ def SetHurtName(self, hurtName): self.__hurtName = hurtName def GetHurtValue(self): return self.__hurtValue def SetHurtValue(self, hurtValue): self.__hurtValue = hurtValue + def GetIsFriend(self): return self.__isFriend + def SetIsFriend(self, isFriend): self.__isFriend = isFriend class PlayerHurtList(): ''' 伤血列表, 类似 IPY_GameObj.IPY_PlayerHurtList @@ -71,6 +75,9 @@ self.__hurtSortList = [] self.__hurtDict = {} # 伤血列表实例字典,实际的NPC伤血列表实例,可能不是玩家{(hurtID, hurtType):HurtValueObj, ...} + + self.__assistAwardItemID = 0 # 协助奖励礼盒ID + self.__assistAwardResult = {} # {playerID:{assistPlayerID:{协助玩家信息数据字典}, ...}} return def Clear(self): @@ -87,11 +94,11 @@ def OnDelete(self): # 删除伤血列表,NPC死亡调用 - cancelPlayerIDList = self.__noAssitPlayerIDDict.keys() - if cancelPlayerIDList: + noAssistPlayerIDList = self.__noAssitPlayerIDDict.keys() + if noAssistPlayerIDList: mapID = GameWorld.GetMap().GetMapID() - queryData = [mapID, self.lineID, self.npcID, self.objID, "OnBossDead", cancelPlayerIDList] - PlayerAssist.QueryGameServer_PlayerAssist(0, "OnCancelBossRequestAssist", queryData) + queryData = [mapID, self.lineID, self.npcID, self.objID, noAssistPlayerIDList, self.__assistAwardItemID, self.__assistAwardResult] + PlayerAssist.QueryGameServer_PlayerAssist(0, "OnBossAssistOver", queryData) return @@ -124,7 +131,7 @@ hurtPlayer.SetHurtName(playerName) return hurtPlayer - def AddAssistPlayer(self, assistPlayerID, assistPlayerName, tagPlayerID, tagPlayerName, tagTeamID): + def AddAssistPlayer(self, assistPlayerID, assistPlayerName, isFriend, tagPlayerID, tagPlayerName, tagTeamID): ## 添加助战玩家 # @param assistPlayerID: 协助玩家ID # @param tagPlayerID: 目标玩家ID,即发布协助的玩家ID @@ -138,8 +145,8 @@ % (assistPlayerID, tagPlayerID), self.npcID, self.lineID) return - GameWorld.DebugLog("新增协助玩家: assistPlayerID=%s,tagPlayerID=%s,tagTeamID=%s" - % (assistPlayerID, tagPlayerID, tagTeamID), self.npcID, self.lineID) + GameWorld.DebugLog("新增协助玩家: assistPlayerID=%s,tagPlayerID=%s,tagTeamID=%s,isFriend=%s" + % (assistPlayerID, tagPlayerID, tagTeamID, isFriend), self.npcID, self.lineID) if assistPlayerID in self.__noAssitPlayerIDDict: GameWorld.DebugLog("原来为常规玩家,需要先删除!", self.npcID, self.lineID) @@ -150,6 +157,8 @@ assistPlayerIDList.append(assistPlayerID) self.__assistPlayerIDDict[assistPlayerID] = tagPlayerID + assistHurtPlayer = self.__GetHurtPlayer(assistPlayerID, assistPlayerName) + assistHurtPlayer.SetIsFriend(isFriend) GameWorld.DebugLog(" self.__noAssitPlayerIDDict=%s" % (self.__noAssitPlayerIDDict), self.npcID, self.lineID) GameWorld.DebugLog(" self.__assistPlayerIDDict=%s" % (self.__assistPlayerIDDict), self.npcID, self.lineID) return @@ -177,9 +186,8 @@ # 地图删除的同步GameServer if isMapServerDel: mapID = GameWorld.GetMap().GetMapID() - cancelPlayerIDList = [playerID] - queryData = [mapID, self.lineID, self.npcID, self.objID, reason, cancelPlayerIDList] - PlayerAssist.QueryGameServer_PlayerAssist(0, "OnCancelBossRequestAssist", queryData) + queryData = [mapID, self.lineID, self.npcID, self.objID, reason] + PlayerAssist.QueryGameServer_PlayerAssist(playerID, "OnCancelBossRequestAssist", queryData) # 协助玩家 elif playerID in self.__assistPlayerIDDict: @@ -710,34 +718,72 @@ ''' 执行协助奖励逻辑 ''' - liheItemID = 2244 # 感谢礼盒物品ID,暂山寨,感谢系统再修改 + self.__assistAwardResult = {} + liheItemID, assistMoney = 0, 0 + mapAssistGiftDict = IpyGameDataPY.GetFuncEvalCfg("AssistAward", 2, {}) + mapID = FBCommon.GetRecordMapID(GameWorld.GetMap().GetMapID()) + if mapID in mapAssistGiftDict: + liheItemID, assistMoney = mapAssistGiftDict[mapID] + else: + killBossCntLimitDict = IpyGameDataPY.GetFuncEvalCfg('KillBossCntLimit') + index = GameWorld.GetDictValueByKey(killBossCntLimitDict, self.npcID) + if index == None: + return + bossAssistGiftDict = IpyGameDataPY.GetFuncEvalCfg("AssistAward", 1, {}) + if index not in bossAssistGiftDict: + GameWorld.DebugLog("该boss没有协助额外奖励!index=%s" % index, self.npcID) + return + liheItemID, assistMoney = bossAssistGiftDict[index] + + if not liheItemID or not assistMoney: + GameWorld.DebugLog("该副本或boss没有协助额外奖励!mapID=%s" % (mapID), self.npcID) + return + self.__assistAwardItemID = liheItemID + + friendAddAssistMoneyPer = IpyGameDataPY.GetFuncCfg("AssistAward", 3) GameWorld.DebugLog("执行协助奖励逻辑", self.npcID, self.lineID) copyPlayerManager = GameWorld.GetMapCopyPlayerManager() for playerID, assistPlayerIDList in self.__noAssitPlayerIDDict.items(): if not assistPlayerIDList: - GameWorld.DebugLog("发布方没有发布协助,不给奖励: playerID=%s" % playerID, self.npcID, self.lineID) + GameWorld.DebugLog("发布方没有发布协助,不处理: playerID=%s" % playerID, self.npcID, self.lineID) continue - player = copyPlayerManager.FindPlayerByID(playerID) - if player: - GameWorld.DebugLog("发布方给感谢礼盒奖励: playerID=%s" % playerID, self.npcID, self.lineID) - ItemControler.GivePlayerItemOrMail(player, [[liheItemID, 1, 0]]) - else: - GameWorld.DebugLog("发布方离线或不在本地图,不给感谢礼盒奖励: playerID=%s" % playerID, self.npcID, self.lineID) - + noAssistPlayer = copyPlayerManager.FindPlayerByID(playerID) + + assistAwardPlayerDict = {} + # 即使发布方不在线,协助方完成后也可获得活跃令奖励,只是不一定获得礼盒感谢奖励(礼盒感谢奖励需双方都在线) for assistPlayerID in assistPlayerIDList: assistHurtPlayer = self.__GetHurtPlayer(assistPlayerID) if not assistHurtPlayer.GetHurtValue(): GameWorld.DebugLog("协助方没有输出,不给奖励: assistPlayerID=%s" % assistPlayerID, self.npcID, self.lineID) continue - assPlayer = copyPlayerManager.FindPlayerByID(assistPlayerID) - if not assPlayer: + assistPlayer = copyPlayerManager.FindPlayerByID(assistPlayerID) + if not assistPlayer: GameWorld.DebugLog("协助方离线或不在本地图,不给活跃令奖励: assistPlayerID=%s" % assistPlayerID, self.npcID, self.lineID) continue - GameWorld.DebugLog("协助方给活跃令奖励: assistPlayerID=%s" % assistPlayerID, self.npcID, self.lineID) - PlayerControl.GiveMoney(assPlayer, ShareDefine.TYPE_Price_FamilyActivity, 35) + isFriend = assistHurtPlayer.GetIsFriend() + addAssistMoney = assistMoney + if isFriend and friendAddAssistMoneyPer: + addAssistMoney += int(assistMoney * friendAddAssistMoneyPer / 100.0) + GameWorld.DebugLog("协助方给活跃令奖励: assistPlayerID=%s,assistMoney=%s,isFriend=%s,addAssistMoney=%s" + % (assistPlayerID, assistMoney, isFriend, addAssistMoney), self.npcID, self.lineID) + PlayerControl.GiveMoney(assistPlayer, ShareDefine.TYPE_Price_XianyuanCoin, addAssistMoney) # 给活跃令无视发布方是否在线 + if noAssistPlayer: + todayGiftCount = assistPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GetThanksGiftCount % liheItemID) + assistAwardPlayerDict[assistPlayerID] = {"PlayerName":assistPlayer.GetPlayerName(), "Job":assistPlayer.GetJob(), + "LV":assistPlayer.GetLV(), "RealmLV":assistPlayer.GetOfficialRank(), + "TodayGiftCount":todayGiftCount} + + if not noAssistPlayer or not assistAwardPlayerDict: + GameWorld.DebugLog("发布方离线或无有效协助玩家在线,不给感谢礼盒奖励: playerID=%s" % playerID, self.npcID, self.lineID) + continue + + GameWorld.DebugLog("发布方给感谢礼盒奖励: playerID=%s" % playerID, self.npcID, self.lineID) + ItemControler.GivePlayerItemOrMail(noAssistPlayer, [[liheItemID, 1, 0]]) + self.__assistAwardResult[playerID] = assistAwardPlayerDict + return def __CmpHurtValue(self, hurtObjA, hurtObjB): -- Gitblit v1.8.0