From 1e3f8cd83080ab4f140f862b2b2a0e60282b521e Mon Sep 17 00:00:00 2001
From: xdh <xiefantasy@qq.com>
Date: 星期四, 30 八月 2018 20:11:31 +0800
Subject: [PATCH] fix:3106 【后端】新增守卫人皇参与奖励
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py | 123 +++++++++++++++++++++++++++++++++++++++-
1 files changed, 118 insertions(+), 5 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 91ab5a4..e5e9691 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
@@ -52,6 +52,7 @@
import PlayerMagicWeapon
import PlayerBossReborn
import PlayerFairyCeremony
+import FamilyRobBoss
import IpyGameDataPY
import PyGameData
import PlayerTeam
@@ -113,6 +114,7 @@
def GetFaction(curNPC): return curNPC.GetCountry()
def GetSkillAtkRate(curNPC): return curNPC.GetPoisionAtk() # 毒攻代表NPC技能伤害加成万分率
def GetFinalHurt(curNPC): return curNPC.GetFireAtk() # 火攻代表NPC最终固定伤害加成, 普攻也有效果
+def SetFinalHurt(curNPC, hurt): return curNPC.SetFireAtk(hurt) # 火攻代表NPC最终固定伤害加成, 普攻也有效果
def GetSkillEnhance(curNPC): return curNPC.GetWindAtk() # 风攻代表NPC 《普攻》 的技能附加伤害固定值
def GetNPCSeries(curNPC): return curNPC.GetPoisionDef() # 毒防字段代表NPC系,按二进制位区分
@@ -1203,6 +1205,48 @@
msgInfo = str([itemID, updKilledCnt])
GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, "GlobalDropRate", msgInfo, len(msgInfo))
+ # 4. 指定全服击杀次数必掉,算额外掉落
+ globalKillDropDict = IpyGameDataPY.GetFuncEvalCfg("GlobalDropCD", 2) # {NPCID:{击杀次数:[是否本职业, [物品ID, ...], [随机物品ID, ...]]}, ...}
+ if npcID in globalKillDropDict:
+ killCountDropDict = globalKillDropDict[npcID]
+ updNPCKilledCount = min(gw.GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_NPCKilledCount % npcID) + 1, ShareDefine.Def_UpperLimit_DWord)
+ GameWorld.DebugLog("更新全服击杀次数: %s" % updNPCKilledCount)
+ # 通知GameServer记录
+ msgInfo = str([npcID, updNPCKilledCount])
+ GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, "GlobalKillCount", msgInfo, len(msgInfo))
+ if updNPCKilledCount in killCountDropDict:
+ isJobLimit, itemIDList, randItemIDList = killCountDropDict[updNPCKilledCount]
+ for itemID in itemIDList:
+ if isJobLimit:
+ itemData = GameWorld.GetGameData().GetItemByTypeID(itemID)
+ if not itemData:
+ continue
+ itemJob = itemData.GetJobLimit() / 100
+ if itemJob and itemJob != curPlayer.GetJob():
+ # 非本职业可用,不掉落
+ GameWorld.DebugLog("全服击杀次数必掉,非本职业可用,不掉落! itemID=%s" % itemID)
+ continue
+ dropItemIDList.append(itemID)
+ GameWorld.DebugLog("全服击杀次数必掉物品: itemID=%s" % itemID)
+ if randItemIDList:
+ if isJobLimit:
+ randJobItemList = []
+ for rItemID in randItemIDList:
+ itemData = GameWorld.GetGameData().GetItemByTypeID(rItemID)
+ if not itemData:
+ continue
+ itemJob = itemData.GetJobLimit() / 100
+ if itemJob and itemJob != curPlayer.GetJob():
+ # 非本职业可用,不掉落
+ GameWorld.DebugLog("全服击杀次数必掉随机,非本职业可用,不掉落! rItemID=%s" % rItemID)
+ continue
+ randJobItemList.append(rItemID)
+ randItemID = random.choice(randJobItemList)
+ else:
+ randItemID = random.choice(randItemIDList)
+ dropItemIDList.append(randItemID)
+ GameWorld.DebugLog("全服击杀次数必掉随机物品: randItemID=%s" % randItemID)
+
return dropItemIDList
def __GetEquipIDList(npcID, classLV, color, placeList, star, itemJobList, tagPlace=None):
@@ -1945,11 +1989,14 @@
#因为存在boss分流,所以用gameFB字典,但是存活状态还是用GameWorld字典
GameWorld.GetGameFB().SetGameFBDict(ChConfig.Map_NPC_WorldBossDeadTick % npcid, GameWorld.GetGameWorld().GetTick())
+ if GetDropOwnerType(curNPC) == ChConfig.DropOwnerType_Family:
+ FamilyRobBoss.ClearFamilyOwnerBossHurt(curNPC)
+
# 清除队伍成员伤血列表
AttackCommon.ClearTeamPlayerHurtValue(curNPC)
# 清除自定义伤血列表
- BossHurtMng.ClearHurtValueList(curNPC)
+ #BossHurtMng.ClearHurtValueList(curNPC)
# C++设置npc死亡
curNPC.SetDead(curNPC.GetDictByKey(ChConfig.Def_NPCDead_Reason),
@@ -1983,6 +2030,9 @@
self.__Killer = None # 击杀者, 由各种规则得出, 一般也是物品归属的代表, 用于广播、记录等确保与归属一致
self.__AllKillerDict = {} # 所有击杀的玩家ID对应字典, 非队伍, 一般也是归属的拥有者
self.__FeelPlayerList = [] # 所有摸怪玩家列表,处理任务及某些逻辑用
+
+ self.__OwnerHurtType = 0
+ self.__OwnerHurtID = 0
return
#---------------------------------------------------------------------
## 移动到某一个点的附近点
@@ -2513,7 +2563,7 @@
self.__AddAngryValue(npcAngry, curObjID, curObjType, plusAngryValue, canPile)
#激活呆滞的NPC
- if curNPC.GetHP() > 0 and not curNPC.GetIsNeedProcess() :
+ if GameObj.GetHP(curNPC) > 0 and not curNPC.GetIsNeedProcess() :
curNPC.SetIsNeedProcess(True)
@@ -3358,6 +3408,9 @@
GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, 'GameWorldBossState',
'%s' % (msgList), len(str(msgList)))
+ if GetDropOwnerType(curNPC) == ChConfig.DropOwnerType_Family:
+ FamilyRobBoss.FamilyOwnerBossOnReborn(curNPC)
+
# 检查是否有光环, 在重生时处理,不然可能导致有些无战斗逻辑的怪物无法套上光环buff
skillManager = curNPC.GetSkillManager()
for index in xrange(skillManager.GetSkillCount()):
@@ -3735,7 +3788,7 @@
#=====================================================================================================
#boss伤血排行榜击杀逻辑
- BossHurtMng.BossOnKilled(curNPC)
+ #BossHurtMng.BossOnKilled(curNPC)
#掉落需要用到摸怪,所以在处理掉落奖励之前设置
self.__SetFeelNPCPlayerList()
@@ -3751,6 +3804,8 @@
# 记录boss击杀信息的NPC
bossIpyData = IpyGameDataPY.GetIpyGameDataListNotLog('BOSSInfo', npcID)
if bossIpyData:
+ 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)
#===========================================================================================
@@ -4196,7 +4251,8 @@
self.__MaxHurtPlayer = self.__FindBossMaxHurtObj() # py自定义伤血所得到的Boss最大伤血玩家
self.__AllKillerDict, curTeam, hurtType, hurtID = self.__FindNPCKillerInfo()
-
+ self.__OwnerHurtType, self.__OwnerHurtID = hurtType, hurtID
+
#最后一击处理
self.__DoLastTimeHurtLogic()
@@ -4226,6 +4282,10 @@
elif curTeam != None:
self.__KilledByTeamSetPrize(curTeam, hurtType, hurtID)
+ #被仙盟杀死
+ elif hurtType == ChConfig.Def_NPCHurtTypeFamily:
+ self.__KilledByFamilySetPrize(hurtType, hurtID)
+
else:
GameWorld.ErrLog("NPC归属异常:npcID=%s,hurtType=%s,hurtID=%s" % (npcID, hurtType, hurtID))
@@ -4620,7 +4680,60 @@
self.__NPCDropItem(dropPlayer, hurtType, hurtID, ownerPlayerList)
#GameWorld.Log("队伍杀死怪物奖励,逻辑成功结束")
return
-
+
+ def __KilledByFamilySetPrize(self, hurtType, hurtID):
+ ## 仙盟杀死NPC奖励逻辑
+ curNPC = self.__Instance
+
+ maxLV = 0
+ dropPlayer = None
+ ownerPlayerList = []
+ refreshPoint = curNPC.GetRefreshPosAt(curNPC.GetCurRefreshPointIndex())
+ copyPlayerMgr = GameWorld.GetMapCopyPlayerManager()
+ for index in xrange(copyPlayerMgr.GetPlayerCount()):
+ player = copyPlayerMgr.GetPlayerByIndex(index)
+ if not player:
+ continue
+
+ if player.GetFamilyID() != hurtID or not self.GetIsInRefreshPoint(player.GetPosX(), player.GetPosY(), refreshPoint):
+ continue
+
+ curPlayerLV = player.GetLV()
+ if maxLV < curPlayerLV:
+ maxLV = curPlayerLV
+ dropPlayer = player
+ ownerPlayerList.append(player)
+
+ if not ownerPlayerList:
+ GameWorld.Log("奖励归属仙盟,但是不存在可获得该奖励的成员!npcID=%s,hurtType=%s,hurtID=%s"
+ % (curNPC.GetNPCID(), hurtType, hurtID))
+
+ # 因为仙盟归属boss归属伤血第一的仙盟,仙盟伤血有保护,可能存在伤血第一仙盟在boss死亡的时候都不在
+ # 此时掉落计算玩家算最后一击玩家,归属还是算伤血第一仙盟的
+ if not dropPlayer:
+ dropPlayer = self.__LastHurtPlayer
+
+ if not dropPlayer:
+ GameWorld.ErrLog("奖励归属仙盟,找不到掉落玩家!npcID=%s,hurtType=%s,hurtID=%s"
+ % (curNPC.GetNPCID(), hurtType, hurtID))
+ return
+
+ # 赶时间,先简单处理直接取最大等级的,之后可按实际情况来
+ if not self.__LastHurtPlayer:
+ self.__LastHurtPlayer = dropPlayer
+ if not self.__MaxHurtPlayer:
+ self.__MaxHurtPlayer = dropPlayer
+ if not self.__Killer:
+ self.__Killer = dropPlayer
+ maxHurtID = dropPlayer.GetPlayerID()
+
+ for curPlayer in ownerPlayerList:
+ self.__KillNPCFuncEx(curPlayer, curNPC, maxHurtID, False)
+
+ #调用物品掉落
+ self.__NPCDropItem(dropPlayer, hurtType, hurtID, ownerPlayerList)
+ return
+
## 队伍或自己击杀NPC扩展功能
# @param curPlayer
# @return None
--
Gitblit v1.8.0