From fd1197fd91110938802a68d998e6f45bb65495ed Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期一, 09 二月 2026 20:12:07 +0800
Subject: [PATCH] 66 【公会】基础主体-服务端(公会讨伐支持跨服;test_OnDay等命令支持跨服同步过天等;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/test_OnDay.py        |   14 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/CrossMgr.py       |   11 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/CreateFamily.py      |   54 +-
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py           |   41 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py                   |    1 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py               |   75 ++-
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Family.py            |   87 +-
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/GameServerRefresh.py      |  161 ------
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Zhenbaoge.py         |   86 +-
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChServerToServerPyPack.py        |   75 ++-
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/CrossMsg.py       |    3 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldEvent.py |   29 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/GMShell.py                    |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Taofa.py             |   85 ++-
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py               |   16 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/test_OnHour.py       |   14 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamilyTaofa.py      |  554 +++++++++++-----------
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossPlayer.py            |   35 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py     |   50 -
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/test_OnWeek.py       |   14 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py                      |    1 
 21 files changed, 714 insertions(+), 694 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index c64bcaa..040bea5 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -3255,6 +3255,7 @@
 Def_Player_Dict_HasVIPClubNote = 'HasVIPClubNote_186'  # 是否提示过vip升级可加入贵宾俱乐部信息
 Def_Player_Dict_PyPlayerAction = 'PyPlayerAction_187'  # py自定义玩家状态
 Def_Player_Dict_FamilyLV = 'FamilyLV_189'  # 玩家帮会等级
+Def_Player_Dict_FamilyJoinTime = 'FamilyJoinTime'  # 最后一次加入公会时间戳,无公会时为0,地图玩家处理逻辑用
 Def_Player_Rename = "Rename"  # 是否已改名过
 Def_Player_Dict_FamilyZhenbaogeCut = "FamilyZhenbaogeCut" #珍宝阁今日是否已砍过价
 Def_Player_Dict_FamilyZhenbaogeBuy = "FamilyZhenbaogeBuy" #珍宝阁今日是否已购买过
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
index c03761b..f3609e7 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -45714,60 +45714,85 @@
 # C2 03 跨服中心事件同步 #tagSSCrossCenterEvent
 
 class  tagSSCrossCenterEvent(Structure):
-    _pack_ = 1
-    _fields_ = [
-                  ("Cmd", c_ubyte),
-                  ("SubCmd", c_ubyte),
-                  ("ServerID", c_int),    
-                  ("ServerType", c_ubyte),    #服务器类型
-                  ("EventValue", c_int),    #事件值,yyyyMMddhh用于判断过天等
-                  ]
+    Head = tagHead()
+    ServerID = 0    #(DWORD ServerID)
+    ServerType = 0    #(BYTE ServerType)//服务器类型
+    EventValue = 0    #(DWORD EventValue)//事件值,yyyyMMddhh用于判断过天等
+    GMLen = 0    #(BYTE GMLen)
+    GMEvent = ""    #(String GMEvent)
+    data = None
 
     def __init__(self):
         self.Clear()
-        self.Cmd = 0xC2
-        self.SubCmd = 0x03
+        self.Head.Cmd = 0xC2
+        self.Head.SubCmd = 0x03
         return
 
-    def ReadData(self, stringData, _pos=0, _len=0):
+    def ReadData(self, _lpData, _pos=0, _Len=0):
         self.Clear()
-        memmove(addressof(self), stringData[_pos:], self.GetLength())
-        return _pos + self.GetLength()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.ServerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.ServerType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.EventValue,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.GMLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.GMEvent,_pos = CommFunc.ReadString(_lpData, _pos,self.GMLen)
+        return _pos
 
     def Clear(self):
-        self.Cmd = 0xC2
-        self.SubCmd = 0x03
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xC2
+        self.Head.SubCmd = 0x03
         self.ServerID = 0
         self.ServerType = 0
         self.EventValue = 0
+        self.GMLen = 0
+        self.GMEvent = ""
         return
 
     def GetLength(self):
-        return sizeof(tagSSCrossCenterEvent)
+        length = 0
+        length += self.Head.GetLength()
+        length += 4
+        length += 1
+        length += 4
+        length += 1
+        length += len(self.GMEvent)
+
+        return length
 
     def GetBuffer(self):
-        return string_at(addressof(self), self.GetLength())
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteDWORD(data, self.ServerID)
+        data = CommFunc.WriteBYTE(data, self.ServerType)
+        data = CommFunc.WriteDWORD(data, self.EventValue)
+        data = CommFunc.WriteBYTE(data, self.GMLen)
+        data = CommFunc.WriteString(data, self.GMLen, self.GMEvent)
+        return data
 
     def OutputString(self):
-        DumpString = '''// C2 03 跨服中心事件同步 //tagSSCrossCenterEvent:
-                                Cmd:%s,
-                                SubCmd:%s,
+        DumpString = '''
+                                Head:%s,
                                 ServerID:%d,
                                 ServerType:%d,
-                                EventValue:%d
+                                EventValue:%d,
+                                GMLen:%d,
+                                GMEvent:%s
                                 '''\
                                 %(
-                                self.Cmd,
-                                self.SubCmd,
+                                self.Head.OutputString(),
                                 self.ServerID,
                                 self.ServerType,
-                                self.EventValue
+                                self.EventValue,
+                                self.GMLen,
+                                self.GMEvent
                                 )
         return DumpString
 
 
 m_NAtagSSCrossCenterEvent=tagSSCrossCenterEvent()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagSSCrossCenterEvent.Cmd,m_NAtagSSCrossCenterEvent.SubCmd))] = m_NAtagSSCrossCenterEvent
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagSSCrossCenterEvent.Head.Cmd,m_NAtagSSCrossCenterEvent.Head.SubCmd))] = m_NAtagSSCrossCenterEvent
 
 
 #------------------------------------------------------
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChServerToServerPyPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChServerToServerPyPack.py
index b008248..5a3b7dc 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChServerToServerPyPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChServerToServerPyPack.py
@@ -104,60 +104,85 @@
 # C2 03 跨服中心事件同步 #tagSSCrossCenterEvent
 
 class  tagSSCrossCenterEvent(Structure):
-    _pack_ = 1
-    _fields_ = [
-                  ("Cmd", c_ubyte),
-                  ("SubCmd", c_ubyte),
-                  ("ServerID", c_int),    
-                  ("ServerType", c_ubyte),    #服务器类型
-                  ("EventValue", c_int),    #事件值,yyyyMMddhh用于判断过天等
-                  ]
+    Head = tagHead()
+    ServerID = 0    #(DWORD ServerID)
+    ServerType = 0    #(BYTE ServerType)//服务器类型
+    EventValue = 0    #(DWORD EventValue)//事件值,yyyyMMddhh用于判断过天等
+    GMLen = 0    #(BYTE GMLen)
+    GMEvent = ""    #(String GMEvent)
+    data = None
 
     def __init__(self):
         self.Clear()
-        self.Cmd = 0xC2
-        self.SubCmd = 0x03
+        self.Head.Cmd = 0xC2
+        self.Head.SubCmd = 0x03
         return
 
-    def ReadData(self, stringData, _pos=0, _len=0):
+    def ReadData(self, _lpData, _pos=0, _Len=0):
         self.Clear()
-        memmove(addressof(self), stringData[_pos:], self.GetLength())
-        return _pos + self.GetLength()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.ServerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.ServerType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.EventValue,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.GMLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.GMEvent,_pos = CommFunc.ReadString(_lpData, _pos,self.GMLen)
+        return _pos
 
     def Clear(self):
-        self.Cmd = 0xC2
-        self.SubCmd = 0x03
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xC2
+        self.Head.SubCmd = 0x03
         self.ServerID = 0
         self.ServerType = 0
         self.EventValue = 0
+        self.GMLen = 0
+        self.GMEvent = ""
         return
 
     def GetLength(self):
-        return sizeof(tagSSCrossCenterEvent)
+        length = 0
+        length += self.Head.GetLength()
+        length += 4
+        length += 1
+        length += 4
+        length += 1
+        length += len(self.GMEvent)
+
+        return length
 
     def GetBuffer(self):
-        return string_at(addressof(self), self.GetLength())
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteDWORD(data, self.ServerID)
+        data = CommFunc.WriteBYTE(data, self.ServerType)
+        data = CommFunc.WriteDWORD(data, self.EventValue)
+        data = CommFunc.WriteBYTE(data, self.GMLen)
+        data = CommFunc.WriteString(data, self.GMLen, self.GMEvent)
+        return data
 
     def OutputString(self):
-        DumpString = '''// C2 03 跨服中心事件同步 //tagSSCrossCenterEvent:
-                                Cmd:%s,
-                                SubCmd:%s,
+        DumpString = '''
+                                Head:%s,
                                 ServerID:%d,
                                 ServerType:%d,
-                                EventValue:%d
+                                EventValue:%d,
+                                GMLen:%d,
+                                GMEvent:%s
                                 '''\
                                 %(
-                                self.Cmd,
-                                self.SubCmd,
+                                self.Head.OutputString(),
                                 self.ServerID,
                                 self.ServerType,
-                                self.EventValue
+                                self.EventValue,
+                                self.GMLen,
+                                self.GMEvent
                                 )
         return DumpString
 
 
 m_NAtagSSCrossCenterEvent=tagSSCrossCenterEvent()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagSSCrossCenterEvent.Cmd,m_NAtagSSCrossCenterEvent.SubCmd))] = m_NAtagSSCrossCenterEvent
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagSSCrossCenterEvent.Head.Cmd,m_NAtagSSCrossCenterEvent.Head.SubCmd))] = m_NAtagSSCrossCenterEvent
 
 
 #------------------------------------------------------
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/CreateFamily.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/CreateFamily.py
index 56f9470..4b32228 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/CreateFamily.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/CreateFamily.py
@@ -33,37 +33,18 @@
     GameWorld.DebugAnswer(curPlayer, "本服公会未互通")
     return []
 
-def OnExec(curPlayer, gmList):
-    ## 游戏服执行命令
-    
-    isMainServer = GameWorld.IsMainServer()
+def OnExecCross(crossPlayer, gmList):
     if not gmList:
-        if not isMainServer:
-            return
-        GameWorld.DebugAnswer(curPlayer, "-----%s-----" % GameWorld.GetCurrentDataTimeStr())
-        GameWorld.DebugAnswer(curPlayer, "创建假人公会: CreatFamily 个数 [总战力 ServerID 等级 成员数  是否审核 官职限制]")
-        GameWorld.DebugAnswer(curPlayer, "删除假人公会: CreatFamily 0")
-        GameWorld.DebugAnswer(curPlayer, "输出公会列表: CreatFamily pl [条数 从第x名]")
-        GameWorld.DebugAnswer(curPlayer, "输出公会明细: CreatFamily pf 公会ID")
-        GameWorld.DebugAnswer(curPlayer, "添加假申请人: CreatFamily sq [申请数 公会ID]")
-        GameWorld.DebugAnswer(curPlayer, "添加公会成员: CreatFamily m 人数 [公会ID]")
+        return
+    if GameWorld.IsMainServer() and DBDataMgr.GetFamilyMgr().GetCurCrossServerID():
+        # 本服公会已互通不再执行本服命令
         return
     
-    if isMainServer:
-        crossServerID = DBDataMgr.GetFamilyMgr().GetCurCrossServerID()
-        if crossServerID:
-            # 本服公会已互通不再执行本服命令
-            return
-        
-    crossPlayer = CrossPlayer.GetCrossPlayerMgr().FindCrossPlayer(curPlayer.GetPlayerID())
-    if not crossPlayer:
-        return
-    
+    playerID = crossPlayer.GetPlayerID()
+    familyMgr = DBDataMgr.GetFamilyMgr()
+    familyID = familyMgr.GetPlayerFamilyID(playerID)
+    zoneID = familyMgr.GetFamilyZoneID(familyID)
     if GameWorld.IsCrossServer():
-        playerID = crossPlayer.GetPlayerID()
-        familyMgr = DBDataMgr.GetFamilyMgr()
-        familyID = familyMgr.GetPlayerFamilyID(playerID)
-        zoneID = familyMgr.GetFamilyZoneID(familyID)
         GameWorld.DebugAnswer(crossPlayer, "跨服公会ID:%s,zoneID=%s" % (familyID, zoneID))
         
     value1 = gmList[0]
@@ -90,6 +71,25 @@
     __createFackFamily(crossPlayer, gmList)
     return
 
+def OnExec(curPlayer, gmList):
+    ## 游戏服执行命令
+    if not gmList:
+        GameWorld.DebugAnswer(curPlayer, "-----%s-----" % GameWorld.GetCurrentDataTimeStr())
+        GameWorld.DebugAnswer(curPlayer, "创建假人公会: CreatFamily 个数 [总战力 ServerID 等级 成员数  是否审核 官职限制]")
+        GameWorld.DebugAnswer(curPlayer, "删除假人公会: CreatFamily 0")
+        GameWorld.DebugAnswer(curPlayer, "输出公会列表: CreatFamily pl [条数 从第x名]")
+        GameWorld.DebugAnswer(curPlayer, "输出公会明细: CreatFamily pf 公会ID")
+        GameWorld.DebugAnswer(curPlayer, "添加假申请人: CreatFamily sq [申请数 公会ID]")
+        GameWorld.DebugAnswer(curPlayer, "添加公会成员: CreatFamily m 人数 [公会ID]")
+        return
+    
+    crossPlayer = CrossPlayer.GetCrossPlayerMgr().FindCrossPlayer(curPlayer.GetPlayerID())
+    if not crossPlayer:
+        return
+    
+    OnExecCross(crossPlayer, gmList)
+    return
+
 def __addFackMember(crossPlayer, gmList):
     memCnt = gmList[1] if len(gmList) > 1 else 1
     familyID = gmList[2] if len(gmList) > 2 else crossPlayer.GetFamilyID()
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Family.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Family.py
index 0541ea5..4a95648 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Family.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Family.py
@@ -34,54 +34,23 @@
     GameWorld.DebugAnswer(curPlayer, "本服公会未互通")
     return []
 
