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