From 49038c57437f730ac77154eb1969d46be614416d Mon Sep 17 00:00:00 2001
From: xdh <xiefantasy@qq.com>
Date: 星期一, 08 四月 2019 16:32:44 +0800
Subject: [PATCH] 6457 【后端】【2.0】缥缈仙域开发单(随机玩法、购买次数)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActivity.py                           |  157 ++++++--
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py                                     |    3 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py                                     |  108 ++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py                                 |  130 +++++++
 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py                                                          |  108 ++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_HorsePetBoss.py |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFairyDomain.py                        |  217 ++++++++++++
 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py                                                      |  130 +++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini                                             |   26 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py                                   |   47 ++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py                                 |    4 
 PySysDB/PySysDBPY.h                                                                                                    |   17 +
 ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py                                                          |    3 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py                                        |   13 
 14 files changed, 919 insertions(+), 46 deletions(-)

diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h
index 60713c1..9fa306a 100644
--- a/PySysDB/PySysDBPY.h
+++ b/PySysDB/PySysDBPY.h
@@ -600,6 +600,10 @@
 {
 	DWORD		_DailyID;	//活动ID
 	DWORD		DayTimes;	//每日次数, 0为不限制
+	DWORD		DayBuyTimes;	//每日可购买次数
+	DWORD		BuyNeedMoney;	//购买次数需要仙玉
+	DWORD		DayItemAddTimes;	//每日可用物品增加次数
+	DWORD		DayItemID;	//增加次数的物品ID
 	BYTE		DayResetType;	//每日次数重置类型; 0-不重置,1-0点,2-5点
 	DWORD		WeekTimes;	//每周次数, 0为不限制
 	BYTE		WeekResetType;	//每周次数重置类型; 0-不重置,1-0点,2-5点
@@ -1780,4 +1784,17 @@
 	list		Rank;	//排名
 	list		Award1;	//奖励 [[独立概率万分率,[物品ID,数量,是否拍品]],..]
 	dict		Award2;	//饼图奖励{随机次数:[(概率,[物品ID,数量,是否拍品]),..]}
+};
+
+//缥缈仙域表
+
+struct tagFairyDomain
+{
+	WORD		_ID;	//事件编号
+	BYTE		EventType;	//事件类型
+	DWORD		MapID;	//副本id
+	BYTE		LineID;	//副本线路id
+	BYTE		CostEnergy;	//消耗体力
+	BYTE		NeedAlchemyLV;	//出现的炼丹等级要求
+	DWORD		Weight;	//权重
 };
\ No newline at end of file
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
index c6fc84e..ac28fe5 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
@@ -7998,6 +7998,62 @@
 
 
 #------------------------------------------------------
+# A5 25 购买日常活动次数 #tagCMBuyDailyActionCnt
+
+class  tagCMBuyDailyActionCnt(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("ActionID", c_int),    # ID
+                  ("AddType", c_ubyte),    # 0-花仙玉 1-用物品
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xA5
+        self.SubCmd = 0x25
+        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 = 0xA5
+        self.SubCmd = 0x25
+        self.ActionID = 0
+        self.AddType = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagCMBuyDailyActionCnt)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// A5 25 购买日常活动次数 //tagCMBuyDailyActionCnt:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                ActionID:%d,
+                                AddType:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.ActionID,
+                                self.AddType
+                                )
+        return DumpString
+
+
+m_NAtagCMBuyDailyActionCnt=tagCMBuyDailyActionCnt()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMBuyDailyActionCnt.Cmd,m_NAtagCMBuyDailyActionCnt.SubCmd))] = m_NAtagCMBuyDailyActionCnt
+
+
+#------------------------------------------------------
 #A5 75 购买副本进入次数#tagCMBuyEnterCount
 
 class  tagCMBuyEnterCount(Structure):
@@ -11074,6 +11130,58 @@
 
 
 #------------------------------------------------------
+# A5 26 寻访仙域 #tagCMVisitFairyDomain
+
+class  tagCMVisitFairyDomain(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("Type", c_ubyte),    #0-开始寻访 1-结束寻访
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xA5
+        self.SubCmd = 0x26
+        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 = 0xA5
+        self.SubCmd = 0x26
+        self.Type = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagCMVisitFairyDomain)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// A5 26 寻访仙域 //tagCMVisitFairyDomain:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                Type:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.Type
+                                )
+        return DumpString
+
+
+m_NAtagCMVisitFairyDomain=tagCMVisitFairyDomain()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMVisitFairyDomain.Cmd,m_NAtagCMVisitFairyDomain.SubCmd))] = m_NAtagCMVisitFairyDomain
+
+
+#------------------------------------------------------
 # A5 1D 法宝佩戴 #tagCMWearMagicWeapon
 
 class  tagCMWearMagicWeapon(Structure):
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
index c27ff9e..06afc43 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -13019,6 +13019,8 @@
     _fields_ = [
                   ("ActionID", c_int),    # ID
                   ("DayFinishCnt", c_ushort),    # 今日已完成次数
+                  ("DayBuyTimes", c_ubyte),    # 今日购买次数
+                  ("DayItemTimes", c_ubyte),    # 今日物品增加次数
                   ("WeekFinishCnt", c_int),    # 本周已完成次数
                   ]
 
@@ -13034,6 +13036,8 @@
     def Clear(self):
         self.ActionID = 0
         self.DayFinishCnt = 0
+        self.DayBuyTimes = 0
+        self.DayItemTimes = 0
         self.WeekFinishCnt = 0
         return
 
@@ -13047,11 +13051,15 @@
         DumpString = '''// A3 15 日常活动次数通知 //tagMCDailyActionCnt:
                                 ActionID:%d,
                                 DayFinishCnt:%d,
+                                DayBuyTimes:%d,
+                                DayItemTimes:%d,
                                 WeekFinishCnt:%d
                                 '''\
                                 %(
                                 self.ActionID,
                                 self.DayFinishCnt,
+                                self.DayBuyTimes,
+                                self.DayItemTimes,
                                 self.WeekFinishCnt
                                 )
         return DumpString
@@ -13740,6 +13748,128 @@
 
 
 #------------------------------------------------------
