From d93ad90b2991757ce3507339eea3d1b8b4e94990 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期一, 16 十一月 2020 15:31:12 +0800
Subject: [PATCH] 4860 【主干】【长尾】【BT】【后端】灵宠觉醒限制条件变更(去除满级才能觉醒限制);
---
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerAssist.py | 449 +++++++++++++++++++++++++++++++++++++++++++++++++------
1 files changed, 394 insertions(+), 55 deletions(-)
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerAssist.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerAssist.py
index 91db9e4..390f82b 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerAssist.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerAssist.py
@@ -15,9 +15,12 @@
#"""Version = 2019-12-06 21:00"""
#-------------------------------------------------------------------------------
+import PlayerFriend
import PyDataManager
+import IpyGameDataPY
import NetPackCommon
import PyGameDataStruct
+import PlayerFBHelpBattle
import ChPyNetSendPack
import PlayerControl
import PlayerFamily
@@ -39,6 +42,8 @@
def OnPlayerLogin(curPlayer, isTJ=False):
## 玩家上线
# @param isTJ: 是否脱机上线
+
+ SyncCanGetAssistThanksGiftCount(curPlayer)
familyID = curPlayer.GetFamilyID()
playerID = curPlayer.GetPlayerID()
@@ -140,6 +145,25 @@
return
+def OnPlayerTeamChange(curPlayer):
+ ## 玩家队伍变更
+
+ if curPlayer.GetTeamID():
+ return
+ playerID = curPlayer.GetPlayerID()
+
+ assistMgr = PyDataManager.GetPlayerAssistPyManager()
+ if playerID not in assistMgr.playerNoSaveDBAssistDict:
+ return
+ playerAssistList = assistMgr.playerNoSaveDBAssistDict[playerID]
+
+ for assistObj in playerAssistList[::-1]:
+ gameMap = GameWorld.GetMap(assistObj.MapID)
+ if gameMap and gameMap.GetMapFBType() == ChConfig.fbtTeam:
+ OnCancelPlayerRequestAssist(assistObj, "LeaveTeam", True)
+
+ return
+
def OnInitAssistData(dbData, isSaveDB):
## 加载协助数据额外处理
setattr(dbData, "IsSaveDB", isSaveDB) # 是否保存数据库,离线可协助的需要存库,如挖矿类
@@ -155,6 +179,39 @@
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)
+
+ 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
@@ -184,21 +241,27 @@
GameWorld.DebugLog("非同盟玩家不能协助!")
return
+ playerMapID = curPlayer.GetMapID()
mapID = assistObj.MapID
lineID = assistObj.LineID
- gameMap = GameWorld.GetMap(mapID)
- if not gameMap:
+ playerMap = GameWorld.GetMap(playerMapID)
+ if not playerMap:
return
- if gameMap.GetMapFBType() != ChConfig.fbtNull:
- playerMapID = curPlayer.GetMapID()
- playerLineID = PlayerControl.GetFBFuncLineID(curPlayer)
+ if playerMap.GetMapFBType() != ChConfig.fbtNull:
+ if mapID == ChConfig.Def_FBMapID_SealDemon:
+ playerLineID = PlayerControl.GetFBFuncLineID(curPlayer)
+ else:
+ playerLineID = curPlayer.GetFBID()
if playerMapID != mapID or playerLineID != lineID:
#副本中无法协助
PlayerControl.NotifyCode(curPlayer, "AssistFBLimit")
return
# 设定协助必须离开队伍
- if gameMap.GetMapFBType() != ChConfig.fbtTeam:
+ tagMap = GameWorld.GetMap(mapID)
+ if not tagMap:
+ return
+ if tagMap.GetMapFBType() != ChConfig.fbtTeam:
curTeam = curPlayer.GetTeam()
if curTeam:
PlayerTeam.DoPlayerLeaveTeam(curPlayer, curTeam, tick)
@@ -277,7 +340,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
@@ -291,13 +355,6 @@
assistPack = ChPyNetSendPack.tagGCAssistingInfo()
assistPack.AssistGUID = assistGUID
NetPackCommon.SendFakePack(assistPlayer, assistPack)
- return
-
-def SetPlayerStartAssistTeamFB(curPlayer, queryData):
- ## 开始协助组队副本 - 玩家进入副本后才真正进入协助状态
-
- #mapID, lineID, tagPlayerID = queryData
-
return
def MapServer_PlayerAssistLogic(curPlayer, msgList, tick):
@@ -322,17 +379,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 +397,16 @@
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
+
+ # 副本协助结束
+ elif queryType == "OnFBAssistOver":
+ __DoFBAssistOver(queryData)
return
## -------------------------------------------------------------------------------------------
@@ -352,19 +418,30 @@
# 开始协助组队副本
elif queryType == "OnStartAssistTeamFB":
- SetPlayerStartAssistTeamFB(curPlayer, queryData)
+ mapID, lineID, tagPlayerID = queryData
+ GameWorld.DebugLog(" 开始协助副本: mapID=%s,lineID=%s,tagPlayerID=%s" % (mapID, lineID, tagPlayerID), playerID)
+ # 副本协助暂时只处理设置协助目标ID
+ PlayerControl.SetAssistTagPlayerID(curPlayer, tagPlayerID)
+ return
+
+ # 取消协助组队副本
+ elif queryType == "OnCancelAssistTeamFB":
+ mapID, lineID, reason = queryData
+ GameWorld.DebugLog(" 开始协助副本: mapID=%s,lineID=%s,reason=%s" % (mapID, lineID, reason), playerID)
+ # 副本协助暂时只处理设置协助目标ID
+ PlayerControl.SetAssistTagPlayerID(curPlayer, 0)
return
#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
@@ -372,12 +449,12 @@
familyID = curPlayer.GetFamilyID()
if not familyID:
return
- mapID, lineID, npcID, objID = queryData
+ mapID, lineID, npcID, objID, npcLV = queryData
playerID = curPlayer.GetPlayerID()
- assistObj = None
- addNewAssist = True
+ reqAssistObj = None
+ addNewAssist = False
assistMgr = PyDataManager.GetPlayerAssistPyManager()
if playerID in assistMgr.playerNoSaveDBAssistDict:
playerAssistList = assistMgr.playerNoSaveDBAssistDict[playerID]
@@ -387,19 +464,28 @@
if npcID != assistObj.NPCID or lineID != assistObj.LineID or objID != assistObj.ObjID:
OnCancelPlayerRequestAssist(assistObj, "RequestNewAssistBoss", True)
else:
- addNewAssist = False
+ reqAssistObj = assistObj
break
- if addNewAssist:
- assistObj = __AddNewAssist(assistMgr, curPlayer, mapID, lineID, npcID, objID)
+ if not reqAssistObj:
+ addNewAssist = True
+ reqAssistObj = __AddNewAssist(assistMgr, curPlayer, mapID, lineID, npcID, objID)
- if not assistObj:
+ if not reqAssistObj:
return
# 通知本仙盟玩家
- PlayerFamily.SendFamilyFakePack(familyID, GetAssistInfoListPack([assistObj]))
+ PlayerFamily.SendFamilyFakePack(familyID, GetAssistInfoListPack([reqAssistObj]))
# 求助信息已发送,请等待盟友支援
PlayerControl.NotifyCode(curPlayer, "AssistRequestOK")
+
+ # 广播仙盟请求
+ requestCount = 1
+ if not addNewAssist:
+ requestCount = min(curPlayer.GetDictByKey("AssistBossRequestCount") + 1, 999)
+ curPlayer.SetDict("AssistBossRequestCount", requestCount)
+ notifyNum = (requestCount - 1) % 3
+ PlayerControl.FamilyNotify(familyID, "AssistBossRequest%s" % notifyNum, [curPlayer.GetName(), mapID, npcLV, npcID])
return
def __DoRequestAssistTeamFB(curPlayer, queryData):
@@ -412,7 +498,7 @@
playerID = curPlayer.GetPlayerID()
- assistObj = None
+ reqAssistObj = None
addNewAssist = False
assistMgr = PyDataManager.GetPlayerAssistPyManager()
if playerID in assistMgr.playerNoSaveDBAssistDict:
@@ -422,21 +508,28 @@
continue
if mapID != assistObj.MapID or lineID != assistObj.LineID:
OnCancelPlayerRequestAssist(assistObj, "RequestNewAssistTeamFB", True)
- addNewAssist = True
- break
- else:
+ else:
+ reqAssistObj = assistObj
+ break
+
+ if not reqAssistObj:
addNewAssist = True
+ reqAssistObj = __AddNewAssist(assistMgr, curPlayer, mapID, lineID)
- if addNewAssist:
- assistObj = __AddNewAssist(assistMgr, curPlayer, mapID, lineID)
-
- if not assistObj:
+ if not reqAssistObj:
return
# 通知本仙盟玩家
- PlayerFamily.SendFamilyFakePack(familyID, GetAssistInfoListPack([assistObj]))
+ PlayerFamily.SendFamilyFakePack(familyID, GetAssistInfoListPack([reqAssistObj]))
# 求助信息已发送,请等待盟友支援
PlayerControl.NotifyCode(curPlayer, "AssistRequestOK")
+ # 广播仙盟请求
+ requestCount = 1
+ if not addNewAssist:
+ requestCount = min(curPlayer.GetDictByKey("AssistFBRequestCount") + 1, 999)
+ curPlayer.SetDict("AssistFBRequestCount", requestCount)
+ notifyNum = (requestCount - 1) % 3
+ PlayerControl.FamilyNotify(familyID, "AssistFBRequest%s" % notifyNum, [curPlayer.GetName(), mapID])
return
def __AddNewAssist(assistMgr, curPlayer, mapID, lineID, npcID=0, objID=0, exData="", isSaveDB=0):
@@ -485,6 +578,7 @@
for assistObj in familyAssistList:
assistInfo = ChPyNetSendPack.tagGCAssistInfo()
assistInfo.AssistGUID = assistObj.GUID
+ assistInfo.PlayerID = assistObj.PlayerID
assistInfo.PlayerName = assistObj.PlayerName
assistInfo.Job = assistObj.Job
assistInfo.LV = assistObj.LV
@@ -540,8 +634,6 @@
if assistObj in playerAssistList:
playerAssistList.remove(assistObj)
- SyncFamilyClearAssist(familyID, assistGUID)
-
# 取消boss协助
if assistType == AssistType_Boss:
@@ -562,6 +654,8 @@
# 暂不需要处理
pass
+ # 放最后
+ SyncFamilyClearAssist(familyID, assistGUID)
return
def OnCancelPlayerAssist(cancelPlayer, cancelPlayerID, assistObj, reason, isGameServer, isNotify=True):
@@ -597,7 +691,14 @@
assistObj.AssistPlayerIDList.remove(cancelPlayerID)
if cancelPlayer:
+ isTagPlayerReason = reason.startswith("RequestPlayerCancel_")
PlayerControl.SetAssistTagPlayerID(cancelPlayer, 0)
+ overPack = ChPyNetSendPack.tagGCAssistOver()
+ overPack.IsTagPlayerReason = isTagPlayerReason
+ overPack.Reason = reason[len("RequestPlayerCancel_"):] if isTagPlayerReason else reason
+ overPack.ReasonLen = len(overPack.Reason)
+ overPack.AssistGUID = assistGUID
+ NetPackCommon.SendFakePack(cancelPlayer, overPack)
# 取消boss协助
if assistObj.AssistType == AssistType_Boss:
@@ -619,6 +720,83 @@
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 assistAwardItemID or not assistAwardResult:
+ return
+
+ # 新增感谢数据
+ playerMgr = GameWorld.GetPlayerManager()
+ for playerID, assistPlayerDict in assistAwardResult.items():
+ curPlayer = playerMgr.FindPlayerByID(playerID)
+ if not curPlayer:
+ continue
+ AddNewAssistThanks(curPlayer, assistAwardItemID, mapID, lineID, assistPlayerDict, npcID)
+
+ return
+
+def __DoFBAssistOver(queryData):
+ ## 副本协助结束
+ mapID, lineID, noAssistPlayerID, assistAwardItemID, assistPlayerDict = queryData
+ assistMgr = PyDataManager.GetPlayerAssistPyManager()
+ if noAssistPlayerID not in assistMgr.playerNoSaveDBAssistDict:
+ return
+ playerAssistList = assistMgr.playerNoSaveDBAssistDict[noAssistPlayerID]
+ for assistObj in playerAssistList:
+ if assistObj.MapID == mapID and assistObj.LineID == lineID:
+ OnCancelPlayerRequestAssist(assistObj, "FBAssistOver", False)
+ break
+
+ if not assistAwardItemID or not assistPlayerDict:
+ return
+
+ # 新增感谢数据
+ curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(noAssistPlayerID)
+ if curPlayer:
+ AddNewAssistThanks(curPlayer, assistAwardItemID, mapID, lineID, assistPlayerDict)
+
+ return
+
+def AddNewAssistThanks(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("增加协助感谢: itemID=%s,mapID=%s,lineID=%s,npcID=%s,exData=%s" % (itemID, mapID, lineID, npcID, exData), playerID)
+ return
+
#// B0 14 使用协助感谢礼盒 #tagCGUseAssistThanksGift
#
#struct tagCGUseAssistThanksGift
@@ -626,27 +804,188 @@
#{
# 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():
+ assistPlayer = playerMgr.FindPlayerByID(assistPlayerID)
+ if assistPlayer:
+ SyncCanGetAssistThanksGiftCount(assistPlayer)
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]
+ getThanks = None
+ for thanks in assistPlayerThanksList:
+ if thanks.ThanksState:
+ getThanks = thanks
+ break
+ if not getThanks:
+ GameWorld.ErrLog("找不到玩家可接收感谢的协助感谢礼盒!", playerID)
+ return
+ 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.remove(getThanks) # 移除
+
+ 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, True)
+
+ isCurDailyDate = getThanks.DailyDateStr == GameWorld.GetDailyDateStr()
+
+ # 如果是镜像协助的,更新今日接收感谢礼盒次数
+ if isCurDailyDate:
+ if IpyGameDataPY.GetIpyGameDataNotLog("FBHelpBattle", getThanks.MapID, getThanks.LineID):
+ PlayerFBHelpBattle.UpdateGetThanksGiftCountDict(curPlayer, itemID, updateTodayGiftCount)
+
+ # 通知地图
+ queryData = [itemID, isExtraAward, isCurDailyDate, updateTodayGiftCount]
+ QueryPlayerResult_PlayerAssist(curPlayer, "GetAssistThanksGift", queryData)
return
+def SyncCanGetAssistThanksGiftCount(curPlayer, isForce=False):
+ ## 通知可接收协助感谢礼物个数
+
+ playerID = curPlayer.GetPlayerID()
+ assistThanksMgr = PyDataManager.GetPlayerAssistThanksPyManager()
+ if playerID not in assistThanksMgr.assistPlayerThanksDict:
+ return
+ assistPlayerThanksList = assistThanksMgr.assistPlayerThanksDict[playerID]
+ canGetCount = 0
+ for thanks in assistPlayerThanksList:
+ if thanks.ThanksState:
+ canGetCount += 1
+
+ if not canGetCount and not isForce:
+ return
+
+ countPack = ChPyNetSendPack.tagGCCanGetAssistThanksGiftCount()
+ countPack.CanGetCount = canGetCount
+ NetPackCommon.SendFakePack(curPlayer, countPack)
+ return
+
def SyncFamilyAssist(curPlayer):
## 同步当前仙盟所有协助请求信息
familyID = curPlayer.GetFamilyID()
--
Gitblit v1.8.0