From 71639a932d820939f39feee51711e0bf04f19498 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期四, 30 八月 2018 17:06:49 +0800
Subject: [PATCH] Add: 3089 【后端】新增全服首杀掉落规则
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetNPCKillDrop.py | 12 ++++++
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py | 15 +++++++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py | 1
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py | 4 ++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py | 42 +++++++++++++++++++++
ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py | 1
6 files changed, 74 insertions(+), 1 deletions(-)
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py
index 61338f5..8e1857b 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py
@@ -1662,7 +1662,8 @@
def SendAllMapGlobalDropInfo():
# 同步所有地图所有全服掉落控制信息
- globalDropCDDict = IpyGameDataPY.GetFuncEvalCfg("GlobalDropCD") # {物品ID:分钟, ...}
+ globalDropCDDict = IpyGameDataPY.GetFuncEvalCfg("GlobalDropCD", 1) # {物品ID:分钟, ...}
+ globalKilledCountDropDict = IpyGameDataPY.GetFuncEvalCfg("GlobalDropCD", 2) # 全服击杀次数必掉
globalDropRateDict = IpyGameDataPY.GetFuncEvalCfg("NPCGlobalDropRate") # {物品ID:[[npcID列表], "概率公式"], ...}
for itemID in globalDropCDDict.keys():
@@ -1675,6 +1676,10 @@
killedCnt = PlayerDBGSEvent.GetDBGSTrig_ByKey(key)
GameWorld.SendMapServerMsgEx(key, killedCnt)
+ for npcID in globalKilledCountDropDict.keys():
+ key = ShareDefine.Def_Notify_WorldKey_NPCKilledCount % npcID
+ killedCnt = PlayerDBGSEvent.GetDBGSTrig_ByKey(key)
+ GameWorld.SendMapServerMsgEx(key, killedCnt)
return
def UpdGlobalDropCD(msgList):
@@ -1693,6 +1698,14 @@
GameWorld.SendMapServerMsgEx(key, updKilledCnt)
return
+def UpdGlobalKillCount(msgList):
+ ## 更新全局击杀次数
+ npcID, updKilledCnt = msgList
+ key = ShareDefine.Def_Notify_WorldKey_NPCKilledCount % npcID
+ PlayerDBGSEvent.SetDBGSTrig_ByKey(key, updKilledCnt)
+ GameWorld.SendMapServerMsgEx(key, updKilledCnt)
+ return
+
#---------------------------------------------------------------------
#//////////////////////////////////////////////////////////////
#//01 05 注册副本信息#tagGRegisterFBInfo
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py
index bcf2381..b447ae1 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py
@@ -634,6 +634,10 @@
if callName =="GlobalDropRate":
GameWorldProcess.UpdGlobalDropRate(eval(resultName))
return
+ # 全局击杀数统计
+ if callName =="GlobalKillCount":
+ GameWorldProcess.UpdGlobalKillCount(eval(resultName))
+ return
# 自定义商店全服限购次数清空
if callName =="ShopItemClearBuyCnt":
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
index c6f474d..7c75f72 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
@@ -152,6 +152,7 @@
Def_Notify_WorldKey_LastDropTime = "LastDropTime_%s" # 全局物品上次掉落时间, 参数(itemID)
Def_Notify_WorldKey_DropNPCKilledCnt = "DropNPCKilledCnt_%s" # 全局物品绑定的NPC击杀次数, 参数(itemID)
+Def_Notify_WorldKey_NPCKilledCount = "NPCKilledCount_%s" # 全局NPC被击杀次数, 参数(npcID)
Def_Notify_WorldKey_WorldAverageLv = "WorldAverageLv" #世界等级
Def_Notify_WorldKey_YdayLoginCnt= 'YdayLoginCnt' # 昨天总在线人数
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetNPCKillDrop.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetNPCKillDrop.py
index b20f7ce..75e794a 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetNPCKillDrop.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetNPCKillDrop.py
@@ -19,6 +19,7 @@
import IpyGameDataPY
import GameWorld
import ChConfig
+import ShareDefine
#---------------------------------------------------------------------
#逻辑实现
@@ -46,6 +47,17 @@
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_NPCKillCountDrop % npcID, 0)
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_NPCKillCount % npcID, 0)
resetNPCIDList.append(npcID)
+
+ gw = GameWorld.GetGameWorld()
+ globalKillDropDict = IpyGameDataPY.GetFuncEvalCfg("GlobalDropCD", 2)
+ for npcID in globalKillDropDict.keys():
+ killedCount = gw.GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_NPCKilledCount % npcID)
+ if not killedCount:
+ continue
+ msgInfo = str([npcID, 0])
+ GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, "GlobalKillCount", msgInfo, len(msgInfo))
+ resetNPCIDList.append(npcID)
+
GameWorld.DebugAnswer(curPlayer, "重置OK: %s" % resetNPCIDList)
return
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 4ce8874..e5e9691 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
@@ -1205,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):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
index c6f474d..7c75f72 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -152,6 +152,7 @@
Def_Notify_WorldKey_LastDropTime = "LastDropTime_%s" # 全局物品上次掉落时间, 参数(itemID)
Def_Notify_WorldKey_DropNPCKilledCnt = "DropNPCKilledCnt_%s" # 全局物品绑定的NPC击杀次数, 参数(itemID)
+Def_Notify_WorldKey_NPCKilledCount = "NPCKilledCount_%s" # 全局NPC被击杀次数, 参数(npcID)
Def_Notify_WorldKey_WorldAverageLv = "WorldAverageLv" #世界等级
Def_Notify_WorldKey_YdayLoginCnt= 'YdayLoginCnt' # 昨天总在线人数
--
Gitblit v1.8.0