From 7bd89df4994934b9a5810e6b62383e6773b8339b Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期四, 12 十月 2023 20:28:47 +0800
Subject: [PATCH] 9952 【BT0.1】【主干】仙盟修改(传功)

---
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamily.py                                                 |   93 +++++
 ServerPython/CoreServerGroup/GameServer/Script/PyGameData.py                                                          |    1 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py                            |  114 ++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini                                            |    6 
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py                                                  |    7 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py                                    |   60 +++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py                                |  320 +++++++++++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_FamilyParty.py |   91 -----
 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py                                                         |   60 +++
 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py                                                     |  320 +++++++++++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py                                       |    2 
 11 files changed, 981 insertions(+), 93 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
index 5e60744..cc8227f 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
@@ -13853,6 +13853,66 @@
 
 
 #------------------------------------------------------
+# A6 15 传功操作 #tagCMChuangongOP
+
+class  tagCMChuangongOP(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("OPType", c_ubyte),    # 操作类型:1-邀请;2-回应;3-领奖;
+                  ("PlayerID", c_int),    # 目标玩家ID;回应时为邀请方玩家ID
+                  ("OPData", c_ubyte),    # 操作数据,可选:回应时为是否同意
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xA6
+        self.SubCmd = 0x15
+        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 = 0xA6
+        self.SubCmd = 0x15
+        self.OPType = 0
+        self.PlayerID = 0
+        self.OPData = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagCMChuangongOP)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// A6 15 传功操作 //tagCMChuangongOP:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                OPType:%d,
+                                PlayerID:%d,
+                                OPData:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.OPType,
+                                self.PlayerID,
+                                self.OPData
+                                )
+        return DumpString
+
+
+m_NAtagCMChuangongOP=tagCMChuangongOP()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMChuangongOP.Cmd,m_NAtagCMChuangongOP.SubCmd))] = m_NAtagCMChuangongOP
+
+
+#------------------------------------------------------
 # A6 11 家族改名 #tagCMRenameFamily
 
 class  tagCMRenameFamily(Structure):
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
index 2ee07d9..d792422 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -985,6 +985,190 @@
 
 
 #------------------------------------------------------
+# A4 11 传功邀请信息 #tagGCChuangongInviteInfo
+
+class  tagGCChuangongInviteInfo(Structure):
+    Head = tagHead()
+    PlayerID = 0    #(DWORD PlayerID)// 发起邀请的玩家ID
+    NameLen = 0    #(BYTE NameLen)
+    Name = ""    #(String Name)// 发起邀请的玩家名,size = NameLen
+    LV = 0    #(WORD LV)// 玩家等级
+    Job = 0    #(BYTE Job)// 玩家职业
+    RealmLV = 0    #(WORD RealmLV)// 玩家境界等级
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xA4
+        self.Head.SubCmd = 0x11
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.NameLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.Name,_pos = CommFunc.ReadString(_lpData, _pos,self.NameLen)
+        self.LV,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.Job,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.RealmLV,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xA4
+        self.Head.SubCmd = 0x11
+        self.PlayerID = 0
+        self.NameLen = 0
+        self.Name = ""
+        self.LV = 0
+        self.Job = 0
+        self.RealmLV = 0
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 4
+        length += 1
+        length += len(self.Name)
+        length += 2
+        length += 1
+        length += 2
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteDWORD(data, self.PlayerID)
+        data = CommFunc.WriteBYTE(data, self.NameLen)
+        data = CommFunc.WriteString(data, self.NameLen, self.Name)
+        data = CommFunc.WriteWORD(data, self.LV)
+        data = CommFunc.WriteBYTE(data, self.Job)
+        data = CommFunc.WriteWORD(data, self.RealmLV)
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                PlayerID:%d,
+                                NameLen:%d,
+                                Name:%s,
+                                LV:%d,
+                                Job:%d,
+                                RealmLV:%d
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.PlayerID,
+                                self.NameLen,
+                                self.Name,
+                                self.LV,
+                                self.Job,
+                                self.RealmLV
+                                )
+        return DumpString
+
+
+m_NAtagGCChuangongInviteInfo=tagGCChuangongInviteInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCChuangongInviteInfo.Head.Cmd,m_NAtagGCChuangongInviteInfo.Head.SubCmd))] = m_NAtagGCChuangongInviteInfo
+
+
+#------------------------------------------------------
+# A4 12 传功开始 #tagGCChuangongStart
+
+class  tagGCChuangongStart(Structure):
+    Head = tagHead()
+    PlayerID = 0    #(DWORD PlayerID)// 一起传功的玩家ID
+    NameLen = 0    #(BYTE NameLen)
+    Name = ""    #(String Name)// 玩家名,size = NameLen
+    LV = 0    #(WORD LV)// 玩家等级
+    Job = 0    #(BYTE Job)// 玩家职业
+    RealmLV = 0    #(WORD RealmLV)// 玩家境界等级
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xA4
+        self.Head.SubCmd = 0x12
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.NameLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.Name,_pos = CommFunc.ReadString(_lpData, _pos,self.NameLen)
+        self.LV,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.Job,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.RealmLV,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xA4
+        self.Head.SubCmd = 0x12
+        self.PlayerID = 0
+        self.NameLen = 0
+        self.Name = ""
+        self.LV = 0
+        self.Job = 0
+        self.RealmLV = 0
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 4
+        length += 1
+        length += len(self.Name)
+        length += 2
+        length += 1
+        length += 2
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteDWORD(data, self.PlayerID)
+        data = CommFunc.WriteBYTE(data, self.NameLen)
+        data = CommFunc.WriteString(data, self.NameLen, self.Name)
+        data = CommFunc.WriteWORD(data, self.LV)
+        data = CommFunc.WriteBYTE(data, self.Job)
+        data = CommFunc.WriteWORD(data, self.RealmLV)
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                PlayerID:%d,
+                                NameLen:%d,
+                                Name:%s,
+                                LV:%d,
+                                Job:%d,
+                                RealmLV:%d
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.PlayerID,
+                                self.NameLen,
+                                self.Name,
+                                self.LV,
+                                self.Job,
+                                self.RealmLV
+                                )
+        return DumpString
+
+
+m_NAtagGCChuangongStart=tagGCChuangongStart()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCChuangongStart.Head.Cmd,m_NAtagGCChuangongStart.Head.SubCmd))] = m_NAtagGCChuangongStart
+
+
+#------------------------------------------------------
 # A4 0A 假仙盟信息 #tagGCFakeFamilyInfo
 
 class  tagGCFakeFamilyInfo(Structure):
