66 【公会】基础主体-服务端(公会讨伐支持跨服;test_OnDay等命令支持跨服同步过天等;)
21个文件已修改
1408 ■■■■ 已修改文件
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChServerToServerPyPack.py 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/CreateFamily.py 54 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Family.py 87 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Taofa.py 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Zhenbaoge.py 86 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/test_OnDay.py 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/test_OnHour.py 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/test_OnWeek.py 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/GMShell.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/CrossMgr.py 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/CrossMsg.py 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldEvent.py 29 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossPlayer.py 35 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/GameServerRefresh.py 161 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py 50 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamilyTaofa.py 554 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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" #珍宝阁今日是否已购买过
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
#------------------------------------------------------
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
#------------------------------------------------------
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()
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
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
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
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()
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()
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()
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)
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
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:
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):
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 \
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):
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
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()
    
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):
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
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"                     # 玩家在线状态同步