From ec519cae8e5136fa593918628499f969b2bde334 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 16 四月 2021 10:33:06 +0800
Subject: [PATCH] 8873 【BT2】【主干】【后端】新增在线特惠(同步A109封包 主干)
---
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerAssist.py | 166 ++++++++++++++++++++++++++++++++++++++++++-------------
1 files changed, 126 insertions(+), 40 deletions(-)
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerAssist.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerAssist.py
index eb5faa8..143f5de 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerAssist.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerAssist.py
@@ -145,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) # 是否保存数据库,离线可协助的需要存库,如挖矿类
@@ -229,7 +248,10 @@
if not playerMap:
return
if playerMap.GetMapFBType() != ChConfig.fbtNull:
- playerLineID = curPlayer.GetFBID()
+ if mapID == ChConfig.Def_FBMapID_SealDemon:
+ playerLineID = PlayerControl.GetFBFuncLineID(curPlayer)
+ else:
+ playerLineID = curPlayer.GetFBID()
if playerMapID != mapID or playerLineID != lineID:
#副本中无法协助
PlayerControl.NotifyCode(curPlayer, "AssistFBLimit")
@@ -335,13 +357,6 @@
NetPackCommon.SendFakePack(assistPlayer, assistPack)
return
-def SetPlayerStartAssistTeamFB(curPlayer, queryData):
- ## 开始协助组队副本 - 玩家进入副本后才真正进入协助状态
-
- #mapID, lineID, tagPlayerID = queryData
-
- return
-
def MapServer_PlayerAssistLogic(curPlayer, msgList, tick):
## 地图同步的协助信息逻辑处理
@@ -389,6 +404,11 @@
__DoBossAssistOver(queryData)
return
+ # 副本协助结束
+ elif queryType == "OnFBAssistOver":
+ __DoFBAssistOver(queryData)
+ return
+
## -------------------------------------------------------------------------------------------
# 请求协助组队副本
@@ -398,7 +418,18 @@
# 开始协助组队副本
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)
@@ -418,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]
@@ -433,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):
@@ -458,7 +498,7 @@
playerID = curPlayer.GetPlayerID()
- assistObj = None
+ reqAssistObj = None
addNewAssist = False
assistMgr = PyDataManager.GetPlayerAssistPyManager()
if playerID in assistMgr.playerNoSaveDBAssistDict:
@@ -468,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):
@@ -531,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
@@ -586,8 +634,6 @@
if assistObj in playerAssistList:
playerAssistList.remove(assistObj)
- SyncFamilyClearAssist(familyID, assistGUID)
-
# 取消boss协助
if assistType == AssistType_Boss:
@@ -608,6 +654,8 @@
# 暂不需要处理
pass
+ # 放最后
+ SyncFamilyClearAssist(familyID, assistGUID)
return
def OnCancelPlayerAssist(cancelPlayer, cancelPlayerID, assistObj, reason, isGameServer, isNotify=True):
@@ -643,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:
@@ -678,7 +733,7 @@
OnCancelPlayerRequestAssist(assistObj, "BossAssistOver", False)
break
- if not assistAwardResult:
+ if not assistAwardItemID or not assistAwardResult:
return
# 新增感谢数据
@@ -688,6 +743,28 @@
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
@@ -736,23 +813,29 @@
playerID = curPlayer.GetPlayerID()
assistThanksMgr = PyDataManager.GetPlayerAssistThanksPyManager()
+ useThanks = None
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
+ else:
+ 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
+ #20210226 优化为找不到协助信息也可以使用,防止地图扣除物品失败导致协助礼盒一直留着而无法使用
+ #return
GameWorld.DebugLog("玩家使用协助感谢礼盒!itemID=%s,isPreview=%s" % (itemID, isPreview), playerID)
# 预览
if isPreview:
previewPack = ChPyNetSendPack.tagGCUseAssistThanksGiftPreview()
+ if not useThanks:
+ previewPack.ItemID = itemID
+ previewPack.MapID = 31140 # 暂随意给一个可协助的地图ID
+ NetPackCommon.SendFakePack(curPlayer, previewPack)
+ return
previewPack.ItemID = useThanks.ItemID
previewPack.MapID = useThanks.MapID
previewPack.LineID = useThanks.LineID
@@ -777,12 +860,15 @@
ipyData = IpyGameDataPY.GetIpyGameData("AssistThanksGift", itemID)
if not ipyData:
return
-
- useThanks.ThanksState = 1 # 设置为已感谢
- playerThanksList.remove(useThanks) # 移除已感谢
+
queryData = [itemID]
QueryPlayerResult_PlayerAssist(curPlayer, "UseAssistThanksGift", queryData)
+ if not useThanks:
+ return
+ useThanks.ThanksState = 1 # 设置为已感谢
+ playerThanksList.remove(useThanks) # 移除已感谢
+
# 通知协助玩家可接收的感谢个数
playerMgr = GameWorld.GetPlayerManager()
for assistPlayerID in useThanks.AssistPlayerDict.keys():
--
Gitblit v1.8.0