From b7bb8308d9b16d2802ccc3c259c871c2b6e58002 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 15 十一月 2022 19:16:05 +0800
Subject: [PATCH] 9748 【BT7】跨服BOSS定时活动(跨服妖魔boss;增加跨服日常活动时间控制;Boss刷新增加支持关联跨服日常活动;优化跨服boss复活剩余时间计算使用跨服时间;)

---
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py                           |   16 
 ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py                                                   |   26 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py                                |   15 
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py                                              |    6 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py                            |   60 +++
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerEventCounter.py                                       |    3 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCustomRefresh.py                       |   55 +++
 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py                                                 |   60 +++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCrossYaomoBoss.py                |  114 ++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py            |    9 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_CrossYaomoBoss.py |   48 ++
 ServerPython/CoreServerGroup/GameServer/Script/PyGameData.py                                                      |    1 
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBoss.py                                        |    2 
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossYaomoBoss.py                                   |  274 ++++++++++++++++
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossActionControl.py                               |  187 +++++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py                            |    4 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py                              |    5 
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBillboard.py                                   |   43 ++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCHurtMgr.py                             |    8 
 ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py                                                     |   15 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillCommon.py               |    6 
 PySysDB/PySysDBG.h                                                                                                |   10 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py                                   |    7 
 23 files changed, 954 insertions(+), 20 deletions(-)

diff --git a/PySysDB/PySysDBG.h b/PySysDB/PySysDBG.h
index d2d2d0b..11093d2 100644
--- a/PySysDB/PySysDBG.h
+++ b/PySysDB/PySysDBG.h
@@ -85,6 +85,16 @@
 	list		RandMailKeyList;	//指定上架随机邮件列表,有配置时上架的时候在线玩家会收到一封上架邮件提醒
 };
 
+//跨服日常活动表
+
+struct tagCrossDailyAction
+{
+	DWORD		_DailyID;	//活动ID
+	dict		OpenTimeDict;	//开启时间
+	DWORD		Duration;	//持续时间, 0为不限制
+	dict		NotifyInfo;	//广播提示信息
+};
+
 //日常活动表
 
 struct tagDailyAction
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
index dfb0bb3..34f3883 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -15140,6 +15140,66 @@
 
 
 #------------------------------------------------------
+# C0 11 跨服妖魔boss玩家伤害信息 #tagGCCrossYaomoBossPlayerHurtInfo
+
+class  tagGCCrossYaomoBossPlayerHurtInfo(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("HurtTotal", c_int),    # 总伤害值,小于亿部分
+                  ("HurtTotalEx", c_int),    # 总伤害值,整除亿部分
+                  ("AwardState", c_int),    # 伤害目标值领奖状态,按奖励记录索引位运算判断是否已领取
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xC0
+        self.SubCmd = 0x11
+        return
+
+    def ReadData(self, stringData, _pos=0, _len=0):
+        self.Clear()
+        memmove(addressof(self), stringData[_pos:], self.GetLength())
+        return _pos + self.GetLength()
+
+    def Clear(self):
+        self.Cmd = 0xC0
+        self.SubCmd = 0x11
+        self.HurtTotal = 0
+        self.HurtTotalEx = 0
+        self.AwardState = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagGCCrossYaomoBossPlayerHurtInfo)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// C0 11 跨服妖魔boss玩家伤害信息 //tagGCCrossYaomoBossPlayerHurtInfo:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                HurtTotal:%d,
+                                HurtTotalEx:%d,
+                                AwardState:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.HurtTotal,
+                                self.HurtTotalEx,
+                                self.AwardState
+                                )
+        return DumpString
+
+
+m_NAtagGCCrossYaomoBossPlayerHurtInfo=tagGCCrossYaomoBossPlayerHurtInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCCrossYaomoBossPlayerHurtInfo.Cmd,m_NAtagGCCrossYaomoBossPlayerHurtInfo.SubCmd))] = m_NAtagGCCrossYaomoBossPlayerHurtInfo
+
+
+#------------------------------------------------------
 # C0 14 幸运云购开奖记录 #tagGCLuckyCloudBuyLotteryRecInfo
 
 class  tagGCLuckyCloudBuyLotteryRec(Structure):
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossActionControl.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossActionControl.py
index 775937e..be85cb0 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossActionControl.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossActionControl.py
@@ -673,3 +673,190 @@
         
     return
 
