From 63d62011dc3639c1b6a0ea3f920e9ec6bada71f2 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期三, 10 三月 2021 18:13:39 +0800
Subject: [PATCH] 8650 【主干】【BT2】活动规则优化(充值返利仙玉 移到主干,为节日活动类型,改为仅直充仙玉有效,配表为仙玉);

---
 ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py                                           |   44 ++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py                    |  278 ++++++++++++++++-
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py                      |   58 +++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py                    |    3 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCoin.py                  |    5 
 PySysDB/PySysDBPY.h                                                                                       |   22 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActRechargeRebateGold.py |  193 ++++++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py          |    4 
 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py                                         |  278 ++++++++++++++++-
 PySysDB/PySysDBG.h                                                                                        |   16 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py                           |    5 
 11 files changed, 870 insertions(+), 36 deletions(-)

diff --git a/PySysDB/PySysDBG.h b/PySysDB/PySysDBG.h
index 21b5409..ff1623b 100644
--- a/PySysDB/PySysDBG.h
+++ b/PySysDB/PySysDBG.h
@@ -590,6 +590,22 @@
 	BYTE		IsDayReset;	//是否每天重置
 };
 
+//累计充值返利仙玉活动表
+
+struct tagActRechargeRebateGold
+{
+	DWORD		_CfgID;	//配置ID
+	char		ActMark;	//活动组标记
+	list		PlatformList;	//活动平台列表["平台A", "平台A", ...],配[]代表所有
+	list		ServerGroupIDList;	//服务器ID列表
+	char		StartDate;	//开启日期
+	char		EndDate;	//结束日期
+	dict		NotifyInfoStart;	//全服提示信息 - 相对开始时间
+	dict		NotifyInfoEnd;	//全服提示信息 - 相对结束时间
+	list		NotifyInfoLoop;	//全服提示信息 - 循环广播[间隔分钟, 广播key]
+	BYTE		IsDayReset;	//是否每天重置
+};
+
 //成长必买活动表
 
 struct tagActGrowupBuy
diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h
index 4e12bc2..9b42e90 100644
--- a/PySysDB/PySysDBPY.h
+++ b/PySysDB/PySysDBPY.h
@@ -1623,6 +1623,28 @@
 	char		NotifyKey;		//全服广播key,默认两个参数(玩家名, 档位额度)
 };
 
+//累计充值返利仙玉活动表
+
+struct tagActRechargeRebateGold
+{
+	DWORD		_CfgID;	//配置ID
+	char		StartDate;	//开启日期
+	char		EndDate;	//结束日期
+	WORD		LVLimit;	//限制等级
+	BYTE		IsDayReset;	//是否每天重置
+	list		TemplateIDList;	//模板ID列表
+};
+
+//累计充值返利仙玉模板表
+
+struct tagRechargeRebateGoldTemplate
+{
+	DWORD		_TemplateID;	//模板ID
+	DWORD		RMBMin;	//充值RMB最小值
+	DWORD		RMBMax;	//充值RMB最大值
+	WORD		RebateRate;	//返利仙玉比例百分比
+};
+
 //成长必买活动表
 
 struct tagActGrowupBuy
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
index 0b88bbe..0e668e5 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -829,7 +829,7 @@
     Head = tagHead()
     Type = 0    #(BYTE Type)//类型
     Count = 0    #(WORD Count)//数量
-    UniversalGameRec = list()    #(vector<tagUniversalGameRec> UniversalGameRec)///size = Count    
+    UniversalGameRec = list()    #(vector<tagUniversalGameRec> UniversalGameRec)///size = Count	
     data = None
 
     def __init__(self):
@@ -1133,7 +1133,7 @@
     FamilyID = 0    #(DWORD FamilyID)//家族ID
     ActionType = 0    #(BYTE ActionType)//类型
     Count = 0    #(WORD Count)//数量
-    FamilyActionList = list()    #(vector<tagGCFamilyAction> FamilyActionList)//size = Count    
+    FamilyActionList = list()    #(vector<tagGCFamilyAction> FamilyActionList)//size = Count	
     data = None
 
     def __init__(self):
@@ -3352,8 +3352,8 @@
     IsAlive = 0    #(BYTE IsAlive)// 是否存活
     RecordLen = 0    #(WORD RecordLen)// 长度
     KillRecord = ""    #(String KillRecord)// 最近击杀记录时间玩家名size = RecordLen
-    RefreshSecond = 0    #(DWORD RefreshSecond)// 刷新倒计时, 秒    
-    RefreshCD = 0    #(DWORD RefreshCD)// 刷新总CD时, 秒    
+    RefreshSecond = 0    #(DWORD RefreshSecond)// 刷新倒计时, 秒	
+    RefreshCD = 0    #(DWORD RefreshCD)// 刷新总CD时, 秒	
     data = None
 
     def __init__(self):
@@ -4318,7 +4318,7 @@
     Count = 0    #(DWORD Count)//数量
     IsBind = 0    #(BYTE IsBind)//是否绑定
     UserDataLen = 0    #(DWORD UserDataLen)
-    UserData = ""    #(String UserData)//自定义数据    
+    UserData = ""    #(String UserData)//自定义数据	
     data = None
 
     def __init__(self):
@@ -4559,7 +4559,7 @@
     Name = ""    #(char Name[33])
     LV = 0    #(DWORD LV)//等级
     Job = 0    #(BYTE Job)
-    RealmLV = 0    #(WORD RealmLV)//境界    
+    RealmLV = 0    #(WORD RealmLV)//境界	
     data = None
 
     def __init__(self):
@@ -6650,7 +6650,7 @@
 class  tagFamilyArrestOverStateInfo(Structure):
     Head = tagHead()
     Count = 0    #(WORD Count)
-    ArrestOverStateInfo = list()    #(vector<tagFamilyArrestOverState> ArrestOverStateInfo)///size = Count    
+    ArrestOverStateInfo = list()    #(vector<tagFamilyArrestOverState> ArrestOverStateInfo)///size = Count	
     data = None
 
     def __init__(self):
@@ -7717,7 +7717,7 @@
                   ("Cmd", c_ubyte),
                   ("SubCmd", c_ubyte),
                   ("PlayerID", c_int),    
-                  ("RefreshType", c_ubyte),    #参考CDBPlayerRefresh__    
+                  ("RefreshType", c_ubyte),    #参考CDBPlayerRefresh__	
                   ("Value", c_int),    
                   ]
 
@@ -7773,7 +7773,7 @@
 
 class  tagGCVoiceChat(Structure):
     Head = tagHead()
-    ChannelType = 0    #(BYTE ChannelType)// 1 世界 2 仙盟 3 私聊(好友) 4 队伍 5 区域    
+    ChannelType = 0    #(BYTE ChannelType)// 1 世界 2 仙盟 3 私聊(好友) 4 队伍 5 区域	
     SrcNameLen = 0    #(BYTE SrcNameLen)
     SrcName = ""    #(String SrcName)//size = SrcNameLen
     PlayerID = 0    #(DWORD PlayerID)