+# A3 06 缥缈仙域信息 #tagMCFairyDomainInfo
+
+class  tagMCFairyDomainEvent(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("EventID", c_ushort),    #事件ID
+                  ("EventState", c_ubyte),    #事件状态 1-可拜访 2-拜访中 3-已拜访
+                  ]
+
+    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.EventID = 0
+        self.EventState = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCFairyDomainEvent)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// A3 06 缥缈仙域信息 //tagMCFairyDomainInfo:
+                                EventID:%d,
+                                EventState:%d
+                                '''\
+                                %(
+                                self.EventID,
+                                self.EventState
+                                )
+        return DumpString
+
+
+class  tagMCFairyDomainInfo(Structure):
+    Head = tagHead()
+    State = 0    #(BYTE State)//是否寻访中
+    Energy = 0    #(WORD Energy)//体力
+    Count = 0    #(BYTE Count)// 信息个数
+    InfoList = list()    #(vector<tagMCFairyDomainEvent> InfoList)// 信息列表
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xA3
+        self.Head.SubCmd = 0x06
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.State,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.Energy,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.Count):
+            temInfoList = tagMCFairyDomainEvent()
+            _pos = temInfoList.ReadData(_lpData, _pos)
+            self.InfoList.append(temInfoList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xA3
+        self.Head.SubCmd = 0x06
+        self.State = 0
+        self.Energy = 0
+        self.Count = 0
+        self.InfoList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 1
+        length += 2
+        length += 1
+        for i in range(self.Count):
+            length += self.InfoList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.State)
+        data = CommFunc.WriteWORD(data, self.Energy)
+        data = CommFunc.WriteBYTE(data, self.Count)
+        for i in range(self.Count):
+            data = CommFunc.WriteString(data, self.InfoList[i].GetLength(), self.InfoList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                State:%d,
+                                Energy:%d,
+                                Count:%d,
+                                InfoList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.State,
+                                self.Energy,
+                                self.Count,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagMCFairyDomainInfo=tagMCFairyDomainInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCFairyDomainInfo.Head.Cmd,m_NAtagMCFairyDomainInfo.Head.SubCmd))] = m_NAtagMCFairyDomainInfo
+
+
+#------------------------------------------------------
 # A3 16 仙盟活跃信息通知 #tagMCFamilyActivityInfo
 
 class  tagMCFamilyActionCnt(Structure):
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
index 5ffca38..627f1c6 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
@@ -1427,7 +1427,8 @@
 DailyActionID_FamilyBoss1, # 仙盟BOSS第一场  22
 DailyActionID_FamilyBoss2, # 仙盟BOSS第二场  23
 DailyActionID_HorsePetBoss, # 骑宠BOSS  24
-) = range(1, 24 + 1)
+DailyActionID_FairyDomain, # 缥缈仙域  25
+) = range(1, 25 + 1)
 
 
 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
index 6167b17..b3ad929 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
@@ -1332,4 +1332,28 @@
 
 PacketCMD_1=0xA5
 PacketSubCMD_1=0xC5
-PacketCallFunc_1=OnEquipPartStarUp
\ No newline at end of file
+PacketCallFunc_1=OnEquipPartStarUp
+
+;日常活动
+[PlayerActivity]
+ScriptName = Player\PlayerActivity.py
+Writer = xdh
+Releaser = xdh
+RegType = 0
+RegisterPackCount = 1
+
+PacketCMD_1=0xA5
+PacketSubCMD_1=0x25
+PacketCallFunc_1=OnDailyActionBuyCnt
+
+;缥缈仙域
+[PlayerFairyDomain]
+ScriptName = Player\PlayerFairyDomain.py
+Writer = xdh
+Releaser = xdh
+RegType = 0
+RegisterPackCount = 1
+
+PacketCMD_1=0xA5
+PacketSubCMD_1=0x26
+PacketCallFunc_1=OnVisitFairyDomain
\ No newline at end of file
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index 3661e71..750ec3f 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -3719,6 +3719,8 @@
 Def_PDict_Activity_ExtraRealmPoint = "Activity_ExtraRealmPoint"  # 多倍活动额外获得的修行点
 # 每日活动
 Def_PDict_DailyActionDayTimes = "DailyActionDayTimes_%s"  # 每日活动今日完成次数 参数每日活动ID
+Def_PDict_DailyActionDayBuyTimes = "DADayBuyTimes_%s"  # 每日活动今日购买次数 参数每日活动ID
+Def_PDict_DailyActionDayItemTimes = "DADayItemTimes_%s"  # 每日活动今日物品增加次数 参数每日活动ID
 Def_PDict_DailyActionWeekTimes = "DailyActionWeekTimes_%s"  # 每日活动本周完成次数 参数每日活动ID
 #仙盟活跃
 Def_PDict_FamilyActivityFinishCnt = "FamilyActivityFinishCnt%s"  # 已完成次数
@@ -3840,7 +3842,12 @@
 #装备部位星数
 Def_PDict_EquipPartStar = "EQPartStar_%s" #装备部位星数 参数 装备背包格子索引
 
-
+#缥缈仙域
+Def_PDict_FairyDomainState = "FairyDomainState" #是否寻访中
+Def_PDict_FairyDomainEventState = "FairyDomainEventState%s" #单个事件状态1-未拜访  2-拜访中 3-已拜访   参数事件ID
+Def_PDict_FairyDomainEventID = "FairyDomainEventID%s" #事件ID 参数第n个事件
+Def_PDict_FairyDomainEnergy = "FairyDomainEnergy" #体力值
+Def_PDict_FairyDomainVisitCnt = "FairyDomainVisitCnt" #寻访总次数
 #-------------------------------------------------------------------------------
 #可以从07 41封包购买的背包类型,和对应字典{背包类型:[字典key, 默认格子数]}
 
@@ -4475,6 +4482,7 @@
 Def_Cost_LuckyTreasure, #幸运鉴宝
 Def_Cost_MysteryShopRefresh, # 神秘商店刷新
 Def_Cost_AuctionBid, # 拍卖行竞价
+Def_Cost_BuyDailyActionCnt, # 购买活动次数
 #-----------以下为暂时没用的,先不删除,如有新增消费点则放在这些之前------------
 Def_Cost_RefreshArrestTask, # 刷新悬赏任务
 Def_Cost_OffLineExp, # 兑换离线经验
@@ -4487,7 +4495,7 @@
 Def_Cost_Trade, # 交易
 Def_Cost_Rename, # 改名
 Def_Cost_SkillLvUp, # 技能升级
-) = range(2000, 2000 + 56)
+) = range(2000, 2000 + 57)
 
 Def_Cost_Reason_SonKey = "reason_name_son" # 消费点原因子类说明key
 
@@ -4565,6 +4573,7 @@
 Def_Cost_LuckyTreasure:"LuckyTreasure",
 Def_Cost_MysteryShopRefresh:"MysteryShopRefresh",
 Def_Cost_AuctionBid:"AuctionBid",
+Def_Cost_BuyDailyActionCnt:"BuyDailyActionCnt",
 }
 ## -----------------------------------------------------
 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
index c6fc84e..ac28fe5 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
@@ -7998,6 +7998,62 @@
 
 
 #------------------------------------------------------
+# A5 25 购买日常活动次数 #tagCMBuyDailyActionCnt
+
+class  tagCMBuyDailyActionCnt(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("ActionID", c_int),    # ID
+                  ("AddType", c_ubyte),    # 0-花仙玉 1-用物品
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xA5
+        self.SubCmd = 0x25
+        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 = 0xA5
+        self.SubCmd = 0x25
+        self.ActionID = 0
+        self.AddType = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagCMBuyDailyActionCnt)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// A5 25 购买日常活动次数 //tagCMBuyDailyActionCnt:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                ActionID:%d,
+                                AddType:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.ActionID,
+                                self.AddType
+                                )
+        return DumpString
+
+
+m_NAtagCMBuyDailyActionCnt=tagCMBuyDailyActionCnt()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMBuyDailyActionCnt.Cmd,m_NAtagCMBuyDailyActionCnt.SubCmd))] = m_NAtagCMBuyDailyActionCnt
+
+
+#------------------------------------------------------
 #A5 75 购买副本进入次数#tagCMBuyEnterCount
 
 class  tagCMBuyEnterCount(Structure):
@@ -11074,6 +11130,58 @@
 
 
 #------------------------------------------------------
+# A5 26 寻访仙域 #tagCMVisitFairyDomain
+
+class  tagCMVisitFairyDomain(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("Type", c_ubyte),    #0-开始寻访 1-结束寻访
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xA5
+        self.SubCmd = 0x26
+        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 = 0xA5
+        self.SubCmd = 0x26
+        self.Type = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagCMVisitFairyDomain)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// A5 26 寻访仙域 //tagCMVisitFairyDomain:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                Type:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.Type
+                                )
+        return DumpString
+
+
+m_NAtagCMVisitFairyDomain=tagCMVisitFairyDomain()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMVisitFairyDomain.Cmd,m_NAtagCMVisitFairyDomain.SubCmd))] = m_NAtagCMVisitFairyDomain
+
+
+#------------------------------------------------------
 # A5 1D 法宝佩戴 #tagCMWearMagicWeapon
 
 class  tagCMWearMagicWeapon(Structure):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
index c27ff9e..06afc43 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -13019,6 +13019,8 @@
     _fields_ = [
                   ("ActionID", c_int),    # ID
                   ("DayFinishCnt", c_ushort),    # 今日已完成次数
+                  ("DayBuyTimes", c_ubyte),    # 今日购买次数
+                  ("DayItemTimes", c_ubyte),    # 今日物品增加次数
                   ("WeekFinishCnt", c_int),    # 本周已完成次数
                   ]
 
@@ -13034,6 +13036,8 @@
     def Clear(self):
         self.ActionID = 0
         self.DayFinishCnt = 0
+        self.DayBuyTimes = 0
+        self.DayItemTimes = 0
         self.WeekFinishCnt = 0
         return
 
@@ -13047,11 +13051,15 @@
         DumpString = '''// A3 15 日常活动次数通知 //tagMCDailyActionCnt:
                                 ActionID:%d,
                                 DayFinishCnt:%d,