-def OnExec(curPlayer, msgList):
-    ## 游戏服执行命令
-    
-    isMainServer = GameWorld.IsMainServer()
+def OnExecCross(crossPlayer, msgList):
     if not msgList:
-        if not isMainServer:
-            return
-        GameWorld.DebugAnswer(curPlayer, "-----%s-----" % GameWorld.GetCurrentDataTimeStr())
-        GameWorld.DebugAnswer(curPlayer, "设置等级: Family lv 等级 经验")
-        GameWorld.DebugAnswer(curPlayer, "设置徽章: Family e 徽章ID [剩余时间秒]")
-        GameWorld.DebugAnswer(curPlayer, "设置贡献: Family c 今日贡献 累计贡献 [成员ID]")
-        GameWorld.DebugAnswer(curPlayer, "设置离开: Family l 主动离开次数 被踢次数 上次是否主动  离开多久了")
-        GameWorld.DebugAnswer(curPlayer, "添加成员: Family m 人数 [公会ID]")
-        GameWorld.DebugAnswer(curPlayer, "成员离线: Family ml 成员ID 离线分钟数")
-        GameWorld.DebugAnswer(curPlayer, "重置改名: Family n")
-        GameWorld.DebugAnswer(curPlayer, "创建公会相关使用命令: CreateFamily")
+        return
+    if GameWorld.IsMainServer() and DBDataMgr.GetFamilyMgr().GetCurCrossServerID():
+        # 本服公会已互通不再执行本服命令
         return
     
-    crossPlayer = CrossPlayer.GetCrossPlayerMgr().FindCrossPlayer(curPlayer.GetPlayerID())
-    if not crossPlayer:
-        return
-    
-    value = msgList[0]
-    
-    # 都在本服执行的
-    if value == "l":
-        if not isMainServer:
-            return
-        leaveCnt = msgList[1] if len(msgList) > 1 else 0
-        kickedCnt = msgList[2] if len(msgList) > 2 else 0
-        lastVoluntarily = msgList[3] if len(msgList) > 3 else 0
-        leavePassMinutes = msgList[4] if len(msgList) > 4 else 0
-        leaveInfo = PlayerControl.SetLeaveFamilyInfo(curPlayer, leaveCnt, kickedCnt, lastVoluntarily)
-        leaveTime = PlayerControl.SetLeaveFamilyTimeEx(curPlayer, int(time.time()) - leavePassMinutes * 60)
-        GameWorld.DebugAnswer(curPlayer, "设置离开: Info=%s,%s" % (leaveInfo, GameWorld.ChangeTimeNumToStr(leaveTime)))
-        return
-    
-    if isMainServer:
-        crossServerID = DBDataMgr.GetFamilyMgr().GetCurCrossServerID()
-        if crossServerID:
-            # 本服公会已互通不再执行本服命令
-            return
-        
     familyID = crossPlayer.GetFamilyID()
     familyMgr = DBDataMgr.GetFamilyMgr()
     curFamily = familyMgr.FindFamily(familyID) if familyID else None
     if not curFamily:
         GameWorld.DebugAnswer(crossPlayer, "玩家未加入公会!")
+        return
+    
+    value = msgList[0]
+    if value == "m":
+        CreateFamily.OnExecCross(crossPlayer, msgList)
         return
     
     if GameWorld.IsCrossServer():
@@ -108,10 +77,6 @@
             return
         endTime = PlayerFamilyEmblem.GetActionEmblemEndTime(emblemActionObj)
         GameWorld.DebugAnswer(crossPlayer, "添加徽章(%s)到期:%s" % (emblemID, GameWorld.ChangeTimeNumToStr(endTime)))
-        return
-    
-    elif value == "m":
-        CreateFamily.OnExec(crossPlayer, msgList)
         return
     
     elif value == "n":
@@ -145,3 +110,37 @@
     isSyncMem = True if syncMemIDList else False
     PlayerFamily.Sync_FamilyInfo(crossPlayer, syncMemIDList=syncMemIDList, isSyncMem=isSyncMem)
     return
+
+def OnExec(curPlayer, msgList):
+    ## 游戏服执行命令
+    
+    if not msgList:
+        GameWorld.DebugAnswer(curPlayer, "-----%s-----" % GameWorld.GetCurrentDataTimeStr())
+        GameWorld.DebugAnswer(curPlayer, "设置等级: Family lv 等级 经验")
+        GameWorld.DebugAnswer(curPlayer, "设置徽章: Family e 徽章ID [剩余时间秒]")
+        GameWorld.DebugAnswer(curPlayer, "设置贡献: Family c 今日贡献 累计贡献 [成员ID]")
+        GameWorld.DebugAnswer(curPlayer, "设置离开: Family l 主动离开次数 被踢次数 上次是否主动  离开多久了")
+        GameWorld.DebugAnswer(curPlayer, "添加成员: Family m 人数 [公会ID]")
+        GameWorld.DebugAnswer(curPlayer, "成员离线: Family ml 成员ID 离线分钟数")
+        GameWorld.DebugAnswer(curPlayer, "重置改名: Family n")
+        GameWorld.DebugAnswer(curPlayer, "创建公会相关使用命令: CreateFamily")
+        return
+    
+    crossPlayer = CrossPlayer.GetCrossPlayerMgr().FindCrossPlayer(curPlayer.GetPlayerID())
+    if not crossPlayer:
+        return
+    
+    value = msgList[0]
+    
+    if value == "l":
+        leaveCnt = msgList[1] if len(msgList) > 1 else 0
+        kickedCnt = msgList[2] if len(msgList) > 2 else 0
+        lastVoluntarily = msgList[3] if len(msgList) > 3 else 0
+        leavePassMinutes = msgList[4] if len(msgList) > 4 else 0
+        leaveInfo = PlayerControl.SetLeaveFamilyInfo(curPlayer, leaveCnt, kickedCnt, lastVoluntarily)
+        leaveTime = PlayerControl.SetLeaveFamilyTimeEx(curPlayer, int(time.time()) - leavePassMinutes * 60)
+        GameWorld.DebugAnswer(curPlayer, "设置离开: Info=%s,%s" % (leaveInfo, GameWorld.ChangeTimeNumToStr(leaveTime)))
+        return
+    
+    OnExecCross(crossPlayer, msgList)
+    return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Taofa.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Taofa.py
index 98ae0cc..6dd6137 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Taofa.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Taofa.py
@@ -22,37 +22,37 @@
 import PlayerControl
 import PlayerFamilyTaofa
 import PlayerFamily
+import CrossPlayer
 import DBDataMgr
 import random
 import time
 
-def OnExec(curPlayer, msgList):
-    
+def GetGMServerIDList(curPlayer):
+    ## 获取命令额外发送到其他服务器,如跨服
+    crossServerID = DBDataMgr.GetFamilyMgr().GetCurCrossServerID()
+    if crossServerID:
+        GameWorld.DebugAnswer(curPlayer, "本服公会已互通跨服ID:%s" % crossServerID)
+        return [crossServerID]
+    GameWorld.DebugAnswer(curPlayer, "本服公会未互通")
+    return []
+
+def OnExecCross(crossPlayer, msgList):
     if not msgList:
-        GameWorld.DebugAnswer(curPlayer, "---------- %s" % GameWorld.GetCurrentDataTimeStr())
-        GameWorld.DebugAnswer(curPlayer, "重置公会讨伐: Taofa 0")
-        GameWorld.DebugAnswer(curPlayer, "设置布阵层级: Taofa z 层级 [剩余秒]")
-        GameWorld.DebugAnswer(curPlayer, "设置当前怒气: Taofa a 怒气")
-        GameWorld.DebugAnswer(curPlayer, "设置讨伐次数: Taofa c 已讨伐次数  物品次数")
-        GameWorld.DebugAnswer(curPlayer, "设置宝箱领取: Taofa b 已领取宝箱 未领取")
-        GameWorld.DebugAnswer(curPlayer, "设置宝箱贡献: Taofa g 已贡献宝箱 [累计伤害 历史伤害]")
-        GameWorld.DebugAnswer(curPlayer, "增加成员讨伐: Taofa m 人数 [伤害值A 到B 怒攻概率]")
-        GameWorld.DebugAnswer(curPlayer, "创建仙盟相关使用命令: CreateFamily")
+        return
+    if GameWorld.IsMainServer() and DBDataMgr.GetFamilyMgr().GetCurCrossServerID():
+        # 本服公会已互通不再执行本服命令
         return
     
-    familyID = curPlayer.GetFamilyID()
-    if not familyID:
-        GameWorld.DebugAnswer(curPlayer, "没有仙盟")
-        return
+    familyID = crossPlayer.GetFamilyID()
     curFamily = DBDataMgr.GetFamilyMgr().FindFamily(familyID)
     if not curFamily:
+        GameWorld.DebugAnswer(crossPlayer, "没有公会")
         return
     
     value1 = msgList[0]
     if value1 == 0:
         PlayerFamilyTaofa.OnTaofaReset(curFamily)
-        PlayerFamilyTaofa.OnTaofaResetPlayer(curPlayer)
-        GameWorld.DebugAnswer(curPlayer, "重置公会讨伐OK")
+        GameWorld.DebugAnswer(crossPlayer, "重置公会讨伐OK")
         return
     
     if value1 == "z":
@@ -64,15 +64,42 @@
         PlayerFamilyTaofa.SetFABuzhenLayer(gActionData, gLayer)
         PlayerFamilyTaofa.SetFABuzhenEndTime(gActionData, gEndTime)
         PlayerFamily.SendFamilyAction(gActionData)
-        GameWorld.DebugAnswer(curPlayer, "布阵层:%s,到期:%s" % (gLayer, GameWorld.ChangeTimeNumToStr(gEndTime)))
+        GameWorld.DebugAnswer(crossPlayer, "布阵层:%s,到期:%s" % (gLayer, GameWorld.ChangeTimeNumToStr(gEndTime)))
         return
     
     # 新增成员讨伐
     if value1 == "m":
-        __AddMemTaofaAtk(curPlayer, curFamily, msgList)
+        __AddMemTaofaAtk(crossPlayer, curFamily, msgList)
         return
     
-    elif value1 == "a":
+    return
+
+def OnExec(curPlayer, msgList):
+    if not msgList:
+        GameWorld.DebugAnswer(curPlayer, "-----%s-----" % GameWorld.GetCurrentDataTimeStr())
+        GameWorld.DebugAnswer(curPlayer, "重置公会讨伐: Taofa 0")
+        GameWorld.DebugAnswer(curPlayer, "设置布阵层级: Taofa z 层级 [剩余秒]")
+        GameWorld.DebugAnswer(curPlayer, "设置当前怒气: Taofa a 怒气")
+        GameWorld.DebugAnswer(curPlayer, "设置讨伐次数: Taofa c 已讨伐次数  物品次数")
+        GameWorld.DebugAnswer(curPlayer, "设置宝箱领取: Taofa b 已领取宝箱 未领取")
+        GameWorld.DebugAnswer(curPlayer, "设置宝箱贡献: Taofa g 已贡献宝箱 [累计伤害 历史伤害]")
+        GameWorld.DebugAnswer(curPlayer, "增加成员讨伐: Taofa m 人数 [伤害值A 到B 怒攻概率]")
+        GameWorld.DebugAnswer(curPlayer, "创建公会相关使用命令: CreateFamily")
+        return
+    
+    crossPlayer = CrossPlayer.GetCrossPlayerMgr().FindCrossPlayer(curPlayer.GetPlayerID())
+    if not crossPlayer:
+        return
+    
+    value1 = msgList[0]
+    
+    if value1 == 0:
+        OnExecCross(crossPlayer, msgList)
+        PlayerFamilyTaofa.OnTaofaResetPlayer(curPlayer)
+        GameWorld.DebugAnswer(curPlayer, "重置玩家讨伐OK")
+        return
+    
+    if value1 == "a":
         anger = msgList[1] if len(msgList) > 1 else 0
         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaAnger, anger)
         GameWorld.DebugAnswer(curPlayer, "当前怒气: %s" % anger)
@@ -83,7 +110,7 @@
         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaCnt, atkCnt)
         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaItemAddCnt, itemAddCnt)
         GameWorld.DebugAnswer(curPlayer, "已讨伐次数:%s, 物品增加次数:%s" % (atkCnt, itemAddCnt))
-        
+
     elif value1 == "b":
         totalGetCnt = msgList[1] if len(msgList) > 1 else 0
         unGetCnt = msgList[2] if len(msgList) > 2 else 0
@@ -113,10 +140,10 @@
     PlayerFamilyTaofa.SyncTaofaInfo(curPlayer)
     return
 
-def __AddMemTaofaAtk(curPlayer, curFamily, msgList):
+def __AddMemTaofaAtk(crossPlayer, curFamily, msgList):
     #新增成员讨伐: Taofa m 人数 [伤害值A 到B]
     
-    GameWorld.DebugAnswer(curPlayer, "---------- %s" % GameWorld.GetCurrentDataTimeStr())
+    GameWorld.DebugAnswer(crossPlayer, "---------- %s" % GameWorld.GetCurrentDataTimeStr())
     memCnt = msgList[1] if len(msgList) > 1 else curFamily.GetCount()
     hurtTotalA = msgList[2] if len(msgList) > 2 else 0
     hurtTotalB = msgList[3] if len(msgList) > 3 else hurtTotalA
@@ -125,9 +152,9 @@
     
     if curFamily.GetCount() <= memCnt:
         addMemCnt = memCnt - curFamily.GetCount() + 1
-        GameWorld.DebugAnswer(curPlayer, "添加缺少成员: %s" % addMemCnt)
-        CreateFamily.OnExec(curPlayer, ["m", addMemCnt])
-        GameWorld.DebugAnswer(curPlayer, "当前总成员数: %s" % curFamily.GetCount())
+        GameWorld.DebugAnswer(crossPlayer, "添加缺少成员: %s" % addMemCnt)
+        CreateFamily.OnExecCross(crossPlayer, ["m", addMemCnt])
+        GameWorld.DebugAnswer(crossPlayer, "当前总成员数: %s" % curFamily.GetCount())
         
     actionDataList = []
     for index in range(curFamily.GetCount()):
