From 34a4f24e4513fb9b63eb1e88c49e3f5316b76791 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期四, 08 四月 2021 14:51:01 +0800 Subject: [PATCH] 8870 【BT2】【后端】战力、伤害、玩家生命的数值调整为大数值(瞬间群体/单体回血技能回血量支持超20E) --- ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldBoss.py | 230 +++++++++++++++++++++++++++++++++++++++++++++++--------- 1 files changed, 191 insertions(+), 39 deletions(-) diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldBoss.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldBoss.py index 867a071..79bce76 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldBoss.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldBoss.py @@ -47,11 +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 @@ -102,12 +112,12 @@ if bossID <= 0: return - bossID, killPlayerName, hurtValue, isNotify, realMapID, dataMapID, copyMapID, killerIDList = msgList + bossID, killPlayerName, hurtValue, isNotify, mapID, realMapID, copyMapID, killerIDList = msgList + mapID = PlayerFB.GetRecordMapID(mapID) if GameWorld.IsCrossServer(): - CrossBoss.DoCrossBossOnKilled(bossID, killPlayerName, realMapID, dataMapID, copyMapID, killerIDList) + CrossBoss.DoCrossBossOnKilled(bossID, killPlayerName, mapID, realMapID, copyMapID, killerIDList) return - mapID = dataMapID isAddKillCnt = False isMapNeedShunt = IsMapNeedBossShunt(mapID) @@ -139,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): @@ -158,13 +171,14 @@ ## 世界boss状态变更 if len(msgList) <= 0: return - - bossID, isAlive, dataMapID, realMapID, copyMapID = msgList + + bossID, isAlive, mapID, realMapID, copyMapID = msgList + mapID = PlayerFB.GetRecordMapID(mapID) if GameWorld.IsCrossServer(): - CrossBoss.DoCrossBossStateChange(bossID, isAlive, dataMapID, realMapID, copyMapID) + CrossBoss.DoCrossBossStateChange(bossID, isAlive, mapID, realMapID, copyMapID) return - mapID, lineID = dataMapID, copyMapID + lineID = copyMapID GameWorld.Log("世界boss状态变更: mapID=%s,lineID=%s,bossID=%s,state=%s,tick=%s" % (mapID, lineID, bossID, isAlive, tick)) if bossID <= 0: @@ -321,7 +335,19 @@ def OnQueryBossInfo(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) bossIDList = clientData.BossIDList - Sync_BossInfo(curPlayer, bossIDList) + if not bossIDList: + Sync_BossInfo(curPlayer) + CrossBoss.Sync_CrossBossInfo(curPlayer) + return + bossID = bossIDList[0] + ipyData = IpyGameDataPY.GetIpyGameData('BOSSInfo', bossID) + if not ipyData: + return + mapID = ipyData.GetMapID() + if mapID in ChConfig.Def_CrossMapIDList: + CrossBoss.Sync_CrossBossInfo(curPlayer, bossIDList) + else: + Sync_BossInfo(curPlayer, bossIDList) return @@ -365,6 +391,9 @@ # % (bossInfoObj.BossID, bossInfoObj.IsAlive, bossInfoObj.KillRecord, # killedTime, bossInfoObj.RefreshSecond)) + if not bossInfo.BossInfoList: + return + bossInfo.BossCnt = len(bossInfo.BossInfoList) if not curPlayer: # 全服广播在线玩家 @@ -403,6 +432,9 @@ if mapID in ChConfig.Def_CrossMapIDList: continue bossPrizeRec = __GetBossRecDataByID(bossID) + refreshTimeStr = ipyData.GetRefreshTime() + if not refreshTimeStr or refreshTimeStr == "0": + continue killedTime = bossPrizeRec.GetValue2() refreshTime = __GetBossRefreshTime(bossID) PyGameData.g_sortBOSSRefreshList.append([bossID, killedTime, refreshTime]) @@ -424,7 +456,7 @@ break #此处只处理复活的 - PlayerGeTui.GeTuiBossReborn(bossID) + #PlayerGeTui.GeTuiBossReborn(bossID) __SetIsAlive(bossID, 1) syncBOSSIDList.append(bossID) @@ -439,24 +471,25 @@ #BOSS个推提前倒计时通知处理, 复活由DoCheckWorldBossReborn处理 def ProcessBossGeTui(tick): - if not GameWorld.SetWorldDictKey(ChConfig.TYPE_WorldBossGeTuiTick, tick): - #间隔未到 - return - if GameWorld.IsCrossServer(): - return - curTime = int(time.time()) - for bossInfo in PyGameData.g_sortBOSSRefreshList: - bossID, killedTime, refreshTime = bossInfo - isAlive = __GetIsAlive(bossID) - if isAlive: - #GameWorld.DebugLog(" bossID=%s,未被击杀!" % bossID) - continue - rebornSecond = max(0, refreshTime - (curTime - killedTime)) - if not rebornSecond: - #不处理复活BOSS - continue - - PlayerGeTui.GeTuiBoss(bossID, rebornSecond) + return +# if not GameWorld.SetWorldDictKey(ChConfig.TYPE_WorldBossGeTuiTick, tick): +# #间隔未到 +# return +# if GameWorld.IsCrossServer(): +# return +# curTime = int(time.time()) +# for bossInfo in PyGameData.g_sortBOSSRefreshList: +# bossID, killedTime, refreshTime = bossInfo +# isAlive = __GetIsAlive(bossID) +# if isAlive: +# #GameWorld.DebugLog(" bossID=%s,未被击杀!" % bossID) +# continue +# rebornSecond = max(0, refreshTime - (curTime - killedTime)) +# if not rebornSecond: +# #不处理复活BOSS +# continue +# +# PlayerGeTui.GeTuiBoss(bossID, rebornSecond) def GetBossIsAliveOrCanReborn(bossID): @@ -482,9 +515,8 @@ isAlive = __GetIsAlive(bossID) if not isAlive: continue - mapID = ipyData.GetMapID() - if mapID not in ChConfig.WorldBossFBMapIDList: - GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_GameWorldBossReborn % bossID, 1) + #if mapID not in ChConfig.WorldBossFBMapIDList: + GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_GameWorldBossReborn % bossID, 1) return ## 玩家登录通知 @@ -535,9 +567,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') @@ -548,7 +580,7 @@ # 同步到玩家对应子服 if not serverGroupID: return - zoneIpyData = CrossRealmPlayer.GetCrossCommZoneIpyDataByServerGroupID(serverGroupID) + zoneIpyData = CrossRealmPlayer.GetCrossZoneIpyDataByServerGroupID(mapID, serverGroupID) if not zoneIpyData: return serverGroupIDList = zoneIpyData.GetServerGroupIDList() @@ -582,10 +614,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 @@ -664,7 +696,7 @@ def SetBossRefreshTime(bossid, killedTime): '''设置boss刷新时间''' - ipyData = IpyGameDataPY.GetIpyGameData('BOSSInfo', bossid) + ipyData = IpyGameDataPY.GetIpyGameDataNotLog('BOSSInfo', bossid) if not ipyData: return onlineCnt = __GetBossOnlineHeroCnt(bossid)[0] @@ -774,7 +806,7 @@ cnt += 1 savaData += attentionData.getBuffer() - GameWorld.Log("SaveBossAttention cnt :%s" % cnt) + GameWorld.Log("SaveBossAttention cnt :%s len=%s" % (cnt, len(savaData))) return CommFunc.WriteDWORD(cntData, cnt) + savaData # 从数据库载入数据 @@ -955,6 +987,11 @@ NetPackCommon.SendFakePack(curPlayer, bossShuntLineInfo) return +def BossRebornOnDayEx(): + ## boss复活过天 + PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_BossRebornCnt, 0) + Sync_BossRebornPoint() + return def AddBossRebornPoint(addPoint): ## 增加boss复活点 @@ -970,13 +1007,18 @@ if not totalPoint: GameWorld.Log(' 增加boss复活点 没有总点数!!!!') return + rebornCnt = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_BossRebornCnt) + maxRebornCnt = IpyGameDataPY.GetFuncCfg('BossRebornTotalPoint', 3) + if maxRebornCnt and rebornCnt >= maxRebornCnt: + GameWorld.DebugLog(' boss复活已达到最大次数! maxRebornCnt=%s' % maxRebornCnt) + return + curPoint = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_BossRebornPoint) updPoint = (curPoint+addPoint)%totalPoint PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_BossRebornPoint, updPoint) if curPoint+addPoint >= totalPoint: #重生boss - rebornCnt = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_BossRebornCnt) PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_BossRebornCnt, rebornCnt+1) killBossCntLimitDict = IpyGameDataPY.GetFuncEvalCfg('KillBossCntLimit', 1, {}) @@ -1002,6 +1044,8 @@ PyGameData.g_sortBOSSRefreshList.sort(key=lambda asd:max(0, asd[2] - (curTime - asd[1]))) GameWorld.Log(' boss复活活动 重生boss bossIDList=%s'%bossIDList) g_lastBossRebornTime = curTime + + GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_ActionBossRebornSign % ShareDefine.OperationActionName_BossReborn, int(time.time())) else: #广播 needNotifyPointPerList = IpyGameDataPY.GetFuncEvalCfg('BossRebornNotify') @@ -1072,6 +1116,7 @@ totalPoint = SetBossRebornNeedPoint() packData.TotalPoint = totalPoint packData.RebornCnt = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_BossRebornCnt) + packData.TotalRebornCnt = IpyGameDataPY.GetFuncCfg('BossRebornTotalPoint', 3) playerManager = GameWorld.GetPlayerManager() if not curPlayer: for i in xrange(playerManager.GetActivePlayerCount()): @@ -1236,3 +1281,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