From 043a9c0e0df19388055bb7ad3b15952d7da91506 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期六, 08 五月 2021 16:52:43 +0800
Subject: [PATCH] 8721 【主干】【BT2】【后端】H.活动-合服庆典(骑宠盛宴)

---
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py              |    8 
 ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py                                      |   47 ++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py                   |    5 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py               |  142 ++++++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCAI/AICommon.py            |   13 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCustomRefresh.py          |   19 +
 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py                                    |  142 ++++++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActHorsePetFeast.py |  155 ++++++++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py                 |   32 ++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py               |    3 
 PySysDB/PySysDBPY.h                                                                                  |   12 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCHurtMgr.py                |    3 
 ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py                                        |    5 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py     |    4 
 PySysDB/PySysDBG.h                                                                                   |   17 +
 15 files changed, 599 insertions(+), 8 deletions(-)

diff --git a/PySysDB/PySysDBG.h b/PySysDB/PySysDBG.h
index 2e8f39a..66bb70d 100644
--- a/PySysDB/PySysDBG.h
+++ b/PySysDB/PySysDBG.h
@@ -467,6 +467,23 @@
 	list		NotifyInfoLoop;	//全服提示信息 - 循环广播[间隔分钟, 广播key]
 };
 
+//骑宠盛宴活动
+
+struct tagActHorsePetFeast
+{
+	DWORD		_CfgID;	//配置ID
+	list		PlatformList;	//活动平台列表["平台A", "平台A", ...],配[]代表所有
+	list		ServerGroupIDList;	//服务器ID列表
+	BYTE		ActNum;	//活动分组编号, 活动类型 * 10 + 不同界面编号
+	char		StartDate;	//开启日期
+	char		EndDate;	//结束日期
+	list		StartTimeList;	//开启时间列表, 支持多个时段
+	list		EndTimeList;	//结束时间列表, 支持多个时段
+	dict		NotifyInfoStart;	//全服提示信息 - 相对开始时间
+	dict		NotifyInfoEnd;	//全服提示信息 - 相对结束时间
+	BYTE		IsDayReset;	//是否每天重置
+};
+
 //BOSS复活活动时间表
 
 struct tagActBossReborn
diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h
index e45e5bf..5229c44 100644
--- a/PySysDB/PySysDBPY.h
+++ b/PySysDB/PySysDBPY.h
@@ -1432,6 +1432,18 @@
 	BYTE		NeedNotify;		//是否需要广播
 };
 
+//骑宠盛宴活动
+
+struct tagActHorsePetFeast
+{
+	DWORD		_CfgID;	//配置ID
+	char		StartDate;	//开启日期
+	char		EndDate;	//结束日期
+	list		StartTimeList;	//开启时间列表, 支持多个时段
+	list		EndTimeList;	//结束时间列表, 支持多个时段
+	WORD		LVLimit;	//限制等级
+};
+
 //BOSS复活活动时间表
 
 struct tagActBossReborn
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
index 8f6fbc3..7a550fd 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -24885,6 +24885,148 @@
 
 
 #------------------------------------------------------