@@ -26194,6 +26378,142 @@
 
 
 #------------------------------------------------------
+# A5 10 传功奖励结果 #tagMCChuangongResult
+
+class  tagMCChuangongItem(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("ItemID", c_int),    
+                  ("ItemCount", c_ushort),    
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, stringData, _pos=0, _len=0):
+        self.Clear()
+        memmove(addressof(self), stringData[_pos:], self.GetLength())
+        return _pos + self.GetLength()
+
+    def Clear(self):
+        self.ItemID = 0
+        self.ItemCount = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCChuangongItem)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// A5 10 传功奖励结果 //tagMCChuangongResult:
+                                ItemID:%d,
+                                ItemCount:%d
+                                '''\
+                                %(
+                                self.ItemID,
+                                self.ItemCount
+                                )
+        return DumpString
+
+
+class  tagMCChuangongResult(Structure):
+    Head = tagHead()
+    FromLV = 0    #(WORD FromLV)// 传功前等级
+    ToLV = 0    #(WORD ToLV)// 传功后等级
+    Exp = 0    #(DWORD Exp)// 获得经验求余亿部分
+    ExpPoint = 0    #(DWORD ExpPoint)// 获得经验整除亿部分
+    ItemCount = 0    #(BYTE ItemCount)
+    AwardItemList = list()    #(vector<tagMCChuangongItem> AwardItemList)// 奖励物品列表
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xA5
+        self.Head.SubCmd = 0x10
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.FromLV,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.ToLV,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.Exp,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.ExpPoint,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.ItemCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.ItemCount):
+            temAwardItemList = tagMCChuangongItem()
+            _pos = temAwardItemList.ReadData(_lpData, _pos)
+            self.AwardItemList.append(temAwardItemList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xA5
+        self.Head.SubCmd = 0x10
+        self.FromLV = 0
+        self.ToLV = 0
+        self.Exp = 0
+        self.ExpPoint = 0
+        self.ItemCount = 0
+        self.AwardItemList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 2
+        length += 2
+        length += 4
+        length += 4
+        length += 1
+        for i in range(self.ItemCount):
+            length += self.AwardItemList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteWORD(data, self.FromLV)
+        data = CommFunc.WriteWORD(data, self.ToLV)
+        data = CommFunc.WriteDWORD(data, self.Exp)
+        data = CommFunc.WriteDWORD(data, self.ExpPoint)
+        data = CommFunc.WriteBYTE(data, self.ItemCount)
+        for i in range(self.ItemCount):
+            data = CommFunc.WriteString(data, self.AwardItemList[i].GetLength(), self.AwardItemList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                FromLV:%d,
+                                ToLV:%d,
+                                Exp:%d,
+                                ExpPoint:%d,
+                                ItemCount:%d,
+                                AwardItemList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.FromLV,
+                                self.ToLV,
+                                self.Exp,
+                                self.ExpPoint,
+                                self.ItemCount,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagMCChuangongResult=tagMCChuangongResult()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCChuangongResult.Head.Cmd,m_NAtagMCChuangongResult.Head.SubCmd))] = m_NAtagMCChuangongResult
+
+
+#------------------------------------------------------
 # A5 02 家族活跃令兑换结果 #tagMCFamilyActivityExchangeResult
 
 class  tagMCFamilyActivityExchangeResult(Structure):
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamily.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamily.py
index 34a2da9..44b1b6d 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamily.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamily.py
@@ -3617,3 +3617,96 @@
         
     PlayerControl.NotifyCode(curPlayer, "jiazu_pan_500807")
     return
+
+##--------------------------------------- 仙盟传功 --------------------------------------------------
+def MapServer_FamilyChuangong(curPlayer, msgList):
+    msgType, msgData = msgList
+    
+    if msgType == "Invite":
+        tagPlayerID = msgData[0]
+        __DoChuangong_Invite(curPlayer, tagPlayerID)
+        return
+    
+    if msgType == "Response":
+        tagPlayerID, isOK = msgData
+        __DoChuangong_Response(curPlayer, tagPlayerID, isOK)
+        return
+    
+    return
+
+def __CheckChuangongPlayer(curPlayer, tagPlayerID):
+    curFamily = curPlayer.GetFamily()
+    if not curFamily:
+        return
+    tagMember = curFamily.FindMember(tagPlayerID)
+    if not tagMember:
+        GameWorld.DebugLog("非盟友无法传功! tagPlayerID=%s" % tagPlayerID, curPlayer.GetPlayerID())
+        return
+    tagPlayer = tagMember.GetPlayer()
+    if not tagPlayer:
+        PlayerControl.NotifyCode(curPlayer, "FairyFeastPlayerOffline")
+        return
+    return tagPlayer
+
+def __DoChuangong_Invite(curPlayer, tagPlayerID):
+    ## 邀请
+    playerID = curPlayer.GetPlayerID()
+    tagPlayer = __CheckChuangongPlayer(curPlayer, tagPlayerID)
+    if not tagPlayer:
+        return
+    invitePlayerIDList = PyGameData.g_chuangongPlayerDict.get(playerID, [])
+    if tagPlayerID not in invitePlayerIDList:
+        invitePlayerIDList.append(tagPlayerID)
+        PyGameData.g_chuangongPlayerDict[playerID] = invitePlayerIDList
+    clientPack = ChPyNetSendPack.tagGCChuangongInviteInfo()
+    clientPack.Clear()
+    clientPack.PlayerID = curPlayer.GetPlayerID()
+    clientPack.Name = curPlayer.GetName()
+    clientPack.NameLen = len(clientPack.Name)
+    clientPack.LV = curPlayer.GetLV()
+    clientPack.Job = curPlayer.GetJob()
+    clientPack.RealmLV = curPlayer.GetOfficialRank()
+    NetPackCommon.SendFakePack(tagPlayer, clientPack)
+    GameWorld.DebugLog("邀请传功: tagPlayerID=%s, %s" % (tagPlayerID, PyGameData.g_chuangongPlayerDict), playerID)
+    return
+
+def __DoChuangong_Response(curPlayer, tagPlayerID, isOK):
+    ## 相应
+    playerID = curPlayer.GetPlayerID()
+    tagPlayer = __CheckChuangongPlayer(curPlayer, tagPlayerID)
+    if not tagPlayer:
+        return
+    invitePlayerIDList = PyGameData.g_chuangongPlayerDict.get(tagPlayerID, [])
+    if not isOK:
+        if playerID in invitePlayerIDList:
+            invitePlayerIDList.remove(playerID)
+            PyGameData.g_chuangongPlayerDict[tagPlayerID] = invitePlayerIDList
+        GameWorld.DebugLog("拒绝传功: tagPlayerID=%s, %s" % (tagPlayerID, PyGameData.g_chuangongPlayerDict), playerID)
+        return
+    if not invitePlayerIDList:
+        PlayerControl.NotifyCode(curPlayer, "TagHadFinishChuangong")
+        return    
+    if playerID not in invitePlayerIDList:
+        GameWorld.DebugLog("不在对方邀请列表了,无法传功: tagPlayerID=%s, %s" % (tagPlayerID, invitePlayerIDList), playerID)
+        return
+    PyGameData.g_chuangongPlayerDict.pop(tagPlayerID)
+    
+    # 通知双方开始传功
+    __NotifyChuangongStart(curPlayer, tagPlayer)
+    __NotifyChuangongStart(tagPlayer, curPlayer)
+    return
+
+def __NotifyChuangongStart(curPlayer, tagPlayer):
+    clientPack = ChPyNetSendPack.tagGCChuangongStart()
+    clientPack.Clear()
+    clientPack.PlayerID = tagPlayer.GetPlayerID()
+    clientPack.Name = tagPlayer.GetName()
+    clientPack.NameLen = len(clientPack.Name)
+    clientPack.LV = tagPlayer.GetLV()
+    clientPack.Job = tagPlayer.GetJob()
+    clientPack.RealmLV = tagPlayer.GetOfficialRank()
+    NetPackCommon.SendFakePack(curPlayer, clientPack)
+    return
+
+##--------------------------------------------------------------------------------------------------
+
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py
index fdc8c07..e290111 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py
@@ -913,6 +913,13 @@
                 return
         PlayerFamilyZhenfa.MapServer_FamilyZhenfa(curPlayer, eval(resultName))
         return
+    #仙盟传功
+    if callName =="FamilyChuangong":
+        curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(srcPlayerID)
+        if not curPlayer:
+            return
+        PlayerFamily.MapServer_FamilyChuangong(curPlayer, eval(resultName))
+        return
     #骑宠BOSS结束
     if callName =="HorsePetBossOver":
         PlayerHorsePetBoss.HorsePetBossKilled(int(resultName))
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/PyGameData.py b/ServerPython/CoreServerGroup/GameServer/Script/PyGameData.py
index d08db50..b61d39b 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/PyGameData.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/PyGameData.py
@@ -84,6 +84,7 @@
 g_familyPartyTopInfo = [] #仙盟宴会答题王 [playerID,名字]
 g_partyheroAnswerDict = {} #仙盟宴会玩家答对题目数量 {playerid:答题数量,..}
 g_familyAnswerPlayerIDDict = {} #仙盟宴会玩家参与答题数量  {playerID:[题目ID, ...], ...}
+g_chuangongPlayerDict = {} #传功玩家信息 {playerID:[目标玩家ID, ...], ...}
 
 g_redPacketMgr = None # RedPacketMgr
 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
index 14dec80..bc2e56f 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
@@ -189,7 +189,7 @@
 Writer = alee
 Releaser = alee
 RegType = 0
-RegisterPackCount = 7
+RegisterPackCount = 8
 
 PacketCMD_1=0xA6
 PacketSubCMD_1=0x01
@@ -219,6 +219,10 @@
 PacketSubCMD_7=0x13
 PacketCallFunc_7=OnFamilyAffairOP
 
+PacketCMD_8=0xA6
+PacketSubCMD_8=0x15
+PacketCallFunc_8=OnChuangongOP
+
 ;家族仓库
 [PlayerFamilyStore]
 ScriptName = Player\PlayerFamilyStore.py
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index 5a2d2bc..ec4a3de 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -3782,8 +3782,6 @@
 #仙盟宴会
 Def_Player_Dict_FamilyPartyJoinSign = "FamilyPartyJoinSign"  # 今日参与宴会标记
 Def_Player_Dict_FamilyPartyAnswerCnt = "FamilyPartyAnswerCnt"  # 答题数量
-Def_Player_Dict_FamilyPartySitState = "FamilyPartySitState"  # 是否已打坐传功
-Def_Player_Dict_FamilyPartyHelpSitCount = "FamilyPartyHelpSitCount"  # 已经帮助传功次数
 Def_Player_Dict_FamilyPartyCollectState = "FamilyPartyCollectState"  # 是否已采集
 Def_Player_Dict_FamilyPartyTotalExp = "FamilyPartyTotalExp"  # 获得的总经验
 Def_Player_Dict_FamilyPartyTotalExpPoint = "FamilyPartyTotalExpPoint"  # 获得的总经验点
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
index 5e60744..cc8227f 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
@@ -13853,6 +13853,66 @@
 
 
 #------------------------------------------------------
+# A6 15 传功操作 #tagCMChuangongOP
+
+class  tagCMChuangongOP(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("OPType", c_ubyte),    # 操作类型:1-邀请;2-回应;3-领奖;
+                  ("PlayerID", c_int),    # 目标玩家ID;回应时为邀请方玩家ID
+                  ("OPData", c_ubyte),    # 操作数据,可选:回应时为是否同意
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xA6
+        self.SubCmd = 0x15
+        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 = 0xA6
+        self.SubCmd = 0x15
+        self.OPType = 0
+        self.PlayerID = 0
+        self.OPData = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagCMChuangongOP)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// A6 15 传功操作 //tagCMChuangongOP:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                OPType:%d,
+                                PlayerID:%d,
+                                OPData:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.OPType,
+                                self.PlayerID,
+                                self.OPData
+                                )
+        return DumpString
+
+
+m_NAtagCMChuangongOP=tagCMChuangongOP()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMChuangongOP.Cmd,m_NAtagCMChuangongOP.SubCmd))] = m_NAtagCMChuangongOP
+
+
+#------------------------------------------------------
 # A6 11 家族改名 #tagCMRenameFamily
 
 class  tagCMRenameFamily(Structure):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
index 2ee07d9..d792422 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -985,6 +985,190 @@
 
 
 #------------------------------------------------------
+# A4 11 传功邀请信息 #tagGCChuangongInviteInfo
+
+class  tagGCChuangongInviteInfo(Structure):
+    Head = tagHead()
+    PlayerID = 0    #(DWORD PlayerID)// 发起邀请的玩家ID
+    NameLen = 0    #(BYTE NameLen)
+    Name = ""    #(String Name)// 发起邀请的玩家名,size = NameLen
+    LV = 0    #(WORD LV)// 玩家等级
+    Job = 0    #(BYTE Job)// 玩家职业
+    RealmLV = 0    #(WORD RealmLV)// 玩家境界等级
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xA4
+        self.Head.SubCmd = 0x11
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.NameLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.Name,_pos = CommFunc.ReadString(_lpData, _pos,self.NameLen)
+        self.LV,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.Job,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.RealmLV,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xA4
+        self.Head.SubCmd = 0x11
+        self.PlayerID = 0
+        self.NameLen = 0
+        self.Name = ""
+        self.LV = 0
+        self.Job = 0
+        self.RealmLV = 0
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 4
+        length += 1
+        length += len(self.Name)
+        length += 2
+        length += 1
+        length += 2
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteDWORD(data, self.PlayerID)
+        data = CommFunc.WriteBYTE(data, self.NameLen)
+        data = CommFunc.WriteString(data, self.NameLen, self.Name)
+        data = CommFunc.WriteWORD(data, self.LV)
+        data = CommFunc.WriteBYTE(data, self.Job)
+        data = CommFunc.WriteWORD(data, self.RealmLV)
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                PlayerID:%d,
+                                NameLen:%d,
+                                Name:%s,
+                                LV:%d,
+                                Job:%d,
+                                RealmLV:%d
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.PlayerID,
+                                self.NameLen,
+                                self.Name,
+                                self.LV,
+                                self.Job,
+                                self.RealmLV
+                                )
+        return DumpString
+
+
+m_NAtagGCChuangongInviteInfo=tagGCChuangongInviteInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCChuangongInviteInfo.Head.Cmd,m_NAtagGCChuangongInviteInfo.Head.SubCmd))] = m_NAtagGCChuangongInviteInfo
+
+
+#------------------------------------------------------
+# A4 12 传功开始 #tagGCChuangongStart
+
+class  tagGCChuangongStart(Structure):
+    Head = tagHead()
+    PlayerID = 0    #(DWORD PlayerID)// 一起传功的玩家ID
+    NameLen = 0    #(BYTE NameLen)
+    Name = ""    #(String Name)// 玩家名,size = NameLen
+    LV = 0    #(WORD LV)// 玩家等级
+    Job = 0    #(BYTE Job)// 玩家职业
+    RealmLV = 0    #(WORD RealmLV)// 玩家境界等级
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xA4
+        self.Head.SubCmd = 0x12
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.NameLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.Name,_pos = CommFunc.ReadString(_lpData, _pos,self.NameLen)
+        self.LV,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.Job,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.RealmLV,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xA4
+        self.Head.SubCmd = 0x12
+        self.PlayerID = 0
+        self.NameLen = 0
+        self.Name = ""
+        self.LV = 0
+        self.Job = 0
+        self.RealmLV = 0
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 4
+        length += 1
+        length += len(self.Name)
+        length += 2
+        length += 1
+        length += 2
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteDWORD(data, self.PlayerID)
+        data = CommFunc.WriteBYTE(data, self.NameLen)
+        data = CommFunc.WriteString(data, self.NameLen, self.Name)
+        data = CommFunc.WriteWORD(data, self.LV)
+        data = CommFunc.WriteBYTE(data, self.Job)
+        data = CommFunc.WriteWORD(data, self.RealmLV)
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                PlayerID:%d,
+                                NameLen:%d,
+                                Name:%s,
+                                LV:%d,
+                                Job:%d,
+                                RealmLV:%d
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.PlayerID,
+                                self.NameLen,
+                                self.Name,
+                                self.LV,
+                                self.Job,
+                                self.RealmLV
+                                )
+        return DumpString
+
+
+m_NAtagGCChuangongStart=tagGCChuangongStart()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCChuangongStart.Head.Cmd,m_NAtagGCChuangongStart.Head.SubCmd))] = m_NAtagGCChuangongStart
+
+
+#------------------------------------------------------
 # A4 0A 假仙盟信息 #tagGCFakeFamilyInfo
 
 class  tagGCFakeFamilyInfo(Structure):
@@ -26194,6 +26378,142 @@
 
 
 #------------------------------------------------------
+# A5 10 传功奖励结果 #tagMCChuangongResult
+
+class  tagMCChuangongItem(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("ItemID", c_int),    
+                  ("ItemCount", c_ushort),    
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, stringData, _pos=0, _len=0):
+        self.Clear()
+        memmove(addressof(self), stringData[_pos:], self.GetLength())
+        return _pos + self.GetLength()
+
+    def Clear(self):
+        self.ItemID = 0
+        self.ItemCount = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCChuangongItem)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// A5 10 传功奖励结果 //tagMCChuangongResult:
+                                ItemID:%d,
+                                ItemCount:%d
+                                '''\
+                                %(
+                                self.ItemID,
+                                self.ItemCount
+                                )
+        return DumpString
+
+
+class  tagMCChuangongResult(Structure):
+    Head = tagHead()
+    FromLV = 0    #(WORD FromLV)// 传功前等级
+    ToLV = 0    #(WORD ToLV)// 传功后等级
+    Exp = 0    #(DWORD Exp)// 获得经验求余亿部分
+    ExpPoint = 0    #(DWORD ExpPoint)// 获得经验整除亿部分
+    ItemCount = 0    #(BYTE ItemCount)
+    AwardItemList = list()    #(vector<tagMCChuangongItem> AwardItemList)// 奖励物品列表
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xA5
+        self.Head.SubCmd = 0x10
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.FromLV,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.ToLV,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.Exp,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.ExpPoint,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.ItemCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.ItemCount):
+            temAwardItemList = tagMCChuangongItem()
+            _pos = temAwardItemList.ReadData(_lpData, _pos)
+            self.AwardItemList.append(temAwardItemList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xA5
+        self.Head.SubCmd = 0x10
+        self.FromLV = 0
+        self.ToLV = 0
+        self.Exp = 0
+        self.ExpPoint = 0
+        self.ItemCount = 0
+        self.AwardItemList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 2
+        length += 2
+        length += 4
+        length += 4
+        length += 1
+        for i in range(self.ItemCount):
+            length += self.AwardItemList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteWORD(data, self.FromLV)
+        data = CommFunc.WriteWORD(data, self.ToLV)
+        data = CommFunc.WriteDWORD(data, self.Exp)
+        data = CommFunc.WriteDWORD(data, self.ExpPoint)
+        data = CommFunc.WriteBYTE(data, self.ItemCount)
+        for i in range(self.ItemCount):
+            data = CommFunc.WriteString(data, self.AwardItemList[i].GetLength(), self.AwardItemList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                FromLV:%d,
+                                ToLV:%d,
+                                Exp:%d,
+                                ExpPoint:%d,
+                                ItemCount:%d,
+                                AwardItemList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.FromLV,
+                                self.ToLV,
+                                self.Exp,
+                                self.ExpPoint,
+                                self.ItemCount,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagMCChuangongResult=tagMCChuangongResult()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCChuangongResult.Head.Cmd,m_NAtagMCChuangongResult.Head.SubCmd))] = m_NAtagMCChuangongResult
+
+
+#------------------------------------------------------
 # A5 02 家族活跃令兑换结果 #tagMCFamilyActivityExchangeResult
 
 class  tagMCFamilyActivityExchangeResult(Structure):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_FamilyParty.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_FamilyParty.py