+                                DayBuyTimes:%d,
+                                DayItemTimes:%d,
                                 WeekFinishCnt:%d
                                 '''\
                                 %(
                                 self.ActionID,
                                 self.DayFinishCnt,
+                                self.DayBuyTimes,
+                                self.DayItemTimes,
                                 self.WeekFinishCnt
                                 )
         return DumpString
@@ -13740,6 +13748,128 @@
 
 
 #------------------------------------------------------
+# A3 06 缥缈仙域信息 #tagMCFairyDomainInfo
+
+class  tagMCFairyDomainEvent(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("EventID", c_ushort),    #事件ID
+                  ("EventState", c_ubyte),    #事件状态 1-可拜访 2-拜访中 3-已拜访
+                  ]
+
+    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.EventID = 0
+        self.EventState = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCFairyDomainEvent)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// A3 06 缥缈仙域信息 //tagMCFairyDomainInfo:
+                                EventID:%d,
+                                EventState:%d
+                                '''\
+                                %(
+                                self.EventID,
+                                self.EventState
+                                )
+        return DumpString
+
+
+class  tagMCFairyDomainInfo(Structure):
+    Head = tagHead()
+    State = 0    #(BYTE State)//是否寻访中
+    Energy = 0    #(WORD Energy)//体力
+    Count = 0    #(BYTE Count)// 信息个数
+    InfoList = list()    #(vector<tagMCFairyDomainEvent> InfoList)// 信息列表
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xA3
+        self.Head.SubCmd = 0x06
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.State,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.Energy,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.Count):
+            temInfoList = tagMCFairyDomainEvent()
+            _pos = temInfoList.ReadData(_lpData, _pos)
+            self.InfoList.append(temInfoList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xA3
+        self.Head.SubCmd = 0x06
+        self.State = 0
+        self.Energy = 0
+        self.Count = 0
+        self.InfoList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 1
+        length += 2
+        length += 1
+        for i in range(self.Count):
+            length += self.InfoList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.State)
+        data = CommFunc.WriteWORD(data, self.Energy)
+        data = CommFunc.WriteBYTE(data, self.Count)
+        for i in range(self.Count):
+            data = CommFunc.WriteString(data, self.InfoList[i].GetLength(), self.InfoList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                State:%d,
+                                Energy:%d,
+                                Count:%d,
+                                InfoList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.State,
+                                self.Energy,
+                                self.Count,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagMCFairyDomainInfo=tagMCFairyDomainInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCFairyDomainInfo.Head.Cmd,m_NAtagMCFairyDomainInfo.Head.SubCmd))] = m_NAtagMCFairyDomainInfo
+
+
+#------------------------------------------------------
 # A3 16 仙盟活跃信息通知 #tagMCFamilyActivityInfo
 
 class  tagMCFamilyActionCnt(Structure):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_HorsePetBoss.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_HorsePetBoss.py
index b009ff5..ba16d96 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_HorsePetBoss.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_HorsePetBoss.py
@@ -173,7 +173,7 @@
     gameWorld.SetGameWorldDict(FBDict_StartTick % lineID, 0)
     gameWorld.SetGameWorldDict(FBDict_Speed % lineID, 0)
     gameWorld.SetGameWorldDict(FBDict_RemainHP % lineID, 0)
-    
+    PyGameData.g_horsePetBossPlayerHurtDict[lineID] = {}
     gameWorld.SetPropertyID(0)
     return
 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
index 6eb9f28..42ada9e 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -501,6 +501,10 @@
                 "DailyAction":(
                         ("DWORD", "DailyID", 1),
                         ("DWORD", "DayTimes", 0),
+                        ("DWORD", "DayBuyTimes", 0),
+                        ("DWORD", "BuyNeedMoney", 0),
+                        ("DWORD", "DayItemAddTimes", 0),
+                        ("DWORD", "DayItemID", 0),
                         ("BYTE", "DayResetType", 0),
                         ("DWORD", "WeekTimes", 0),
                         ("BYTE", "WeekResetType", 0),
@@ -1375,6 +1379,16 @@
                         ("list", "Rank", 0),
                         ("list", "Award1", 0),
                         ("dict", "Award2", 0),
+                        ),
+
+                "FairyDomain":(
+                        ("WORD", "ID", 1),
+                        ("BYTE", "EventType", 0),
+                        ("DWORD", "MapID", 0),
+                        ("BYTE", "LineID", 0),
+                        ("BYTE", "CostEnergy", 0),
+                        ("BYTE", "NeedAlchemyLV", 0),
+                        ("DWORD", "Weight", 0),
                         ),
                 }
 