@@ -9513,7 +9513,7 @@
     ItemGUID = ""    #(char ItemGUID[40])
     AuctionType = 0    #(BYTE AuctionType)//拍品类型,0-全服拍品,1-仙盟拍品
     AddTime = ""    #(char AddTime[19])//上架时间
-    BidderID = 0    #(DWORD BidderID)//最高竞拍玩家ID,也就是当前最高竞价玩家ID    
+    BidderID = 0    #(DWORD BidderID)//最高竞拍玩家ID,也就是当前最高竞价玩家ID	
     BidderPrice = 0    #(DWORD BidderPrice)//最高竞拍价格
     BiddingTime = ""    #(char BiddingTime[19])//竞价时间 yyyy-MM-dd hh:mm:ss
     data = None
@@ -11379,8 +11379,8 @@
 
 class  tagGCCrossRealmPKBillboardInfo(Structure):
     Head = tagHead()
-    ZoneID = 0    #(BYTE ZoneID)// 赛区ID    
-    SeasonID = 0    #(BYTE SeasonID)// 赛季ID    
+    ZoneID = 0    #(BYTE ZoneID)// 赛区ID	
+    SeasonID = 0    #(BYTE SeasonID)// 赛季ID	
     Count = 0    #(WORD Count)
     PKBillboardList = list()    #(vector<tagGCCrossRealmPKBillboardData> PKBillboardList)
     data = None
@@ -12397,7 +12397,7 @@
     BackpackLV = 0    #(BYTE BackpackLV)//背包等级
     WarehouseLV = 0    #(BYTE WarehouseLV)//仓库等级
     TeamID = 0    #(DWORD TeamID)//队伍ID
-    UseGoldType = 0    #(BYTE UseGoldType)//默认用金子/金票        类型为MoneyType
+    UseGoldType = 0    #(BYTE UseGoldType)//默认用金子/金票		类型为MoneyType
     UseSilverType = 0    #(BYTE UseSilverType)//默认用的银子/银票
     AttackMode = 0    #(BYTE AttackMode)//攻击模式
     LastWeekOnlineTime = 0    #(DWORD LastWeekOnlineTime)//上周在线时间
@@ -15591,7 +15591,7 @@
 
 
 class  tagMCEquipPartXLAttr(Structure):
-    EquipPlace = 0    #(BYTE EquipPlace)// 装备位    
+    EquipPlace = 0    #(BYTE EquipPlace)// 装备位	
     XLAttrLV = 0    #(BYTE XLAttrLV)// 洗练等级
     XLAttrCnt = 0    #(BYTE XLAttrCnt)// 属性条数
     XLAttrList = list()    #(vector<tagMCEquipPartXLAttrValue> XLAttrList)// 属性列表,索引0的代表属性1,依次递增
@@ -18169,7 +18169,7 @@
     _fields_ = [
                   ("Cmd", c_ubyte),
                   ("SubCmd", c_ubyte),
-                  ("Record", c_ubyte),    #0-未领取 1-已领取    
+                  ("Record", c_ubyte),    #0-未领取 1-已领取	
                   ]
 
     def __init__(self):
@@ -22810,7 +22810,7 @@
     PlayerID = 0    #(DWORD PlayerID)//玩家ID
     EquipClassLV = 0    #(BYTE EquipClassLV)
     ItemDataSize = 0    #(WORD ItemDataSize)
-    ItemData = ""    #(String ItemData)//物品记录    
+    ItemData = ""    #(String ItemData)//物品记录	
     data = None
 
     def __init__(self):
@@ -23109,7 +23109,7 @@
     ItemDataSize = 0    #(DWORD ItemDataSize)
     ItemData = ""    #(String ItemData)//物品记录
     PlusDataSize = 0    #(DWORD PlusDataSize)
-    PlusData = ""    #(String PlusData)//扩展记录    
+    PlusData = ""    #(String PlusData)//扩展记录	
     data = None
 
     def __init__(self):
@@ -23606,7 +23606,7 @@
     _fields_ = [
                   ("Cmd", c_ubyte),
                   ("SubCmd", c_ubyte),
-                  ("MakeType", c_ubyte),    #类型        TMakeItemType
+                  ("MakeType", c_ubyte),    #类型		TMakeItemType
                   ("Result", c_ubyte),    #是否成功
                   ("MakeItemID", c_int),    #合成的物品ID
                   ]
@@ -25431,6 +25431,196 @@
 
 m_NAtagMCActRechargePrizeInfo=tagMCActRechargePrizeInfo()
 ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCActRechargePrizeInfo.Head.Cmd,m_NAtagMCActRechargePrizeInfo.Head.SubCmd))] = m_NAtagMCActRechargePrizeInfo