+## ================================================================================================
+
+def __GetTodayCrossDailyActionInfo():
+    # 获取本日待处理的日常活动信息
+    key = "TodayCrossDailyActionInfo"
+    curTime = int(time.time())
+    curDateStr = GameWorld.ChangeTimeNumToStr(curTime, ChConfig.TYPE_Time_YmdFormat) # 当天日期
+    loadSign = curDateStr
+    TodayDailyActionInfo = IpyGameDataPY.GetConfigEx(key)
+    if TodayDailyActionInfo and TodayDailyActionInfo[0] == loadSign:
+        GameWorld.DebugLog("已经加载过本日跨服日常活动处理信息!loadSign=%s" % loadSign)
+        return TodayDailyActionInfo[1]
+    
+    todayActionInfo = []
+    
+    dayTime = GameWorld.GetServerTime()
+    weekDay = str(dayTime.weekday() + 1) # 格式为json, 当前星期几, 1代表星期1
+    
+    GameWorld.Log("===== 加载今天跨服日常活动信息 =====")
+    GameWorld.Log("当前星期%s" % weekDay)
+    
+    dailyTimeInfoList = []
+    
+    ipyDataMgr = IpyGameDataPY.IPY_Data()
+    for i in xrange(ipyDataMgr.GetCrossDailyActionCount()):
+        dailyIpyData = ipyDataMgr.GetCrossDailyActionByIndex(i)
+        dailyID = dailyIpyData.GetDailyID()
+        
+        openTimeDict = dailyIpyData.GetOpenTimeDict()
+        # 没有时间控制的,代表永久开放
+        if not openTimeDict:
+            todayActionInfo.append([dailyID])
+            GameWorld.Log("    增加本日常开跨服日常活动信息: dailyID=%s" % dailyID)
+            continue
+        
+        #如果星期key中存在 "0" 代表每日都开启
+        if "0" not in openTimeDict and weekDay not in openTimeDict:
+            GameWorld.Log("    不是跨服日常活动开启星期: dailyID=%s,openWeekLimit=%s" % (dailyID, openTimeDict.keys()))
+            continue
+        openTimeList = openTimeDict["0"] if "0" in openTimeDict else openTimeDict[weekDay]
+        dailyTimeInfoList.append([openTimeList, dailyIpyData])
+        
+    GameWorld.Log("    -----------------------")
+    for openTimeList, ipyData in dailyTimeInfoList:
+        dailyID = ipyData.GetDailyID()
+        notifyInfoDict = ipyData.GetNotifyInfo()
+        
+        openList = [] # [(时,分), ...]
+        overList = [] # [(时,分), ...]
+        goonStateDict = {} # {状态:[(aDateTime, bDateTime)], ...}
+        notifyDict = {} # {(时,分):[notifyKey, [参数]], ...}
+        OpenState = 1 # 定义开启状态为1
+        
+        for hour, minute in openTimeList:  
+            openTimeStr = "%s %02d:%02d:%02d" % (curDateStr, hour, minute, 0)
+            
+            # 精确开启时间
+            openDateTime = datetime.datetime.strptime(openTimeStr, ChConfig.TYPE_Time_Format)
+            openList.append((openDateTime.hour, openDateTime.minute))
+            
+            # 精确关闭时间
+            overDateTime = openDateTime + datetime.timedelta(minutes=ipyData.GetDuration())
+            overList.append((overDateTime.hour, overDateTime.minute))
+            
+            # goon 开启状态
+            openStateTimeList = goonStateDict.get(OpenState, [])
+            openStateTimeList.append((openDateTime, overDateTime))
+            goonStateDict[OpenState] = openStateTimeList
+            
+            # goon 其他状态,待扩展
+            # ...
+            
+            # 广播
+            for notifyMinute, notifyInfo in notifyInfoDict.items():
+                notifyDateTime = openDateTime + datetime.timedelta(minutes=notifyMinute)
+                notifyDict[(notifyDateTime.hour, notifyDateTime.minute)] = notifyInfo
+                
+        todayActionInfo.append([dailyID, openList, overList, goonStateDict, notifyDict])
+        GameWorld.Log("    增加本日跨服日常活动信息: dailyID=%s,openList=%s,overList=%s,goonStateDict=%s,notifyDict=%s" 
+                      % (dailyID, openList, overList, goonStateDict, notifyDict))
+        
+    TodayDailyActionInfo = IpyGameDataPY.SetConfigEx(key, [loadSign, todayActionInfo])
+    GameWorld.Log("本日跨服日常活动信息加载完毕! loadSign=%s" % loadSign)
+    GameWorld.Log("=============================================================")
+    return TodayDailyActionInfo[1]
+
+def Dispose_CrossDailyActionState():
+    # 跨服日常活动状态变更检查处理
+    
+    todayDailyActionInfo = __GetTodayCrossDailyActionInfo()
+    if not todayDailyActionInfo:
+        return
+    
+    gameWorld = GameWorld.GetGameWorld()
+    dayTime = GameWorld.GetServerTime()
+    curHourMinute = (dayTime.hour, dayTime.minute)
+    
+    sysnCrossDailyActionStateDict = {}
+    
+    for actionInfo in todayDailyActionInfo:
+        dailyActionID = actionInfo[0]
+        state = 0 # 默认关闭
+        
+        # 长度为1的代表常开的活动
+        if len(actionInfo) == 1:
+            state = 1
+        else:
+            #openList = [] # [(时,分), ...]
+            #overList = [] # [(时,分), ...]
+            #goonStateDict = {} # {状态:[(aDateTime, bDateTime)], ...}
+            #notifyDict = {} # {(时,分):[notifyKey, [参数]], ...}
+            openList, overList, goonStateDict, notifyDict = actionInfo[1:]
+            
+            # 精确匹配开启
+            if curHourMinute in openList:
+                state = 1
+            # 精确匹配关闭
+            elif curHourMinute in overList:
+                state = 0
+            # goon 状态
+            else:
+                for goonState, openStateTimeList in goonStateDict.items():
+                    for dateTimeInfo in openStateTimeList:
+                        if dateTimeInfo[0] < dayTime < dateTimeInfo[1]:
+                            state = goonState
+                            break
+                        
+            # 全服广播提示信息
+            if curHourMinute in notifyDict:
+                notifyKey, paramList = notifyDict[curHourMinute]
+                serverGroupIDList = []
+                PlayerControl.WorldNotifyCross(serverGroupIDList, 0, notifyKey, paramList)
+                
+        dictName = ShareDefine.Def_Notify_WorldKey_CrossDailyActionState % dailyActionID
+        beforeState = gameWorld.GetDictByKey(dictName)
+        if beforeState == state:
+            #已经是这个状态了
+            continue
+        
+        if state:
+            if dailyActionID == ShareDefine.CrossDailyActionID_YaomoBoss:
+                GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_ActionBossRebornSign % dailyActionID, int(time.time()))
+                
+        sysnCrossDailyActionStateDict[dailyActionID] = state
+        #通知Mapserver,设置字典
+        GameWorld.SendMapServerMsgEx(dictName, state)
+        #更新字典值
+        gameWorld.SetDict(dictName, state)
+        GameWorld.Log("跨服日常活动状态变更: dailyActionID=%s,state=%s,dictName=%s" % (dailyActionID, state, dictName))
+        
+    # 同步子服务器
+    if sysnCrossDailyActionStateDict:
+        serverGroupIDList = []
+        CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossDailyActionState, sysnCrossDailyActionStateDict, serverGroupIDList)
+        
+    return
+
+def SendMapServerCrossDailyActionState():
+    # 地图启动成功时通知本日进行中的日常活动状态
+    
+    todayDailyActionInfo = __GetTodayCrossDailyActionInfo()
+    if not todayDailyActionInfo:
+        return
+    
+    gameWorld = GameWorld.GetGameWorld()
+    for actionInfo in todayDailyActionInfo:
+        dailyActionID = actionInfo[0]
+        dictName = ShareDefine.Def_Notify_WorldKey_CrossDailyActionState % dailyActionID 
+        state = gameWorld.GetDictByKey(dictName)
+        if state:
+            GameWorld.SendMapServerMsgEx(dictName, state)
+            
+    return
+
+def CrossServerMsg_CrossDailyActionState(msgData):
+    
+    gameWorld = GameWorld.GetGameWorld()
+    for dailyActionID, state in msgData.items():
+        dictName = ShareDefine.Def_Notify_WorldKey_CrossDailyActionState % dailyActionID
+        #通知Mapserver,设置字典
+        GameWorld.SendMapServerMsgEx(dictName, state)
+        #更新字典值
+        gameWorld.SetDict(dictName, state)
+        GameWorld.Log("收到跨服日常活动状态变更: dailyActionID=%s,state=%s,dictName=%s" % (dailyActionID, state, dictName))
+        
+    return
+
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBillboard.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBillboard.py
index 711cc8a..56014c3 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBillboard.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBillboard.py
@@ -61,6 +61,13 @@
             self.__billboardDict[key] = billboardObj
         return billboardObj
     
+    def RemoveBillboard(self, billboardType):
+        ## 移除某个类型的榜单所有数据
+        for key in self.__billboardDict.keys():
+            if key[0] == billboardType:
+                self.__billboardDict.pop(key)
+        return
+    
     # 保存数据 存数据库和realtimebackup
     def GetSaveData(self):
         savaData = ""
@@ -249,6 +256,37 @@
         for billboardType, groupValue1, groupValue2 in groupList:
             billboardObj = billboardMgr.GetCrossBillboard(billboardType, groupValue1, groupValue2)
             billboardObj.SaveDRData()
+    return
+
+def CopyBillboard(fromBillboardType, toBillboardType):
+    ## 将某个类型的榜单完全拷贝到其他榜单 - 一般用于备份、转移数据
+    
+    billboardMgr = PyDataManager.GetCrossBillboardManager()
+    billboardMgr.RemoveBillboard(toBillboardType) # 默认清空目标榜单
+    
+    groupList = billboardMgr.GetBillboardGroupList(fromBillboardType)
+    for billboardType, groupValue1, groupValue2 in groupList:
+        frbillboardObj = billboardMgr.GetCrossBillboard(billboardType, groupValue1, groupValue2)
+        toBillboardObj = billboardMgr.GetCrossBillboard(toBillboardType, groupValue1, groupValue2)
+        GameWorld.Log("CopyCrossBillboard: billboardType=%s,toBillboardType=%s,groupValue1=%s,groupValue2=%s" 
+                      % (billboardType, toBillboardType, groupValue1, groupValue2))
+        for frbillboardData in frbillboardObj.GetBillboardDataList():
+            tobillboardData = PyGameDataStruct.tagDBCrossBillboard()
+            tobillboardData.GroupValue1 = groupValue1
+            tobillboardData.GroupValue2 = groupValue2
+            tobillboardData.BillboardType = toBillboardType
+            tobillboardData.ID = frbillboardData.ID
+            tobillboardData.ID2 = frbillboardData.ID2
+            tobillboardData.Name1 = frbillboardData.Name1
+            tobillboardData.Name2 = frbillboardData.Name2
+            tobillboardData.Type2 = frbillboardData.Type2
+            tobillboardData.Value1 = frbillboardData.Value1
+            tobillboardData.Value2 = frbillboardData.Value2
+            tobillboardData.CmpValue = frbillboardData.CmpValue
+            tobillboardData.CmpValue2 = frbillboardData.CmpValue2
+            tobillboardData.CmpValue3 = frbillboardData.CmpValue3
+            toBillboardObj.AddBillboardData(tobillboardData)
+            
     return
 
 #// C0 04 查看跨服排行榜 #tagCGViewCrossBillboard
@@ -470,7 +508,7 @@
     return
 
 def UpdCrossBillboard(billboardType, groupValue1, dataID, name1, name2, type2, value1, value2, cmpValue,
-                      cmpValue2=0, cmpValue3=0, groupValue2=0, id2=0, autoSort=True):
+                      cmpValue2=0, cmpValue3=0, groupValue2=0, id2=0, autoSort=True, noSortAndSync=False):
     ''' 更新跨服排行榜
     @param billboardType: 排行榜索引类型,同个榜单类型可以有多个分组榜单数据,独立排序
     @param groupValue1: 榜单分组1
@@ -486,6 +524,7 @@
     @param groupValue1: 榜单分组2
     @param id2: 扩展数据ID2
     @param autoSort: 是否排序,默认True
+    @param noSortAndSync: 不排序及同步子服,默认False; 一般用于批量更新数据时设置为True,减少排序及同步频率,但是一定要在设置完数据或最后一条数据后手动调用一次排序SortData
     @return: 是否上榜更新榜单
     '''
     if not GameWorld.IsCrossServer():