@@ -2356,6 +2370,10 @@
     def __init__(self):
         self.DailyID = 0
         self.DayTimes = 0
+        self.DayBuyTimes = 0
+        self.BuyNeedMoney = 0
+        self.DayItemAddTimes = 0
+        self.DayItemID = 0
         self.DayResetType = 0
         self.WeekTimes = 0
         self.WeekResetType = 0
@@ -2363,6 +2381,10 @@
         
     def GetDailyID(self): return self.DailyID # 活动ID
     def GetDayTimes(self): return self.DayTimes # 每日次数, 0为不限制
+    def GetDayBuyTimes(self): return self.DayBuyTimes # 每日可购买次数
+    def GetBuyNeedMoney(self): return self.BuyNeedMoney # 购买次数需要仙玉
+    def GetDayItemAddTimes(self): return self.DayItemAddTimes # 每日可用物品增加次数
+    def GetDayItemID(self): return self.DayItemID # 增加次数的物品ID
     def GetDayResetType(self): return self.DayResetType # 每日次数重置类型; 0-不重置,1-0点,2-5点
     def GetWeekTimes(self): return self.WeekTimes # 每周次数, 0为不限制
     def GetWeekResetType(self): return self.WeekResetType # 每周次数重置类型; 0-不重置,1-0点,2-5点
@@ -4208,6 +4230,27 @@
     def GetRank(self): return self.Rank # 排名
     def GetAward1(self): return self.Award1 # 奖励 [[独立概率万分率,[物品ID,数量,是否拍品]],..]
     def GetAward2(self): return self.Award2 # 饼图奖励{随机次数:[(概率,[物品ID,数量,是否拍品]),..]}
+
+# 缥缈仙域表
+class IPY_FairyDomain():
+    
+    def __init__(self):
+        self.ID = 0
+        self.EventType = 0
+        self.MapID = 0
+        self.LineID = 0
+        self.CostEnergy = 0
+        self.NeedAlchemyLV = 0
+        self.Weight = 0
+        return
+        
+    def GetID(self): return self.ID # 事件编号
+    def GetEventType(self): return self.EventType # 事件类型
+    def GetMapID(self): return self.MapID # 副本id
+    def GetLineID(self): return self.LineID # 副本线路id
+    def GetCostEnergy(self): return self.CostEnergy # 消耗体力
+    def GetNeedAlchemyLV(self): return self.NeedAlchemyLV # 出现的炼丹等级要求
+    def GetWeight(self): return self.Weight # 权重
 
 
 def Log(msg, playerID=0, par=0):
@@ -4513,6 +4556,8 @@
         self.ipyItemWashMaxLen = len(self.ipyItemWashMaxCache)
         self.ipyHorsePetBossAwardCache = self.__LoadFileData("HorsePetBossAward", IPY_HorsePetBossAward)
         self.ipyHorsePetBossAwardLen = len(self.ipyHorsePetBossAwardCache)
+        self.ipyFairyDomainCache = self.__LoadFileData("FairyDomain", IPY_FairyDomain)
+        self.ipyFairyDomainLen = len(self.ipyFairyDomainCache)
         Log("IPY_FuncConfig count=%s" % len(self.ipyFuncConfigDict))
         Log("IPY_DataMgr InitOK!")
         return
@@ -4959,6 +5004,8 @@
     def GetItemWashMaxByIndex(self, index): return self.ipyItemWashMaxCache[index]
     def GetHorsePetBossAwardCount(self): return self.ipyHorsePetBossAwardLen
     def GetHorsePetBossAwardByIndex(self, index): return self.ipyHorsePetBossAwardCache[index]
+    def GetFairyDomainCount(self): return self.ipyFairyDomainLen
+    def GetFairyDomainByIndex(self, index): return self.ipyFairyDomainCache[index]
 
 IPYData = IPY_DataMgr()
 def IPY_Data(): return IPYData
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 06c7130..9c942fa 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -70,6 +70,7 @@
 import PlayerEquipDecompose
 import PlayerGreatMaster
 import PlayerGatherSoul
+import PlayerFairyDomain
 import PlayerCrossRealmPK
 import GameFuncComm
 import PlayerMagicWeapon
@@ -744,6 +745,9 @@
     FBHelpBattle.DoPlayerLogin(curPlayer)
     # 聚魂
     PlayerGatherSoul.PlayerLogin(curPlayer)
+    #缥缈仙域
+    PlayerFairyDomain.OnLogin(curPlayer)
+    
     curPlayer.SetState(0)   # 脱机挂恢复为正常上线
     curPlayer.SetFacePic(0) # 通知数据库是否保存还是下线,做一次恢复,1为保存 0为正常下线
     tjgTime = PlayerTJG.GetTJGTime(curPlayer)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActivity.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActivity.py
index 3c2f580..e61e075 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActivity.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActivity.py
@@ -29,13 +29,11 @@
 import PyGameData
 import GameFuncComm
 
-
 #关联类型
 (
-RelatedType_1, # 1关联日常活动表
-RelatedType_2, # 2关联副本总表
+RelatedType_1,  # 1关联日常活动表
+RelatedType_2,  # 2关联副本总表
 ) = range(1, 3)
-
 
 
 def OnWeek(curPlayer, onWeekType):
@@ -49,7 +47,7 @@
         # 重置类型不同的不处理
         if ipyData.GetWeekResetType() != onWeekType:
             continue
-        key = ChConfig.Def_PDict_DailyActionWeekTimes%ipyData.GetDailyID()
+        key = ChConfig.Def_PDict_DailyActionWeekTimes % ipyData.GetDailyID()
         __SetPDictValue(curPlayer, key, 0)
     
         actionIDInfo.append(ipyData.GetDailyID())
@@ -72,7 +70,7 @@
             ipyData = ipyDataMgr.GetDailyQuestByIndex(i)
             
             key = ChConfig.Def_PDict_Activity_FinishCnt % ipyData.GetID()
-            curPBCnt = __GetPDictValue(curPlayer, key) #单次进度值
+            curPBCnt = __GetPDictValue(curPlayer, key)  #单次进度值
             if curPBCnt:
                 __SetPDictValue(curPlayer, key, 0)
         #总活跃度重置
@@ -98,42 +96,47 @@
     actionIDInfo = []
     for i in xrange(ipyDataMgr.GetDailyActionCount()):
         ipyData = ipyDataMgr.GetDailyActionByIndex(i)
-        dayTimesLimit = GetMaxDayTimes(ipyData)#ipyData.GetDayTimes()
+        dayTimesLimit = GetMaxDayTimes(ipyData)  #ipyData.GetDayTimes()
         if not dayTimesLimit:
             continue
         # 重置类型不同的不处理
         if ipyData.GetDayResetType() != onEventType:
             continue