index 4815f80..aa664fc 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_FamilyParty.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_FamilyParty.py
@@ -32,10 +32,7 @@
 import PyGameData
 import ItemCommon
 import ItemControler
-import Item_AddLV
-import PlayerTalk
 import PlayerActivity
-import PlayerWeekParty
 import PlayerTongTianLing
 
 #---战盟副本---
@@ -47,8 +44,6 @@
     GameWorld.DebugLog("重置仙盟宴会相关数据,含传功!", curPlayer.GetPlayerID())
     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyPartyJoinSign, 0)
     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyPartyAnswerCnt, 0)
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyPartySitState, 0)
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyPartyHelpSitCount, 0)
     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyPartyCollectState, 0)
     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyPartyTotalExp, 0)
     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyPartyTotalExpPoint, 0)
@@ -273,7 +268,6 @@
 # @remarks 用于通知阵营比分条
 def DoFBHelp(curPlayer, tick, isSyncPlayerID=False):
     gameWorld = GameWorld.GetGameWorld()
-    chuangongActionState = gameWorld.GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_DailyActionState % ShareDefine.DailyActionID_FamilyChuanGong)
     partyActionState = gameWorld.GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_DailyActionState % ShareDefine.DailyActionID_FamilyParty)
     
     playerID = curPlayer.GetPlayerID()
