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/CoreServerGroup/GameServer/Script/GameWorld.py | 8
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py | 4
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerAssist.py | 44 ++++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCHurtManager.py | 92 +++++++--
ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/Assist.py | 19 ++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py | 4
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py | 2
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerAssist.py | 292 ++++++++++++++++++++++++++++++--
ServerPython/CoreServerGroup/GameServer/Script/PyDataManager.py | 14 -
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py | 4
10 files changed, 421 insertions(+), 62 deletions(-)
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/Assist.py b/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/Assist.py
index d9ead76..2a212f9 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/Assist.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/Assist.py
@@ -31,6 +31,7 @@
# @remarks 函数详细说明.
def OnExec(curPlayer, gmList):
+ isShowThanks = gmList[0] if len(gmList) > 0 else 0
assistMgr = PyDataManager.GetPlayerAssistPyManager()
GameWorld.Log("---------- 当前总协助条数: %s" % len(assistMgr.allAssistDict))
for assist in assistMgr.allAssistDict.values():
@@ -55,5 +56,23 @@
GameWorld.DebugLog("玩家协助中的: %s, %s" % (playerID, assist.GUID))
GameWorld.DebugLog("-----------------------------------------")
+ if not isShowThanks:
+ return
+
+ assistThanksMgr = PyDataManager.GetPlayerAssistThanksPyManager()
+ GameWorld.Log("---------- 未完结总感谢条数: %s" % len(assistThanksMgr.allAssistThanksList))
+ for playerID, thanksList in assistThanksMgr.playerThanksDict.items():
+ GameWorld.DebugLog("玩家未发送感谢数: %s, %s" % (playerID, len(thanksList)))
+ for i, thanks in enumerate(thanksList):
+ GameWorld.DebugLog(" i=%s, %s" % (i, thanks.outputString()))
+ GameWorld.DebugLog(" %s" % thanks.AssistPlayerDict)
+
+ for playerID, thanksList in assistThanksMgr.assistPlayerThanksDict.items():
+ GameWorld.DebugLog("玩家未接收感谢数: %s, %s" % (playerID, len(thanksList)))
+ for i, thanks in enumerate(thanksList):
+ GameWorld.DebugLog(" i=%s, %s" % (i, thanks.outputString()))
+ GameWorld.DebugLog(" %s" % thanks.AssistPlayerDict)
+
+ GameWorld.DebugLog("-----------------------------------------")
return
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py
index 6e70a9c..ae54f4e 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py
@@ -848,6 +848,14 @@
def GetDatetimeBySubDays(diffDays):
return datetime.datetime.today() - datetime.timedelta(days = diffDays)
+def GetDailyDateStr():
+ ## 获取日常日期 yyyy-MM-dd
+ curDate = GetServerTime()
+ if curDate.hour >= ShareDefine.Def_OnEventHour:
+ return "%d-%s-%s" % (curDate.year, curDate.month, curDate.day)
+ preDate = curDate - datetime.timedelta(days = -1) # 属于前一天
+ return "%s-%s-%s" % (preDate.year, preDate.month, preDate.day)
+
def IsCrossServer():
## 是否跨服服务器
return ToIntDef(ReadChConfig.GetPyMongoConfig("Merge", "IsMergeServer"), 0)
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerAssist.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerAssist.py
index 91db9e4..d1dba0a 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerAssist.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerAssist.py
@@ -15,7 +15,9 @@
#"""Version = 2019-12-06 21:00"""
#-------------------------------------------------------------------------------
+import PlayerFriend
import PyDataManager
+import IpyGameDataPY
import NetPackCommon
import PyGameDataStruct
import ChPyNetSendPack
@@ -39,6 +41,8 @@
def OnPlayerLogin(curPlayer, isTJ=False):
## 玩家上线
# @param isTJ: 是否脱机上线
+
+ SyncCanGetAssistThanksGiftCount(curPlayer)
familyID = curPlayer.GetFamilyID()
playerID = curPlayer.GetPlayerID()
@@ -155,6 +159,41 @@
assistType = AssistType_TeamFB
setattr(dbData, "AssistType", assistType) # 协助类型
setattr(dbData, "AssistPlayerIDList", []) # 协助中的玩家ID列表
+ return
+
+def OnInitAssistThanksData(thanksMgr, dbData):
+ ## 初始化协助感谢数据额外处理
+ setattr(dbData, "AssistPlayerDict", {})
+ if dbData.AssistPlayer and dbData.AssistPlayer.startswith("{") and dbData.AssistPlayer.endswith("}"):
+ dbData.AssistPlayerDict = eval(dbData.AssistPlayer)
+
+ thanksMgr.allAssistThanksList.append(dbData)
+ # 未感谢的
+ if not dbData.ThanksState:
+ playerID = dbData.PlayerID
+ if playerID not in thanksMgr.playerThanksDict:
+ thanksMgr.playerThanksDict[playerID] = []
+ playerThanksList = thanksMgr.playerThanksDict[playerID]
+ playerThanksList.append(dbData)
+
+ # 已经感谢的
+ else:
+ for assistPlayerID, assistPlayerInfo in dbData.AssistPlayerDict.items():
+ if "IsGet" in assistPlayerInfo:
+ # 已经接受感谢奖励的不再处理
+ continue
+
+ if assistPlayerID not in thanksMgr.assistPlayerThanksDict:
+ thanksMgr.assistPlayerThanksDict[assistPlayerID] = []
+ assistPlayerThanksList = thanksMgr.assistPlayerThanksDict[assistPlayerID]
+ assistPlayerThanksList.append(dbData)
+
+ return
+
+def OnSaveAssistThanksData(dbData):
+ ## 协助感谢保存数据额外处理
+ dbData.AssistPlayer = str(dbData.AssistPlayerDict)
+ dbData.AssistPlayerLen = len(dbData.AssistPlayer)
return
#// B0 12 开始协助Boss #tagCGStartAssistBoss
@@ -277,7 +316,8 @@
tagPlayerName = tagPlayer.GetName()
tagTeamID = tagPlayer.GetTeamID()
- assistData = [mapID, "Start", assistGUID, assistPlayerID, assistPlayerName, tagPlayerID, tagPlayerName, tagTeamID, lineID, objID, npcID]
+ isFriend = PlayerFriend.IsFriend(assistPlayerID, tagPlayerID)
+ assistData = [mapID, "Start", assistGUID, assistPlayerID, assistPlayerName, isFriend, tagPlayerID, tagPlayerName, tagTeamID, lineID, objID, npcID]
GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_AssistBoss, assistData)
return
@@ -322,17 +362,16 @@
# 取消boss协助发布
elif queryType == "OnCancelBossRequestAssist":
- mapID, lineID, npcID, objID, reason, cancelPlayerIDList = queryData
+ mapID, lineID, npcID, objID, reason = queryData
assistMgr = PyDataManager.GetPlayerAssistPyManager()
- for cancelPlayerID in cancelPlayerIDList:
- if cancelPlayerID in assistMgr.playerNoSaveDBAssistDict:
- playerAssistList = assistMgr.playerNoSaveDBAssistDict[cancelPlayerID]
- for assistObj in playerAssistList:
- if assistObj.MapID == mapID and assistObj.LineID == lineID and assistObj.NPCID == npcID and assistObj.ObjID == objID:
- OnCancelPlayerRequestAssist(assistObj, reason, False)
- break
+ if playerID in assistMgr.playerNoSaveDBAssistDict:
+ playerAssistList = assistMgr.playerNoSaveDBAssistDict[playerID]
+ for assistObj in playerAssistList:
+ if assistObj.MapID == mapID and assistObj.LineID == lineID and assistObj.NPCID == npcID and assistObj.ObjID == objID:
+ OnCancelPlayerRequestAssist(assistObj, reason, False)
+ break
return
-
+
# 取消协助Boss
elif queryType == "OnCancelBossAssist":
mapID, lineID, npcID, objID, reason = queryData
@@ -341,6 +380,11 @@
assistObj = assistMgr.playerAssistingDict[playerID]
if assistObj.MapID == mapID and assistObj.LineID == lineID and assistObj.NPCID == npcID and assistObj.ObjID == objID:
OnCancelPlayerAssist(curPlayer, playerID, assistObj, reason, False)
+ return
+
+ # boss协助结束
+ elif queryType == "OnBossAssistOver":
+ __DoBossAssistOver(queryData)
return
## -------------------------------------------------------------------------------------------
@@ -358,13 +402,13 @@
#QueryPlayerResult_PlayerAssist(curPlayer, queryType, queryData, result)
return
-#def QueryPlayerResult_PlayerAssist(curPlayer, queryType, queryData, result=[]):
-# if not curPlayer:
-# return
-# resultMsg = str([queryType, queryData, result])
-# curPlayer.MapServer_QueryPlayerResult(0, 0, "PlayerAssist", resultMsg, len(resultMsg))
-# GameWorld.DebugLog("协助信息发送 MapServer: playerID=%s,queryType=%s,queryData=%s" % (curPlayer.GetPlayerID(), queryType, queryData))
-# return
+def QueryPlayerResult_PlayerAssist(curPlayer, queryType, queryData, result=[]):
+ if not curPlayer:
+ return
+ resultMsg = str([queryType, queryData, result])
+ curPlayer.MapServer_QueryPlayerResult(0, 0, "PlayerAssist", resultMsg, len(resultMsg))
+ GameWorld.DebugLog("协助信息发送 MapServer: playerID=%s,queryType=%s,queryData=%s" % (curPlayer.GetPlayerID(), queryType, queryData))
+ return
def __DoRequestAssistBoss(curPlayer, queryData):
## 请求协助Boss
@@ -619,6 +663,61 @@
return
+def __DoBossAssistOver(queryData):
+ ## boss协助结束,一般是boss被击杀 或 被系统
+ mapID, lineID, npcID, objID, noAssistPlayerIDList, assistAwardItemID, assistAwardResult = queryData
+ assistMgr = PyDataManager.GetPlayerAssistPyManager()
+ for noAssistPlayerID in noAssistPlayerIDList:
+ if noAssistPlayerID not in assistMgr.playerNoSaveDBAssistDict:
+ continue
+ playerAssistList = assistMgr.playerNoSaveDBAssistDict[noAssistPlayerID]
+ for assistObj in playerAssistList:
+ if assistObj.MapID == mapID and assistObj.LineID == lineID and assistObj.NPCID == npcID and assistObj.ObjID == objID:
+ OnCancelPlayerRequestAssist(assistObj, "BossAssistOver", False)
+ break
+
+ if not assistAwardResult:
+ return
+
+ # 新增感谢数据
+ playerMgr = GameWorld.GetPlayerManager()
+ for playerID, assistPlayerDict in assistAwardResult.items():
+ curPlayer = playerMgr.FindPlayerByID(playerID)
+ if not curPlayer:
+ continue
+ __AddAssistThanks(curPlayer, assistAwardItemID, mapID, lineID, assistPlayerDict, npcID)
+
+ return
+
+def __AddAssistThanks(curPlayer, itemID, mapID, lineID, assistPlayerDict, npcID=0, exData=""):
+ ## 添加协助感谢数据
+
+ playerID = curPlayer.GetPlayerID()
+ newThanks = PyGameDataStruct.tagDBAssistThanks()
+ newThanks.GUID = str(uuid.uuid1())
+ newThanks.ItemID = itemID
+ newThanks.FamilyID = curPlayer.GetFamilyID()
+ newThanks.PlayerID = playerID
+ newThanks.PlayerName = curPlayer.GetName()
+ newThanks.Job = curPlayer.GetJob()
+ newThanks.LV = curPlayer.GetLV()
+ newThanks.RealmLV = curPlayer.GetOfficialRank()
+ newThanks.MapID = mapID
+ newThanks.LineID = lineID
+ newThanks.NPCID = npcID
+ newThanks.ExData = exData
+ newThanks.ExDataLen = len(exData)
+ newThanks.DailyDateStr = GameWorld.GetDailyDateStr()
+ newThanks.TimeStr = GameWorld.GetCurrentDataTimeStr()
+ newThanks.AssistPlayer = str(assistPlayerDict)
+ newThanks.AssistPlayerLen = len(newThanks.AssistPlayer)
+
+ assistThanksMgr = PyDataManager.GetPlayerAssistThanksPyManager()
+ OnInitAssistThanksData(assistThanksMgr, newThanks)
+
+ GameWorld.DebugLog("增加协助感谢: mapID=%s,lineID=%s,npcID=%s,exData=%s" % (mapID, lineID, npcID, exData), playerID)
+ return
+
#// B0 14 使用协助感谢礼盒 #tagCGUseAssistThanksGift
#
#struct tagCGUseAssistThanksGift
@@ -626,27 +725,176 @@
#{
# tagHead Head;
# DWORD ItemID;
-# char GiftGUID[40]; //预览时GUID不发,确认使用时需发送预览返回的GUID
+# BYTE IsPreview; //是否预览,非预览即确认使用
#};
def OnUseAssistThanksGift(index, clientData, tick):
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
itemID = clientData.ItemID
- giftGUID = clientData.GiftGUID
+ isPreview = clientData.IsPreview
+
+ playerID = curPlayer.GetPlayerID()
+ assistThanksMgr = PyDataManager.GetPlayerAssistThanksPyManager()
+ if playerID not in assistThanksMgr.playerThanksDict:
+ GameWorld.ErrLog("玩家没有可使用的协助感谢礼盒!", playerID)
+ return
+ useThanks = None
+ playerThanksList = assistThanksMgr.playerThanksDict[playerID]
+ for thanks in playerThanksList:
+ if itemID == thanks.ItemID:
+ useThanks = thanks
+ break
+ if not useThanks:
+ GameWorld.ErrLog("玩家没有该协助感谢礼盒!itemID=%s" % (itemID), playerID)
+ return
+
+ GameWorld.DebugLog("玩家使用协助感谢礼盒!itemID=%s,isPreview=%s" % (itemID, isPreview), playerID)
+ # 预览
+ if isPreview:
+ previewPack = ChPyNetSendPack.tagGCUseAssistThanksGiftPreview()
+ previewPack.ItemID = useThanks.ItemID
+ previewPack.MapID = useThanks.MapID
+ previewPack.LineID = useThanks.LineID
+ previewPack.NPCID = useThanks.NPCID
+ previewPack.ExData = useThanks.ExData
+ previewPack.ExDataLen = useThanks.ExDataLen
+ previewPack.AssistPlayerList = []
+ for assistPlayerID, assistPlayerInfoDict in useThanks.AssistPlayerDict.items():
+ if "PlayerName" not in assistPlayerInfoDict:
+ continue
+ assistPlayerInfo = ChPyNetSendPack.tagGCAssistPlayerInfo()
+ assistPlayerInfo.PlayerID = assistPlayerID
+ assistPlayerInfo.PlayerName = assistPlayerInfoDict["PlayerName"]
+ assistPlayerInfo.Job = assistPlayerInfoDict["Job"]
+ assistPlayerInfo.LV = assistPlayerInfoDict["LV"]
+ assistPlayerInfo.RealmLV = assistPlayerInfoDict["RealmLV"]
+ previewPack.AssistPlayerList.append(assistPlayerInfo)
+ previewPack.AssistPlayerCount = len(previewPack.AssistPlayerList)
+ NetPackCommon.SendFakePack(curPlayer, previewPack)
+ return
+
+ ipyData = IpyGameDataPY.GetIpyGameData("AssistThanksGift", itemID)
+ if not ipyData:
+ return
+
+ useThanks.ThanksState = 1 # 设置为已感谢
+ playerThanksList.remove(useThanks) # 移除已感谢
+ queryData = [itemID]
+ QueryPlayerResult_PlayerAssist(curPlayer, "UseAssistThanksGift", queryData)
+
+ # 加入协助玩家接收感谢列表
+ playerMgr = GameWorld.GetPlayerManager()
+ for assistPlayerID in useThanks.AssistPlayerDict.keys():
+ if assistPlayerID not in assistThanksMgr.assistPlayerThanksDict:
+ assistThanksMgr.assistPlayerThanksDict[assistPlayerID] = []
+ assistPlayerThanksList = assistThanksMgr.assistPlayerThanksDict[assistPlayerID]
+ assistPlayerThanksList.append(useThanks)
+ assistPlayer = playerMgr.FindPlayerByID(assistPlayerID)
+ if assistPlayer:
+ SyncCanGetAssistThanksGiftCount(assistPlayer, len(assistPlayerThanksList))
return
-#// B0 15 领取协助感谢礼物 #tagCGGetAssistThanksGift
+#// B0 15 接收协助感谢礼物 #tagCGGetAssistThanksGift
#
#struct tagCGGetAssistThanksGift
#
#{
# tagHead Head;
-# char GiftGUID[40]; //礼盒GUID
+# BYTE IsPreview; //是否预览,非预览即确认领取,无额外奖励确认时也需要回复领取包代表已读
#};
def OnGetAssistThanksGift(index, clientData, tick):
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
- giftGUID = clientData.GiftGUID
+ isPreview = clientData.IsPreview
+
+ playerID = curPlayer.GetPlayerID()
+ assistThanksMgr = PyDataManager.GetPlayerAssistThanksPyManager()
+ if playerID not in assistThanksMgr.assistPlayerThanksDict:
+ GameWorld.ErrLog("玩家没有可接收感谢的协助感谢礼盒!", playerID)
+ return
+ assistPlayerThanksList = assistThanksMgr.assistPlayerThanksDict[playerID]
+ if not assistPlayerThanksList:
+ return
+ getThanks = assistPlayerThanksList[0] # 默认接收第一个
+ itemID = getThanks.ItemID
+ ipyData = IpyGameDataPY.GetIpyGameData("AssistThanksGift", itemID)
+ if not ipyData:
+ return
+ if playerID not in getThanks.AssistPlayerDict:
+ return
+ assistPlayerInfoDict = getThanks.AssistPlayerDict[playerID]
+ todayGiftCount = assistPlayerInfoDict.get("TodayGiftCount", 0) # 该礼盒当日已领取额外奖励次数
+ isExtraAward = 1 if todayGiftCount < ipyData.GetAssistAwardCount() else 0
+
+ GameWorld.DebugLog("接收协助感谢礼物: itemID=%s,isPreview=%s,isExtraAward=%s,DailyDateStr=%s"
+ % (itemID, isPreview, isExtraAward, getThanks.DailyDateStr), playerID)
+
+ # 预览
+ if isPreview:
+ previewPack = ChPyNetSendPack.tagGCGetAssistThanksGiftPreview()
+ previewPack.ItemID = getThanks.ItemID
+ previewPack.PlayerID = getThanks.PlayerID
+ previewPack.PlayerName = getThanks.PlayerName
+ previewPack.Job = getThanks.Job
+ previewPack.LV = getThanks.LV
+ previewPack.RealmLV = getThanks.RealmLV
+ previewPack.MapID = getThanks.MapID
+ previewPack.LineID = getThanks.LineID
+ previewPack.NPCID = getThanks.NPCID
+ previewPack.ExData = getThanks.ExData
+ previewPack.ExDataLen = len(getThanks.ExData)
+ previewPack.TimeStr = getThanks.TimeStr
+ previewPack.ExtraAward = isExtraAward
+ NetPackCommon.SendFakePack(curPlayer, previewPack)
+ return
+
+ assistPlayerInfoDict["IsGet"] = 1
+ isAllGet = True
+ for playerDict in getThanks.AssistPlayerDict.values():
+ if "IsGet" not in playerDict:
+ isAllGet = False
+ break
+
+ # 所有人都接收感谢了,删除该协助感谢数据
+ if isAllGet:
+ GameWorld.DebugLog(" 所有人都感谢了,移除该协助感谢!", playerID)
+ if getThanks in assistThanksMgr.allAssistThanksList:
+ assistThanksMgr.allAssistThanksList.remove(getThanks)
+
+ assistPlayerThanksList.pop(0) # 移除
+
+ updateTodayGiftCount = todayGiftCount + 1
+ # 更新当天该礼盒ID已领取次数
+ for thanks in assistPlayerThanksList:
+ if getThanks.DailyDateStr != thanks.DailyDateStr or getThanks.ItemID != thanks.ItemID:
+ continue
+ if playerID not in thanks.AssistPlayerDict:
+ continue
+ assistPlayerInfoDict = thanks.AssistPlayerDict[playerID]
+ assistPlayerInfoDict["TodayGiftCount"] = updateTodayGiftCount
+
+ SyncCanGetAssistThanksGiftCount(curPlayer, len(assistPlayerThanksList))
+
+ # 通知地图
+ isCurDailyDate = getThanks.DailyDateStr == GameWorld.GetDailyDateStr()
+ queryData = [itemID, isExtraAward, isCurDailyDate, updateTodayGiftCount]
+ QueryPlayerResult_PlayerAssist(curPlayer, "GetAssistThanksGift", queryData)
return
+def SyncCanGetAssistThanksGiftCount(curPlayer, canGetCount=None):
+ ## 通知可接收协助感谢礼物个数
+ if canGetCount == None:
+ playerID = curPlayer.GetPlayerID()
+ assistThanksMgr = PyDataManager.GetPlayerAssistThanksPyManager()
+ if playerID not in assistThanksMgr.assistPlayerThanksDict:
+ return
+ assistPlayerThanksList = assistThanksMgr.assistPlayerThanksDict[playerID]
+ if not assistPlayerThanksList:
+ return
+ canGetCount = len(assistPlayerThanksList)
+ countPack = ChPyNetSendPack.tagGCCanGetAssistThanksGiftCount()
+ countPack.CanGetCount = canGetCount
+ NetPackCommon.SendFakePack(curPlayer, countPack)
+ return
+
def SyncFamilyAssist(curPlayer):
## 同步当前仙盟所有协助请求信息
familyID = curPlayer.GetFamilyID()
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/PyDataManager.py b/ServerPython/CoreServerGroup/GameServer/Script/PyDataManager.py
index 15f575f..5e225a8 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/PyDataManager.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/PyDataManager.py
@@ -47,8 +47,9 @@
class PlayerAssistThanksPyManager(object):
def __init__(self):
- self.assistThanksDict = {} # 所有感谢 {GUID:tagDBAssistThanks, ...}
+ self.allAssistThanksList = [] # 所有感谢 [tagDBAssistThanks, ...]
self.playerThanksDict = {} # 玩家未感谢的 {playerID:[tagDBAssistThanks, ...], ...}
+ self.assistPlayerThanksDict = {} # 协助玩家未接受感谢的协助 {assistPlayerID:[tagDBAssistThanks, ...], ...}
return
# 保存数据 存数据库和realtimebackup
@@ -57,8 +58,9 @@
cntData = ""
cnt = 0
- for dbData in self.assistThanksDict.values():
+ for dbData in self.allAssistThanksList:
cnt += 1
+ PlayerAssist.OnSaveAssistThanksData(dbData)
savaData += dbData.getBuffer()
GameWorld.Log("Save DBAssistThanks count :%s" % cnt)
@@ -73,13 +75,7 @@
dbData = PyGameDataStruct.tagDBAssistThanks()
dbData.clear()
pos += dbData.readData(datas, pos, dataslen)
-
- self.assistThanksDict[dbData.GUID] = dbData
- playerID = dbData.PlayerID
- if playerID not in self.playerThanksDict:
- self.playerThanksDict[playerID] = []
- playerThanksList = self.playerThanksDict[playerID]
- playerThanksList.append(dbData)
+ PlayerAssist.OnInitAssistThanksData(self, dbData)
return pos
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index 90856b2..464e1a3 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -3984,6 +3984,10 @@
#五行专精
Def_PDict_SkillElementID = "SkillElementID%s" #主技能选择的专精技能 参数主技能ID
Def_PDict_SkillElementLV = "SkillElementLV%s" #专精技能技能等级 参数技能ID
+
+#协助
+Def_PDict_GetThanksGiftCount = "GetThanksGiftCount_%s" # 协助方今日接收该感谢礼盒次数,参数(礼盒物品ID)
+
#-------------------------------------------------------------------------------
#可以从07 41封包购买的背包类型,和对应字典{背包类型:[字典key, 默认格子数]}
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py
index c90a941..b482b0e 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py
@@ -1039,8 +1039,8 @@
PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_Honor, itemCount)
elif itemID == ChConfig.Def_ItemID_GoldMoney:
PlayerControl.GiveMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Money, itemCount)
- elif itemID == ChConfig.Def_ItemID_XianyuanCoin:
- PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_XianyuanCoin, itemCount)
+ #elif itemID == ChConfig.Def_ItemID_XianyuanCoin:
+ # PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_XianyuanCoin, itemCount)
return True
def __CrossServerPutInItem(self, packIndex, tagItem, event=["", False, {}]):
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):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerAssist.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerAssist.py
index 3f0e579..fae0769 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerAssist.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerAssist.py
@@ -20,8 +20,19 @@
import PlayerControl
import NPCHurtManager
import IPY_GameWorld
-
+import ItemControler
+import ItemCommon
import ChConfig
+
+def DoPlayerOnDay(curPlayer):
+ ## 过天处理
+
+ ipyDataMgr = IpyGameDataPY.IPY_Data()
+ for index in xrange(ipyDataMgr.GetAssistThanksGiftCount()):
+ ipyData = ipyDataMgr.GetAssistThanksGiftByIndex(index)
+ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GetThanksGiftCount % ipyData.GetGiftID(), 0)
+
+ return
#// B0 10 请求协助Boss #tagCMRequestAssistBoss
#
@@ -117,8 +128,33 @@
## 协助信息GameServer返回处理
if len(resultList) != 3:
return
- #queryType, queryData, result = resultList
+ queryType, queryData, result = resultList
+ # 使用协助感谢礼盒给奖励
+ if queryType == "UseAssistThanksGift":
+ itemID = queryData[0]
+ giftItem = ItemCommon.FindItemInPackByItemID(curPlayer, itemID, IPY_GameWorld.rptItem)
+ if not giftItem:
+ return
+ ItemCommon.DelItem(curPlayer, giftItem, 1)
+
+ ipyData = IpyGameDataPY.GetIpyGameData("AssistThanksGift", itemID)
+ if ipyData:
+ awardItemID, awardItemCount = ipyData.GetRequestPlayerAward()
+ ItemControler.GivePlayerItemOrMail(curPlayer, [[awardItemID, awardItemCount, 0]])
+
+ # 接收协助感谢礼盒奖励给奖励
+ elif queryType == "GetAssistThanksGift":
+ itemID, isExtraAward, isCurDailyDate, updateTodayGiftCount = queryData
+ if isCurDailyDate:
+ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GetThanksGiftCount % itemID, updateTodayGiftCount)
+
+ if isExtraAward:
+ ipyData = IpyGameDataPY.GetIpyGameData("AssistThanksGift", itemID)
+ if ipyData:
+ awardItemID, awardItemCount = ipyData.GetAssistPlayerAward()
+ ItemControler.GivePlayerItemOrMail(curPlayer, [[awardItemID, awardItemCount, 0]])
+
return
def GameServer_AssistBossMsg(assistData):
@@ -130,12 +166,12 @@
# 开始协助
if msgType == "Start":
- assistGUID, assistPlayerID, assistPlayerName, tagPlayerID, tagPlayerName, tagTeamID, lineID, objID, npcID = assistData[1:]
+ assistGUID, assistPlayerID, assistPlayerName, isFriend, tagPlayerID, tagPlayerName, tagTeamID, lineID, objID, npcID = assistData[1:]
npchurtList = NPCHurtManager.GetPlayerHurtListEx(lineID, objID, npcID)
if not npchurtList:
return
- npchurtList.AddAssistPlayer(assistPlayerID, assistPlayerName, tagPlayerID, tagPlayerName, tagTeamID)
+ npchurtList.AddAssistPlayer(assistPlayerID, assistPlayerName, isFriend, tagPlayerID, tagPlayerName, tagTeamID)
QueryGameServer_PlayerAssist(0, "AddAssistBossPlayerOK", [assistGUID, assistPlayerID])
# 取消协助
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
index 1b8199b..f7d7a80 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
@@ -3172,9 +3172,9 @@
GameWorld.SendMsgToClientServer(ShareDefine.CrossServerMsg_GiveMoney, msgInfo, [serverGroupID])
return True
- ## 恺英版去除了仙缘币,改为直接获得绑玉灵石
+ ## 恺英版去除了仙缘币,改为获得仙盟活跃令
if priceType == ShareDefine.TYPE_Price_XianyuanCoin:
- priceType = IPY_GameWorld.TYPE_Price_Gold_Paper
+ priceType = ShareDefine.TYPE_Price_FamilyActivity
if priceType == IPY_GameWorld.TYPE_Price_Gold_Money:
if curPlayer.GetGold() + value > ChConfig.Def_PlayerTotalMoney_Gold:
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
index a68cb25..149b771 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
@@ -553,6 +553,8 @@
PlayerFairyDomain.OnDay(curPlayer)
#仙盟宴会
GameLogic_FamilyParty.OnDayFamilyPartyPlayer(curPlayer)
+ #协助
+ PlayerAssist.DoPlayerOnDay(curPlayer)
PlayerTJG.TJGOnDay(curPlayer, onEventType)
# 以下为支持两种重置模式切换配置的
--
Gitblit v1.8.0