From 4c115be5ce3f4be8766b2e10d1982807b787f132 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期四, 18 七月 2024 17:46:34 +0800
Subject: [PATCH] 10223 【越南】【砍树】【主干】【港台】秘境寻宝(仙匣秘境层支持配置物品数、支持消耗道具寻宝;增加本服榜;增加跨服活动榜;任务活动支持仙匣秘境寻宝x次、x层任务类型;充值购买次数礼包活动支持配置额外的活动商城类型,支持配置每日重置的购买次数奖励;)
---
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py | 7
ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py | 82 ++
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActXianXiaMJ.py | 295 +++++++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActBuyCountGift.py | 27
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py | 11
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py | 9
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py | 583 ++++++++++++++-
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py | 583 ++++++++++++++-
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerDBGSEvent.py | 4
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActTask.py | 37 +
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmMsg.py | 4
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActBossTrial.py | 2
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py | 61 +
ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py | 1
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossActionControl.py | 9
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py | 2
PySysDB/PySysDBPY.h | 23
ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py | 11
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py | 4
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActXianXiaMJ.py | 376 +++++++--
PySysDB/PySysDBG.h | 34
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py | 9
22 files changed, 1,937 insertions(+), 237 deletions(-)
diff --git a/PySysDB/PySysDBG.h b/PySysDB/PySysDBG.h
index 75a33f3..cc8d22e 100644
--- a/PySysDB/PySysDBG.h
+++ b/PySysDB/PySysDBG.h
@@ -618,10 +618,36 @@
BYTE ActNum; //活动分组编号, 活动类型 * 10 + 不同界面编号
char StartDate; //开启日期
char EndDate; //结束日期
- dict NotifyInfoStart; //全服提示信息 - 相对开始时间
- dict NotifyInfoEnd; //全服提示信息 - 相对结束时间
- list NotifyInfoLoop; //全服提示信息 - 循环广播[间隔分钟, 广播key]
- BYTE ResetType; //重置类型,0-0点重置;1-5点重置
+ char JoinStartTime; //参与开始时间点
+ char JoinEndTime; //参与结束时间点
+ BYTE IsDayReset; //是否每天重置
+ WORD PersonalTemplateID; //个人排行模板编号
+};
+
+//仙匣秘境活动跨服表
+
+struct tagCrossActXianXiaMJ
+{
+ DWORD _CfgID; //配置ID
+ char ActGroupName; //活动组名(同组活动的名字需相同)
+ BYTE ZoneID; //组内分组编号
+ list ServerIDRangeList; //活动的账号服务器ID范围列表 [[serverIDA, serverIDB], ...]
+ char StartDate; //开启日期
+ char EndDate; //结束日期
+ char JoinStartTime; //参与开始时间点
+ char JoinEndTime; //参与结束时间点
+ BYTE IsDayReset; //是否每天重置
+ WORD RankLimitPersonal; //个人上榜积分限制
+ WORD PersonalTemplateID; //个人排行模板编号
+};
+
+//仙匣秘境榜单模版表
+
+struct tagActXianXiaMJBillTemp
+{
+ DWORD _TemplateID; //模板编号
+ BYTE Rank; //名次
+ list AwardItemList; //奖励物品列表[[物品ID,个数,是否拍品], ...]
};
//天帝礼包活动时间表
diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h
index e7f5b18..7299ac6 100644
--- a/PySysDB/PySysDBPY.h
+++ b/PySysDB/PySysDBPY.h
@@ -1906,10 +1906,25 @@
DWORD _CfgID; //配置ID
char StartDate; //开启日期
char EndDate; //结束日期
- BYTE ResetType; //重置类型,0-0点重置;1-5点重置
+ char JoinStartTime; //参与开始时间点
+ char JoinEndTime; //参与结束时间点
+ BYTE IsDayReset; //是否每天重置
WORD LVLimit; //限制等级
+ DWORD UseItemID; //消耗物品ID
list UseMoneyInfo; //消耗货币信息
BYTE TemplateID; //模板ID
+ WORD PersonalTemplateID; //个人排行模板编号
+ WORD LotteryAddScore; //每次抽奖加积分
+ WORD LayerAddScore; //每次跨层加积分
+};
+
+//仙匣秘境榜单模版表
+
+struct tagActXianXiaMJBillTemp
+{
+ DWORD _TemplateID; //模板编号
+ BYTE Rank; //名次
+ list AwardItemList; //奖励物品列表[[物品ID,个数,是否拍品], ...]
};
//仙匣秘境奖池表
@@ -1918,8 +1933,8 @@
{
DWORD _TemplateID; //奖池模板编号
BYTE AwardLibType; //奖励库类型
- BYTE AwardItemCount; //选择个数
- BYTE UnlockAwardLimitTimes; //抽X次后可产出(本层)
+ list AwardItemCountList; //层选择个数列表 层1物品数|层2|…
+ list UnlockAwardLimitTimesList; //层抽X次后可产出(本层) 层1限制|层2|…
BYTE AwardLibWeight; //产出该库外权重
dict LibItemInfo; //本库物品随机库内权重(先随机库外权重,若产出再随机库内权重)
dict ItemLayerLimitInfo; //物品产出奖池层限制 {物品ID:大于等于X层可产出, ...}
@@ -2504,6 +2519,8 @@
BYTE ResetType; //重置类型,0-0点重置;1-5点重置
list CTGIDList; //充值ID列表 [ctgID, ...]
dict CTGCountAwardInfo; //累计充值次数额外奖励
+ list CTGCountDayResetList; //每日重置累充次数列表
+ DWORD ActShopType; //商城类型
};
//任务活动时间表
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py b/ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py
index b5baf5d..c25488b 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py
@@ -614,6 +614,7 @@
ShareDefine.Def_BT_BossTrialSubmitBak : 200, #boss凭证 (boss历练活动 - 上一期)
ShareDefine.Def_BT_BossTrialSubmitFamily : 100, #boss凭证仙盟 (boss历练活动)
ShareDefine.Def_BT_BossTrialSubmitFamilyBak : 100, #boss凭证仙盟 (boss历练活动 - 上一期)
+ ShareDefine.Def_BT_XianXiaMJScore : 200, #仙匣秘境积分榜 (仙匣秘境活动)
}
#排行榜保存类型(和BillboardType匹配), 默认保存, 如果不保存,可配置进去
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
index b0e0ae9..5d17e1a 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -32670,6 +32670,7 @@
CTGIDList = list() #(vector<WORD> CTGIDList)// CTGID列表;总购买次数前端自己统计,直接取CTGID对应的累计购买次数累加
GiftCount = 0 #(BYTE GiftCount)
BuyCountGiftList = list() #(vector<tagMCActBuyCountGift> BuyCountGiftList)// 购买次数礼包列表
+ ShopType = 0 #(WORD ShopType)// 开放商店类型,可能为0不开放
data = None
def __init__(self):
@@ -32696,6 +32697,7 @@
temBuyCountGiftList = tagMCActBuyCountGift()
_pos = temBuyCountGiftList.ReadData(_lpData, _pos)
self.BuyCountGiftList.append(temBuyCountGiftList)
+ self.ShopType,_pos = CommFunc.ReadWORD(_lpData, _pos)
return _pos
def Clear(self):
@@ -32713,6 +32715,7 @@
self.CTGIDList = list()
self.GiftCount = 0
self.BuyCountGiftList = list()
+ self.ShopType = 0
return
def GetLength(self):
@@ -32729,6 +32732,7 @@
length += 1
for i in range(self.GiftCount):
length += self.BuyCountGiftList[i].GetLength()
+ length += 2
return length
@@ -32747,6 +32751,7 @@
data = CommFunc.WriteBYTE(data, self.GiftCount)
for i in range(self.GiftCount):
data = CommFunc.WriteString(data, self.BuyCountGiftList[i].GetLength(), self.BuyCountGiftList[i].GetBuffer())
+ data = CommFunc.WriteWORD(data, self.ShopType)
return data
def OutputString(self):
@@ -32761,7 +32766,8 @@
CTGIDCount:%d,
CTGIDList:%s,
GiftCount:%d,
- BuyCountGiftList:%s
+ BuyCountGiftList:%s,
+ ShopType:%d
'''\
%(
self.Head.OutputString(),
@@ -32774,7 +32780,8 @@
self.CTGIDCount,
"...",
self.GiftCount,
- "..."
+ "...",
+ self.ShopType
)
return DumpString
@@ -38352,6 +38359,7 @@
("ItemCount", c_ushort),
("PosNum", c_ubyte), # 被抽中时的位置编号,1~99,前端自定义展示位置编号,0代表未被抽中;
("TotalTimesNow", c_ubyte), #当前已产出次数,不限制次数时不记录,即同样为0
+ ("LotteryScore", c_int), #当前抽奖积分
]
def __init__(self):
@@ -38374,6 +38382,7 @@
self.ItemCount = 0
self.PosNum = 0
self.TotalTimesNow = 0
+ self.LotteryScore = 0
return
def GetLength(self):
@@ -38391,7 +38400,8 @@
ItemID:%d,
ItemCount:%d,
PosNum:%d,
- TotalTimesNow:%d
+ TotalTimesNow:%d,
+ LotteryScore:%d
'''\
%(
self.Cmd,
@@ -38401,7 +38411,8 @@
self.ItemID,
self.ItemCount,
self.PosNum,
- self.TotalTimesNow
+ self.TotalTimesNow,
+ self.LotteryScore
)
return DumpString
@@ -38413,7 +38424,260 @@
#------------------------------------------------------
# AA 58 仙匣秘境活动信息 #tagMCActXianXiaMJInfo
-class tagMCActXianXiaMJAwardItem(Structure):
+class tagMCActXianXiaMJItem(Structure):
+ _pack_ = 1
+ _fields_ = [
+ ("ItemID", c_int),
+ ("ItemCount", c_ushort),
+ ("IsBind", c_ubyte),
+ ]
+
+ def __init__(self):
+ self.Clear()
+ 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.ItemID = 0
+ self.ItemCount = 0
+ self.IsBind = 0
+ return
+
+ def GetLength(self):
+ return sizeof(tagMCActXianXiaMJItem)
+
+ def GetBuffer(self):
+ return string_at(addressof(self), self.GetLength())
+
+ def OutputString(self):
+ DumpString = '''// AA 58 仙匣秘境活动信息 //tagMCActXianXiaMJInfo:
+ ItemID:%d,
+ ItemCount:%d,
+ IsBind:%d
+ '''\
+ %(
+ self.ItemID,
+ self.ItemCount,
+ self.IsBind
+ )
+ return DumpString
+
+
+class tagMCActXianXiaMJBillard(Structure):
+ Rank = 0 #(DWORD Rank)// 名次,1-代表第一名;支持夸段,如1,3 代表第1名,第2~3名
+ Count = 0 #(BYTE Count)// 奖励物品数
+ AwardItemList = list() #(vector<tagMCActXianXiaMJItem> AwardItemList)// 奖励物品列表
+ data = None
+
+ def __init__(self):
+ self.Clear()
+ return
+
+ def ReadData(self, _lpData, _pos=0, _Len=0):
+ self.Clear()
+ self.Rank,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+ self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+ for i in range(self.Count):
+ temAwardItemList = tagMCActXianXiaMJItem()
+ _pos = temAwardItemList.ReadData(_lpData, _pos)
+ self.AwardItemList.append(temAwardItemList)
+ return _pos
+
+ def Clear(self):
+ self.Rank = 0
+ self.Count = 0
+ self.AwardItemList = list()
+ return
+
+ def GetLength(self):
+ length = 0
+ length += 4
+ length += 1
+ for i in range(self.Count):
+ length += self.AwardItemList[i].GetLength()
+
+ return length
+
+ def GetBuffer(self):
+ data = ''
+ data = CommFunc.WriteDWORD(data, self.Rank)
+ data = CommFunc.WriteBYTE(data, self.Count)
+ for i in range(self.Count):
+ data = CommFunc.WriteString(data, self.AwardItemList[i].GetLength(), self.AwardItemList[i].GetBuffer())
+ return data
+
+ def OutputString(self):
+ DumpString = '''
+ Rank:%d,
+ Count:%d,
+ AwardItemList:%s
+ '''\
+ %(
+ self.Rank,
+ self.Count,
+ "..."
+ )
+ return DumpString
+
+
+class tagMCActXianXiaMJInfo(Structure):
+ Head = tagHead()
+ ActNum = 0 #(BYTE ActNum)// 活动编号
+ StartDate = "" #(char StartDate[10])// 开始日期 y-m-d
+ EndtDate = "" #(char EndtDate[10])// 结束日期 y-m-d
+ JoinStartTime = "" #(char JoinStartTime[5])// 参与开始时间点 mm:ss
+ JoinEndTime = "" #(char JoinEndTime[5])// 参与结束时间点 mm:ss
+ IsDayReset = 0 #(BYTE IsDayReset)// 是否每天重置
+ LimitLV = 0 #(WORD LimitLV)// 限制等级
+ UseItemID = 0 #(DWORD UseItemID)//消耗物品ID,默认1个;消耗物品或货币二选一即可,或都配则先消耗道具,不足则消耗货币
+ MoneyType = 0 #(BYTE MoneyType)//消耗货币类型
+ MoneyValue = 0 #(WORD MoneyValue)//消耗货币值
+ LotteryAddScore = 0 #(WORD LotteryAddScore)//每次抽奖加积分
+ LayerAddScore = 0 #(WORD LayerAddScore)//每次跨层加积分
+ PersonalBillCount = 0 #(BYTE PersonalBillCount)
+ PersonalBillboardInfoList = list() #(vector<tagMCActXianXiaMJBillard> PersonalBillboardInfoList)// 个人榜单奖励信息列表,如果没有代表本次活动没有该榜奖励
+ data = None
+
+ def __init__(self):
+ self.Clear()
+ self.Head.Cmd = 0xAA
+ self.Head.SubCmd = 0x58
+ return
+
+ def ReadData(self, _lpData, _pos=0, _Len=0):
+ self.Clear()
+ _pos = self.Head.ReadData(_lpData, _pos)
+ self.ActNum,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+ self.StartDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
+ self.EndtDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
+ self.JoinStartTime,_pos = CommFunc.ReadString(_lpData, _pos,5)
+ self.JoinEndTime,_pos = CommFunc.ReadString(_lpData, _pos,5)
+ self.IsDayReset,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+ self.LimitLV,_pos = CommFunc.ReadWORD(_lpData, _pos)
+ self.UseItemID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+ self.MoneyType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+ self.MoneyValue,_pos = CommFunc.ReadWORD(_lpData, _pos)
+ self.LotteryAddScore,_pos = CommFunc.ReadWORD(_lpData, _pos)
+ self.LayerAddScore,_pos = CommFunc.ReadWORD(_lpData, _pos)
+ self.PersonalBillCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+ for i in range(self.PersonalBillCount):
+ temPersonalBillboardInfoList = tagMCActXianXiaMJBillard()
+ _pos = temPersonalBillboardInfoList.ReadData(_lpData, _pos)
+ self.PersonalBillboardInfoList.append(temPersonalBillboardInfoList)
+ return _pos
+
+ def Clear(self):
+ self.Head = tagHead()
+ self.Head.Clear()
+ self.Head.Cmd = 0xAA
+ self.Head.SubCmd = 0x58
+ self.ActNum = 0
+ self.StartDate = ""
+ self.EndtDate = ""
+ self.JoinStartTime = ""
+ self.JoinEndTime = ""
+ self.IsDayReset = 0
+ self.LimitLV = 0
+ self.UseItemID = 0
+ self.MoneyType = 0
+ self.MoneyValue = 0
+ self.LotteryAddScore = 0
+ self.LayerAddScore = 0
+ self.PersonalBillCount = 0
+ self.PersonalBillboardInfoList = list()
+ return
+
+ def GetLength(self):
+ length = 0
+ length += self.Head.GetLength()
+ length += 1
+ length += 10
+ length += 10
+ length += 5
+ length += 5
+ length += 1
+ length += 2
+ length += 4
+ length += 1
+ length += 2
+ length += 2
+ length += 2
+ length += 1
+ for i in range(self.PersonalBillCount):
+ length += self.PersonalBillboardInfoList[i].GetLength()
+
+ return length
+
+ def GetBuffer(self):
+ data = ''
+ data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+ data = CommFunc.WriteBYTE(data, self.ActNum)
+ data = CommFunc.WriteString(data, 10, self.StartDate)
+ data = CommFunc.WriteString(data, 10, self.EndtDate)
+ data = CommFunc.WriteString(data, 5, self.JoinStartTime)
+ data = CommFunc.WriteString(data, 5, self.JoinEndTime)
+ data = CommFunc.WriteBYTE(data, self.IsDayReset)
+ data = CommFunc.WriteWORD(data, self.LimitLV)
+ data = CommFunc.WriteDWORD(data, self.UseItemID)
+ data = CommFunc.WriteBYTE(data, self.MoneyType)
+ data = CommFunc.WriteWORD(data, self.MoneyValue)
+ data = CommFunc.WriteWORD(data, self.LotteryAddScore)
+ data = CommFunc.WriteWORD(data, self.LayerAddScore)
+ data = CommFunc.WriteBYTE(data, self.PersonalBillCount)
+ for i in range(self.PersonalBillCount):
+ data = CommFunc.WriteString(data, self.PersonalBillboardInfoList[i].GetLength(), self.PersonalBillboardInfoList[i].GetBuffer())
+ return data
+
+ def OutputString(self):
+ DumpString = '''
+ Head:%s,
+ ActNum:%d,
+ StartDate:%s,
+ EndtDate:%s,
+ JoinStartTime:%s,
+ JoinEndTime:%s,
+ IsDayReset:%d,
+ LimitLV:%d,
+ UseItemID:%d,
+ MoneyType:%d,
+ MoneyValue:%d,
+ LotteryAddScore:%d,
+ LayerAddScore:%d,
+ PersonalBillCount:%d,
+ PersonalBillboardInfoList:%s
+ '''\
+ %(
+ self.Head.OutputString(),
+ self.ActNum,
+ self.StartDate,
+ self.EndtDate,
+ self.JoinStartTime,
+ self.JoinEndTime,
+ self.IsDayReset,
+ self.LimitLV,
+ self.UseItemID,
+ self.MoneyType,
+ self.MoneyValue,
+ self.LotteryAddScore,
+ self.LayerAddScore,
+ self.PersonalBillCount,
+ "..."
+ )
+ return DumpString
+
+
+m_NAtagMCActXianXiaMJInfo=tagMCActXianXiaMJInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCActXianXiaMJInfo.Head.Cmd,m_NAtagMCActXianXiaMJInfo.Head.SubCmd))] = m_NAtagMCActXianXiaMJInfo
+
+
+#------------------------------------------------------
+# AA 79 仙匣秘境层信息 #tagMCActXianXiaMJLayerInfo
+
+class tagMCActXianXiaMJLayerItem(Structure):
_pack_ = 1
_fields_ = [
("ItemLibType", c_ubyte), #物品库类型;9-固定为大奖库,非9-策划自定义库
@@ -38445,13 +38709,13 @@
return
def GetLength(self):
- return sizeof(tagMCActXianXiaMJAwardItem)
+ return sizeof(tagMCActXianXiaMJLayerItem)
def GetBuffer(self):
return string_at(addressof(self), self.GetLength())
def OutputString(self):
- DumpString = '''// AA 58 仙匣秘境活动信息 //tagMCActXianXiaMJInfo:
+ DumpString = '''// AA 79 仙匣秘境层信息 //tagMCActXianXiaMJLayerInfo:
ItemLibType:%d,
ItemID:%d,
ItemCount:%d,
@@ -38472,48 +38736,38 @@
return DumpString
-class tagMCActXianXiaMJInfo(Structure):
+class tagMCActXianXiaMJLayerInfo(Structure):
Head = tagHead()
ActNum = 0 #(BYTE ActNum)// 活动编号
- StartDate = "" #(char StartDate[10])// 开始日期 y-m-d
- EndtDate = "" #(char EndtDate[10])// 结束日期 y-m-d
- LimitLV = 0 #(WORD LimitLV)// 限制等级
- ResetType = 0 #(BYTE ResetType)// 重置类型,0-0点重置;1-5点开,5点重置;2-5点开,0点重置
- MoneyType = 0 #(BYTE MoneyType)//消耗货币类型
- MoneyValue = 0 #(WORD MoneyValue)//消耗货币值
- LayerNum = 0 #(BYTE LayerNum)//当前奖池第几层
+ LayerNum = 0 #(WORD LayerNum)//当前奖池第几层
+ LotteryScore = 0 #(DWORD LotteryScore)//当前抽奖积分
AwardItemCount = 0 #(BYTE AwardItemCount)
- AwardItemList = list() #(vector<tagMCActXianXiaMJAwardItem> AwardItemList)// 奖池物品列表,已生成的,包含已选择的大奖物品
+ AwardItemList = list() #(vector<tagMCActXianXiaMJLayerItem> AwardItemList)// 奖池物品列表,已生成的,包含已选择的大奖物品
SuperItemCount = 0 #(BYTE SuperItemCount)
- SuperItemList = list() #(vector<tagMCActXianXiaMJAwardItem> SuperItemList)// 大奖物品待选择库,由玩家从库中选择放入奖池的物品;
+ SuperItemList = list() #(vector<tagMCActXianXiaMJLayerItem> SuperItemList)// 大奖物品待选择库,由玩家从库中选择放入奖池的物品;
SuperItemCanChooseCount = 0 #(BYTE SuperItemCanChooseCount)// 大奖物品可选择个数
data = None
def __init__(self):
self.Clear()
self.Head.Cmd = 0xAA
- self.Head.SubCmd = 0x58
+ self.Head.SubCmd = 0x79
return
def ReadData(self, _lpData, _pos=0, _Len=0):
self.Clear()
_pos = self.Head.ReadData(_lpData, _pos)
self.ActNum,_pos = CommFunc.ReadBYTE(_lpData, _pos)
- self.StartDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
- self.EndtDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
- self.LimitLV,_pos = CommFunc.ReadWORD(_lpData, _pos)
- self.ResetType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
- self.MoneyType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
- self.MoneyValue,_pos = CommFunc.ReadWORD(_lpData, _pos)
- self.LayerNum,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+ self.LayerNum,_pos = CommFunc.ReadWORD(_lpData, _pos)
+ self.LotteryScore,_pos = CommFunc.ReadDWORD(_lpData, _pos)
self.AwardItemCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
for i in range(self.AwardItemCount):
- temAwardItemList = tagMCActXianXiaMJAwardItem()
+ temAwardItemList = tagMCActXianXiaMJLayerItem()
_pos = temAwardItemList.ReadData(_lpData, _pos)
self.AwardItemList.append(temAwardItemList)
self.SuperItemCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
for i in range(self.SuperItemCount):
- temSuperItemList = tagMCActXianXiaMJAwardItem()
+ temSuperItemList = tagMCActXianXiaMJLayerItem()
_pos = temSuperItemList.ReadData(_lpData, _pos)
self.SuperItemList.append(temSuperItemList)
self.SuperItemCanChooseCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
@@ -38523,15 +38777,10 @@
self.Head = tagHead()
self.Head.Clear()
self.Head.Cmd = 0xAA
- self.Head.SubCmd = 0x58
+ self.Head.SubCmd = 0x79
self.ActNum = 0
- self.StartDate = ""
- self.EndtDate = ""
- self.LimitLV = 0
- self.ResetType = 0
- self.MoneyType = 0
- self.MoneyValue = 0
self.LayerNum = 0
+ self.LotteryScore = 0
self.AwardItemCount = 0
self.AwardItemList = list()
self.SuperItemCount = 0
@@ -38543,13 +38792,8 @@
length = 0
length += self.Head.GetLength()
length += 1
- length += 10
- length += 10
length += 2
- length += 1
- length += 1
- length += 2
- length += 1
+ length += 4
length += 1
for i in range(self.AwardItemCount):
length += self.AwardItemList[i].GetLength()
@@ -38564,13 +38808,8 @@
data = ''
data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
data = CommFunc.WriteBYTE(data, self.ActNum)
- data = CommFunc.WriteString(data, 10, self.StartDate)
- data = CommFunc.WriteString(data, 10, self.EndtDate)
- data = CommFunc.WriteWORD(data, self.LimitLV)
- data = CommFunc.WriteBYTE(data, self.ResetType)
- data = CommFunc.WriteBYTE(data, self.MoneyType)
- data = CommFunc.WriteWORD(data, self.MoneyValue)
- data = CommFunc.WriteBYTE(data, self.LayerNum)
+ data = CommFunc.WriteWORD(data, self.LayerNum)
+ data = CommFunc.WriteDWORD(data, self.LotteryScore)
data = CommFunc.WriteBYTE(data, self.AwardItemCount)
for i in range(self.AwardItemCount):
data = CommFunc.WriteString(data, self.AwardItemList[i].GetLength(), self.AwardItemList[i].GetBuffer())
@@ -38584,13 +38823,8 @@
DumpString = '''
Head:%s,
ActNum:%d,
- StartDate:%s,
- EndtDate:%s,
- LimitLV:%d,
- ResetType:%d,
- MoneyType:%d,
- MoneyValue:%d,
LayerNum:%d,
+ LotteryScore:%d,
AwardItemCount:%d,
AwardItemList:%s,
SuperItemCount:%d,
@@ -38600,13 +38834,8 @@
%(
self.Head.OutputString(),
self.ActNum,
- self.StartDate,
- self.EndtDate,
- self.LimitLV,
- self.ResetType,
- self.MoneyType,
- self.MoneyValue,
self.LayerNum,
+ self.LotteryScore,
self.AwardItemCount,
"...",
self.SuperItemCount,
@@ -38616,8 +38845,8 @@
return DumpString
-m_NAtagMCActXianXiaMJInfo=tagMCActXianXiaMJInfo()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCActXianXiaMJInfo.Head.Cmd,m_NAtagMCActXianXiaMJInfo.Head.SubCmd))] = m_NAtagMCActXianXiaMJInfo
+m_NAtagMCActXianXiaMJLayerInfo=tagMCActXianXiaMJLayerInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCActXianXiaMJLayerInfo.Head.Cmd,m_NAtagMCActXianXiaMJLayerInfo.Head.SubCmd))] = m_NAtagMCActXianXiaMJLayerInfo
#------------------------------------------------------
@@ -39825,6 +40054,238 @@
#------------------------------------------------------
+# AA 80 仙匣秘境跨服活动信息 #tagMCCrossActXianXiaMJInfo
+
+class tagMCCrossActXianXiaMJItem(Structure):
+ _pack_ = 1
+ _fields_ = [
+ ("ItemID", c_int),
+ ("ItemCount", c_ushort),
+ ("IsBind", c_ubyte),
+ ]
+
+ def __init__(self):
+ self.Clear()
+ 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.ItemID = 0
+ self.ItemCount = 0
+ self.IsBind = 0
+ return
+
+ def GetLength(self):
+ return sizeof(tagMCCrossActXianXiaMJItem)
+
+ def GetBuffer(self):
+ return string_at(addressof(self), self.GetLength())
+
+ def OutputString(self):
+ DumpString = '''// AA 80 仙匣秘境跨服活动信息 //tagMCCrossActXianXiaMJInfo:
+ ItemID:%d,
+ ItemCount:%d,
+ IsBind:%d
+ '''\
+ %(
+ self.ItemID,
+ self.ItemCount,
+ self.IsBind
+ )
+ return DumpString
+
+
+class tagMCCrossActXianXiaMJBillard(Structure):
+ Rank = 0 #(DWORD Rank)// 名次,1-代表第一名;支持夸段,如1,3 代表第1名,第2~3名
+ Count = 0 #(BYTE Count)// 奖励物品数
+ AwardItemList = list() #(vector<tagMCCrossActXianXiaMJItem> AwardItemList)// 奖励物品列表
+ data = None
+
+ def __init__(self):
+ self.Clear()
+ return
+
+ def ReadData(self, _lpData, _pos=0, _Len=0):
+ self.Clear()
+ self.Rank,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+ self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+ for i in range(self.Count):
+ temAwardItemList = tagMCCrossActXianXiaMJItem()
+ _pos = temAwardItemList.ReadData(_lpData, _pos)
+ self.AwardItemList.append(temAwardItemList)
+ return _pos
+
+ def Clear(self):
+ self.Rank = 0
+ self.Count = 0
+ self.AwardItemList = list()
+ return
+
+ def GetLength(self):
+ length = 0
+ length += 4
+ length += 1
+ for i in range(self.Count):
+ length += self.AwardItemList[i].GetLength()
+
+ return length
+
+ def GetBuffer(self):
+ data = ''
+ data = CommFunc.WriteDWORD(data, self.Rank)
+ data = CommFunc.WriteBYTE(data, self.Count)
+ for i in range(self.Count):
+ data = CommFunc.WriteString(data, self.AwardItemList[i].GetLength(), self.AwardItemList[i].GetBuffer())
+ return data
+
+ def OutputString(self):
+ DumpString = '''
+ Rank:%d,
+ Count:%d,
+ AwardItemList:%s
+ '''\
+ %(
+ self.Rank,
+ self.Count,
+ "..."
+ )
+ return DumpString
+
+
+class tagMCCrossActXianXiaMJInfo(Structure):
+ Head = tagHead()
+ ServerInfoLen = 0 #(BYTE ServerInfoLen)
+ ServerIDRangeInfo = "" #(String ServerIDRangeInfo)//开放该活动的服务器ID范围列表,json格式 [[IDA, IDB], ...], [] 为全服
+ GroupValue1 = 0 #(BYTE GroupValue1)// 活动榜单分组值1,用于查询对应榜单
+ StartDate = "" #(char StartDate[10])// 开始日期 y-m-d
+ EndtDate = "" #(char EndtDate[10])// 结束日期 y-m-d
+ JoinStartTime = "" #(char JoinStartTime[5])// 参与开始时间点 mm:ss
+ JoinEndTime = "" #(char JoinEndTime[5])// 参与结束时间点 mm:ss
+ IsDayReset = 0 #(BYTE IsDayReset)// 是否每天重置
+ RankLimitPersonal = 0 #(WORD RankLimitPersonal)// 个人榜上榜积分保底限制;
+ PersonalBillCount = 0 #(BYTE PersonalBillCount)
+ PersonalBillboardInfoList = list() #(vector<tagMCCrossActXianXiaMJBillard> PersonalBillboardInfoList)// 个人榜单奖励信息列表,如果没有代表本次活动没有该榜奖励
+ data = None
+
+ def __init__(self):
+ self.Clear()
+ self.Head.Cmd = 0xAA
+ self.Head.SubCmd = 0x80
+ return
+
+ def ReadData(self, _lpData, _pos=0, _Len=0):
+ self.Clear()
+ _pos = self.Head.ReadData(_lpData, _pos)
+ self.ServerInfoLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+ self.ServerIDRangeInfo,_pos = CommFunc.ReadString(_lpData, _pos,self.ServerInfoLen)
+ self.GroupValue1,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+ self.StartDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
+ self.EndtDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
+ self.JoinStartTime,_pos = CommFunc.ReadString(_lpData, _pos,5)
+ self.JoinEndTime,_pos = CommFunc.ReadString(_lpData, _pos,5)
+ self.IsDayReset,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+ self.RankLimitPersonal,_pos = CommFunc.ReadWORD(_lpData, _pos)
+ self.PersonalBillCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+ for i in range(self.PersonalBillCount):
+ temPersonalBillboardInfoList = tagMCCrossActXianXiaMJBillard()
+ _pos = temPersonalBillboardInfoList.ReadData(_lpData, _pos)
+ self.PersonalBillboardInfoList.append(temPersonalBillboardInfoList)
+ return _pos
+
+ def Clear(self):
+ self.Head = tagHead()
+ self.Head.Clear()
+ self.Head.Cmd = 0xAA
+ self.Head.SubCmd = 0x80
+ self.ServerInfoLen = 0
+ self.ServerIDRangeInfo = ""
+ self.GroupValue1 = 0
+ self.StartDate = ""
+ self.EndtDate = ""
+ self.JoinStartTime = ""
+ self.JoinEndTime = ""
+ self.IsDayReset = 0
+ self.RankLimitPersonal = 0
+ self.PersonalBillCount = 0
+ self.PersonalBillboardInfoList = list()
+ return
+
+ def GetLength(self):
+ length = 0
+ length += self.Head.GetLength()
+ length += 1
+ length += len(self.ServerIDRangeInfo)
+ length += 1
+ length += 10
+ length += 10
+ length += 5
+ length += 5
+ length += 1
+ length += 2
+ length += 1
+ for i in range(self.PersonalBillCount):
+ length += self.PersonalBillboardInfoList[i].GetLength()
+
+ return length
+
+ def GetBuffer(self):
+ data = ''
+ data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+ data = CommFunc.WriteBYTE(data, self.ServerInfoLen)
+ data = CommFunc.WriteString(data, self.ServerInfoLen, self.ServerIDRangeInfo)
+ data = CommFunc.WriteBYTE(data, self.GroupValue1)
+ data = CommFunc.WriteString(data, 10, self.StartDate)
+ data = CommFunc.WriteString(data, 10, self.EndtDate)
+ data = CommFunc.WriteString(data, 5, self.JoinStartTime)
+ data = CommFunc.WriteString(data, 5, self.JoinEndTime)
+ data = CommFunc.WriteBYTE(data, self.IsDayReset)
+ data = CommFunc.WriteWORD(data, self.RankLimitPersonal)
+ data = CommFunc.WriteBYTE(data, self.PersonalBillCount)
+ for i in range(self.PersonalBillCount):
+ data = CommFunc.WriteString(data, self.PersonalBillboardInfoList[i].GetLength(), self.PersonalBillboardInfoList[i].GetBuffer())
+ return data
+
+ def OutputString(self):
+ DumpString = '''
+ Head:%s,
+ ServerInfoLen:%d,
+ ServerIDRangeInfo:%s,
+ GroupValue1:%d,
+ StartDate:%s,
+ EndtDate:%s,
+ JoinStartTime:%s,
+ JoinEndTime:%s,
+ IsDayReset:%d,
+ RankLimitPersonal:%d,
+ PersonalBillCount:%d,
+ PersonalBillboardInfoList:%s
+ '''\
+ %(
+ self.Head.OutputString(),
+ self.ServerInfoLen,
+ self.ServerIDRangeInfo,
+ self.GroupValue1,
+ self.StartDate,
+ self.EndtDate,
+ self.JoinStartTime,
+ self.JoinEndTime,
+ self.IsDayReset,
+ self.RankLimitPersonal,
+ self.PersonalBillCount,
+ "..."
+ )
+ return DumpString
+
+
+m_NAtagMCCrossActXianXiaMJInfo=tagMCCrossActXianXiaMJInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCCrossActXianXiaMJInfo.Head.Cmd,m_NAtagMCCrossActXianXiaMJInfo.Head.SubCmd))] = m_NAtagMCCrossActXianXiaMJInfo
+
+
+#------------------------------------------------------
# AA 25 每日礼包活动信息 #tagMCDailyGiftbagInfo
class tagMCDailyGiftbagItem(Structure):
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossActionControl.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossActionControl.py
index b6912a2..c15a5ac 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossActionControl.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossActionControl.py
@@ -23,6 +23,7 @@
import IpyGameDataPY
import CrossActCTGBillboard
import PlayerActBossTrial
+import PlayerActXianXiaMJ
import CrossRealmMsg
import PyGameData
import PlayerFB
@@ -622,8 +623,11 @@
if actName == ShareDefine.CrossActName_CTGBillboard:
CrossActCTGBillboard.OnActIDChange(cfgID, dbTemplateID, state)
- if actName == ShareDefine.CrossActName_BossTrial:
+ elif actName == ShareDefine.CrossActName_BossTrial:
PlayerActBossTrial.OnCrossActIDChange(cfgID, zoneID, ipyData, state)
+
+ elif actName == ShareDefine.CrossActName_XianXiaMJ:
+ PlayerActXianXiaMJ.OnCrossActIDChange(cfgID, zoneID, ipyData, state)
else:
actChangeList.append([actName, ipyData, state, cfgID, groupName, zoneID, dbActID, actID, forceReset, dbTemplateID])
@@ -649,6 +653,9 @@
if actName == ShareDefine.CrossActName_BossTrial:
PlayerActBossTrial.OnCrossActJoinEnd(cfgID, zoneID, ipyData)
+ elif actName == ShareDefine.CrossActName_XianXiaMJ:
+ PlayerActXianXiaMJ.OnCrossActJoinEnd(cfgID, zoneID, ipyData)
+
GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_CrossActInfo % actName, crossActInfoDict[actName])
# 非活动中的处理完关闭后,最后删除
if not state and isEnd:
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmMsg.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmMsg.py
index 5bfa98b..4d3f15d 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmMsg.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmMsg.py
@@ -24,6 +24,7 @@
import CrossRealmPlayer
import PlayerCompensation
import PlayerActBossTrial
+import PlayerActXianXiaMJ
import CrossActionControl
import CrossActAllRecharge
import CrossFamilyFlagwar
@@ -173,6 +174,9 @@
elif msgType == ShareDefine.ClientServerMsg_BossTrialSubmit:
PlayerActBossTrial.ClientServerMsg_BossTrialSubmit(serverGroupID, msgData)
+ elif msgType == ShareDefine.ClientServerMsg_XianXiaMJScore:
+ PlayerActXianXiaMJ.ClientServerMsg_XianXiaMJScore(serverGroupID, msgData)
+
# 需要发送到地图服务器处理的
elif msgType in [ShareDefine.ClientServerMsg_Reborn, ShareDefine.ClientServerMsg_CollectNPC]:
MapServer_CrossServerReceiveMsg(msgType, msgData, serverGroupID)
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py
index c89e50d..224a624 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py
@@ -36,6 +36,7 @@
import PlayerActFamilyCTGAssist
import PlayerActGarbageSorting
import PlayerActBossTrial
+import PlayerActXianXiaMJ
import PlayerUniversalGameRec
import GameWorldAverageLv
import PlayerFamilyBoss
@@ -820,6 +821,8 @@
if dbActID:
if actName == ShareDefine.OperationActionName_BossTrial:
PlayerActBossTrial.OnActEnd(actNum, ipyData, dayIndex)
+ elif actName == ShareDefine.OperationActionName_XianXiaMJ:
+ PlayerActXianXiaMJ.OnActEnd(actNum, ipyData, dayIndex)
if curActID:
if actName in ShareDefine.NeedWorldLVOperationActNameList:
@@ -850,6 +853,8 @@
PlayerActGarbageSorting.OnActStart(actNum)
elif actName == ShareDefine.OperationActionName_BossTrial:
PlayerActBossTrial.OnActStart(actNum)
+ elif actName == ShareDefine.OperationActionName_XianXiaMJ:
+ PlayerActXianXiaMJ.OnActStart(actNum)
elif actName == ShareDefine.OperationActionName_FamilyCTGAssist:
PlayerActFamilyCTGAssist.OnActStart(actNum)
else:
@@ -869,6 +874,8 @@
elif stateJoin == ShareDefine.ActStateJoin_End:
if actName == ShareDefine.OperationActionName_BossTrial:
PlayerActBossTrial.OnActJoinEnd(actNum, ipyData, dayIndex)
+ elif actName == ShareDefine.OperationActionName_XianXiaMJ:
+ PlayerActXianXiaMJ.OnActJoinEnd(actNum, ipyData, dayIndex)
if ipyData and actName in ShareDefine.NeedWorldLVOperationActNameList:
actWorldLV = PlayerDBGSEvent.GetDBGSTrig_ByKey(dbOperationActWorldLVKey)
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py b/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py
index f4768b7..3dee8283 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py
@@ -514,10 +514,30 @@
("BYTE", "ActNum", 0),
("char", "StartDate", 0),
("char", "EndDate", 0),
- ("dict", "NotifyInfoStart", 0),
- ("dict", "NotifyInfoEnd", 0),
- ("list", "NotifyInfoLoop", 0),
- ("BYTE", "ResetType", 0),
+ ("char", "JoinStartTime", 0),
+ ("char", "JoinEndTime", 0),
+ ("BYTE", "IsDayReset", 0),
+ ("WORD", "PersonalTemplateID", 0),
+ ),
+
+ "CrossActXianXiaMJ":(
+ ("DWORD", "CfgID", 1),
+ ("char", "ActGroupName", 0),
+ ("BYTE", "ZoneID", 0),
+ ("list", "ServerIDRangeList", 0),
+ ("char", "StartDate", 0),
+ ("char", "EndDate", 0),
+ ("char", "JoinStartTime", 0),
+ ("char", "JoinEndTime", 0),
+ ("BYTE", "IsDayReset", 0),
+ ("WORD", "RankLimitPersonal", 0),
+ ("WORD", "PersonalTemplateID", 0),
+ ),
+
+ "ActXianXiaMJBillTemp":(
+ ("DWORD", "TemplateID", 1),
+ ("BYTE", "Rank", 0),
+ ("list", "AwardItemList", 0),
),
"ActGodGift":(
@@ -1764,10 +1784,40 @@
def GetActNum(self): return self.attrTuple[3] # 活动分组编号, 活动类型 * 10 + 不同界面编号 BYTE
def GetStartDate(self): return self.attrTuple[4] # 开启日期 char
def GetEndDate(self): return self.attrTuple[5] # 结束日期 char
- def GetNotifyInfoStart(self): return self.attrTuple[6] # 全服提示信息 - 相对开始时间 dict
- def GetNotifyInfoEnd(self): return self.attrTuple[7] # 全服提示信息 - 相对结束时间 dict
- def GetNotifyInfoLoop(self): return self.attrTuple[8] # 全服提示信息 - 循环广播[间隔分钟, 广播key] list
- def GetResetType(self): return self.attrTuple[9] # 重置类型,0-0点重置;1-5点重置 BYTE
+ def GetJoinStartTime(self): return self.attrTuple[6] # 参与开始时间点 char
+ def GetJoinEndTime(self): return self.attrTuple[7] # 参与结束时间点 char
+ def GetIsDayReset(self): return self.attrTuple[8] # 是否每天重置 BYTE
+ def GetPersonalTemplateID(self): return self.attrTuple[9] # 个人排行模板编号 WORD
+
+# 仙匣秘境活动跨服表
+class IPY_CrossActXianXiaMJ():
+
+ def __init__(self):
+ self.attrTuple = None
+ return
+
+ def GetCfgID(self): return self.attrTuple[0] # 配置ID DWORD
+ def GetActGroupName(self): return self.attrTuple[1] # 活动组名(同组活动的名字需相同) char
+ def GetZoneID(self): return self.attrTuple[2] # 组内分组编号 BYTE
+ def GetServerIDRangeList(self): return self.attrTuple[3] # 活动的账号服务器ID范围列表 [[serverIDA, serverIDB], ...] list
+ def GetStartDate(self): return self.attrTuple[4] # 开启日期 char
+ def GetEndDate(self): return self.attrTuple[5] # 结束日期 char
+ def GetJoinStartTime(self): return self.attrTuple[6] # 参与开始时间点 char
+ def GetJoinEndTime(self): return self.attrTuple[7] # 参与结束时间点 char
+ def GetIsDayReset(self): return self.attrTuple[8] # 是否每天重置 BYTE
+ def GetRankLimitPersonal(self): return self.attrTuple[9] # 个人上榜积分限制 WORD
+ def GetPersonalTemplateID(self): return self.attrTuple[10] # 个人排行模板编号 WORD
+
+# 仙匣秘境榜单模版表
+class IPY_ActXianXiaMJBillTemp():
+
+ def __init__(self):
+ self.attrTuple = None
+ return
+
+ def GetTemplateID(self): return self.attrTuple[0] # 模板编号 DWORD
+ def GetRank(self): return self.attrTuple[1] # 名次 BYTE
+ def GetAwardItemList(self): return self.attrTuple[2] # 奖励物品列表[[物品ID,个数,是否拍品], ...] list
# 天帝礼包活动时间表
class IPY_ActGodGift():
@@ -2650,6 +2700,8 @@
self.__LoadFileData("ActBossTrialTemplate", onlyCheck)
self.__LoadFileData("CrossActBossTrial", onlyCheck)
self.__LoadFileData("ActXianXiaMJ", onlyCheck)
+ self.__LoadFileData("CrossActXianXiaMJ", onlyCheck)
+ self.__LoadFileData("ActXianXiaMJBillTemp", onlyCheck)
self.__LoadFileData("ActGodGift", onlyCheck)
self.__LoadFileData("ActHorsePetFeast", onlyCheck)
self.__LoadFileData("ActBossReborn", onlyCheck)
@@ -3227,6 +3279,20 @@
self.CheckLoadData("ActXianXiaMJ")
return self.ipyActXianXiaMJCache[index]
+ def GetCrossActXianXiaMJCount(self):
+ self.CheckLoadData("CrossActXianXiaMJ")
+ return self.ipyCrossActXianXiaMJLen
+ def GetCrossActXianXiaMJByIndex(self, index):
+ self.CheckLoadData("CrossActXianXiaMJ")
+ return self.ipyCrossActXianXiaMJCache[index]
+
+ def GetActXianXiaMJBillTempCount(self):
+ self.CheckLoadData("ActXianXiaMJBillTemp")
+ return self.ipyActXianXiaMJBillTempLen
+ def GetActXianXiaMJBillTempByIndex(self, index):
+ self.CheckLoadData("ActXianXiaMJBillTemp")
+ return self.ipyActXianXiaMJBillTempCache[index]
+
def GetActGodGiftCount(self):
self.CheckLoadData("ActGodGift")
return self.ipyActGodGiftLen
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActBossTrial.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActBossTrial.py
index bd6ee23..d79e287 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActBossTrial.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActBossTrial.py
@@ -495,6 +495,7 @@
# 结算时排序并保存榜单数据流向
billboardObj.SortData()
+ billboardObj.SaveDRData()
GameWorld.Log("结算跨服Boss凭证个人排行奖励: billboardType=%s,zoneID=%s,cfgID=%s,templateID=%s,billboardDataCount=%s"
% (billboardType, zoneID, cfgID, templateID, billboardDataCount))
@@ -542,6 +543,7 @@
# 结算时排序并保存榜单数据流向
billboardObj.SortData()
+ billboardObj.SaveDRData()
GameWorld.Log("结算跨服Boss凭证仙盟排行奖励: billboardType=%s,zoneID=%s,cfgID=%s,templateID=%s,billboardDataCount=%s"
% (billboardType, zoneID, cfgID, templateID, billboardDataCount))
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActXianXiaMJ.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActXianXiaMJ.py
new file mode 100644
index 0000000..2bbfd3e
--- /dev/null
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActXianXiaMJ.py
@@ -0,0 +1,295 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package PlayerActXianXiaMJ
+#
+# @todo:仙匣秘境
+# @author hxp
+# @date 2024-07-18
+# @version 1.0
+#
+# 详细描述: 仙匣秘境
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2024-07-18 18:00"""
+#-------------------------------------------------------------------------------
+
+import ShareDefine
+import IpyGameDataPY
+import DataRecordPack
+import PlayerDBGSEvent
+import PlayerBillboard
+import PlayerCompensation
+import CrossActionControl
+import CrossBillboard
+import PyDataManager
+import CrossRealmMsg
+import GameWorld
+
+def OnActStart(actNum):
+ ## 活动开启
+ PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ActXianXiaMJAward % actNum, 0)
+ PlayerBillboard.ClearBillboardByIndex(ShareDefine.Def_BT_XianXiaMJScore)
+ return
+
+def OnActEnd(actNum, ipyData, dayIndex):
+ ## 活动结束
+ cfgID = ipyData.GetCfgID() if ipyData else 0
+ GameWorld.Log("=== 仙匣秘境活动结束! === actNum=%s,cfgID=%s,dayIndex=%s" % (actNum, cfgID, dayIndex))
+
+ __OnEndAward(actNum, ipyData, dayIndex) # 兼容活动没有配置参与时间段的在活动结束补触发结算奖励
+
+ DataRecordPack.DR_BillboardData(ShareDefine.Def_BT_XianXiaMJScore, "XianXiaMJ", {"actNum":actNum, "cfgID":cfgID, "dayIndex":dayIndex})
+ GameWorld.Log("=================================================================================")
+ return
+
+def OnActJoinEnd(actNum, ipyData, dayIndex):
+ ## 活动参与结束
+ __OnEndAward(actNum, ipyData, dayIndex)
+ return
+
+def __OnEndAward(actNum, ipyData, dayIndex):
+ ## 结算奖励
+ if not ipyData:
+ return
+ cfgID = ipyData.GetCfgID()
+ awardState = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ActXianXiaMJAward % actNum)
+ if awardState:
+ #已经结算过该活动
+ GameWorld.Log("仙匣秘境活动已经结算过奖励了! actNum=%s,cfgID=%s,dayIndex=%s" % (actNum, cfgID, dayIndex))
+ return
+ PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ActXianXiaMJAward % actNum, 1)
+
+ GameWorld.Log("=== 本服仙匣秘境活动发放榜单奖励! === actNum=%s,cfgID=%s,dayIndex=%s" % (actNum, cfgID, dayIndex))
+
+ __OnEndAward_Personal(ipyData.GetPersonalTemplateID(), ShareDefine.Def_BT_XianXiaMJScore)
+ GameWorld.Log("=================================================================================")
+ return
+
+def __OnEndAward_Personal(templateID, billboardType):
+ billBoard = GameWorld.GetBillboard().FindBillboard(billboardType)
+ if not billBoard:
+ return
+ if not templateID:
+ GameWorld.Log("本次活动没有个人榜奖励!")
+ return
+ tempIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActXianXiaMJBillTemp", templateID)
+ if not tempIpyDataList:
+ return
+
+ rankAwardDict = {}
+ for tempIpyData in tempIpyDataList:
+ rankAwardDict[tempIpyData.GetRank()] = tempIpyData.GetAwardItemList()
+
+ GameWorld.Log("结算个人榜单奖励: templateID=%s,rankAwardDict=%s" % (templateID, rankAwardDict))
+ billBoard.Sort()
+ for index in xrange(billBoard.GetCount()):
+ billBoardData = billBoard.At(index)
+ if not billBoardData:
+ continue
+
+ rank = index + 1
+
+ awardItemList = GameWorld.GetOrderValueByDict(rankAwardDict, rank, False)
+ if not awardItemList:
+ break
+
+ playerID = billBoardData.GetID()
+ name2 = billBoardData.GetName2()
+ cmpValue = billBoardData.GetCmpValue()
+
+ GameWorld.Log(" 发放仙匣秘境个人榜单奖励: rank=%s,playerID=%s,cmpValue=%s,awardItemList=%s, %s"
+ % (rank, playerID, cmpValue, awardItemList, name2))
+
+ PlayerCompensation.SendMailByKey("XianXiaMJPlayer", [playerID], awardItemList, [rank])
+
+ return
+
+def MapServer_XianXiaMJ(curPlayer, msgList):
+ mapID = curPlayer.GetRealMapID()
+ playerID = curPlayer.GetPlayerID()
+ GameWorld.DebugLog("MapServer_XianXiaMJ mapID=%s,msgList=%s" % (mapID, msgList), playerID)
+ if not msgList:
+ return
+
+ msgType, dataMsg = msgList
+ ret = None
+
+ if msgType == "AddLotteryScore":
+ ret = __OnAddLotteryScore(curPlayer, dataMsg)
+
+ if ret == None:
+ return
+ return msgList + (ret if isinstance(ret, list) else [ret])
+
+def __OnAddLotteryScore(curPlayer, dataMsg):
+ ## 地图增加积分
+ playerID = curPlayer.GetPlayerID()
+ accID = curPlayer.GetAccID()
+ playerName = curPlayer.GetName()
+ job = curPlayer.GetJob()
+ realmLV = curPlayer.GetOfficialRank()
+ _, updLotteryScore = dataMsg
+
+ #同步跨服
+ playerInfo = {"playerID":playerID, "playerName":playerName, "accID":accID, "job":job, "realmLV":realmLV,
+ "playerLotteryScore":updLotteryScore}
+ SyncXianXiaMJToCrossServer(curPlayer, playerInfo)
+ return
+
+def SyncXianXiaMJToCrossServer(curPlayer, playerInfo):
+ ## 同步到跨服服务器
+ actInfo = CrossActionControl.GetPlayerCrossActInfo(curPlayer, ShareDefine.CrossActName_XianXiaMJ)
+ if not actInfo.get(ShareDefine.ActKey_State):
+ return
+ cfgID = actInfo.get(ShareDefine.ActKey_CfgID)
+ ipyDataDict = actInfo.get(ShareDefine.ActKey_IpyDataInfo, {})
+ if not ipyDataDict:
+ return
+ zoneID = ipyDataDict.get("ZoneID")
+ if not cfgID or not zoneID:
+ return
+
+ dataMsg = {"cfgID":cfgID, "zoneID":zoneID, "playerInfo":playerInfo}
+ CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_XianXiaMJScore, dataMsg)
+ return
+
+##------------------------------------------ 跨服仙匣秘境活动 ---------------------------------------
+def ClientServerMsg_XianXiaMJScore(serverGroupID, msgData):
+ ## 收到子服 - 同步积分
+
+ cfgID = msgData["cfgID"]
+ zoneID = msgData["zoneID"]
+ playerInfo = msgData["playerInfo"]
+
+ actInfo = CrossActionControl.GetCrossActInfoByCfgID(ShareDefine.CrossActName_XianXiaMJ, cfgID, zoneID)
+ if not actInfo or not actInfo[ShareDefine.ActKey_State]:
+ GameWorld.ErrLog("跨服仙匣秘境非活动中,无法提交! cfgID=%s, zoneID=%s" % (cfgID, zoneID))
+ return
+ if actInfo[ShareDefine.ActKey_StateJoin] != ShareDefine.ActStateJoin_Start:
+ GameWorld.ErrLog("跨服仙匣秘境非可参与状态,无法提交! cfgID=%s, zoneID=%s" % (cfgID, zoneID))
+ return
+ ipyData = IpyGameDataPY.GetIpyGameData("CrossActXianXiaMJ", cfgID)
+ if not ipyData:
+ return
+ personlLimit = ipyData.GetRankLimitPersonal()
+
+ playerID = playerInfo["playerID"]
+ playerName = playerInfo["playerName"]
+ job = playerInfo["job"]
+ accID = playerInfo["accID"]
+ realmLV = playerInfo["realmLV"]
+ playerLotteryScore = playerInfo["playerLotteryScore"]
+
+ groupValue1 = zoneID
+
+ if playerLotteryScore >= personlLimit:
+ name2, type2, value1, value2 = accID, job, realmLV, 0
+ CrossBillboard.UpdCrossBillboard(ShareDefine.Def_CBT_XianXiaMJScore, groupValue1, playerID, playerName,
+ name2, type2, value1, value2, playerLotteryScore)
+ return
+
+def OnCrossActIDChange(cfgID, zoneID, ipyData, state):
+ ## 跨服活动ID变更
+ if state:
+ OnCrossActStart(cfgID, zoneID, ipyData)
+ else:
+ OnCrossActEnd(cfgID, zoneID, ipyData)
+ return
+
+def OnCrossActStart(cfgID, zoneID, ipyData):
+ ## 跨服活动开启
+
+ PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ActXianXiaMJAwardC % zoneID, 0)
+
+ groupValue1 = zoneID
+ billboardMgr = PyDataManager.GetCrossBillboardManager()
+ billboardObj = billboardMgr.GetCrossBillboard(ShareDefine.Def_CBT_XianXiaMJScore, groupValue1)
+ billboardObj.ClearData() # 新活动重置榜单数据
+ return
+
+def OnCrossActEnd(cfgID, zoneID, ipyData):
+ ## 跨服活动结束
+
+ groupValue1 = zoneID
+ GameWorld.Log("=== 跨服仙匣秘境活动结束! === cfgID=%s,zoneID=%s" % (cfgID, zoneID))
+ __OnCrossEndAward(cfgID, zoneID, ipyData)
+
+ # 备份、清除榜单数据
+ billboardMgr = PyDataManager.GetCrossBillboardManager()
+ billboardObj = billboardMgr.GetCrossBillboard(ShareDefine.Def_CBT_XianXiaMJScore, groupValue1)
+ billboardObj.ClearData()
+
+ GameWorld.Log("=================================================================================")
+ return
+
+def OnCrossActJoinEnd(cfgID, zoneID, ipyData):
+ ## 跨服活动参与结束
+ __OnCrossEndAward(cfgID, zoneID, ipyData)
+ return
+
+def __OnCrossEndAward(cfgID, zoneID, ipyData):
+ ## 结算跨服奖励
+ awardState = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ActXianXiaMJAwardC % zoneID)
+ if awardState:
+ #已经结算过该活动
+ GameWorld.Log("跨服仙匣秘境活动已经结算过奖励了! cfgID=%s,zoneID=%s" % (cfgID, zoneID))
+ return
+ PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ActXianXiaMJAwardC % zoneID, 1)
+
+ GameWorld.Log("=== 跨服仙匣秘境活动发放榜单奖励! === cfgID=%s,zoneID=%s" % (cfgID, zoneID))
+
+ PersonalTemplateID = ipyData.GetPersonalTemplateID()
+
+ __GiveCrossOrderAwardPersonal(cfgID, zoneID, PersonalTemplateID, ShareDefine.Def_CBT_XianXiaMJScore)
+ GameWorld.Log("=================================================================================")
+ return
+
+def __GiveCrossOrderAwardPersonal(cfgID, zoneID, templateID, billboardType):
+
+ groupValue1 = zoneID
+ billboardMgr = PyDataManager.GetCrossBillboardManager()
+ billboardObj = billboardMgr.GetCrossBillboard(billboardType, groupValue1)
+ billboardDataCount = billboardObj.GetCount()
+ if not billboardDataCount:
+ GameWorld.Log("跨服仙匣秘境个人排行数据为空! billboardType=%s,zoneID=%s,cfgID=%s,templateID=%s" % (billboardType, zoneID, cfgID, templateID))
+ return
+
+ # 结算时排序并保存榜单数据流向
+ billboardObj.SortData()
+ billboardObj.SaveDRData()
+
+ GameWorld.Log("结算跨服仙匣秘境个人排行奖励: billboardType=%s,zoneID=%s,cfgID=%s,templateID=%s,billboardDataCount=%s"
+ % (billboardType, zoneID, cfgID, templateID, billboardDataCount))
+
+ orderIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActXianXiaMJBillTemp", templateID)
+ if orderIpyDataList:
+ rankPre = 0
+ billboardIndex = 0
+ for ipyData in orderIpyDataList:
+ rank = ipyData.GetRank()
+ awardItemList = ipyData.GetAwardItemList()
+ orderCountTotal = rank - rankPre # 奖励名次数量
+ rankPre = rank
+ orderCount = 0
+
+ for index in xrange(billboardIndex, billboardDataCount):
+ if orderCount >= orderCountTotal:
+ break
+
+ billboardData = billboardObj.At(index)
+ playerID = billboardData.ID
+ name2 = billboardData.Name2
+ cmpValue = billboardData.CmpValue
+
+ playerRank = index + 1
+ GameWorld.Log(" 发放仙匣秘境个人榜单奖励: rank=%s,playerID=%s,cmpValue=%s,awardItemList=%s, %s"
+ % (rank, playerID, cmpValue, awardItemList, name2))
+ PlayerCompensation.SendMailByKey("XianXiaMJCrossPlayer", [playerID], awardItemList, [playerRank], crossMail=True)
+
+ orderCount += 1
+ billboardIndex += 1
+
+ return
+
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerDBGSEvent.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerDBGSEvent.py
index 62f2e42..ff108a1 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerDBGSEvent.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerDBGSEvent.py
@@ -178,6 +178,10 @@
Def_ActBossTrialAward = "ActBossTrialAward_%s"
#跨服boss历练结算状态,参数(zoneID)
Def_ActBossTrialAwardC = "ActBossTrialAwardC_%s"
+#仙匣秘境结算状态,参数(actNum),跨服活动参数(zoneID)
+Def_ActXianXiaMJAward = "ActXianXiaMJAward_%s"
+#跨服仙匣秘境结算状态,参数(zoneID)
+Def_ActXianXiaMJAwardC = "ActXianXiaMJAwardC_%s"
def SetInitOpenServerTime(initTime):
openDatetime = GameWorld.ChangeTimeNumToDatetime(initTime)
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py
index 2c85108..f42611d 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py
@@ -76,6 +76,7 @@
import CrossBattlefield
import CrossFamilyFlagwar
import CrossActAllRecharge
+import PlayerActXianXiaMJ
import PlayerActBossTrial
import PlayerActFamilyCTGAssist
import ChPyNetSendPack
@@ -703,6 +704,14 @@
PlayerActBossTrial.MapServer_BossTrial(curPlayer, eval(resultName))
return
+ # 仙匣秘境
+ if callName == "XianXiaMJ":
+ curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(srcPlayerID)
+ if not curPlayer:
+ return
+ PlayerActXianXiaMJ.MapServer_XianXiaMJ(curPlayer, eval(resultName))
+ return
+
#py喇叭聊天
if callName == 'PYSpeaker':
curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(srcPlayerID)
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
index d48a9f1..67fab70 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
@@ -346,9 +346,10 @@
CrossActName_AllRecharge = "CrossActAllRecharge" # 全民充值
CrossActName_LuckyCloudBuy = "CrossActLuckyCloudBuy" # 幸运云购
CrossActName_BossTrial = "CrossActBossTrial" # Boss历练 - 跨服
+CrossActName_XianXiaMJ = "CrossActXianXiaMJ" # 仙匣秘境 - 跨服
#跨服运营活动列表
-CrossActNameList = [CrossActName_CTGBillboard, CrossActName_AllRecharge, CrossActName_LuckyCloudBuy, CrossActName_BossTrial]
+CrossActNameList = [CrossActName_CTGBillboard, CrossActName_AllRecharge, CrossActName_LuckyCloudBuy, CrossActName_BossTrial, CrossActName_XianXiaMJ]
#需要锁定活动分区分配直到活动结束的跨服运营活动,即使热更分区配置,也不会改变正在活动中的分区设定,直到活动结束
CrossActLockServerGroupIDList = [CrossActName_CTGBillboard, CrossActName_AllRecharge]
@@ -820,9 +821,10 @@
Def_BT_BossTrialSubmitBak, #提交boss凭证榜 (boss历练活动 - 上一期) 35
Def_BT_BossTrialSubmitFamily, #提交boss凭证仙盟榜 (boss历练活动)
Def_BT_BossTrialSubmitFamilyBak, #提交boss凭证仙盟榜 (boss历练活动 - 上一期)
+ Def_BT_XianXiaMJScore, #仙匣秘境积分榜 (仙匣秘境活动)
Def_BT_Max, #排行榜最大类型
-) = range(0, 37 + 2)
+) = range(0, 38 + 2)
''' 跨服排行榜类型, 从 150 开始
与本服榜单存储的是不一样的数据库表格,理论上类型可以和本服榜单类型重复,为了做下区分防误导,跨服榜单从 150 开始
@@ -842,12 +844,14 @@
Def_CBT_BossTrialSubmitBak, # boss凭证 - 个人榜 上一期 159
Def_CBT_BossTrialSubmitFamily, # boss凭证 - 仙盟榜 160
Def_CBT_BossTrialSubmitFamilyBak, # boss凭证 - 仙盟榜 上一期 161
-) = range(150, 161 + 1)
+Def_CBT_XianXiaMJScore, # 仙匣秘境积分 - 个人榜 162
+) = range(150, 162 + 1)
# 跨服榜单最大数据名次,没有设置的默认100
CrossBillboard_MaxDataCount = {
Def_CBT_BossTrialSubmit:1000,
Def_CBT_BossTrialSubmitBak:1000,
+ Def_CBT_XianXiaMJScore:1000,
}
#职业对应战力排行榜类型
@@ -1608,6 +1612,7 @@
ClientServerMsg_ActAllRechargeValue = "ActAllRechargeValue" # 跨服全民充值额度
ClientServerMsg_CrossYaomoBossHurtAward = "CrossYaomoBossHurtAward" # 跨服妖魔boss玩家伤害领奖
ClientServerMsg_BossTrialSubmit = "BossTrialSubmit" # boss凭证提交
+ClientServerMsg_XianXiaMJScore = "XianXiaMJScore" # 仙匣秘境积分
#跨服广播类型定义
CrossNotify_CrossAct = "CrossAct"
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index 0588c7d..2f70399 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -4097,11 +4097,14 @@
Def_PDict_GarbageGJSeconds = "ActGSGJSeconds_%s" # 挂机未处理收益的秒数,参数(活动编号)
#仙匣秘境活动
+Def_PDict_CA_XianXiaMJID = "CA_XianXiaMJID" # 玩家身上的活动ID,唯一标识,取活动开始日期time值
Def_PDict_XianXiaMJID = "ActXXMJID_%s" # 玩家身上的活动ID,唯一标识,取活动开始日期time值,参数:(活动编号)
Def_PDict_XianXiaMJWorldLV = "ActXXMJWorldLV_%s" #玩家身上的活动世界等级,参数:(活动编号)
-Def_PDict_XianXiaMJAwardLayerInfo = "ActXXMJAwardLayerInfo_%s" # 奖池层级信息: 累计抽奖次数*100+层数,参数:(活动编号)
+Def_PDict_XianXiaMJLayerNum = "ActXianXiaMJLayerNum_%s" # 当前层数,参数:(活动编号)
+Def_PDict_XianXiaMJPlayCount = "ActXianXiaMJPlayCount_%s" # 当前层累计抽奖次数,参数:(活动编号)
Def_PDict_XianXiaMJAwardItemInfo = "ActXXMJItemInfo_%s_%s_%s" # 奖池物品ID*100+抽中位置编号,参数:(活动编号, 库类型, 物品编号)
Def_PDict_XianXiaMJAwardItemTimes = "ActXXMJItemTimes_%s_%s_%s" # 奖池物品累计产出次数,有限制次数的才记录,参数:(活动编号, 库类型, 物品ID)
+Def_PDict_XianXiaMJScore = "XianXiaMJScore_%s" # 抽奖积分,参数:(活动编号)
#天帝礼包活动
Def_PDict_GodGiftID = "ActGodGiftID_%s" # 玩家身上的活动ID,唯一标识,取活动开始日期time值,参数:(活动编号)
@@ -6103,7 +6106,9 @@
ActTaskType_Activity, # 累计获得活跃度 3
ActTaskType_CrossPenglaiBoss, # 击杀蓬莱boss 4
ActTaskType_CrossDemonLandBoss, # 击杀魔化之地boss 5
-) = range(1, 1 + 5)
+ActTaskType_XianXiaMJLottery, # 仙匣秘境寻宝x次 6
+ActTaskType_XianXiaMJLayer, # 仙匣秘境达到x层 7
+) = range(1, 1 + 7)
# 套装枚举,普通套装,强化套装
(EquipSuitType_Normal,
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
index b0e0ae9..5d17e1a 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -32670,6 +32670,7 @@
CTGIDList = list() #(vector<WORD> CTGIDList)// CTGID列表;总购买次数前端自己统计,直接取CTGID对应的累计购买次数累加
GiftCount = 0 #(BYTE GiftCount)
BuyCountGiftList = list() #(vector<tagMCActBuyCountGift> BuyCountGiftList)// 购买次数礼包列表
+ ShopType = 0 #(WORD ShopType)// 开放商店类型,可能为0不开放
data = None
def __init__(self):
@@ -32696,6 +32697,7 @@
temBuyCountGiftList = tagMCActBuyCountGift()
_pos = temBuyCountGiftList.ReadData(_lpData, _pos)
self.BuyCountGiftList.append(temBuyCountGiftList)
+ self.ShopType,_pos = CommFunc.ReadWORD(_lpData, _pos)
return _pos
def Clear(self):
@@ -32713,6 +32715,7 @@
self.CTGIDList = list()
self.GiftCount = 0
self.BuyCountGiftList = list()
+ self.ShopType = 0
return
def GetLength(self):
@@ -32729,6 +32732,7 @@
length += 1
for i in range(self.GiftCount):
length += self.BuyCountGiftList[i].GetLength()
+ length += 2
return length
@@ -32747,6 +32751,7 @@
data = CommFunc.WriteBYTE(data, self.GiftCount)
for i in range(self.GiftCount):
data = CommFunc.WriteString(data, self.BuyCountGiftList[i].GetLength(), self.BuyCountGiftList[i].GetBuffer())
+ data = CommFunc.WriteWORD(data, self.ShopType)
return data
def OutputString(self):
@@ -32761,7 +32766,8 @@
CTGIDCount:%d,
CTGIDList:%s,
GiftCount:%d,
- BuyCountGiftList:%s
+ BuyCountGiftList:%s,
+ ShopType:%d
'''\
%(
self.Head.OutputString(),
@@ -32774,7 +32780,8 @@
self.CTGIDCount,
"...",
self.GiftCount,
- "..."
+ "...",
+ self.ShopType
)
return DumpString
@@ -38352,6 +38359,7 @@
("ItemCount", c_ushort),
("PosNum", c_ubyte), # 被抽中时的位置编号,1~99,前端自定义展示位置编号,0代表未被抽中;
("TotalTimesNow", c_ubyte), #当前已产出次数,不限制次数时不记录,即同样为0
+ ("LotteryScore", c_int), #当前抽奖积分
]
def __init__(self):
@@ -38374,6 +38382,7 @@
self.ItemCount = 0
self.PosNum = 0
self.TotalTimesNow = 0
+ self.LotteryScore = 0
return
def GetLength(self):
@@ -38391,7 +38400,8 @@
ItemID:%d,
ItemCount:%d,
PosNum:%d,
- TotalTimesNow:%d
+ TotalTimesNow:%d,
+ LotteryScore:%d
'''\
%(
self.Cmd,
@@ -38401,7 +38411,8 @@
self.ItemID,
self.ItemCount,
self.PosNum,
- self.TotalTimesNow
+ self.TotalTimesNow,
+ self.LotteryScore
)
return DumpString
@@ -38413,7 +38424,260 @@
#------------------------------------------------------
# AA 58 仙匣秘境活动信息 #tagMCActXianXiaMJInfo
-class tagMCActXianXiaMJAwardItem(Structure):
+class tagMCActXianXiaMJItem(Structure):
+ _pack_ = 1
+ _fields_ = [
+ ("ItemID", c_int),
+ ("ItemCount", c_ushort),
+ ("IsBind", c_ubyte),
+ ]
+
+ def __init__(self):
+ self.Clear()
+ 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.ItemID = 0
+ self.ItemCount = 0
+ self.IsBind = 0
+ return
+
+ def GetLength(self):
+ return sizeof(tagMCActXianXiaMJItem)
+
+ def GetBuffer(self):
+ return string_at(addressof(self), self.GetLength())
+
+ def OutputString(self):
+ DumpString = '''// AA 58 仙匣秘境活动信息 //tagMCActXianXiaMJInfo:
+ ItemID:%d,
+ ItemCount:%d,
+ IsBind:%d
+ '''\
+ %(
+ self.ItemID,
+ self.ItemCount,
+ self.IsBind
+ )
+ return DumpString
+
+
+class tagMCActXianXiaMJBillard(Structure):
+ Rank = 0 #(DWORD Rank)// 名次,1-代表第一名;支持夸段,如1,3 代表第1名,第2~3名
+ Count = 0 #(BYTE Count)// 奖励物品数
+ AwardItemList = list() #(vector<tagMCActXianXiaMJItem> AwardItemList)// 奖励物品列表
+ data = None
+
+ def __init__(self):
+ self.Clear()
+ return
+
+ def ReadData(self, _lpData, _pos=0, _Len=0):
+ self.Clear()
+ self.Rank,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+ self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+ for i in range(self.Count):
+ temAwardItemList = tagMCActXianXiaMJItem()
+ _pos = temAwardItemList.ReadData(_lpData, _pos)
+ self.AwardItemList.append(temAwardItemList)
+ return _pos
+
+ def Clear(self):
+ self.Rank = 0
+ self.Count = 0
+ self.AwardItemList = list()
+ return
+
+ def GetLength(self):
+ length = 0
+ length += 4
+ length += 1
+ for i in range(self.Count):
+ length += self.AwardItemList[i].GetLength()
+
+ return length
+
+ def GetBuffer(self):
+ data = ''
+ data = CommFunc.WriteDWORD(data, self.Rank)
+ data = CommFunc.WriteBYTE(data, self.Count)
+ for i in range(self.Count):
+ data = CommFunc.WriteString(data, self.AwardItemList[i].GetLength(), self.AwardItemList[i].GetBuffer())
+ return data
+
+ def OutputString(self):
+ DumpString = '''
+ Rank:%d,
+ Count:%d,
+ AwardItemList:%s
+ '''\
+ %(
+ self.Rank,
+ self.Count,
+ "..."
+ )
+ return DumpString
+
+
+class tagMCActXianXiaMJInfo(Structure):
+ Head = tagHead()
+ ActNum = 0 #(BYTE ActNum)// 活动编号
+ StartDate = "" #(char StartDate[10])// 开始日期 y-m-d
+ EndtDate = "" #(char EndtDate[10])// 结束日期 y-m-d
+ JoinStartTime = "" #(char JoinStartTime[5])// 参与开始时间点 mm:ss
+ JoinEndTime = "" #(char JoinEndTime[5])// 参与结束时间点 mm:ss
+ IsDayReset = 0 #(BYTE IsDayReset)// 是否每天重置
+ LimitLV = 0 #(WORD LimitLV)// 限制等级
+ UseItemID = 0 #(DWORD UseItemID)//消耗物品ID,默认1个;消耗物品或货币二选一即可,或都配则先消耗道具,不足则消耗货币
+ MoneyType = 0 #(BYTE MoneyType)//消耗货币类型
+ MoneyValue = 0 #(WORD MoneyValue)//消耗货币值
+ LotteryAddScore = 0 #(WORD LotteryAddScore)//每次抽奖加积分
+ LayerAddScore = 0 #(WORD LayerAddScore)//每次跨层加积分
+ PersonalBillCount = 0 #(BYTE PersonalBillCount)
+ PersonalBillboardInfoList = list() #(vector<tagMCActXianXiaMJBillard> PersonalBillboardInfoList)// 个人榜单奖励信息列表,如果没有代表本次活动没有该榜奖励
+ data = None
+
+ def __init__(self):
+ self.Clear()
+ self.Head.Cmd = 0xAA
+ self.Head.SubCmd = 0x58
+ return
+
+ def ReadData(self, _lpData, _pos=0, _Len=0):
+ self.Clear()
+ _pos = self.Head.ReadData(_lpData, _pos)
+ self.ActNum,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+ self.StartDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
+ self.EndtDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
+ self.JoinStartTime,_pos = CommFunc.ReadString(_lpData, _pos,5)
+ self.JoinEndTime,_pos = CommFunc.ReadString(_lpData, _pos,5)
+ self.IsDayReset,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+ self.LimitLV,_pos = CommFunc.ReadWORD(_lpData, _pos)
+ self.UseItemID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+ self.MoneyType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+ self.MoneyValue,_pos = CommFunc.ReadWORD(_lpData, _pos)
+ self.LotteryAddScore,_pos = CommFunc.ReadWORD(_lpData, _pos)
+ self.LayerAddScore,_pos = CommFunc.ReadWORD(_lpData, _pos)
+ self.PersonalBillCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+ for i in range(self.PersonalBillCount):
+ temPersonalBillboardInfoList = tagMCActXianXiaMJBillard()
+ _pos = temPersonalBillboardInfoList.ReadData(_lpData, _pos)
+ self.PersonalBillboardInfoList.append(temPersonalBillboardInfoList)
+ return _pos
+
+ def Clear(self):
+ self.Head = tagHead()
+ self.Head.Clear()
+ self.Head.Cmd = 0xAA
+ self.Head.SubCmd = 0x58
+ self.ActNum = 0
+ self.StartDate = ""
+ self.EndtDate = ""
+ self.JoinStartTime = ""
+ self.JoinEndTime = ""
+ self.IsDayReset = 0
+ self.LimitLV = 0
+ self.UseItemID = 0
+ self.MoneyType = 0
+ self.MoneyValue = 0
+ self.LotteryAddScore = 0
+ self.LayerAddScore = 0
+ self.PersonalBillCount = 0
+ self.PersonalBillboardInfoList = list()
+ return
+
+ def GetLength(self):
+ length = 0
+ length += self.Head.GetLength()
+ length += 1
+ length += 10
+ length += 10
+ length += 5
+ length += 5
+ length += 1
+ length += 2
+ length += 4
+ length += 1
+ length += 2
+ length += 2
+ length += 2
+ length += 1
+ for i in range(self.PersonalBillCount):
+ length += self.PersonalBillboardInfoList[i].GetLength()
+
+ return length
+
+ def GetBuffer(self):
+ data = ''
+ data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+ data = CommFunc.WriteBYTE(data, self.ActNum)
+ data = CommFunc.WriteString(data, 10, self.StartDate)
+ data = CommFunc.WriteString(data, 10, self.EndtDate)
+ data = CommFunc.WriteString(data, 5, self.JoinStartTime)
+ data = CommFunc.WriteString(data, 5, self.JoinEndTime)
+ data = CommFunc.WriteBYTE(data, self.IsDayReset)
+ data = CommFunc.WriteWORD(data, self.LimitLV)
+ data = CommFunc.WriteDWORD(data, self.UseItemID)
+ data = CommFunc.WriteBYTE(data, self.MoneyType)
+ data = CommFunc.WriteWORD(data, self.MoneyValue)
+ data = CommFunc.WriteWORD(data, self.LotteryAddScore)
+ data = CommFunc.WriteWORD(data, self.LayerAddScore)
+ data = CommFunc.WriteBYTE(data, self.PersonalBillCount)
+ for i in range(self.PersonalBillCount):
+ data = CommFunc.WriteString(data, self.PersonalBillboardInfoList[i].GetLength(), self.PersonalBillboardInfoList[i].GetBuffer())
+ return data
+
+ def OutputString(self):
+ DumpString = '''
+ Head:%s,
+ ActNum:%d,
+ StartDate:%s,
+ EndtDate:%s,
+ JoinStartTime:%s,
+ JoinEndTime:%s,
+ IsDayReset:%d,
+ LimitLV:%d,
+ UseItemID:%d,
+ MoneyType:%d,
+ MoneyValue:%d,
+ LotteryAddScore:%d,
+ LayerAddScore:%d,
+ PersonalBillCount:%d,
+ PersonalBillboardInfoList:%s
+ '''\
+ %(
+ self.Head.OutputString(),
+ self.ActNum,
+ self.StartDate,
+ self.EndtDate,
+ self.JoinStartTime,
+ self.JoinEndTime,
+ self.IsDayReset,
+ self.LimitLV,
+ self.UseItemID,
+ self.MoneyType,
+ self.MoneyValue,
+ self.LotteryAddScore,
+ self.LayerAddScore,
+ self.PersonalBillCount,
+ "..."
+ )
+ return DumpString
+
+
+m_NAtagMCActXianXiaMJInfo=tagMCActXianXiaMJInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCActXianXiaMJInfo.Head.Cmd,m_NAtagMCActXianXiaMJInfo.Head.SubCmd))] = m_NAtagMCActXianXiaMJInfo
+
+
+#------------------------------------------------------
+# AA 79 仙匣秘境层信息 #tagMCActXianXiaMJLayerInfo
+
+class tagMCActXianXiaMJLayerItem(Structure):
_pack_ = 1
_fields_ = [
("ItemLibType", c_ubyte), #物品库类型;9-固定为大奖库,非9-策划自定义库
@@ -38445,13 +38709,13 @@
return
def GetLength(self):
- return sizeof(tagMCActXianXiaMJAwardItem)
+ return sizeof(tagMCActXianXiaMJLayerItem)
def GetBuffer(self):
return string_at(addressof(self), self.GetLength())
def OutputString(self):
- DumpString = '''// AA 58 仙匣秘境活动信息 //tagMCActXianXiaMJInfo:
+ DumpString = '''// AA 79 仙匣秘境层信息 //tagMCActXianXiaMJLayerInfo:
ItemLibType:%d,
ItemID:%d,
ItemCount:%d,
@@ -38472,48 +38736,38 @@
return DumpString
-class tagMCActXianXiaMJInfo(Structure):
+class tagMCActXianXiaMJLayerInfo(Structure):
Head = tagHead()
ActNum = 0 #(BYTE ActNum)// 活动编号
- StartDate = "" #(char StartDate[10])// 开始日期 y-m-d
- EndtDate = "" #(char EndtDate[10])// 结束日期 y-m-d
- LimitLV = 0 #(WORD LimitLV)// 限制等级
- ResetType = 0 #(BYTE ResetType)// 重置类型,0-0点重置;1-5点开,5点重置;2-5点开,0点重置
- MoneyType = 0 #(BYTE MoneyType)//消耗货币类型
- MoneyValue = 0 #(WORD MoneyValue)//消耗货币值
- LayerNum = 0 #(BYTE LayerNum)//当前奖池第几层
+ LayerNum = 0 #(WORD LayerNum)//当前奖池第几层
+ LotteryScore = 0 #(DWORD LotteryScore)//当前抽奖积分
AwardItemCount = 0 #(BYTE AwardItemCount)
- AwardItemList = list() #(vector<tagMCActXianXiaMJAwardItem> AwardItemList)// 奖池物品列表,已生成的,包含已选择的大奖物品
+ AwardItemList = list() #(vector<tagMCActXianXiaMJLayerItem> AwardItemList)// 奖池物品列表,已生成的,包含已选择的大奖物品
SuperItemCount = 0 #(BYTE SuperItemCount)
- SuperItemList = list() #(vector<tagMCActXianXiaMJAwardItem> SuperItemList)// 大奖物品待选择库,由玩家从库中选择放入奖池的物品;
+ SuperItemList = list() #(vector<tagMCActXianXiaMJLayerItem> SuperItemList)// 大奖物品待选择库,由玩家从库中选择放入奖池的物品;
SuperItemCanChooseCount = 0 #(BYTE SuperItemCanChooseCount)// 大奖物品可选择个数
data = None
def __init__(self):
self.Clear()
self.Head.Cmd = 0xAA
- self.Head.SubCmd = 0x58
+ self.Head.SubCmd = 0x79
return
def ReadData(self, _lpData, _pos=0, _Len=0):
self.Clear()
_pos = self.Head.ReadData(_lpData, _pos)
self.ActNum,_pos = CommFunc.ReadBYTE(_lpData, _pos)
- self.StartDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
- self.EndtDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
- self.LimitLV,_pos = CommFunc.ReadWORD(_lpData, _pos)
- self.ResetType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
- self.MoneyType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
- self.MoneyValue,_pos = CommFunc.ReadWORD(_lpData, _pos)
- self.LayerNum,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+ self.LayerNum,_pos = CommFunc.ReadWORD(_lpData, _pos)
+ self.LotteryScore,_pos = CommFunc.ReadDWORD(_lpData, _pos)
self.AwardItemCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
for i in range(self.AwardItemCount):
- temAwardItemList = tagMCActXianXiaMJAwardItem()
+ temAwardItemList = tagMCActXianXiaMJLayerItem()
_pos = temAwardItemList.ReadData(_lpData, _pos)
self.AwardItemList.append(temAwardItemList)
self.SuperItemCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
for i in range(self.SuperItemCount):
- temSuperItemList = tagMCActXianXiaMJAwardItem()
+ temSuperItemList = tagMCActXianXiaMJLayerItem()
_pos = temSuperItemList.ReadData(_lpData, _pos)
self.SuperItemList.append(temSuperItemList)
self.SuperItemCanChooseCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
@@ -38523,15 +38777,10 @@
self.Head = tagHead()
self.Head.Clear()
self.Head.Cmd = 0xAA
- self.Head.SubCmd = 0x58
+ self.Head.SubCmd = 0x79
self.ActNum = 0
- self.StartDate = ""
- self.EndtDate = ""
- self.LimitLV = 0
- self.ResetType = 0
- self.MoneyType = 0
- self.MoneyValue = 0
self.LayerNum = 0
+ self.LotteryScore = 0
self.AwardItemCount = 0
self.AwardItemList = list()
self.SuperItemCount = 0
@@ -38543,13 +38792,8 @@
length = 0
length += self.Head.GetLength()
length += 1
- length += 10
- length += 10
length += 2
- length += 1
- length += 1
- length += 2
- length += 1
+ length += 4
length += 1
for i in range(self.AwardItemCount):
length += self.AwardItemList[i].GetLength()
@@ -38564,13 +38808,8 @@
data = ''
data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
data = CommFunc.WriteBYTE(data, self.ActNum)
- data = CommFunc.WriteString(data, 10, self.StartDate)
- data = CommFunc.WriteString(data, 10, self.EndtDate)
- data = CommFunc.WriteWORD(data, self.LimitLV)
- data = CommFunc.WriteBYTE(data, self.ResetType)
- data = CommFunc.WriteBYTE(data, self.MoneyType)
- data = CommFunc.WriteWORD(data, self.MoneyValue)
- data = CommFunc.WriteBYTE(data, self.LayerNum)
+ data = CommFunc.WriteWORD(data, self.LayerNum)
+ data = CommFunc.WriteDWORD(data, self.LotteryScore)
data = CommFunc.WriteBYTE(data, self.AwardItemCount)
for i in range(self.AwardItemCount):
data = CommFunc.WriteString(data, self.AwardItemList[i].GetLength(), self.AwardItemList[i].GetBuffer())
@@ -38584,13 +38823,8 @@
DumpString = '''
Head:%s,
ActNum:%d,
- StartDate:%s,
- EndtDate:%s,
- LimitLV:%d,
- ResetType:%d,
- MoneyType:%d,
- MoneyValue:%d,
LayerNum:%d,
+ LotteryScore:%d,
AwardItemCount:%d,
AwardItemList:%s,
SuperItemCount:%d,
@@ -38600,13 +38834,8 @@
%(
self.Head.OutputString(),
self.ActNum,
- self.StartDate,
- self.EndtDate,
- self.LimitLV,
- self.ResetType,
- self.MoneyType,
- self.MoneyValue,
self.LayerNum,
+ self.LotteryScore,
self.AwardItemCount,
"...",
self.SuperItemCount,
@@ -38616,8 +38845,8 @@
return DumpString
-m_NAtagMCActXianXiaMJInfo=tagMCActXianXiaMJInfo()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCActXianXiaMJInfo.Head.Cmd,m_NAtagMCActXianXiaMJInfo.Head.SubCmd))] = m_NAtagMCActXianXiaMJInfo
+m_NAtagMCActXianXiaMJLayerInfo=tagMCActXianXiaMJLayerInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCActXianXiaMJLayerInfo.Head.Cmd,m_NAtagMCActXianXiaMJLayerInfo.Head.SubCmd))] = m_NAtagMCActXianXiaMJLayerInfo
#------------------------------------------------------
@@ -39825,6 +40054,238 @@
#------------------------------------------------------
+# AA 80 仙匣秘境跨服活动信息 #tagMCCrossActXianXiaMJInfo
+
+class tagMCCrossActXianXiaMJItem(Structure):
+ _pack_ = 1
+ _fields_ = [
+ ("ItemID", c_int),
+ ("ItemCount", c_ushort),
+ ("IsBind", c_ubyte),
+ ]
+
+ def __init__(self):
+ self.Clear()
+ 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.ItemID = 0
+ self.ItemCount = 0
+ self.IsBind = 0
+ return
+
+ def GetLength(self):
+ return sizeof(tagMCCrossActXianXiaMJItem)
+
+ def GetBuffer(self):
+ return string_at(addressof(self), self.GetLength())
+
+ def OutputString(self):
+ DumpString = '''// AA 80 仙匣秘境跨服活动信息 //tagMCCrossActXianXiaMJInfo:
+ ItemID:%d,
+ ItemCount:%d,
+ IsBind:%d
+ '''\
+ %(
+ self.ItemID,
+ self.ItemCount,
+ self.IsBind
+ )
+ return DumpString
+
+
+class tagMCCrossActXianXiaMJBillard(Structure):
+ Rank = 0 #(DWORD Rank)// 名次,1-代表第一名;支持夸段,如1,3 代表第1名,第2~3名
+ Count = 0 #(BYTE Count)// 奖励物品数
+ AwardItemList = list() #(vector<tagMCCrossActXianXiaMJItem> AwardItemList)// 奖励物品列表
+ data = None
+
+ def __init__(self):
+ self.Clear()
+ return
+
+ def ReadData(self, _lpData, _pos=0, _Len=0):
+ self.Clear()
+ self.Rank,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+ self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+ for i in range(self.Count):
+ temAwardItemList = tagMCCrossActXianXiaMJItem()
+ _pos = temAwardItemList.ReadData(_lpData, _pos)
+ self.AwardItemList.append(temAwardItemList)
+ return _pos
+
+ def Clear(self):
+ self.Rank = 0
+ self.Count = 0
+ self.AwardItemList = list()
+ return
+
+ def GetLength(self):
+ length = 0
+ length += 4
+ length += 1
+ for i in range(self.Count):
+ length += self.AwardItemList[i].GetLength()
+
+ return length
+
+ def GetBuffer(self):
+ data = ''
+ data = CommFunc.WriteDWORD(data, self.Rank)
+ data = CommFunc.WriteBYTE(data, self.Count)
+ for i in range(self.Count):
+ data = CommFunc.WriteString(data, self.AwardItemList[i].GetLength(), self.AwardItemList[i].GetBuffer())
+ return data
+
+ def OutputString(self):
+ DumpString = '''
+ Rank:%d,
+ Count:%d,
+ AwardItemList:%s
+ '''\
+ %(
+ self.Rank,
+ self.Count,
+ "..."
+ )
+ return DumpString
+
+
+class tagMCCrossActXianXiaMJInfo(Structure):
+ Head = tagHead()
+ ServerInfoLen = 0 #(BYTE ServerInfoLen)
+ ServerIDRangeInfo = "" #(String ServerIDRangeInfo)//开放该活动的服务器ID范围列表,json格式 [[IDA, IDB], ...], [] 为全服
+ GroupValue1 = 0 #(BYTE GroupValue1)// 活动榜单分组值1,用于查询对应榜单
+ StartDate = "" #(char StartDate[10])// 开始日期 y-m-d
+ EndtDate = "" #(char EndtDate[10])// 结束日期 y-m-d
+ JoinStartTime = "" #(char JoinStartTime[5])// 参与开始时间点 mm:ss
+ JoinEndTime = "" #(char JoinEndTime[5])// 参与结束时间点 mm:ss
+ IsDayReset = 0 #(BYTE IsDayReset)// 是否每天重置
+ RankLimitPersonal = 0 #(WORD RankLimitPersonal)// 个人榜上榜积分保底限制;
+ PersonalBillCount = 0 #(BYTE PersonalBillCount)
+ PersonalBillboardInfoList = list() #(vector<tagMCCrossActXianXiaMJBillard> PersonalBillboardInfoList)// 个人榜单奖励信息列表,如果没有代表本次活动没有该榜奖励
+ data = None
+
+ def __init__(self):
+ self.Clear()
+ self.Head.Cmd = 0xAA
+ self.Head.SubCmd = 0x80
+ return
+
+ def ReadData(self, _lpData, _pos=0, _Len=0):
+ self.Clear()
+ _pos = self.Head.ReadData(_lpData, _pos)
+ self.ServerInfoLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+ self.ServerIDRangeInfo,_pos = CommFunc.ReadString(_lpData, _pos,self.ServerInfoLen)
+ self.GroupValue1,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+ self.StartDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
+ self.EndtDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
+ self.JoinStartTime,_pos = CommFunc.ReadString(_lpData, _pos,5)
+ self.JoinEndTime,_pos = CommFunc.ReadString(_lpData, _pos,5)
+ self.IsDayReset,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+ self.RankLimitPersonal,_pos = CommFunc.ReadWORD(_lpData, _pos)
+ self.PersonalBillCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+ for i in range(self.PersonalBillCount):
+ temPersonalBillboardInfoList = tagMCCrossActXianXiaMJBillard()
+ _pos = temPersonalBillboardInfoList.ReadData(_lpData, _pos)
+ self.PersonalBillboardInfoList.append(temPersonalBillboardInfoList)
+ return _pos
+
+ def Clear(self):
+ self.Head = tagHead()
+ self.Head.Clear()
+ self.Head.Cmd = 0xAA
+ self.Head.SubCmd = 0x80
+ self.ServerInfoLen = 0
+ self.ServerIDRangeInfo = ""
+ self.GroupValue1 = 0
+ self.StartDate = ""
+ self.EndtDate = ""
+ self.JoinStartTime = ""
+ self.JoinEndTime = ""
+ self.IsDayReset = 0
+ self.RankLimitPersonal = 0
+ self.PersonalBillCount = 0
+ self.PersonalBillboardInfoList = list()
+ return
+
+ def GetLength(self):
+ length = 0
+ length += self.Head.GetLength()
+ length += 1
+ length += len(self.ServerIDRangeInfo)
+ length += 1
+ length += 10
+ length += 10
+ length += 5
+ length += 5
+ length += 1
+ length += 2
+ length += 1
+ for i in range(self.PersonalBillCount):
+ length += self.PersonalBillboardInfoList[i].GetLength()
+
+ return length
+
+ def GetBuffer(self):
+ data = ''
+ data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+ data = CommFunc.WriteBYTE(data, self.ServerInfoLen)
+ data = CommFunc.WriteString(data, self.ServerInfoLen, self.ServerIDRangeInfo)
+ data = CommFunc.WriteBYTE(data, self.GroupValue1)
+ data = CommFunc.WriteString(data, 10, self.StartDate)
+ data = CommFunc.WriteString(data, 10, self.EndtDate)
+ data = CommFunc.WriteString(data, 5, self.JoinStartTime)
+ data = CommFunc.WriteString(data, 5, self.JoinEndTime)
+ data = CommFunc.WriteBYTE(data, self.IsDayReset)
+ data = CommFunc.WriteWORD(data, self.RankLimitPersonal)
+ data = CommFunc.WriteBYTE(data, self.PersonalBillCount)
+ for i in range(self.PersonalBillCount):
+ data = CommFunc.WriteString(data, self.PersonalBillboardInfoList[i].GetLength(), self.PersonalBillboardInfoList[i].GetBuffer())
+ return data
+
+ def OutputString(self):
+ DumpString = '''
+ Head:%s,
+ ServerInfoLen:%d,
+ ServerIDRangeInfo:%s,
+ GroupValue1:%d,
+ StartDate:%s,
+ EndtDate:%s,
+ JoinStartTime:%s,
+ JoinEndTime:%s,
+ IsDayReset:%d,
+ RankLimitPersonal:%d,
+ PersonalBillCount:%d,
+ PersonalBillboardInfoList:%s
+ '''\
+ %(
+ self.Head.OutputString(),
+ self.ServerInfoLen,
+ self.ServerIDRangeInfo,
+ self.GroupValue1,
+ self.StartDate,
+ self.EndtDate,
+ self.JoinStartTime,
+ self.JoinEndTime,
+ self.IsDayReset,
+ self.RankLimitPersonal,
+ self.PersonalBillCount,
+ "..."
+ )
+ return DumpString
+
+
+m_NAtagMCCrossActXianXiaMJInfo=tagMCCrossActXianXiaMJInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCCrossActXianXiaMJInfo.Head.Cmd,m_NAtagMCCrossActXianXiaMJInfo.Head.SubCmd))] = m_NAtagMCCrossActXianXiaMJInfo
+
+
+#------------------------------------------------------
# AA 25 每日礼包活动信息 #tagMCDailyGiftbagInfo
class tagMCDailyGiftbagItem(Structure):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
index 2a3b3c0..76fbc2a 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -1508,17 +1508,29 @@
("DWORD", "CfgID", 1),
("char", "StartDate", 0),
("char", "EndDate", 0),
- ("BYTE", "ResetType", 0),
+ ("char", "JoinStartTime", 0),
+ ("char", "JoinEndTime", 0),
+ ("BYTE", "IsDayReset", 0),
("WORD", "LVLimit", 0),
+ ("DWORD", "UseItemID", 0),
("list", "UseMoneyInfo", 0),
("BYTE", "TemplateID", 0),
+ ("WORD", "PersonalTemplateID", 0),
+ ("WORD", "LotteryAddScore", 0),
+ ("WORD", "LayerAddScore", 0),
+ ),
+
+ "ActXianXiaMJBillTemp":(
+ ("DWORD", "TemplateID", 1),
+ ("BYTE", "Rank", 0),
+ ("list", "AwardItemList", 0),
),
"ActXianXiaMJAward":(
("DWORD", "TemplateID", 1),
("BYTE", "AwardLibType", 0),
- ("BYTE", "AwardItemCount", 0),
- ("BYTE", "UnlockAwardLimitTimes", 0),
+ ("list", "AwardItemCountList", 0),
+ ("list", "UnlockAwardLimitTimesList", 0),
("BYTE", "AwardLibWeight", 0),
("dict", "LibItemInfo", 0),
("dict", "ItemLayerLimitInfo", 0),
@@ -1952,6 +1964,8 @@
("BYTE", "ResetType", 0),
("list", "CTGIDList", 0),
("dict", "CTGCountAwardInfo", 0),
+ ("list", "CTGCountDayResetList", 0),
+ ("DWORD", "ActShopType", 0),
),
"ActTask":(
@@ -4552,10 +4566,27 @@
def GetCfgID(self): return self.attrTuple[0] # 配置ID DWORD
def GetStartDate(self): return self.attrTuple[1] # 开启日期 char
def GetEndDate(self): return self.attrTuple[2] # 结束日期 char
- def GetResetType(self): return self.attrTuple[3] # 重置类型,0-0点重置;1-5点重置 BYTE
- def GetLVLimit(self): return self.attrTuple[4] # 限制等级 WORD
- def GetUseMoneyInfo(self): return self.attrTuple[5] # 消耗货币信息 list
- def GetTemplateID(self): return self.attrTuple[6] # 模板ID BYTE
+ def GetJoinStartTime(self): return self.attrTuple[3] # 参与开始时间点 char
+ def GetJoinEndTime(self): return self.attrTuple[4] # 参与结束时间点 char
+ def GetIsDayReset(self): return self.attrTuple[5] # 是否每天重置 BYTE
+ def GetLVLimit(self): return self.attrTuple[6] # 限制等级 WORD
+ def GetUseItemID(self): return self.attrTuple[7] # 消耗物品ID DWORD
+ def GetUseMoneyInfo(self): return self.attrTuple[8] # 消耗货币信息 list
+ def GetTemplateID(self): return self.attrTuple[9] # 模板ID BYTE
+ def GetPersonalTemplateID(self): return self.attrTuple[10] # 个人排行模板编号 WORD
+ def GetLotteryAddScore(self): return self.attrTuple[11] # 每次抽奖加积分 WORD
+ def GetLayerAddScore(self): return self.attrTuple[12] # 每次跨层加积分 WORD
+
+# 仙匣秘境榜单模版表
+class IPY_ActXianXiaMJBillTemp():
+
+ def __init__(self):
+ self.attrTuple = None
+ return
+
+ def GetTemplateID(self): return self.attrTuple[0] # 模板编号 DWORD
+ def GetRank(self): return self.attrTuple[1] # 名次 BYTE
+ def GetAwardItemList(self): return self.attrTuple[2] # 奖励物品列表[[物品ID,个数,是否拍品], ...] list
# 仙匣秘境奖池表
class IPY_ActXianXiaMJAward():
@@ -4566,8 +4597,8 @@
def GetTemplateID(self): return self.attrTuple[0] # 奖池模板编号 DWORD
def GetAwardLibType(self): return self.attrTuple[1] # 奖励库类型 BYTE
- def GetAwardItemCount(self): return self.attrTuple[2] # 选择个数 BYTE
- def GetUnlockAwardLimitTimes(self): return self.attrTuple[3] # 抽X次后可产出(本层) BYTE
+ def GetAwardItemCountList(self): return self.attrTuple[2] # 层选择个数列表 层1物品数|层2|… list
+ def GetUnlockAwardLimitTimesList(self): return self.attrTuple[3] # 层抽X次后可产出(本层) 层1限制|层2|… list
def GetAwardLibWeight(self): return self.attrTuple[4] # 产出该库外权重 BYTE
def GetLibItemInfo(self): return self.attrTuple[5] # 本库物品随机库内权重(先随机库外权重,若产出再随机库内权重) dict
def GetItemLayerLimitInfo(self): return self.attrTuple[6] # 物品产出奖池层限制 {物品ID:大于等于X层可产出, ...} dict
@@ -5250,7 +5281,9 @@
def GetIsDayReset(self): return self.attrTuple[4] # 是否每天重置 BYTE
def GetResetType(self): return self.attrTuple[5] # 重置类型,0-0点重置;1-5点重置 BYTE
def GetCTGIDList(self): return self.attrTuple[6] # 充值ID列表 [ctgID, ...] list
- def GetCTGCountAwardInfo(self): return self.attrTuple[7] # 累计充值次数额外奖励 dict
+ def GetCTGCountAwardInfo(self): return self.attrTuple[7] # 累计充值次数额外奖励 dict
+ def GetCTGCountDayResetList(self): return self.attrTuple[8] # 每日重置累充次数列表 list
+ def GetActShopType(self): return self.attrTuple[9] # 商城类型 DWORD
# 任务活动时间表
class IPY_ActTask():
@@ -6127,6 +6160,7 @@
self.__LoadFileData("ActBossTrial", onlyCheck)
self.__LoadFileData("ActBossTrialTemplate", onlyCheck)
self.__LoadFileData("ActXianXiaMJ", onlyCheck)
+ self.__LoadFileData("ActXianXiaMJBillTemp", onlyCheck)
self.__LoadFileData("ActXianXiaMJAward", onlyCheck)
self.__LoadFileData("ActGodGift", onlyCheck)
self.__LoadFileData("ActGodGiftAward", onlyCheck)
@@ -7415,6 +7449,13 @@
self.CheckLoadData("ActXianXiaMJ")
return self.ipyActXianXiaMJCache[index]
+ def GetActXianXiaMJBillTempCount(self):
+ self.CheckLoadData("ActXianXiaMJBillTemp")
+ return self.ipyActXianXiaMJBillTempLen
+ def GetActXianXiaMJBillTempByIndex(self, index):
+ self.CheckLoadData("ActXianXiaMJBillTemp")
+ return self.ipyActXianXiaMJBillTempCache[index]
+
def GetActXianXiaMJAwardCount(self):
self.CheckLoadData("ActXianXiaMJAward")
return self.ipyActXianXiaMJAwardLen
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 e86d140..a0826a3 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -1076,6 +1076,8 @@
# boss凭证
PlayerActBossTrial.OnMixFirstLogin(curPlayer)
+ # 仙匣秘境
+ PlayerActXianXiaMJ.OnMixFirstLogin(curPlayer)
# 重置玩家改名次数
#UpdatePlayerName.ResetChangeNameCnt(curPlayer)
return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActBuyCountGift.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActBuyCountGift.py
index 3a1da3e..b5ce0a0 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActBuyCountGift.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActBuyCountGift.py
@@ -20,6 +20,7 @@
import PlayerControl
import IpyGameDataPY
import ChPyNetSendPack
+import FunctionNPCCommon
import DataRecordPack
import NetPackCommon
import ItemControler
@@ -27,6 +28,27 @@
import PlayerCoin
import GameWorld
import ChConfig
+
+def OnDay(curPlayer):
+ for actInfo in PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_BuyCountGift, {}).values():
+ if not actInfo.get(ShareDefine.ActKey_State):
+ continue
+ actNum = actInfo.get(ShareDefine.ActKey_ActNum, 0)
+ cfgID = actInfo.get(ShareDefine.ActKey_CfgID, 0)
+ ipyData = IpyGameDataPY.GetIpyGameData("ActBuyCountGift", cfgID)
+ if not ipyData:
+ continue
+ CTGCountDayResetList = ipyData.GetCTGCountDayResetList()
+ if not CTGCountDayResetList:
+ continue
+
+ awardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BuyCountGiftAward % actNum)
+ for buyCount in CTGCountDayResetList:
+ awardRecord = GameWorld.SetBitValue(awardRecord, buyCount, 0)
+ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_BuyCountGiftAward % actNum, awardRecord)
+ Sync_BuyCountGiftPlayerInfo(curPlayer, actNum)
+
+ return
def OnPlayerLogin(curPlayer):
@@ -88,6 +110,10 @@
return
resetCTGIDList = ipyData.GetCTGIDList()
PlayerCoin.DoResetCTGCountByIDList(curPlayer, "ActBuyCountGift", resetCTGIDList)
+
+ shopType = ipyData.GetActShopType()
+ if shopType:
+ FunctionNPCCommon.ResetShopItemBuyCountByShopType(curPlayer, [shopType])
return
def OnGetBuyCountGiftAward(curPlayer, buyCount, actNum):
@@ -177,6 +203,7 @@
actInfo.LimitLV = ipyData.GetLVLimit()
actInfo.IsDayReset = ipyData.GetIsDayReset()
actInfo.ResetType = ipyData.GetResetType()
+ actInfo.ShopType = ipyData.GetActShopType()
actInfo.CTGIDList = ipyData.GetCTGIDList()
actInfo.CTGIDCount = len(actInfo.CTGIDList)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActTask.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActTask.py
index 7599b0b..27088cf 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActTask.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActTask.py
@@ -111,6 +111,43 @@
return taskIDMax / 31
return defKeyNum
+def UpdActTaskValue(curPlayer, taskType, updValue):
+ ## 更新任务活动进度值
+
+ playerID = curPlayer.GetPlayerID()
+ for actInfo in PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_ActTask, {}).values():
+ actNum = actInfo.get(ShareDefine.ActKey_ActNum, 0)
+ if not actInfo.get(ShareDefine.ActKey_State):
+ continue
+
+ cfgID = actInfo.get(ShareDefine.ActKey_CfgID)
+ ipyData = IpyGameDataPY.GetIpyGameData("ActTask", cfgID)
+ if not ipyData:
+ continue
+ templateID = ipyData.GetTemplateID()
+
+ taskIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActTaskTemp", templateID)
+ if not taskIpyDataList:
+ continue
+
+ needValueMax = 0
+ for taskIpyData in taskIpyDataList:
+ if taskIpyData.GetTaskType() != taskType:
+ continue
+ needValue = taskIpyData.GetNeedValue()
+ if needValue > needValueMax:
+ needValueMax = needValue
+
+ curValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ActTaskValue % (actNum, taskType))
+ if updValue == curValue or needValueMax <= 0:
+ continue
+
+ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ActTaskValue % (actNum, taskType), updValue)
+ GameWorld.DebugLog("更新任务活动任务进度值: actNum=%s,taskType=%s,updValue=%s" % (actNum, taskType, updValue), playerID)
+ Sync_ActTaskPlayerValueInfo(curPlayer, actNum, [taskType])
+
+ return
+
def AddActTaskValue(curPlayer, taskType, addValue):
## 增加任务活动进度值
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActXianXiaMJ.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActXianXiaMJ.py
index a10a9f0..7a61643 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActXianXiaMJ.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActXianXiaMJ.py
@@ -20,12 +20,31 @@
import PlayerControl
import IpyGameDataPY
import ItemControler
+import CrossRealmPlayer
+import PlayerBillboard
import ChPyNetSendPack
import NetPackCommon
+import PlayerActTask
+import ItemCommon
import GameWorld
import ChConfig
Def_SuperLibType = 9 # 大奖库类型固定为9
+
+def OnMixFirstLogin(curPlayer):
+
+ for actInfo in PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_XianXiaMJ, {}).values():
+ actNum = actInfo.get(ShareDefine.ActKey_ActNum, 0)
+ if not actInfo.get(ShareDefine.ActKey_State):
+ continue
+ score = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJScore % actNum)
+ if not score:
+ continue
+ GameWorld.Log("仙匣秘境合服首登同步积分榜单: actNum=%s,score=%s" % (actNum, score), curPlayer.GetPlayerID())
+ PlayerBillboard.UpdatePlayerBillboard(curPlayer, ShareDefine.Def_BT_XianXiaMJScore, score, autoSort=True)
+ break
+
+ return
def OnPlayerLogin(curPlayer):
@@ -36,6 +55,11 @@
# 活动中同步活动信息
if actInfo.get(ShareDefine.ActKey_State):
Sync_XianXiaMJActionInfo(curPlayer, actNum)
+ Sync_XianXiaMJLayerInfo(curPlayer, actNum)
+
+ if not __CheckPlayerCrossActXianXiaMJ(curPlayer):
+ Sync_CrossActXianXiaMJActionInfo(curPlayer)
+
return
def RefreshXianXiaMJActionInfo(actNum):
@@ -63,8 +87,7 @@
if actID == playerActID:
GameWorld.DebugLog("仙匣秘境活动ID不变,不处理!actNum=%s,actID=%s" % (actNum, actID), playerID)
- layerInfoValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJAwardLayerInfo % actNum)
- layerNum = layerInfoValue % 100
+ layerNum = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJLayerNum % actNum)
if state and layerNum <= 0:
GameWorld.Log("仙匣秘境活动中但首层奖池未刷新初始化,尝试刷新!actNum=%s,actID=%s" % (actNum, actID), playerID)
__InitFirstLayerData(curPlayer, actNum, actInfo)
@@ -77,10 +100,15 @@
% (actNum, actID, playerActID, state, cfgID), playerID)
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XianXiaMJID % actNum, actID)
- PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XianXiaMJWorldLV % actNum, actWorldLV)
- PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XianXiaMJAwardLayerInfo % actNum, 0)
+ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XianXiaMJWorldLV % actNum, 0)
+ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XianXiaMJLayerNum % actNum, 0)
+ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XianXiaMJPlayCount % actNum, 0)
+ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XianXiaMJScore % actNum, 0)
- __InitFirstLayerData(curPlayer, actNum, actInfo)
+ if state:
+ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XianXiaMJWorldLV % actNum, actWorldLV)
+ Sync_XianXiaMJActionInfo(curPlayer, actNum)
+ __InitFirstLayerData(curPlayer, actNum, actInfo)
return True
def __InitFirstLayerData(curPlayer, actNum, actInfo):
@@ -95,7 +123,7 @@
if awardIpyDataList:
for awardIpyData in awardIpyDataList:
libType = awardIpyData.GetAwardLibType()
- libItemCount = awardIpyData.GetAwardItemCount()
+ libItemCount = max(awardIpyData.GetAwardItemCountList())
for num in xrange(libItemCount):
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XianXiaMJAwardItemInfo % (actNum, libType, num), 0)
@@ -105,10 +133,68 @@
# 活动中,生成新奖池
if state:
- __RefreshXianXiaMJAwardPool(curPlayer, actInfo, awardIpyDataList)
+ __RefreshXianXiaMJAwardPool(curPlayer, actInfo, ipyData, awardIpyDataList)
- Sync_XianXiaMJActionInfo(curPlayer, actNum)
+ Sync_XianXiaMJLayerInfo(curPlayer, actNum)
return True
+
+def RefreshCrossActXianXiaMJInfo():
+ ## 收到GameServer同步的活动信息,刷新活动信息
+ playerManager = GameWorld.GetPlayerManager()
+ for index in xrange(playerManager.GetPlayerCount()):
+ curPlayer = playerManager.GetPlayerByIndex(index)
+ if curPlayer.GetID() == 0:
+ continue
+ __CheckPlayerCrossActXianXiaMJ(curPlayer)
+
+ return
+
+def __CheckPlayerCrossActXianXiaMJ(curPlayer):
+
+ playerID = curPlayer.GetPlayerID()
+
+ actInfo = CrossRealmPlayer.GetPlayerCrossActInfo(curPlayer, ShareDefine.CrossActName_XianXiaMJ)
+ cfgID = actInfo.get(ShareDefine.ActKey_CfgID, 0)
+ actID = actInfo.get(ShareDefine.ActKey_ID, 0)
+ state = actInfo.get(ShareDefine.ActKey_State, 0)
+ dayIndex = actInfo.get(ShareDefine.ActKey_DayIndex, 0)
+
+ playerActID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CA_XianXiaMJID) # 玩家身上的活动ID
+
+ # 活动ID 相同的话不处理
+ if actID == playerActID:
+ GameWorld.DebugLog("跨服仙匣秘境活动ID不变,不处理!cfgID=%s,dayIndex=%s,actID=%s" % (cfgID, dayIndex, actID), playerID)
+ return
+ GameWorld.DebugLog("跨服仙匣秘境活动重置! cfgID=%s,actID=%s,playerActID=%s,state=%s" % (cfgID, actID, playerActID, state), playerID)
+ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CA_XianXiaMJID, actID)
+
+ if not state:
+ CrossRealmPlayer.NotifyCrossActEnd(curPlayer, ShareDefine.CrossActName_XianXiaMJ)
+
+ Sync_CrossActXianXiaMJActionInfo(curPlayer)
+ return True
+
+def SendToGameServer_XianXiaMJ(curPlayer, msgType, dataMsg=""):
+ playerID = curPlayer.GetPlayerID()
+ msgList = str([msgType, dataMsg])
+ GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(playerID, 0, 0, "XianXiaMJ", msgList, len(msgList))
+ GameWorld.Log("仙匣秘境发送GameServer: %s, %s" % (msgType, dataMsg), playerID)
+ return
+
+def AddPlayerLotteryScore(curPlayer, actNum, addScore):
+ if addScore <= 0:
+ return 0
+ lotteryScore = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJScore % actNum)
+ updLotteryScore = lotteryScore + addScore
+ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XianXiaMJScore % actNum, updLotteryScore)
+ PlayerBillboard.UpdatePlayerBillboard(curPlayer, ShareDefine.Def_BT_XianXiaMJScore, updLotteryScore, autoSort=True)
+ SendToGameServer_XianXiaMJ(curPlayer, "AddLotteryScore", [addScore, updLotteryScore])
+ return updLotteryScore
+
+def GetLayerSetByList(layerNum, setList):
+ if not setList:
+ return 0
+ return setList[layerNum - 1] if len(setList) >= layerNum else setList[-1]
#// AA 16 仙匣秘境活动选择大奖 #tagCMActXianXiaMJSuperItem
#
@@ -139,7 +225,8 @@
templateID = ipyData.GetTemplateID()
if not templateID:
return
-
+
+ layerNum = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJLayerNum % actNum)
actWorldLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJWorldLV % actNum)
awardIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActXianXiaMJAward", templateID)
if not awardIpyDataList:
@@ -156,10 +243,10 @@
GameWorld.ErrLog("没有配置仙匣秘境活动大奖库! cfgID=%s,actNum=%s,templateID=%s" % (cfgID, actNum, templateID))
return
- superLibItemCount = superAwardIpyData.GetAwardItemCount()
+ superLibItemCount = GetLayerSetByList(layerNum, superAwardIpyData.GetAwardItemCountList())
if len(superItemIDList) != superLibItemCount:
- GameWorld.ErrLog("仙匣秘境活动选择大奖个数错误! cfgID=%s,actNum=%s,templateID=%s,superLibItemCount=%s,reqSuperItemIDList=%s"
- % (cfgID, actNum, templateID, superLibItemCount, superItemIDList))
+ GameWorld.ErrLog("仙匣秘境活动选择大奖个数错误! cfgID=%s,actNum=%s,templateID=%s,layerNum=%s,superLibItemCount=%s,reqSuperItemIDList=%s"
+ % (cfgID, actNum, templateID, layerNum, superLibItemCount, superItemIDList))
return
posNumItemIDList = [] # 已抽中的大奖物品ID
@@ -179,8 +266,6 @@
GameWorld.DebugLog(" 已抽中的大奖ID! %s" % posNumItemIDList)
- layerInfoValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJAwardLayerInfo % actNum)
- layerNum = layerInfoValue % 100
libItemDict = __GetXianXiaMJAwardLibItem(superAwardIpyData.GetLibItemInfo(), actWorldLV)
layerLimitInfo = superAwardIpyData.GetItemLayerLimitInfo()
@@ -233,7 +318,7 @@
if not replaceSuperItemIDList:
break
- Sync_XianXiaMJActionInfo(curPlayer, actNum)
+ Sync_XianXiaMJLayerInfo(curPlayer, actNum)
return
#// AA 18 仙匣秘境活动奖池刷新 #tagCMActXianXiaMJAwardPoolRefresh
@@ -267,21 +352,19 @@
if not awardIpyDataList:
return
- if not __RefreshXianXiaMJAwardPool(curPlayer, actInfo, awardIpyDataList):
+ if not __RefreshXianXiaMJAwardPool(curPlayer, actInfo, ipyData, awardIpyDataList):
return
- Sync_XianXiaMJActionInfo(curPlayer, actNum)
+ Sync_XianXiaMJLayerInfo(curPlayer, actNum)
return
-def __RefreshXianXiaMJAwardPool(curPlayer, actInfo, awardIpyDataList):
+def __RefreshXianXiaMJAwardPool(curPlayer, actInfo, ipyData, awardIpyDataList):
## 刷新奖池物品
cfgID = actInfo.get(ShareDefine.ActKey_CfgID)
actNum = actInfo.get(ShareDefine.ActKey_ActNum, 0)
actWorldLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJWorldLV % actNum)
-
- layerInfoValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJAwardLayerInfo % actNum)
- layerNum = layerInfoValue % 100
+ layerNum = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJLayerNum % actNum)
GameWorld.DebugLog("刷新仙匣秘境奖池物品: cfgID=%s,actNum=%s,actWorldLV=%s,layerNum=%s" % (cfgID, actNum, actWorldLV, layerNum))
@@ -293,9 +376,13 @@
if libType != Def_SuperLibType:
continue
superLib = True
- libItemCount = awardIpyData.GetAwardItemCount()
+ libItemCount = GetLayerSetByList(layerNum, awardIpyData.GetAwardItemCountList())
for num in xrange(libItemCount):
itemInfoValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJAwardItemInfo % (actNum, libType, num))
+ if not itemInfoValue:
+ GameWorld.ErrLog("未选择大奖!无法刷新奖池! cfgID=%s,actNum=%s,layerNum=%s,num=%s"
+ % (cfgID, actNum, layerNum, num))
+ return
itemID, posNum = itemInfoValue / 100, itemInfoValue % 100
if itemID and not posNum:
GameWorld.ErrLog("有大奖未抽中!无法刷新奖池! cfgID=%s,actNum=%s,layerNum=%s,num=%s,itemID=%s,posNum=%s"
@@ -306,16 +393,13 @@
GameWorld.ErrLog("奖池配置没有大奖库!无法刷新奖池! cfgID=%s,actNum=%s,layerNum=%s,superLib=%s" % (cfgID, actNum, layerNum, superLib))
return
- layerNum += 1 # 可刷新奖池,默认+1层
- if layerNum > 99:
- GameWorld.ErrLog("奖池层数达到上限,无法刷新! cfgID=%s,actNum=%s,layerNum=%s" % (cfgID, actNum, layerNum))
- return
+ layerNum = min(layerNum + 1, 65530) # 可刷新奖池,默认+1层
GameWorld.DebugLog(" 可刷新奖池!下一层: layerNum=%s" % (layerNum))
refreshLibDict = {}
for awardIpyData in awardIpyDataList:
libType = awardIpyData.GetAwardLibType()
- libItemCount = awardIpyData.GetAwardItemCount()
+ libItemCount = GetLayerSetByList(layerNum, awardIpyData.GetAwardItemCountList())
libItemDict = __GetXianXiaMJAwardLibItem(awardIpyData.GetLibItemInfo(), actWorldLV)
layerLimitInfo = awardIpyData.GetItemLayerLimitInfo()
awardTimesTotalInfo = awardIpyData.GetItemAwardTimesTotalInfo()
@@ -368,9 +452,12 @@
GameWorld.DebugLog(" 随机生成奖品! libType=%s,num=%s,randItemID=%s" % (libType, num, randItemID))
playCount = 0 # 每层重置抽奖次数
- layerInfoValue = playCount * 100 + layerNum
- PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XianXiaMJAwardLayerInfo % actNum, layerInfoValue)
- GameWorld.DebugLog(" 刷新完成! playCount=%s,layerNum=%s,layerInfoValue=%s" % (playCount, layerNum, layerInfoValue))
+ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XianXiaMJLayerNum % actNum, layerNum)
+ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XianXiaMJPlayCount % actNum, playCount)
+ GameWorld.DebugLog(" 刷新完成! layerNum=%s,playCount=%s" % (layerNum, playCount))
+ PlayerActTask.UpdActTaskValue(curPlayer, ChConfig.ActTaskType_XianXiaMJLayer, layerNum)
+ if layerNum > 1:
+ AddPlayerLotteryScore(curPlayer, actNum, ipyData.GetLayerAddScore())
return True
#// AA 17 仙匣秘境活动抽奖 #tagCMActXianXiaMJLottery
@@ -396,6 +483,17 @@
GameWorld.DebugLog(" 非活动中!")
return
+ playerID = curPlayer.GetPlayerID()
+ crossActInfo = CrossRealmPlayer.GetPlayerCrossActInfo(curPlayer, ShareDefine.CrossActName_XianXiaMJ)
+ if crossActInfo.get(ShareDefine.ActKey_State, 0):
+ if crossActInfo.get(ShareDefine.ActKey_StateJoin) != ShareDefine.ActStateJoin_Start:
+ GameWorld.Log("跨服仙匣秘境非参与活动中: actNum=%s" % actNum, playerID)
+ return
+ else:
+ if actInfo.get(ShareDefine.ActKey_StateJoin) != ShareDefine.ActStateJoin_Start:
+ GameWorld.Log("仙匣秘境非参与活动中: actNum=%s" % actNum, playerID)
+ return
+
cfgID = actInfo.get(ShareDefine.ActKey_CfgID)
ipyData = IpyGameDataPY.GetIpyGameData("ActXianXiaMJ", cfgID)
if not ipyData:
@@ -410,21 +508,36 @@
if not awardIpyDataList:
return
+ checkUseMoney = False
+ costItemID = ipyData.GetUseItemID()
+ costItemCount = 1
+ if costItemID:
+ costItemIndexList, bindCnt, unBindCnt = ItemCommon.GetPackItemBindStateIndexInfo(curPlayer, costItemID, costItemCount)
+ lackCnt = costItemCount - bindCnt - unBindCnt
+ if lackCnt > 0:
+ checkUseMoney = True
+ else:
+ checkUseMoney = True
+
costMoneyType, costMoneyValue = ipyData.GetUseMoneyInfo()
- if not PlayerControl.HaveMoney(curPlayer, costMoneyType, costMoneyValue):
- GameWorld.DebugLog(" 货币不足,无法抽奖! costMoneyType=%s,costMoneyValue(%s) > curMoneyValue(%s)"
- % (costMoneyType, costMoneyValue, PlayerControl.GetMoney(curPlayer, costMoneyType)))
- return
-
- layerInfoValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJAwardLayerInfo % actNum)
- playCount, layerNum = layerInfoValue / 100, layerInfoValue % 100
+ if checkUseMoney:
+ if not costMoneyType or not costMoneyValue:
+ return
+ if not PlayerControl.HaveMoney(curPlayer, costMoneyType, costMoneyValue):
+ GameWorld.DebugLog(" 货币不足,无法抽奖! costMoneyType=%s,costMoneyValue(%s) > curMoneyValue(%s)"
+ % (costMoneyType, costMoneyValue, PlayerControl.GetMoney(curPlayer, costMoneyType)))
+ return
+
+ layerNum = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJLayerNum % actNum)
+ playCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJPlayCount % actNum)
+ GameWorld.DebugLog("layerNum=%s,playCount=%s" % (layerNum, playCount))
posNumMax = 0
randLibItemDict = {}
for awardIpyData in awardIpyDataList:
libType = awardIpyData.GetAwardLibType()
- libItemCount = awardIpyData.GetAwardItemCount()
- unlockLimitTimes = awardIpyData.GetUnlockAwardLimitTimes()
+ libItemCount = GetLayerSetByList(layerNum, awardIpyData.GetAwardItemCountList())
+ unlockLimitTimes = GetLayerSetByList(layerNum, awardIpyData.GetUnlockAwardLimitTimesList())
libWeight = awardIpyData.GetAwardLibWeight()
posNumMax += libItemCount
@@ -486,9 +599,14 @@
return
itemID, itemCount, num, isAddTimes = randItemInfo
- # 扣除抽奖消耗环保值
- PlayerControl.PayMoney(curPlayer, costMoneyType, costMoneyValue, "ActXianXiaMJ")
-
+ # 扣除消耗
+ if checkUseMoney:
+ PlayerControl.PayMoney(curPlayer, costMoneyType, costMoneyValue, "ActXianXiaMJ")
+ GameWorld.DebugLog("消耗货币: costMoneyType=%s,costMoneyValue=%s" % (costMoneyType, costMoneyValue))
+ else:
+ GameWorld.DebugLog("消耗道具: costItemID=%s,costItemCount=%s %s" % (costItemID, costItemCount, costItemIndexList))
+ ItemCommon.DelCostItemByBind(curPlayer, costItemIndexList, bindCnt, unBindCnt, costItemCount, "XianXiaMJ")
+
# 更新已抽中值
updItemInfoValue = itemID * 100 + reqPosNum
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XianXiaMJAwardItemInfo % (actNum, libType, num), updItemInfoValue)
@@ -499,21 +617,26 @@
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XianXiaMJAwardItemTimes % (actNum, libType, itemID), totalTimesNow)
playCount += 1
- layerInfoValue = playCount * 100 + layerNum
- PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XianXiaMJAwardLayerInfo % actNum, layerInfoValue)
+ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XianXiaMJPlayCount % actNum, playCount)
- GameWorld.DebugLog(" 抽中物品: layerNum=%s,libType=%s,itemID=%s,itemCount=%s,num=%s,reqPosNum=%s,updItemInfoValue=%s,totalTimesNow=%s,playCount=%s(%s)"
- % (layerNum, libType, itemID, itemCount, num, reqPosNum, updItemInfoValue, totalTimesNow, playCount, layerInfoValue))
+ GameWorld.DebugLog(" 抽中物品: layerNum=%s,libType=%s,itemID=%s,itemCount=%s,num=%s,reqPosNum=%s,updItemInfoValue=%s,totalTimesNow=%s,playCount=%s"
+ % (layerNum, libType, itemID, itemCount, num, reqPosNum, updItemInfoValue, totalTimesNow, playCount))
# 给物品
isAuctionItem = 0
itemList = [[itemID, itemCount, isAuctionItem]]
ItemControler.GivePlayerItemOrMail(curPlayer, itemList, event=["tagActXianXiaMJLottery", False, {}])
+ # 任务
+ PlayerActTask.AddActTaskValue(curPlayer, ChConfig.ActTaskType_XianXiaMJLottery, 1)
+
# 广播
if libType == Def_SuperLibType:
PlayerControl.WorldNotify(0, "XianXiaMJ%s" % actNum, [curPlayer.GetPlayerName(), itemID, itemCount])
+ # 积分
+ lotteryScore = AddPlayerLotteryScore(curPlayer, actNum, ipyData.GetLotteryAddScore())
+
# 通知抽奖结果
clientPack = ChPyNetSendPack.tagMCActXianXiaMJAwardItemResult()
clientPack.ActNum = actNum
@@ -522,6 +645,7 @@
clientPack.ItemCount = itemCount
clientPack.PosNum = reqPosNum
clientPack.TotalTimesNow = totalTimesNow
+ clientPack.LotteryScore = lotteryScore
NetPackCommon.SendFakePack(curPlayer, clientPack)
return
@@ -536,33 +660,67 @@
ipyData = IpyGameDataPY.GetIpyGameData("ActXianXiaMJ", cfgID)
if not ipyData:
return
-
- templateID = ipyData.GetTemplateID()
- if not templateID:
- return
costMoneyType, costMoneyValue = ipyData.GetUseMoneyInfo()
- actWorldLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJWorldLV % actNum)
- startDateStr, endDateStr = GameWorld.GetOperationActionDateStr(ipyData)
+ personalTempID = ipyData.GetPersonalTemplateID()
+ personalTempIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActXianXiaMJBillTemp", personalTempID) if personalTempID else []
- layerInfoValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJAwardLayerInfo % actNum)
- layerNum = layerInfoValue % 100
+ startDateStr, endDateStr = GameWorld.GetOperationActionDateStr(ipyData)
clientPack = ChPyNetSendPack.tagMCActXianXiaMJInfo()
clientPack.ActNum = actNum
clientPack.StartDate = startDateStr
clientPack.EndtDate = endDateStr
+ clientPack.JoinStartTime = ipyData.GetJoinStartTime()
+ clientPack.JoinEndTime = ipyData.GetJoinEndTime()
+ clientPack.IsDayReset = ipyData.GetIsDayReset()
clientPack.LimitLV = ipyData.GetLVLimit()
- clientPack.ResetType = ipyData.GetResetType()
+ clientPack.UseItemID = ipyData.GetUseItemID()
clientPack.MoneyType = costMoneyType
clientPack.MoneyValue = costMoneyValue
+ clientPack.LotteryAddScore = ipyData.GetLotteryAddScore()
+ clientPack.LayerAddScore = ipyData.GetLayerAddScore()
+
+ clientPack.PersonalBillboardInfoList = __GetTempRankBillPackList(personalTempIpyDataList)
+ clientPack.PersonalBillCount = len(clientPack.PersonalBillboardInfoList)
+ NetPackCommon.SendFakePack(curPlayer, clientPack)
+ return
+
+def __GetXianXiaMJAwardLibItem(libItemInfo, actWorldLV):
+ ## 获取奖励库物品信息字典,支持按世界等级范围配置的格式
+ keyList = libItemInfo.keys()
+ if not keyList:
+ return {}
+ if isinstance(keyList[0], tuple) and len(keyList[0]) == 2:
+ return GameWorld.GetDictValueByRangeKey(libItemInfo, actWorldLV, {})
+ return libItemInfo
+
+def Sync_XianXiaMJLayerInfo(curPlayer, actNum):
+
+ actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_XianXiaMJ, actNum)
+ if not actInfo.get(ShareDefine.ActKey_State):
+ return
+ cfgID = actInfo.get(ShareDefine.ActKey_CfgID)
+ ipyData = IpyGameDataPY.GetIpyGameData("ActXianXiaMJ", cfgID)
+ if not ipyData:
+ return
+
+ templateID = ipyData.GetTemplateID()
+ if not templateID:
+ return
+ actWorldLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJWorldLV % actNum)
+ layerNum = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJLayerNum % actNum)
+
+ clientPack = ChPyNetSendPack.tagMCActXianXiaMJLayerInfo()
+ clientPack.ActNum = actNum
clientPack.LayerNum = layerNum
+ clientPack.LotteryScore = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJScore % actNum)
clientPack.AwardItemList = [] # 奖池物品列表
awardIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActXianXiaMJAward", templateID)
if awardIpyDataList:
for awardIpyData in awardIpyDataList:
libType = awardIpyData.GetAwardLibType()
- libItemCount = awardIpyData.GetAwardItemCount()
+ libItemCount = GetLayerSetByList(layerNum, awardIpyData.GetAwardItemCountList())
libItemDict = __GetXianXiaMJAwardLibItem(awardIpyData.GetLibItemInfo(), actWorldLV)
layerLimitInfo = awardIpyData.GetItemLayerLimitInfo()
awardTimesTotalInfo = awardIpyData.GetItemAwardTimesTotalInfo()
@@ -577,27 +735,27 @@
continue
libItemInfo = libItemDict[itemID]
- awardItem = ChPyNetSendPack.tagMCActXianXiaMJAwardItem()
- awardItem.ItemLibType = libType
- awardItem.ItemID = itemID
- awardItem.ItemCount = libItemInfo[0]
- awardItem.PosNum = posNum
- awardItem.TotalTimesMax = awardTimesTotalInfo.get(itemID, 0)
- awardItem.TotalTimesNow = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJAwardItemTimes % (actNum, libType, itemID))
- awardItem.LayerLimit = layerLimitInfo.get(itemID, 0)
- clientPack.AwardItemList.append(awardItem)
+ layerItem = ChPyNetSendPack.tagMCActXianXiaMJLayerItem()
+ layerItem.ItemLibType = libType
+ layerItem.ItemID = itemID
+ layerItem.ItemCount = libItemInfo[0]
+ layerItem.PosNum = posNum
+ layerItem.TotalTimesMax = awardTimesTotalInfo.get(itemID, 0)
+ layerItem.TotalTimesNow = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJAwardItemTimes % (actNum, libType, itemID))
+ layerItem.LayerLimit = layerLimitInfo.get(itemID, 0)
+ clientPack.AwardItemList.append(layerItem)
# 大奖物品待选择库,全部同步
if libType == Def_SuperLibType:
for itemID, libItemInfo in libItemDict.items():
- awardItem = ChPyNetSendPack.tagMCActXianXiaMJAwardItem()
- awardItem.ItemLibType = libType
- awardItem.ItemID = itemID
- awardItem.ItemCount = libItemInfo[0]
- awardItem.TotalTimesMax = awardTimesTotalInfo.get(itemID, 0)
- awardItem.TotalTimesNow = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJAwardItemTimes % (actNum, libType, itemID))
- awardItem.LayerLimit = layerLimitInfo.get(itemID, 0)
- clientPack.SuperItemList.append(awardItem)
+ layerItem = ChPyNetSendPack.tagMCActXianXiaMJLayerItem()
+ layerItem.ItemLibType = libType
+ layerItem.ItemID = itemID
+ layerItem.ItemCount = libItemInfo[0]
+ layerItem.TotalTimesMax = awardTimesTotalInfo.get(itemID, 0)
+ layerItem.TotalTimesNow = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJAwardItemTimes % (actNum, libType, itemID))
+ layerItem.LayerLimit = layerLimitInfo.get(itemID, 0)
+ clientPack.SuperItemList.append(layerItem)
clientPack.SuperItemCount = len(clientPack.SuperItemList)
clientPack.SuperItemCanChooseCount = libItemCount
@@ -605,12 +763,68 @@
NetPackCommon.SendFakePack(curPlayer, clientPack)
return
-def __GetXianXiaMJAwardLibItem(libItemInfo, actWorldLV):
- ## 获取奖励库物品信息字典,支持按世界等级范围配置的格式
- keyList = libItemInfo.keys()
- if not keyList:
- return {}
- if isinstance(keyList[0], tuple) and len(keyList[0]) == 2:
- return GameWorld.GetDictValueByRangeKey(libItemInfo, actWorldLV, {})
- return libItemInfo
+def Sync_CrossActXianXiaMJActionInfo(curPlayer):
+ ## 通知活动信息
+ actInfo = CrossRealmPlayer.GetPlayerCrossActInfo(curPlayer, ShareDefine.CrossActName_XianXiaMJ)
+ if not actInfo:
+ return
+
+ if not actInfo.get(ShareDefine.ActKey_State):
+ return
+
+ ipyDataDict = actInfo.get(ShareDefine.ActKey_IpyDataInfo, {})
+ if not ipyDataDict:
+ return
+
+ personalTempID = ipyDataDict.get("PersonalTemplateID", 0)
+ personalTempIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActXianXiaMJBillTemp", personalTempID) if personalTempID else []
+
+ clientPack = ChPyNetSendPack.tagMCCrossActXianXiaMJInfo()
+ clientPack.ServerIDRangeInfo = str(actInfo.get(ShareDefine.ActKey_ServerIDRangeList, []))
+ clientPack.ServerInfoLen = len(clientPack.ServerIDRangeInfo)
+ clientPack.GroupValue1 = ipyDataDict.get("ZoneID", 0)
+ clientPack.StartDate = ipyDataDict.get("StartDate", "")
+ clientPack.EndtDate = ipyDataDict.get("EndDate", "")
+ clientPack.JoinStartTime = ipyDataDict.get("JoinStartTime", "")
+ clientPack.JoinEndTime = ipyDataDict.get("JoinEndTime", "")
+ clientPack.IsDayReset = ipyDataDict.get("IsDayReset", 0)
+ clientPack.RankLimitPersonal = ipyDataDict.get("RankLimitPersonal", 0)
+
+ clientPack.PersonalBillboardInfoList = __GetTempRankBillPackList(personalTempIpyDataList)
+ clientPack.PersonalBillCount = len(clientPack.PersonalBillboardInfoList)
+
+ NetPackCommon.SendFakePack(curPlayer, clientPack)
+ return
+def __GetTempRankBillPackList(ipyDataList):
+ packBillList = []
+ if not ipyDataList:
+ return packBillList
+ for tempIpyData in ipyDataList:
+ rankInfo = ChPyNetSendPack.tagMCActXianXiaMJBillard()
+ rankInfo.Rank = tempIpyData.GetRank()
+
+ rankInfo.AwardItemList = []
+ awardItemList = tempIpyData.GetAwardItemList()
+ for itemID, itemCount, isAuctionItem in awardItemList:
+ item = ChPyNetSendPack.tagMCActXianXiaMJItem()
+ item.Clear()
+ item.ItemID = itemID
+ item.ItemCount = itemCount
+ item.IsBind = isAuctionItem
+ rankInfo.AwardItemList.append(item)
+ rankInfo.Count = len(rankInfo.AwardItemList)
+
+# rankInfo.MemAwardItemList = []
+# memAwardItemList = tempIpyData.GetMemAwardItemList()
+# for itemID, itemCount, isAuctionItem in memAwardItemList:
+# item = ChPyNetSendPack.tagMCActXianXiaMJItem()
+# item.Clear()
+# item.ItemID = itemID
+# item.ItemCount = itemCount
+# item.IsBind = isAuctionItem
+# rankInfo.MemAwardItemList.append(item)
+# rankInfo.MemCount = len(rankInfo.MemAwardItemList)
+
+ packBillList.append(rankInfo)
+ return packBillList
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
index fb77fcb..b0115f6 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
@@ -535,6 +535,7 @@
PlayerVip.VipOnDay(curPlayer)
PlayerCoin.OnDay(curPlayer)
+ PlayerActBuyCountGift.OnDay(curPlayer)
#成就
PlayerSuccess.SuccOnDay(curPlayer)
@@ -1534,6 +1535,9 @@
elif actionName == ShareDefine.CrossActName_BossTrial:
PlayerActBossTrial.RefreshCrossActBossTrialInfo()
+ elif actionName == ShareDefine.CrossActName_XianXiaMJ:
+ PlayerActXianXiaMJ.RefreshCrossActXianXiaMJInfo()
+
return
if key == ShareDefine.Def_Notify_WorldKey_CrossZoneName:
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
index d48a9f1..67fab70 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -346,9 +346,10 @@
CrossActName_AllRecharge = "CrossActAllRecharge" # 全民充值
CrossActName_LuckyCloudBuy = "CrossActLuckyCloudBuy" # 幸运云购
CrossActName_BossTrial = "CrossActBossTrial" # Boss历练 - 跨服
+CrossActName_XianXiaMJ = "CrossActXianXiaMJ" # 仙匣秘境 - 跨服
#跨服运营活动列表
-CrossActNameList = [CrossActName_CTGBillboard, CrossActName_AllRecharge, CrossActName_LuckyCloudBuy, CrossActName_BossTrial]
+CrossActNameList = [CrossActName_CTGBillboard, CrossActName_AllRecharge, CrossActName_LuckyCloudBuy, CrossActName_BossTrial, CrossActName_XianXiaMJ]
#需要锁定活动分区分配直到活动结束的跨服运营活动,即使热更分区配置,也不会改变正在活动中的分区设定,直到活动结束
CrossActLockServerGroupIDList = [CrossActName_CTGBillboard, CrossActName_AllRecharge]
@@ -820,9 +821,10 @@
Def_BT_BossTrialSubmitBak, #提交boss凭证榜 (boss历练活动 - 上一期) 35
Def_BT_BossTrialSubmitFamily, #提交boss凭证仙盟榜 (boss历练活动)
Def_BT_BossTrialSubmitFamilyBak, #提交boss凭证仙盟榜 (boss历练活动 - 上一期)
+ Def_BT_XianXiaMJScore, #仙匣秘境积分榜 (仙匣秘境活动)
Def_BT_Max, #排行榜最大类型
-) = range(0, 37 + 2)
+) = range(0, 38 + 2)
''' 跨服排行榜类型, 从 150 开始
与本服榜单存储的是不一样的数据库表格,理论上类型可以和本服榜单类型重复,为了做下区分防误导,跨服榜单从 150 开始
@@ -842,12 +844,14 @@
Def_CBT_BossTrialSubmitBak, # boss凭证 - 个人榜 上一期 159
Def_CBT_BossTrialSubmitFamily, # boss凭证 - 仙盟榜 160
Def_CBT_BossTrialSubmitFamilyBak, # boss凭证 - 仙盟榜 上一期 161
-) = range(150, 161 + 1)
+Def_CBT_XianXiaMJScore, # 仙匣秘境积分 - 个人榜 162
+) = range(150, 162 + 1)
# 跨服榜单最大数据名次,没有设置的默认100
CrossBillboard_MaxDataCount = {
Def_CBT_BossTrialSubmit:1000,
Def_CBT_BossTrialSubmitBak:1000,
+ Def_CBT_XianXiaMJScore:1000,
}
#职业对应战力排行榜类型
@@ -1608,6 +1612,7 @@
ClientServerMsg_ActAllRechargeValue = "ActAllRechargeValue" # 跨服全民充值额度
ClientServerMsg_CrossYaomoBossHurtAward = "CrossYaomoBossHurtAward" # 跨服妖魔boss玩家伤害领奖
ClientServerMsg_BossTrialSubmit = "BossTrialSubmit" # boss凭证提交
+ClientServerMsg_XianXiaMJScore = "XianXiaMJScore" # 仙匣秘境积分
#跨服广播类型定义
CrossNotify_CrossAct = "CrossAct"
--
Gitblit v1.8.0