+
+
+#------------------------------------------------------
+# AA 29 累计充值返利仙玉活动信息 #tagMCActRechargeRebateGoldInfo
+
+class  tagMCActRechargeRebate(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("RMBMin", c_int),    # 充值RMB最小值
+                  ("RMBMax", c_int),    # 充值RMB最大值,0代表无上限
+                  ("RebateRate", c_ushort),    # 返利仙玉比例百分比
+                  ]
+
+    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.RMBMin = 0
+        self.RMBMax = 0
+        self.RebateRate = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCActRechargeRebate)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// AA 29 累计充值返利仙玉活动信息 //tagMCActRechargeRebateGoldInfo:
+                                RMBMin:%d,
+                                RMBMax:%d,
+                                RebateRate:%d
+                                '''\
+                                %(
+                                self.RMBMin,
+                                self.RMBMax,
+                                self.RebateRate
+                                )
+        return DumpString
+
+
+class  tagMCActRechargeRebateDay(Structure):
+    Rebates = 0    #(BYTE Rebates)// 返利档数
+    RebateInfo = list()    #(vector<tagMCActRechargeRebate> RebateInfo)// 返利档信息
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        self.Rebates,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.Rebates):
+            temRebateInfo = tagMCActRechargeRebate()
+            _pos = temRebateInfo.ReadData(_lpData, _pos)
+            self.RebateInfo.append(temRebateInfo)
+        return _pos
+
+    def Clear(self):
+        self.Rebates = 0
+        self.RebateInfo = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 1
+        for i in range(self.Rebates):
+            length += self.RebateInfo[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteBYTE(data, self.Rebates)
+        for i in range(self.Rebates):
+            data = CommFunc.WriteString(data, self.RebateInfo[i].GetLength(), self.RebateInfo[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Rebates:%d,
+                                RebateInfo:%s
+                                '''\
+                                %(
+                                self.Rebates,
+                                "..."
+                                )
+        return DumpString
+
+
+class  tagMCActRechargeRebateGoldInfo(Structure):
+    Head = tagHead()
+    StartDate = ""    #(char StartDate[10])// 开始日期 y-m-d
+    EndtDate = ""    #(char EndtDate[10])// 结束日期 y-m-d
+    LimitLV = 0    #(WORD LimitLV)// 限制等级
+    IsDayReset = 0    #(BYTE IsDayReset)//是否每天重置
+    RebateDays = 0    #(BYTE RebateDays)
+    RebateDayInfo = list()    #(vector<tagMCActRechargeRebateDay> RebateDayInfo)//每天对应信息; 如果只有一天,但是活动有多天,则代表每天奖励都一样
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xAA
+        self.Head.SubCmd = 0x29
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_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.IsDayReset,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.RebateDays,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.RebateDays):
+            temRebateDayInfo = tagMCActRechargeRebateDay()
+            _pos = temRebateDayInfo.ReadData(_lpData, _pos)
+            self.RebateDayInfo.append(temRebateDayInfo)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xAA
+        self.Head.SubCmd = 0x29
+        self.StartDate = ""
+        self.EndtDate = ""
+        self.LimitLV = 0
+        self.IsDayReset = 0
+        self.RebateDays = 0
+        self.RebateDayInfo = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 10
+        length += 10
+        length += 2
+        length += 1
+        length += 1
+        for i in range(self.RebateDays):
+            length += self.RebateDayInfo[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        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.IsDayReset)
+        data = CommFunc.WriteBYTE(data, self.RebateDays)
+        for i in range(self.RebateDays):
+            data = CommFunc.WriteString(data, self.RebateDayInfo[i].GetLength(), self.RebateDayInfo[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                StartDate:%s,
+                                EndtDate:%s,
+                                LimitLV:%d,
+                                IsDayReset:%d,
+                                RebateDays:%d,
+                                RebateDayInfo:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.StartDate,
+                                self.EndtDate,
+                                self.LimitLV,
+                                self.IsDayReset,
+                                self.RebateDays,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagMCActRechargeRebateGoldInfo=tagMCActRechargeRebateGoldInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCActRechargeRebateGoldInfo.Head.Cmd,m_NAtagMCActRechargeRebateGoldInfo.Head.SubCmd))] = m_NAtagMCActRechargeRebateGoldInfo
 
 
 #------------------------------------------------------
@@ -30509,6 +30699,58 @@
 
 
 #------------------------------------------------------
+# AA 30 累计充值返利仙玉玩家活动信息 #tagMCRechargeRebateGoldPlayerInfo
+
+class  tagMCRechargeRebateGoldPlayerInfo(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("RechargeRMBTotal", c_int),    # 活动已累计充值RMB
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xAA
+        self.SubCmd = 0x30
+        return
+
+    def ReadData(self, stringData, _pos=0, _len=0):
+        self.Clear()
+        memmove(addressof(self), stringData[_pos:], self.GetLength())
+        return _pos + self.GetLength()
+
+    def Clear(self):
+        self.Cmd = 0xAA
+        self.SubCmd = 0x30
+        self.RechargeRMBTotal = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCRechargeRebateGoldPlayerInfo)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// AA 30 累计充值返利仙玉玩家活动信息 //tagMCRechargeRebateGoldPlayerInfo:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                RechargeRMBTotal:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.RechargeRMBTotal
+                                )
+        return DumpString
+
+
+m_NAtagMCRechargeRebateGoldPlayerInfo=tagMCRechargeRebateGoldPlayerInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCRechargeRebateGoldPlayerInfo.Cmd,m_NAtagMCRechargeRebateGoldPlayerInfo.SubCmd))] = m_NAtagMCRechargeRebateGoldPlayerInfo
+
+
+#------------------------------------------------------
 # AA 11 限时特惠活动信息 #tagMCSpringSaleInfo
 
 class  tagMCSpringSaleItem(Structure):
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py b/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py
index 70b7582..dae834d 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py
@@ -493,6 +493,19 @@
                         ("BYTE", "IsDayReset", 0),
                         ),
 