@@ -144,9 +171,9 @@
         hurtValue = random.randint(hurtTotalA, hurtTotalB)
         isAnger = GameWorld.CanHappen(angerRate) # 概率设置为怒气攻击
         
-        actionData = PlayerFamilyTaofa.GMAddMemTaofaAtk(curPlayer, curFamily, memID, hurtValue, isAnger)
+        actionData = PlayerFamilyTaofa.GMAddMemTaofaAtk(crossPlayer, curFamily, memID, hurtValue, isAnger)
         actionDataList.append(actionData)
-        
-    PlayerFamilyTaofa.RefreshPlayerAwardBoxCnt(curFamily)
+                
     PlayerFamily.SendFamilyAction(actionDataList)
+    PlayerFamilyTaofa.SyncMemContribInfo(curFamily)
     return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Zhenbaoge.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Zhenbaoge.py
index e73d917..aaee7ab 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Zhenbaoge.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Zhenbaoge.py
@@ -34,56 +34,14 @@
     GameWorld.DebugAnswer(curPlayer, "本服公会未互通")
     return []
 
-def OnExec(curPlayer, msgList):
-    
-    isMainServer = GameWorld.IsMainServer()
+def OnExecCross(crossPlayer, msgList):
     if not msgList:
-        if not isMainServer:
-            return
-        GameWorld.DebugAnswer(curPlayer, "-----%s-----" % GameWorld.GetCurrentDataTimeStr())
-        GameWorld.DebugAnswer(curPlayer, "重置公会珍宝阁: Zhenbaoge 0")
-        GameWorld.DebugAnswer(curPlayer, "重置今日状态值: Zhenbaoge d")
-        GameWorld.DebugAnswer(curPlayer, "设置退公会时间: Zhenbaoge ft x分钟前")
-        GameWorld.DebugAnswer(curPlayer, "新增假砍价数据: Zhenbaoge 次数 [随机A值 至B值]")
-        GameWorld.DebugAnswer(curPlayer, "AB值没有填则按常规砍价价格计算")
         return
-    
-    crossPlayer = CrossPlayer.GetCrossPlayerMgr().FindCrossPlayer(curPlayer.GetPlayerID())
-    if not crossPlayer:
+    if GameWorld.IsMainServer() and DBDataMgr.GetFamilyMgr().GetCurCrossServerID():
+        # 本服公会已互通不再执行本服命令
         return
     
     familyID = crossPlayer.GetFamilyID()
-    if not familyID:
-        GameWorld.DebugAnswer(crossPlayer, "没有仙盟")
-        return
-    value1 = msgList[0]
-    
-    # 默认本服执行的
-    if value1 == "d":
-        if not isMainServer:
-            return
-        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyZhenbaogeCut, 0)
-        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyZhenbaogeBuy, 0)
-        PlayerFamilyZhenbaoge.Sync_ZhenbaogeInfo(curPlayer)
-        GameWorld.DebugAnswer(curPlayer, "重置珍宝阁玩家今日状态OK")
-        return
-    
-    elif value1 == "ft":
-        if not isMainServer:
-            return
-        minutes = msgList[1] if len(msgList) > 1 else 0
-        leaveFamilyTimeEx = int(time.time()) - minutes * 60
-        PlayerControl.SetLeaveFamilyTimeEx(curPlayer, leaveFamilyTimeEx)
-        GameWorld.DebugAnswer(curPlayer, "设置退仙盟时间:%s" % GameWorld.ChangeTimeNumToStr(leaveFamilyTimeEx))
-        return
-    
-    if isMainServer:
-        crossServerID = DBDataMgr.GetFamilyMgr().GetCurCrossServerID()
-        if crossServerID:
-            # 本服公会已互通不再执行本服命令
-            return
-        
-    # 本服、跨服通用
     familyMgr = DBDataMgr.GetFamilyMgr()
     curFamily = familyMgr.FindFamily(familyID)
     if not curFamily:
@@ -94,9 +52,10 @@
         zoneID = familyMgr.GetFamilyZoneID(familyID)
         GameWorld.DebugAnswer(crossPlayer, "跨服公会ID:%s,zoneID=%s" % (familyID, zoneID))
         
+    value1 = msgList[0]
     if value1 == 0:
         PlayerFamilyZhenbaoge.OnZhenbaogeReset(curFamily)
-        GameWorld.DebugAnswer(crossPlayer, "重置仙盟珍宝阁OK")
+        GameWorld.DebugAnswer(crossPlayer, "重置公会珍宝阁OK")
         return
     
     #添加假砍价
@@ -136,3 +95,38 @@
     nowPrice = PlayerFamilyZhenbaoge.GetFAPriceFinal(gActionData)
     GameWorld.DebugAnswer(crossPlayer, "添加假砍价数:%s,总砍价数:%s,当前价格:%s" % (fackCount, familyAction.Count() - 1, nowPrice))
     return
+
+def OnExec(curPlayer, msgList):
+    
+    if not msgList:
+        GameWorld.DebugAnswer(curPlayer, "-----%s-----" % GameWorld.GetCurrentDataTimeStr())
+        GameWorld.DebugAnswer(curPlayer, "重置公会珍宝阁: Zhenbaoge 0")
+        GameWorld.DebugAnswer(curPlayer, "重置今日状态值: Zhenbaoge d")
+        GameWorld.DebugAnswer(curPlayer, "设置退公会时间: Zhenbaoge ft x分钟前")
+        GameWorld.DebugAnswer(curPlayer, "新增假砍价数据: Zhenbaoge 次数 [随机A值 至B值]")
+        GameWorld.DebugAnswer(curPlayer, "AB值没有填则按常规砍价价格计算")
+        return
+    
+    crossPlayer = CrossPlayer.GetCrossPlayerMgr().FindCrossPlayer(curPlayer.GetPlayerID())
+    if not crossPlayer:
+        return
+    
+    value1 = msgList[0]
+    
+    # 默认本服执行的
+    if value1 == "d":
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyZhenbaogeCut, 0)
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyZhenbaogeBuy, 0)
+        PlayerFamilyZhenbaoge.Sync_ZhenbaogeInfo(curPlayer)
+        GameWorld.DebugAnswer(curPlayer, "重置珍宝阁玩家今日状态OK")
+        return
+    
+    elif value1 == "ft":
+        minutes = msgList[1] if len(msgList) > 1 else 0
+        leaveFamilyTimeEx = int(time.time()) - minutes * 60
+        PlayerControl.SetLeaveFamilyTimeEx(curPlayer, leaveFamilyTimeEx)
+        GameWorld.DebugAnswer(curPlayer, "设置退公会时间:%s" % GameWorld.ChangeTimeNumToStr(leaveFamilyTimeEx))
+        return
+    
+    OnExecCross(crossPlayer, msgList)
+    return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/test_OnDay.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/test_OnDay.py
index 1c3f017..b7cd7f5 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/test_OnDay.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/test_OnDay.py
@@ -19,13 +19,21 @@
 import PlayerEventCounter
 import GameWorldEvent
 import ServerDay
+import CrossMgr
+
+def GetGMServerIDList(curPlayer):
+    ## 获取命令额外发送到其他服务器,如跨服
+    centerID = CrossMgr.GetSSServerMgr().GetCrossCenterID()
+    return [centerID] if centerID else []
+
+def OnExecCross(crossPlayer, gmList):
+    GameWorldEvent.OnGM_CrossCenterEvent("GMOnDay")
+    return
 
 def OnExec(curPlayer, gmList):
     __DoExec(GameWorld.GetGameWorld().GetTick())
-        
     ServerDay.__printServerDay(curPlayer)
-    # 暂时同步GameServer,之后可去除
-    return True
+    return
 
 def __DoExec(tick):
     playerManager = GameWorld.GetPlayerManager()
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/test_OnHour.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/test_OnHour.py
index edcf194..88715cb 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/test_OnHour.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/test_OnHour.py
@@ -18,12 +18,20 @@
 import GameWorld
 import PlayerEventCounter
 import GameWorldEvent
+import CrossMgr
+
+def GetGMServerIDList(curPlayer):
+    ## 获取命令额外发送到其他服务器,如跨服
+    centerID = CrossMgr.GetSSServerMgr().GetCrossCenterID()
+    return [centerID] if centerID else []
+
+def OnExecCross(crossPlayer, gmList):
+    GameWorldEvent.OnGM_CrossCenterEvent("GMOnHour")
+    return
 
 def OnExec(curPlayer, gmList):
     __DoExec(GameWorld.GetGameWorld().GetTick())
-    
-    # 暂时同步GameServer,之后可去除
-    return True
+    return
 
 def __DoExec(tick):
     playerManager = GameWorld.GetPlayerManager()
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/test_OnWeek.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/test_OnWeek.py
index c37ae06..fe51eba 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/test_OnWeek.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/test_OnWeek.py
@@ -18,12 +18,20 @@
 import GameWorld
 import PlayerEventCounter
 import GameWorldEvent
+import CrossMgr
+
+def GetGMServerIDList(curPlayer):
+    ## 获取命令额外发送到其他服务器,如跨服
+    centerID = CrossMgr.GetSSServerMgr().GetCrossCenterID()
+    return [centerID] if centerID else []
+
+def OnExecCross(crossPlayer, gmList):
+    GameWorldEvent.OnGM_CrossCenterEvent("GMOnWeek")
+    return
 
 def OnExec(curPlayer, gmList):
     __DoExec(GameWorld.GetGameWorld().GetTick())
-    
-    # 暂时同步GameServer,之后可去除
-    return True
+    return
 
 def __DoExec(tick):
     playerManager = GameWorld.GetPlayerManager()
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/GMShell.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/GMShell.py
index 5d74c1c..baeeedf 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/GMShell.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/GMShell.py
@@ -235,7 +235,7 @@
         return
     cmdList = eval(cmdStr)
     callFunName = cmdList[0]
-    callName = "%s.%s" % (callFunName, "OnExec")
+    callName = "%s.%s" % (callFunName, "OnExecCross")
     callFunc = GameWorld.GetExecFunc(Commands, callName)
     if not callFunc:
         GameWorld.DebugAnswer(crossPlayer, "找不到该跨服命令! %s" % callName)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/CrossMgr.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/CrossMgr.py
index 6d22f2b..96f5e88 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/CrossMgr.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/CrossMgr.py
@@ -327,12 +327,14 @@
         
     return
 
-def SendCrossServerEvent(serverIDList=None, dirType=ShareDefine.dirType_MainAndCross):
+def SendCrossServerEvent(serverIDList=None, dirType=ShareDefine.dirType_MainAndCross, gmEvent=""):
     ## 同步跨服中心服务器事件值
     pack = ChServerToServerPyPack.tagSSCrossCenterEvent()
     pack.ServerID = GameWorld.GetGameWorld().GetServerID()
     pack.ServerType = GameWorld.GetServerType()
     pack.EventValue = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_CrossCenterEvent)
+    pack.GMEvent = gmEvent
+    pack.GMLen = len(pack.GMEvent)
     NetPackCommon.SendCrossServerToServerPack(pack, serverIDList, dirType)
     return
 
@@ -344,13 +346,16 @@
 #    DWORD        ServerID;    
 #    BYTE        ServerType;    //服务器类型
 #    DWORD        EventValue;    //事件值,yyyyMMddhh用于判断过天等
+#    BYTE        GMLen;
+#    char        GMEvent[GMLen];
 #};
 def OnCrossCenterEvent(netPack):
     serverID = netPack.ServerID
     serverType = netPack.ServerType
     eventValue = netPack.EventValue
-    GameWorld.Log("收到服务器事件变更同步: serverID=%s,serverType=%s,eventValue=%s" % (serverID, serverType, eventValue))
+    gmEvent = netPack.GMEvent
+    GameWorld.Log("收到服务器事件变更同步: serverID=%s,serverType=%s,eventValue=%s,gmEvent=%s" % (serverID, serverType, eventValue, gmEvent))
     if serverType != ShareDefine.serverType_CrossCenter:
         return
-    GameWorldEvent.DoLogic_CrossCenterEvent(eventValue, serverID)
+    GameWorldEvent.DoLogic_CrossCenterEvent(eventValue, serverID, gmEvent=gmEvent)
     return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/CrossMsg.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/CrossMsg.py
index 95830c1..3bb86cd 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/CrossMsg.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/CrossMsg.py
@@ -21,6 +21,7 @@
 import ShareDefine
 import NetPackCommon
 import ChServerToServerPyPack
+import PlayerFamilyTaofa
 import PlayerViewCache
 import PlayerFamily
 import CrossPlayer
@@ -193,6 +194,8 @@
                     PlayerFamily.C2S_FamilyMapPlayer(dataMsg, playerID)
                 elif msgType == ShareDefine.C2S_FamilyPyPackRet:
                     PlayerFamily.C2S_FamilyPyPackRet(dataMsg, playerID)
+                elif msgType == ShareDefine.C2S_TaofaMemContrib:
+                    PlayerFamilyTaofa.C2S_TaofaMemContrib(dataMsg)
                 elif msgType == ShareDefine.C2S_NotifyCode:
                     CrossPlayer.C2S_NotifyCode(dataMsg)
                 elif msgType == ShareDefine.C2S_SendFakePack:
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldEvent.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldEvent.py
index cb47a5c..f12f11c 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldEvent.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldEvent.py
@@ -369,6 +369,14 @@
     DataRecordPack.DR_OnLinePlayerCount(activePlayerCount) # 总在线
     return
 