-        key = ChConfig.Def_PDict_DailyActionDayTimes%ipyData.GetDailyID()
-        __SetPDictValue(curPlayer, key, 0)
+        dailyID = ipyData.GetDailyID()
+        __SetPDictValue(curPlayer, ChConfig.Def_PDict_DailyActionDayTimes % dailyID, 0)
+        __SetPDictValue(curPlayer, ChConfig.Def_PDict_DailyActionDayBuyTimes % dailyID, 0)
+        __SetPDictValue(curPlayer, ChConfig.Def_PDict_DailyActionDayItemTimes % dailyID, 0)
+        
         actionIDInfo.append(ipyData.GetDailyID())
     if actionIDInfo:
         SyncDailyActionInfo(curPlayer, actionIDInfo)
     return
 
+
 def SendDayActionMail(curPlayer):
     ##发送每日活动邮件
-    if curPlayer.GetLV()>= IpyGameDataPY.GetFuncCfg('DailyQuestMailLvLimit'):
+    if curPlayer.GetLV() >= IpyGameDataPY.GetFuncCfg('DailyQuestMailLvLimit'):
         PlayerControl.SendMailByKey('TodayDailyTask', [curPlayer.GetID()], [])
     return
 
 
 #重新计算奖励阶段
 def __CalcAwardStage(curPlayer):
-    realmLV= curPlayer.GetOfficialRank()
+    realmLV = curPlayer.GetOfficialRank()
     ipyData = IpyGameDataPY.IPY_Data().GetDailyLivenessRewardByIndex(0)
     if not ipyData:
         return
     stageLVList = ipyData.GetStageLV()
     curStage = 0
     for i, lv in enumerate(stageLVList):
-        if realmLV <lv:
+        if realmLV < lv:
             break
         if realmLV >= lv:
             curStage = i
     __SetPDictValue(curPlayer, ChConfig.Def_PDict_Activity_AwardStage, curStage)
-    GameWorld.DebugLog('    重新计算活跃奖励阶段 curStage=%s,realmLV=%s'%(curStage, realmLV))
+    GameWorld.DebugLog('    重新计算活跃奖励阶段 curStage=%s,realmLV=%s' % (curStage, realmLV))
     return
+
 
 ## OnLogin
 #  @param curPlayer 玩家实例
@@ -153,6 +156,7 @@
 #  @return
 def __GetPDictValue(curPlayer, key, defaultValue=0):
     return curPlayer.NomalDictGetProperty(key, defaultValue)
+
 
 ## 设置活跃度玩家数据库字典信息值
 #  @param curPlayer 玩家实例
@@ -180,7 +184,6 @@
     return
 
 
-
 ## 摸NPC获得活跃度
 #  @param atkObj
 #  @param curNPC 
@@ -201,6 +204,7 @@
         
     return
 
+
 ## 增加完成活跃度次数
 #  @param curPlayer 玩家实例
 #  @param activityNum 活跃度编号 
@@ -218,15 +222,15 @@
     onceActivityTime = dailyQuestData.GetOnceActivityTime()
     if not onceActivity:
         return
-    if maxActiveValue and finishCnt > maxActiveValue/onceActivity*onceActivityTime:
+    if maxActiveValue and finishCnt > maxActiveValue / onceActivity * onceActivityTime:
         #GameWorld.DebugLog("活跃度可完成次数已达到上限,activityNum=%s" % (activityNum))
         return
     
     key = ChConfig.Def_PDict_Activity_FinishCnt % activityNum
-    curPBCnt = __GetPDictValue(curPlayer, key) #单次进度值
+    curPBCnt = __GetPDictValue(curPlayer, key)  #单次进度值
     
-    addValue = (addCnt+curPBCnt)/onceActivityTime * onceActivity #增加的活跃度
-    addPbCnt = (addCnt+curPBCnt) % onceActivityTime
+    addValue = (addCnt + curPBCnt) / onceActivityTime * onceActivity  #增加的活跃度
+    addPbCnt = (addCnt + curPBCnt) % onceActivityTime
     
     __SetPDictValue(curPlayer, key, addPbCnt)
     
@@ -235,11 +239,11 @@
     if addValue:
         multiple, extraPointLimit = __GetActionAddPer(curPlayer)
         curExtraPoint = __GetPDictValue(curPlayer, ChConfig.Def_PDict_Activity_ExtraRealmPoint)
-        addExtraPoint = max(0, min(addValue*(multiple-1),extraPointLimit-curExtraPoint)) if extraPointLimit else addValue*(multiple-1)
-        __SetPDictValue(curPlayer, ChConfig.Def_PDict_Activity_ExtraRealmPoint, curExtraPoint+addExtraPoint)
+        addExtraPoint = max(0, min(addValue * (multiple - 1), extraPointLimit - curExtraPoint)) if extraPointLimit else addValue * (multiple - 1)
+        __SetPDictValue(curPlayer, ChConfig.Def_PDict_Activity_ExtraRealmPoint, curExtraPoint + addExtraPoint)
         addValue = addValue + addExtraPoint
         curTotalPoint = __GetPDictValue(curPlayer, ChConfig.Def_PDict_Activity_TotalPoint)
-        __SetPDictValue(curPlayer, ChConfig.Def_PDict_Activity_TotalPoint, curTotalPoint+addValue)
+        __SetPDictValue(curPlayer, ChConfig.Def_PDict_Activity_TotalPoint, curTotalPoint + addValue)
         #realmPoint = __GetPDictValue(curPlayer, ChConfig.Def_PDict_Activity_RealmPoint)
         #__SetPDictValue(curPlayer, ChConfig.Def_PDict_Activity_RealmPoint, realmPoint+addValue)
         SyncDailyActivityInfo(curPlayer)
@@ -248,9 +252,10 @@
                            % (activityNum, addPbCnt, addValue, multiple, addExtraPoint, curExtraPoint), curPlayer.GetPlayerID())
     return
 
+
 def __GetActionAddPer(curPlayer):
-    multiple, extraPointLimit = 1, 0 #倍数、额外可获得修行点上限
-    actRealmPointInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_RealmPoint, {})# 多倍修行点活动
+    multiple, extraPointLimit = 1, 0  #倍数、额外可获得修行点上限
+    actRealmPointInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_RealmPoint, {})  # 多倍修行点活动
     if not actRealmPointInfo:
         return multiple, extraPointLimit
     if not actRealmPointInfo.get(ShareDefine.ActKey_State):
@@ -261,6 +266,7 @@
     if curPlayer.GetLV() < actRealmPointIpyData.GetLVLimit():
         return multiple, extraPointLimit
     return actRealmPointIpyData.GetMultiple(), actRealmPointIpyData.GetPointLimit()
+
 
 ## 同步活跃度信息
 #  @param curPlayer
@@ -276,7 +282,6 @@
     sendPack.ExtraPoint = __GetPDictValue(curPlayer, ChConfig.Def_PDict_Activity_ExtraRealmPoint)
     NetPackCommon.SendFakePack(curPlayer, sendPack)
     return
-
 
 
 ## 领取活跃度奖励
@@ -312,7 +317,7 @@
     itemIDList = ipyData.GetItemID()
     itemCntList = ipyData.GetItemCount()
     itemIsBindList = ipyData.GetItemBind()
