hch
2025-03-14 ab204398228fc71ce62ca0e21e450f4e932a968d
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):
@@ -379,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:
        # 全服广播在线玩家
@@ -417,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])
@@ -438,7 +456,7 @@
            break
        
        #此处只处理复活的
        PlayerGeTui.GeTuiBossReborn(bossID)
        #PlayerGeTui.GeTuiBossReborn(bossID)
        __SetIsAlive(bossID, 1)
        syncBOSSIDList.append(bossID)
        
@@ -453,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):
@@ -787,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
    
    # 从数据库载入数据
@@ -968,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复活点
@@ -983,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, {})
@@ -1015,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')
@@ -1085,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()):
@@ -1249,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
## ------------------------------------------------------------------------------------------------