+def OnGM_CrossCenterEvent(gmEvent):
+    if not GameWorld.IsCrossCenter():
+        return
+    serverEventValue = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_CrossCenterEvent)
+    if DoLogic_CrossCenterEvent(serverEventValue, gmEvent=gmEvent):
+        CrossMgr.SendCrossServerEvent(gmEvent=gmEvent)
+    return
+
 def DoLogic_GameWorldEvenByTime(tick):
     '''跨服事件由跨服中心服务器驱动,游戏服使用原方式
     跨服中心OnEvent -> 其他服务器OnEvent (包含个常规跨服服务器及游戏服,不保证谁先执行)
@@ -459,22 +467,22 @@
     PlayerEventCounter.DoLogic_OnYear(tick)
     return
 
-def DoLogic_CrossCenterEvent(centerEventValue, centerServerID=0):
+def DoLogic_CrossCenterEvent(centerEventValue, centerServerID=0, gmEvent=""):
     ## 收到跨服中心事件同步,如OnDay等
     serverEventValue = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_CrossCenterEvent)
     if not serverEventValue:
         serverEventValue = centerEventValue
         DBDataMgr.GetEventTrigMgr().SetValue(ShareDefine.Def_CrossCenterEvent, centerEventValue)
         
-    if serverEventValue == centerEventValue:
+    if serverEventValue == centerEventValue and not gmEvent:
         if centerServerID:
             GameWorld.Log("本服与跨服中心事件值相同不处理! serverEventValue=%s,centerEventValue=%s,centerServerID=%s" % (serverEventValue, centerEventValue, centerServerID))
         return
     
     if centerServerID:
-        GameWorld.Log("本服与跨服中心事件值变化! serverEventValue=%s,centerEventValue=%s,centerServerID=%s" % (serverEventValue, centerEventValue, centerServerID))
+        GameWorld.Log("本服与跨服中心事件值变化! serverEventValue=%s,centerEventValue=%s,centerServerID=%s,gmEvent=%s" % (serverEventValue, centerEventValue, centerServerID, gmEvent))
     else:
-        GameWorld.Log("跨服中心服务器事件值变化! serverEventValue=%s,centerEventValue=%s" % (serverEventValue, centerEventValue))
+        GameWorld.Log("跨服中心服务器事件值变化! serverEventValue=%s,centerEventValue=%s,gmEvent=%s" % (serverEventValue, centerEventValue, gmEvent))
         
     serverEventTime = GameWorld.ChangeStrToDatetime("%s" % serverEventValue, ChConfig.TYPE_Time_Format_YmdH)
     centerEventTime = GameWorld.ChangeStrToDatetime("%s" % centerEventValue, ChConfig.TYPE_Time_Format_YmdH)
@@ -496,12 +504,12 @@
     isEvent = False
     
     #OnHour事件
-    if (serverHour != centerHour or serverDay != centerDay or serverMonth != centerMonth or serverYear != centerYear):
+    if (serverHour != centerHour or serverDay != centerDay or serverMonth != centerMonth or serverYear != centerYear or gmEvent == "GMOnHour"):
         isEvent = True
         PlayerEventCounter.DoLogic_CrossCenterOnHour(centerEventValue)
         
     #OnDay事件
-    if (serverDay != centerDay or serverMonth != centerMonth or serverYear != centerYear):
+    if (serverDay != centerDay or serverMonth != centerMonth or serverYear != centerYear or gmEvent == "GMOnDay"):
         isEvent = True
         PlayerEventCounter.DoLogic_CrossCenterOnDay(centerEventValue)
         
@@ -517,6 +525,15 @@
     #if serverYear != curTimeYear:
     #    OnYear(tick)
     
+    # 游戏服额外处理玩家
+    if GameWorld.IsMainServer():
+        playerManager = GameWorld.GetPlayerManager()
+        for i in xrange(playerManager.OnlineCount()):
+            curPlayer = playerManager.OnlineAt(i)
+            if not GameWorld.IsNormalPlayer(curPlayer):
+                continue
+            PlayerEventCounter.PlayerOnCrossCenterEvent(curPlayer, centerEventValue, gmEvent=gmEvent)
+            
     return isEvent
 
 def __CheckIpyDataRecycle(timeNow):
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 cf93f29..53e2272 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -164,10 +164,6 @@
     if FBLogic.PlayerLoginInFBCheck(curPlayer, tick):
         #玩家是第一次登录, 并且玩家需要踢回原来地图
         return
-    
-    #刷新人物日期状态
-    #GameWorld.Log('PlayerEventCounter.UpdatePlayerLoginTime')
-    PlayerEventCounter.UpdatePlayerLoginTime(curPlayer)
     return
 
 #// A1 20 货币兑换 #tagCMMoneyExchange
@@ -406,6 +402,9 @@
     # !!!必要发送的数据要注意位置
     if GameWorld.IsCrossServer():
         curPlayer.SetForbiddenSyncClientState(True)
+        
+    # !!!先处理检查OnDay,再处理玩家登录的功能数据,防止某些功能login处理数据后又被onday重置
+    PlayerEventCounter.UpdatePlayerLoginTime(curPlayer)
     
     __DoPlayerLoginServer(curPlayer, tick)
     
@@ -539,8 +538,6 @@
     #同步自动战斗配置记录
 #    Sync_AutoFightSetting(curPlayer)
     
-    PlayerFamily.OnPlayerLogin(curPlayer, tick)
-    
     # 竞技场
     PlayerArena.OnLogin(curPlayer)
     
@@ -664,6 +661,7 @@
     else:
         PyMongoMain.GetUserCtrlDB().OnPlayerLogin(curPlayer)
         GMT_BroadCast.OnPlayerLogin(curPlayer)
+        PlayerFamily.OnPlayerLogin(curPlayer, tick)
         PlayerHero.OnPlayerLogin(curPlayer)
         PlayerMail.OnPlayerLogin(curPlayer)
         PlayerHJG.OnPlayerLogin(curPlayer)
@@ -1252,7 +1250,8 @@
         #到此处已经可以保存数据,即使客户端不回包断线
         #原 //01 07 地图读取OK#tagCInitMapOK 逻辑 直接调用
         __Func_LoadMapOK(index, tick)
-        GameServerRefresh.GameSever_PlayerInitOK(index, tick)
+        DoPlayerRealLoginOK(curPlayer, tick)
+        #GameServerRefresh.GameSever_PlayerInitOK(index, tick) GameServer已废弃,不再执行该逻辑
     except:
         curPlayer.Kick(IPY_GameWorld.disWaitForPlayerLoinError)
         import traceback
@@ -1566,9 +1565,6 @@
 
     #申请得到奖励物品
     #curPlayer.DataServer_CheckPrizeItem()
-    
-    #防止玩家读取地图时未触发OnDay,读取地图后再次验证(2009.9.11)
-    PlayerEventCounter.UpdatePlayerLoginTime(curPlayer)
     
     #设置阵营
     if curPlayer.GetFaction() != ChConfig.CampType_Neutral \
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossPlayer.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossPlayer.py
index 4440d86..9271569 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossPlayer.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossPlayer.py
@@ -246,7 +246,9 @@
     CrossMsg.SendToClientServer(ShareDefine.C2S_NotifyCode, dataMsg, [mainServerID], playerID)
     return
 
-def FamilyNotify(familyID, msgMark, msgParamList=[], excludeIDList=[]):
+def SendToFamilyPlayer(familyID, msgType, dataMsg, excludeIDList=[], onlyIDList=[], havePlayerCall=None):
+    ## 发送给某个公会所有在线游戏服成员,跨服游戏服通用
+    # @param havePlayerCall: 有curPlayer时回调函数,一般是游戏服时有,直接本服执行 func(curPlayer, familyID, dataMsg)
     family = DBDataMgr.GetFamilyMgr().FindFamily(familyID)
     if not family:
         return
@@ -257,6 +259,8 @@
     for index in range(family.GetCount()):
         member = family.GetAt(index)
         playerID = member.GetPlayerID()
+        if onlyIDList and playerID not in onlyIDList:
+            continue
         if excludeIDList and playerID in excludeIDList:
             continue
         crossPlayer = crossPlayerMgr.FindCrossPlayer(playerID)
@@ -265,7 +269,8 @@
             continue
         curPlayer = crossPlayer.GetPlayer()
         if curPlayer: # 有玩家,一般只有游戏服有,可视为游戏服在线,直接发送
-            PlayerControl.NotifyCode(curPlayer, msgMark, msgParamList)
+            if havePlayerCall:
+                havePlayerCall(curPlayer, familyID, dataMsg)
             continue
         mainServerID = crossPlayer.GetMainServerID()
         if mainServerID == curServerID:
@@ -278,8 +283,22 @@
             playerIDList.append(playerID)
             
     for mainServerID, playerIDList in crossServerPlayerDict.items():
-        dataMsg = {"playerIDList":playerIDList, "msgMark":msgMark, "msgParamList":msgParamList}
-        CrossMsg.SendToClientServer(ShareDefine.C2S_NotifyCode, dataMsg, [mainServerID])
+        sendDataMsg = {"playerIDList":playerIDList, "familyID":familyID}
+        sendDataMsg.update(dataMsg)
+        CrossMsg.SendToClientServer(msgType, sendDataMsg, [mainServerID])
+    return
+
+def FamilyNotify(familyID, msgMark, msgParamList=[], excludeIDList=[]):
+    family = DBDataMgr.GetFamilyMgr().FindFamily(familyID)
+    if not family:
+        return
+    
+    def havePlayerCall(curPlayer, familyID, dataMsg):
+        PlayerControl.NotifyCode(curPlayer, dataMsg["msgMark"], dataMsg["msgParamList"])
+        return
+    
+    dataMsg = {"msgMark":msgMark, "msgParamList":msgParamList}
+    SendToFamilyPlayer(familyID, ShareDefine.C2S_NotifyCode, dataMsg, excludeIDList, havePlayerCall=havePlayerCall)
     return
 
 def C2S_NotifyCode(dataMsg):
@@ -360,7 +379,7 @@
     
     return
 
-def GivePlayerResources(crossPlayer, awardItemList=None, moneyDict=None, eventName="", drDict=None):
+def GivePlayerResources(crossPlayer, awardItemList=None, moneyDict=None, eventName="", drDict=None, isNotifyAward=True):
     '''给玩家资源
     @param awardItemList: 给物品列表 [[itemID,itemCnt], ...]
     @param moneyDict: 给货币 {货币类型:消耗值, ...}
@@ -375,6 +394,8 @@
         dataMsg["moneyDict"] = moneyDict
     if drDict:
         dataMsg["drDict"] = drDict
+    if not isNotifyAward:
+        dataMsg["isNotifyAward"] = isNotifyAward
         
     playerID = crossPlayer.GetPlayerID()
     curPlayer = crossPlayer.GetPlayer()
@@ -405,6 +426,7 @@
     awardItemList = eventData.get("awardItemList", [])
     moneyDict = eventData.get("moneyDict", {})
     drDict = eventData.get("drDict", {})
+    isNotifyAward = eventData.get("isNotifyAward", True)
     
     GameWorld.DebugLog("awardItemList=%s" % awardItemList)
     if awardItemList:
@@ -418,7 +440,8 @@
         for moneyType, moneyValue in moneyDict.items():
             PlayerControl.GiveMoney(curPlayer, moneyType, moneyValue, eventName, moneyRDict)
             
-    ItemControler.NotifyGiveAwardInfo(curPlayer, awardItemList, eventName, moneyInfo=moneyDict)
+    if isNotifyAward:
+        ItemControler.NotifyGiveAwardInfo(curPlayer, awardItemList, eventName, moneyInfo=moneyDict)
     return
 
 def SetPlayerNomalDict(crossPlayer, setDict, isDayReset=False):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/GameServerRefresh.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/GameServerRefresh.py
index cae2a59..d9ade9d 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/GameServerRefresh.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/GameServerRefresh.py
@@ -32,20 +32,9 @@
 #------------------------------------------------------------------------------ 
 import GameWorld
 import PlayerControl
-import PlayerEventCounter
 import ChConfig
 import PlayerCoin
-import ChPlayer
-#---------------------------------------------------------------------
-#记录玩家初始化过程中。积累的封包
-OnHourKey = 'PlayerGSInitOK_OnHourKey'
-OnDayKey = 'PlayerGSInitOK_OnDayKey'
-OnWeekKey = 'PlayerGSInitOK_OnWeekKey'
-OnMonthKey = 'PlayerGSInitOK_OnMonthKey'
-OnYearKey = 'PlayerGSInitOK_OnYearKey'
-OnDayExKey = 'PlayerGSInitOK_OnDayExKey'
-OnWeekExKey = 'PlayerGSInitOK_OnWeekExKey'
-OnMonthExKey = 'PlayerGSInitOK_OnMonthExKey'
+
 #---------------------------------------------------------------------
 #玩家离开副本
 Def_RouteServerInitOK_LeaveFBKey = 'RouteServerInitOK_LeaveFBKey'                #玩家离开副本
@@ -68,145 +57,19 @@
 #  @return None
 #  @remarks 函数详细说明.
 def GameSever_PlayerInitOK(index , tick):
