From cba51cf8ff175e277f628a2ac5a6aaa162ac472f Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 13 九月 2024 16:27:57 +0800
Subject: [PATCH] 10261 【越南】【砍树】【英文】仙盟徽章增加定制仙盟ID支持; 增加聊天气泡,聊天表情;

---
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldBoss.py |  240 ++++++++++++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 194 insertions(+), 46 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldBoss.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldBoss.py
index b8430ba..79bce76 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldBoss.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldBoss.py
@@ -47,13 +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
@@ -104,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)
@@ -141,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):
@@ -160,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:
@@ -323,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
 
 
@@ -367,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:
         # 全服广播在线玩家
@@ -405,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])
@@ -426,7 +456,7 @@
             break
         
         #此处只处理复活的
-        PlayerGeTui.GeTuiBossReborn(bossID)
+        #PlayerGeTui.GeTuiBossReborn(bossID)
         __SetIsAlive(bossID, 1)
         syncBOSSIDList.append(bossID)
         
@@ -441,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):
@@ -484,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
 
 ## 玩家登录通知
@@ -537,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')
@@ -550,7 +580,7 @@
         # 同步到玩家对应子服
         if not serverGroupID:
             return
-        zoneIpyData = CrossRealmPlayer.GetCrossCommZoneIpyDataByServerGroupID(serverGroupID)
+        zoneIpyData = CrossRealmPlayer.GetCrossZoneIpyDataByServerGroupID(mapID, serverGroupID)
         if not zoneIpyData:
             return
         serverGroupIDList = zoneIpyData.GetServerGroupIDList()
@@ -584,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
 
@@ -666,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]
@@ -717,6 +747,7 @@
     def GetBossAttentionDict(self):
         return self.bossAttentionDict
 
+    # RecordData改json记录 bossid存为字符串
     def UpdateBossAttention(self, playerid, bossid, isAdd):
         if playerid in self.bossAttentionDict:
             bossAttentionData = self.bossAttentionDict[playerid]
@@ -758,7 +789,7 @@
         packData.BossList = []
         for bossid, addState in bttentionDict.items():
             bossInfo = ChPyNetSendPack.tagGCBossAttention()
-            bossInfo.BossID=bossid
+            bossInfo.BossID=int(bossid)
             bossInfo.AddState=addState
             packData.BossList.append(bossInfo)
         
@@ -775,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
     
     # 从数据库载入数据
@@ -790,10 +821,7 @@
             data.clear()
             pos += data.readData(datas, pos, dataslen)
             playerID = data.PlayerID
-            if type(eval(data.RecordData)) != list:
-                self.bossAttentionDict[playerID] = data
-            else:
-                data.clear()
+            self.bossAttentionDict[playerID] = data
             
         return pos
 
@@ -959,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复活点
@@ -974,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, {})
@@ -1006,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')
@@ -1076,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()):
@@ -1240,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