From 9bdcc6b36e432272bd79d43b643e3614e73ef0f3 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期一, 14 一月 2019 16:12:44 +0800 Subject: [PATCH] 5722 【后端】【1.5】跨服BOSS开发(本服异兽之地Boss、跨服蓬莱仙境Boss 次数共享支持) --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py | 108 +++++++++++++++++++++++++++++++++-------------------- 1 files changed, 67 insertions(+), 41 deletions(-) diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py index 7229e00..86eec98 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py @@ -2094,13 +2094,13 @@ curNPC.GetDictByKey(ChConfig.Def_NPCDead_KillerID)) return -def GameServer_KillGameWorldBoss(bossID, killPlayerName, hurtValue, isNotify=True): +def GameServer_KillGameWorldBoss(bossID, killPlayerName, hurtValue, isNotify=True, killerIDList=[]): dataMapID = GameWorld.GetGameWorld().GetMapID() realMapID = GameWorld.GetGameWorld().GetRealMapID() copyMapID = GameWorld.GetGameWorld().GetCopyMapID() - killMsg = str([bossID, killPlayerName, hurtValue, isNotify, realMapID, dataMapID, copyMapID]) + killMsg = str([bossID, killPlayerName, hurtValue, isNotify, realMapID, dataMapID, copyMapID, killerIDList]) GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, 'KillGameWorldBoss', killMsg, len(killMsg)) - GameWorld.DebugLog("Boss被击杀: bossID=%s,dataMapID=%s,realMapID=%s,copyMapID=%s" % (bossID, dataMapID, realMapID, copyMapID)) + GameWorld.DebugLog("Boss被击杀: bossID=%s,dataMapID=%s,realMapID=%s,copyMapID=%s,killerIDList=%s" % (bossID, dataMapID, realMapID, copyMapID, killerIDList)) return def GameServe_GameWorldBossState(bossID, isAlive): @@ -2125,6 +2125,44 @@ GameWorld.GetGameWorld().SetGameWorldDict(ShareDefine.Def_Notify_WorldKey_GameWorldBossReborn % bossID, 0) return +def OnPlayerKillBoss(curPlayer, npcID, mapID, isCrossServer): + killBossCntLimitDict = IpyGameDataPY.GetFuncCfg('KillBossCntLimit', 1) + limitIndex = GameWorld.GetDictValueByKey(killBossCntLimitDict, npcID) + if limitIndex != None: + #今日杀怪次数+1 + key = ChConfig.Def_PDict_Boss_KillCnt % limitIndex + newCnt = curPlayer.NomalDictGetProperty(key, 0) + 1 + PlayerControl.NomalDictSetProperty(curPlayer, key, newCnt) + BossHurtMng.NotifyAttackBossCnt(curPlayer, limitIndex) + GameWorld.DebugLog("今日杀怪次数 playerID=%s, newCnt=%s" % (curPlayer.GetPlayerID(), newCnt)) + + dataDict = {"objID":npcID, "bossID":npcID, "touchCnt":newCnt, + "AccID":curPlayer.GetAccID(), "PlayerID":curPlayer.GetPlayerID()} + DataRecordPack.SendEventPack("AddKillBossCnt", dataDict, curPlayer) + + if isCrossServer: + return + + if limitIndex == ShareDefine.Def_Boss_Func_World: + # 世界BOSS击杀成就 + PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_KillWorldBoss, 1) + # 每日活动 + PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_WorldBOSS) + PlayerBossReborn.AddBossRebornActionCnt(curPlayer, ChConfig.Def_BRAct_WorldBOSS, 1) + PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_WorldBoss, 1) + PlayerWeekParty.AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_WorldBOSS, 1) + + if mapID == ChConfig.Def_FBMapID_BossHome: + #BOSS之家 + # BOSS之家BOSS击杀成就 + PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_KillBossHomeBoss, 1) + # 每日活动 + PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_BOSSHome) + PlayerBossReborn.AddBossRebornActionCnt(curPlayer, ChConfig.Def_BRAct_BOSSHome, 1) + PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_BossHome, 1) + PlayerWeekParty.AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_BOSSHome, 1) + return + ################################################# ## NPC控制定义 # @@ -2144,6 +2182,7 @@ self.__Killer = None # 击杀者, 由各种规则得出, 一般也是物品归属的代表, 用于广播、记录等确保与归属一致 self.__AllKillerDict = {} # 所有击杀的玩家ID对应字典, 非队伍, 一般也是归属的拥有者 self.__FeelPlayerList = [] # 所有摸怪玩家列表,处理任务及某些逻辑用 + self.__ownerPlayerList = [] # 归属者列表 self.__OwnerHurtType = 0 self.__OwnerHurtID = 0 @@ -3949,7 +3988,8 @@ if GetDropOwnerType(curNPC) == ChConfig.DropOwnerType_Family: killerName = FamilyRobBoss.FamilyOwnerBossOnKilled(curNPC, self.__OwnerHurtID) #KillerJob = 0 if not self.__Killer else self.__Killer.GetJob() - GameServer_KillGameWorldBoss(curNPC.GetNPCID(), killerName, 0) + killerIDList = [player.GetPlayerID() for player in self.__ownerPlayerList] + GameServer_KillGameWorldBoss(curNPC.GetNPCID(), killerName, 0, True, killerIDList) #=========================================================================================== # # 暗金boss # if curNPC.GetIsBoss() == ChConfig.Def_NPCType_Boss_Dark: @@ -4447,7 +4487,8 @@ dropPlayer = curPlayer self.__KilledByPlayerSetPrize(curPlayer) ownerPlayerList.append(curPlayer) - + self.__ownerPlayerList = ownerPlayerList + #调用物品掉落 self.__NPCDropItem(dropPlayer, hurtType, hurtID, ownerPlayerList) @@ -4889,6 +4930,7 @@ self.__DoNormalTeamExp(curPlayer) self.__KillNPCFuncEx(curPlayer, curNPC, maxHurtID, True) + self.__ownerPlayerList = ownerPlayerList #调用物品掉落 self.__NPCDropItem(dropPlayer, hurtType, hurtID, ownerPlayerList) @@ -4917,6 +4959,7 @@ maxLV = curPlayerLV dropPlayer = player ownerPlayerList.append(player) + self.__ownerPlayerList = ownerPlayerList if not ownerPlayerList: GameWorld.Log("奖励归属仙盟,但是不存在可获得该奖励的成员!npcID=%s,hurtType=%s,hurtID=%s" @@ -4957,48 +5000,31 @@ defObjType = curNPC.GetGameObjType() mapFBType = GameWorld.GetMap().GetMapFBType() mapID = FBCommon.GetRecordMapID(GameWorld.GetMap().GetMapID()) - playerID = curPlayer.GetPlayerID() + #playerID = curPlayer.GetPlayerID() # 如果是NPC - if defObjType == IPY_GameWorld.gotNPC: + if defObjType != IPY_GameWorld.gotNPC: + return + + # 跨服服务器处理 + if GameWorld.IsCrossServer(): #掉落归属 if mapFBType != IPY_GameWorld.fbtNull: FBLogic.DoFB_DropOwner(curPlayer , curNPC) - else: - if curNPC.GetLV()>=curPlayer.GetLV() - IpyGameDataPY.GetFuncCfg('DailyQuestKillMonster'): - PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_KillNPC) - killBossCntLimitDict = IpyGameDataPY.GetFuncCfg('KillBossCntLimit', 1) - limitIndex = GameWorld.GetDictValueByKey(killBossCntLimitDict, npcID) - if limitIndex != None: - #今日杀怪次数+1 - key = ChConfig.Def_PDict_Boss_KillCnt % limitIndex - newCnt = curPlayer.NomalDictGetProperty(key, 0) + 1 - PlayerControl.NomalDictSetProperty(curPlayer, key, newCnt) - BossHurtMng.NotifyAttackBossCnt(curPlayer, limitIndex) - GameWorld.DebugLog("今日杀怪次数 playerID=%s, newCnt=%s" % (curPlayer.GetPlayerID(), newCnt)) - - dataDict = {"objID":curNPC.GetID(), "bossID":npcID, "touchCnt":newCnt, - "AccID":curPlayer.GetAccID(), "PlayerID":curPlayer.GetPlayerID()} - DataRecordPack.SendEventPack("AddKillBossCnt", dataDict, curPlayer) - if limitIndex == 0: - # 世界BOSS击杀成就 - PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_KillWorldBoss, 1) - # 每日活动 - PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_WorldBOSS) - PlayerBossReborn.AddBossRebornActionCnt(curPlayer, ChConfig.Def_BRAct_WorldBOSS, 1) - PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_WorldBoss, 1) - PlayerWeekParty.AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_WorldBOSS, 1) - if ChConfig.IsGameBoss(curNPC) and mapID == ChConfig.Def_FBMapID_BossHome: - #BOSS之家 - # BOSS之家BOSS击杀成就 - PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_KillBossHomeBoss, 1) - # 每日活动 - PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_BOSSHome) - PlayerBossReborn.AddBossRebornActionCnt(curPlayer, ChConfig.Def_BRAct_BOSSHome, 1) - PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_BossHome, 1) - PlayerWeekParty.AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_BOSSHome, 1) + if ChConfig.IsGameBoss(curNPC): + OnPlayerKillBoss(curPlayer, npcID, mapID, True) + return + + #掉落归属 + if mapFBType != IPY_GameWorld.fbtNull: + FBLogic.DoFB_DropOwner(curPlayer , curNPC) + else: + if curNPC.GetLV()>=curPlayer.GetLV() - IpyGameDataPY.GetFuncCfg('DailyQuestKillMonster'): + PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_KillNPC) + if ChConfig.IsGameBoss(curNPC): + OnPlayerKillBoss(curPlayer, npcID, mapID, False) return #--------------------------------------------------------------------- @@ -5024,7 +5050,7 @@ #GameWorld.DebugLog("__MissionOnKillNPC isFeel=%s" % (isFeel), curPlayer.GetPlayerID()) killBossCntLimitDict = IpyGameDataPY.GetFuncCfg('KillBossCntLimit', 1) limitIndex = GameWorld.GetDictValueByKey(killBossCntLimitDict, npcID) - isWorldBoos = limitIndex == 0 + isWorldBoos = limitIndex == ShareDefine.Def_Boss_Func_World if isFeel: #击杀NPC触发摸怪任务事件 EventShell.EventRespons_OnKillByFeel(curPlayer, curNPC) -- Gitblit v1.8.0