@@ -289,9 +283,8 @@
     #totalPoint += IpyGameDataPY.GetFuncCfg('PartyReward') #加参与奖
     totalPoint += addPoint * curAnswerCnt
     hasCollect = int(curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyPartyCollectState) or not partyActionState) # 非活动期间也同步已采集,前端根据此状态控制按钮显隐
-    hasSit = int(curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyPartySitState) or not chuangongActionState) # 非活动期间也同步已传功,前端根据此状态控制按钮显隐
     
-    helpDict = {FBCommon.Help_exp:exp, FBCommon.Help_expPoint:expPoint, FBCommon.Help_score:totalPoint, "hasCollect":hasCollect, "hasSit":hasSit}
+    helpDict = {FBCommon.Help_exp:exp, FBCommon.Help_expPoint:expPoint, FBCommon.Help_score:totalPoint, "hasCollect":hasCollect}
     if PyGameData.g_familyPartyInfo:
         rankList = []
         for i, info in enumerate(PyGameData.g_familyPartyInfo[0], 1):
@@ -386,7 +379,6 @@
 # @return 无意义
 def DoExitFB(curPlayer, tick):
     global g_familyMapPlayerIDDict
-    __GiveSitAward(curPlayer)
     lineID = GameWorld.GetGameWorld().GetLineID()
     playerID = curPlayer.GetID()
     if playerID in g_familyMapPlayerIDDict.get(lineID, []):