-    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
-    #2009-12-17 因地图服务器有可能关闭重开,这里要判定空
-    if not curPlayer:
-        GameWorld.ErrLog('GameSever_PlayerInitError playerIndex = %s'%(index))
-        return
-    
-    #设置初始化成功
-    curPlayer.SetGameServerInitOK(True)
-    
-    #时间缓存封包
-    if Get_PlayerGameServerInitOK_OnHour(curPlayer):
-        PlayerEventCounter.PlayerOnHour(curPlayer)
-        Set_PlayerGameServerInitOK_OnHour(curPlayer, 0)
-    
-    if Get_PlayerGameServerInitOK_OnDay(curPlayer):
-        PlayerEventCounter.PlayerOnDay(curPlayer)
-        Set_PlayerGameServerInitOK_OnDay(curPlayer, 0)
-    
-    #if Get_PlayerGameServerInitOK_OnDayEx(curPlayer):
-    #    PlayerEventCounter.PlayerOnDayEx(curPlayer)
-    #    Set_PlayerGameServerInitOK_OnDayEx(curPlayer, 0)
-        
-    if Get_PlayerGameServerInitOK_OnWeek(curPlayer):
-        PlayerEventCounter.PlayerOnWeek(curPlayer)
-        Set_PlayerGameServerInitOK_OnWeek(curPlayer, 0)
-        
-    #if Get_PlayerGameServerInitOK_OnWeekEx(curPlayer):
-    #    PlayerEventCounter.PlayerOnWeekEx(curPlayer)
-    #    Set_PlayerGameServerInitOK_OnWeekEx(curPlayer, 0)
-        
-    if Get_PlayerGameServerInitOK_OnMonth(curPlayer):
-        PlayerEventCounter.PlayerOnMonth(curPlayer)
-        Set_PlayerGameServerInitOK_OnMonth(curPlayer, 0)
-        
-    #if Get_PlayerGameServerInitOK_OnMonthEx(curPlayer):
-    #    PlayerEventCounter.PlayerOnMonthEx(curPlayer)
-    #    Set_PlayerGameServerInitOK_OnMonthEx(curPlayer, 0)
-    
-    if Get_PlayerGameServerInitOK_OnYear(curPlayer):
-        PlayerEventCounter.PlayerOnYear(curPlayer)
-        Set_PlayerGameServerInitOK_OnYear(curPlayer, 0)
-        
-    GameWorld.Log('GameSever_PlayerInitOK' , curPlayer.GetID())
-    ChPlayer.DoPlayerRealLoginOK(curPlayer, tick)
-    return
-#---------------------------------------------------------------------
-## 保存OnHour
-#  @param curPlayer 当前玩家
-#  @param value key值
-#  @return None
-#  @remarks 函数详细说明.
-def Set_PlayerGameServerInitOK_OnHour(curPlayer, value):
-    curPlayer.SetDict(OnHourKey, value)
-    #GameWorld.Log('Set_PlayerGameServerInitOK_OnHour , value = %s'%( value ) , curPlayer.GetID())
+    #GameServer已废弃,不再处理该逻辑
+#    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+#    #2009-12-17 因地图服务器有可能关闭重开,这里要判定空
+#    if not curPlayer:
+#        GameWorld.ErrLog('GameSever_PlayerInitError playerIndex = %s'%(index))
+#        return
+#    
+#    #设置初始化成功
+#    curPlayer.SetGameServerInitOK(True)
+#    
+#    GameWorld.Log('GameSever_PlayerInitOK' , curPlayer.GetID())
     return
 
-## 获取玩家字典 OnHour
-#  @param curPlayer 当前玩家
-#  @return None
-#  @remarks 函数详细说明.
-def Get_PlayerGameServerInitOK_OnHour(curPlayer):
-    return curPlayer.GetDictByKey(OnHourKey)
-
-## 保存OnDay
-#  @param curPlayer 当前玩家
-#  @param value key值
-#  @return None
-#  @remarks 函数详细说明.
-def Set_PlayerGameServerInitOK_OnDay(curPlayer, value):
-    curPlayer.SetDict(OnDayKey, value)
-    #GameWorld.Log('Set_PlayerGameServerInitOK_OnDay, value = %s'%( value ) , curPlayer.GetID())
-    return
-
-## 获取玩家字典 OnDay
-#  @param curPlayer 当前玩家
-#  @return None
-#  @remarks 函数详细说明.
-def Get_PlayerGameServerInitOK_OnDay(curPlayer):
-    return curPlayer.GetDictByKey(OnDayKey)
-
-def Set_PlayerGameServerInitOK_OnDayEx(curPlayer, value): return curPlayer.SetDict(OnDayExKey, value)
-def Get_PlayerGameServerInitOK_OnDayEx(curPlayer): return curPlayer.GetDictByKey(OnDayExKey)
-    
-## 保存OnWeek
-#  @param curPlayer 当前玩家
-#  @param value key值
-#  @return None
-#  @remarks 函数详细说明.
-def Set_PlayerGameServerInitOK_OnWeek(curPlayer, value):
-    curPlayer.SetDict(OnWeekKey, value)
-    #GameWorld.Log('Set_PlayerGameServerInitOK_OnWeek, value = %s'%( value ) , curPlayer.GetID())
-    return
-
-## 获取玩家字典 OnWeek
-#  @param curPlayer 当前玩家
-#  @return None
-#  @remarks 函数详细说明.
-def Get_PlayerGameServerInitOK_OnWeek(curPlayer):
-    return curPlayer.GetDictByKey(OnWeekKey)
-
-def Set_PlayerGameServerInitOK_OnWeekEx(curPlayer, value): return curPlayer.SetDict(OnWeekExKey, value)
-def Get_PlayerGameServerInitOK_OnWeekEx(curPlayer): return curPlayer.GetDictByKey(OnWeekExKey)
-
-## 保存OnMonth
-#  @param curPlayer 当前玩家
-#  @param value key值
-#  @return None
-#  @remarks 函数详细说明.
-def Set_PlayerGameServerInitOK_OnMonth(curPlayer , value):
-    curPlayer.SetDict(OnMonthKey , value)
-    #GameWorld.Log('Set_PlayerGameServerInitOK_OnMonth, value = %s'%( value ) , curPlayer.GetID())
-    return
-
-## 获取玩家字典 OnMonth
-#  @param curPlayer 当前玩家
-#  @return None
-#  @remarks 函数详细说明.
-def Get_PlayerGameServerInitOK_OnMonth(curPlayer):
-    return curPlayer.GetDictByKey(OnMonthKey)
-
-def Set_PlayerGameServerInitOK_OnMonthEx(curPlayer, value): return curPlayer.SetDict(OnMonthExKey, value)
-def Get_PlayerGameServerInitOK_OnMonthEx(curPlayer): return curPlayer.GetDictByKey(OnMonthExKey)
-
-## 保存OnYear
-#  @param curPlayer 当前玩家
-#  @param value key值
-#  @return None
-#  @remarks 函数详细说明.
-def Set_PlayerGameServerInitOK_OnYear(curPlayer, value):
-    curPlayer.SetDict(OnYearKey, value)
-    #GameWorld.Log('Set_PlayerGameServerInitOK_OnYear, value = %s'%( value ) , curPlayer.GetID())
-    return
-
-## 获取玩家字典 OnYear
-#  @param curPlayer 当前玩家
-#  @return None
-#  @remarks 函数详细说明.
-def Get_PlayerGameServerInitOK_OnYear(curPlayer):
-    return curPlayer.GetDictByKey(OnYearKey)
 
 #===============================================================================
 # //01 15 玩家在RouteServer初始化成功#tagPlayerRouteServerInitOK
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
index 2a84f19..54ae28a 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
@@ -77,15 +77,6 @@
     
     # 其他跨服功能
     
-    # 游戏服额外处理玩家
-    if GameWorld.IsMainServer():
-        playerManager = GameWorld.GetPlayerManager()
-        for i in xrange(playerManager.OnlineCount()):
-            curPlayer = playerManager.OnlineAt(i)
-            if not GameWorld.IsNormalPlayer(curPlayer):
-                continue
-            PlayerOnCrossCenterEvent(curPlayer, centerEventValue)
-            
     PlayerBillboard.OnDay(centerEventValue)
     return
 
@@ -214,7 +205,7 @@
     return
 
 #--------------------------------------------------------
-def PlayerOnCrossCenterEvent(curPlayer, centerEventValue=0):
+def PlayerOnCrossCenterEvent(curPlayer, centerEventValue=0, gmEvent=""):
     ## 跨服中心过天
     if not centerEventValue:
         centerEventValue = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_CrossCenterEvent)
@@ -223,7 +214,7 @@
         playerEventValue = centerEventValue
         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OnCrossEvent, centerEventValue)
         
-    if playerEventValue == centerEventValue:
+    if playerEventValue == centerEventValue and not gmEvent:
         return
     
     centerEventTime = GameWorld.ChangeStrToDatetime("%s" % centerEventValue, ChConfig.TYPE_Time_Format_YmdH)
@@ -239,7 +230,7 @@
     
     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OnCrossEvent, centerEventValue)
     
-    if (center_Day != player_Day or center_Month != player_Month or center_Year != player_Year):
+    if (center_Day != player_Day or center_Month != player_Month or center_Year != player_Year or gmEvent == "GMOnDay"):
         PlayerCrossCenterOnDay(curPlayer, centerEventValue)
         
     return
@@ -255,9 +246,10 @@
 
 def PlayerOnDay(curPlayer):
     #记录玩家字典值,待初始化后执行
-    if not curPlayer.GetGameServerInitOK():
-        GameServerRefresh.Set_PlayerGameServerInitOK_OnDay(curPlayer , 1)
-        return
+    #GameServer已废弃,不再验证
+    #if not curPlayer.GetGameServerInitOK():
+    #    GameServerRefresh.Set_PlayerGameServerInitOK_OnDay(curPlayer , 1)
+    #    return
     
     ondayValue = __Get_Can_OnDay(curPlayer)
     if not ondayValue:
@@ -380,9 +372,10 @@
 #  @remarks 函数详细说明.
 def PlayerOnWeek(curPlayer):
     #记录玩家字典值,待初始化后执行
-    if not curPlayer.GetGameServerInitOK():
-        GameServerRefresh.Set_PlayerGameServerInitOK_OnWeek(curPlayer , 1)
-        return
+    #GameServer已废弃,不再验证
+    #if not curPlayer.GetGameServerInitOK():
+    #    GameServerRefresh.Set_PlayerGameServerInitOK_OnWeek(curPlayer , 1)
+    #    return
     
     onWeekValue = __Get_Can_OnWeek(curPlayer)
     if not onWeekValue:
@@ -437,9 +430,10 @@
 #  @remarks 函数详细说明.
 def PlayerOnMonth(curPlayer):
     #记录玩家字典值,待初始化后执行
-    if not curPlayer.GetGameServerInitOK():
-        GameServerRefresh.Set_PlayerGameServerInitOK_OnMonth(curPlayer , 1)
-        return
+    #GameServer已废弃,不再验证
+    #if not curPlayer.GetGameServerInitOK():
+    #    GameServerRefresh.Set_PlayerGameServerInitOK_OnMonth(curPlayer , 1)
+    #    return
     
     onMonthValue = __Get_Can_OnMonth(curPlayer)
     if not onMonthValue:
@@ -477,9 +471,10 @@
 #  @remarks 函数详细说明.
 def PlayerOnYear(curPlayer):
     #记录玩家字典值,待初始化后执行
-    if not curPlayer.GetGameServerInitOK():
-        GameServerRefresh.Set_PlayerGameServerInitOK_OnYear(curPlayer , 1)
-        return
+    #GameServer已废弃,不再验证
+    #if not curPlayer.GetGameServerInitOK():
+    #    GameServerRefresh.Set_PlayerGameServerInitOK_OnYear(curPlayer , 1)
+    #    return
     
     curPlayerID = curPlayer.GetPlayerID()
     
@@ -501,9 +496,10 @@
 #  @remarks 函数详细说明.
 def PlayerOnHour(curPlayer):
     #记录玩家字典值,待初始化后执行
-    if not curPlayer.GetGameServerInitOK():
-        GameServerRefresh.Set_PlayerGameServerInitOK_OnHour(curPlayer , 1)
-        return
+    #GameServer已废弃,不再验证
+    #if not curPlayer.GetGameServerInitOK():
+    #    GameServerRefresh.Set_PlayerGameServerInitOK_OnHour(curPlayer , 1)
+    #    return
     
     curPlayerID = curPlayer.GetPlayerID()
     
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 5c1faa5..924a4e1 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py
@@ -149,11 +149,10 @@
 def __doPlayerOnDay(curPlayer):
     PlayerFamilyZhenbaoge.PlayerOnDay(curPlayer)
     PlayerFamilyTaofa.PlayerOnDay(curPlayer)
-    Do_MapServer_PlayerOnDay(curPlayer)
+    ResetDailyDonateCnt(curPlayer)
     return
 
 def OnPlayerLogin(curPlayer, tick):
-    Do_MapServer_PlayerLogin(curPlayer)
     if DBFamily.IsFamilyCross():
         GameWorld.DebugLog("公会已跨服不处理,由所属跨服服务器处理成员登录逻辑 OnPlayerLogin", curPlayer.GetPlayerID())
         return
@@ -163,10 +162,10 @@
 
 def OnCrossPlayerLogin(crossPlayer):
     ## 玩家上线,游戏服跨服通用,流程上当做以前GameServer处理公会一样,处理后再通知地图(现在的游戏服)
-    PlayerLoginRefreshFamily(crossPlayer)
+    PlayerLoginRefreshFamily(crossPlayer) # 必须先刷新
     Sync_RequestAddFamilyInfo(crossPlayer, False)
     PlayerTalk.NotifyTalkCache(crossPlayer, [IPY_GameWorld.tcFamily]) # 公会聊天缓存
-    #PlayerFamilyTaofa.OnPlayerLogin(curPlayer) 讨伐待修改
+    PlayerFamilyTaofa.OnCrossPlayerLogin(crossPlayer)
     return
 
 def OnPlayerLogout(curPlayer):
@@ -205,12 +204,13 @@
         C2S_FamilyMapPlayer(dataMsg, playerID)
     return
 
-def MapServer_FamilyRefresh(crossPlayer, familyID, isVoluntarily=0):
+def MapServer_FamilyRefresh(crossPlayer, familyID, isVoluntarily=0, isLogin=False):
     ''' 相当于GameServer调用 curPlayer.MapServer_FamilyRefresh()
     '''
     playerID = crossPlayer.GetPlayerID()
     FmLV = 0 # 职位
     FamilyLV = 0 # 公会等级
+    JoinTime = 0
     FamilyName = ""
     EmblemID, EmblemWord = 0, ""
     if familyID:
@@ -224,6 +224,7 @@
             member = curFamily.FindMember(playerID)
             if member:
                 FmLV = member.GetFmLV()
+                JoinTime = member.GetJoinTime()
         else:
             familyID = 0
                     
@@ -233,9 +234,11 @@
     
     doData = {"FamilyID":familyID}
     if familyID:
-        doData.update({"FmLV":FmLV, "FamilyLV":FamilyLV, "FamilyName":FamilyName, "EmblemID":EmblemID, "EmblemWord":EmblemWord})
+        doData.update({"FmLV":FmLV, "JoinTime":JoinTime, "FamilyLV":FamilyLV, "FamilyName":FamilyName, "EmblemID":EmblemID, "EmblemWord":EmblemWord})
     if isVoluntarily:
         doData["isVoluntarily"] = 1
+    if isLogin:
+        doData["isLogin"] = 1
     SendToFamilyMapPlayer(crossPlayer, "FamilyRefresh", doData)
     return
 
@@ -247,7 +250,7 @@
     refreshFamilyID = familyMgr.GetPlayerFamilyID(playerID)
     GameWorld.DebugLog("PlayerLoginRefreshFamily playerID=%s,refreshFamilyID=%s" % (playerID, refreshFamilyID))
     crossPlayer.SetFamilyID(refreshFamilyID)
-    MapServer_FamilyRefresh(crossPlayer, refreshFamilyID) # 登录
+    MapServer_FamilyRefresh(crossPlayer, refreshFamilyID, isLogin=True) # 登录
     familyID = refreshFamilyID
     if not familyID:
         return
@@ -2056,27 +2059,20 @@
         Do_MapServer_FamilyRefresh(curPlayer, doData)
     return
 
-def Do_MapServer_PlayerOnDay(curPlayer):
-    ResetDailyDonateCnt(curPlayer)
-    return
-
-def Do_MapServer_PlayerLogin(curPlayer):
-    DBFamily.Sync_FamilyCrossInfo(curPlayer)
-    SyncDonateCntInfo(curPlayer)
-    PlayerFamilyZhenbaoge.OnPlayerLogin(curPlayer)
-    return
-
 def Do_MapServer_FamilyRefresh(curPlayer, doData):
     tick = GameWorld.GetGameWorld().GetTick()
     playerID = curPlayer.GetPlayerID()
     refreshFamilyID = doData["FamilyID"]
     refreshFmLV = doData.get("FmLV", 0)
+    refreshJoinTime = doData.get("JoinTime", 0)
     refreshFamilyLV = doData.get("FamilyLV", 0)
     refreshFamilyName = doData.get("FamilyName", "")
     refreshEmblemID = doData.get("EmblemID", 0)
     refreshEmblemWord = doData.get("EmblemWord", "")
+    isLogin = doData.get("isLogin", 0) # 是否登录刷新的
     
     PlayerViewCache.UpdPlayerViewFamilyInfo(playerID, refreshFamilyID, refreshFamilyName, refreshEmblemID, refreshEmblemWord)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyJoinTime, refreshJoinTime)
     
     lastFamilyID = curPlayer.GetFamilyID()
     lastFamilyLV = curPlayer.GetFamilyLV() # 公会等级,非职位等级
@@ -2118,6 +2114,17 @@
         
     #---通知客户端刷新属性---
     curPlayer.View_FamilyInfoRefresh() #//04 30 玩家家族名字职位等信息刷新#tagPlayerInFamilyInfoRefresh
+    
+    if isLogin:
+        Do_MapServer_PlayerLogin(curPlayer)
+    return
+
+def Do_MapServer_PlayerLogin(curPlayer):
+    ## 地图公会玩家的登录逻辑由最新所属公会刷新后处理
+    DBFamily.Sync_FamilyCrossInfo(curPlayer)
+    SyncDonateCntInfo(curPlayer)
+    PlayerFamilyZhenbaoge.OnPlayerLogin(curPlayer)
+    PlayerFamilyTaofa.OnPlayerLogin(curPlayer)
     return
 
 def __OnEnterFamily(curPlayer, tick):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamilyTaofa.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamilyTaofa.py
index 5b6ec67..bf0bfd7 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamilyTaofa.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamilyTaofa.py
@@ -24,6 +24,7 @@
 import ItemControler
 import PlayerControl
 import PlayerFamily
+import CrossPlayer
 import GameWorld
 import DBDataMgr
 
@@ -64,38 +65,15 @@
 #UserDict {"atkList":[[atkTime, 本次贡献箱子数, 本次总伤害, atkType], ...], ...}
 #atkList = actionData.GetUserDict().get("atkList", [])
 #actionData.GetUserDict().update({"atkList":atkList})
+#UserDict 存储的key定义
+UserKey_AtkList = "atkList" # 攻击记录
+UserKey_Info = "info" # 离开玩家基本信息
 
 AtkType_Normal = 0 # 常规斩杀
 AtkType_Anger = 1 # 怒气斩杀
 
 def OnDay(family):
     OnTaofaReset(family)     
-    return
-
-def PlayerOnDay(curPlayer):
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaCnt, 0)
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaItemAddCnt, 0)
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaBuZhenState, 0)
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaAnger, 0)
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaBoxUnGetCnt, 0)
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaLeaveGetCnt, 0)
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaBoxTotalGetCnt, 0)
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaBoxContribCnt, 0)
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaBoxHurt, 0)
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaBoxHurtEx, 0)
-    #玩家自己过天非时间过天的,需要刷新一下
-    familyID = curPlayer.GetFamilyID()
-    curFamily = DBDataMgr.GetFamilyMgr().FindFamily(familyID)
-    RefreshPlayerAwardBoxCnt(curFamily, curPlayer, unSyncIDList=[curPlayer.GetPlayerID()])
-    SyncTaofaInfo(curPlayer)
-    return
-
-def OnPlayerLogin(curPlayer):
-    familyID = curPlayer.GetFamilyID()
-    curFamily = DBDataMgr.GetFamilyMgr().FindFamily(familyID)
-    RefreshPlayerAwardBoxCnt(curFamily, curPlayer, unSyncIDList=[curPlayer.GetPlayerID()])
-    SyncTaofaInfo(curPlayer)
-    PlayerFamily.SendFamilyActionInfo(curPlayer, familyID, ActionType)
     return
 
 def OnTaofaReset(family):
@@ -109,20 +87,24 @@
     PlayerFamily.SendFamilyAction(gActionData)
     return
 
-def OnTaofaResetPlayer(curPlayer):
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaCnt, 0)
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaItemAddCnt, 0)
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaBuZhenState, 0)
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaAnger, 0)
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaBoxUnGetCnt, 0)
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaLeaveGetCnt, 0)
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaBoxTotalGetCnt, 0)
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaBoxContribCnt, 0)
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaBoxHurt, 0)
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaBoxHurtEx, 0)
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaBoxHurtHis, 0)
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaBoxHurtHisEx, 0)
-    SyncTaofaInfo(curPlayer)
+def OnCrossPlayerLogin(crossPlayer):
+    familyID = crossPlayer.GetFamilyID()
+    if not familyID:
+        return
+    curFamily = DBDataMgr.GetFamilyMgr().FindFamily(familyID)
+    if not curFamily:
+        return
+    playerID = crossPlayer.GetPlayerID()
+    PlayerFamily.SendFamilyActionInfo(crossPlayer, familyID, ActionType)
+    memContribDict = GetMemContriBoxInfo(curFamily)
+    if memContribDict:
+        SyncMemContribInfo(curFamily, [playerID])
+    return
+
+def OnCrossPlayerEnterFamily(crossPlayer):
+    ## 玩家进入新公会
+    familyID = crossPlayer.GetFamilyID()
+    PlayerFamily.SendFamilyActionInfo(crossPlayer, familyID, ActionType)
     return
 
 def OnFamilyMemberLeave(family, leavePlayerID):
@@ -132,148 +114,8 @@
     if not actionData:
         return
     memInfo = PlayerViewCache.GetPlayerBaseViewInfo(leavePlayerID)
-    actionData.GetUserDict().update({"info":memInfo})
+    actionData.GetUserDict().update({UserKey_Info:memInfo})
     PlayerFamily.SendFamilyAction([actionData])
-    return
-
-def OnPlayerLeaveFamily(curPlayer):
-    ## 玩家退出了公会,针对玩家个人的处理
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaAnger, 0)
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaBoxUnGetCnt, 0)
-    totalGetCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyTaofaBoxTotalGetCnt)
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaLeaveGetCnt, totalGetCnt)
-    GameWorld.DebugLog("退出公会记录讨伐已累计领取宝箱数: totalGetCnt=%s" % totalGetCnt)
-    SyncTaofaInfo(curPlayer)
-    return
-
-def OnCrossPlayerEnterFamily(crossPlayer):
-    ## 玩家进入新公会
-    familyID = crossPlayer.GetFamilyID()
-    PlayerFamily.SendFamilyActionInfo(crossPlayer, familyID, ActionType)
-    return
-
-#def RefreshFamilyBuZhenInfo(family):
-#    ## 刷新公会公共布阵信息
-#    familyID = family.GetID()
-#    curTime = int(time.time())
-#    bzDuration = IpyGameDataPY.GetFuncCfg("FamilyTaofaBuzhen", 4) * 60 # 有效时长秒
-#    maxLayer = IpyGameDataPY.GetFuncCfg("FamilyTaofaBuzhen", 3)
-#    
-#    gLayer = 0
-#    gEndTime = 0
-#    gActionData = None
-#    familyAction = DBDataMgr.GetFamilyActionMgr().GetFamilyAction(familyID, ActionType)
-#    for index in range(0, familyAction.Count()):
-#        actionData = familyAction.At(index)
-#        dataID = GetFAPlayerID(actionData)
-#        if dataID == ActionGlobalID:
-#            gActionData = actionData
-#            continue
-#        bzTime = GetFABuzhenTime(actionData)
-#        if not bzTime:
-#            continue
-#        endTime = bzTime + bzDuration
-#        if endTime <= curTime:
-#            continue
-#        
-#        if not maxLayer or gLayer < maxLayer:
-#            gLayer += 1
-#            
-#        if gEndTime < endTime:
-#            gEndTime = endTime
-#            
-#    GameWorld.DebugLog("刷新公会公共布阵信息: familyID=%s,gLayer=%s,gEndTime=%s" % (familyID, gLayer, GameWorld.ChangeTimeNumToStr(gEndTime)))
-#    if not gActionData:
-#        gActionData = familyAction.AddAction()
-#        SetFAPlayerID(gActionData, ActionGlobalID)
-#        
-#    SetFABuzhenEndTime(gActionData, gEndTime)
-#    SetFABuzhenLayer(gActionData, gLayer)
-#    PlayerFamily.SendFamilyAction(gActionData)
-#    return
-
-def RefreshPlayerAwardBoxCnt(family, curPlayer=None, unSyncIDList=[]):
-    ## 刷新玩家可领取的宝箱数
-    # @param curPlayer: None时刷新所有成员
-    if not family:
-        return
-    
-    familyID = family.GetID()
-    memContribDict = {}      
-    familyAction = DBDataMgr.GetFamilyActionMgr().GetFamilyAction(familyID, ActionType)
-    for index in range(0, familyAction.Count()):
-        actionData = familyAction.At(index)
-        memID = GetFAPlayerID(actionData)
-        if memID == ActionGlobalID:
-            continue
-        contribList = []
-        atkList = actionData.GetUserDict().get("atkList", [])
-        for atkInfo in atkList:
-            atkTime = atkInfo[AtkIndex_AtkTime]
-            contribBoxCnt = atkInfo[AtkIndex_ContribBoxCnt]
-            if contribBoxCnt > 0:
-                contribList.append([atkTime, contribBoxCnt])
-        if contribList:
-            memContribDict[memID] = contribList
-            
-    awardBoxMax = IpyGameDataPY.GetFuncCfg("FamilyTaofaBox", 3)
-    GameWorld.DebugLog("刷新公会成员可领取的宝箱数: familyID=%s,memContribDict=%s" % (familyID, memContribDict))
-    if curPlayer:
-        member = family.FindMember(curPlayer.GetPlayerID())
-        if not member:
-            return
-        __doUpdPlayerAwardBoxCnt(curPlayer, member, memContribDict, awardBoxMax, unSyncIDList)
-        return
-    
-    playerManager = GameWorld.GetPlayerManager()
-    for index in xrange(family.GetCount()):
-        member = family.GetAt(index)
-        playerID = member.GetPlayerID()
-        curPlayer = playerManager.FindPlayerByID(playerID)
-        if not curPlayer:
-            continue
-        __doUpdPlayerAwardBoxCnt(curPlayer, member, memContribDict, awardBoxMax, unSyncIDList)
-    return
-
-def __doUpdPlayerAwardBoxCnt(curPlayer, member, memContribDict, awardBoxMax, unSyncIDList):
-    playerID = curPlayer.GetPlayerID()
-    joinTime = member.GetJoinTime()
-    leaveGetCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyTaofaLeaveGetCnt) # 上次离开公会时累计领取数
-    boxTotalGetCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyTaofaBoxTotalGetCnt) # 已领取宝箱数
-    curFamilyGetCnt = boxTotalGetCnt - leaveGetCnt # 来到本公会后累计领取数
-    boxUnGetCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyTaofaBoxUnGetCnt) # 未领取宝箱数
-    canAddBoxMax = awardBoxMax - boxTotalGetCnt - boxUnGetCnt # 还可领取的箱子数
-    if canAddBoxMax <= 0:
-        GameWorld.DebugLog("    成员可领取宝箱已达上限不刷新: playerID=%s,boxTotalGetCnt(%s)+boxUnGetCnt(%s) >= %s" 
-                           % (playerID, boxTotalGetCnt, boxUnGetCnt, awardBoxMax))
-        return
-    
-    curFamilyCanGet = 0 # 在本公会累计可领取箱子数
-    for contribList in memContribDict.values():
-        for atkTime, contribBoxCnt in contribList:
-            if joinTime >= atkTime:
-                #GameWorld.DebugLog("    加入公会之前的箱子不能领取: joinTime=%s > atkTime(%s),contribBoxCnt=%s" % (joinTime, atkTime, contribBoxCnt))
-                continue
-            curFamilyCanGet += contribBoxCnt
-            
-    addUnGetBox = min(curFamilyCanGet - curFamilyGetCnt - boxUnGetCnt, canAddBoxMax)
-    if addUnGetBox <= 0:
-        GameWorld.DebugLog("    成员当前没有可领取的宝箱不刷新: playerID=%s,curFamilyCanGet=%s,curFamilyGetCnt=%s(%s-%s),boxUnGetCnt=%s,awardBoxMax=%s,canAddBoxMax=%s" 
-                           % (playerID, curFamilyCanGet, curFamilyGetCnt, boxTotalGetCnt, leaveGetCnt, boxUnGetCnt, awardBoxMax, canAddBoxMax))
-        return
-    updBoxUnGetCnt = boxUnGetCnt + addUnGetBox
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaBoxUnGetCnt, updBoxUnGetCnt)
-    GameWorld.DebugLog("    成员可领取的宝箱数: playerID=%s,addUnGetBox=%s,updBoxUnGetCnt=%s,curFamilyCanGet=%s,curFamilyGetCnt=%s(%s-%s),boxUnGetCnt=%s,awardBoxMax=%s,canAddBoxMax=%s" 
-                       % (playerID, addUnGetBox, updBoxUnGetCnt, curFamilyCanGet, curFamilyGetCnt, boxTotalGetCnt, leaveGetCnt, boxUnGetCnt, awardBoxMax, canAddBoxMax))
-    if not unSyncIDList or playerID not in unSyncIDList:
-        SyncTaofaInfo(curPlayer)
-    return
-
-def AddTaofaCntByItem(curPlayer, addCnt):
-    ## 物品增加副本次数
-    itemAddCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyTaofaItemAddCnt)
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaItemAddCnt, itemAddCnt + addCnt)
-    SyncTaofaInfo(curPlayer)
     return
 
 #// A6 13 公会讨伐 #tagCSFamilyTaofaOP