+                "ActRechargeRebateGold":(
+                        ("DWORD", "CfgID", 1),
+                        ("char", "ActMark", 0),
+                        ("list", "PlatformList", 0),
+                        ("list", "ServerGroupIDList", 0),
+                        ("char", "StartDate", 0),
+                        ("char", "EndDate", 0),
+                        ("dict", "NotifyInfoStart", 0),
+                        ("dict", "NotifyInfoEnd", 0),
+                        ("list", "NotifyInfoLoop", 0),
+                        ("BYTE", "IsDayReset", 0),
+                        ),
+
                 "ActGrowupBuy":(
                         ("DWORD", "CfgID", 1),
                         ("char", "ActMark", 0),
@@ -1649,6 +1662,33 @@
     def GetNotifyInfoLoop(self): return self.NotifyInfoLoop # 全服提示信息 - 循环广播[间隔分钟, 广播key]
     def GetIsDayReset(self): return self.IsDayReset # 是否每天重置
 
+# 累计充值返利仙玉活动表
+class IPY_ActRechargeRebateGold():
+    
+    def __init__(self):
+        self.CfgID = 0
+        self.ActMark = ""
+        self.PlatformList = []
+        self.ServerGroupIDList = []
+        self.StartDate = ""
+        self.EndDate = ""
+        self.NotifyInfoStart = {}
+        self.NotifyInfoEnd = {}
+        self.NotifyInfoLoop = []
+        self.IsDayReset = 0
+        return
+        
+    def GetCfgID(self): return self.CfgID # 配置ID
+    def GetActMark(self): return self.ActMark # 活动组标记
+    def GetPlatformList(self): return self.PlatformList # 活动平台列表["平台A", "平台A", ...],配[]代表所有
+    def GetServerGroupIDList(self): return self.ServerGroupIDList # 服务器ID列表
+    def GetStartDate(self): return self.StartDate # 开启日期
+    def GetEndDate(self): return self.EndDate # 结束日期
+    def GetNotifyInfoStart(self): return self.NotifyInfoStart # 全服提示信息 - 相对开始时间
+    def GetNotifyInfoEnd(self): return self.NotifyInfoEnd # 全服提示信息 - 相对结束时间
+    def GetNotifyInfoLoop(self): return self.NotifyInfoLoop # 全服提示信息 - 循环广播[间隔分钟, 广播key]
+    def GetIsDayReset(self): return self.IsDayReset # 是否每天重置
+
 # 成长必买活动表
 class IPY_ActGrowupBuy():
     
@@ -2156,6 +2196,8 @@
         self.ipyActWishingWellLen = len(self.ipyActWishingWellCache)
         self.ipyActRechargePrizeCache = self.__LoadFileData("ActRechargePrize", IPY_ActRechargePrize)
         self.ipyActRechargePrizeLen = len(self.ipyActRechargePrizeCache)
+        self.ipyActRechargeRebateGoldCache = self.__LoadFileData("ActRechargeRebateGold", IPY_ActRechargeRebateGold)
+        self.ipyActRechargeRebateGoldLen = len(self.ipyActRechargeRebateGoldCache)
         self.ipyActGrowupBuyCache = self.__LoadFileData("ActGrowupBuy", IPY_ActGrowupBuy)
         self.ipyActGrowupBuyLen = len(self.ipyActGrowupBuyCache)
         self.ipyActTotalRechargeCache = self.__LoadFileData("ActTotalRecharge", IPY_ActTotalRecharge)
@@ -2446,6 +2488,8 @@
     def GetActWishingWellByIndex(self, index): return self.ipyActWishingWellCache[index]
     def GetActRechargePrizeCount(self): return self.ipyActRechargePrizeLen
     def GetActRechargePrizeByIndex(self, index): return self.ipyActRechargePrizeCache[index]
+    def GetActRechargeRebateGoldCount(self): return self.ipyActRechargeRebateGoldLen
+    def GetActRechargeRebateGoldByIndex(self, index): return self.ipyActRechargeRebateGoldCache[index]
     def GetActGrowupBuyCount(self): return self.ipyActGrowupBuyLen
     def GetActGrowupBuyByIndex(self, index): return self.ipyActGrowupBuyCache[index]
     def GetActTotalRechargeCount(self): return self.ipyActTotalRechargeLen
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index cff9187..3e7a6d9 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -3708,6 +3708,11 @@
 Def_PDict_TotalRechargeAwardRecord = "TotalRechargeAwardRecord_%s"  # 累计充值领奖记录,参数:(活动编号)
 Def_PDict_TotalRechargeWorldLV = "TotalRechargeWorldLV_%s" #累计充值活动开启时世界等级,参数:(活动编号)
 
+#累计充值返利仙玉活动
+Def_PDict_RechargeRebateGoldID = "RechargeRebateGoldID"  # 玩家身上的累计充值活动ID,唯一标识,取活动开始日期time值
+Def_PDict_RechargeRebateGoldTemplateID = "RechargeRebateGoldTempID"  # 玩家身上活动模板ID
+Def_PDict_RechargeRebateGoldRMB = "RechargeRebateGoldRMB"  # 活动累计充值RMB值
+
 #充值返利活动
 Def_PDict_RechargePrizeID = "RechargePrizeID"  # 玩家身上的重置返利活动ID,唯一标识,取活动开始日期time值
 Def_PDict_RechargePrizeCount = "RechargePrizeCount_%s"  # 返利奖励次数,参数(充值表充值ID)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
index 0b88bbe..0e668e5 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -829,7 +829,7 @@
     Head = tagHead()
     Type = 0    #(BYTE Type)//类型
     Count = 0    #(WORD Count)//数量
-    UniversalGameRec = list()    #(vector<tagUniversalGameRec> UniversalGameRec)///size = Count    
+    UniversalGameRec = list()    #(vector<tagUniversalGameRec> UniversalGameRec)///size = Count	
     data = None
 
     def __init__(self):
@@ -1133,7 +1133,7 @@
     FamilyID = 0    #(DWORD FamilyID)//家族ID
     ActionType = 0    #(BYTE ActionType)//类型
     Count = 0    #(WORD Count)//数量
-    FamilyActionList = list()    #(vector<tagGCFamilyAction> FamilyActionList)//size = Count    
+    FamilyActionList = list()    #(vector<tagGCFamilyAction> FamilyActionList)//size = Count	
     data = None
 
     def __init__(self):
@@ -3352,8 +3352,8 @@
     IsAlive = 0    #(BYTE IsAlive)// 是否存活
     RecordLen = 0    #(WORD RecordLen)// 长度
     KillRecord = ""    #(String KillRecord)// 最近击杀记录时间玩家名size = RecordLen
-    RefreshSecond = 0    #(DWORD RefreshSecond)// 刷新倒计时, 秒    
-    RefreshCD = 0    #(DWORD RefreshCD)// 刷新总CD时, 秒    
+    RefreshSecond = 0    #(DWORD RefreshSecond)// 刷新倒计时, 秒	
+    RefreshCD = 0    #(DWORD RefreshCD)// 刷新总CD时, 秒	
     data = None
 
     def __init__(self):
@@ -4318,7 +4318,7 @@
     Count = 0    #(DWORD Count)//数量
     IsBind = 0    #(BYTE IsBind)//是否绑定
     UserDataLen = 0    #(DWORD UserDataLen)
-    UserData = ""    #(String UserData)//自定义数据    
+    UserData = ""    #(String UserData)//自定义数据	
     data = None
 
     def __init__(self):
@@ -4559,7 +4559,7 @@
     Name = ""    #(char Name[33])
     LV = 0    #(DWORD LV)//等级
     Job = 0    #(BYTE Job)
-    RealmLV = 0    #(WORD RealmLV)//境界    
+    RealmLV = 0    #(WORD RealmLV)//境界	
     data = None
 
     def __init__(self):
@@ -6650,7 +6650,7 @@
 class  tagFamilyArrestOverStateInfo(Structure):
     Head = tagHead()
     Count = 0    #(WORD Count)
-    ArrestOverStateInfo = list()    #(vector<tagFamilyArrestOverState> ArrestOverStateInfo)///size = Count    
+    ArrestOverStateInfo = list()    #(vector<tagFamilyArrestOverState> ArrestOverStateInfo)///size = Count	
     data = None
 
     def __init__(self):
@@ -7717,7 +7717,7 @@
                   ("Cmd", c_ubyte),
                   ("SubCmd", c_ubyte),
                   ("PlayerID", c_int),    
-                  ("RefreshType", c_ubyte),    #参考CDBPlayerRefresh__    
+                  ("RefreshType", c_ubyte),    #参考CDBPlayerRefresh__	
                   ("Value", c_int),    
                   ]
 
@@ -7773,7 +7773,7 @@
 
 class  tagGCVoiceChat(Structure):
     Head = tagHead()
-    ChannelType = 0    #(BYTE ChannelType)// 1 世界 2 仙盟 3 私聊(好友) 4 队伍 5 区域    
+    ChannelType = 0    #(BYTE ChannelType)// 1 世界 2 仙盟 3 私聊(好友) 4 队伍 5 区域	
     SrcNameLen = 0    #(BYTE SrcNameLen)
     SrcName = ""    #(String SrcName)//size = SrcNameLen
     PlayerID = 0    #(DWORD PlayerID)
@@ -9513,7 +9513,7 @@
     ItemGUID = ""    #(char ItemGUID[40])
     AuctionType = 0    #(BYTE AuctionType)//拍品类型,0-全服拍品,1-仙盟拍品
     AddTime = ""    #(char AddTime[19])//上架时间