@@ -407,88 +399,7 @@
 #  @param tick 当前时间
 #  @return None
 def DoFBAction(curPlayer, actionType, actionInfo, tick):
-    gameWorld = GameWorld.GetGameWorld()
-    playerID = curPlayer.GetID()
-    if actionType == 0:  #邀请打坐
-        tagPlayerID = actionInfo
-        if curPlayer.GetPlayerAction() in [IPY_GameWorld.paSit, IPY_GameWorld.paPreparing]:
-            GameWorld.DebugLog('邀请打坐,玩家已处于打坐或采集状态', playerID)
-            return
-        hasSit = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyPartySitState)
-        if hasSit:
-            GameWorld.Log('邀请打坐,玩家已打坐过一次', playerID)
-            return
-
-        copyMapPlayerManager = GameWorld.GetMapCopyPlayerManager()
-        tagPlayer = copyMapPlayerManager.FindPlayerByID(tagPlayerID)
-        if not tagPlayer:
-            GameWorld.DebugLog('邀请%s打坐,该玩家不在副本里' % tagPlayerID, playerID)
-            PlayerControl.NotifyCode(curPlayer, 'PartySitFail')
-            return
-        gameWorld.SetGameWorldDict(FBPlayerDict_TagPlayerID % playerID, tagPlayerID)
-        curPlayer.StopMove()
-        curPlayer.Sit()
-#        if not gameWorld.GetGameWorldDictByKey(FBPlayerDict_HasSit % tagPlayerID):
-#            if tagPlayer.GetPlayerAction() not in [IPY_GameWorld.paSit, IPY_GameWorld.paPreparing]:
-#                tagPlayer.StopMove()
-#                tagPlayer.Sit()
-    elif actionType == 1:  #打坐结束给奖励
-        if not __GiveSitAward(curPlayer):
-            return
-
-        DoFBHelp(curPlayer, 0)
-        
-
     return