@@ -290,36 +132,63 @@
     familyID = curPlayer.GetFamilyID()
     if not familyID:
         GameWorld.DebugLog("没有仙盟无法操作!", playerID)
-        return    
+        return
+    
+    reqDataEx = {}
+    
     # 布阵
     if opType == 1:
-        __doBuzhen(curPlayer)
+        if curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyTaofaBuZhenState):
+            GameWorld.DebugLog("已布阵过!", playerID)
+            return
     # 斩杀
     else:
-        __doZhanshaAtk(curPlayer)
+        _, _, maxAnger = IpyGameDataPY.GetFuncEvalCfg("FamilyTaofaAtk", 4)
+        anger = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyTaofaAnger)
+        atkType = AtkType_Anger if anger >= maxAnger else AtkType_Normal
+        
+        atkCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyTaofaCnt)
+        if atkType == AtkType_Normal:
+            itemAddCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyTaofaItemAddCnt)
+            freeCnt = IpyGameDataPY.GetFuncCfg("FamilyTaofaAtk", 1)
+            canAtkCnt = freeCnt + itemAddCnt - atkCnt
+            if canAtkCnt <= 0:
+                GameWorld.DebugLog("公会讨伐没有斩杀次数: atkCnt=%s >= freeCnt(%s) + itemAddCnt(%s)" % (atkCnt, freeCnt, itemAddCnt), playerID)
+                return
+            
+        fightPower = PlayerControl.GetFightPower(curPlayer)
+        boxContribCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyTaofaBoxContribCnt)
+        boxHurt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyTaofaBoxHurt)
+        boxHurtEx = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyTaofaBoxHurtEx)
+        boxHurtTotal = boxHurt + boxHurtEx * ChConfig.Def_PerPointValue
+        boxHurtHis = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyTaofaBoxHurtHis)
+        boxHurtHisEx = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyTaofaBoxHurtHisEx)
+        boxHurtTotalHis = boxHurtHis + boxHurtHisEx * ChConfig.Def_PerPointValue
+        reqDataEx = {"anger":anger, "atkType":atkType, "atkCnt":atkCnt, "fightPower":fightPower, 
+                     "boxContribCnt":boxContribCnt, "boxHurtTotal":boxHurtTotal, "boxHurtTotalHis":boxHurtTotalHis}
+        
+    PlayerFamily.FamilyPyPackForwarding(curPlayer, clientData, tick, "PlayerFamilyTaofa.__OnFamilyTaofaOP", True, 20, reqDataEx=reqDataEx)
+    return
+def __OnFamilyTaofaOP(crossPlayer, clientData, tick, fromServerID=0, reqDataEx=None):
+    opType = clientData.OpType
+    # 布阵
+    if opType == 1:
+        __doBuzhen(crossPlayer)
+    else:
+        __doZhanshaAtk(crossPlayer, reqDataEx)
+        
+    return True
+
+def __OnFamilyTaofaOP_Ret(curPlayer, clientData, isOK):
+    if not isOK:
+        return
+    SyncTaofaInfo(curPlayer)
     return
 
-def GetFamilyBuzhenLayer(familyID):
-    ## 获取并刷新当前公会有效布阵层数
-    familyAction = DBDataMgr.GetFamilyActionMgr().GetFamilyAction(familyID, ActionType)
-    gActionData = familyAction.GetActionDataByValue1(ActionGlobalID, True)
-    gEndTime = GetFABuzhenEndTime(gActionData)
-    gLayer = GetFABuzhenLayer(gActionData)
-    if (gEndTime or gLayer) and int(time.time()) > gEndTime:
-        SetFABuzhenEndTime(gActionData, 0)
-        SetFABuzhenLayer(gActionData, 0)
-        #PlayerFamily.SendFamilyAction(gActionData) 失效不用同步,前端根据EndTime判断即可
-        gEndTime = 0
-        gLayer = 0
-    return gLayer, gActionData
-
-def __doBuzhen(curPlayer):
+def __doBuzhen(crossPlayer):
     ## 布阵
-    playerID = curPlayer.GetPlayerID()
-    if curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyTaofaBuZhenState):
-        GameWorld.DebugLog("已布阵过!", playerID)
-        return
-    familyID = curPlayer.GetFamilyID()
+    playerID = crossPlayer.GetPlayerID()
+    familyID = crossPlayer.GetFamilyID()
     curFamily = DBDataMgr.GetFamilyMgr().FindFamily(familyID)
     if not curFamily:
         return
@@ -343,38 +212,34 @@
     PlayerFamily.SendFamilyAction([gActionData, actionData])
     
     # 个人记录
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaBuZhenState, 1)
-    SyncTaofaInfo(curPlayer)
+    CrossPlayer.SetPlayerNomalDict(crossPlayer, {ChConfig.Def_Player_Dict_FamilyTaofaBuZhenState:1}, True)
     return
 
-def __doZhanshaAtk(curPlayer):
+def __doZhanshaAtk(crossPlayer, reqDataEx):
     ## 斩杀攻击
-    playerID = curPlayer.GetPlayerID()
-    familyID = curPlayer.GetFamilyID()
+    if not reqDataEx:
+        return
+    playerID = crossPlayer.GetPlayerID()
+    familyID = crossPlayer.GetFamilyID()
     curFamily = DBDataMgr.GetFamilyMgr().FindFamily(familyID)
     if not curFamily:
         return
     
     commAddAnger, superAddAnger, maxAnger = IpyGameDataPY.GetFuncEvalCfg("FamilyTaofaAtk", 4)
-    anger = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyTaofaAnger)
-    atkType = AtkType_Anger if anger >= maxAnger else AtkType_Normal
-    
-    if atkType == AtkType_Normal:
-        atkCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyTaofaCnt)
-        itemAddCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyTaofaItemAddCnt)
-        freeCnt = IpyGameDataPY.GetFuncCfg("FamilyTaofaAtk", 1)
-        canAtkCnt = freeCnt + itemAddCnt - atkCnt
-        if canAtkCnt <= 0:
-            GameWorld.DebugLog("公会讨伐没有斩杀次数: atkCnt=%s >= freeCnt(%s) + itemAddCnt(%s)" % (atkCnt, freeCnt, itemAddCnt), playerID)
-            return
-        
     atkTime = int(time.time())
+    
+    fightPower = reqDataEx.get("fightPower", 1)
+    anger = reqDataEx.get("anger", 0)
+    atkCnt = reqDataEx.get("atkCnt", 0)
+    atkType = reqDataEx.get("atkType", AtkType_Normal)
+    boxContribCnt = reqDataEx.get("boxContribCnt", 0)
+    boxHurtTotal = reqDataEx.get("boxHurtTotal", 0)
+    boxHurtTotalHis = reqDataEx.get("boxHurtTotalHis", 0)
     
     # 计算属性
     gLayer, _ = GetFamilyBuzhenLayer(familyID)
     maxLayer = IpyGameDataPY.GetFuncCfg("FamilyTaofaBuzhen", 3)
     gLayer = min(gLayer, maxLayer) # 限制生效的最大布阵层数
-    fightPower = PlayerControl.GetFightPower(curPlayer)
     superRate = IpyGameDataPY.GetFuncCfg("FamilyTaofaBuzhen", 1)
     superRatio = IpyGameDataPY.GetFuncCfg("FamilyTaofaAtk", 3) # 暴击伤害倍值
     addSuperRatePerLayer, addDamPerLayer = IpyGameDataPY.GetFuncEvalCfg("FamilyTaofaBuzhen", 2)
@@ -393,13 +258,6 @@
     faHurtTotal = GetFAHurtTotal(actionData) + GetFAHurtTotalEx(actionData) * ChConfig.Def_PerPointValue
     GameWorld.DebugLog("faAtkCnt=%s,faHurtTotal=%s,faContribBoxCnt=%s" % (faAtkCnt, faHurtTotal, faContribBoxCnt), playerID)
     
-    boxContribCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyTaofaBoxContribCnt)
-    boxHurt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyTaofaBoxHurt)
-    boxHurtEx = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyTaofaBoxHurtEx)
-    boxHurtTotal = boxHurt + boxHurtEx * ChConfig.Def_PerPointValue
-    boxHurtHis = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyTaofaBoxHurtHis)
-    boxHurtHisEx = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyTaofaBoxHurtHisEx)
-    boxHurtTotalHis = boxHurtHis + boxHurtHisEx * ChConfig.Def_PerPointValue
     GameWorld.DebugLog("boxContribCnt=%s,boxHurtTotal=%s,boxHurtTotalHis=%s" % (boxContribCnt, boxHurtTotal, boxHurtTotalHis), playerID)
     
     calcHurtCnt = 1 # 计算伤害次数
@@ -441,28 +299,36 @@
         updContribBoxCnt = min(updContribBoxCnt + loopContribBoxCnt, contribBoxMax)
         GameWorld.DebugLog("计算循环贡献宝箱: updContribBoxCnt=%s,loopHurtTotal=%s,loopNeedHurt=%s,loopContribBoxCnt=%s,contribBoxMax=%s" 
                            % (updContribBoxCnt, loopHurtTotal, loopNeedHurt, loopContribBoxCnt, contribBoxMax), playerID)
+        
+    setPlayerDict = {} # 更新玩家永久的字典值
+    setPlayerDayDict = {} # 更新玩家每日重置的字典值
     addContribCnt = 0
     if updContribBoxCnt > boxContribCnt:
         addContribCnt = updContribBoxCnt - boxContribCnt
         faContribBoxCnt += addContribCnt
-        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaBoxContribCnt, updContribBoxCnt)
+        setPlayerDayDict[ChConfig.Def_Player_Dict_FamilyTaofaBoxContribCnt] = updContribBoxCnt
         GameWorld.DebugLog("更新增加贡献宝箱: addContribCnt=%s,updContribBoxCnt=%s,faContribBoxCnt=%s" % (addContribCnt, updContribBoxCnt, faContribBoxCnt), playerID)
         
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaAnger, anger)
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaBoxHurt, boxHurtTotal % ChConfig.Def_PerPointValue)
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaBoxHurtEx, boxHurtTotal / ChConfig.Def_PerPointValue)
+    setPlayerDayDict[ChConfig.Def_Player_Dict_FamilyTaofaAnger] = anger
+    setPlayerDayDict[ChConfig.Def_Player_Dict_FamilyTaofaBoxHurt] = boxHurtTotal % ChConfig.Def_PerPointValue
+    setPlayerDayDict[ChConfig.Def_Player_Dict_FamilyTaofaBoxHurtEx] = boxHurtTotal / ChConfig.Def_PerPointValue
     if boxHurtTotal > boxHurtTotalHis:
         boxHurtTotalHis = boxHurtTotal
-        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaBoxHurtHis, boxHurtTotalHis % ChConfig.Def_PerPointValue)
-        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaBoxHurtHisEx, boxHurtTotalHis / ChConfig.Def_PerPointValue)
+        setPlayerDict[ChConfig.Def_Player_Dict_FamilyTaofaBoxHurtHis] = boxHurtTotalHis % ChConfig.Def_PerPointValue
+        setPlayerDict[ChConfig.Def_Player_Dict_FamilyTaofaBoxHurtHisEx] = boxHurtTotalHis / ChConfig.Def_PerPointValue
         
     awardItemList = []
     # 常规攻击: 给斩杀攻击奖励,加次数
     if atkType == AtkType_Normal:
-        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaCnt, atkCnt + 1)
+        setPlayerDayDict[ChConfig.Def_Player_Dict_FamilyTaofaCnt] = atkCnt + 1
         atkItemAwardList = IpyGameDataPY.GetFuncEvalCfg("FamilyTaofaAtk", 2) # 每次斩杀获得个人奖励列表 [[物品ID,个数], ...]
         awardItemList += atkItemAwardList
-        ItemControler.GivePlayerItemOrMail(curPlayer, awardItemList, event=["FamilyTaofa", False, {}], isNotifyAward=False)
+        
+    CrossPlayer.SetPlayerNomalDict(crossPlayer, setPlayerDayDict, True)
+    if setPlayerDict:
+        CrossPlayer.SetPlayerNomalDict(crossPlayer, setPlayerDayDict, False)
+    if awardItemList:
+        CrossPlayer.GivePlayerResources(crossPlayer, awardItemList, eventName="FamilyTaofa", isNotifyAward=False)
         
     # 更新Action记录
     SetFAAtkTime(actionData, atkTime)