+# AA 54 骑宠盛宴活动信息 #tagMCActHorsePetFeastInfo
+
+class  tagMCActHorsePetFeastTime(Structure):
+    StartTime = ""    #(char StartTime[5])// 开始时间 H:M
+    EndtTime = ""    #(char EndtTime[5])// 结束时间 H:M
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        self.StartTime,_pos = CommFunc.ReadString(_lpData, _pos,5)
+        self.EndtTime,_pos = CommFunc.ReadString(_lpData, _pos,5)
+        return _pos
+
+    def Clear(self):
+        self.StartTime = ""
+        self.EndtTime = ""
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 5
+        length += 5
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, 5, self.StartTime)
+        data = CommFunc.WriteString(data, 5, self.EndtTime)
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                StartTime:%s,
+                                EndtTime:%s
+                                '''\
+                                %(
+                                self.StartTime,
+                                self.EndtTime
+                                )
+        return DumpString
+
+
+class  tagMCActHorsePetFeastInfo(Structure):
+    Head = tagHead()
+    ActNum = 0    #(BYTE ActNum)//活动编号
+    StartDate = ""    #(char StartDate[10])// 开始日期 y-m-d
+    EndtDate = ""    #(char EndtDate[10])// 结束日期 y-m-d
+    TimeCount = 0    #(BYTE TimeCount)
+    ActTimeList = list()    #(vector<tagMCActHorsePetFeastTime> ActTimeList)// 活动时间 H:M 列表
+    LimitLV = 0    #(WORD LimitLV)// 限制等级
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xAA
+        self.Head.SubCmd = 0x54
+        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.TimeCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.TimeCount):
+            temActTimeList = tagMCActHorsePetFeastTime()
+            _pos = temActTimeList.ReadData(_lpData, _pos)
+            self.ActTimeList.append(temActTimeList)
+        self.LimitLV,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xAA
+        self.Head.SubCmd = 0x54
+        self.ActNum = 0
+        self.StartDate = ""
+        self.EndtDate = ""
+        self.TimeCount = 0
+        self.ActTimeList = list()
+        self.LimitLV = 0
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 1
+        length += 10
+        length += 10
+        length += 1
+        for i in range(self.TimeCount):
+            length += self.ActTimeList[i].GetLength()
+        length += 2
+
+        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.WriteBYTE(data, self.TimeCount)
+        for i in range(self.TimeCount):
+            data = CommFunc.WriteString(data, self.ActTimeList[i].GetLength(), self.ActTimeList[i].GetBuffer())
+        data = CommFunc.WriteWORD(data, self.LimitLV)
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                ActNum:%d,
+                                StartDate:%s,
+                                EndtDate:%s,
+                                TimeCount:%d,
+                                ActTimeList:%s,
+                                LimitLV:%d
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.ActNum,
+                                self.StartDate,
+                                self.EndtDate,
+                                self.TimeCount,
+                                "...",
+                                self.LimitLV
+                                )
+        return DumpString
+
+
+m_NAtagMCActHorsePetFeastInfo=tagMCActHorsePetFeastInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCActHorsePetFeastInfo.Head.Cmd,m_NAtagMCActHorsePetFeastInfo.Head.SubCmd))] = m_NAtagMCActHorsePetFeastInfo
+
+
+#------------------------------------------------------
 # AA 0C 登录奖励活动信息 #tagMCActLoginAwardInfo
 
 class  tagMCActLoginAwardAction(Structure):
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py
index e810d16..b2ba2c3 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py
@@ -853,7 +853,13 @@
             elif actName == ShareDefine.OperationActionName_BossReborn:
                 if isReload and ipyData:
                     GameWorldBoss.SetBossRebornNeedPoint(True)
-    
+                    
+            elif actName == ShareDefine.OperationActionName_HorsePetFeast:
+                if preState != state and state:
+                    relatedID = "%s|%s" % (actName, actNum)
+                    GameWorld.Log("    骑宠盛宴开始: relatedID=%s" % (relatedID))
+                    GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_ActionBossRebornSign % relatedID, int(time.time()))
+                    
             elif actName == ShareDefine.OperationActionName_FairyCeremony:
                 if isReload and ipyData:
                     PlayerFairyCeremony.Sync_OperationAction_FairyCeremony(ipyData)
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py b/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py
index 177cf6b..e00284d 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py
@@ -395,6 +395,20 @@
                         ("list", "NotifyInfoLoop", 0),
                         ),
 
+                "ActHorsePetFeast":(
+                        ("DWORD", "CfgID", 1),
+                        ("list", "PlatformList", 0),
+                        ("list", "ServerGroupIDList", 0),
+                        ("BYTE", "ActNum", 0),
+                        ("char", "StartDate", 0),
+                        ("char", "EndDate", 0),
+                        ("list", "StartTimeList", 0),
+                        ("list", "EndTimeList", 0),
+                        ("dict", "NotifyInfoStart", 0),
+                        ("dict", "NotifyInfoEnd", 0),
+                        ("BYTE", "IsDayReset", 0),
+                        ),
+
                 "ActBossReborn":(
                         ("DWORD", "CfgID", 1),
                         ("list", "ServerGroupIDList", 0),
@@ -1493,6 +1507,35 @@
     def GetNotifyInfoEnd(self): return self.NotifyInfoEnd # 全服提示信息 - 相对结束时间
     def GetNotifyInfoLoop(self): return self.NotifyInfoLoop # 全服提示信息 - 循环广播[间隔分钟, 广播key]
 
+# 骑宠盛宴活动
+class IPY_ActHorsePetFeast():
+    
+    def __init__(self):
+        self.CfgID = 0
+        self.PlatformList = []
+        self.ServerGroupIDList = []
+        self.ActNum = 0
+        self.StartDate = ""
+        self.EndDate = ""
+        self.StartTimeList = []
+        self.EndTimeList = []
+        self.NotifyInfoStart = {}
+        self.NotifyInfoEnd = {}
+        self.IsDayReset = 0
+        return
+        
+    def GetCfgID(self): return self.CfgID # 配置ID
+    def GetPlatformList(self): return self.PlatformList # 活动平台列表["平台A", "平台A", ...],配[]代表所有
+    def GetServerGroupIDList(self): return self.ServerGroupIDList # 服务器ID列表
+    def GetActNum(self): return self.ActNum # 活动分组编号, 活动类型 * 10 + 不同界面编号
+    def GetStartDate(self): return self.StartDate # 开启日期
+    def GetEndDate(self): return self.EndDate # 结束日期
+    def GetStartTimeList(self): return self.StartTimeList # 开启时间列表, 支持多个时段
+    def GetEndTimeList(self): return self.EndTimeList # 结束时间列表, 支持多个时段
+    def GetNotifyInfoStart(self): return self.NotifyInfoStart # 全服提示信息 - 相对开始时间
+    def GetNotifyInfoEnd(self): return self.NotifyInfoEnd # 全服提示信息 - 相对结束时间
+    def GetIsDayReset(self): return self.IsDayReset # 是否每天重置
+
 # BOSS复活活动时间表
 class IPY_ActBossReborn():
     
@@ -2288,6 +2331,8 @@
         self.ipyActCostRebateLen = len(self.ipyActCostRebateCache)
         self.ipyActCollectWordsCache = self.__LoadFileData("ActCollectWords", IPY_ActCollectWords)
         self.ipyActCollectWordsLen = len(self.ipyActCollectWordsCache)
+        self.ipyActHorsePetFeastCache = self.__LoadFileData("ActHorsePetFeast", IPY_ActHorsePetFeast)
+        self.ipyActHorsePetFeastLen = len(self.ipyActHorsePetFeastCache)
         self.ipyActBossRebornCache = self.__LoadFileData("ActBossReborn", IPY_ActBossReborn)
         self.ipyActBossRebornLen = len(self.ipyActBossRebornCache)
         self.ipyActFairyCeremonyCache = self.__LoadFileData("ActFairyCeremony", IPY_ActFairyCeremony)
@@ -2586,6 +2631,8 @@
     def GetActCostRebateByIndex(self, index): return self.ipyActCostRebateCache[index]
     def GetActCollectWordsCount(self): return self.ipyActCollectWordsLen
     def GetActCollectWordsByIndex(self, index): return self.ipyActCollectWordsCache[index]
+    def GetActHorsePetFeastCount(self): return self.ipyActHorsePetFeastLen
+    def GetActHorsePetFeastByIndex(self, index): return self.ipyActHorsePetFeastCache[index]
     def GetActBossRebornCount(self): return self.ipyActBossRebornLen
     def GetActBossRebornByIndex(self, index): return self.ipyActBossRebornCache[index]
     def GetActFairyCeremonyCount(self): return self.ipyActFairyCeremonyLen
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
index fc07677..26dac83 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
@@ -235,6 +235,7 @@
 OperationActionName_ManyDayRecharge = "ActManyDayRecharge" # 多日连充活动
 OperationActionName_SingleRecharge = "ActSingleRecharge" # 单笔累充活动
 OperationActionName_Turntable = "ActTurntable" # 转盘活动
+OperationActionName_HorsePetFeast = "ActHorsePetFeast" # 骑宠盛宴活动
 #节日活动类型列表 - 该类型无视开服天,日期到了就开启
 FeastOperationActionNameList = [OperationActionName_FeastWeekParty, OperationActionName_FeastRedPacket,
                                 OperationActionName_RechargeRebateGold, OperationActionName_GrowupBuy,
@@ -252,7 +253,7 @@
                            OperationActionName_NewFairyCeremony, OperationActionName_LuckyTreasure,
                            OperationActionName_DailyGiftbag, OperationActionName_SingleRecharge,
                            OperationActionName_CollectWords, OperationActionName_ManyDayRecharge,
-                           OperationActionName_Turntable,
+                           OperationActionName_Turntable, OperationActionName_HorsePetFeast,
                            ] + FeastOperationActionNameList
 #需要记录开启活动时的世界等级的运营活动
 NeedWorldLVOperationActNameList = [OperationActionName_FairyCeremony, OperationActionName_WishingWell, 
@@ -273,7 +274,7 @@
                                    OperationActionName_FlashGiftbag, OperationActionName_CostRebate,
                                    OperationActionName_SpringSale, OperationActionName_FlashSale,
                                    OperationActionName_ManyDayRecharge, OperationActionName_SingleRecharge,
-                                   OperationActionName_Turntable,
+                                   OperationActionName_Turntable, OperationActionName_HorsePetFeast,
                                    ]
 
 #跨服运营活动表名定义
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
index 8f6fbc3..7a550fd 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -24885,6 +24885,148 @@
 
 
 #------------------------------------------------------
+# AA 54 骑宠盛宴活动信息 #tagMCActHorsePetFeastInfo
+
+class  tagMCActHorsePetFeastTime(Structure):
+    StartTime = ""    #(char StartTime[5])// 开始时间 H:M
+    EndtTime = ""    #(char EndtTime[5])// 结束时间 H:M
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        self.StartTime,_pos = CommFunc.ReadString(_lpData, _pos,5)
+        self.EndtTime,_pos = CommFunc.ReadString(_lpData, _pos,5)
+        return _pos
+
+    def Clear(self):
+        self.StartTime = ""
+        self.EndtTime = ""
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 5
+        length += 5
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, 5, self.StartTime)
+        data = CommFunc.WriteString(data, 5, self.EndtTime)
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                StartTime:%s,
+                                EndtTime:%s
+                                '''\
+                                %(
+                                self.StartTime,
+                                self.EndtTime
+                                )
+        return DumpString
+
+
+class  tagMCActHorsePetFeastInfo(Structure):
+    Head = tagHead()
+    ActNum = 0    #(BYTE ActNum)//活动编号
+    StartDate = ""    #(char StartDate[10])// 开始日期 y-m-d
+    EndtDate = ""    #(char EndtDate[10])// 结束日期 y-m-d
+    TimeCount = 0    #(BYTE TimeCount)
+    ActTimeList = list()    #(vector<tagMCActHorsePetFeastTime> ActTimeList)// 活动时间 H:M 列表
+    LimitLV = 0    #(WORD LimitLV)// 限制等级
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xAA
+        self.Head.SubCmd = 0x54
+        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.TimeCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.TimeCount):
+            temActTimeList = tagMCActHorsePetFeastTime()
+            _pos = temActTimeList.ReadData(_lpData, _pos)
+            self.ActTimeList.append(temActTimeList)
+        self.LimitLV,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xAA
+        self.Head.SubCmd = 0x54
+        self.ActNum = 0
+        self.StartDate = ""
+        self.EndtDate = ""
+        self.TimeCount = 0
+        self.ActTimeList = list()
+        self.LimitLV = 0
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 1
+        length += 10
+        length += 10
+        length += 1
+        for i in range(self.TimeCount):
+            length += self.ActTimeList[i].GetLength()
+        length += 2
+
+        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.WriteBYTE(data, self.TimeCount)
+        for i in range(self.TimeCount):
+            data = CommFunc.WriteString(data, self.ActTimeList[i].GetLength(), self.ActTimeList[i].GetBuffer())
+        data = CommFunc.WriteWORD(data, self.LimitLV)
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                ActNum:%d,
+                                StartDate:%s,
+                                EndtDate:%s,
+                                TimeCount:%d,
+                                ActTimeList:%s,
+                                LimitLV:%d
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.ActNum,
+                                self.StartDate,
+                                self.EndtDate,
+                                self.TimeCount,
+                                "...",
+                                self.LimitLV
+                                )
+        return DumpString
+
+
+m_NAtagMCActHorsePetFeastInfo=tagMCActHorsePetFeastInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCActHorsePetFeastInfo.Head.Cmd,m_NAtagMCActHorsePetFeastInfo.Head.SubCmd))] = m_NAtagMCActHorsePetFeastInfo
+
+
+#------------------------------------------------------
 # AA 0C 登录奖励活动信息 #tagMCActLoginAwardInfo
 
 class  tagMCActLoginAwardAction(Structure):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