-    if awardStage >=len(itemIDList) or awardStage >= len(itemCntList) or awardStage >= len(itemIsBindList):
+    if awardStage >= len(itemIDList) or awardStage >= len(itemCntList) or awardStage >= len(itemIsBindList):
         return
 
     itemID = itemIDList[awardStage]
@@ -333,10 +338,9 @@
     SyncDailyActivityInfo(curPlayer)
     GameWorld.DebugLog("领取活跃度奖励OK!awardStage=%s, index=%s,needActivity=%s,totalActivity=%s,awardRecord=%s" 
                        % (awardStage, awardIndex, needActivity, totalActivity, updAwardRecord))
-
-    
     
     return
+
 
 def GetRealmPointAward(curPlayer):
     #领取活跃修行点
@@ -350,14 +354,16 @@
     SyncDailyActivityInfo(curPlayer)
     return
 
+
 def GetActivityNum(relatedType, relatedID):
     ## 获取日常任务ID(活跃ID)
-    ipyData = IpyGameDataPY.GetIpyGameDataByCondition('DailyQuest', {"RelatedID":relatedID,"RelatedType":relatedType}, False, False)
+    ipyData = IpyGameDataPY.GetIpyGameDataByCondition('DailyQuest', {"RelatedID":relatedID, "RelatedType":relatedType}, False, False)
     if not ipyData:
         return 0
     return ipyData.GetID()
 
 #########################################日常活动###########################################
+
 
 def AddDailyActionFinishCnt(curPlayer, dailyID, addCnt=1):
     ##增加日常活动完成次数
@@ -375,7 +381,7 @@
             GameWorld.DebugLog("日常活动未开启!dailyID=%s" % dailyID)
             return
     
-    dayTimesLimit = GetMaxDayTimes(ipyData)#ipyData.GetDayTimes()
+    dayTimesLimit = GetMaxDayTimes(ipyData)  #ipyData.GetDayTimes()
     weekTimesLimit = ipyData.GetWeekTimes()
     if not dayTimesLimit and not weekTimesLimit:
         return
@@ -389,24 +395,26 @@
         
     updDayTimes = 0
     if dayTimesLimit:
-        key = ChConfig.Def_PDict_DailyActionDayTimes%dailyID
+        key = ChConfig.Def_PDict_DailyActionDayTimes % dailyID
         curDayTimes = curPlayer.NomalDictGetProperty(key)
-        if not unLimitCnt and curDayTimes >= dayTimesLimit:
+        curDayBuyTimes = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DailyActionDayBuyTimes % dailyID)
+        curDayItemTimes = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DailyActionDayItemTimes % dailyID)
+        if not unLimitCnt and curDayTimes >= dayTimesLimit + curDayBuyTimes + curDayItemTimes:
             return
-        updDayTimes =  curDayTimes+addCnt if unLimitCnt else min(dayTimesLimit, curDayTimes+addCnt)
+        updDayTimes = curDayTimes + addCnt if unLimitCnt else min(dayTimesLimit + curDayBuyTimes + curDayItemTimes, curDayTimes + addCnt)
         addCnt = updDayTimes - curDayTimes
         PlayerControl.NomalDictSetProperty(curPlayer, key, updDayTimes)
-        GameWorld.DebugLog('增加日常活动完成次数 dailyID=%s, curDayTimes=%s, updDayTimes=%s'%(dailyID, curDayTimes, updDayTimes))
+        GameWorld.DebugLog('增加日常活动完成次数 dailyID=%s, curDayTimes=%s, updDayTimes=%s' % (dailyID, curDayTimes, updDayTimes))
     updWeekTimes = 0
     if weekTimesLimit:
-        key = ChConfig.Def_PDict_DailyActionWeekTimes%dailyID
+        key = ChConfig.Def_PDict_DailyActionWeekTimes % dailyID
         curWeekTimes = curPlayer.NomalDictGetProperty(key)
         if not unLimitCnt and curWeekTimes >= weekTimesLimit:
             return
-        updWeekTimes =  curWeekTimes+addCnt if unLimitCnt else min(weekTimesLimit, curWeekTimes+addCnt)
+        updWeekTimes = curWeekTimes + addCnt if unLimitCnt else min(weekTimesLimit, curWeekTimes + addCnt)
         addCnt = updWeekTimes - curWeekTimes
         PlayerControl.NomalDictSetProperty(curPlayer, key, updWeekTimes)
-        GameWorld.DebugLog('增加日常活动完成次数 dailyID=%s, curWeekTimes=%s, updWeekTimes=%s'%(dailyID, curWeekTimes, updWeekTimes))
+        GameWorld.DebugLog('增加日常活动完成次数 dailyID=%s, curWeekTimes=%s, updWeekTimes=%s' % (dailyID, curWeekTimes, updWeekTimes))
 
     SyncDailyActionInfo(curPlayer, [dailyID])
     
@@ -416,14 +424,24 @@
         AddActivityFinishCnt(curPlayer, activityNum, updTimes, addCnt)
     return True
 
+
 def GetDailyActionFinishCnt(curPlayer, dailyID):
-    key = ChConfig.Def_PDict_DailyActionDayTimes%dailyID
+    key = ChConfig.Def_PDict_DailyActionDayTimes % dailyID
     curDayTimes = __GetPDictValue(curPlayer, key)
     ipyData = IpyGameDataPY.GetIpyGameData('DailyAction', dailyID)
     if not ipyData:
         return 0, 0
-    dayTimesLimit = GetMaxDayTimes(ipyData)#ipyData.GetDayTimes()
+    dayTimesLimit = GetMaxDayTimes(ipyData)  #ipyData.GetDayTimes()
     return curDayTimes, dayTimesLimit
+
+def GetDailyActionrRemainCnt(curPlayer, dailyID):
+    ##获取活动剩余次数
+    curDayTimes = __GetPDictValue(curPlayer, ChConfig.Def_PDict_DailyActionDayTimes % dailyID)
+    curDayBuyTimes = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DailyActionDayBuyTimes % dailyID)
+    curDayItemTimes = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DailyActionDayItemTimes % dailyID)
+    ipyData = IpyGameDataPY.GetIpyGameData('DailyAction', dailyID)
+    dayTimesLimit = GetMaxDayTimes(ipyData)
+    return max(0, dayTimesLimit+curDayBuyTimes+curDayItemTimes-curDayTimes)
 
 def GetMaxDayTimes(ipyData):
     dayTimesLimit = ipyData.GetDayTimes()
@@ -431,11 +449,67 @@
         dayTimesLimit += IpyGameDataPY.GetFuncCfg('RuneTowerSweepBuy')
     return dayTimesLimit
 
