| | |
| | | # @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():
|
| | |
| | | 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
|
| | |
|
| | |
| | | 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)
|
| | |
| | | #"""Version = 2019-12-06 21:00"""
|
| | | #-------------------------------------------------------------------------------
|
| | |
|
| | | import PlayerFriend
|
| | | import PyDataManager
|
| | | import IpyGameDataPY
|
| | | import NetPackCommon
|
| | | import PyGameDataStruct
|
| | | import ChPyNetSendPack
|
| | |
| | | def OnPlayerLogin(curPlayer, isTJ=False):
|
| | | ## 玩家上线
|
| | | # @param isTJ: 是否脱机上线
|
| | | |
| | | SyncCanGetAssistThanksGiftCount(curPlayer)
|
| | |
|
| | | familyID = curPlayer.GetFamilyID()
|
| | | playerID = curPlayer.GetPlayerID()
|
| | |
| | | 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
|
| | |
| | |
|
| | | 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
|
| | |
|
| | |
| | |
|
| | | # 取消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]
|
| | | 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)
|
| | |
| | | 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
|
| | |
|
| | | ## -------------------------------------------------------------------------------------------
|
| | |
| | | #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
|
| | |
| | |
|
| | | 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
|
| | |
| | | #{
|
| | | # 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
|
| | |
|
| | | #// B0 15 领取协助感谢礼物 #tagCGGetAssistThanksGift
|
| | | 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
|
| | | #
|
| | | #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):
|
| | |
| | | class PlayerAssistThanksPyManager(object):
|
| | |
|
| | | def __init__(self):
|
| | | self.assistThanksDict = {} # 所有感谢 {GUID:tagDBAssistThanks, ...}
|
| | | self.allAssistThanksList = [] # 所有感谢 [tagDBAssistThanks, ...]
|
| | | self.playerThanksDict = {} # 玩家未感谢的 {playerID:[tagDBAssistThanks, ...], ...}
|
| | | self.assistPlayerThanksDict = {} # 协助玩家未接受感谢的协助 {assistPlayerID:[tagDBAssistThanks, ...], ...}
|
| | | return
|
| | |
|
| | | # 保存数据 存数据库和realtimebackup
|
| | |
| | | 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)
|
| | |
| | | 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
|
| | |
|
| | |
| | | #五行专精
|
| | | Def_PDict_SkillElementID = "SkillElementID%s" #主技能选择的专精技能 参数主技能ID
|
| | | Def_PDict_SkillElementLV = "SkillElementLV%s" #专精技能技能等级 参数技能ID
|
| | |
|
| | | #协助
|
| | | Def_PDict_GetThanksGiftCount = "GetThanksGiftCount_%s" # 协助方今日接收该感谢礼盒次数,参数(礼盒物品ID)
|
| | |
|
| | | #-------------------------------------------------------------------------------
|
| | | #可以从07 41封包购买的背包类型,和对应字典{背包类型:[字典key, 默认格子数]}
|
| | |
|
| | |
| | | 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, {}]):
|
| | |
| | | import ShareDefine
|
| | | import PlayerTeam
|
| | | import NPCCommon
|
| | | import FBCommon
|
| | | import ChConfig
|
| | |
|
| | | import time
|
| | |
| | | self.__hurtType = ChConfig.Def_NPCHurtTypePlayer # 均默认是玩家
|
| | | self.__hurtName = ""
|
| | | self.__hurtValue = 0
|
| | | self.__isFriend = 0
|
| | | return
|
| | |
|
| | | def GetValueID(self): return self.__hurtID
|
| | |
| | | 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
|
| | |
| | |
|
| | | self.__hurtSortList = []
|
| | | self.__hurtDict = {} # 伤血列表实例字典,实际的NPC伤血列表实例,可能不是玩家{(hurtID, hurtType):HurtValueObj, ...}
|
| | | |
| | | self.__assistAwardItemID = 0 # 协助奖励礼盒ID
|
| | | self.__assistAwardResult = {} # {playerID:{assistPlayerID:{协助玩家信息数据字典}, ...}}
|
| | | return
|
| | |
|
| | | def Clear(self):
|
| | |
| | | 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
|
| | |
|
| | |
| | | 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
|
| | |
| | | % (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)
|
| | |
| | | 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
|
| | |
| | | # 地图删除的同步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:
|
| | |
| | | ''' 执行协助奖励逻辑
|
| | | '''
|
| | |
|
| | | 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
|
| | |
|
| | |
| | | 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
|
| | | #
|
| | |
| | | ## 协助信息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
|
| | |
|
| | |
| | |
|
| | | # 开始协助
|
| | | 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])
|
| | |
|
| | | # 取消协助
|
| | |
| | | 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:
|
| | |
| | | PlayerFairyDomain.OnDay(curPlayer)
|
| | | #仙盟宴会
|
| | | GameLogic_FamilyParty.OnDayFamilyPartyPlayer(curPlayer)
|
| | | #协助
|
| | | PlayerAssist.DoPlayerOnDay(curPlayer)
|
| | |
|
| | | PlayerTJG.TJGOnDay(curPlayer, onEventType)
|
| | | # 以下为支持两种重置模式切换配置的
|