@@ -470,19 +336,63 @@
     SetFAHurtTotal(actionData, faHurtTotal % ChConfig.Def_PerPointValue)
     SetFAHurtTotalEx(actionData, faHurtTotal / ChConfig.Def_PerPointValue)
     SetFAContribBoxCnt(actionData, faContribBoxCnt)
-    atkList = actionData.GetUserDict().get("atkList", [])
+    atkList = actionData.GetUserDict().get(UserKey_AtkList, [])
     atkList.append([atkTime, addContribCnt, hurtTotal, atkType])
-    actionData.GetUserDict().update({"atkList":atkList})
+    actionData.GetUserDict().update({UserKey_AtkList:atkList})
     PlayerFamily.SendFamilyAction([actionData])
     
     # 同步: 攻击 -> 宝箱 -> 其他
-    SyncTaofaAtkRet(curPlayer, atkType, hurtList, awardItemList)
+    SyncTaofaAtkRet(crossPlayer, atkType, hurtList, awardItemList)
     if addContribCnt:
-        RefreshPlayerAwardBoxCnt(curFamily, unSyncIDList=[playerID])
-    SyncTaofaInfo(curPlayer)
+        SyncMemContribInfo(curFamily)
     return
 
-def GMAddMemTaofaAtk(curPlayer, curFamily, playerID, hurtValue, isAnger):
+def SyncMemContribInfo(curFamily, onlyIDList=[]):
+    memContribDict = GetMemContriBoxInfo(curFamily)
+    if not memContribDict:
+        return
+    CrossPlayer.SendToFamilyPlayer(curFamily.GetID(), ShareDefine.C2S_TaofaMemContrib, {"memContribDict":memContribDict}, 
+                                   onlyIDList=onlyIDList, havePlayerCall=__doUpdPlayerAwardBoxCnt)
+    return
+
+def GetFamilyBuzhenLayer(familyID):
+    ## 获取并刷新当前公会有效布阵层数
+    familyAction = DBDataMgr.GetFamilyActionMgr().GetFamilyAction(familyID, ActionType)
+    gActionData = familyAction.GetActionDataByValue1(ActionGlobalID, True)
+    gEndTime = GetFABuzhenEndTime(gActionData)
+    gLayer = GetFABuzhenLayer(gActionData)
+    if (gEndTime or gLayer) and int(time.time()) > gEndTime:
+        SetFABuzhenEndTime(gActionData, 0)
+        SetFABuzhenLayer(gActionData, 0)
+        #PlayerFamily.SendFamilyAction(gActionData) 失效不用同步,前端根据EndTime判断即可
+        gEndTime = 0
+        gLayer = 0
+    return gLayer, gActionData
+
+def GetMemContriBoxInfo(family):
+    ## 获取公会成员贡献宝箱记录
+    if not family:
+        return {}
+    familyID = family.GetID()
+    memContribDict = {}      
+    familyAction = DBDataMgr.GetFamilyActionMgr().GetFamilyAction(familyID, ActionType)
+    for index in range(0, familyAction.Count()):
+        actionData = familyAction.At(index)
+        memID = GetFAPlayerID(actionData)
+        if memID == ActionGlobalID:
+            continue
+        contribList = []
+        atkList = actionData.GetUserDict().get("atkList", [])
+        for atkInfo in atkList:
+            atkTime = atkInfo[AtkIndex_AtkTime]
+            contribBoxCnt = atkInfo[AtkIndex_ContribBoxCnt]
+            if contribBoxCnt > 0:
+                contribList.append([atkTime, contribBoxCnt])
+        if contribList:
+            memContribDict[memID] = contribList
+    return memContribDict
+
+def GMAddMemTaofaAtk(crossPlayer, curFamily, playerID, hurtValue, isAnger):
     ## GM添加假的讨伐数据
     
     familyID = curFamily.GetID()
@@ -540,7 +450,7 @@
         addContribCnt = updContribBoxCnt - boxContribCnt
         faContribBoxCnt += addContribCnt
         
-    GameWorld.DebugAnswer(curPlayer, "讨伐ID:%s,伤:%s,箱:%s/%s,怒:%s" % (playerID, hurtValue, addContribCnt, updContribBoxCnt, int(isAnger)))
+    GameWorld.DebugAnswer(crossPlayer, "讨伐ID:%s,伤:%s,箱:%s/%s,怒:%s" % (playerID, hurtValue, addContribCnt, updContribBoxCnt, int(isAnger)))
     
     # 更新Action记录
     SetFAAtkTime(actionData, atkTime)
@@ -548,11 +458,139 @@
     SetFAHurtTotal(actionData, faHurtTotal % ChConfig.Def_PerPointValue)
     SetFAHurtTotalEx(actionData, faHurtTotal / ChConfig.Def_PerPointValue)
     SetFAContribBoxCnt(actionData, faContribBoxCnt)
-    atkList = actionData.GetUserDict().get("atkList", [])
+    atkList = actionData.GetUserDict().get(UserKey_AtkList, [])
     atkList.append([atkTime, addContribCnt, hurtTotal, atkType])
-    actionData.GetUserDict().update({"atkList":atkList})
+    actionData.GetUserDict().update({UserKey_AtkList:atkList})
     
     return actionData
+
+def SyncTaofaAtkRet(crossPlayer, atkType, hurtList, awardItemList):    
+    atkHurtList = []
+    for totalHurt, isSuper in hurtList:
+        atkHurt = ChPyNetSendPack.tagSCFamilyTaofaAtkHurt()
+        atkHurt.IsSuper = isSuper
+        atkHurt.HurtValue = totalHurt % ChConfig.Def_PerPointValue
+        atkHurt.HurtValueEx = totalHurt / ChConfig.Def_PerPointValue
+        atkHurtList.append(atkHurt)
+        
+    itemList = []
+    for itemID, itemCount in awardItemList:
+        item = ChPyNetSendPack.tagSCFamilyTaofaAtkItem()
+        item.ItemID = itemID
+        item.Count = itemCount
+        itemList.append(item)
+        
+    clientPack = ChPyNetSendPack.tagSCFamilyTaofaAtkRet()
+    clientPack.AtkType = atkType
+    clientPack.HurtList = atkHurtList
+    clientPack.HurtCount = len(clientPack.HurtList)
+    clientPack.ItemList = itemList
+    clientPack.ItemCount = len(clientPack.ItemList)
+    CrossPlayer.SendFakePack(crossPlayer, clientPack)
+    return
+
+## -----------------------------------以下为游戏服地图逻辑-------------------------------------------
+
+def PlayerOnDay(curPlayer):
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaCnt, 0)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaItemAddCnt, 0)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaBuZhenState, 0)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaAnger, 0)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaBoxUnGetCnt, 0)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaLeaveGetCnt, 0)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaBoxTotalGetCnt, 0)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaBoxContribCnt, 0)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaBoxHurt, 0)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaBoxHurtEx, 0)
+    SyncTaofaInfo(curPlayer)
+    return
+
+def OnPlayerLogin(curPlayer):
+    SyncTaofaInfo(curPlayer)
+    return
+
+def OnTaofaResetPlayer(curPlayer):
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaCnt, 0)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaItemAddCnt, 0)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaBuZhenState, 0)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaAnger, 0)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaBoxUnGetCnt, 0)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaLeaveGetCnt, 0)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaBoxTotalGetCnt, 0)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaBoxContribCnt, 0)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaBoxHurt, 0)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaBoxHurtEx, 0)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaBoxHurtHis, 0)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaBoxHurtHisEx, 0)
+    SyncTaofaInfo(curPlayer)
+    return
+
+def OnPlayerLeaveFamily(curPlayer):
+    ## 玩家退出了公会,针对玩家个人的处理
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaAnger, 0)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaBoxUnGetCnt, 0)
+    totalGetCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyTaofaBoxTotalGetCnt)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaLeaveGetCnt, totalGetCnt)
+    GameWorld.DebugLog("退出公会记录讨伐已累计领取宝箱数: totalGetCnt=%s" % totalGetCnt)
+    SyncTaofaInfo(curPlayer)
+    return
+
+def C2S_TaofaMemContrib(dataMsg):
+    familyID = dataMsg["familyID"]
+    playerIDList = dataMsg["playerIDList"]
+    playerManager = GameWorld.GetPlayerManager()
+    for playerID in playerIDList:
+        curPlayer = playerManager.FindPlayerByID(playerID)
+        if curPlayer == None:
+            continue
+        __doUpdPlayerAwardBoxCnt(curPlayer, familyID, dataMsg)
+    return
+
+def __doUpdPlayerAwardBoxCnt(curPlayer, familyID, dataMsg):
+    memContribDict = dataMsg["memContribDict"]
+    playerFamilyID = curPlayer.GetFamilyID()
+    playerID = curPlayer.GetPlayerID()
+    joinTime = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyJoinTime)
+    if not joinTime or not playerFamilyID or playerFamilyID != familyID or not memContribDict:
+        return
+    
+    awardBoxMax = IpyGameDataPY.GetFuncCfg("FamilyTaofaBox", 3)
+    leaveGetCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyTaofaLeaveGetCnt) # 上次离开公会时累计领取数
+    boxTotalGetCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyTaofaBoxTotalGetCnt) # 已领取宝箱数
+    curFamilyGetCnt = boxTotalGetCnt - leaveGetCnt # 来到本公会后累计领取数
+    boxUnGetCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyTaofaBoxUnGetCnt) # 未领取宝箱数
+    canAddBoxMax = awardBoxMax - boxTotalGetCnt - boxUnGetCnt # 还可领取的箱子数
+    if canAddBoxMax <= 0:
+        GameWorld.DebugLog("    成员可领取宝箱已达上限不刷新: playerID=%s,boxTotalGetCnt(%s)+boxUnGetCnt(%s) >= %s" 
+                           % (playerID, boxTotalGetCnt, boxUnGetCnt, awardBoxMax))
+        return
+    
+    curFamilyCanGet = 0 # 在本公会累计可领取箱子数
+    for contribList in memContribDict.values():
+        for atkTime, contribBoxCnt in contribList:
+            if joinTime >= atkTime:
+                GameWorld.DebugLog("    加入公会之前的箱子不能领取: joinTime=%s > atkTime(%s),contribBoxCnt=%s" % (joinTime, atkTime, contribBoxCnt))
+                continue
+            curFamilyCanGet += contribBoxCnt
+            
+    addUnGetBox = min(curFamilyCanGet - curFamilyGetCnt - boxUnGetCnt, canAddBoxMax)
+    if addUnGetBox <= 0:
+        GameWorld.DebugLog("    成员当前没有可领取的宝箱不刷新: playerID=%s,curFamilyCanGet=%s,curFamilyGetCnt=%s(%s-%s),boxUnGetCnt=%s,awardBoxMax=%s,canAddBoxMax=%s" 
+                           % (playerID, curFamilyCanGet, curFamilyGetCnt, boxTotalGetCnt, leaveGetCnt, boxUnGetCnt, awardBoxMax, canAddBoxMax))
+        return
+    updBoxUnGetCnt = boxUnGetCnt + addUnGetBox
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaBoxUnGetCnt, updBoxUnGetCnt)
+    GameWorld.DebugLog("    成员可领取的宝箱数: playerID=%s,addUnGetBox=%s,updBoxUnGetCnt=%s,curFamilyCanGet=%s,curFamilyGetCnt=%s(%s-%s),boxUnGetCnt=%s,awardBoxMax=%s,canAddBoxMax=%s" 
+                       % (playerID, addUnGetBox, updBoxUnGetCnt, curFamilyCanGet, curFamilyGetCnt, boxTotalGetCnt, leaveGetCnt, boxUnGetCnt, awardBoxMax, canAddBoxMax))
+    SyncTaofaInfo(curPlayer)
+    return
+
+def AddTaofaCntByItem(curPlayer, addCnt):
+    ## 物品增加副本次数
+    itemAddCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyTaofaItemAddCnt)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyTaofaItemAddCnt, itemAddCnt + addCnt)
+    SyncTaofaInfo(curPlayer)
+    return
 
 def GetTaofaBoxAward(curPlayer):
     boxUnGetCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyTaofaBoxUnGetCnt)
@@ -599,27 +637,3 @@
     NetPackCommon.SendFakePack(curPlayer, clientPack)
     return
 
-def SyncTaofaAtkRet(curPlayer, atkType, hurtList, awardItemList):    
-    atkHurtList = []
-    for totalHurt, isSuper in hurtList:
-        atkHurt = ChPyNetSendPack.tagSCFamilyTaofaAtkHurt()
-        atkHurt.IsSuper = isSuper
-        atkHurt.HurtValue = totalHurt % ChConfig.Def_PerPointValue
-        atkHurt.HurtValueEx = totalHurt / ChConfig.Def_PerPointValue
-        atkHurtList.append(atkHurt)
-        
-    itemList = []
-    for itemID, itemCount in awardItemList:
-        item = ChPyNetSendPack.tagSCFamilyTaofaAtkItem()
-        item.ItemID = itemID
-        item.Count = itemCount
-        itemList.append(item)
-        
-    clientPack = ChPyNetSendPack.tagSCFamilyTaofaAtkRet()
-    clientPack.AtkType = atkType
-    clientPack.HurtList = atkHurtList
-    clientPack.HurtCount = len(clientPack.HurtList)
-    clientPack.ItemList = itemList
-    clientPack.ItemCount = len(clientPack.ItemList)
-    NetPackCommon.SendFakePack(curPlayer, clientPack)
-    return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
index 779b473..e0fb6cb 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -1047,6 +1047,7 @@
 C2S_GivePlayerResources = "C2S_GivePlayerResources"     # 奖励玩家资源,货币、物品等
 C2S_SetPlayerNomalDict = "C2S_SetPlayerNomalDict"       # 设置玩家字典值
 C2S_SendPlayerMail = "C2S_SendPlayerMail"               # 发送玩家个人邮件
+C2S_TaofaMemContrib = "C2S_TaofaMemContrib"             # 讨伐成员贡献信息
 
 # 游戏服  -> 跨服
 S2C_OnlineState = "S2C_OnlineState"                     # 玩家在线状态同步

--
Gitblit v1.8.0