@@ -542,6 +581,8 @@
                        % (billboardType, groupValue1, groupValue2, dataID, isNewData, cmpValueChange,
                           type2, value1, value2, cmpValue, cmpValue2, cmpValue3), dataID)
     
+    if noSortAndSync:
+        return True
     if autoSort and cmpValueChange:
         billboardObj.SortData()
     else:
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBoss.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBoss.py
index 20be5af..ddaceb7 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBoss.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBoss.py
@@ -441,7 +441,7 @@
 def Sync_CrossBossInfo(curPlayer=None, syncBOSSIDList=[]):
     ## 同步boss相关信息
     
-    curTime = int(time.time())
+    curTime = GameWorld.ChangeTimeStrToNum(GameWorld.GetCrossServerTimeStr())
     
     recTypeListData = GameWorld.GetUniversalRecMgr().GetTypeList(ShareDefine.Def_UniversalGameRecType_CrossBossInfo)
     
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossYaomoBoss.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossYaomoBoss.py
new file mode 100644
index 0000000..af2f1e7
--- /dev/null
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossYaomoBoss.py
@@ -0,0 +1,274 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package CrossYaomoBoss
+#
+# @todo:跨服妖魔boss
+# @author hxp
+# @date 2022-11-11
+# @version 1.0
+#
+# 详细描述: 跨服妖魔boss
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2022-11-11 15:30"""
+#-------------------------------------------------------------------------------
+
+import ShareDefine
+import PyDataManager
+import CrossRealmMsg
+import IpyGameDataPY
+import CrossBillboard
+import ChPyNetSendPack
+import PlayerCompensation
+import CrossRealmPlayer
+import PlayerViewCache
+import NetPackCommon
+import PlayerControl
+import PyGameData
+import GameWorld
+
+Def_RecType_CrossYaomoBossHurtInfo = ShareDefine.Def_UniversalGameRecType_CrossYaomoBossHurtInfo
+'''
+跨服妖魔boss伤血信息
+ShareDefine.Def_UniversalGameRecType_CrossYaomoBossHurtInfo
+value1:zoneID              分区ID
+value2:playerID            玩家ID
+value3:awardState          目标伤害领奖记录
+StrValue1:hurtTotal        今日总伤害
+'''
+def GetRecZoneID(recData): return recData.GetValue1()
+def SetRecZoneID(recData, zoneID): return recData.SetValue1(zoneID)
+def GetRecPlayerID(recData): return recData.GetValue2()
+def SetRecPlayerID(recData, playerID): return recData.SetValue2(playerID)
+def GetRecAwardState(recData): return recData.GetValue3()
+def SetRecAwardState(recData, awardState): return recData.SetValue3(awardState)
+def GetRecHurtTotal(recData): return GameWorld.ToIntDef(recData.GetStrValue1(), 0)
+def SetRecHurtTotal(recData, hurtTotal): return recData.SetStrValue1(str(hurtTotal))
+
+def DoOnDay():
+    
+    if not GameWorld.IsCrossServer():
+        return
+    
+    hurtValueAwardDict = IpyGameDataPY.GetFuncEvalCfg("CrossYaomoBoss", 3, {})
+    hurtValueIntAwardDict = {int(k):v for k, v in hurtValueAwardDict.items()}
+    
+    universalRecMgr = GameWorld.GetUniversalRecMgr()
+    recDataList = universalRecMgr.GetTypeList(Def_RecType_CrossYaomoBossHurtInfo)
+    for index in xrange(recDataList.Count()):
+        recData = recDataList.At(index)
+        playerID = GetRecPlayerID(recData)
+        awardState = GetRecAwardState(recData)
+        hurtTotal = GetRecHurtTotal(recData)
+        
+        for awardIndex, hurtValueInfo in hurtValueIntAwardDict.items():
+            needHurtValue, awardItemList = hurtValueInfo
+            if hurtTotal < needHurtValue:
+                continue
+            if awardState & pow(2, awardIndex):
+                continue
+            paramList = [needHurtValue]
+            PlayerCompensation.SendMailByKey("CrossYaomoBossHurtValue", [playerID], awardItemList, paramList, crossMail=True)
+            
+    universalRecMgr.Delete(Def_RecType_CrossYaomoBossHurtInfo)
+    
+    # 广播子服重置伤害
+    serverGroupIDList = []
+    sendMsg = {"HurtReset":1}
+    CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossYaomoBossHurtInfo, sendMsg, serverGroupIDList)
+    return
+
+def ClientServerMsg_CrossYaomoBossHurtAward(serverGroupID, msgData):
+    
+    playerID = msgData["playerID"]
+    awardIndex = msgData["awardIndex"]
+    
+    hurtValueAwardDict = IpyGameDataPY.GetFuncEvalCfg("CrossYaomoBoss", 3, {})
+    if str(awardIndex) not in hurtValueAwardDict:
+        return
+    needHurtValue, awardItemList = hurtValueAwardDict[str(awardIndex)]
+    
+    universalRecMgr = GameWorld.GetUniversalRecMgr()
+    recDataList = universalRecMgr.GetTypeList(Def_RecType_CrossYaomoBossHurtInfo)
+    for index in xrange(recDataList.Count()):
+        recData = recDataList.At(index)
+        if playerID != GetRecPlayerID(recData):
+            continue
+        
+        awardState = GetRecAwardState(recData)
+        hurtTotal = GetRecHurtTotal(recData)
+        if hurtTotal < needHurtValue:
+            GameWorld.ErrLog("跨服妖魔boss伤害不足,无法领奖! awardIndex=%s,needHurtValue=%s > %s" % (awardIndex, needHurtValue, hurtTotal), playerID)
+            return
+        
+        if awardState & pow(2, awardIndex):
+            GameWorld.ErrLog("已经领取过该跨服妖魔boss伤害奖励! awardIndex=%s,awardState=%s" % (awardIndex, awardState), playerID)
+            return
+        awardState |= pow(2, awardIndex)
+        SetRecAwardState(recData, awardState)
+        GameWorld.Log("领取跨服妖魔boss伤害奖励! awardIndex=%s,awardState=%s,awardItemList=%s" % (awardIndex, awardState, awardItemList), playerID)
+        
+        serverGroupIDList = [serverGroupID]
+        syncPlayerHurtInfo = {playerID:{"hurtTotal":hurtTotal, "awardState":awardState, "awardIndex":awardIndex, "awardItemList":awardItemList}}
+        sendMsg = {"syncPlayerHurtInfo":syncPlayerHurtInfo}
+        CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossYaomoBossHurtInfo, sendMsg, serverGroupIDList)
+        return
+    
+    return
+
+def Sync_CrossYaomoBossDataToClientServer(serverGroupID=0):
+    ''' 同步跨服数据到子服务器
+    @param serverGroupID: 为0时同步所有子服
+    '''
+    GameWorld.Log("同步给子服跨服妖魔Boss数据: syncServerGroupID=%s" % (serverGroupID))
+    
+    syncPlayerHurtInfo = {}
+    universalRecMgr = GameWorld.GetUniversalRecMgr()
+    recDataList = universalRecMgr.GetTypeList(Def_RecType_CrossYaomoBossHurtInfo)
+    for index in xrange(recDataList.Count()):
+        recData = recDataList.At(index)
+        playerID = GetRecPlayerID(recData)
+        awardState = GetRecAwardState(recData)
+        hurtTotal = GetRecHurtTotal(recData)
+        syncPlayerHurtInfo[playerID] = {"hurtTotal":hurtTotal, "awardState":awardState}
+        
+    # 广播子服重置伤害
+    if syncPlayerHurtInfo:
+        serverGroupIDList = []
+        sendMsg = {"syncPlayerHurtInfo":syncPlayerHurtInfo}
+        CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossYaomoBossHurtInfo, sendMsg, serverGroupIDList)
+    return
+
+def MapServer_CrossYaomoBossHurtInfo(msgList):
+    
+    zoneID, npcID, playerHurtList = msgList
+    GameWorld.Log("地图跨服妖魔boss伤害结算信息: zoneID=%s,npcID=%s,hurtPlayerCount=%s" % (zoneID, npcID, len(playerHurtList)))
+    
+    rankAwardDict = IpyGameDataPY.GetFuncEvalCfg("CrossYaomoBoss", 2, {})
+    rankIntAwardDict = {int(k):v for k, v in rankAwardDict.items()}
+    
+    universalRecMgr = GameWorld.GetUniversalRecMgr()
+    recDataList = universalRecMgr.GetTypeList(Def_RecType_CrossYaomoBossHurtInfo)
+    hurtRecDict = {}
+    for index in xrange(recDataList.Count()):
+        recData = recDataList.At(index)
+        hurtRecDict[(GetRecZoneID(recData), GetRecPlayerID(recData))] = recData
+        
+    groupValue1 = zoneID
+    billboardMgr = PyDataManager.GetCrossBillboardManager()
+    billboardObj = billboardMgr.GetCrossBillboard(ShareDefine.Def_CBT_YaomoBossHurt, groupValue1)
+    billboardObj.ClearData()
+    
+    syncPlayerHurtInfo = {}
+    for rank, hurtInfo in enumerate(playerHurtList, 1):
+        playerID, hurtValue, hurtName = hurtInfo
+        
+        job, realmLV, accID = 1, 1, ""
+        curCache = PlayerViewCache.FindViewCache(playerID)
+        if curCache:
+            cacheDict = PlayerViewCache.GetCachePropDataDict(curCache)
+            job = cacheDict.get("Job", job)
+            realmLV = cacheDict.get("RealmLV", realmLV)
+            accID = cacheDict.get("AccID", accID)
+            
+        # 更新最新一次伤害排名榜单
+        dataID, name1, name2 = playerID, hurtName, ""
+        type2, value1, value2 = job, realmLV, 0
+        cmpValue = hurtValue / ShareDefine.Def_PerPointValue
+        cmpValue2 = hurtValue % ShareDefine.Def_PerPointValue
+        noSortAndSync = False if rank == len(playerHurtList) else True
+        CrossBillboard.UpdCrossBillboard(ShareDefine.Def_CBT_YaomoBossHurt, groupValue1, dataID, name1, name2,
+                                         type2, value1, value2, cmpValue, cmpValue2, noSortAndSync=noSortAndSync)
+        
+        # 名次奖励直接发放
+        awardItemList = GameWorld.GetOrderValueByDict(rankIntAwardDict, rank, False)
+        if awardItemList:
+            paramList = [rank]
+            PlayerCompensation.SendMailByKey("CrossYaomoBossHurtRank", [playerID], awardItemList, paramList, crossMail=True)
+            
+        key = (zoneID, playerID)
+        if key not in hurtRecDict:
+            recData = recDataList.AddRec()
+            SetRecZoneID(recData, zoneID)
+            SetRecPlayerID(recData, playerID)
+            hurtTotal = hurtValue
+        else:
+            recData = hurtRecDict[key]
+            hurtTotal = GetRecHurtTotal(recData) + hurtValue
+        SetRecHurtTotal(recData, hurtTotal)
+        syncPlayerHurtInfo[playerID] = {"hurtTotal":hurtTotal, "awardState":GetRecAwardState(recData)}
+        GameWorld.Log("    rank=%s,playerID=%s,hurtValue=%s,hurtTotal=%s,accID=%s" % (rank, playerID, hurtValue, hurtTotal, accID))
+        
+    # 通知子服更新玩家总伤害
+    if syncPlayerHurtInfo:
+        serverGroupIDList = []
+        sendMsg = {"syncPlayerHurtInfo":syncPlayerHurtInfo}
+        CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossYaomoBossHurtInfo, sendMsg, serverGroupIDList)
+        
+    return
+
+def CrossServerMsg_CrossYaomoBossHurtInfo(msgData):
+        
+    playerMgr = GameWorld.GetPlayerManager()
+    
+    if "HurtReset" in msgData:
+        # 重置伤害
+        syncPlayerIDList = PyGameData.g_crossYaomoBossHurtInfo.keys()
+        PyGameData.g_crossYaomoBossHurtInfo = {}
+        for playerID in syncPlayerIDList:
+            curPlayer = playerMgr.FindPlayerByID(playerID)
+            if not curPlayer or not curPlayer.GetInitOK():
+                continue
+            Sync_CrossYaomoBossPlayerHurtInfo(curPlayer)
+            
+        return
+    
+    #zoneID = msgData["zoneID"]
+    #npcID = msgData["npcID"]
+    syncPlayerHurtInfo = msgData["syncPlayerHurtInfo"]
+    
+    for playerID, hurtInfo in syncPlayerHurtInfo.items():
+        if not PlayerControl.GetDBPlayerAccIDByID(playerID):
+            continue
+        awardIndex = hurtInfo.pop("awardIndex", None)
+        awardItemList = hurtInfo.pop("awardItemList", None)
+        
+        PyGameData.g_crossYaomoBossHurtInfo[playerID] = hurtInfo
+        
+        curPlayer = playerMgr.FindPlayerByID(playerID)
+        if not curPlayer or not curPlayer.GetInitOK():
+            continue
+        Sync_CrossYaomoBossPlayerHurtInfo(curPlayer)
+        
+        if awardIndex == None:
+            continue
+        
+        # 通知地图发放奖励
+        msgInfo = ["HurtValueAward", [awardIndex, awardItemList]]
+        CrossRealmPlayer.MapServer_QueryCrossPlayerResult(playerID, "CrossYaomoBoss", msgInfo)
+    return
+
+def OnPlayerLogin(curPlayer):
+    if GameWorld.IsCrossServer():
+        return
+    
+    playerID = curPlayer.GetPlayerID()
+    if playerID not in PyGameData.g_crossYaomoBossHurtInfo:
+        return
+    
+    Sync_CrossYaomoBossPlayerHurtInfo(curPlayer)
+    return
+
+def Sync_CrossYaomoBossPlayerHurtInfo(curPlayer):
+    hurtInfo = PyGameData.g_crossYaomoBossHurtInfo.get(curPlayer.GetPlayerID(), {})
+    hurtTotal = hurtInfo.get("hurtTotal", 0)
+    awardState = hurtInfo.get("awardState", 0)
+    clientPack = ChPyNetSendPack.tagGCCrossYaomoBossPlayerHurtInfo()
+    clientPack.HurtTotal = hurtTotal % ShareDefine.Def_PerPointValue
+    clientPack.HurtTotalEx = hurtTotal / ShareDefine.Def_PerPointValue
+    clientPack.AwardState = awardState
+    NetPackCommon.SendFakePack(curPlayer, clientPack)
+    return
+
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py
index 166ec22..789654d 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py
@@ -1070,6 +1070,10 @@
 def Dispose_DailyActionState():
     # 日常活动状态变更检查处理
     
+    if GameWorld.IsCrossServer():
+        CrossActionControl.Dispose_CrossDailyActionState()
+        return
+    
     todayDailyActionInfo = __GetTodayDailyActionInfo()
     if not todayDailyActionInfo:
         return
@@ -1135,11 +1139,21 @@
 def SendMapServerDailyActionState():
     # 地图启动成功时通知本日进行中的日常活动状态
     
+    if GameWorld.IsCrossServer():
+        CrossActionControl.SendMapServerCrossDailyActionState()
+        return
+    
+    gameWorld = GameWorld.GetGameWorld()
+    for dailyActionID in ShareDefine.CrossDailyActionIDList:
+        dictName = ShareDefine.Def_Notify_WorldKey_CrossDailyActionState % dailyActionID 
+        state = gameWorld.GetDictByKey(dictName)
+        if state:
+            GameWorld.SendMapServerMsgEx(dictName, state)
+            
     todayDailyActionInfo = __GetTodayDailyActionInfo()
     if not todayDailyActionInfo:
         return
     
-    gameWorld = GameWorld.GetGameWorld()
     for actionInfo in todayDailyActionInfo:
         dailyActionID = actionInfo[0]
         dictName = ShareDefine.Def_Notify_WorldKey_DailyActionState % dailyActionID 
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py b/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py
index 1758c54..9aa2e9b 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py
@@ -98,6 +98,13 @@
                         ("list", "RandMailKeyList", 0),
                         ),
 
+                "CrossDailyAction":(
+                        ("DWORD", "DailyID", 1),
+                        ("dict", "OpenTimeDict", 0),
+                        ("DWORD", "Duration", 0),
+                        ("dict", "NotifyInfo", 0),
+                        ),
+
                 "DailyAction":(
                         ("DWORD", "DailyID", 1),
                         ("dict", "OpenTimeDict", 0),
@@ -1023,6 +1030,21 @@
     def GetItemCountWeightList(self): return self.ItemCountWeightList # 指定上架随机件数权重列表, [[权重, 件数], ...]
     def GetAuctionItemWeightList(self): return self.AuctionItemWeightList # 指定上架物品随机权重, [[权重, 物品ID],[权重, [阶,颜色,部位集合,是否套装,星级]] ...]
     def GetRandMailKeyList(self): return self.RandMailKeyList # 指定上架随机邮件列表,有配置时上架的时候在线玩家会收到一封上架邮件提醒
+
+# 跨服日常活动表
+class IPY_CrossDailyAction():
+    
+    def __init__(self):
+        self.DailyID = 0
+        self.OpenTimeDict = {}
+        self.Duration = 0
+        self.NotifyInfo = {}
+        return
+        
+    def GetDailyID(self): return self.DailyID # 活动ID
+    def GetOpenTimeDict(self): return self.OpenTimeDict # 开启时间
+    def GetDuration(self): return self.Duration # 持续时间, 0为不限制
+    def GetNotifyInfo(self): return self.NotifyInfo # 广播提示信息
 
 # 日常活动表
 class IPY_DailyAction():
@@ -2706,6 +2728,8 @@
         self.ipyAuctionItemLen = len(self.ipyAuctionItemCache)
         self.ipyAuctionSystemItemCache = self.__LoadFileData("AuctionSystemItem", IPY_AuctionSystemItem)
         self.ipyAuctionSystemItemLen = len(self.ipyAuctionSystemItemCache)
+        self.ipyCrossDailyActionCache = self.__LoadFileData("CrossDailyAction", IPY_CrossDailyAction)
+        self.ipyCrossDailyActionLen = len(self.ipyCrossDailyActionCache)
         self.ipyDailyActionCache = self.__LoadFileData("DailyAction", IPY_DailyAction)
         self.ipyDailyActionLen = len(self.ipyDailyActionCache)
         self.ipyDailyActionCustomCache = self.__LoadFileData("DailyActionCustom", IPY_DailyActionCustom)
@@ -3034,6 +3058,8 @@
     def GetAuctionItemByIndex(self, index): return self.ipyAuctionItemCache[index]
     def GetAuctionSystemItemCount(self): return self.ipyAuctionSystemItemLen
     def GetAuctionSystemItemByIndex(self, index): return self.ipyAuctionSystemItemCache[index]
+    def GetCrossDailyActionCount(self): return self.ipyCrossDailyActionLen
+    def GetCrossDailyActionByIndex(self, index): return self.ipyCrossDailyActionCache[index]
     def GetDailyActionCount(self): return self.ipyDailyActionLen
     def GetDailyActionByIndex(self, index): return self.ipyDailyActionCache[index]
     def GetDailyActionCustomCount(self): return self.ipyDailyActionCustomLen
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerEventCounter.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerEventCounter.py
index 241ec57..0a708f0 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerEventCounter.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerEventCounter.py
@@ -34,6 +34,7 @@
 import PlayerCharm
 import CrossBattlefield
 import CrossChampionship
+import CrossYaomoBoss
 #---------------------------------------------------------------------
 
 #---------------------------------------------------------------------
@@ -66,6 +67,8 @@
     PlayerFamily.FamilyOnDay(tick)
     #跨服排位
     CrossChampionship.DoOnDay()
+    #跨服妖魔boss
+    CrossYaomoBoss.DoOnDay()
     
     playerManager = GameWorld.GetPlayerManager()
     for i in xrange(playerManager.GetPlayerCount()):
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py
index 43cad44..3059766 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py
@@ -67,6 +67,7 @@
 import PyGameData
 import PlayerTalk
 import PlayerStore
+import CrossYaomoBoss
 import CrossRealmPlayer
 import CrossRealmMsg
 import CrossRealmPK
@@ -669,6 +670,11 @@
         CrossBattlefield.MapServer_CrossBattlefieldOver(eval(resultName))
         return
     
+    # 跨服妖魔boss伤害结算
+    if callName =="CrossYaomoBossHurtInfo":
+        CrossYaomoBoss.MapServer_CrossYaomoBossHurtInfo(eval(resultName))
+        return
+    
     # 跨服全民充值
     if callName == "CrossActAllRecharge":
         curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(srcPlayerID)
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/PyGameData.py b/ServerPython/CoreServerGroup/GameServer/Script/PyGameData.py
index ad10ecf..a0c8e7f 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/PyGameData.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/PyGameData.py
@@ -148,6 +148,7 @@
 g_championshipMgr = None # 跨服排位争霸赛管理
 
 g_crossActAllRechargeInfo = {} # 跨服全民充值信息,本服用 {zoneID:{playerID:总充值, ...}, ...}
+g_crossYaomoBossHurtInfo = {} # 跨服妖魔boss伤害信息,本服用 {playerID:hurtTotal, ...}
 
 g_familyTalkCache = {} #{familyID:[[time,content,extras],..]}
 g_worldTalkCache = [] #[[time,name, playerID, content,extras],..]
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
index 6de589c..b27b4cc 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
@@ -799,7 +799,9 @@
 Def_CBT_BattlefieldWJoin, # 跨服战场每周参与榜  151
 Def_CBT_BattlefieldWCall, # 跨服战场每周召集榜  152
 Def_CBT_BattlefieldWScore, # 跨服战场每周积分榜  153
-) = range(150, 153 + 1)
+Def_CBT_BattlefieldWScoreLastWeek, # 跨服战场上周积分榜  154
+Def_CBT_YaomoBossHurt, # 跨服妖魔boss最新一次伤血排名  155
+) = range(150, 155 + 1)
 
 #职业对应战力排行榜类型
 JobFightPowerBillboardDict = {
@@ -1255,8 +1257,8 @@
                                 Def_UniversalGameRecType_CrossChampionshipOfficial, # 跨服排位争霸赛最终排名官职信息 35
                                 Def_UniversalGameRecType_CrossChampionshipOffChallenge, # 跨服排位争霸赛官职挑战信息 36
                                 Def_UniversalGameRecType_CrossActAllRecharge, # 跨服全服充值活动信息 37
-                                Def_UniversalGameRecType_38,
-                                Def_UniversalGameRecType_39,
+                                Def_UniversalGameRecType_CrossBattleChampionGroup, # 跨服战场冠军赛分组信息 38
+                                Def_UniversalGameRecType_CrossYaomoBossHurtInfo, # 跨服妖魔boss伤血信息 39
                                 Def_UniversalGameRecType_40,
                                 Def_UniversalGameRecType_RedPacketRecord,   # 红包产出结果记录41
                                 Def_UniversalGameRecType_42,
@@ -1453,6 +1455,8 @@
 CrossServerMsg_ChampionshipOfficial = "ChampionshipOfficial"  # 跨服排位争霸赛官职信息
 CrossServerMsg_ChampionshipDailyOfficial = "ChampionshipDailyOfficial"  # 跨服排位争霸赛每日官职信息
 CrossServerMsg_ActAllRechargeInfo = "ActAllRechargeInfo"# 跨服全民充值信息
+CrossServerMsg_CrossDailyActionState = "CrossDailyActionState" # 跨服日常任务状态信息
+CrossServerMsg_CrossYaomoBossHurtInfo = "CrossYaomoBossHurtInfo" # 跨服妖魔boss玩家伤害信息
 
 # 子服发送跨服信息定义
 ClientServerMsg_ServerInitOK = "ServerInitOK"           # 子服启动成功
@@ -1488,6 +1492,7 @@
 ClientServerMsg_ChampionshipGuess = "ChampionshipGuess" # 跨服排位竞猜
 ClientServerMsg_ChampionshipWorship = "ChampionshipWorship" # 跨服排位膜拜
 ClientServerMsg_ActAllRechargeValue = "ActAllRechargeValue" # 跨服全民充值额度
+ClientServerMsg_CrossYaomoBossHurtAward = "CrossYaomoBossHurtAward" # 跨服妖魔boss玩家伤害领奖
 
 #跨服广播类型定义
 CrossNotify_CrossAct = "CrossAct"
@@ -1733,6 +1738,10 @@
 DailyActionID_CrossBattlefield, # 跨服战场 35
 ) = range(1, 35 + 1)
 
+# 跨服每日活动编号定义, 从150开始
+CrossDailyActionIDList = (
+CrossDailyActionID_YaomoBoss, # 妖魔boss 150
+) = range(150, 150 + 1)
 
 # 成就类型定义
 SuccessTypeList = (
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py
index 8c1e2dc..e96733f 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py
@@ -2777,7 +2777,11 @@
     
     if GetIsNewGuy(tagPlayer):
         return ChConfig.Type_Relation_None, ChConfig.Def_PASysMessage_NotAttackNewGuy
-        
+    
+    #和平光环
+    if GetPeaceBuff(curPlayer) or GetPeaceBuff(tagPlayer):
+        return ChConfig.Type_Relation_None, ChConfig.Def_PASysMessage_None
+    
     #恶意攻击的玩家默认都是敌人, 无论什么模式
     if IsMaliciousAttackPlayer(curPlayer, tagPlayer):
         return ChConfig.Type_Relation_Enemy, ChConfig.Def_PASysMessage_None
@@ -2837,6 +2841,9 @@
     #敌人关系,可PK,可加减益buff
     return ChConfig.Type_Relation_Enemy , ChConfig.Def_PASysMessage_None
 
+def GetPeaceBuff(curPlayer):
+    return SkillCommon.FindBuffByID(curPlayer, ChConfig.Def_SkillID_Peace)[0]
+
 ## 获取玩家和镖车的关系
 #  @param curPlayer: 攻击方实例
 #  @param curTagTruck: 镖车实例
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index 2d0c84d..43cafec 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -778,6 +778,8 @@
 Def_AreaType_SkillID_FamilyPK = 20012  # 家族区
 Def_AreaType_SkillID_Boss = 20008  # Boss区域
 Def_SkillID_SitArea = 20009   # 打坐区域buff
+
+Def_SkillID_Peace = 23048   # 玩家间和平buff
 #----------------------------------------------------------------------
 #战斗类型
 Def_ChanceDefRate = 2000    # 抵御伤害概率, 目前固定20%概率
@@ -2279,6 +2281,7 @@
                          1000 * 10,                        # 跨服战场
                          1000 * 10,                        # 幸运云购
                          1000 * 10,                        # 跨服排位
+                         1000 * 10,                        # 跨服妖魔boss
                          ]
 TYPE_Player_Tick_Count = len(TYPE_Player_Tick_Time) 
 
@@ -2358,6 +2361,7 @@
 TYPE_Player_Tick_Battlefield,        #跨服战场
 TYPE_Player_Tick_LuckyCloudBuy,        #幸运云购
 TYPE_Player_Tick_Championship,        #跨服排位
+TYPE_Player_Tick_CrossYaomoBoss,        #跨服妖魔boss
 ) = range(0, TYPE_Player_Tick_Count)
 
 #---------------------------------------------------------------------
@@ -5651,7 +5655,8 @@
 Def_RewardType_ShediaoRedpacket, #射雕红包奖励 50
 Def_RewardType_ShediaoEquip, #射雕装备奖励 51
 Def_RewardType_CAAllRecharge, #跨服全民充值奖励 52
-)= range(53)
+Def_RewardType_CrossYaomoBossHurt, #跨服妖魔boss伤害奖励 53
+)= range(54)
 
 
 #boss复活相关活动定义
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
index dfb0bb3..34f3883 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -15140,6 +15140,66 @@
 
 
 #------------------------------------------------------
+# C0 11 跨服妖魔boss玩家伤害信息 #tagGCCrossYaomoBossPlayerHurtInfo
+
+class  tagGCCrossYaomoBossPlayerHurtInfo(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("HurtTotal", c_int),    # 总伤害值,小于亿部分
+                  ("HurtTotalEx", c_int),    # 总伤害值,整除亿部分
+                  ("AwardState", c_int),    # 伤害目标值领奖状态,按奖励记录索引位运算判断是否已领取
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xC0
+        self.SubCmd = 0x11
+        return
+
+    def ReadData(self, stringData, _pos=0, _len=0):
+        self.Clear()
+        memmove(addressof(self), stringData[_pos:], self.GetLength())
+        return _pos + self.GetLength()
+
+    def Clear(self):
+        self.Cmd = 0xC0
+        self.SubCmd = 0x11
+        self.HurtTotal = 0
+        self.HurtTotalEx = 0
+        self.AwardState = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagGCCrossYaomoBossPlayerHurtInfo)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// C0 11 跨服妖魔boss玩家伤害信息 //tagGCCrossYaomoBossPlayerHurtInfo:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                HurtTotal:%d,
+                                HurtTotalEx:%d,
+                                AwardState:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.HurtTotal,
+                                self.HurtTotalEx,
+                                self.AwardState
+                                )
+        return DumpString
+
+
+m_NAtagGCCrossYaomoBossPlayerHurtInfo=tagGCCrossYaomoBossPlayerHurtInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCCrossYaomoBossPlayerHurtInfo.Cmd,m_NAtagGCCrossYaomoBossPlayerHurtInfo.SubCmd))] = m_NAtagGCCrossYaomoBossPlayerHurtInfo
+
+
+#------------------------------------------------------
 # C0 14 幸运云购开奖记录 #tagGCLuckyCloudBuyLotteryRecInfo
 
 class  tagGCLuckyCloudBuyLotteryRec(Structure):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
index 69cc807..d490417 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
@@ -50,6 +50,7 @@
 import FormulaControl
 import PlayerBossReborn
 import PlayerFairyCeremony
+import PlayerCrossYaomoBoss
 import PlayerActCollectWords
 import PlayerNewFairyCeremony
 import GameLogic_CrossGrassland
@@ -2391,7 +2392,9 @@
                 FamilyRobBoss.ClearFamilyOwnerBossHurt(curNPC)
         ChNPC.OnNPCSetDead(curNPC)
         
-    
+        if npcid == IpyGameDataPY.GetFuncCfg("CrossYaomoBoss", 1):
+            PlayerCrossYaomoBoss.OnCrossYaomoBossDead(curNPC)
+            
     # 清除队伍成员伤血列表
     AttackCommon.ClearTeamPlayerHurtValue(curNPC)
     # 清除自定义伤血列表
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCustomRefresh.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCustomRefresh.py
index cd6a3b0..f4fe1c0 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCustomRefresh.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCustomRefresh.py
@@ -315,6 +315,16 @@
 def NPCRefresh_218(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick)
 def NPCRefresh_219(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick)
 def NPCRefresh_220(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick)
+def NPCRefresh_221(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick)
+def NPCRefresh_222(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick)
+def NPCRefresh_223(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick)
+def NPCRefresh_224(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick)
+def NPCRefresh_225(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick)
+def NPCRefresh_226(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick)
+def NPCRefresh_227(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick)
+def NPCRefresh_228(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick)
+def NPCRefresh_229(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick)
+def NPCRefresh_230(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick)
 
 ## 世界boss刷怪
 #  @param npcRefresh 刷新实例
@@ -526,6 +536,7 @@
     lineID = GameWorld.GetGameWorld().GetLineID()
     realMapID = GameWorld.GetGameWorld().GetRealMapID()
     copyMapID = GameWorld.GetGameWorld().GetCopyMapID()
+    relatedType, relatedID = 0, ""
     
     if mapID == ChConfig.Def_FBMapID_CrossDemonKing:
         bossID = GameLogic_CrossDemonKing.GetCurFBLineBOSSID()
@@ -539,7 +550,9 @@
         
         stoneNPCID = bossIpyData.GetStoneNPCID()
         bossID = bossIpyData.GetNPCID()
-
+        relatedType = bossIpyData.GetRelatedType()
+        relatedID = bossIpyData.GetRelatedID()
+        
         if mapID not in ChConfig.Def_CrossZoneMapTableName:
             return
         tableName = ChConfig.Def_CrossZoneMapTableName[mapID]
@@ -554,8 +567,34 @@
         return
     
     gameFB = GameWorld.GetGameFB()
-    bosskey = ShareDefine.Def_Notify_WorldKey_GameWorldBossRebornCross % (zoneID, bossID)
-    rebornBossState = GameWorld.GetGameWorld().GetGameWorldDictByKey(bosskey)
+    gameWorldMgr = GameWorld.GetGameWorld()
+    forceReborn = False # 强制重生
+    actBossRebornSign = 0
+    mapActBossRebornSign = 0
+    
+    # 关联日常活动
+    if relatedType == 1:
+        relatedID = int(relatedID)
+        actionKey = ShareDefine.Def_Notify_WorldKey_CrossDailyActionState % relatedID
+        rebornBossState = 1 if gameWorldMgr.GetGameWorldDictByKey(actionKey) else 0
+            
+    # 关联运营活动,待扩展
+    elif relatedType == 2:
+        pass
+    
+    else:
+        bosskey = ShareDefine.Def_Notify_WorldKey_GameWorldBossRebornCross % (zoneID, bossID)
+        rebornBossState = GameWorld.GetGameWorld().GetGameWorldDictByKey(bosskey)
+        
+    # 关联活动boss
+    if relatedType:
+        # 关联活动boss只要复活标记与上次不同,则强制重生
+        actBossRebornSign = gameWorldMgr.GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ActionBossRebornSign % relatedID)
+        mapActBossRebornSign = gameFB.GetGameFBDictByKey(ChConfig.Map_NPC_ActBossLastRebornSign % refreshMark)
+        rebornBossState = rebornBossState and actBossRebornSign
+        if rebornBossState and actBossRebornSign != mapActBossRebornSign:
+            forceReborn = True
+            
     curNPC = None
     if npcRefresh.GetCount() > 0:
         curNPC = npcRefresh.GetAt(0)
@@ -563,11 +602,16 @@
     # 复活状态
     if rebornBossState:
         if curNPC:
-            if curNPC.GetNPCID() == bossID:
+            if not forceReborn and curNPC.GetNPCID() == bossID:
                 return
             #去掉非bossNPC
             NPCCommon.SetDeadEx(curNPC)
             
+        if mapActBossRebornSign and actBossRebornSign == mapActBossRebornSign:
+            #GameWorld.DebugLog("活动线已经刷过不再刷活动boss: lineID=%s,refreshMark=%s,bossID=%s,actBossRebornSign=%s" 
+            #                   % (lineID, refreshMark, bossID, actBossRebornSign))
+            return
+        
     # 死亡状态
     else:
         if curNPC:
@@ -598,6 +642,9 @@
     __InitNewBornNPC(npcRefresh, tick)
     gameFB.SetGameFBDict(rebornTickKey, tick)
     
+    if actBossRebornSign and rebornBossState:
+        gameFB.SetGameFBDict(ChConfig.Map_NPC_ActBossLastRebornSign % refreshMark, actBossRebornSign)
+        
     GameWorld.DebugLog("CrossBossRefresh mapID=%s,realMapID=%s,copyMapID=%s,refreshMark=%s,rebornNPCID=%s,OK!" 
                        % (mapID, realMapID, copyMapID, refreshMark, rebornNPCID), lineID)
     return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCHurtMgr.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCHurtMgr.py
index ca14f08..9061ee1 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCHurtMgr.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCHurtMgr.py
@@ -148,7 +148,7 @@
         #GameWorld.DebugLog("    hurtID=%s,hurtType=%s,updValue=%s (%s + %s), playerID=%s,updHurtPlayerValue=%s" 
         #                   % (hurtID, hurtType, updValue, befValue, addValue, playerID, updHurtPlayerValue), self.npcID, self.lineID)
         if isNewHurt:
-            self.__Sort()
+            self.Sort()
             
         return isNewHurt
     
@@ -160,7 +160,7 @@
             return 0
         return -1
     
-    def __Sort(self):
+    def Sort(self):
         ## 伤血排序
         self.__hurtSortList = sorted(self.__hurtDict.values(), cmp=self.__CmpHurtValue, reverse=True)
         return
@@ -184,6 +184,8 @@
             hurtValueObj.HurtValue = hurtValue % ShareDefine.Def_PerPointValue
             hurtValueObj.HurtValueEx = hurtValue / ShareDefine.Def_PerPointValue
             hurtValueList.append(hurtValueObj)
+            if len(hurtValueList) > 250:
+                break
             
         if not syncPlayerIDList:
             return
@@ -223,7 +225,7 @@
             self.checkHurtValidFunc()
             
         # 2. 排序
-        self.__Sort()
+        self.Sort()
         
         # 3. 同步前端
         self.__SyncHurtList()
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
index ff599fd..b19df79 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -119,6 +119,7 @@
 import PlayerFairyCeremony
 import PlayerNewFairyCeremony
 import GY_Query_BossFirstKill
+import PlayerCrossYaomoBoss
 import PlayerFeastRedPacket
 import PlayerLuckyCloudBuy
 import PlayerLuckyTreasure
@@ -5605,6 +5606,9 @@
     # 跨服全民充值奖励
     elif rewardType == ChConfig.Def_RewardType_CAAllRecharge:
         CrossActAllRecharge.GetCrossActAllRechargeAward(curPlayer, dataEx)
+    # 跨服妖魔boss伤害奖励
+    elif rewardType == ChConfig.Def_RewardType_CrossYaomoBossHurt:
+        PlayerCrossYaomoBoss.GetCrossYaomoBossHurtAward(curPlayer, dataEx, tick)
     #缥缈奇遇领取
     elif rewardType == ChConfig.Def_RewardType_FairyAdventuresAward:
         PlayerFairyDomain.GetFairyAdventuresAward(curPlayer, dataEx, dataExStr)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCrossYaomoBoss.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCrossYaomoBoss.py
new file mode 100644
index 0000000..4db1a8c
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCrossYaomoBoss.py
@@ -0,0 +1,114 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package Player.PlayerCrossYaomoBoss
+#
+# @todo:跨服妖魔boss
+# @author hxp
+# @date 2022-11-11
+# @version 1.0
+#
+# 详细描述: 跨服妖魔boss
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2022-11-11 15:30"""
+#-------------------------------------------------------------------------------
+
+import GameWorld
+import NPCHurtMgr
+import PlayerControl
+import IpyGameDataPY
+import ItemControler
+import IPY_GameWorld
+import ShareDefine
+import ItemCommon
+import ChConfig
+
+def OnYaomoBossStateChange(state, tick):
+    ## 活动状态变更
+    if state:
+        # 开始的不需要处理
+        return
+    return
+
+def OnCrossYaomoBossDead(curNPC):
+    
+    objID = curNPC.GetID()
+    npcID = curNPC.GetNPCID()
+    mapID = GameWorld.GetGameWorld().GetMapID()
+    lineID = GameWorld.GetGameWorld().GetLineID()
+    realMapID = GameWorld.GetGameWorld().GetRealMapID()
+    copyMapID = GameWorld.GetGameWorld().GetCopyMapID()
+    
+    zoneID = 0
+    zoneTypeName = ChConfig.Def_CrossZoneMapTableName.get(mapID)
+    ipyDataMgr = IpyGameDataPY.IPY_Data()
+    if zoneTypeName and hasattr(ipyDataMgr, "Get%sCount" % zoneTypeName):
+        for index in range(getattr(ipyDataMgr, "Get%sCount" % zoneTypeName)()):
+            ipyData = getattr(ipyDataMgr, "Get%sByIndex" % zoneTypeName)(index)
+            if realMapID == ipyData.GetMapID() and copyMapID == ipyData.GetCopyMapID():
+                zoneID = ipyData.GetZoneID()
+                break
+            
+    npcHurtList = NPCHurtMgr.GetPlayerHurtList(curNPC)
+    if not npcHurtList or not npcHurtList.GetHurtCount():
+        GameWorld.ErrLog("跨服妖魔boss结算无伤害列表: mapID=%s,lineID=%s,realMapID=%s,copyMapID=%s,zoneID=%s,npcID=%s,objID=%s" 
+                         % (mapID, lineID, realMapID, copyMapID, zoneID, npcID, objID))
+        return
+    
+    GameWorld.Log("跨服妖魔boss伤害结算: mapID=%s,lineID=%s,realMapID=%s,copyMapID=%s,zoneID=%s,npcID=%s,objID=%s" 
+                  % (mapID, lineID, realMapID, copyMapID, zoneID, npcID, objID))
+    npcHurtList.Sort()  #sort以后伤血列表从大到小排序
+    
+    rank = 0
+    playerHurtList = []
+    for index in xrange(npcHurtList.GetHurtCount()):
+        #获得伤血对象
+        hurtObj = npcHurtList.GetHurtAt(index)
+        hurtType = hurtObj.GetValueType()
+        hurtID = hurtObj.GetValueID()
+        hurtValue = hurtObj.GetHurtValue()
+        hurtName = hurtObj.GetHurtName()
+        if hurtType != ChConfig.Def_NPCHurtTypePlayer or not hurtID:
+            continue
+        rank += 1
+        playerID = hurtID
+        GameWorld.Log("    zoneID=%s,rank=%s,playerID=%s,hurtValue=%s" % (zoneID, rank, playerID, hurtValue))
+        playerHurtList.append([playerID, hurtValue, hurtName])
+        
+    msgInfo = str([zoneID, npcID, playerHurtList])
+    GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, "CrossYaomoBossHurtInfo", msgInfo, len(msgInfo))
+    return
+
+def GetCrossYaomoBossHurtAward(curPlayer, awardIndex, tick):
+    
+    playerID = curPlayer.GetPlayerID()
+    if not ItemCommon.CheckPackHasSpace(curPlayer, IPY_GameWorld.rptItem, True):
+        return
+    
+    if not GameWorld.SetPlayerTickTime(curPlayer, ChConfig.TYPE_Player_Tick_CrossYaomoBoss, tick):
+        PlayerControl.NotifyCode(curPlayer, "RequestLater")
+        return
+    
+    # 发送跨服服务器
+    dataMsg = {"playerID":playerID, "awardIndex":awardIndex}
+    GameWorld.SendMsgToCrossServer(ShareDefine.ClientServerMsg_CrossYaomoBossHurtAward, dataMsg)
+    return
+
+def GameServer_CrossYaomoBoss_DoResult(curPlayer, msgData):
+    msgType, dataMsg = msgData[:2]
+    #ret = msgData[2] if len(msgData) > 2 else None
+    
+    ## 伤害目标奖励 
+    if msgType == "HurtValueAward":
+        __DoGiveCrossYaomoBossHurtAward(curPlayer, dataMsg)
+        
+    return
+
+def __DoGiveCrossYaomoBossHurtAward(curPlayer, dataMsg):
+    playerID = curPlayer.GetPlayerID()
+    awardIndex, awardItemList = dataMsg
+    GameWorld.Log("给玩家跨服妖魔boss伤害目标奖励: awardIndex=%s,awardItemList=%s" % (awardIndex, awardItemList), playerID)
+    ItemControler.GivePlayerItemOrMail(curPlayer, awardItemList, event=["CrossYaomoBoss", False, {}])
+    return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_CrossYaomoBoss.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_CrossYaomoBoss.py
new file mode 100644
index 0000000..1b9ee68
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_CrossYaomoBoss.py
@@ -0,0 +1,48 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package Player.RemoteQuery.GY_Query_CrossYaomoBoss
+#
+# @todo:跨服妖魔Boss
+# @author hxp
+# @date 2022-11-11
+# @version 1.0
+#
+# 详细描述: 跨服妖魔Boss
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2022-11-11 15:30"""
+#-------------------------------------------------------------------------------
+
+import ChConfig
+import GameWorld
+import PlayerCrossYaomoBoss
+
+#------------------------------------------------------------------------------ 
+## 执行逻辑
+#  @param query_Type 请求类型
+#  @param query_ID 请求的玩家ID
+#  @param packCMDList 发包命令
+#  @param tick 当前时间
+#  @return "True" or "False" or ""
+#  @remarks 函数详细说明.
+def DoLogic(query_Type, query_ID, packCMDList, tick):
+    return
+
+#------------------------------------------------------------------------------ 
+## 执行结果
+#  @param curPlayer 发出请求的玩家
+#  @param callFunName 功能名称
+#  @param funResult 查询的结果
+#  @param tick 当前时间
+#  @return None
+#  @remarks 函数详细说明.
+def DoResult(curPlayer, callFunName, funResult, tick):
+    curPlayer.SetTickByType(ChConfig.TYPE_Player_Tick_CrossYaomoBoss, 0)
+    msgData = eval(funResult)
+    playerID = curPlayer.GetPlayerID()
+    GameWorld.Log("GY_Query_CrossYaomoBoss msgData=%s" % (msgData), playerID)
+    PlayerCrossYaomoBoss.GameServer_CrossYaomoBoss_DoResult(curPlayer, msgData)
+    return
+
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
index 6de589c..b27b4cc 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -799,7 +799,9 @@
 Def_CBT_BattlefieldWJoin, # 跨服战场每周参与榜  151
 Def_CBT_BattlefieldWCall, # 跨服战场每周召集榜  152
 Def_CBT_BattlefieldWScore, # 跨服战场每周积分榜  153
-) = range(150, 153 + 1)
+Def_CBT_BattlefieldWScoreLastWeek, # 跨服战场上周积分榜  154
+Def_CBT_YaomoBossHurt, # 跨服妖魔boss最新一次伤血排名  155
+) = range(150, 155 + 1)
 
 #职业对应战力排行榜类型
 JobFightPowerBillboardDict = {
@@ -1255,8 +1257,8 @@
                                 Def_UniversalGameRecType_CrossChampionshipOfficial, # 跨服排位争霸赛最终排名官职信息 35
                                 Def_UniversalGameRecType_CrossChampionshipOffChallenge, # 跨服排位争霸赛官职挑战信息 36
                                 Def_UniversalGameRecType_CrossActAllRecharge, # 跨服全服充值活动信息 37
-                                Def_UniversalGameRecType_38,
-                                Def_UniversalGameRecType_39,
+                                Def_UniversalGameRecType_CrossBattleChampionGroup, # 跨服战场冠军赛分组信息 38
+                                Def_UniversalGameRecType_CrossYaomoBossHurtInfo, # 跨服妖魔boss伤血信息 39
                                 Def_UniversalGameRecType_40,
                                 Def_UniversalGameRecType_RedPacketRecord,   # 红包产出结果记录41
                                 Def_UniversalGameRecType_42,
@@ -1453,6 +1455,8 @@
 CrossServerMsg_ChampionshipOfficial = "ChampionshipOfficial"  # 跨服排位争霸赛官职信息
 CrossServerMsg_ChampionshipDailyOfficial = "ChampionshipDailyOfficial"  # 跨服排位争霸赛每日官职信息
 CrossServerMsg_ActAllRechargeInfo = "ActAllRechargeInfo"# 跨服全民充值信息
+CrossServerMsg_CrossDailyActionState = "CrossDailyActionState" # 跨服日常任务状态信息
+CrossServerMsg_CrossYaomoBossHurtInfo = "CrossYaomoBossHurtInfo" # 跨服妖魔boss玩家伤害信息
 
 # 子服发送跨服信息定义
 ClientServerMsg_ServerInitOK = "ServerInitOK"           # 子服启动成功
@@ -1488,6 +1492,7 @@
 ClientServerMsg_ChampionshipGuess = "ChampionshipGuess" # 跨服排位竞猜
 ClientServerMsg_ChampionshipWorship = "ChampionshipWorship" # 跨服排位膜拜
 ClientServerMsg_ActAllRechargeValue = "ActAllRechargeValue" # 跨服全民充值额度
+ClientServerMsg_CrossYaomoBossHurtAward = "CrossYaomoBossHurtAward" # 跨服妖魔boss玩家伤害领奖
 
 #跨服广播类型定义
 CrossNotify_CrossAct = "CrossAct"
@@ -1733,6 +1738,10 @@
 DailyActionID_CrossBattlefield, # 跨服战场 35
 ) = range(1, 35 + 1)
 
+# 跨服每日活动编号定义, 从150开始
+CrossDailyActionIDList = (
+CrossDailyActionID_YaomoBoss, # 妖魔boss 150
+) = range(150, 150 + 1)
 
 # 成就类型定义
 SuccessTypeList = (
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillCommon.py
index c9f56fd..21b92f7 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillCommon.py
@@ -1751,7 +1751,11 @@
         return True
     
     buffSkill = curObjBuff.GetSkill()
-    
+    if buffType == IPY_GameWorld.bfAura:
+        if buffSkill.GetSkillLV() >= curSkillLV:
+            #GameWorld.DebugLog("光环技能只添加更高级的效果!")
+            return
+        
     #buff根据情况可以叠加低级,或者低级覆盖高级
 #    buffSkillLV = buffSkill.GetSkillLV()
 #    

--
Gitblit v1.8.0