+
+#// A5 25 购买日常活动次数 #tagCMBuyDailyActionCnt
+#
+#struct    tagCMBuyDailyActionCnt
+#{
+#    tagHead        Head;
+#    DWORD    ActionID;    // ID
+#    BYTE    AddType;    // 0-花仙玉 1-用物品
+#};
+def OnDailyActionBuyCnt(index, clientData, tick):
+    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+    dailyID = clientData.ActionID
+    addType = clientData.AddType  #0花仙玉 1使用物品
+    ipyData = IpyGameDataPY.GetIpyGameData('DailyAction', dailyID)
+    if not ipyData:
+        return
+    curDayTimes = __GetPDictValue(curPlayer, ChConfig.Def_PDict_DailyActionDayTimes % dailyID)
+    curDayBuyTimes = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DailyActionDayBuyTimes % dailyID)
+    curDayItemTimes = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DailyActionDayItemTimes % dailyID)
+    if curDayBuyTimes + curDayItemTimes - curDayTimes >= 0:
+        GameWorld.DebugLog('剩余次数已达上限,不可增加!')
+        return
+    
+    if addType == 0:
+        dayBuyTimesLimit = ipyData.GetDayBuyTimes()
+        buyNeedMoney = ipyData.GetBuyNeedMoney()
+        if not dayBuyTimesLimit or not buyNeedMoney:
+            return
+        if curDayBuyTimes >= dayBuyTimesLimit:
+            GameWorld.DebugLog('今日购买次数已达上限,不可增加!')
+            return
+        if not PlayerControl.PayMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Money, buyNeedMoney, ChConfig.Def_Cost_BuyDailyActionCnt, {'dailyID':dailyID, 'curDayBuyTimes':curDayBuyTimes}):
+            return
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_DailyActionDayBuyTimes % dailyID, curDayBuyTimes + 1)
+        
+    elif addType == 1:
+        dayItemAddTimesLimit = ipyData.GetDayItemAddTimes()
+        dayItemID = ipyData.GetDayItemID()
+        if not dayItemAddTimesLimit or not dayItemID:
+            return
+        if curDayItemTimes >= dayItemAddTimesLimit:
+            GameWorld.DebugLog('今日使用物品增加次数已达上限,不可增加!')
+            return
+        itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
+        enough, indexList, hasBind, lackCnt = ItemCommon.GetItem_FromPack_ByID_ExEx(dayItemID, itemPack, 1)
+        if not enough:
+            return
+        ItemCommon.ReduceItem(curPlayer, itemPack, indexList, 1, False, "DailyActionCnt")
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_DailyActionDayItemTimes % dailyID, curDayItemTimes + 1)
+
+    else:
+        return
+    SyncDailyActionInfo(curPlayer, [dailyID])
+    return
+
+
 ## 同步活跃度信息
 #  @param curPlayer
 #  @param syncNum 默认-1时全部同步
 #  @return None
-def SyncDailyActionInfo(curPlayer, syncNumList= []):
+def SyncDailyActionInfo(curPlayer, syncNumList=[]):
     sendPack = ChPyNetSendPack.tagMCDailyActionCnt()
     sendPack.Clear()
     sendPack.ActionInfo = []
@@ -446,12 +520,15 @@
         activityInfo.Clear()
         activityInfo.ActionID = activityNum
         activityInfo.DayFinishCnt = __GetPDictValue(curPlayer, ChConfig.Def_PDict_DailyActionDayTimes % activityNum)
+        activityInfo.DayBuyTimes = __GetPDictValue(curPlayer, ChConfig.Def_PDict_DailyActionDayBuyTimes % activityNum)
+        activityInfo.DayItemTimes = __GetPDictValue(curPlayer, ChConfig.Def_PDict_DailyActionDayItemTimes % activityNum)
         activityInfo.WeekFinishCnt = __GetPDictValue(curPlayer, ChConfig.Def_PDict_DailyActionWeekTimes % activityNum)
         sendPack.ActionInfo.append(activityInfo)
     
     sendPack.Count = len(sendPack.ActionInfo)
     NetPackCommon.SendFakePack(curPlayer, sendPack)
     return
+
 
 ##################################副本类增加活跃##########################################
 ## 参加副本获得活跃度
@@ -462,4 +539,4 @@
     activityNum = GetActivityNum(RelatedType_2, mapID)
     if activityNum: 
         AddActivityFinishCnt(curPlayer, activityNum, curDayTimes, addCount)