-    BidderID = 0    #(DWORD BidderID)//最高竞拍玩家ID,也就是当前最高竞价玩家ID    
+    BidderID = 0    #(DWORD BidderID)//最高竞拍玩家ID,也就是当前最高竞价玩家ID	
     BidderPrice = 0    #(DWORD BidderPrice)//最高竞拍价格
     BiddingTime = ""    #(char BiddingTime[19])//竞价时间 yyyy-MM-dd hh:mm:ss
     data = None
@@ -11379,8 +11379,8 @@
 
 class  tagGCCrossRealmPKBillboardInfo(Structure):
     Head = tagHead()
-    ZoneID = 0    #(BYTE ZoneID)// 赛区ID    
-    SeasonID = 0    #(BYTE SeasonID)// 赛季ID    
+    ZoneID = 0    #(BYTE ZoneID)// 赛区ID	
+    SeasonID = 0    #(BYTE SeasonID)// 赛季ID	
     Count = 0    #(WORD Count)
     PKBillboardList = list()    #(vector<tagGCCrossRealmPKBillboardData> PKBillboardList)
     data = None
@@ -12397,7 +12397,7 @@
     BackpackLV = 0    #(BYTE BackpackLV)//背包等级
     WarehouseLV = 0    #(BYTE WarehouseLV)//仓库等级
     TeamID = 0    #(DWORD TeamID)//队伍ID
-    UseGoldType = 0    #(BYTE UseGoldType)//默认用金子/金票        类型为MoneyType
+    UseGoldType = 0    #(BYTE UseGoldType)//默认用金子/金票		类型为MoneyType
     UseSilverType = 0    #(BYTE UseSilverType)//默认用的银子/银票
     AttackMode = 0    #(BYTE AttackMode)//攻击模式
     LastWeekOnlineTime = 0    #(DWORD LastWeekOnlineTime)//上周在线时间
@@ -15591,7 +15591,7 @@
 
 
 class  tagMCEquipPartXLAttr(Structure):
-    EquipPlace = 0    #(BYTE EquipPlace)// 装备位    
+    EquipPlace = 0    #(BYTE EquipPlace)// 装备位	
     XLAttrLV = 0    #(BYTE XLAttrLV)// 洗练等级
     XLAttrCnt = 0    #(BYTE XLAttrCnt)// 属性条数
     XLAttrList = list()    #(vector<tagMCEquipPartXLAttrValue> XLAttrList)// 属性列表,索引0的代表属性1,依次递增
@@ -18169,7 +18169,7 @@
     _fields_ = [
                   ("Cmd", c_ubyte),
                   ("SubCmd", c_ubyte),
-                  ("Record", c_ubyte),    #0-未领取 1-已领取    
+                  ("Record", c_ubyte),    #0-未领取 1-已领取	
                   ]
 
     def __init__(self):
@@ -22810,7 +22810,7 @@
     PlayerID = 0    #(DWORD PlayerID)//玩家ID
     EquipClassLV = 0    #(BYTE EquipClassLV)
     ItemDataSize = 0    #(WORD ItemDataSize)
-    ItemData = ""    #(String ItemData)//物品记录    
+    ItemData = ""    #(String ItemData)//物品记录	
     data = None
 
     def __init__(self):
@@ -23109,7 +23109,7 @@
     ItemDataSize = 0    #(DWORD ItemDataSize)
     ItemData = ""    #(String ItemData)//物品记录
     PlusDataSize = 0    #(DWORD PlusDataSize)
-    PlusData = ""    #(String PlusData)//扩展记录    
+    PlusData = ""    #(String PlusData)//扩展记录	
     data = None
 
     def __init__(self):
@@ -23606,7 +23606,7 @@
     _fields_ = [
                   ("Cmd", c_ubyte),
                   ("SubCmd", c_ubyte),
-                  ("MakeType", c_ubyte),    #类型        TMakeItemType
+                  ("MakeType", c_ubyte),    #类型		TMakeItemType
                   ("Result", c_ubyte),    #是否成功
                   ("MakeItemID", c_int),    #合成的物品ID
                   ]
@@ -25431,6 +25431,196 @@
 
 m_NAtagMCActRechargePrizeInfo=tagMCActRechargePrizeInfo()
 ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCActRechargePrizeInfo.Head.Cmd,m_NAtagMCActRechargePrizeInfo.Head.SubCmd))] = m_NAtagMCActRechargePrizeInfo
+
+
+#------------------------------------------------------
+# AA 29 累计充值返利仙玉活动信息 #tagMCActRechargeRebateGoldInfo
+
+class  tagMCActRechargeRebate(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("RMBMin", c_int),    # 充值RMB最小值
+                  ("RMBMax", c_int),    # 充值RMB最大值,0代表无上限
+                  ("RebateRate", c_ushort),    # 返利仙玉比例百分比
+                  ]
+
+    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.RMBMin = 0
+        self.RMBMax = 0
+        self.RebateRate = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCActRechargeRebate)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// AA 29 累计充值返利仙玉活动信息 //tagMCActRechargeRebateGoldInfo:
+                                RMBMin:%d,
+                                RMBMax:%d,
+                                RebateRate:%d
+                                '''\
+                                %(
+                                self.RMBMin,
+                                self.RMBMax,
+                                self.RebateRate
+                                )
+        return DumpString
+
+
+class  tagMCActRechargeRebateDay(Structure):
+    Rebates = 0    #(BYTE Rebates)// 返利档数
+    RebateInfo = list()    #(vector<tagMCActRechargeRebate> RebateInfo)// 返利档信息
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        self.Rebates,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.Rebates):
+            temRebateInfo = tagMCActRechargeRebate()
+            _pos = temRebateInfo.ReadData(_lpData, _pos)
+            self.RebateInfo.append(temRebateInfo)
+        return _pos
+
+    def Clear(self):
+        self.Rebates = 0
+        self.RebateInfo = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 1
+        for i in range(self.Rebates):
+            length += self.RebateInfo[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteBYTE(data, self.Rebates)
+        for i in range(self.Rebates):
+            data = CommFunc.WriteString(data, self.RebateInfo[i].GetLength(), self.RebateInfo[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Rebates:%d,
+                                RebateInfo:%s
+                                '''\
+                                %(
+                                self.Rebates,
+                                "..."
+                                )
+        return DumpString
+
+
+class  tagMCActRechargeRebateGoldInfo(Structure):
+    Head = tagHead()
+    StartDate = ""    #(char StartDate[10])// 开始日期 y-m-d
+    EndtDate = ""    #(char EndtDate[10])// 结束日期 y-m-d
+    LimitLV = 0    #(WORD LimitLV)// 限制等级
+    IsDayReset = 0    #(BYTE IsDayReset)//是否每天重置
+    RebateDays = 0    #(BYTE RebateDays)
+    RebateDayInfo = list()    #(vector<tagMCActRechargeRebateDay> RebateDayInfo)//每天对应信息; 如果只有一天,但是活动有多天,则代表每天奖励都一样
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xAA
+        self.Head.SubCmd = 0x29
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_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.IsDayReset,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.RebateDays,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.RebateDays):
+            temRebateDayInfo = tagMCActRechargeRebateDay()
+            _pos = temRebateDayInfo.ReadData(_lpData, _pos)
+            self.RebateDayInfo.append(temRebateDayInfo)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xAA
+        self.Head.SubCmd = 0x29
+        self.StartDate = ""
+        self.EndtDate = ""
+        self.LimitLV = 0
+        self.IsDayReset = 0
+        self.RebateDays = 0
+        self.RebateDayInfo = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 10
+        length += 10
+        length += 2
+        length += 1
+        length += 1
+        for i in range(self.RebateDays):
+            length += self.RebateDayInfo[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        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.IsDayReset)
+        data = CommFunc.WriteBYTE(data, self.RebateDays)
+        for i in range(self.RebateDays):
+            data = CommFunc.WriteString(data, self.RebateDayInfo[i].GetLength(), self.RebateDayInfo[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                StartDate:%s,
+                                EndtDate:%s,
+                                LimitLV:%d,
+                                IsDayReset:%d,
+                                RebateDays:%d,
+                                RebateDayInfo:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.StartDate,
+                                self.EndtDate,
+                                self.LimitLV,
+                                self.IsDayReset,
+                                self.RebateDays,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagMCActRechargeRebateGoldInfo=tagMCActRechargeRebateGoldInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCActRechargeRebateGoldInfo.Head.Cmd,m_NAtagMCActRechargeRebateGoldInfo.Head.SubCmd))] = m_NAtagMCActRechargeRebateGoldInfo
 
 
 #------------------------------------------------------
