From caef63ce5d50ef1456a2dd82926833027a40dc1c Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期一, 23 十二月 2019 20:56:48 +0800 Subject: [PATCH] 8346 【恺英】【后端】协助系统(修复同地图有伤害队员不在boss区域无法获得归属bug;修复第一名伤血无归属玩家时,会默认给其他玩家归属bug) --- ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldBoss.py | 131 +++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 125 insertions(+), 6 deletions(-) diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldBoss.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldBoss.py index cff77fa..ba4025e 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldBoss.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldBoss.py @@ -47,12 +47,21 @@ import PyGameData import PlayerGeTui import IPY_GameServer +import PlayerTeam import CrossBoss import PlayerFB import time +''' boss首杀 +ShareDefine.Def_UniversalGameRecType_BossFirstKill +value1:bossID +StrValue2:killedTimeStr +StrValue3:playerName,playerName,... ''' + + +''' boss击杀信息 ShareDefine.Def_UniversalGameRecType_BossInfo value1:bossID value2:killedTime @@ -140,6 +149,9 @@ horsePetRobBossIDList = IpyGameDataPY.GetFuncEvalCfg("FairyGrabBossID", 1) if bossID in horsePetRobBossIDList: OnFamilyKillHorsePetRobBoss(killPlayerName) + + # boss首杀 + OnBossFirstKill(bossID, killerIDList) return def __UpdateBossRefreshList(bossID, killedTime=0, refreshTime=0): @@ -548,9 +560,9 @@ def OnKillBossDropGoodItem(msgList, tick): # playerName, mapID, npcID, itemID, userData - if len(msgList) != 8: + if len(msgList) != 10: return - playerID, killerName, mapID, npcID, itemID, userData, weightValue, serverGroupID = msgList + playerID, killerName, mapID, lineID, npcID, itemID, userData, weightValue, serverGroupID, playerLV = msgList GameWorld.DebugLog("击杀Boss掉落好物品: mapID=%s,npcID=%s,killerName=%s,itemID=%s, userData=%s, weightValue=%s, serverGroupID=%s" % (mapID, npcID, killerName, itemID, userData, weightValue, serverGroupID)) maxRecordCnt = IpyGameDataPY.GetFuncCfg('DropRecordNum') @@ -595,10 +607,10 @@ if commonList and commonList[0][0] != -1: recordList.Delete(commonList[0][0]) - PlayerUniversalGameRec.MapServer_UniversalGameRec(None, recType, [mapID, npcID, itemID, playerID, weightValue], - [killerName, "", userData]) + PlayerUniversalGameRec.MapServer_UniversalGameRec(None, recType, [mapID*100+lineID, npcID, itemID, playerID, weightValue], + [killerName, '%s|%s'%(serverGroupID, playerLV), userData]) - msgList = [killerName, playerID, mapID, npcID, itemID, userData] + msgList = [killerName, playerID, mapID, npcID, itemID, userData, serverGroupID, playerLV, lineID] PlayerControl.WorldNotify(0, 'DropRecord' , msgList) return @@ -677,7 +689,7 @@ def SetBossRefreshTime(bossid, killedTime): '''设置boss刷新时间''' - ipyData = IpyGameDataPY.GetIpyGameData('BOSSInfo', bossid) + ipyData = IpyGameDataPY.GetIpyGameDataNotLog('BOSSInfo', bossid) if not ipyData: return onlineCnt = __GetBossOnlineHeroCnt(bossid)[0] @@ -1249,3 +1261,110 @@ PlayerControl.FamilyNotify(curFamily.GetID(), "FairyGrabBossHelp", [curPlayer.GetName(), npcID]) return +## -------------------------------------- boss 首杀 ------------------------------------------------ +def __GetBossFirstKillRecDataList(): + ## 获取boss首杀记录信息列表 + return GameWorld.GetUniversalRecMgr() .GetTypeList(ShareDefine.Def_UniversalGameRecType_BossFirstKill) + +def __GetBossFirstKillRecDataByID(bossID): + ## 获取boss首杀记录信息数据 + + recTypeListData = __GetBossFirstKillRecDataList() + # 查找是否已有记录 + bossFirstKillRec = None + for index in xrange(recTypeListData.Count()): + universalRecData = recTypeListData.At(index) + if universalRecData.GetValue1() == bossID: + bossFirstKillRec = universalRecData + break + + if bossFirstKillRec == None: + #还未记录,则添加一个记录对象 + bossFirstKillRec = recTypeListData.AddRec() + bossFirstKillRec.SetValue1(bossID) + + return bossFirstKillRec + +def OnBossFirstKill(bossID, killerIDList): + ## 处理boss首杀逻辑 + + maxOSDay = IpyGameDataPY.GetFuncCfg("OSCBossFirstKill", 1) + openServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerDay) + 1 + if openServerDay > maxOSDay: + GameWorld.DebugLog("超过开服天(%s), 不开放首杀活动!" % maxOSDay) + return + + if not bossID or not killerIDList: + return + + ipyData = IpyGameDataPY.GetIpyGameDataNotLog("BOSSFirstKill", bossID) + if not ipyData: + return + + fkRecData = __GetBossFirstKillRecDataByID(bossID) + if not fkRecData: + return + + firstKillTimeStr = fkRecData.GetStrValue2() + if firstKillTimeStr: + GameWorld.DebugLog("已经首杀过了! bossID=%s, %s" % (bossID, firstKillTimeStr)) + return + + killPlayerList = [] + playerMgr = GameWorld.GetPlayerManager() + for playerID in killerIDList: + player = playerMgr.FindPlayerByID(playerID) + if not player: + continue + teamMemLV = PlayerTeam.__GetPlayerTeamLV(player) + killPlayerList.append([teamMemLV, player.GetName()]) + if not killPlayerList: + return + + killPlayerList.sort(reverse=True) + fkPlayerNameList = [nameInfo[1] for nameInfo in killPlayerList] + + fkRecData.SetStrValue2(GameWorld.GetCurrentDataTimeStr()) + fkRecData.SetStrValue3(",".join(fkPlayerNameList)) + + # 首杀奖励邮件 + PlayerCompensation.SendMailByKey("BossFirstKillMail", killerIDList, ipyData.GetServerFirstKillPlayerAward(), [bossID]) + + ## 主动广播全服玩家 + PlayerUniversalGameRec.SendUniversalGameRecSingle(None, fkRecData) + return + + +#// A9 01 获取Boss首杀奖励 #tagCGGetBossFirstKillAward +# +#struct tagCGGetBossFirstKillAward +#{ +# tagHead Head; +# DWORD NPCID; +# BYTE AwardType; // 0-首杀红包奖励;1-个人首杀奖励 +#}; +def OnGetBossFirstKillAward(index, clientData, tick): + curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) + bossID = clientData.NPCID + awardType = clientData.AwardType + + ipyData = IpyGameDataPY.GetIpyGameDataNotLog("BOSSFirstKill", bossID) + if not ipyData: + return + + if awardType == 0: + fkRecData = __GetBossFirstKillRecDataByID(bossID) + if not fkRecData: + return + + firstKillTimeStr = fkRecData.GetStrValue2() + if not firstKillTimeStr: + GameWorld.DebugLog("Boss还未首杀,不能领取boss首杀公共红包奖励! bossID=%s" % (bossID), curPlayer.GetPlayerID()) + return + + msgInfo = str([bossID, awardType]) + curPlayer.MapServer_QueryPlayerResult(0, 0, "BossFirstKill", msgInfo, len(msgInfo)) + return + +## ------------------------------------------------------------------------------------------------ + -- Gitblit v1.8.0