index c75e21f..14367cd 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -1143,6 +1143,15 @@
                         ("BYTE", "NeedNotify", 0),
                         ),
 
+                "ActHorsePetFeast":(
+                        ("DWORD", "CfgID", 1),
+                        ("char", "StartDate", 0),
+                        ("char", "EndDate", 0),
+                        ("list", "StartTimeList", 0),
+                        ("list", "EndTimeList", 0),
+                        ("WORD", "LVLimit", 0),
+                        ),
+
                 "ActBossReborn":(
                         ("DWORD", "CfgID", 1),
                         ("char", "StartDate", 0),
@@ -4136,6 +4145,25 @@
     def GetNeedItemList(self): return self.NeedItemList # 所需物品信息列表 [[物品ID,个数,是否绑定], ...]
     def GetNeedNotify(self): return self.NeedNotify # 是否需要广播
 
+# 骑宠盛宴活动
+class IPY_ActHorsePetFeast():
+    
+    def __init__(self):
+        self.CfgID = 0
+        self.StartDate = ""
+        self.EndDate = ""
+        self.StartTimeList = []
+        self.EndTimeList = []
+        self.LVLimit = 0
+        return
+        
+    def GetCfgID(self): return self.CfgID # 配置ID
+    def GetStartDate(self): return self.StartDate # 开启日期
+    def GetEndDate(self): return self.EndDate # 结束日期
+    def GetStartTimeList(self): return self.StartTimeList # 开启时间列表, 支持多个时段
+    def GetEndTimeList(self): return self.EndTimeList # 结束时间列表, 支持多个时段
+    def GetLVLimit(self): return self.LVLimit # 限制等级
+
 # BOSS复活活动时间表
 class IPY_ActBossReborn():
     
@@ -5779,6 +5807,8 @@
         self.ipyActCollectWordsLen = len(self.ipyActCollectWordsCache)
         self.ipyCollectWordsExchangeCache = self.__LoadFileData("CollectWordsExchange", IPY_CollectWordsExchange)
         self.ipyCollectWordsExchangeLen = len(self.ipyCollectWordsExchangeCache)
+        self.ipyActHorsePetFeastCache = self.__LoadFileData("ActHorsePetFeast", IPY_ActHorsePetFeast)
+        self.ipyActHorsePetFeastLen = len(self.ipyActHorsePetFeastCache)
         self.ipyActBossRebornCache = self.__LoadFileData("ActBossReborn", IPY_ActBossReborn)
         self.ipyActBossRebornLen = len(self.ipyActBossRebornCache)
         self.ipyBossRebornCache = self.__LoadFileData("BossReborn", IPY_BossReborn)
@@ -6313,6 +6343,8 @@
     def GetActCollectWordsByIndex(self, index): return self.ipyActCollectWordsCache[index]
     def GetCollectWordsExchangeCount(self): return self.ipyCollectWordsExchangeLen
     def GetCollectWordsExchangeByIndex(self, index): return self.ipyCollectWordsExchangeCache[index]
+    def GetActHorsePetFeastCount(self): return self.ipyActHorsePetFeastLen
+    def GetActHorsePetFeastByIndex(self, index): return self.ipyActHorsePetFeastCache[index]
     def GetActBossRebornCount(self): return self.ipyActBossRebornLen
     def GetActBossRebornByIndex(self, index): return self.ipyActBossRebornCache[index]
     def GetBossRebornCount(self): return self.ipyBossRebornLen
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCAI/AICommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCAI/AICommon.py
index d05a84c..73b6763 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCAI/AICommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCAI/AICommon.py
@@ -461,6 +461,11 @@
     if npcID in npcUseSkillOnDieDict:
         useSkillIDOnDie = npcUseSkillOnDieDict[npcID][0]
         
+    useSkillAfterOtherDieDict = {}
+    useSkillAfterOtherDieNPCDict = ReadChConfig.GetEvalChConfig("NPCLogic_AI_UseSkillAfterOtherDie")
+    if npcID in useSkillAfterOtherDieNPCDict:
+        useSkillAfterOtherDieDict = useSkillAfterOtherDieNPCDict[npcID]
+    
     skillManager = curNPC.GetSkillManager()
     tagObjType = curTag.GetGameObjType()
     
@@ -475,6 +480,14 @@
             #GameWorld.DebugLog("死亡释放的技能仅在死亡时才能释放!useSkillIDOnDie=%s" % useSkillIDOnDie)
             continue
         
+        skillTypeID = useSkill.GetSkillTypeID()
+        if skillTypeID in useSkillAfterOtherDieDict:
+            checkIsDeadNPCID = useSkillAfterOtherDieDict[skillTypeID]
+            if GameWorld.FindNPCByNPCID(checkIsDeadNPCID):
+                #GameWorld.DebugLog("目标NPC还活着,该技能未解锁,无法释放!npcID=%s,skillTypeID=%s,checkIsDeadNPCID=%s" 
+                #                   % (npcID, skillTypeID, checkIsDeadNPCID))
+                continue
+            
         #被动技能不释放
         if SkillCommon.isPassiveSkill(useSkill):
             #GameWorld.Log('被动技能不释放不释放 = %s'%(useSkill.GetSkillName()))
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCustomRefresh.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCustomRefresh.py
index 31f12b4..cd6a3b0 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCustomRefresh.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCustomRefresh.py
@@ -328,6 +328,7 @@
         __DoRefreshWorldBossCrossServer(npcRefresh, tick)
         return
     rebornLineID = 0
+    assignLineID = 0
     mapID = GameWorld.GetMap().GetMapID()
     refreshMark = npcRefresh.GetRefreshMark()
     lineID = GameWorld.GetGameWorld().GetLineID()
@@ -364,6 +365,9 @@
         relatedType = ipyData.GetRelatedType()
         relatedID = ipyData.GetRelatedID()
         isNeedShunt = ipyData.GetIsNeedShunt()
+        assignLineID = ipyData.GetRefreshLine() # 指定刷新的线路
+        if assignLineID > 0:
+            rebornLineID = assignLineID - 1
     if not bossID and not stoneNPCID:
         return
     gameFB = GameWorld.GetGameFB()
@@ -379,8 +383,15 @@
         
     # 关联运营活动,待扩展
     elif relatedType == 2:
-        operationActionInfo = PyGameData.g_operationActionDict.get(relatedID, {})
-        operationActionState = operationActionInfo.get(ShareDefine.ActKey_State, 0)
+        actNameInfo = relatedID.split("|")
+        actName = actNameInfo[0]
+        if actName in ShareDefine.MultiActNumOperationActNameList:
+            actNum = GameWorld.ToIntDef(actNameInfo[1] if len(actNameInfo) > 1 else "10")
+            actInfo = GameWorld.GetActInfo(actName, actNum)
+            operationActionState = actInfo.get(ShareDefine.ActKey_State, 0)
+        else:
+            operationActionInfo = PyGameData.g_operationActionDict.get(actName, {})
+            operationActionState = operationActionInfo.get(ShareDefine.ActKey_State, 0)
         rebornBossState = 1 if operationActionState else 0
         
     else:
@@ -394,7 +405,9 @@
         
     # 关联活动boss
     if relatedType:
-        rebornLineID = activityLineID # 活动boss只刷在活动线
+        if assignLineID == 0: # 没有指定刷新线路的,活动boss固定刷在活动线
+            rebornLineID = activityLineID # 活动boss只刷在活动线
+            
         # 不是活动线 
         if rebornBossState and lineID != rebornLineID:
             rebornBossState = 0
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCHurtMgr.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCHurtMgr.py
index fbca2a5..116f46a 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCHurtMgr.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCHurtMgr.py
@@ -23,6 +23,7 @@
 import IPY_GameWorld
 import IpyGameDataPY
 import PlayerBossReborn
+import PlayerActHorsePetFeast
 import ChPyNetSendPack
 import NetPackCommon
 import ShareDefine
@@ -356,6 +357,8 @@
         if self.npcID == IpyGameDataPY.GetFuncCfg("BossRebornServerBoss", 3):
             PlayerBossReborn.DoBossRebornActionBossOnKilledLogic(self)
             
+        PlayerActHorsePetFeast.DoActBossOnKilledLogic(self)
+        
         ## 同样榜单逻辑的不同功能奖励处理 ...
         
         return
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 7469bdc..b60f479 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -109,6 +109,7 @@
 import PlayerActRechargeRebateGold
 import PlayerActManyDayRecharge
 import PlayerActSingleRecharge
+import PlayerActHorsePetFeast
 import PlayerSpringSale
 import PlayerFairyCeremony
 import PlayerNewFairyCeremony
@@ -705,6 +706,8 @@
     PlayerFreeGoods.OnLogin(curPlayer)
     # BOSS复活活动
     PlayerBossReborn.OnLogin(curPlayer)
+    # 骑宠盛宴活动
+    PlayerActHorsePetFeast.OnLogin(curPlayer)
     # 周狂欢活动
     PlayerWeekParty.OnLogin(curPlayer)
     # 节日巡礼活动
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActHorsePetFeast.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActHorsePetFeast.py
new file mode 100644
index 0000000..28e4c52
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActHorsePetFeast.py
@@ -0,0 +1,155 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package Player.PlayerActHorsePetFeast
+#
+# @todo:骑宠盛宴
+# @author hxp
+# @date 2021-05-08
+# @version 1.0
+#
+# 详细描述: 骑宠盛宴
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2021-05-08 17:00"""
+#-------------------------------------------------------------------------------
+
+import ChConfig
+import PlayerTJG
+import ShareDefine
+import IpyGameDataPY
+import ChPyNetSendPack
+import NetPackCommon
+import PyGameData
+import GameWorld
+import NPCCommon
+
+def OnLogin(curPlayer):
+    
+    for actInfo in PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_HorsePetFeast, {}).values():
+        actNum = actInfo.get(ShareDefine.ActKey_ActNum, 0)
+        if actInfo.get(ShareDefine.ActKey_CfgID):
+            SyncHorsePetFeastInfo(curPlayer, actNum)
+            
+    return
+
+def RefreshOperationAction_HorsePetFeast(actNum):
+    actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_HorsePetFeast, actNum)
+    if not actInfo.get(ShareDefine.ActKey_CfgID):
+        return
+    
+    playerManager = GameWorld.GetPlayerManager()
+    for i in xrange(playerManager.GetPlayerCount()):
+        curPlayer = playerManager.GetPlayerByIndex(i)
+        if curPlayer == None or not curPlayer.GetInitOK():
+            continue
+        SyncHorsePetFeastInfo(curPlayer, actNum)
+        
+    return
+
+def SyncHorsePetFeastInfo(curPlayer, actNum):
+    actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_HorsePetFeast, actNum)
+    #state = actInfo.get(ShareDefine.ActKey_State)
+    cfgID = actInfo.get(ShareDefine.ActKey_CfgID)
+    if not cfgID:
+        return
+    
+    actIpyData = IpyGameDataPY.GetIpyGameData("ActHorsePetFeast", cfgID)
+    if not actIpyData:
+        return
+    
+    startTimeList = actIpyData.GetStartTimeList()
+    endTimeList = actIpyData.GetEndTimeList()
+    if len(startTimeList) != len(endTimeList):
+        return
+    
+    openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay) + 1
+    actInfo = ChPyNetSendPack.tagMCActHorsePetFeastInfo()
+    actInfo.Clear()
+    actInfo.StartDate = GameWorld.GetOperationActionDateStr(actIpyData.GetStartDate(), openServerDay)
+    actInfo.EndtDate = GameWorld.GetOperationActionDateStr(actIpyData.GetEndDate(), openServerDay)
+    actInfo.ActTimeList = []
+    for i, startTime in enumerate(startTimeList):
+        timeObj = ChPyNetSendPack.tagMCActHorsePetFeastTime()
+        timeObj.StartTime = startTime
+        timeObj.EndtTime = endTimeList[i]
+        actInfo.ActTimeList.append(timeObj) 
+    actInfo.TimeCount = len(actInfo.ActTimeList)
+    actInfo.LimitLV = actIpyData.GetLVLimit()
+    NetPackCommon.SendFakePack(curPlayer, actInfo)
+    return
+
+
+def DoActBossOnKilledLogic(npcRankHurtMgr):
+    ## 活动boss被击杀
+    #  @param rankHurtList: NPCHurtMgr.PlayerRankHurtList
+    
+    npcID = npcRankHurtMgr.npcID
+    
+    # 受奖励次数影响的物品掉落概率 {NPCID:[[物品ID,个数, 是否拍品, 掉落万分率], ...], ...},根据奖励次数随机多次,注意该配置非饼图,每种物品都会独立判断
+    dropByPlayerCountInfo = IpyGameDataPY.GetFuncEvalCfg("HorsePetFeast", 2, {})
+    if npcID not in dropByPlayerCountInfo:
+        return
+    # 不受奖励次数影响的物品掉落概率 {NPCID:[[物品ID,个数, 是否拍品, 掉落万分率], ...], ...},仅随机一次,注意该配置非饼图,每种物品都会独立判断
+    dropOneChanceInfo = IpyGameDataPY.GetFuncEvalCfg("HorsePetFeast", 3, {})
+    
+    GameWorld.Log("骑宠盛宴活动boss被击杀: npcID=%s" % (npcID))
+    
+    curNPC = npcRankHurtMgr.curNPC
+    
+    awardPlayerDict = {}
+    copyPlayerManager = GameWorld.GetMapCopyPlayerManager()
+    for index in xrange(npcRankHurtMgr.GetHurtCount()):
+        hurtObj = npcRankHurtMgr.GetHurtAt(index)
+        if hurtObj.GetValueType() != ChConfig.Def_NPCHurtTypePlayer:
+            continue
+        playerID = hurtObj.GetValueID()
+        hurtPlayer = copyPlayerManager.FindPlayerByID(playerID)
+        if not hurtPlayer or PlayerTJG.GetIsTJG(hurtPlayer):
+            continue
+        if curNPC and not hurtPlayer.CanSeeOther(curNPC):
+            GameWorld.Log("    伤血玩家不在boss视野内,无法获得奖励!playerPos(%s,%s), npcPos(%s,%s)" 
+                          % (hurtPlayer.GetPosX(), hurtPlayer.GetPosY(), curNPC.GetPosX(), curNPC.GetPosY()))
+            continue
+        awardPlayerDict[playerID] = hurtPlayer
+        
+    awardPlayerIDList = awardPlayerDict.keys()
+    GameWorld.Log("    奖励玩家人数=%s, awardPlayerIDList=%s" % (len(awardPlayerIDList), awardPlayerIDList))
+    if not awardPlayerDict:
+        return
+    awardRandCount = len(awardPlayerIDList)
+    
+    awardRandCountMin, awardRandCountMax = IpyGameDataPY.GetFuncEvalCfg("HorsePetFeast", 1, [])
+    awardRandCount = max(awardRandCountMin, min(awardRandCountMax, awardRandCount))
+    GameWorld.Log("    奖励随机次数: %s" % awardRandCount)
+    
+    dropPosX, dropPosY = curNPC.GetPosX(), curNPC.GetPosY()
+    awardByPlayerCountList = dropByPlayerCountInfo[npcID]
+    awardOneChanceList = dropOneChanceInfo.get(npcID, [])
+    for playerID, hurtPlayer in awardPlayerDict.items():
+        awardItemList = []
+        for itemID, itemCount, isAuctionItem, dropRate in awardByPlayerCountList:
+            dropCountTotal = 0
+            for _ in xrange(awardRandCount):
+                if dropRate < ShareDefine.Def_MaxRateValue and not GameWorld.CanHappen(dropRate):
+                    continue
+                dropCountTotal += itemCount
+            if not dropCountTotal:
+                continue
+            awardItemList.append([itemID, dropCountTotal, isAuctionItem])
+            
+        for itemID, itemCount, isAuctionItem, dropRate in awardOneChanceList:
+            if not GameWorld.CanHappen(dropRate):
+                continue
+            awardItemList.append([itemID, itemCount, isAuctionItem])
+            
+        GameWorld.Log("        玩家掉落: %s" % awardItemList, playerID)
+        if not awardItemList:
+            continue
+        
+        # 直接给物品并展示虚拟掉落
+        NPCCommon.DoGiveItemByVirtualDrop(hurtPlayer, awardItemList, npcID, dropPosX, dropPosY)
+        
+    return
+
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 94a6609..11b4627 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
@@ -95,6 +95,7 @@
 import PlayerDailyGiftbag
 import PlayerFairyCeremony
 import PlayerNewFairyCeremony
+import PlayerActHorsePetFeast
 import PlayerFeastRedPacket
 import PlayerLuckyTreasure
 import PlayerAuctionHouse
@@ -1381,6 +1382,9 @@
             elif actionName == ShareDefine.OperationActionName_BossReborn:
                 PlayerBossReborn.RefreshOperationAction_BossReborn()
                 
+            elif actionName == ShareDefine.OperationActionName_HorsePetFeast:
+                PlayerActHorsePetFeast.RefreshOperationAction_HorsePetFeast(actNum)
+                
             elif actionName == ShareDefine.OperationActionName_FlashGiftbag:
                 PlayerFlashGiftbag.RefreshFlashGiftbagActionInfo(actNum)
                 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
index fc07677..26dac83 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -235,6 +235,7 @@
 OperationActionName_ManyDayRecharge = "ActManyDayRecharge" # 多日连充活动
 OperationActionName_SingleRecharge = "ActSingleRecharge" # 单笔累充活动
 OperationActionName_Turntable = "ActTurntable" # 转盘活动
+OperationActionName_HorsePetFeast = "ActHorsePetFeast" # 骑宠盛宴活动
 #节日活动类型列表 - 该类型无视开服天,日期到了就开启
 FeastOperationActionNameList = [OperationActionName_FeastWeekParty, OperationActionName_FeastRedPacket,
                                 OperationActionName_RechargeRebateGold, OperationActionName_GrowupBuy,
@@ -252,7 +253,7 @@
                            OperationActionName_NewFairyCeremony, OperationActionName_LuckyTreasure,
                            OperationActionName_DailyGiftbag, OperationActionName_SingleRecharge,
                            OperationActionName_CollectWords, OperationActionName_ManyDayRecharge,
-                           OperationActionName_Turntable,
+                           OperationActionName_Turntable, OperationActionName_HorsePetFeast,
                            ] + FeastOperationActionNameList
 #需要记录开启活动时的世界等级的运营活动
 NeedWorldLVOperationActNameList = [OperationActionName_FairyCeremony, OperationActionName_WishingWell, 
@@ -273,7 +274,7 @@
                                    OperationActionName_FlashGiftbag, OperationActionName_CostRebate,
                                    OperationActionName_SpringSale, OperationActionName_FlashSale,
                                    OperationActionName_ManyDayRecharge, OperationActionName_SingleRecharge,
-                                   OperationActionName_Turntable,
+                                   OperationActionName_Turntable, OperationActionName_HorsePetFeast,
                                    ]
 
 #跨服运营活动表名定义

--
Gitblit v1.8.0