@@ -30509,6 +30699,58 @@
 
 
 #------------------------------------------------------
+# AA 30 累计充值返利仙玉玩家活动信息 #tagMCRechargeRebateGoldPlayerInfo
+
+class  tagMCRechargeRebateGoldPlayerInfo(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("RechargeRMBTotal", c_int),    # 活动已累计充值RMB
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xAA
+        self.SubCmd = 0x30
+        return
+
+    def ReadData(self, stringData, _pos=0, _len=0):
+        self.Clear()
+        memmove(addressof(self), stringData[_pos:], self.GetLength())
+        return _pos + self.GetLength()
+
+    def Clear(self):
+        self.Cmd = 0xAA
+        self.SubCmd = 0x30
+        self.RechargeRMBTotal = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCRechargeRebateGoldPlayerInfo)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// AA 30 累计充值返利仙玉玩家活动信息 //tagMCRechargeRebateGoldPlayerInfo:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                RechargeRMBTotal:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.RechargeRMBTotal
+                                )
+        return DumpString
+
+
+m_NAtagMCRechargeRebateGoldPlayerInfo=tagMCRechargeRebateGoldPlayerInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCRechargeRebateGoldPlayerInfo.Cmd,m_NAtagMCRechargeRebateGoldPlayerInfo.SubCmd))] = m_NAtagMCRechargeRebateGoldPlayerInfo
+
+
+#------------------------------------------------------
 # AA 11 限时特惠活动信息 #tagMCSpringSaleInfo
 
 class  tagMCSpringSaleItem(Structure):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
index 6c71431..57f547e 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -1283,6 +1283,22 @@
                         ("char", "NotifyKey", 0),
                         ),
 