-    return
\ No newline at end of file
+    return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFairyDomain.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFairyDomain.py
new file mode 100644
index 0000000..3142c2f
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFairyDomain.py
@@ -0,0 +1,217 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+#-------------------------------------------------------------------------------
+#
+##@package Player.PlayerFairyDomain
+#
+# @todo:缥缈仙域
+# @author xdh
+# @date 2019-04-04
+# @version 1.0
+#
+# 详细描述: 缥缈仙域
+#---------------------------------------------------------------------
+#"""Version = 2019-04-04"""
+#---------------------------------------------------------------------
+
+import ChConfig
+import ChPyNetSendPack
+import NetPackCommon
+import ShareDefine
+import GameWorld
+import PlayerControl
+import IpyGameDataPY
+import PlayerActivity
+
+import copy
+
+#0-奇遇 1-宝藏 2-仙草 3-妖王 4-灵草
+(
+FDEventType0,
+FDEventType1,
+FDEventType2,
+FDEventType3,
+FDEventType4,
+) = range(5)
+
+(
+FDEventState_No, #不可拜访0
+FDEventState_CanVisit, #可拜访1
+FDEventState_Visiting, #拜访中2
+FDEventState_Visited, #已拜访3
+) = range(4)
+
+
+def OnLogin(curPlayer):
+    NotifyVisitFairyDomainInfo(curPlayer)
+    return
+
+
+#// A5 26 寻访仙域 #tagCMVisitFairyDomain
+#
+#struct    tagCMVisitFairyDomain
+#{
+#    tagHead        Head;
+#    BYTE        Type;    //0-开始寻访 1-结束寻访
+#};
+def OnVisitFairyDomain(index, clientData, tick):
+    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+    dailyID = ShareDefine.DailyActionID_FairyDomain
+    hasOpen = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_DailyActionState % dailyID)
+    if not hasOpen:
+        GameWorld.DebugLog("    寻访仙域活动未开启!")
+        return
+    otherCntRateList = IpyGameDataPY.GetFuncEvalCfg('ImmortalDomain', 2)
+    maxEventCnt = max([info[1] for info in otherCntRateList]) + 1  #最大可出现事件个数
+    
+    if clientData.Type == 1:  #结束寻访
+        if not curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainState):
+            GameWorld.DebugLog("    未开始寻访仙域, 无法结束")
+            return
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyDomainState, 0)
+        for i in xrange(maxEventCnt):
+            fdEventID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainEventID % i)
+            if fdEventID:
+                PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyDomainEventID%i, 0)
+                PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyDomainEventState%fdEventID, 0)
+                
+        NotifyVisitFairyDomainInfo(curPlayer)
+        return
+    
+    #是否寻访中
+    if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainState):
+        GameWorld.DebugLog("    正在寻访仙域中!请先退出寻访")
+        return
+    
+    if not PlayerActivity.AddDailyActionFinishCnt(curPlayer, dailyID):
+        GameWorld.DebugLog("    寻访仙域次数不足!")
+        return
+    
+    #随机事件 重置事件状态
+    visitCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainVisitCnt)
+    specialVisitDict = IpyGameDataPY.GetFuncEvalCfg('ImmortalDomain', 5, {})
+    maxSpecialCnt = max(specialVisitDict) if specialVisitDict else 0
+    if visitCnt + 1 in specialVisitDict:
+        fdEventIDList = specialVisitDict[visitCnt + 1]
+    else:
+        fdEventTypeDict = {}
+        #先随机奇遇事件
+        fortuitousEventRate = IpyGameDataPY.GetFuncCfg('ImmortalDomain')
+        if GameWorld.CanHappen(fortuitousEventRate):
+            fdEventTypeDict[FDEventType0] = 1
+        
+        otherCnt = GameWorld.GetResultByRandomList(otherCntRateList, 0)
+        if otherCnt:
+            otherEventRateList = copy.deepcopy(IpyGameDataPY.GetFuncEvalCfg('ImmortalDomain', 3))
+            unRepeatTypeList = IpyGameDataPY.GetFuncEvalCfg('ImmortalDomain', 4)
+            for _ in xrange(otherCnt):
+                otherEventType = GameWorld.GetResultByRandomList(otherEventRateList, 0)
+                if not otherEventType:
+                    continue
+                if otherEventType in unRepeatTypeList:
+                    for index, info in enumerate(otherEventRateList):
+                        if otherEventType == info[1]:
+                            otherEventRateList = GameWorld.ResetRiseList(otherEventRateList, index)
+                            break
+                fdEventTypeDict[otherEventType] = fdEventTypeDict.get(otherEventType, 0) + 1
+                    
+        fdEventIDList = []
+        for eventType, cnt in fdEventTypeDict.items():
+            fdEventIDList += __RandomFDEventByType(curPlayer, eventType, cnt)
+    if not fdEventIDList:
+        GameWorld.Log('寻访仙域, 没有随机出事件!!')
+        return
+    
+    if visitCnt < maxSpecialCnt:
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyDomainVisitCnt, visitCnt + 1)
+    #设置事件
+    for i in xrange(maxEventCnt):
+        fdEventID = fdEventIDList[i] if i < len(fdEventIDList) else 0
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyDomainEventID % i, fdEventID)
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyDomainEventState % fdEventID, FDEventState_CanVisit)
+    #设置寻访中
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyDomainState, 1)
+    #设置初始体力
+    initEnergy = IpyGameDataPY.GetFuncCfg('ImmortalDomainStrength')
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyDomainEnergy, initEnergy)
+    GameWorld.DebugLog('寻访仙域  随机结果 fdEventIDList=%s, visitCnt=%s' % (fdEventIDList, visitCnt))
+    #通知
+    NotifyVisitFairyDomainInfo(curPlayer, fdEventIDList)
+    return
+
+
+def __RandomFDEventByType(curPlayer, eventType, cnt):
+    ##根据事件类型随机事件
+    ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition('FairyDomain', {'EventType':eventType}, True)
+    if not ipyDataList:
+        return []
+    randomRateList = []
+    rate = 0
+    for ipyData in ipyDataList:
+        needAlchemyLV = ipyData.GetNeedAlchemyLV()
+        curAlchemyLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AlchemyLV)
+        if curAlchemyLV < needAlchemyLV - 1:
+            #丹炉等级不足
+            continue
+        rate += ipyData.GetWeight()
+        randomRateList.append([rate, ipyData.GetID()])
+    if not randomRateList:
+        GameWorld.DebugLog('    缥缈仙域刷新池 随机库获取错误 !eventType=%s' % eventType, curPlayer.GetID())
+        return []
+    randomResultList = GameWorld.GetResultByRandomListEx(randomRateList, cnt, [])
+        
+    return randomResultList
+
+
+def SetFairyDomainEventState(curPlayer, fdeventID, state):
+    ## 设置缥缈事件状态, return 是否成功
+    if state not in [FDEventState_Visiting, FDEventState_Visited]:  # 1-未拜访  2-拜访中 3-已拜访
+        GameWorld.Log('缥缈仙域事件状态设置错误,state=%s' % state)
+        return
+    curState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainEventState % fdeventID)
+    if state == FDEventState_Visiting:
+        if curState != FDEventState_CanVisit:
+            GameWorld.Log('缥缈仙域事件状态设置错误,fdeventID=%s, state=%s, curState=%s' % (fdeventID, state, curState))
+            return
+        ipyData = IpyGameDataPY.GetIpyGameData('FairyDomain', fdeventID)
+        if not ipyData:
+            return
+        costEnergy = ipyData.GetCostEnergy()
+        curEnergy = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainEnergy)
+        if curEnergy < costEnergy:
+            GameWorld.Log('缥缈仙域事件状态设置,体力不足!,fdeventID=%s, costEnergy=%s, curEnergy=%s' % (fdeventID, costEnergy, curEnergy))
+            return
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyDomainEnergy, curEnergy - costEnergy)
+    elif state == FDEventState_Visited:
+        if curState != FDEventState_Visiting:
+            GameWorld.Log('缥缈仙域事件状态设置错误,fdeventID=%s, state=%s, curState=%s' % (fdeventID, state, curState))
+            return
+        
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyDomainEventState % fdeventID, state)
+    NotifyVisitFairyDomainInfo(curPlayer, fdeventID)
+    return True
+
+
+def NotifyVisitFairyDomainInfo(curPlayer, fdEventList=[]):
+    if not fdEventList:
+        otherCntRateList = IpyGameDataPY.GetFuncEvalCfg('ImmortalDomain', 2)
+        maxEventCnt = max([info[1] for info in otherCntRateList]) + 1  #最大可出现事件个数
+        for i in xrange(maxEventCnt):
+            fdEventID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainEventID % i)
+            if fdEventID:
+                fdEventList.append(fdEventID)
+            
+    packData = ChPyNetSendPack.tagMCFairyDomainInfo()
+    packData.State = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainState)
+    packData.Energy = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainEnergy)
+    packData.InfoList = []
+    for fdeventID in fdEventList:
+        fdeventData = ChPyNetSendPack.tagMCFairyDomainEvent()
+        fdeventData.EventID = fdeventID
+        fdeventData.EventState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainEventState % fdeventID)
+        packData.InfoList.append(fdeventData)
+    packData.Count = len(packData.InfoList)
+    NetPackCommon.SendFakePack(curPlayer, packData)
+    return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
index 5ffca38..627f1c6 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -1427,7 +1427,8 @@
 DailyActionID_FamilyBoss1, # 仙盟BOSS第一场  22
 DailyActionID_FamilyBoss2, # 仙盟BOSS第二场  23
 DailyActionID_HorsePetBoss, # 骑宠BOSS  24
-) = range(1, 24 + 1)
+DailyActionID_FairyDomain, # 缥缈仙域  25
+) = range(1, 25 + 1)
 
 
 

--
Gitblit v1.8.0