From cc385fbb7443180fefe3a6bb36a693f84b3914f0 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期三, 15 八月 2018 18:17:44 +0800 Subject: [PATCH] Fix: 1382 【BUG】古神禁地杀死BOSS不涨怒气不掉东西无击杀人; 2540 【后端】掉落归属优化(增加死亡伤血保护时长配置); --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py | 114 +++++++++++++++++++++++--------------------------------- 1 files changed, 47 insertions(+), 67 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 de3baf4..59b7260 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py @@ -2789,6 +2789,12 @@ # 这种情况一般是玩家未加入队伍前对该NPC有伤血,加入到某个队伍后,将该伤害转移到队伍中 return True + if hurtPlayer.GetHP() <= 0 or hurtPlayer.GetPlayerAction() == IPY_GameWorld.paDie: + deadTime = hurtPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_DeadTime) + if time.time() - deadTime >= IpyGameDataPY.GetFuncCfg("BossHurtValue", 1): + #GameWorld.DebugLog("伤血玩家死亡超过伤血保护时长,清除该伤血!playerID=%s" % hurtID) + return True + #GameWorld.DebugLog("正常玩家伤血保护中!playerID=%s" % hurtID) return False @@ -2806,6 +2812,13 @@ if curTeamPlayer.GetCopyMapID() != copyMapID: #GameWorld.DebugLog("队员不在本线路,不计!playerID=%s" % playerID) continue + + if curTeamPlayer.GetHP() <= 0 or curTeamPlayer.GetPlayerAction() == IPY_GameWorld.paDie: + deadTime = curTeamPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_DeadTime) + if time.time() - deadTime >= IpyGameDataPY.GetFuncCfg("BossHurtValue", 1): + #GameWorld.DebugLog("伤血队员死亡超过伤血保护时长,不计!playerID=%s" % playerID) + continue + #if curTeamPlayer.GetHP() > 0 and self.GetIsInRefreshPoint(curTeamPlayer.GetPosX(), curTeamPlayer.GetPosY(), refreshPoint): if self.GetIsInRefreshPoint(curTeamPlayer.GetPosX(), curTeamPlayer.GetPosY(), refreshPoint): #GameWorld.DebugLog("有队员在boss范围内,保留队伍伤血!teamID=%s,playerID=%s" % (teamID, curTeamPlayer.GetPlayerID())) @@ -2945,7 +2958,7 @@ #获得伤血对象 hurtObj = npcHurtList.GetHurtAt(index) - curPlayer, curTeam = self.__GetTagByHurtObj(hurtObj, False) + curPlayer, curTeam = self.__GetTagByHurtObj(hurtObj, True) if curPlayer or curTeam: return hurtObj @@ -4149,55 +4162,12 @@ # @remarks 设置对象奖励 def __GiveObjPrize(self): curNPC = self.__Instance - objID = curNPC.GetID() + #objID = curNPC.GetID() npcID = curNPC.GetNPCID() self.__LastHurtPlayer = self.__FindLastTimeHurtObjEx() self.__MaxHurtPlayer = self.__FindBossMaxHurtObj() # py自定义伤血所得到的Boss最大伤血玩家 self.__AllKillerDict, curTeam, hurtType, hurtID = self.__FindNPCKillerInfo() - #isLog = self.__GetIsLog() - #if isLog: - # GameWorld.Log("__GiveObjPrize npcID=%s,hurtType=%s,hurtID=%s,allKillPlayer=%s,curTeam=%s" - # % (npcID, hurtType, hurtID, self.__AllKillerDict.keys(), curTeam.GetTeamID() if curTeam else None)) - - # 归属队伍时,有击杀次数限制的NPC特殊处理 - if hurtType == ChConfig.Def_NPCHurtTypeTeam and curTeam: - if ChConfig.IsGameBoss(curNPC) and GetDropOwnerType(curNPC) == ChConfig.DropOwnerType_MaxHurt: - #if isLog: - # GameWorld.DebugLog("击杀boss有次数限制的NPC,队伍人数=%s" % (curTeam.GetMemberCount())) - memInfoList = [] - for i in xrange(curTeam.GetMemberCount()): - curTeamPlayer = curTeam.GetMember(i) - if curTeamPlayer == None or curTeamPlayer.GetPlayerID() == 0: - #if isLog: - # GameWorld.DebugLog(" i=%s,队员不存在!" % i) - memInfoList.append(None) - continue - findBuff = SkillCommon.FindBuffByID(curTeamPlayer, ChConfig.Def_SkillID_DropOwnerBuff)[0] - if not findBuff: - #if isLog: - # GameWorld.DebugLog(" i=%s,找不到归属buff!" % i, curTeamPlayer.GetPlayerID()) - memInfoList.append([curTeamPlayer.GetPlayerID(), "Not DropOwnerBuff"]) - continue - #同一张地图可能有多个boss,该队伍可能同时在打多个boss,且都获得归属,所以需判断归属的buff所对应的NPC实例ID - if findBuff.GetOwnerType() != IPY_GameWorld.gotNPC or findBuff.GetOwnerID() != objID: - #if isLog: - # GameWorld.DebugLog(" i=%s,不同归属bossBuff,不能设置归属!objID=%s,curBuffOwnerID=%s" - # % (i, objID, findBuff.GetOwnerID()), curTeamPlayer.GetPlayerID()) - #GameWorld.DebugLog("不同归属bossbuff,不能设置归属!objID=%s,curBuffOwnerID=%s" - # % (objID, findBuff.GetOwnerID()), curTeamPlayer.GetPlayerID()) - memInfoList.append([curTeamPlayer.GetPlayerID(), {"OwnerType":findBuff.GetOwnerType(), "OwnerID":findBuff.GetOwnerID()}]) - continue - playerID = curTeamPlayer.GetPlayerID() - if playerID not in self.__AllKillerDict: - self.__AllKillerDict[playerID] = curTeamPlayer - memInfoList.append([playerID, 1]) - - curTeam = None - hurtType, hurtID = ChConfig.Def_NPCHurtTypeSpecial, 0 - - if not self.__AllKillerDict: - GameWorld.ErrLog("归属异常队伍信息: objID=%s,npcID=%s, %s" % (objID, npcID, memInfoList)) #最后一击处理 self.__DoLastTimeHurtLogic() @@ -4299,6 +4269,14 @@ def __FindNPCKillerInfo(self): curNPC = self.__Instance npcID = curNPC.GetNPCID() + objID = curNPC.GetID() + key = (GameWorld.GetGameWorld().GetLineID(), objID, npcID) + if key in PyGameData.g_npcKillerInfo: + killerDict, killTeam, hurtType, hurtID = PyGameData.g_npcKillerInfo.pop(key) + teamID = killTeam.GetTeamID() if killTeam else 0 + GameWorld.Log("NPC被击杀,归属信息: key=%s,playerIDList=%s,teamID=%s,hurtType=%s,hurtID=%s" + % (key, killerDict.keys(), teamID, hurtType, hurtID)) + return killerDict, killTeam, hurtType, hurtID hurtType = 0 hurtID = 0 @@ -4472,16 +4450,16 @@ # @param maxHurtObj 最大伤血对象 # @return 返回值, 伤血对象 # @remarks 获得伤血对象,支持抢怪 - def __GetTagByHurtObj(self, maxHurtObj, isLog=True): + def __GetTagByHurtObj(self, maxHurtObj, isCheckRefreshArea=False): #获得死亡的NPC curNPC = self.__Instance # 伤害的obj类型元组(玩家, 队伍) hurtObjTuple = (None, None) - #isLog = self.__GetIsLog() and isLog if maxHurtObj == None: GameWorld.DebugLog("伤血对象错误,npcID=%s" % (curNPC.GetNPCID())) return hurtObjTuple + refreshPoint = curNPC.GetRefreshPosAt(curNPC.GetCurRefreshPointIndex()) #最大伤血类型 maxHurtValueType = maxHurtObj.GetValueType() @@ -4489,21 +4467,18 @@ curPlayer = GameWorld.GetObj(maxHurtObj.GetValueID(), IPY_GameWorld.gotPlayer) if curPlayer == None: - #if isLog: - # GameWorld.DebugLog("无法找到玩家,npcID=%s" % (curNPC.GetNPCID())) return hurtObjTuple #支持抢怪,个人杀死,但自己死亡,不算 - if curPlayer.GetHP() <= 0 : - #if isLog: - # GameWorld.DebugLog("玩家已死亡!playerID=%s" % curPlayer.GetPlayerID()) + if curPlayer.GetHP() <= 0 or curPlayer.GetPlayerAction() == IPY_GameWorld.paDie: return hurtObjTuple + if isCheckRefreshArea: + if not self.GetIsInRefreshPoint(curPlayer.GetPosX(), curPlayer.GetPosY(), refreshPoint): + return hurtObjTuple #如果玩家已经超出指定距离,不加经验 - if GameWorld.GetDist(curNPC.GetPosX(), curNPC.GetPosY(), + elif GameWorld.GetDist(curNPC.GetPosX(), curNPC.GetPosY(), curPlayer.GetPosX(), curPlayer.GetPosY()) > ChConfig.Def_Team_GetExpScreenDist: - #if isLog: - # GameWorld.DebugLog("玩家已经超出指定距离,npcPos(%s,%s),playerPos(%s,%s)" % (curNPC.GetPosX(), curNPC.GetPosY(), curPlayer.GetPosX(), curPlayer.GetPosY())) return hurtObjTuple #正常返回 @@ -4515,31 +4490,36 @@ teamID = maxHurtObj.GetValueID() curTeam = GameWorld.GetTeamManager().FindTeam(teamID) if curTeam == None: - #if isLog: - # GameWorld.Log("该队伍异常不存在!npcID=%s,teamID=%s" % (curNPC.GetNPCID(), teamID)) return hurtObjTuple - #组队成员检查 - playerlist = PlayerControl.GetAreaTeamMember(curTeam, curNPC.GetPosX(), curNPC.GetPosY()) - if len(playerlist) == 0 : - #所有队伍成员,均超过获得奖励距离,或者全部死亡 + #遍历队伍,半径为一屏半的距离内的所有队伍/团队成员,可以获得经验 + for i in xrange(curTeam.GetMemberCount()): + curTeamPlayer = curTeam.GetMember(i) + if curTeamPlayer == None or curTeamPlayer.GetPlayerID() == 0: + continue + + if curTeamPlayer.GetHP() <= 0 or curTeamPlayer.GetPlayerAction() == IPY_GameWorld.paDie: + continue + + if isCheckRefreshArea: + if not self.GetIsInRefreshPoint(curTeamPlayer.GetPosX(), curTeamPlayer.GetPosY(), refreshPoint): + continue + elif GameWorld.GetDist(curNPC.GetPosX(), curNPC.GetPosY(), curTeamPlayer.GetPosX(), + curTeamPlayer.GetPosY()) > ChConfig.Def_Team_GetExpScreenDist: + continue + + hurtObjTuple = (None, curTeam) return hurtObjTuple - #正常返回 - hurtObjTuple = (None, curTeam) return hurtObjTuple #最大伤血对象是NPC,那么一定不给经验(玩家的召唤兽伤血算玩家) elif maxHurtValueType == ChConfig.Def_NPCHurtTypeNPC: - #if isLog: - # GameWorld.DebugLog("最大伤血对象是NPC...valueID=%s" % maxHurtObj.GetValueID()) return hurtObjTuple #异常信息,添加伤血类型错误 else: pass - #if isLog: - # GameWorld.Log("异常信息,伤血类型错误 maxHurtValueType = %s" % (maxHurtValueType)) return hurtObjTuple -- Gitblit v1.8.0