+                "ActRechargeRebateGold":(
+                        ("DWORD", "CfgID", 1),
+                        ("char", "StartDate", 0),
+                        ("char", "EndDate", 0),
+                        ("WORD", "LVLimit", 0),
+                        ("BYTE", "IsDayReset", 0),
+                        ("list", "TemplateIDList", 0),
+                        ),
+
+                "RechargeRebateGoldTemplate":(
+                        ("DWORD", "TemplateID", 1),
+                        ("DWORD", "RMBMin", 0),
+                        ("DWORD", "RMBMax", 0),
+                        ("WORD", "RebateRate", 0),
+                        ),
+
                 "ActGrowupBuy":(
                         ("DWORD", "CfgID", 1),
                         ("char", "StartDate", 0),
@@ -4357,6 +4373,40 @@
     def GetAwardItem(self): return self.AwardItem # 返利物品信息列表 {职业:[(物品ID,个数,是否绑定),...]}
     def GetNotifyKey(self): return self.NotifyKey # 全服广播key,默认两个参数(玩家名, 档位额度)
 
+# 累计充值返利仙玉活动表
+class IPY_ActRechargeRebateGold():
+    
+    def __init__(self):
+        self.CfgID = 0
+        self.StartDate = ""
+        self.EndDate = ""
+        self.LVLimit = 0
+        self.IsDayReset = 0
+        self.TemplateIDList = []
+        return
+        
+    def GetCfgID(self): return self.CfgID # 配置ID
+    def GetStartDate(self): return self.StartDate # 开启日期
+    def GetEndDate(self): return self.EndDate # 结束日期
+    def GetLVLimit(self): return self.LVLimit # 限制等级
+    def GetIsDayReset(self): return self.IsDayReset # 是否每天重置
+    def GetTemplateIDList(self): return self.TemplateIDList # 模板ID列表
+
+# 累计充值返利仙玉模板表
+class IPY_RechargeRebateGoldTemplate():
+    
+    def __init__(self):
+        self.TemplateID = 0
+        self.RMBMin = 0
+        self.RMBMax = 0
+        self.RebateRate = 0
+        return
+        
+    def GetTemplateID(self): return self.TemplateID # 模板ID
+    def GetRMBMin(self): return self.RMBMin # 充值RMB最小值
+    def GetRMBMax(self): return self.RMBMax # 充值RMB最大值
+    def GetRebateRate(self): return self.RebateRate # 返利仙玉比例百分比
+
 # 成长必买活动表
 class IPY_ActGrowupBuy():
     
@@ -5577,6 +5627,10 @@
         self.ipyActTotalRechargeLen = len(self.ipyActTotalRechargeCache)
         self.ipyTotalRechargeTemplateCache = self.__LoadFileData("TotalRechargeTemplate", IPY_TotalRechargeTemplate)
         self.ipyTotalRechargeTemplateLen = len(self.ipyTotalRechargeTemplateCache)
+        self.ipyActRechargeRebateGoldCache = self.__LoadFileData("ActRechargeRebateGold", IPY_ActRechargeRebateGold)
+        self.ipyActRechargeRebateGoldLen = len(self.ipyActRechargeRebateGoldCache)
+        self.ipyRechargeRebateGoldTemplateCache = self.__LoadFileData("RechargeRebateGoldTemplate", IPY_RechargeRebateGoldTemplate)
+        self.ipyRechargeRebateGoldTemplateLen = len(self.ipyRechargeRebateGoldTemplateCache)
         self.ipyActGrowupBuyCache = self.__LoadFileData("ActGrowupBuy", IPY_ActGrowupBuy)
         self.ipyActGrowupBuyLen = len(self.ipyActGrowupBuyCache)
         self.ipyMagicWeaponFBCache = self.__LoadFileData("MagicWeaponFB", IPY_MagicWeaponFB)
@@ -6095,6 +6149,10 @@
     def GetActTotalRechargeByIndex(self, index): return self.ipyActTotalRechargeCache[index]
     def GetTotalRechargeTemplateCount(self): return self.ipyTotalRechargeTemplateLen
     def GetTotalRechargeTemplateByIndex(self, index): return self.ipyTotalRechargeTemplateCache[index]
+    def GetActRechargeRebateGoldCount(self): return self.ipyActRechargeRebateGoldLen
+    def GetActRechargeRebateGoldByIndex(self, index): return self.ipyActRechargeRebateGoldCache[index]
+    def GetRechargeRebateGoldTemplateCount(self): return self.ipyRechargeRebateGoldTemplateLen
+    def GetRechargeRebateGoldTemplateByIndex(self, index): return self.ipyRechargeRebateGoldTemplateCache[index]
     def GetActGrowupBuyCount(self): return self.ipyActGrowupBuyLen
     def GetActGrowupBuyByIndex(self, index): return self.ipyActGrowupBuyCache[index]
     def GetMagicWeaponFBCount(self): return self.ipyMagicWeaponFBLen
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 6a6ccbc..abc2233 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -106,6 +106,7 @@
 import PlayerActCollectWords
 import PlayerActTotalRecharge
 import PlayerActRechargePrize
+import PlayerActRechargeRebateGold
 import PlayerSpringSale
 import PlayerFairyCeremony
 import PlayerNewFairyCeremony
@@ -648,6 +649,8 @@
     PlayerCostRebate.OnPlayerLogin(curPlayer)
     #累计充值
     PlayerActTotalRecharge.OnPlayerLogin(curPlayer)
+    #累计充值返利仙玉
+    PlayerActRechargeRebateGold.OnPlayerLogin(curPlayer)
     #充值返利
     PlayerActRechargePrize.OnPlayerLogin(curPlayer)
     #成长必买
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActRechargeRebateGold.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActRechargeRebateGold.py
new file mode 100644
index 0000000..25b9135
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActRechargeRebateGold.py
@@ -0,0 +1,193 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package Player.PlayerActRechargeRebateGold
+#
+# @todo:累计充值返利仙玉活动
+# @author hxp
+# @date 2020-10-15
+# @version 1.0
+#
+# 详细描述: 累计充值返利仙玉活动(活动结束邮件发放,只算最高一档)
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2020-10-15 12:00"""
+#-------------------------------------------------------------------------------
+
+import ChConfig
+import ShareDefine
+import PlayerControl
+import PyGameData
+import GameWorld
+import NetPackCommon
+import ChPyNetSendPack
+import IpyGameDataPY
+
+def OnPlayerLogin(curPlayer):
+    isReset = __CheckPlayerRechargeRebateGoldAction(curPlayer)
+    if not isReset:
+        actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_RechargeRebateGold, {})
+        # 活动中同步活动信息
+        if actInfo.get(ShareDefine.ActKey_State):
+            Sync_RechargeRebateGoldActionInfo(curPlayer)
+            Sync_RechargeRebateGoldPlayerInfo(curPlayer)
+    return
+
+def RefreshRechargeRebateGoldActionInfo():
+    ## 收到GameServer同步的活动信息,刷新活动信息
+    playerManager = GameWorld.GetPlayerManager()
+    for index in xrange(playerManager.GetPlayerCount()):
+        curPlayer = playerManager.GetPlayerByIndex(index)
+        if curPlayer.GetID() == 0:
+            continue
+        __CheckPlayerRechargeRebateGoldAction(curPlayer)
+    return
+
+def __CheckPlayerRechargeRebateGoldAction(curPlayer):
+    ## 检查玩家累计充值活动数据信息
+    
+    playerID = curPlayer.GetPlayerID()
+    
+    actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_RechargeRebateGold, {})
+    actID = actInfo.get(ShareDefine.ActKey_ID, 0)
+    state = actInfo.get(ShareDefine.ActKey_State, 0)
+    
+    playerActID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RechargeRebateGoldID) # 玩家身上的活动ID
+    templateID = GetTemplateID(actInfo.get(ShareDefine.ActKey_CfgID, 0), actInfo.get(ShareDefine.ActKey_DayIndex, 0))
+    playerTemplateID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RechargeRebateGoldTemplateID)
+    
+    # 活动ID 相同的话不处理
+    if actID == playerActID:
+        GameWorld.DebugLog("累计充值返利仙玉活动ID不变,不处理!", playerID)
+        if state:
+            if playerTemplateID != templateID and templateID:
+                PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RechargeRebateGoldTemplateID, templateID)
+                GameWorld.DebugLog("    活动模板ID变更,更新玩家身上模板ID记录!playerTemplateID=%s,updTemplateID=%s" 
+                                   % (playerTemplateID, templateID), playerID)
+        return
+    
+    GameWorld.DebugLog("累计充值返利仙玉活动重置! actID=%s,playerActID=%s,state=%s" % (actID, playerActID, state), playerID)
+    
+    totalRMB = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RechargeRebateGoldRMB)
+    if playerActID and playerTemplateID and totalRMB > 0:
+        __SendRebateGoldMail(curPlayer, playerTemplateID, totalRMB)
+        
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RechargeRebateGoldID, actID)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RechargeRebateGoldTemplateID, templateID)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RechargeRebateGoldRMB, 0)
+    
+    Sync_RechargeRebateGoldActionInfo(curPlayer)
+    Sync_RechargeRebateGoldPlayerInfo(curPlayer)
+    return True
+
+def GetTemplateID(cfgID, dayIndex):
+    if cfgID == None or dayIndex == None:
+        return 0
+    ipyData = IpyGameDataPY.GetIpyGameData("ActRechargeRebateGold", cfgID)        
+    if not ipyData:
+        return 0
+    templateIDList = ipyData.GetTemplateIDList()
+    templateID = templateIDList[-1] if dayIndex >= len(templateIDList) else templateIDList[dayIndex]
+    return templateID
+
+def __SendRebateGoldMail(curPlayer, playerTemplateID, totalRMB):
+    ## 发送返利奖励邮件,取最大奖励档发奖励
+    
+    playerID = curPlayer.GetPlayerID()
+    GameWorld.DebugLog("累计充值返利仙玉发送奖励邮件! playerTemplateID=%s,totalRMB=%s" % (playerTemplateID, totalRMB), playerID)
+    
+    ipyDataList = IpyGameDataPY.GetIpyGameDataList("RechargeRebateGoldTemplate", playerTemplateID)
+    if not ipyDataList:
+        return
+    
+    rebateIpyData = None
+    for ipyData in ipyDataList:
+        rmbMin = ipyData.GetRMBMin()
+        rmbMax = ipyData.GetRMBMax()
+        if (rmbMin <= totalRMB <= rmbMax) or (rmbMin <= totalRMB and rmbMax == 0):
+            rebateIpyData = ipyData
+            break
+        
+    if not rebateIpyData:
+        GameWorld.DebugLog("玩家无返利仙玉奖励!", playerID)
+        return
+    
+    rebateRate = rebateIpyData.GetRebateRate()
+    addItemList = []
+    paramList = [totalRMB, rebateRate]
+    gold = min(int(totalRMB * rebateRate / 100.0), ShareDefine.Def_UpperLimit_DWord)
+    GameWorld.DebugLog("    返利仙玉百分比=%s%%, gold=%s" % (rebateRate, gold), playerID)
+    PlayerControl.SendMailByKey("RechargeRebateGold", [playerID], addItemList, paramList, gold)
+    return
+
+def AddRechargeRebateGoldRMB(curPlayer, addRMB):
+    ## 增加活动已累计充值RMB, 主干分支记录的是仙玉,只算直充,主干没有RMB对应比例配置,直接记录仙玉
+    actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_RechargeRebateGold, {})    
+    if not actInfo:
+        return
+    
+    if not actInfo.get(ShareDefine.ActKey_State):
+        return
+    
+    totalRMB = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RechargeRebateGoldRMB) + addRMB
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RechargeRebateGoldRMB, totalRMB)
+    
+    GameWorld.DebugLog("累计充值返利仙玉活动增加玩家累计充值RMB: addRMB=%s,totalRMB=%s" % (addRMB, totalRMB), curPlayer.GetPlayerID())
+    Sync_RechargeRebateGoldPlayerInfo(curPlayer)
+    return
+
+
+def Sync_RechargeRebateGoldPlayerInfo(curPlayer):
+    ## 通知累计充值返利仙玉活动玩家数据信息
+    playerActInfo = ChPyNetSendPack.tagMCRechargeRebateGoldPlayerInfo()
+    playerActInfo.RechargeRMBTotal = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RechargeRebateGoldRMB)
+    NetPackCommon.SendFakePack(curPlayer, playerActInfo)
+    return
+
+def Sync_RechargeRebateGoldActionInfo(curPlayer):
+    ## 通知累计充值返利仙玉活动信息
+    
+    actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_RechargeRebateGold, {})    
+    if not actInfo:
+        return
+    
+    if not actInfo.get(ShareDefine.ActKey_State):
+        return
+    
+    cfgID = actInfo.get(ShareDefine.ActKey_CfgID)
+    ipyData = IpyGameDataPY.GetIpyGameData("ActRechargeRebateGold", cfgID)
+    if not ipyData:
+        return
+    
+    templateIDList = ipyData.GetTemplateIDList()
+    if not templateIDList:
+        return
+    
+    openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay) + 1
+    actInfo = ChPyNetSendPack.tagMCActRechargeRebateGoldInfo()
+    actInfo.StartDate = GameWorld.GetOperationActionDateStr(ipyData.GetStartDate(), openServerDay)
+    actInfo.EndtDate = GameWorld.GetOperationActionDateStr(ipyData.GetEndDate(), openServerDay)
+    actInfo.LimitLV = ipyData.GetLVLimit()
+    actInfo.IsDayReset = ipyData.GetIsDayReset()
+    actInfo.RebateDayInfo = []
+    for templateID in templateIDList:
+        ipyDataList = IpyGameDataPY.GetIpyGameDataList("RechargeRebateGoldTemplate", templateID)
+        if not ipyDataList:
+            continue
+        
+        dayInfo = ChPyNetSendPack.tagMCActRechargeRebateDay()
+        dayInfo.RebateInfo = []
+        for dayIpyData in ipyDataList:
+            rebateInfo = ChPyNetSendPack.tagMCActRechargeRebate()
+            rebateInfo.RMBMin = dayIpyData.GetRMBMin()
+            rebateInfo.RMBMax = dayIpyData.GetRMBMax()
+            rebateInfo.RebateRate = dayIpyData.GetRebateRate()
+            dayInfo.RebateInfo.append(rebateInfo)
+            
+        dayInfo.Rebates = len(dayInfo.RebateInfo)
+        actInfo.RebateDayInfo.append(dayInfo)
+        
+    actInfo.RebateDays = len(actInfo.RebateDayInfo)
+    NetPackCommon.SendFakePack(curPlayer, actInfo)
+    return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCoin.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCoin.py
index 37e3e90..626f633 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCoin.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCoin.py
@@ -48,6 +48,7 @@
 import PlayerNewFairyCeremony
 import PlayerGoldGift
 import PlayerActTotalRecharge
+import PlayerActRechargeRebateGold
 import PlayerActRechargePrize
 import CrossActCTGBillboard
 import PlayerActGrowupBuy
@@ -437,6 +438,10 @@
         #跨服充值排行活动
         CrossActCTGBillboard.AddCTGRMB(curPlayer, orderCoin)
         
+    # 只算充仙玉的
+    if coinType == CoinType_Gold:
+        PlayerActRechargeRebateGold.AddRechargeRebateGoldRMB(curPlayer, addGold)
+        
     #仙界盛典-充值大礼
     PlayerFairyCeremony.OnFCRecharge(curPlayer)
     PlayerNewFairyCeremony.OnFCRecharge(curPlayer)
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 fca3e36..5ce8c2d 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
@@ -77,6 +77,7 @@
 import CrossActCTGBillboard
 import PlayerActCollectWords
 import PlayerActTotalRecharge
+import PlayerActRechargeRebateGold
 import PlayerActRechargePrize
 import PlayerActGrowupBuy
 import PlayerSpringSale
@@ -1414,6 +1415,9 @@
             elif actionName == ShareDefine.OperationActionName_GrowupBuy:
                 PlayerActGrowupBuy.RefreshGrowupBuyActionInfo()
                 
+            elif actionName == ShareDefine.OperationActionName_RechargeRebateGold:
+                PlayerActRechargeRebateGold.RefreshRechargeRebateGoldActionInfo()
+                
             return
         
         if key.startswith(ShareDefine.Def_Notify_WorldKey_CrossActInfo[:-2]):

--
Gitblit v1.8.0