-
-def __GiveSitAward(curPlayer):
-    #给打坐奖励
-    gameWorld = GameWorld.GetGameWorld()
-    playerID = curPlayer.GetID()
-    hasSit = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyPartySitState)
-    if hasSit:
-        GameWorld.Log('打坐结束给奖励,玩家已打坐过一次', playerID)
-        return
-    if curPlayer.GetPlayerAction() != IPY_GameWorld.paSit:
-        GameWorld.Log('打坐结束给奖励,玩家不在打坐状态', playerID)
-        return
-    curPlayer.Stand()
-    reLV = curPlayer.GetLV()
-    worldlv = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_WorldAverageLv)
-    giveLV = eval(IpyGameDataPY.GetFuncCompileCfg('FamilyPartySitAward', 2))
-    addExp = 0
-    if giveLV:
-        addExp = Item_AddLV.DoAddLVEx(curPlayer, giveLV, True, True, 0)
-    reLV = curPlayer.GetLV()
-    reExp = PlayerControl.GetPlayerReExp(curPlayer)
-    giveExp = eval(IpyGameDataPY.GetFuncCompileCfg('FamilyPartySitAward'))
-    if giveExp:
-        PlayerControl.PlayerControl(curPlayer).AddExp(giveExp, ShareDefine.Def_ViewExpType_SysEx)
-        
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyPartySitState, 1)
-    PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_FamilyChuanGong)
-    PlayerWeekParty.AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_FamilyChuanGong, 1)
-    PlayerTongTianLing.AddTongTianTaskValue(curPlayer, ChConfig.TTLTaskType_ChuanGong, 1)
-    DoFBHelp(curPlayer, 0)
-    
-    #帮助传功奖励
-    helpSitActivityAward = IpyGameDataPY.GetFuncEvalCfg('FamilyPartySitAward', 3)
-    if helpSitActivityAward and len(helpSitActivityAward) == 2:
-        helpFamilyActivity, maxHelpAwardCount = helpSitActivityAward
-        helpThanks = IpyGameDataPY.GetFuncCfg('FamilyPartySitAward', 4) % (helpFamilyActivity, maxHelpAwardCount)
-        sitThanks = helpThanks.decode(ShareDefine.Def_Game_Character_Encoding).encode(GameWorld.GetCharacterEncoding())
-        tagPlayerID = gameWorld.GetGameWorldDictByKey(FBPlayerDict_TagPlayerID % playerID)
-        PlayerTalk.TalkPrivateByID(curPlayer, tagPlayerID, sitThanks)
-        tagPlayer = GameWorld.GetMapCopyPlayerManager().FindPlayerByID(tagPlayerID)
-        if tagPlayer:
-            helpCount = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyPartyHelpSitCount) + 1
-            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyPartyHelpSitCount, helpCount)
-            GameWorld.DebugLog("帮助传功奖励: sitPlayerID=%s,tagPlayerID=%s,helpCount=%s" % (playerID, tagPlayerID, helpCount))
-            if helpCount <= maxHelpAwardCount:
-                PlayerControl.GiveMoney(tagPlayer, ShareDefine.TYPE_Price_FamilyActivity, helpFamilyActivity)
-                
-    GameWorld.DebugLog('    传功结束,giveLV=%s, giveExp=%s, worldlv=%s' % (giveLV, giveExp, worldlv))
-    return True
 
 def DoAddFamilyMemberFamilyActivity(familyID, addFamilyActivity):
     playerManager = GameWorld.GetPlayerManager()
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py
index e03761f..43f0e35 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py
@@ -31,6 +31,10 @@
 import PlayerFamilyTech
 import PlayerFamilyRedPacket
 import PlayerFamilyZhenfa
+import PlayerTongTianLing
+import PlayerWeekParty
+import PlayerActivity
+import ItemControler
 import SkillCommon
 import BuffSkill
 import ItemCommon
@@ -1184,3 +1188,113 @@
     return
 
 ##--------------------------------------------------------------------------------------------------
+##--------------------------------------- 仙盟传功 --------------------------------------------------
+#// A6 15 传功操作 #tagCMChuangongOP
+#
+#struct    tagCMChuangongOP
+#{
+#    tagHead        Head;
+#    BYTE        OPType;        // 操作类型:1-邀请;2-回应;3-领奖;
+#    DWORD        PlayerID;        // 目标玩家ID;回应时为邀请方玩家ID
+#    BYTE        OPData;        // 操作数据,可选:回应时为是否同意
+#};
+def OnChuangongOP(index, clientData, tick):
+    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+    opType = clientData.OPType
+    tagPlayerID = clientData.PlayerID
+    opData = clientData.OPData
+    
+    if tagPlayerID and curPlayer.GetPlayerID() == tagPlayerID:
+        GameWorld.DebugLog("不能自己传功")
+        return
+    
+    if opType == 1:
+        __Chuangong_Invite(curPlayer, tagPlayerID)
+    elif opType == 2:
+        __Chuangong_Response(curPlayer, tagPlayerID, opData)
+    elif opType == 3:
+        __Chuangong_GetAward(curPlayer)
+    return
+
+def SendGameServer_FamilyChuangong(curPlayer, msgType, msgData):
+    playerID = curPlayer.GetPlayerID()
+    GameWorld.DebugLog("传功同步GameServer: msgType=%s,%s" % (msgType, msgData), playerID)
+    msgInfo = str([msgType, msgData])
+    GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(playerID, 0, 0, "FamilyChuangong", msgInfo, len(msgInfo))
+    return
+
+def __CheckCanChuangong(curPlayer):
+    playerID = curPlayer.GetPlayerID()
+    remainCnt = PlayerActivity.GetDailyActionrRemainCnt(curPlayer, ShareDefine.DailyActionID_FamilyChuanGong)
+    if remainCnt <= 0:
+        GameWorld.DebugLog("没有传功次数了", playerID)
+        return
+    openServerDayLimit = IpyGameDataPY.GetFuncCfg("FamilyChuangong", 1)
+    if openServerDayLimit:
+        openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay) + 1
+        if openServerDay > openServerDayLimit:
+            GameWorld.DebugLog("当前开服天不能传功: openServerDay=%s > %s" % (openServerDay, openServerDayLimit), playerID)
+            return
+    return True
+
+def __Chuangong_Invite(curPlayer, tagPlayerID):
+    ## 传功邀请
+    if not __CheckCanChuangong(curPlayer):
+        return
+    SendGameServer_FamilyChuangong(curPlayer, "Invite", [tagPlayerID])
+    return
+
+def __Chuangong_Response(curPlayer, tagPlayerID, isOK):
+    ## 传功回应
+    SendGameServer_FamilyChuangong(curPlayer, "Response", [tagPlayerID, isOK])
+    return
+
+def __Chuangong_GetAward(curPlayer):
+    ## 传功领奖
+    if not __CheckCanChuangong(curPlayer):
+        return
+    PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_FamilyChuanGong, 1)
+    
+    playerID = curPlayer.GetPlayerID()
+    fromLV = curPlayer.GetLV()
+    
+    # 给经验
+    totalExp = 0
+    giveRound = IpyGameDataPY.GetFuncCfg("FamilyChuangong", 3)
+    worldlv = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_WorldAverageLv)
+    playerControl = PlayerControl.PlayerControl(curPlayer)
+    for index in range(giveRound):
+        reLV = curPlayer.GetLV()
+        reExp = PlayerControl.GetPlayerReExp(curPlayer)
+        giveExp = eval(IpyGameDataPY.GetFuncCompileCfg("FamilyChuangong", 2))
+        finalAddExp = playerControl.AddExp(giveExp, ShareDefine.Def_ViewExpType_SysEx)
+        totalExp += finalAddExp
+        GameWorld.DebugLog("传功经验: 轮次=%s,reLV=%s,reExp=%s,finalAddExp=%s, %s" % (index, reLV, reExp, finalAddExp, totalExp), playerID)
+        
+    PlayerWeekParty.AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_FamilyChuanGong, 1)
+    PlayerTongTianLing.AddTongTianTaskValue(curPlayer, ChConfig.TTLTaskType_ChuanGong, 1)
+    
+    # 给物品
+    giveItemList = IpyGameDataPY.GetFuncEvalCfg("FamilyChuangong", 4)
+    ItemControler.GivePlayerItemOrMail(curPlayer, giveItemList)
+    
+    # 同步结果
+    syncItemList = []
+    for itemID, itemCount, _ in giveItemList:
+        syncItem = ChPyNetSendPack.tagMCChuangongItem()
+        syncItem.Clear()
+        syncItem.ItemID = itemID
+        syncItem.ItemCount = itemCount
+        syncItemList.append(syncItem)
+    clientPack = ChPyNetSendPack.tagMCChuangongResult()
+    clientPack.Clear()
+    clientPack.FromLV = fromLV
+    clientPack.ToLV = curPlayer.GetLV()
+    clientPack.Exp = totalExp % ChConfig.Def_PerPointValue
+    clientPack.ExpPoint = totalExp / ChConfig.Def_PerPointValue
+    clientPack.AwardItemList = syncItemList
+    clientPack.ItemCount = len(clientPack.AwardItemList)
+    NetPackCommon.SendFakePack(curPlayer, clientPack)
+    return
+
+##--------------------------------------------------------------------------------------------------

--
Gitblit v1.8.0