237 【福利内容】每日任务/每周任务/章节奖励-服务端(章节奖励英雄之路,成就系统)
29个文件已修改
1个文件已删除
1935 ■■■■ 已修改文件
PySysDB/PySysDBPY.h 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py 207 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DataRecordPack.py 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_ItemCompound.py 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/AddSuccess.py 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/MainLevel.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Success.py 129 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBCommon.py 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChItem.py 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/Item_CleanGuilt.py 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCrossRealmPK.py 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerDogz.py 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamilyZhenfa.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGodWeapon.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPet.py 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPrestigeSys.py 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerRune.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerSuccess.py 1103 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerWing.py 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py 227 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PySysDB/PySysDBPY.h
@@ -1303,21 +1303,13 @@
//成就表
struct tagSuccess
struct Success
{
    DWORD        _ID;    //成就ID
    WORD        Type;    //成就类型
    DWORD        SuccID;    //成就ID
    WORD        _SuccType;    //成就类型
    DWORD        NeedCnt;    //需要数量
    list        Condition;    //辅助条件
    list        PreSuccess;    //需要达成前置成就
    dict        AwardItem;    //奖励物品列表
    dict        AwardItem2;    //通行证奖励物品列表
    dict        Money;    //金钱
    DWORD        Exp;    //经验
    dict        AwardAttr;    //奖励属性
    DWORD        RedPacketID;    //红包ID
    DWORD        MagicWeaponID;    //法宝ID
    DWORD        MagicWeaponExp;    //法宝升级经验
    list        AwardItemList;    //奖励物品列表
};
//通天令等级表
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
@@ -755,19 +755,6 @@
PacketSubCMD_1=0x12
PacketCallFunc_1=OnCMViewPlayerInfo
;成就系统
[PlayerSuccess]
ScriptName = Player\PlayerSuccess
Writer = hxp
Releaser = hxp
RegType = 0
RegisterPackCount = 1
PacketCMD_1=0xA5
PacketSubCMD_1=0x42
PacketCallFunc_1=OnGetSuccessAward
;通天令
[PlayerTongTianLing]
ScriptName = Player\PlayerTongTianLing
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -474,12 +474,11 @@
Def_ItemID_GongdePoint = 530               # 直接给功德点
Def_ItemID_FamilyFlagWarPoint = 540       # 直接给万界积分
Def_ItemID_TongTianPoint = 720               # 直接给通天令经验点
Def_ItemID_SuccessScore = 590               # 直接给成就积分
Def_TransformItemIDList = [Def_ItemID_FamilyContribution, Def_ItemID_SP, Def_ItemID_GoldPaper, 
                           Def_ItemID_RealmPoint, Def_ItemID_SilverMoney, Def_ItemID_BossReborn, Def_ItemID_Ysog,
                           Def_ItemID_SoulDust, Def_ItemID_SoulSplinters, Def_ItemID_SoulCore, Def_ItemID_Honor, Def_ItemID_GoldMoney,
                           Def_ItemID_FuncSysPrivilege, Def_ItemID_FCPartyPoint, Def_ItemID_BTGMPoint, Def_ItemID_GuShenMoney,
                           Def_ItemID_GongdePoint, Def_ItemID_TongTianPoint, Def_ItemID_SuccessScore,
                           Def_ItemID_GongdePoint, Def_ItemID_TongTianPoint,
                           Def_ItemID_FamilyFlagWarPoint]
# 货币类型对应直接给货币物品ID
MoneyItemIDDict = {IPY_GameWorld.TYPE_Price_Gold_Money:Def_ItemID_GoldMoney,
@@ -3800,13 +3799,8 @@
Def_PDict_InvestKeyCount = 3 # key编号数
# 成就 Def_PDictType_Success
Def_PDict_Success_AwardRecord = "Succ_AwardRecord_%s" # 成就领奖记录,参数(key编号),按索引位存储0-未领,1-已领
Def_PDict_Success_LastDay = "Succ_LastDay_%s" # 连续类型上一次更新进度时的开服天数,参数(成就编号)
Def_PDict_Success_CntValue = "Su_%s_%s" # 当前次数值,参数(成就类型、条件)
Def_PDict_Success_FinishTime = "Succ_FinishTime_%s" # 成就是否已完成,参数(索引)
Def_PDict_Success_CheckVersion = "Succ_CheckVersion" #老玩家某些功能成就检查版本
Def_PDict_Success_PassportAward = "Succ_PassportAward_%s" #成就通行证领奖状态,参数(key编号),按索引位存储0-未领,1-已领
Def_PDict_Success_ScoreAward = "Succ_ScoreAward" # 成就积分奖励记录,按索引位存储0-未领,1-已领
Def_PDict_SuccessValue = "Succ_%s_%s" # 当前次数值,参数(成就类型、条件)
Def_PDict_SuccessAward = "Succ_Award_%s" # 成就领奖记录,按成就ID位存储0-未领,1-已领,参数(key编号)
# 通天令
Def_PDict_TTL_StartTime = "TTL_StartTime" # 本轮通天令开始时间戳
@@ -4987,7 +4981,7 @@
Def_RewardType_SponsorDaily, #赞助星级每日奖励 56
Def_RewardType_SponsorStar, #赞助星级礼包奖励 57
Def_RewardType_GubaoItemEff, #古宝特殊效果物品奖励 58
Def_RewardType_SuccessScore, #成就积分奖励 59
Def_RewardType_Success, #成就奖励 59
Def_RewardType_BuyOne, #买一送多活动免费奖励 60
Def_RewardType_CustomAward, #自定义奖励 61
Def_RewardType_RealmXXZL, #境界修仙之路奖励 62
@@ -5235,9 +5229,6 @@
    PowerDownType_ResetTalent:'ResetTalent',
    PowerDownType_GatherSoul:'GatherSoul',
    }
# CTG ID 定义
Def_CTGID_SuccessPassport = 117 # 成就通行证
# 通天令任务类型定义
TTLTaskTypeList = (
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
@@ -6574,62 +6574,6 @@
#------------------------------------------------------
# A5 42 领取成就奖励 #tagMCGetSuccessAward
class  tagMCGetSuccessAward(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("SuccID", c_int),    #成就ID
                  ("IsPassport", c_ubyte),    #是否通行证奖励
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xA5
        self.SubCmd = 0x42
        return
    def ReadData(self, stringData, _pos=0, _len=0):
        self.Clear()
        memmove(addressof(self), stringData[_pos:], self.GetLength())
        return _pos + self.GetLength()
    def Clear(self):
        self.Cmd = 0xA5
        self.SubCmd = 0x42
        self.SuccID = 0
        self.IsPassport = 0
        return
    def GetLength(self):
        return sizeof(tagMCGetSuccessAward)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A5 42 领取成就奖励 //tagMCGetSuccessAward:
                                Cmd:%s,
                                SubCmd:%s,
                                SuccID:%d,
                                IsPassport:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.SuccID,
                                self.IsPassport
                                )
        return DumpString
m_NAtagMCGetSuccessAward=tagMCGetSuccessAward()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCGetSuccessAward.Cmd,m_NAtagMCGetSuccessAward.SubCmd))] = m_NAtagMCGetSuccessAward
#------------------------------------------------------
# A5 44 通天令领取等级奖励 #tagCMGetTongTianLVAward
class  tagCMGetTongTianLVAward(Structure):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -8585,66 +8585,13 @@
#------------------------------------------------------
# A3 41  成就完成 #tagMCSuccessFinish
# A3 42 成就领奖记录列表 #tagSCSuccessAwardRecordList
class  tagMCSuccessFinish(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("SuccID", c_int),    #成就id
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xA3
        self.SubCmd = 0x41
        return
    def ReadData(self, stringData, _pos=0, _len=0):
        self.Clear()
        memmove(addressof(self), stringData[_pos:], self.GetLength())
        return _pos + self.GetLength()
    def Clear(self):
        self.Cmd = 0xA3
        self.SubCmd = 0x41
        self.SuccID = 0
        return
    def GetLength(self):
        return sizeof(tagMCSuccessFinish)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A3 41  成就完成 //tagMCSuccessFinish:
                                Cmd:%s,
                                SubCmd:%s,
                                SuccID:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.SuccID
                                )
        return DumpString
m_NAtagMCSuccessFinish=tagMCSuccessFinish()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCSuccessFinish.Cmd,m_NAtagMCSuccessFinish.SubCmd))] = m_NAtagMCSuccessFinish
#------------------------------------------------------
#A3 42  成就完成领奖记录列表 #tagMCSuccessFinishAwardRecordList
class  tagMCSuccessFinishAwardRecord(Structure):
class  tagSCSuccessAwardRecord(Structure):
    _pack_ = 1
    _fields_ = [
                  ("RecordIndex", c_ushort),    #第几个记录值 每个key存31个succid   0-30为0, 31-61为1..
                  ("Record", c_int),    #对应是否领取值
                  ("PassportRecord", c_int),    #通行证奖励是否领取值
                  ("Record", c_int),    #根据成就ID位判断是否已领取
                  ]
    def __init__(self):
@@ -8659,33 +8606,30 @@
    def Clear(self):
        self.RecordIndex = 0
        self.Record = 0
        self.PassportRecord = 0
        return
    def GetLength(self):
        return sizeof(tagMCSuccessFinishAwardRecord)
        return sizeof(tagSCSuccessAwardRecord)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''//A3 42  成就完成领奖记录列表 //tagMCSuccessFinishAwardRecordList:
        DumpString = '''// A3 42 成就领奖记录列表 //tagSCSuccessAwardRecordList:
                                RecordIndex:%d,
                                Record:%d,
                                PassportRecord:%d
                                Record:%d
                                '''\
                                %(
                                self.RecordIndex,
                                self.Record,
                                self.PassportRecord
                                self.Record
                                )
        return DumpString
class  tagMCSuccessFinishAwardRecordList(Structure):
class  tagSCSuccessAwardRecordList(Structure):
    Head = tagHead()
    RecordCnt = 0    #(WORD RecordCnt)//记录个数
    RecordList = list()    #(vector<tagMCSuccessFinishAwardRecord> RecordList)//记录列表
    RecordList = list()    #(vector<tagSCSuccessAwardRecord> RecordList)//记录列表
    data = None
    def __init__(self):
@@ -8699,7 +8643,7 @@
        _pos = self.Head.ReadData(_lpData, _pos)
        self.RecordCnt,_pos = CommFunc.ReadWORD(_lpData, _pos)
        for i in range(self.RecordCnt):
            temRecordList = tagMCSuccessFinishAwardRecord()
            temRecordList = tagSCSuccessAwardRecord()
            _pos = temRecordList.ReadData(_lpData, _pos)
            self.RecordList.append(temRecordList)
        return _pos
@@ -8744,18 +8688,18 @@
        return DumpString
m_NAtagMCSuccessFinishAwardRecordList=tagMCSuccessFinishAwardRecordList()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCSuccessFinishAwardRecordList.Head.Cmd,m_NAtagMCSuccessFinishAwardRecordList.Head.SubCmd))] = m_NAtagMCSuccessFinishAwardRecordList
m_NAtagSCSuccessAwardRecordList=tagSCSuccessAwardRecordList()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagSCSuccessAwardRecordList.Head.Cmd,m_NAtagSCSuccessAwardRecordList.Head.SubCmd))] = m_NAtagSCSuccessAwardRecordList
#------------------------------------------------------
# A3 40  成就信息列表 #tagMCSuccessInfoList
# A3 40 成就信息列表 #tagSCSuccessInfoList
class  tagMCSuccessInfo(Structure):
class  tagSCSuccessInfo(Structure):
    SuccType = 0    #(WORD SuccType)//成就类型
    Len = 0    #(WORD Len)//条件长度
    Condition = ""    #(String Condition)//成就条件
    CntValue = 0    #(DWORD CntValue)//当前完成进度值
    CLen = 0    #(BYTE CLen)
    Conds = list()    #(vector<DWORD> Conds)// 条件列表
    CurValue = 0    #(DWORD CurValue)// 进度值,相同任务类型条件的进度值共享
    data = None
    def __init__(self):
@@ -8765,23 +8709,25 @@
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        self.SuccType,_pos = CommFunc.ReadWORD(_lpData, _pos)
        self.Len,_pos = CommFunc.ReadWORD(_lpData, _pos)
        self.Condition,_pos = CommFunc.ReadString(_lpData, _pos,self.Len)
        self.CntValue,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.CLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        for i in range(self.CLen):
            value,_pos=CommFunc.ReadDWORD(_lpData,_pos)
            self.Conds.append(value)
        self.CurValue,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        return _pos
    def Clear(self):
        self.SuccType = 0
        self.Len = 0
        self.Condition = ""
        self.CntValue = 0
        self.CLen = 0
        self.Conds = list()
        self.CurValue = 0
        return
    def GetLength(self):
        length = 0
        length += 2
        length += 2
        length += len(self.Condition)
        length += 1
        length += 4 * self.CLen
        length += 4
        return length
@@ -8789,31 +8735,32 @@
    def GetBuffer(self):
        data = ''
        data = CommFunc.WriteWORD(data, self.SuccType)
        data = CommFunc.WriteWORD(data, self.Len)
        data = CommFunc.WriteString(data, self.Len, self.Condition)
        data = CommFunc.WriteDWORD(data, self.CntValue)
        data = CommFunc.WriteBYTE(data, self.CLen)
        for i in range(self.CLen):
            data = CommFunc.WriteDWORD(data, self.Conds[i])
        data = CommFunc.WriteDWORD(data, self.CurValue)
        return data
    def OutputString(self):
        DumpString = '''
                                SuccType:%d,
                                Len:%d,
                                Condition:%s,
                                CntValue:%d
                                CLen:%d,
                                Conds:%s,
                                CurValue:%d
                                '''\
                                %(
                                self.SuccType,
                                self.Len,
                                self.Condition,
                                self.CntValue
                                self.CLen,
                                "...",
                                self.CurValue
                                )
        return DumpString
class  tagMCSuccessInfoList(Structure):
class  tagSCSuccessInfoList(Structure):
    Head = tagHead()
    count = 0    #(WORD count)//信息个数
    SuccessInfoList = list()    #(vector<tagMCSuccessInfo> SuccessInfoList)
    Count = 0    #(WORD Count)//信息个数
    SuccessInfoList = list()    #(vector<tagSCSuccessInfo> SuccessInfoList)
    data = None
    def __init__(self):
@@ -8825,9 +8772,9 @@
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        _pos = self.Head.ReadData(_lpData, _pos)
        self.count,_pos = CommFunc.ReadWORD(_lpData, _pos)
        for i in range(self.count):
            temSuccessInfoList = tagMCSuccessInfo()
        self.Count,_pos = CommFunc.ReadWORD(_lpData, _pos)
        for i in range(self.Count):
            temSuccessInfoList = tagSCSuccessInfo()
            _pos = temSuccessInfoList.ReadData(_lpData, _pos)
            self.SuccessInfoList.append(temSuccessInfoList)
        return _pos
@@ -8837,7 +8784,7 @@
        self.Head.Clear()
        self.Head.Cmd = 0xA3
        self.Head.SubCmd = 0x40
        self.count = 0
        self.Count = 0
        self.SuccessInfoList = list()
        return
@@ -8845,7 +8792,7 @@
        length = 0
        length += self.Head.GetLength()
        length += 2
        for i in range(self.count):
        for i in range(self.Count):
            length += self.SuccessInfoList[i].GetLength()
        return length
@@ -8853,79 +8800,27 @@
    def GetBuffer(self):
        data = ''
        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
        data = CommFunc.WriteWORD(data, self.count)
        for i in range(self.count):
        data = CommFunc.WriteWORD(data, self.Count)
        for i in range(self.Count):
            data = CommFunc.WriteString(data, self.SuccessInfoList[i].GetLength(), self.SuccessInfoList[i].GetBuffer())
        return data
    def OutputString(self):
        DumpString = '''
                                Head:%s,
                                count:%d,
                                Count:%d,
                                SuccessInfoList:%s
                                '''\
                                %(
                                self.Head.OutputString(),
                                self.count,
                                self.Count,
                                "..."
                                )
        return DumpString
m_NAtagMCSuccessInfoList=tagMCSuccessInfoList()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCSuccessInfoList.Head.Cmd,m_NAtagMCSuccessInfoList.Head.SubCmd))] = m_NAtagMCSuccessInfoList
#------------------------------------------------------
# A3 43  成就积分信息 #tagMCSuccessScoreInfo
class  tagMCSuccessScoreInfo(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("ScoreAwardState", c_int),    #成就积分领奖记录,按奖励索引位记录是否领取
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xA3
        self.SubCmd = 0x43
        return
    def ReadData(self, stringData, _pos=0, _len=0):
        self.Clear()
        memmove(addressof(self), stringData[_pos:], self.GetLength())
        return _pos + self.GetLength()
    def Clear(self):
        self.Cmd = 0xA3
        self.SubCmd = 0x43
        self.ScoreAwardState = 0
        return
    def GetLength(self):
        return sizeof(tagMCSuccessScoreInfo)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A3 43  成就积分信息 //tagMCSuccessScoreInfo:
                                Cmd:%s,
                                SubCmd:%s,
                                ScoreAwardState:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.ScoreAwardState
                                )
        return DumpString
m_NAtagMCSuccessScoreInfo=tagMCSuccessScoreInfo()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCSuccessScoreInfo.Cmd,m_NAtagMCSuccessScoreInfo.SubCmd))] = m_NAtagMCSuccessScoreInfo
m_NAtagSCSuccessInfoList=tagSCSuccessInfoList()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagSCSuccessInfoList.Head.Cmd,m_NAtagSCSuccessInfoList.Head.SubCmd))] = m_NAtagSCSuccessInfoList
#------------------------------------------------------
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DataRecordPack.py
@@ -1291,16 +1291,6 @@
    SendEventPack("GlobalDropRate", dataDict, curPlayer)
    return
## 玩家上线成就检查
#  @return
def DR_CheckOldPlayerSuccess(curPlayer):
    dataDict = {'PlayerID':curPlayer.GetPlayerID(), "PlayerName":curPlayer.GetPlayerName(),
                'AccID':curPlayer.GetAccID()}
    #发送封包
    SendEventPack("CheckOldPlayerSuccess", dataDict, curPlayer)
    return
## 玩家境界升级
#  @return
def DR_RealmLVUp(curPlayer, realmlv):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_ItemCompound.py
@@ -23,7 +23,6 @@
import ItemControler
import IpyGameDataPY
import ChConfig
import PlayerSuccess
import DataRecordPack
import random
@@ -218,13 +217,6 @@
            
        # 通知合成成功
        ItemCommon.SyncMakeItemAnswer(curPlayer, ShareDefine.Def_mitItemCompound, ChConfig.Def_ComposeState_Sucess, makeItemID)
        #成功合成1个物品成就
        PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_CompoundItemEx, compoundCnt, [makeItemID])
        #合成X阶X颜色X星级以上装备, 星级改为装备位了,暂时没有用,屏蔽
        #classLV = ItemCommon.GetItemClassLV(makeItemData)
        #itemColor = makeItemData.GetItemColor()
        #itemQuality = makeItemData.GetItemQuality()
        #PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_CompoundEquip, compoundCnt, [classLV, itemColor, itemQuality])
    # 合成失败
    else:
        GameWorld.DebugLog("合成失败!")
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/AddSuccess.py
File was deleted
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/MainLevel.py
@@ -91,6 +91,6 @@
        wave = waveMax
        
    nowValue = PlayerControl.SetMainLevelNowInfo(curPlayer, chapterID, levelNum, wave)
    passValue = PlayerControl.SetMainLevelPassInfo(curPlayer, chapterID, levelNum, wave)
    passValue = PlayerControl.SetMainLevelPassInfo(curPlayer, chapterID, levelNum, max(0, wave - 1))
    GameWorld.DebugAnswer(curPlayer, "设置主线:章关=%s-%s,波=%s,%s,%s" % (chapterID, levelNum, wave, nowValue, passValue))
    return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Success.py
@@ -15,135 +15,96 @@
#"""Version = 2020-03-31 18:00"""
#-------------------------------------------------------------------------------
import ChConfig
import ShareDefine
import PlayerSuccess
import IpyGameDataPY
import GameWorld
import PlayerControl
#逻辑实现
## GM命令执行入口
#  @param curPlayer 当前玩家
#  @param msgList 参数列表 [npcID]
#  @return None
#  @remarks 函数详细说明.
def OnExec(curPlayer, msgList):
    if not msgList:
        GameWorld.DebugAnswer(curPlayer, "重置所有成就: Success 0")
        GameWorld.DebugAnswer(curPlayer, "重置指定成就: Success 0 类型")
        GameWorld.DebugAnswer(curPlayer, "重置成就领奖: Success w 类型")
        GameWorld.DebugAnswer(curPlayer, "输出成就数据: Success p 类型")
        #GameWorld.DebugAnswer(curPlayer, "增加成就进度: Success a 类型 进度 条件(选填)")
        #GameWorld.DebugAnswer(curPlayer, "更新成就进度: Success u 类型 进度 条件(选填)")
        GameWorld.DebugAnswer(curPlayer, "重置成就: Success 0 [类型 ...]")
        GameWorld.DebugAnswer(curPlayer, "输出成就: Success p 类型")
        GameWorld.DebugAnswer(curPlayer, "增加进度: Success a 类型 进度 [条件 ...]")
        GameWorld.DebugAnswer(curPlayer, "更新进度: Success u 类型 进度 [条件 ...]")
        return
    
    cmdType = msgList[0]
    # 重置数据
    if cmdType == 0:
        __DoResetSuccess(curPlayer, msgList)
    # 重置领奖
    elif cmdType == "w":
        __DoResetSuccessAward(curPlayer, msgList)
    # 输出数据
    elif cmdType == "p":
        __DoPrintSuccess(curPlayer, msgList)
    # 增加进度
    elif cmdType == "a":
        pass
        succType = msgList[1] if len(msgList) > 1 else 0
        addValue = msgList[2] if len(msgList) > 2 else 1
        conds = msgList[3:]
        GameWorld.DebugAnswer(curPlayer, "增加成就进度: T:%s,V:%s,C:%s" % (succType, addValue, conds))
        PlayerSuccess.DoAddSuccessProgress(curPlayer, succType, addValue, conds)
    # 更新进度
    elif cmdType == "u":
        pass
        succType = msgList[1] if len(msgList) > 1 else 0
        newCnt = msgList[2] if len(msgList) > 2 else 1
        conds = msgList[3:]
        GameWorld.DebugAnswer(curPlayer, "更新成就进度: T:%s,V:%s,C:%s" % (succType, addValue, conds))
        PlayerSuccess.UptateSuccessProgress(curPlayer, succType, newCnt, conds)
    return
def __DoResetSuccess(curPlayer, msgList):
def __DoResetSuccess(curPlayer, msgList, resetValue=True):
    ## 重置成就数据
    if len(msgList) > 1:
        typeList = [msgList[1]]
    else:
        typeList = ShareDefine.SuccessTypeList
    resetTypeList = []
    for succType in typeList:
        succDataList = PlayerSuccess.GetSuccDataMng().GetSuccDataByType(succType)
        if not succDataList:
            continue
        for succDataObj in succDataList:
            succID = succDataObj.succID
            if succType not in resetTypeList:
                resetTypeList.append(succType)
            PlayerSuccess.SetSuccHasGot(curPlayer, succID, False)
            PlayerSuccess.SetSuccPassportAwardHasGot(curPlayer, succID, False)
            PlayerSuccess.SetSuccFinish(curPlayer, succID, False)
            PlayerSuccess.SetPDictValue(curPlayer, ChConfig.Def_PDict_Success_LastDay % (succID), 0)
            PlayerSuccess.SetSuccFinishValue(curPlayer, succType, succDataObj.condition, 0)
    # 老玩家上线检查情况
    PlayerSuccess.SetPDictValue(curPlayer, ChConfig.Def_PDict_Success_CheckVersion, 0)
    # 同步成就信息
    PlayerSuccess.Sync_SuccessInfo(curPlayer, [], True)
    # 同步成就领奖记录
    PlayerSuccess.Sync_SuccTypeIndexAwardRecord(curPlayer, [], True)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_Success_ScoreAward, 0)
    PlayerSuccess.Sync_SuccessScoreAward(curPlayer)
    GameWorld.DebugAnswer(curPlayer, "重置成就类型:%s" % resetTypeList)
    return
def __DoResetSuccessAward(curPlayer, msgList):
    ## 重置成就领奖
    if len(msgList) > 1:
        typeList = [msgList[1]]
        typeList = msgList[1:]
    else:
        typeList = ShareDefine.SuccessTypeList
        
    resetIDList = []
    succIDList = []
    syncTypeCondList = []
    for succType in typeList:
        succDataList = PlayerSuccess.GetSuccDataMng().GetSuccDataByType(succType)
        if not succDataList:
        ipyDataList = IpyGameDataPY.GetIpyGameDataListNotLog("Success", succType)
        if not ipyDataList:
            continue
        for succDataObj in succDataList:
            succID = succDataObj.succID
            if not PlayerSuccess.GetSuccHasGot(curPlayer, succID) and not PlayerSuccess.GetSuccPassportAwardHasGot(curPlayer, succID):
                continue
            PlayerSuccess.SetSuccHasGot(curPlayer, succID, False)
            PlayerSuccess.SetSuccPassportAwardHasGot(curPlayer, succID, False)
            PlayerSuccess.SetSuccFinish(curPlayer, succID) # 有重置领奖的ID需要重新设置为已完成
            resetIDList.append(succID)
        for ipyData in ipyDataList:
            succID = ipyData.GetSuccID()
            conds = ipyData.GetCondition()
            
    # 同步成就领奖记录
    PlayerSuccess.Sync_SuccTypeIndexAwardRecord(curPlayer, resetIDList, True)
    GameWorld.DebugAnswer(curPlayer, "重置成就ID领奖:%s" % resetIDList)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_Success_ScoreAward, 0)
    PlayerSuccess.Sync_SuccessScoreAward(curPlayer)
            if PlayerSuccess.GetSuccHasGot(curPlayer, succID):
                succIDList.append(succID)
                PlayerSuccess.SetSuccHasGot(curPlayer, succID, False)
            if [succType, conds] not in syncTypeCondList:
                syncTypeCondList.append([succType, conds])
                PlayerSuccess.SetSuccValue(curPlayer, succType, conds, 0)
    PlayerSuccess.SyncSuccessInfo(curPlayer, syncTypeCondList, True)
    PlayerSuccess.SyncSuccessAwardRecord(curPlayer, succIDList, True)
    GameWorld.DebugAnswer(curPlayer, "重置成就类型:%s" % typeList)
    return
def __DoPrintSuccess(curPlayer, msgList):
    ## 输出成就数据
    if len(msgList) > 1:
        typeList = [msgList[1]]
        typeList = msgList[1:]
    else:
        typeList = ShareDefine.SuccessTypeList
    GameWorld.DebugAnswer(curPlayer, "--- 输出有进度的成就数据 ---")
    for succType in typeList:
        succDataList = PlayerSuccess.GetSuccDataMng().GetSuccDataByType(succType)
        if not succDataList:
        ipyDataList = IpyGameDataPY.GetIpyGameDataListNotLog("Success", succType)
        if not ipyDataList:
            continue
        printType = False
        for succDataObj in succDataList:
            succID = succDataObj.succID
            value = PlayerSuccess.GetSuccFinishValue(curPlayer, succType, succDataObj.condition)
        for ipyData in ipyDataList:
            succID = ipyData.GetSuccID()
            conds = ipyData.GetCondition()
            needCnt = ipyData.GetNeedCnt()
            value = PlayerSuccess.GetSuccValue(curPlayer, succType, conds)
            if not value:
                continue
            if not printType:
                printType = True
                GameWorld.DebugAnswer(curPlayer, "成就类型: %s" % succType)
            isFinish = PlayerSuccess.GetSuccIsFinish(curPlayer, succID)
                GameWorld.DebugAnswer(curPlayer, "----- 成就类型: %s" % succType)
            hasGot = PlayerSuccess.GetSuccHasGot(curPlayer, succID)
            passportHasGot = PlayerSuccess.GetSuccPassportAwardHasGot(curPlayer, succID)
            GameWorld.DebugAnswer(curPlayer, "    id=%s 条件:%s 进度:%s/%s 完成:%s 领奖:%s %s"
                                  % (succID, succDataObj.condition, value, succDataObj.needCnt, isFinish, hasGot, passportHasGot))
            GameWorld.DebugAnswer(curPlayer, "ID:%s,C:%s,V:%s/%s,奖:%s" % (succID, conds, value, needCnt, hasGot))
            
    return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBCommon.py
@@ -1549,7 +1549,6 @@
        addCount = updCnt-enterCnt
        PlayerControl.NomalDictSetProperty(curPlayer, enterCntKey, updCnt)
        
        #PlayerSuccess.AddEnterFBSuccess(curPlayer, fbID, addCountEx)
        updValue = updCnt
    GameWorld.DebugLog("    AddEnterFBCount fbID=%s, addCount=%s, lineBit=%s, enterCnt=%s,updValue=%s" 
                       % (fbID, addCount, lineBit, enterCnt, updValue), curPlayer.GetPlayerID())
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -1073,19 +1073,11 @@
                        ),
                "Success":(
                        ("DWORD", "ID", 1),
                        ("WORD", "Type", 0),
                        ("DWORD", "SuccID", 0),
                        ("WORD", "SuccType", 1),
                        ("DWORD", "NeedCnt", 0),
                        ("list", "Condition", 0),
                        ("list", "PreSuccess", 0),
                        ("dict", "AwardItem", 0),
                        ("dict", "AwardItem2", 0),
                        ("dict", "Money", 0),
                        ("DWORD", "Exp", 0),
                        ("dict", "AwardAttr", 0),
                        ("DWORD", "RedPacketID", 0),
                        ("DWORD", "MagicWeaponID", 0),
                        ("DWORD", "MagicWeaponExp", 0),
                        ("list", "AwardItemList", 0),
                        ),
                "TongTianLV":(
@@ -3962,19 +3954,11 @@
        self.attrTuple = None
        return
        
    def GetID(self): return self.attrTuple[0] # 成就ID DWORD
    def GetType(self): return self.attrTuple[1] # 成就类型 WORD
    def GetSuccID(self): return self.attrTuple[0] # 成就ID DWORD
    def GetSuccType(self): return self.attrTuple[1] # 成就类型 WORD
    def GetNeedCnt(self): return self.attrTuple[2] # 需要数量 DWORD
    def GetCondition(self): return self.attrTuple[3] # 辅助条件 list
    def GetPreSuccess(self): return self.attrTuple[4] # 需要达成前置成就 list
    def GetAwardItem(self): return self.attrTuple[5] # 奖励物品列表 dict
    def GetAwardItem2(self): return self.attrTuple[6] # 通行证奖励物品列表 dict
    def GetMoney(self): return self.attrTuple[7] # 金钱 dict
    def GetExp(self): return self.attrTuple[8] # 经验 DWORD
    def GetAwardAttr(self): return self.attrTuple[9] # 奖励属性 dict
    def GetRedPacketID(self): return self.attrTuple[10] # 红包ID DWORD
    def GetMagicWeaponID(self): return self.attrTuple[11] # 法宝ID DWORD
    def GetMagicWeaponExp(self): return self.attrTuple[12] # 法宝升级经验 DWORD
    def GetAwardItemList(self): return self.attrTuple[4] # 奖励物品列表 list
# 通天令等级表
class IPY_TongTianLV():
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChItem.py
@@ -46,7 +46,6 @@
import ChPyNetSendPack
import NetPackCommon
import IpyGameDataPY
import PlayerSuccess
import PyGameData
import NPCCommon
import FBCommon
@@ -270,9 +269,6 @@
        #    PickupItemSysNotify(curPlayer, isTeamNotify, itemMsgList, isEquip)
        #=======================================================================
        
        #成就
        PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_PickUpItem, curItemCount, [curItemID])
    #物品已经被捡起, 把物品指针置为空
    mapItem.SetDropItem(None)
    #通知客户端, 人物捡起该物品, 以及回收物品的逻辑
@@ -396,9 +392,6 @@
                       % (curItemTypeID, useResult, isOK, successCnt))    
    if not isOK:
        return False
    #------------使用物品成功, 执行相关操作
    PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_UseItem, successCnt, [curItemTypeID])
    
    curPlayer.Sync_UseItem(curItemTypeID, useItemIndex)
    curPlayer.SetItemCD(curItemCDType, tick)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py
@@ -905,8 +905,6 @@
            PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_GongdePoint, itemCount)
        elif itemID == ChConfig.Def_ItemID_FamilyFlagWarPoint:
            PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_FamilyFlagWarPoint, itemCount)
        elif itemID == ChConfig.Def_ItemID_SuccessScore:
            PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_SuccessSocre, itemCount, moneyEventName, addDict)
        return True
    
    def __CrossServerPutInItem(self, packIndex, tagItem, event=["", False, {}]):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/Item_CleanGuilt.py
@@ -17,7 +17,6 @@
#导入
import BuffSkill
import ItemCommon
import PlayerSuccess
import PlayerControl
import ShareDefine
import ChConfig
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
@@ -40,7 +40,6 @@
import DataRecordPack
import NetPackCommon
import FBCommon
import PlayerSuccess
import PlayerPrestigeSys
import GY_Query_BossFirstKill
import FormulaControl
@@ -3158,10 +3157,6 @@
        #不是普通NPC    
        elif npcObjType != IPY_GameWorld.gnotNormal:
            return
        npcID = curNPC.GetNPCID()
        #GameWorld.DebugLog("__MissionOnKillNPC isFeel=%s" % (isFeel), curPlayer.GetPlayerID())
        #击杀特定NPC成就
        PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_KillSpecificNPC, 1, [npcID])
        return
        
    def __GetIsLog(self):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -3265,6 +3265,9 @@
    # 每日任务奖励
    elif rewardType == ChConfig.Def_RewardType_DailyTask:
        PlayerActivity.GetDailyTaskAward(curPlayer, dataEx)
    # 成就奖励
    elif rewardType == ChConfig.Def_RewardType_Success:
        PlayerSuccess.GetSuccessAward(curPlayer, dataEx)
    # 仙树免费减时
    elif rewardType == ChConfig.Def_RewardType_TreeFreeTime:
        PlayerTree.FreeReduceTreeLVTime(curPlayer)
@@ -3349,12 +3352,6 @@
    # 跨服妖魔boss伤害奖励
    elif rewardType == ChConfig.Def_RewardType_CrossYaomoBossHurt:
        PlayerCrossYaomoBoss.GetCrossYaomoBossHurtAward(curPlayer, dataEx, tick)
    # 古宝特殊效果物品奖励
    #elif rewardType == ChConfig.Def_RewardType_GubaoItemEff:
    #    PlayerGubao.GetGubaoItemEffAward(curPlayer, dataEx, dataExStr)
    # 成就积分奖励
    elif rewardType == ChConfig.Def_RewardType_SuccessScore:
        PlayerSuccess.GetSuccessScoreAward(curPlayer, dataEx)
    # 买一送多活动免费奖励
    elif rewardType == ChConfig.Def_RewardType_BuyOne:
        PlayerActBuyOne.GetBuyOneFreeAward(curPlayer, dataEx, dataExStr)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
@@ -33,7 +33,6 @@
import PlayerBillboard
import GameServerRefresh
import IPY_GameWorld
import IPY_PlayerDefine
import ChPyNetSendPack
import NetPackCommon
import DataRecordPack
@@ -51,7 +50,6 @@
import PlayerCostRebate
import PlayerActLunhuidian
import GY_Query_CrossRealmReg
import PlayerTongTianLing
import FunctionNPCCommon
import PlayerGoldInvest
import CrossRealmPlayer
@@ -3029,8 +3027,6 @@
            return
        updValue = min(ChConfig.Def_UpperLimit_DWord, curCurrency + value)
        SetPlayerCurrency(curPlayer, priceType, updValue)
        if priceType == ShareDefine.TYPE_Price_RealmPoint:
            PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_GetRealmPoint, value)
    else:
        GameWorld.ErrLog("金钱类型错误, priceType=%s,value=%s,giveType=%s" % (priceType, value, giveType), curPlayer.GetPlayerID())
        DataRecordPack.DR_GiveMoneyError(curPlayer, priceType, value, giveType, addDataDict)
@@ -3510,9 +3506,8 @@
            #aftFreePoint = curPlayer.GetFreePoint()
            if aftLV > befLV:
                curPlayer.SetLV(aftLV, False) # 这里不再通知GameServer
                PlayerTongTianLing.AddTongTianTaskValue(curPlayer, ChConfig.TTLTaskType_LVUp, aftLV - befLV)
                #PlayerTongTianLing.AddTongTianTaskValue(curPlayer, ChConfig.TTLTaskType_LVUp, aftLV - befLV)
                PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_LV)
                PlayerSuccess.UptateSuccessProgress(curPlayer, ShareDefine.SuccType_HeroLV, aftLV)
                
            #if aftFreePoint > befFreePoint:
            #    curPlayer.SetFreePoint(aftFreePoint)
@@ -4363,6 +4358,7 @@
        lvID = chapterID * 100 + levelNum
        PlayerBillboard.UpdatePlayerBillboard(curPlayer, ShareDefine.Def_BT_MainLevel, lvID)
        PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_MainLevel)
        PlayerSuccess.UptateSuccessProgress(curPlayer, ShareDefine.SuccType_MainLevel, lvID)
    return value
def GetMainLevelPassInfo(curPlayer):
    ## 获取主线关卡过关进度信息
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCrossRealmPK.py
@@ -27,7 +27,6 @@
import PlayerWeekParty
import IPY_GameWorld
import ItemControler
import PlayerSuccess
import ItemCommon
import GameWorld
import ChConfig
@@ -356,7 +355,6 @@
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CrossPK_TodayWinCount, todayWinCount)
            GameWorld.Log("    增加今日已获胜次数: todayWinCount=%s" % todayWinCount, playerID)
        PlayerWeekParty.AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_CrossPK, 1)
        PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_CrossPK, 1)
        PlayerTongTianLing.AddTongTianTaskValue(curPlayer, ChConfig.TTLTaskType_CrossPK, 1)
    else:
        GameWorld.Log("    不同天的PK结算不增加今日PK次数! ", playerID)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerDogz.py
@@ -28,7 +28,6 @@
import PassiveBuffEffMng
import SkillCommon
import SkillShell
import PlayerSuccess
import DataRecordPack
import PlayerWeekParty
import ItemControler
@@ -292,7 +291,6 @@
            if curItem.IsEmpty():
                GameWorld.DebugLog("神兽有装备未穿戴,无法助战!dogzID=%s,packIndex=%s" % (dogzID, i), playerID)
                return
        PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_DogzBattle, 1, [dogzID])
        PlayerWeekParty.AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_Dogz, dogzID, False)
        
    isFight = True if batteState else False
@@ -608,10 +606,6 @@
    # 技能属性,从Def_CalcAttrFunc_Dogz获取
    skillAttrList = CalcDogzBattleSkillAttr(curPlayer)
    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_DogzBattleSkill, skillAttrList)
    #成就
    if isUpdateSucc:
        PlayerSuccess.ResetSuccessByType(curPlayer, ShareDefine.SuccType_DogzEquipPlus)
        PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_DogzEquipPlus, totalPlusLv)
    return
def GetFightDogzTotalPlusLv(curPlayer):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
@@ -34,7 +34,6 @@
import PlayerGoldGift
import PlayerActivity
import FBCommon
import PlayerSuccess
import PlayerFreeGoods
import ChItem
import GameLogic_Tianzi
@@ -263,8 +262,6 @@
        
        PlayerCoin.OnDay(curPlayer)
        PlayerTree.PlayerOnDay(curPlayer)
        #成就
        PlayerSuccess.SuccOnDay(curPlayer)
        #投资
        PlayerGoldInvest.OnDay(curPlayer)
        #战令
@@ -395,8 +392,6 @@
        
        #计算这一周的家族的活跃度
        CalcFamilyActiveValue(curPlayer)
        #成就Onweek
        PlayerSuccess.OnWeek(curPlayer)
        
        # 每周提示玩家提示vip等级加入贵宾俱乐部
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_HasVIPClubNote, 0)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamilyZhenfa.py
@@ -17,12 +17,10 @@
import GameWorld
import ItemCommon
import ShareDefine
import PlayerControl
import NetPackCommon
import ChPyNetSendPack
import IpyGameDataPY
import PlayerSuccess
import IPY_GameWorld
import PyGameData
import ChConfig
@@ -146,8 +144,6 @@
    ItemCommon.DelCostItem(curPlayer, itemPack, delInfoDict, "FamilyZhenfaLVUP")
    
    addTotalExp = itemExp * useItemCount
    PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_FamilyZhenfaExp, addTotalExp)
    SendGameServer_FamilyZhenfa(curPlayer, familyID, playerID, "AddExp", [zhenfaType, addTotalExp])
    return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGodWeapon.py
@@ -24,7 +24,6 @@
import IPY_GameWorld
import ChPyNetSendPack
import NetPackCommon
import PlayerSuccess
import ShareDefine
import SkillShell
import DataRecordPack
@@ -79,7 +78,6 @@
    # 默认激活1级的类型
    for i in IpyGameDataPY.GetFuncEvalCfg('GodWeaponActive'):
        SetGodWeaponLV(curPlayer, i, 1)
        PlayerSuccess.UptateSuccessProgress(curPlayer, ShareDefine.SuccType_GodWeapon, 1, [i])
    Sync_GodWeaponLVInfo(curPlayer)
    return True
@@ -295,8 +293,6 @@
        SetGodWeaponLV(curPlayer, weaponType, attrLV)
        GameWorld.DebugLog("神兵升级结果: attrLV=%s,curExp=%s" % (attrLV, curExp))
        RefreshGodWeaponAttr(curPlayer)
        #x神器达到X级成就
        PlayerSuccess.UptateSuccessProgress(curPlayer, ShareDefine.SuccType_GodWeapon, attrLV, [weaponType])
        if beforeAttrLV == 0:
            # 解封通知
            sysMark = IpyGameDataPY.GetFuncEvalCfg('GodWeaponSys', 1, {}).get(weaponType, 'GetGodWeapon')
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py
@@ -31,7 +31,6 @@
import GameFuncComm
import IpyGameDataPY
import CrossPlayerData
import PlayerSuccess
import PlayerActLunhuidian
import PlayerActTask
import PlayerPet
@@ -635,7 +634,6 @@
        DataRecordPack.DR_NewHorseByClassUp(curPlayer, updClassLV, 0)
        # 记录开服活动马匹阶级
        #OpenServerCampaign.UpdOpenServerCampaignRecordData(curPlayer, ShareDefine.Def_Campaign_Type_Horse, updClassLV)
        PlayerSuccess.UptateSuccessProgress(curPlayer, ShareDefine.SuccType_HorseAllLV, updClassLV)
        
    Sync_HorseClassData(curPlayer)
    # 刷属性,更新排行榜
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPet.py
@@ -25,7 +25,6 @@
import SkillShell
import ItemControler
import PlayerControl
import PlayerSuccess
import GameFuncComm
import ShareDefine
import SkillCommon
@@ -756,7 +755,6 @@
        # 开服活动数据
        OpenServerCampaign.UpdOpenServerCampaignRecordData(curPlayer, ShareDefine.Def_Campaign_Type_PetLV, GetTotalPetLV(curPlayer))
        
    PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_PetClassLV, 1, [petNPCID, updClassLV + 1])
    extraInfoDict = {"petItemIndex":PetItemIndex, "petNPCID":petNPCID}
    extraInfoDict.update(eval(petDataItem.GetUserData()))
    DataRecordPack.DR_ClassUpSystem(curPlayer, "PetClassUp", updClassLV, extraInfoDict)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPrestigeSys.py
@@ -25,7 +25,6 @@
import ShareDefine
import GameWorld
import ChConfig
import PlayerSuccess
import PlayerBillboard
import PlayerTongTianLing
import PlayerTask
@@ -263,8 +262,6 @@
    RefreshOfficialAttr(curPlayer)
    GameFuncComm.DoFuncOpenLogic(curPlayer)
    SyncRealmInfo(curPlayer, taskIDList=syncTaskIDList)
    #境界提升成就
    PlayerSuccess.UptateSuccessProgress(curPlayer, ShareDefine.SuccType_RealmlvUp, nextRealmLv)
    PlayerTongTianLing.AddTongTianTaskValue(curPlayer, ChConfig.TTLTaskType_RealmUp, 1)
    PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_RealmLV)
    #更新排行榜
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerRune.py
@@ -25,7 +25,6 @@
import ChPyNetSendPack
import NetPackCommon
import IpyGameDataPY
import PlayerSuccess
import IPY_GameWorld
import OpenServerCampaign
import DataRecordPack
@@ -356,7 +355,6 @@
def DoRuneSuccessLogic(curPlayer):
    #符印成就处理
    #清掉#镶嵌X枚X品质符印的成就信息
    PlayerSuccess.ResetSuccessByType(curPlayer, ShareDefine.SuccType_InlayRune)
    totalLV = 0
    runeHoleCnt = IpyGameDataPY.GetFuncCfg("RuneUnlock", 4)
    for holeNum in xrange(1, runeHoleCnt + 1):
@@ -370,9 +368,7 @@
        itemColor = itemData.GetItemColor()
        runeItemPlusLV = ItemControler.GetRuneItemPlusLV(runeData) + 1 #客户端1开始
        totalLV += runeItemPlusLV
        PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_InlayRune, 1, [itemColor])
        PlayerWeekParty.AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_Rune, itemColor, False)
    PlayerSuccess.UptateSuccessProgress(curPlayer, ShareDefine.SuccType_RuneLvUp, totalLV)
    # 开服活动数据
    #OpenServerCampaign.UpdOpenServerCampaignRecordData(curPlayer, ShareDefine.Def_Campaign_Type_RuneLV, totalLV)
    return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerSuccess.py
@@ -2,536 +2,190 @@
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
#-------------------------------------------------------------------------------
#
##@package Player.PlayerSuccess
#
# @todo:成就系统
# @author xdh
# @date 2018-04-23
# @author hxp
# @date 2025-10-17
# @version 1.0
#
#
# 详细描述: 成就系统
#
#---------------------------------------------------------------------
#"""Version = 2018-04-23 11:00"""
#---------------------------------------------------------------------
#-------------------------------------------------------------------------------
#"""Version = 2025-10-17 21:00"""
#-------------------------------------------------------------------------------
import ShareDefine
import ChConfig
import GameWorld
import ChPyNetSendPack
import ShareDefine
import NetPackCommon
import ItemCommon
import IPY_GameWorld
import PlayerControl
import ChPyNetSendPack
import ItemControler
import IpyGameDataPY
import PyGameData
import ObjPool
import datetime
import time
import math
import DataRecordPack
## 获取成就字典信息值
#  @param curPlayer 玩家实例
#  @return
def GetPDictValue(curPlayer, key, defaultValue=0):
    return curPlayer.NomalDictGetProperty(key, defaultValue, ChConfig.Def_PDictType_Success)
## 设置成就字典信息值
#  @param curPlayer 玩家实例
#  @return
def SetPDictValue(curPlayer, key, value):
    PlayerControl.NomalDictSetProperty(curPlayer, key, value, ChConfig.Def_PDictType_Success)
    return
def GetSuccIsFinish(curPlayer, succID):
    #获取成就是否已完成
    return GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_Success_FinishTime, succID)
def SetSuccFinish(curPlayer, succID, finish=True):
    #设置成就是否完成
    return GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_Success_FinishTime, succID, finish)
#成就奖励是否已领取
def GetSuccHasGot(curPlayer, succID):
    #获取成就奖励是否已领取
    return GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_Success_AwardRecord, succID)
    return GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_SuccessAward, succID)
def SetSuccHasGot(curPlayer, succID, hasGot=True):
    #设置成就奖励领取状态
    if GetSuccHasGot(curPlayer, succID) == hasGot:
        return
    GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_Success_AwardRecord, succID, hasGot)
    if hasGot:
        #已领取的可设置是否已完成为0
        SetSuccFinish(curPlayer, succID, 0)
        Sync_SuccTypeIndexAwardRecord(curPlayer, [succID], True) #设置成未领取的在外层同步
    GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_SuccessAward, succID, hasGot)
    return 
def GetSuccPassportAwardHasGot(curPlayer, succID):
    #获取成就通行证奖励是否已领取
    return GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_Success_PassportAward, succID)
def SetSuccPassportAwardHasGot(curPlayer, succID, hasGot=True):
    #设置成就通行证奖励领取状态
    GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_Success_PassportAward, succID, hasGot)
    if hasGot:
        Sync_SuccTypeIndexAwardRecord(curPlayer, [succID])
    return
    
def SetSuccFinishValue(curPlayer, succType, condition, value):
    #设置成就完成度
    key = ChConfig.Def_PDict_Success_CntValue % (succType, condition)
    SetPDictValue(curPlayer, key, value)
#成就完成进度
def GetSuccValue(curPlayer, succType, conds):
    condition = "" if not conds else str(conds).replace(" ", "")[1:-1]
    return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SuccessValue % (succType, condition))
def SetSuccValue(curPlayer, succType, conds, value):
    condition = "" if not conds else str(conds).replace(" ", "")[1:-1]
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_SuccessValue % (succType, condition), value)
    return
def GetSuccFinishValue(curPlayer, succType, condition):
    #获取完成度
    key = ChConfig.Def_PDict_Success_CntValue % (succType, condition)
    return GetPDictValue(curPlayer, key)
## 成就配表数据类
class SuccessData():
    def __init__(self):
        self.succID = 0  #成就ID
        self.succType = 0 # 成就类型
        self.needCnt = 0 # 所以计数数量
        self.preSuccIDList = [] # 前置成就ID
        self.condition = [] # 辅助条件(根据类型自定义配置)
        self.awardItemDict = {} # 完成成就可领取的奖励物品{itemid:itemcnt}
        self.awardItemDict2 = {} # 完成成就可领取的奖励物品,通行证奖励{itemid:itemcnt}
        self.moneyDict = {} # 完成成就获得的金钱 {moneyType:money}
        self.exp = 0 # 完成成就获得的经验
        self.attrDict = {} # 完成成就获得的属性 {attrid:attrvalue}
        self.hasAward = True #是否有奖励
        self.redPacketID = 0 # 红包ID
        return
## 成就数据管理类
class SuccessDataMng():
    ## 构造函数
    #  @param None
    #  @return
    def __init__(self):
        self.succTypeConditionDict = {} #{succType:[condition,..]}
        self.successDataDict = {} # {succType:{index:SuccessData(),...}, ...}
        return
    ## 加载成就数据
    #  @param succType: 成就类型
    #  @return
    def __LoadSuccessData(self, succType):
        if succType in self.successDataDict:
            return
        successDataList = IpyGameDataPY.GetIpyGameDataByCondition('Success', {'Type':succType}, True, False)
        if not successDataList:
            return
        successDataObjDict = {}
        conditionDict = {}
        for successIpyData in successDataList:
            succData = SuccessData()
            succData.succID = successIpyData.GetID()
            succData.succType = succType
            succData.needCnt = successIpyData.GetNeedCnt()
            succData.preSuccIDList = list(successIpyData.GetPreSuccess())
            succData.condition = list(successIpyData.GetCondition())
            succData.awardItemDict = successIpyData.GetAwardItem()
            succData.awardItemDict2 = successIpyData.GetAwardItem2()
            succData.moneyDict = successIpyData.GetMoney()
            succData.exp = successIpyData.GetExp()
            succData.attrDict = successIpyData.GetAwardAttr()
            succData.redPacketID = successIpyData.GetRedPacketID()
            succData.hasAward = bool(succData.awardItemDict or succData.moneyDict or succData.exp or succData.attrDict or succData.redPacketID \
                                     or succData.awardItemDict2)
            successDataObjDict[succData.succID]=succData
            if tuple(succData.condition) not in conditionDict:
                conditionDict[tuple(succData.condition)] = [succData.succID]
            else:
                conditionDict[tuple(succData.condition)].append(succData.succID)
        self.successDataDict[succType] = successDataObjDict
        #self.succTypeConditionDict[succType] = conditionDict
        return
    ## 根据成就类型获取该类型所有成就
    #  @param succType: 成就类型
    #  @return: {index:SuccessData(), ...}
    def GetSuccDataByType(self, succType):
        if succType not in self.successDataDict:
            self.__LoadSuccessData(succType)
        return self.successDataDict.get(succType, {}).values()
    ## 根据成就类型获取该类型所有条件
    #  @param succType: 成就类型
    #  @return: {index:SuccessData(), ...}
#    def GetConditionDictByType(self, succType):
#        if succType not in self.succTypeConditionDict:
#            self.__LoadSuccessData(succType)
#        return self.succTypeConditionDict.get(succType, {})
    ## 根据成就类型索引获取某个成就数据
    #  @param succType: 成就类型
    #  @param index: 成就索引
    #  @return: SuccessData() or None
    def GetSuccessData(self, succID):
        succIpyData = IpyGameDataPY.GetIpyGameDataNotLog('Success', succID)
        if not succIpyData:
            return
        succType = succIpyData.GetType()
        if succType not in self.successDataDict:
            self.__LoadSuccessData(succType)
        return self.successDataDict.get(succType, {}).get(succID)
g_succDataMng = SuccessDataMng()
## 获取成就数据管理器
#  @param None
#  @return
def GetSuccDataMng():
    return g_succDataMng
## 成就OnLogin
#  @param curPlayer
#  @return
def SuccOnLogin(curPlayer):
    # 同步成就信息
    Sync_SuccessInfo(curPlayer)
    # 同步成就领奖记录
    Sync_SuccTypeIndexAwardRecord(curPlayer)
    # 检查老玩家
    __CheckOldPlayerSuccess(curPlayer)
    # 检查达成与否(有些可能改过上限,然后玩家可以完成,上线统一做一次检查)
    for succType in ShareDefine.SuccessTypeList:
        succInfoList = GetSuccDataMng().GetSuccDataByType(succType)
        if not succInfoList:
            continue
        __DoCheckSuccessFinish(curPlayer, succType, succInfoList)
    if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Success_ScoreAward):
        Sync_SuccessScoreAward(curPlayer)
    SyncSuccessInfo(curPlayer)
    SyncSuccessAwardRecord(curPlayer)
    return
## 检查老玩家成就激活情况
#  @param None
#  @return
def __CheckOldPlayerSuccess(curPlayer):
    ''' 成就版本更新老玩家检查  每次启动服务后 玩家第一次上线检查成就完成情况
    '''
    initGameWorldTime = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_InitGameWorldTime)
    # 上线需要检查老玩家成就完成情况类型
    NeedCheckSuccTypeList = [
                             ]
    curCheckVersion = GetPDictValue(curPlayer, ChConfig.Def_PDict_Success_CheckVersion)
    if curCheckVersion == initGameWorldTime:
        GameWorld.DebugLog('    本次开启服务器处理过成就检查,不再处理 ', curPlayer.GetID())
def ResetSuccessByType(curPlayer, succType, ignoreFinish=True):
    #重置某类型成就进度,一般用于先重置次数再重新计数,或者活动类
    ipyDataList = IpyGameDataPY.GetIpyGameDataListNotLog("Success", succType)
    if not ipyDataList:
        return
    GameWorld.DebugLog("更新老玩家上线检查成就curCheckVersion=%s" % (curCheckVersion))
    ipyDataMgr = IpyGameDataPY.IPY_Data()
    for succType in NeedCheckSuccTypeList:
        pass
    DataRecordPack.DR_CheckOldPlayerSuccess(curPlayer)
    SetPDictValue(curPlayer, ChConfig.Def_PDict_Success_CheckVersion, initGameWorldTime)
    GameWorld.DebugLog("更新老玩家上线检查成就updCheckVersions=%s" % (initGameWorldTime), curPlayer.GetID())
    for ipyData in ipyDataList:
        succID = ipyData.GetSuccID()
        if ignoreFinish and GetSuccHasGot(curPlayer, succID):
            continue
        conds = ipyData.GetCondition()
        SetSuccValue(curPlayer, succType, conds, 0)
    return
## 成就OnWeek
#  @param curPlayer
#  @return
def OnWeek(curPlayer):
    resetList = []
    weekResetSuccTypeList = IpyGameDataPY.GetFuncEvalCfg('WeekResetSuccType')
    for succType in weekResetSuccTypeList:
        succInfoList = GetSuccDataMng().GetSuccDataByType(succType)
        if not succInfoList:
            continue
        for succDataObj in succInfoList:
            succID = succDataObj.succID
            condition = succDataObj.condition
            if not GetSuccFinishValue(curPlayer, succType, condition):
                continue
            SetSuccFinishValue(curPlayer, succType, condition, 0)
            SetSuccFinish(curPlayer, succID, False)
            SetSuccHasGot(curPlayer, succID, False)
            resetList.append(succID)
            GameWorld.DebugLog("    OnWeek 重置成就类型: succID=%s" % (succID))
    if resetList:
        Sync_SuccTypeIndexAwardRecord(curPlayer, resetList, True)
        Sync_SuccessInfo(curPlayer, resetList, True)
    return
#def UpdateSuccessProgressByConditions(curPlayer, successType, conditionCountDict):
#    ## 根据多种条件更新进度,如装备多品质的
#    ipyDataList = IpyGameDataPY.GetIpyGameDataListNotLog("Success", successType)
#    if not ipyDataList:
#        return
#    updIDList = []
#    updsuccDataList = []
#    updConditionDict = {}
#
#    for condition, newCount in conditionCountDict.items():
#        addCondList = [] # 不同的成就ID条件可能相同,只是最大进度不同,故传入的条件计数针对相同成就条件只能累加一次
#        for ipyData in ipyDataList:
#            succID = ipyData.GetSuccID()
#            conds = ipyData.GetCondition()
#            needCnt = ipyData.GetNeedCnt()
#
#            tupleCond = tuple(conds) # 作为字典key用
#
#            if tupleCond not in updConditionDict:
#                updConditionDict[tupleCond] = [conds, 0, 0] # [条件, 更新值, 最大进度值]
#            updInfo = updConditionDict[tupleCond]
#            if updInfo[2] < needCnt:
#                updInfo[2] = needCnt
#
#            if not __CheckCanAddSuccess(curPlayer, ipyData, list(condition)):
#                continue
#
#            if succID not in updIDList:
#                updIDList.append(succID)
#                updsuccDataList.append(ipyData)
#
#            if tupleCond not in addCondList:
#                addCondList.append(tupleCond)
#                updConditionDict[tupleCond][1] = updConditionDict[tupleCond][1] + newCount # 更新进度值
#
#    # 没有找到更新目标不处理
#    #GameWorld.DebugLog("    updConditionDict=%s" % updConditionDict)
#    #GameWorld.DebugLog("    updIDList=%s" % updIDList)
#    if not updIDList:
#        return
#
#    # 先更新成就记录值后再判断完成与否
#    for cond, updCnt, maxCnt in updConditionDict.values():
#        if not updCnt:
#            continue
#        updCnt = min(maxCnt, updCnt)
#        if GetSuccValue(curPlayer, successType, cond) == updCnt:
#            continue
#        SetSuccValue(curPlayer, successType, cond, updCnt)
#    SyncSuccessInfo(curPlayer, syncTypeCondList)
#    return
def DoResetSuccessIDList(curPlayer, resetSuccIDList):
    ## 重置成就相关数据
    if not resetSuccIDList:
        return
    resetList = []
    for succID in resetSuccIDList:
        succData = GetSuccDataMng().GetSuccessData(succID)
        if not succData:
            continue
        succType = succData.succType
        condition = succData.condition
        #if not GetSuccFinishValue(curPlayer, succType, condition):
        #    continue
        SetSuccFinishValue(curPlayer, succType, condition, 0)
        SetSuccFinish(curPlayer, succID, False)
        SetSuccHasGot(curPlayer, succID, False)
        resetList.append(succID)
        GameWorld.DebugLog("    重置成就类型: succType=%s,succID=%s" % (succType, succID))
    if resetList:
        Sync_SuccTypeIndexAwardRecord(curPlayer, resetList, True)
        Sync_SuccessInfo(curPlayer, resetList, True)
    return
## 成就OnDay
#  @param curPlayer
#  @return
def SuccOnDay(curPlayer):
    resetList = []
    # 重置连续类型断掉的数据
    serverDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay)
    GameWorld.DebugLog("连续类型成就过天...serverDay=%s" % serverDay)
    for succType in ShareDefine.ContinueSuccessTypeList:
        succInfoList = GetSuccDataMng().GetSuccDataByType(succType)
        if not succInfoList:
            continue
        for succDataObj in succInfoList:
            succID = succDataObj.succID
            condition = succDataObj.condition
            #GameWorld.DebugLog("    succID=%s" % (succID))
            finishTime = GetSuccIsFinish(curPlayer, succID)
            # 已完成的不再检查
            if finishTime > 0 or GetSuccHasGot(curPlayer, succID):
                GameWorld.DebugLog("        已完成的不再检查")
                continue
            if __DoCheckResetContinue(curPlayer, serverDay, succID):
                SetSuccFinishValue(curPlayer, succType, condition, 0)
                resetList.append(succID)
    if resetList:
        Sync_SuccessInfo(curPlayer, resetList, True)
    return
## 检查成就连续天情况
#  @param curPlayer
#  @return True-连续已中断
def __DoCheckResetContinue(curPlayer, serverDay, succID):
    lastDayKey = ChConfig.Def_PDict_Success_LastDay % (succID)
    lastDay = GetPDictValue(curPlayer, lastDayKey)
    # 记录时间从开服天数改成 time.time()
    if lastDay <= 1000:
        #GameWorld.DebugLog("        lastDay <= 0")
        return
    tick = int(time.time())
    serverDay = GameWorld.ChangeTimeNumToDatetime(tick, ChConfig.TYPE_Time_Format_Day)
    lastDay = GameWorld.ChangeTimeNumToDatetime(lastDay, ChConfig.TYPE_Time_Format_Day)
    # 昨天有更新的不处理,证明还是连续状态
    if lastDay == serverDay - datetime.timedelta(1):
        GameWorld.DebugLog("        昨天有更新的不处理,证明还是连续状态")
        return
    SetPDictValue(curPlayer, lastDayKey, 0)
    GameWorld.DebugLog("    重置成就连续类型: succID=%s" % (succID))
    return True
def ResetSuccessByType(curPlayer, succType):
    #重置某类型成就进度(已完成的不重置)
    succInfoList = GetSuccDataMng().GetSuccDataByType(succType)
    if not succInfoList:
        return
    #先重置次数再重新计数
    for succDataObj in succInfoList:
        succID = succDataObj.succID
        condition = succDataObj.condition
        #GameWorld.DebugLog("    succID=%s" % (succID))
        finishTime = GetSuccIsFinish(curPlayer, succID)
        # 已完成的不再检查
        if finishTime > 0 or GetSuccHasGot(curPlayer, succID):
            continue
        SetSuccFinishValue(curPlayer, succType, condition, 0)
    return
def UpdateSuccessProgressByConditions(curPlayer, successType, conditionCountDict):
    if successType not in ShareDefine.SuccessTypeList:
        return
    succInfoList = GetSuccDataMng().GetSuccDataByType(successType)
    if not succInfoList:
        return
    updIDList = []
    updsuccDataList = []
    updConditionDict = {}
    for condition, newCount in conditionCountDict.items():
        addCondList = [] # 不同的成就ID条件可能相同,只是最大进度不同,故传入的条件计数针对相同成就条件只能累加一次
        for succDataObj in succInfoList:
            cond = succDataObj.condition
            tupleCond = tuple(cond) # 作为字典key用
            succID = succDataObj.succID
            needCnt = succDataObj.needCnt
            if tupleCond not in updConditionDict:
                updConditionDict[tupleCond] = [cond, 0, 0] # [条件, 更新值, 最大进度值]
            updInfo = updConditionDict[tupleCond]
            if updInfo[2] < needCnt:
                updInfo[2] = needCnt
            if not __CheckCanAddSuccess(curPlayer, succDataObj, list(condition)):
                continue
            if succID not in updIDList:
                updIDList.append(succID)
                updsuccDataList.append(succDataObj)
            if tupleCond not in addCondList:
                addCondList.append(tupleCond)
                updConditionDict[tupleCond][1] = updConditionDict[tupleCond][1] + newCount # 更新进度值
    # 没有找到更新目标不处理
    #GameWorld.DebugLog("    updConditionDict=%s" % updConditionDict)
    #GameWorld.DebugLog("    updIDList=%s" % updIDList)
    if not updIDList:
        return
    isUpd = False
    # 先更新成就记录值后再判断完成与否
    for cond, updCnt, maxCnt in updConditionDict.values():
        if not updCnt:
            continue
        updCnt = min(maxCnt, updCnt)
        if GetSuccFinishValue(curPlayer, successType, cond) == updCnt:
            continue
        isUpd = True
        SetSuccFinishValue(curPlayer, successType, cond, updCnt)
        #GameWorld.DebugLog("    successType=%s,cond=%s,updCnt=%s,maxCnt=%s"  % (successType, cond, updCnt, maxCnt))
    if not isUpd:
        return
    # 同步更新信息
    Sync_SuccessInfo(curPlayer, updIDList, False)
    # 更新值后检查成就完成情况
    __DoCheckSuccessFinish(curPlayer, successType, updsuccDataList)
    return
## 更新成就完成进度逻辑(外部功能调用,只适用于不重置的成就类型)
#  @param curPlayer
#  @param successType: 成就类型
#  @param newCnt: 新进度值
#  @return
def UptateSuccessProgress(curPlayer, successType, newCnt, condition=[]):
    if successType not in ShareDefine.SuccessTypeList:
    ipyDataList = IpyGameDataPY.GetIpyGameDataListNotLog("Success", successType)
    if not ipyDataList:
        return
    #if successType in ShareDefine.FeastRedPackSuccessTypeList:
    #    if not PlayerFeastRedPacket.GetFeastRedPacketState():
    #        return
    succInfoList = GetSuccDataMng().GetSuccDataByType(successType)
    if not succInfoList:
        GameWorld.DebugLog("    找不到成就数据successType=%s" % successType)
        return
    curCnt = -1
    for succData in succInfoList:
        if not __CheckCanAddSuccess(curPlayer, succData, condition):
    curCnt = None
    for ipyData in ipyDataList:
        if not __CheckCanAddSuccess(curPlayer, ipyData, condition):
            continue
        curCnt = GetSuccFinishValue(curPlayer, successType, succData.condition)
        curCnt = GetSuccValue(curPlayer, successType, ipyData.GetCondition())
        break
    if curCnt == -1:
    if curCnt == None or newCnt <= curCnt:
        #GameWorld.DebugLog("不需要更新成就值: curCnt=%s" % (curCnt))
        return
    if newCnt > curCnt: #这里需要立即更新!!
        DoAddSuccessProgress(curPlayer, successType, newCnt - curCnt, condition, False)
    #update的需要立即更新!!
    DoAddSuccessProgress(curPlayer, successType, newCnt - curCnt, condition, False)
    return
def __CheckCanAddSuccess(curPlayer, succDataObj, condition):
    successType = succDataObj.succType
    succID = succDataObj.succID
    cond = succDataObj.condition
    #if successType in ShareDefine.FeastRedPackSuccessTypeList:
    #    todayFeastSuccIDList = PlayerFeastRedPacket.GetTodayFeastSuccIDList()
    #    if not todayFeastSuccIDList or succID not in todayFeastSuccIDList:
    #        #GameWorld.DebugLog("    非今日节日红包成就,不增加进度! succID=%s,todayFeastSuccIDList=%s" % (succID, todayFeastSuccIDList))
    #        return
    isUnDownCheck = successType in ShareDefine.UnDownCheckSuccessTypeList
    isContain = successType in ShareDefine.ContainSuccessTypeList
def __CheckCanAddSuccess(curPlayer, ipyData, condition):
    ## 检查可否添加进度
    succID = ipyData.GetSuccID()
    # 已完成的不再检查
    if GetSuccIsFinish(curPlayer, succID) or GetSuccHasGot(curPlayer, succID):
    if GetSuccHasGot(curPlayer, succID):
        return
    #前置成就判断
    preSuccIDList = succDataObj.preSuccIDList
    for preSuccID in preSuccIDList:
        if not GetSuccIsFinish(curPlayer, preSuccID) and not GetSuccHasGot(curPlayer, preSuccID):
            return
    
    # 有辅助条件的, 需判断是否向下检查
    if len(cond) > 0:
        if isContain:
            if condition[0] not in cond:
    successType = ipyData.GetSuccType()
    conds = ipyData.GetCondition()
    if not conds:
        # 无条件的默认可添加
        return True
    if not condition:
        return
    # 传进来的条件满足配置的条件列表中的一个就行的成就类型
    if successType in ShareDefine.ContainSuccessTypeList:
        if condition[0] not in conds:
            return
    # 传进来的条件是配置条件的整数倍的成就类型
    elif successType in ShareDefine.MultipleSuccessTypeList:
        if not (condition[0] / conds[0] and condition[0] % conds[0] == 0):
            #必须是条件的倍数
            return
    else:
        if len(conds) != len(condition):
            return
        # 不向下检查增加进度的, 仅配置值等于该值的可增加进度
        if successType in ShareDefine.UnDownCheckSuccessTypeList:
            if conds != condition:
                return
        elif successType in ShareDefine.MultipleSuccessTypeList:
            if not (condition[0]/cond[0] and condition[0]%cond[0] == 0):
                #必须是条件的倍数
                return
        # 可向下增加进度的, 仅配置值 <= 该值的可增加进度
        else:
            if len(cond) != len(condition):
                return
            # 不向下检查增加进度的, 仅配置值等于该值的可增加进度
            if isUnDownCheck and cond != condition:
                return
            # 可向下增加进度的, 仅配置值 <= 该值的可增加进度
            if not isUnDownCheck:
                isbreak = False
                undowncheckIndexList = [] # 不向下检查的条件索引
                if successType in ShareDefine.PartUnDownCheckSuccessTypeInfo:
                    undowncheckIndexList = ShareDefine.PartUnDownCheckSuccessTypeInfo[successType]
                for i, num in enumerate(cond):
                    if i in undowncheckIndexList:
                        if num != condition[i]:
                            isbreak = True
                            break
                    if num > condition[i]:
            isbreak = False
            undowncheckIndexList = [] # 不向下检查的条件索引
            if successType in ShareDefine.PartUnDownCheckSuccessTypeInfo:
                undowncheckIndexList = ShareDefine.PartUnDownCheckSuccessTypeInfo[successType]
            for i, num in enumerate(conds):
                if i in undowncheckIndexList:
                    if num != condition[i]:
                        isbreak = True
                        break
                if isbreak:
                    return
                if num > condition[i]:
                    isbreak = True
                    break
            if isbreak:
                return
    return True
# 将攻击类的成就一次执行,减少运行量
def FinishDelayAddSuccessProgress(curPlayer, tick, isFinish=True):
    # 将攻击类的成就一次执行,减少运行量
    if not isFinish:
        # 二次延迟处理
@@ -547,401 +201,131 @@
    
    successDict = PyGameData.g_delaySuccessDict.pop(playerID)
    for sucessInfo, cnt in successDict.items():
        DoAddSuccessProgress(curPlayer, sucessInfo[0], cnt, list(sucessInfo[1]), False)
    return
## 增加成就完成进度逻辑(外部功能调用)
#  @param curPlayer
#  @param successType: 成就类型
#  @param addCnt: 增加进度值
#  @param condition: 扩展条件
#  @return
def DoAddSuccessProgress(curPlayer, successType, addCnt, condition=[], delayCalc=True):
    #GameWorld.DebugLog("DoAddSuccessProgress type=%s,addCnt=%s,condition=%s"
    #                   % (successType, addCnt, condition), curPlayer.GetPlayerID())
    if GameWorld.IsCrossServer():
        return
    
    #if successType in ShareDefine.FeastRedPackSuccessTypeList:
    #    if not PlayerFeastRedPacket.GetFeastRedPacketState():
    #        #GameWorld.DebugLog("非节日红包活动时间,不增加成就!successType=%s" % successType)
    #        return
    playerID = curPlayer.GetID()
    if delayCalc and successType not in ShareDefine.NeedResetSuccessTypeList:
    if delayCalc:
        if playerID not in PyGameData.g_delaySuccessDict:
            PyGameData.g_delaySuccessDict[playerID] = {}
        # 最终处理减少计算量
        # 最终处理减少计算量,短时间多次累加汇总一次计算
        successTuple = (successType, tuple(condition))
        if successTuple not in PyGameData.g_delaySuccessDict[playerID]:
            PyGameData.g_delaySuccessDict[playerID][successTuple] = addCnt
        else:
            PyGameData.g_delaySuccessDict[playerID][successTuple] = PyGameData.g_delaySuccessDict[playerID][successTuple] + addCnt
        return
    if condition and type(condition) != type([]):
        GameWorld.ErrLog('DoAddSuccessProgress type=%s, condition=%s 错误!'%(type, condition))
        GameWorld.ErrLog('DoAddSuccessProgress type=%s, condition=%s 错误!' % (type, condition))
        return
    if successType not in ShareDefine.SuccessTypeList:
        return
    
    succInfoList = GetSuccDataMng().GetSuccDataByType(successType)
    if not succInfoList:
        GameWorld.DebugLog("    找不到成就数据successType=%s" % successType)
    ipyDataList = IpyGameDataPY.GetIpyGameDataListNotLog("Success", successType)
    if not ipyDataList:
        GameWorld.DebugLog("找不到成就数据successType=%s" % successType)
        return
    
    maxCnt = 0 # 本次可以更新到的最大值
    updConditionList = [] # 需更新进度值的key编号列表
    updIDList = []
    updsuccDataList = []
    tick = int(time.time())
    for succDataObj in succInfoList:
        succID = succDataObj.succID
        needCnt = succDataObj.needCnt
    for ipyData in ipyDataList:
        
        if not __CheckCanAddSuccess(curPlayer, succDataObj, condition):
        if not __CheckCanAddSuccess(curPlayer, ipyData, condition):
            continue
        updIDList.append(succID)
        updsuccDataList.append(succDataObj)
        curCondition = succDataObj.condition
        if curCondition not in updConditionList:
            updConditionList.append(curCondition)
        conds = ipyData.GetCondition()
        if conds not in updConditionList:
            updConditionList.append(conds)
            
        needCnt = ipyData.GetNeedCnt()
        if maxCnt < needCnt:
            maxCnt = needCnt
            
        # 连续类型的, 更新连续时的开服天数
        if successType in ShareDefine.ContinueSuccessTypeList:
            lastDayKey = ChConfig.Def_PDict_Success_LastDay % (succID)
            SetPDictValue(curPlayer, lastDayKey, tick)
    #GameWorld.DebugLog("    updConditionList=%s,maxCnt=%s" % (str(updConditionList), maxCnt))
    # 没有找到更新目标不处理
    if not updConditionList or maxCnt <= 0:
        return
    
    # 先更新成就记录值后再判断完成与否
    for condition in updConditionList:
        curCnt = GetSuccFinishValue(curPlayer, successType, condition)
    syncTypeCondList = []
    for conds in updConditionList:
        curCnt = GetSuccValue(curPlayer, successType, conds)
        updCnt = min(maxCnt, curCnt + addCnt)
        SetSuccFinishValue(curPlayer, successType, condition, updCnt)
#        GameWorld.DebugLog("    successType=%s,condition=%s,curCnt=%s,addCnt=%s,updCnt=%s"
#                           % (successType,condition, curCnt, addCnt, updCnt))
    # 同步更新信息
    Sync_SuccessInfo(curPlayer, updIDList, False)
    # 更新值后检查成就完成情况
    __DoCheckSuccessFinish(curPlayer, successType, updsuccDataList)
        SetSuccValue(curPlayer, successType, conds, updCnt)
        syncTypeCondList.append([successType, conds])
    SyncSuccessInfo(curPlayer, syncTypeCondList)
    return
## 检查成就完成情况
#  @param curPlayer
#  @param successType: 成就类型
#  @param succInfoDict: 该类型所有成就信息字典
#  @param isPub: 进度值是否公共
#  @param updNumList: 有更新进度的编号列表
#  @return
def __DoCheckSuccessFinish(curPlayer, successType, succInfoList):
def GetSuccessAward(curPlayer, succID):
    ipyData = IpyGameDataPY.GetIpyGameDataByCondition("Success", {"SuccID":succID})
    if not ipyData:
        return
    
    isNeedSys = successType in [ShareDefine.SuccType_ElderBattlefieldKill, ShareDefine.SuccType_ElderBattlefieldConKill]
    curTime = GameWorld.ChangeTimeStrToNum(GameWorld.GetCurrentDataTimeStr())
    playerName = curPlayer.GetName()
    for succDataObj in succInfoList:
        succID = succDataObj.succID
        needCnt = succDataObj.needCnt
        finishTime = GetSuccIsFinish(curPlayer, succID)
        # 已完成的不再检查
        if finishTime > 0 or GetSuccHasGot(curPlayer, succID):
            continue
        curCnt = GetSuccFinishValue(curPlayer, successType, succDataObj.condition)
        # 完成成就
        if curCnt >= needCnt:
            # 设置完成时间
            SetSuccFinish(curPlayer, succID)
            # 没有奖励的直接设置已领取
            if not succDataObj.hasAward:
                SetSuccHasGot(curPlayer, succID)
            # 通知客户端完成成就
            Notify_FinishSuccess(curPlayer, succID, curTime)
            if isNeedSys:
                PlayerControl.WorldNotify(0, 'AncientBattlefield_1', [playerName, succID])
            GameWorld.DebugLog("    完成成就succID=%s, type=%s,time=%s"
                               % (succID, successType, curTime))
    if GetSuccHasGot(curPlayer, succID):
        GameWorld.DebugLog("该成就奖励已经领取过! succID=%s" % succID)
        return
    
    succType = ipyData.GetSuccType()
    conds = ipyData.GetCondition()
    needCnt = ipyData.GetNeedCnt()
    curValue = GetSuccValue(curPlayer, succType, conds)
    if curValue < needCnt:
        GameWorld.DebugLog("该成就未完成! succID=%s,curValue=%s < %s" % (succID, curValue, needCnt))
        return
    SetSuccHasGot(curPlayer, succID)
    SyncSuccessAwardRecord(curPlayer, [succID], True)
    awardItemList = ipyData.GetAwardItemList()
    if awardItemList:
        ItemControler.GivePlayerItemOrMail(curPlayer, awardItemList, event=["SuccessAward", False, {}])
    return
## 计算成就属性
#  @param curPlayer 玩家
#  @param allAttrList 属性列表
#  @return None
def CalcSuccessAttr(curPlayer):
    allAttrList = [{} for _ in range(4)]
    attrDict = {}
    ipyDataMgr = IpyGameDataPY.IPY_Data()
    for i in xrange(ipyDataMgr.GetSuccessCount()):
        ipyData = ipyDataMgr.GetSuccessByIndex(i)
        succID = ipyData.GetID()
        attrAwardDict = ipyData.GetAwardAttr()
        if not attrAwardDict:
            continue
        if not GetSuccHasGot(curPlayer, succID):
            continue
        for attrID, attrValue in attrAwardDict.items():
            attrDict[attrID] = attrDict.get(attrID, 0) + attrValue
    #GameWorld.DebugLog("    成就增加属性 attrDict=%s" % (attrDict))
    for attrID, attrValue in attrDict.items():
        PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrList)
    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Success, allAttrList)
    return
## 刷新成就属性
def RefreshSuccessAttr(curPlayer):
    CalcSuccessAttr(curPlayer)
    # 不立即刷新
    PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState()
    return
## 同步成就信息
#  @param curPlayer:
#  @param syncDict: 指定同步字典
#  @param isSendZero: 是否同步空数据(如连续类型进度值被清空时 or GM命令测试), 数据比较多,空数据默认就不同步了
#  @return
def Sync_SuccessInfo(curPlayer, succIdList=[], isSendZero=False):
    succInfoListPack = ChPyNetSendPack.tagMCSuccessInfoList()
    succInfoListPack.Clear()
    succInfoListPack.SuccessInfoList = []
    if succIdList:
        syncIdList = succIdList
    else:
        syncIdList = []
def SyncSuccessInfo(curPlayer, syncTypeCondList=None, isSendZero=False):
    if not syncTypeCondList:
        syncTypeCondList = []
        ipyDataMgr = IpyGameDataPY.IPY_Data()
        for i in xrange(ipyDataMgr.GetSuccessCount()):
            ipyData = ipyDataMgr.GetSuccessByIndex(i)
            succID = ipyData.GetID()
            syncIdList.append(succID)
        for index in range(ipyDataMgr.GetSuccessCount()):
            ipyData = ipyDataMgr.GetSuccessByIndex(index)
            # 已领取的不发
            if GetSuccHasGot(curPlayer, ipyData.GetSuccID()):
                continue
            succType = ipyData.GetSuccType()
            conds = ipyData.GetCondition()
            tcList = [succType, conds]
            if tcList in syncTypeCondList:
                continue
            syncTypeCondList.append(tcList)
            
    syncTypeDict = {}
    for succID in syncIdList:
        succData = GetSuccDataMng().GetSuccessData(succID)
        if not succData:
            continue
        succType = succData.succType
        condition = succData.condition
        CntValue = GetSuccFinishValue(curPlayer, succType, condition)
        isfinish = GetSuccIsFinish(curPlayer, succID)
    successInfoList = []
    objPoolMgr = ObjPool.GetPoolMgr()
    for succType, conds in syncTypeCondList:
        curValue = GetSuccValue(curPlayer, succType, conds)
        # 不发送为0的数据
        if not isSendZero and CntValue <= 0 and not isfinish:
        if not isSendZero and curValue <= 0:
            continue
        # 已领取的不发
        if GetSuccHasGot(curPlayer, succID):
            continue
        if succType not in syncTypeDict:
            syncTypeDict[succType] = [[condition, CntValue]]
        elif [condition, CntValue] not in syncTypeDict[succType]:
            syncTypeDict[succType].append([condition, CntValue])
        succInfo = objPoolMgr.acquire(ChPyNetSendPack.tagSCSuccessInfo)
        succInfo.SuccType = succType
        succInfo.Conds = conds
        succInfo.CLen = len(succInfo.Conds)
        succInfo.CurValue = curValue
        successInfoList.append(succInfo)
        
    if not syncTypeDict:
    if not successInfoList:
        return
    
    for sType, conditionList in syncTypeDict.items():
        for condition, cntValue in conditionList:
            succInfo = ChPyNetSendPack.tagMCSuccessInfo()
            succInfo.Clear()
            succInfo.SuccType = sType
            succInfo.Condition = str(condition) if condition else '[0]'
            succInfo.Len = len(succInfo.Condition)
            succInfo.CntValue = cntValue
            succInfoListPack.SuccessInfoList.append(succInfo)
    succInfoListPack.count = len(succInfoListPack.SuccessInfoList)
    NetPackCommon.SendFakePack(curPlayer, succInfoListPack)
    clientPack = objPoolMgr.acquire(ChPyNetSendPack.tagSCSuccessInfoList)
    clientPack.SuccessInfoList = successInfoList
    clientPack.Count = len(clientPack.SuccessInfoList)
    NetPackCommon.SendFakePack(curPlayer, clientPack)
    return
## 通知完成成就
#  @param None
#  @return
def Notify_FinishSuccess(curPlayer, succID, finishTime):
    succFinishPack = ChPyNetSendPack.tagMCSuccessFinish()
    succFinishPack.Clear()
    succFinishPack.SuccID = succID
    #succFinishPack.FinishTime = finishTime
    NetPackCommon.SendFakePack(curPlayer, succFinishPack)
    return
def GetCanGetAwardSuccByType(curPlayer, successTypeList):
    ##根据类型获取可领取的成就
    succList = []
    for successType in successTypeList:
        succInfoList = GetSuccDataMng().GetSuccDataByType(successType)
        for succDataObj in succInfoList:
            succID = succDataObj.succID
            if GetSuccIsFinish(curPlayer, succID) and not GetSuccHasGot(curPlayer, succID):
                succList.append(succID)
    return succList
def GiveSuccAward(curPlayer, succIDList, isGiveItem=True):
    #给成就奖励
    awardDict = {}
    for succID in succIDList:
        awardItemDict = __DoGetSuccTypeIndexAward(curPlayer, succID, isGiveItem)
        if not awardItemDict:
            continue
        for itemID,itemCnt in awardItemDict.items():
            awardDict[itemID] = awardDict.get(itemID, 0)+itemCnt
    return awardDict
def GetSuccessPassportState(curPlayer):
    ## 成就通行证状态
    return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CTGGoodsBuyCount % ChConfig.Def_CTGID_SuccessPassport) > 0
#// A5 42 领取成就奖励 #tagMCGetSuccessAward
#
#struct    tagMCGetSuccessAward
#{
#    tagHead        Head;
#    DWORD        SuccID;    //成就ID
#    BYTE        IsPassport;    //是否通行证奖励
#};
def OnGetSuccessAward(index, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    succID = clientData.SuccID
    isPassport = clientData.IsPassport
    __DoGetSuccTypeIndexAward(curPlayer, succID, isPassport=isPassport)
    return
## 领取某个成就奖励
#  @param None
#  @return
def __DoGetSuccTypeIndexAward(curPlayer, succID, isGiveItem=True, isPassport=False):
    GameWorld.DebugLog("领取成就奖励succID=%s,isPassport=%s" % (succID, isPassport))
    succData = GetSuccDataMng().GetSuccessData(succID)
    if not succData:
        GameWorld.DebugLog("    成就数据不存在!succID=%s" % (succID))
        return
    if not succData.hasAward:
        GameWorld.DebugLog("    该成就没有配置奖励!")
        return
    finishTime = GetSuccIsFinish(curPlayer, succID)
    hasGot = GetSuccHasGot(curPlayer, succID) # 因为普通奖励领取后会重置是否已完成,所以如果已经领取普通奖励也代表已完成
    if finishTime <= 0 and not hasGot:
        GameWorld.DebugLog("    该成就未完成!")
        return
    if isPassport:
        if GetSuccPassportAwardHasGot(curPlayer, succID):
            GameWorld.DebugLog("    该成就通行证奖励已经领取过!")
            return
        if not GetSuccessPassportState(curPlayer):
            GameWorld.DebugLog("    未开通成就通行证,无法领取通行证奖励!")
            return
        itemDict = succData.awardItemDict2
        if not itemDict:
            GameWorld.DebugLog("    该成就没用通行证奖励!")
            return
    else:
        if hasGot:
            GameWorld.DebugLog("    该成就奖励已经领取过!")
            return
        itemDict = succData.awardItemDict
#    if awardItemDict and '[' in str(awardItemDict):
#        #修行成就奖励根据境界等级变
#        curRealmLV = curPlayer.GetOfficialRank()
#        sortLVList=sorted(awardItemDict.keys())
#        findLV = sortLVList[0]
#        for realmlv in sortLVList:
#            if curRealmLV <= int(realmlv):
#                findLV = realmlv
#                break
#        itemDict = dict(awardItemDict[findLV])
#    else:
#        itemDict = awardItemDict
    # 检查背包
    if isGiveItem:
        if not ItemCommon.CheckPackEnough(curPlayer, itemDict):
            return
#        packSpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem)
#        needSpace = len(itemDict)
#        if needSpace > packSpace:
#            PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_998371")
#            return
    # 更新领奖记录
    if isPassport:
        SetSuccPassportAwardHasGot(curPlayer, succID)
    else:
        SetSuccHasGot(curPlayer, succID)
    # 给物品
    giveItemList = []
    if isGiveItem:
        for itemID, itemCnt in itemDict.items():
            isPutIn = ItemControler.GivePlayerItem(curPlayer, itemID, itemCnt, 0, [IPY_GameWorld.rptItem, IPY_GameWorld.rptAnyWhere])
            if isPutIn:
                giveItemList.append([itemID, itemCnt])
    if isPassport:
        # 通行证奖励只给物品
        ItemControler.NotifyGiveAwardInfo(curPlayer, giveItemList, "SuccessAward")
        return itemDict
    #给钱
    for moneyType, value in succData.moneyDict.items():
        PlayerControl.GiveMoney(curPlayer, int(moneyType), value)
    #给经验
    if succData.exp:
        PlayerControl.PlayerControl(curPlayer).AddExp(succData.exp)
    #属性
    if succData.attrDict:
        RefreshSuccessAttr(curPlayer)
    #发红包
    #if succData.redPacketID:
    #    PlayerFamilyRedPacket.CreatRedPacketByID(curPlayer, succData.redPacketID, PlayerFamilyRedPacket.State_NoGot, succID)
    GameWorld.DebugLog("    OK! awardItemDict=%s moneyDict=%s" % (itemDict, succData.moneyDict))
    ItemControler.NotifyGiveAwardInfo(curPlayer, giveItemList, "SuccessAward", exp=succData.exp, moneyInfo=succData.moneyDict)
    return itemDict
## 通知成就对应奖励领奖记录
#  @param None
#  @return
def Sync_SuccTypeIndexAwardRecord(curPlayer, succIDList=[], isSyncZero=False):
def SyncSuccessAwardRecord(curPlayer, succIDList=[], isSyncZero=False):
    ## 通知成就对应奖励领奖记录
    if succIDList:
        recordIndexList = []
        for succID in succIDList:
@@ -953,60 +337,25 @@
        succCnt = ipyDataMgr.GetSuccessCount()
        if not succCnt:
            return
        maxSuccid = ipyDataMgr.GetSuccessByIndex(succCnt-1).GetID()
        recordIndexList = xrange(maxSuccid / 31+1)
    succFARPack = ChPyNetSendPack.tagMCSuccessFinishAwardRecordList()
    succFARPack.Clear()
    succFARPack.RecordList = []
        maxSuccID = ipyDataMgr.GetSuccessByIndex(succCnt - 1).GetSuccID()
        recordIndexList = xrange(maxSuccID / 31 + 1)
    objPoolMgr = ObjPool.GetPoolMgr()
    recordList = []
    for i in recordIndexList:
        awardRecord=curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Success_AwardRecord%i)
        passportAwardRecord=curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Success_PassportAward%i)
        if not isSyncZero and not awardRecord and not passportAwardRecord:
        awardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SuccessAward % i)
        if not isSyncZero and not awardRecord:
            continue
        recordInfo = ChPyNetSendPack.tagMCSuccessFinishAwardRecord()
        recordInfo = objPoolMgr.acquire(ChPyNetSendPack.tagSCSuccessAwardRecord)
        recordInfo.RecordIndex = i
        recordInfo.Record = awardRecord
        recordInfo.PassportRecord = passportAwardRecord
        succFARPack.RecordList.append(recordInfo)
        recordList.append(recordInfo)
        
    succFARPack.RecordCnt = len(succFARPack.RecordList)
    NetPackCommon.SendFakePack(curPlayer, succFARPack)
    return
def AddEnterFBSuccess(curPlayer, mapID, addCount):
    #进入副本成就相关
    return
def GetSuccessScoreAward(curPlayer, awardIndex):
    playerID = curPlayer.GetPlayerID()
    awardDict = IpyGameDataPY.GetFuncEvalCfg("SucceeScore", 1, {})
    if str(awardIndex) not in awardDict:
    if not recordList:
        return
    awardInfo = awardDict[str(awardIndex)]
    if len(awardInfo) != 2:
        return
    needScore, awardItemList = awardInfo
    if not PlayerControl.HaveMoney(curPlayer, ShareDefine.TYPE_Price_SuccessSocre, needScore):
        GameWorld.Log("成就积分不足,无法领奖! awardIndex=%s,needScore=%s" % (awardIndex, needScore), playerID)
        return
    awardState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Success_ScoreAward)
    if awardState & pow(2, awardIndex):
        GameWorld.DebugLog("已领取过该成就积分奖励! awardIndex=%s" % awardIndex, playerID)
        return
    updAwardState = awardState | pow(2, awardIndex)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_Success_ScoreAward, updAwardState)
    GameWorld.DebugLog("领取成就积分奖励! awardIndex=%s,awardState=%s,updAwardState=%s" % (awardIndex, awardState, updAwardState), playerID)
    Sync_SuccessScoreAward(curPlayer)
    ItemControler.GivePlayerItemOrMail(curPlayer, awardItemList, event=["SuccessScore", False, {}])
    return
def Sync_SuccessScoreAward(curPlayer):
    clientPack = ChPyNetSendPack.tagMCSuccessScoreInfo()
    clientPack.Clear()
    clientPack.ScoreAwardState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Success_ScoreAward)
    clientPack = objPoolMgr.acquire(ChPyNetSendPack.tagSCSuccessAwardRecordList)
    clientPack.RecordList = recordList
    clientPack.RecordCnt = len(clientPack.RecordList)
    NetPackCommon.SendFakePack(curPlayer, clientPack)
    return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerWing.py
@@ -22,8 +22,6 @@
import ShareDefine
import ItemCommon
import GameFuncComm
import PlayerSuccess
import ItemControler
import ChEquip
import random
@@ -86,7 +84,6 @@
    WingProgressUP(curWing, totalPoint, materialItemDict, curPlayer)
    ChEquip.RefreshPlayerLingQiEquipAttr(curPlayer)
    PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState()
    PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_WingRefine, 1)
    return
def __WingCanJingLian(curWing):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -690,7 +690,7 @@
CDBPlayerRefresh_ExAttr20, # ExAttr20 244
CDBPlayerRefresh_JiYuan, # 机缘币  245
CDBPlayerRefresh_BTGMYuE, # BTGM余额  246
CDBPlayerRefresh_SuccessScore, # 成就积分  247
CDBPlayerRefresh_247, # 成就积分  247
CDBPlayerRefresh_FamilyFlagWarPoint, # 成就积分  248
CDBPlayerRefresh_ComboRateDef, # 抗连击概率 249
CDBPlayerRefresh_AtkBackRate, # 反击概率 250
@@ -813,7 +813,6 @@
                           TYPE_Price_BTGMPoint:CDBPlayerRefresh_BTGMPoint,
                           TYPE_Price_GuShenMoney:CDBPlayerRefresh_GuShenMoney,
                           TYPE_Price_GongdePoint:CDBPlayerRefresh_GongdePoint,
                           TYPE_Price_SuccessSocre:CDBPlayerRefresh_SuccessScore,
                           TYPE_Price_Xiantao:CDBPlayerRefresh_Xiantao,
                           TYPE_Price_Lingyu:CDBPlayerRefresh_Lingyu,
                           TYPE_Price_FamilyFlagWarPoint:CDBPlayerRefresh_FamilyFlagWarPoint,
@@ -1457,232 +1456,22 @@
# 成就类型定义
SuccessTypeList = (
SuccType_HeroLV, # 等级达到XX级成就1
SuccType_DecomposeEquip, # 分解X件装备(装备碎片也算2
SuccType_MainTaskNode, # 主线任务节点3
SuccType_MunekadoTrialEx, #通关X次宗门试炼4
SuccType_TaskCRun, # 完成x次日常环任务成就5
SuccType_TaskFRun, # 完成x次10环战盟环任务成就6
SuccType_KirinHomeEx, #通关麒麟之府X次成就7
SuccType_GodWeapon, # x神器达到X级成就8
SuccType_XXX9, # 废弃9
SuccType_HorseAllLV, # 坐骑等级达到X级 10
SuccType_XXX11, # 废弃11
SuccType_KillBossHomeBoss, # BOSS之家BOSS击杀成就12
SuccType_XXX13, # 废弃13
SuccType_XXX14, # 废弃14
SuccType_XXX15, # 废弃15
SuccType_XXX16, # 废弃16
SuccType_XXX17, # 废弃17
SuccType_XXX18, # 废弃18
SuccType_AddFriend, # 添加XX个好友成就19
SuccType_TalkWorld, # 世界频道发言20
SuccType_XXX21 , # 废弃21
SuccType_XXX22 , # 废弃22
SuccType_XXX23 , # 废弃23
SuccType_XXX24 , # 废弃24
SuccType_XXX25, # 废弃25
SuccType_EquipPlus, # x件x阶x强化等级 26
SuccType_XXX27, # 废弃27
SuccType_KillWorldBoss, # 击杀世界bossx次成就(有伤害就算)28
SuccType_XXX29, # 废弃29
SuccType_PassWagicWeapon, # 通关法宝副本30
SuccType_XXX31, # 废弃31
SuccType_XXX32, # 废弃32
SuccType_GetMagicWeapon, # 获得x法宝成就33
SuccType_XXX34, # 废弃34
SuccType_Pray, # 祈祷x次35
SuccType_KillSpecificNPC, # 击杀特定NPC36
SuccType_XXX37, # 废弃37
SuccType_EquipPlace, # x件x阶x部位 38
SuccType_EquipColorItem, # x件x阶x品质 39
SuccType_XXX40, #废弃40
SuccType_XXX41, #废弃41
SuccType_PassRuneTower, #通关符印塔成就42
SuccType_XXX43, #废弃43
SuccType_InlayRune, #镶嵌X枚X品质符印44
SuccType_RuneLvUp, #累计符印总等级XX45
SuccType_BZZD, #通关仙界秘境成就46
SuccType_XXX47, #废弃47
SuccType_SealDemon, #封魔坛击杀BOSS几只48
SuccType_KirinHome, #通关麒麟之府X层X次成就49
SuccType_RealmlvUp, #境界提升成就50
SuccType_RefineItem, #完成1次炼丹成就51
SuccType_XXX52, #废弃52
SuccType_XXX53, #废弃53
SuccType_MunekadoTrial, #X人及以上组队X评级及以上通关X层宗门试炼54
SuccType_ElderBattlefieldKill, #上古战场击杀成就55
SuccType_ElderBattlefieldConKill, #上古战场15连杀成就56
SuccType_XXX57, #废弃57
SuccType_PetClassLV, #X灵宠达到X阶58
SuccType_XXX59, #废弃59
SuccType_InlayStone1, #镶嵌X枚X级以上生命翡翠60
SuccType_InlayStone2, #镶嵌X枚X级以上毁灭炎晶61
SuccType_XJMJGetExp, #仙界秘境单场获得X亿经验62
SuccType_QueenRelics, #S级通关娲皇遗迹X层63
SuccType_XXX64, #废弃64
SuccType_XMZZConWin, #仙魔之争X连胜X次65
SuccType_XXX66, #废弃66
SuccType_ChaosDemon, #混乱妖域X人以上队伍X评级通关67
SuccType_XXX68, #废弃68
SuccType_CompoundItemEx, #物品X的合成成功X次69
SuccType_EquipWash, #x件x阶x洗练等级 70
SuccType_XXX71, #废弃71
SuccType_XXX72, #废弃72
SuccType_XXX73, #废弃73
SuccType_XXX74, #废弃74
SuccType_XXX75, #废弃75
SuccType_XXX76, #废弃76
SuccType_XXX77, #废弃77
SuccType_DujieFBHelp, #渡劫护法成功X次 78
SuccType_DujieFBHelpPass, #渡劫助战成功X次 79
SuccType_XXX80, #废弃 80
SuccType_81, #x副本累计鼓舞X次 81
SuccType_EquipStar, #x件x阶x星 82
SuccType_XXX83, #废弃 83
SuccType_XXX84, #废弃 84
SuccType_XXX85, #废弃85
SuccType_XXX86, #废弃 86
SuccType_XXX87, #废弃 87
SuccType_XXX88, #废弃 88
SuccType_XXX89, #废弃 89
SuccType_XXX90, #废弃 90
SuccType_MWSkillUp, #X法宝潜力技能提升X级 91
SuccType_EquipSuit, # X件X阶套装 92
SuccType_TalkFamily, # 仙盟频道发言93
SuccType_UseItem, # 使用X物品X次94
SuccType_XXX95, # 废弃95
SuccType_XXX96, # 废弃96
SuccType_XXX97, # 废弃97
SuccType_XXX98, # 废弃98
SuccType_XXX99, # 废弃99
SuccType_100, # 100
SuccType_XXX101, # 废弃101
SuccType_XXX102, # 废弃102
SuccType_XXX103, # 废弃103
SuccType_XXX104, # 废弃104
SuccType_FMTFirst, # 获得封魔坛双倍奖励X次105
SuccType_XXX106, # 废弃106
SuccType_XXX107, # 废弃107
SuccType_XXX108, # 废弃108
SuccType_XXX109, # 废弃109
SuccType_XXX110, # 废弃110
SuccType_WingRefine, # 羽翼精炼X次111
SuccType_GetSpecialItem, # 获得特殊物品112
SuccType_XXX113, # 废弃113
SuccType_GetRealmPoint, # 获得多少修行点114
SuccType_AlchemyLV, # 炼丹炉等级115
SuccType_PickUpItem, # 拾取物品116
SuccType_VIPLV, # VIP等级117
SuccType_XMZZWinCnt, # 仙魔之争累积胜利场数118
SuccType_XMZZGetScore, # 仙盟之争累积获得积分119
SuccType_StoneTotalLV, #镶嵌宝石总等级120
SuccType_TowerSD, #符印塔扫荡X次121
SuccType_XXX122, # 废弃122
SuccType_XBXZ, # 仙宝寻主完成进度123
SuccType_CompoundEquip, # 合成X阶X颜色X星级以上装备124
SuccType_IceLode, #通关冰晶矿脉成就125
SuccType_RefineStoveColor, #炼制X品质丹药X枚126
SuccType_UseStoveBylv, #使用X品丹药X枚127
SuccType_QueenRelicsEx, #通关娲皇遗迹128
SuccType_DogzBattle, #x神兽出战129
SuccType_DogzEquipPlus, #出战神兽装备总强化X级130
SuccType_Collect, #采集X物品X次131
SuccType_InlayGatherSoul, #镶嵌X枚X品质聚魂(不包含核心)132
SuccType_GatherSoulLvUp, #累计聚魂总等级XX(不包含核心)133
SuccType_134, #节日红包 - 世界频道发言 x次 134
SuccType_135, # 节日红包 - 祈祷x次 135
SuccType_136, # 节日红包 - 击杀特定NPC x次 136
SuccType_137, # 节日红包 - 指定类型boss x次 137
SuccType_138, # 节日红包 - 进入指定地图 x次  138
SuccType_139, # 节日红包 - 完成x次日常环任务成就 139
SuccType_140, # 节日红包 - 天机摇骰子x次  140
SuccType_141, # 节日红包 - 跨服PK x次  141
SuccType_142, # 节日红包 - 副本扫荡 x次  142
SuccType_PassSkyTower, #通关天星塔 143
SuccType_Battlefield_Join, # 古神战场 - 参与 x次  144
SuccType_Battlefield_CallOpen, # 古神战场 - 召集开启 x次  145
SuccType_Battlefield_Called, # 古神战场 - 当被召集人 x次  146
SuccType_Battlefield_WinJ, # 古神战场 - 道家获胜 x次  147
SuccType_Battlefield_WinE, # 古神战场 - 佛家获胜 x次  148
SuccType_Battlefield_KillCnt, # 古神战场 - 击败玩家 x次  149
SuccType_Battlefield_CKillCnt, # 古神战场 - 连续击败y玩家 x次  150
SuccType_Battlefield_KillBoss, # 古神战场 - 阵营击败boss x次  151
SuccType_Battlefield_KillScoreKing, # 古神战场 - 不同场次击败积分王 x次  152
SuccType_Battlefield_KillGuard, # 古神战场 - 击败守卫  x次  153
SuccType_Battlefield_Score, # 古神战场 - 累计获得个人积分 xx  154
SuccType_Battlefield_ScoreMore, # 古神战场 - 单场个人积分超过yy积分 x次  155
SuccType_Battlefield_AuraScore, # 古神战场 - 累计在积分光环中获得积分 xx  156
SuccType_Battlefield_SuperItem, # 古神战场 - 累计获得古神大奖 x次  157
SuccType_Battlefield_FactionBuff, # 古神战场 - 累计采集阵营buff x次  158
SuccType_Battlefield_PersonBuff, # 古神战场 - 累计获得个人buff x次  159
SuccType_Battlefield_Crystal, # 古神战场 - 累计采集占领资源 x次  160
SuccType_Battlefield_Wall, # 古神战场 - 累计采集积分墙 x次  161
SuccType_Battlefield_BillFirst, # 古神战场 - 任意周榜榜首 x次  162
SuccType_Battlefield_BillIn, # 古神战场 - 结算时累计上榜 x次  163
SuccType_ActivityPlace, # 活跃放置x次 164
SuccType_UseStoveByType, # 使用丹药X枚 165
SuccType_Arena, # 参与竞技场x次 166
SuccType_KillCrossPenglaiBoss, # 击杀蓬莱仙境bossx只 167
SuccType_KillCrossDemonLandBoss, # 击杀魔化之地bossx只 168
SuccType_EquipPlusClass, # X阶装备强化总等级X级 169
SuccType_EquipStarClass, # X阶装备升星总等级X星 170
SuccType_EquipStoneClass, # X阶装备宝石总等级X级 171
SuccType_EquipWashClass, # X阶装备洗炼总等级X级 172
SuccType_EquipPlusTotal, # 全身强化总等级X级 173
SuccType_EquipStarTotal, # 全身升星总星数X星 174
SuccType_EquipWashTotal, # 全身洗炼总等级X级 175
SuccType_CrossPK, # 跨服PK x次  176
SuccType_FamilyZhenfaExp, # 仙盟阵法捐献累计经验 177
SuccType_PassAdventure, #通关冒险 178
SuccType_GatherTheSoulColor, #聚魂激活x品质x个 179
SuccType_GatherTheSoulLV, #聚魂总等级x 180
SuccType_MineAreaCnt, #采集福地x次数 181
SuccType_MineAreaSelfCnt, #采集自己福地x次数 182
SuccType_MineAreaRobCnt, #采集他人福地x次数 183
) = range(1, 184)
# 连续天规则的成就类型
ContinueSuccessTypeList = []
SuccType_MainLevel, # 通过主线关卡xxx 1
) = range(1, 1 + 1)
# 不向下适配检查的成就类型(指相对较高成就条件不会增加较低成就条件的进度)
UnDownCheckSuccessTypeList = [
                              SuccType_GodWeapon,
                              SuccType_MainTaskNode,SuccType_PassWagicWeapon,
                              SuccType_KillSpecificNPC, SuccType_UseStoveBylv, SuccType_UseStoveByType,
                              SuccType_Pray,SuccType_PetClassLV,
                              SuccType_QueenRelics,SuccType_XMZZConWin,
                              SuccType_Collect,SuccType_DogzBattle,
                              SuccType_GetSpecialItem,SuccType_GetMagicWeapon,SuccType_XBXZ,
                              ]
UnDownCheckSuccessTypeList = []
# 部分参数不向下适配检查的成就类型,此配置的类型不能在 UnDownCheckSuccessTypeList 里 {类型:[不向下适配的参数索引, ...], ...}
PartUnDownCheckSuccessTypeInfo = {
                                  SuccType_EquipSuit:[0], # 阶不向下适配
                                  SuccType_EquipPlace:[0,1], # 阶、部位不向下适配
                                  SuccType_EquipColorItem:[0], # 阶不向下适配
                                  SuccType_EquipPlus:[0], # 阶不向下适配
                                  SuccType_EquipWash:[0], # 阶不向下适配
                                  SuccType_EquipStar:[0], # 阶不向下适配
                                  SuccType_EquipPlusClass:[0], # 阶不向下适配
                                  SuccType_EquipStarClass:[0], # 阶不向下适配
                                  SuccType_EquipStoneClass:[0], # 阶不向下适配
                                  SuccType_EquipWashClass:[0], # 阶不向下适配
                                  SuccType_GatherTheSoulColor:[0], # 品质不向下适配
                                  }
PartUnDownCheckSuccessTypeInfo = {}
#传进来的条件满足配置的条件列表中的一个就行的成就类型
ContainSuccessTypeList = [SuccType_CompoundItemEx, SuccType_PickUpItem, SuccType_MWSkillUp]
ContainSuccessTypeList = []
#传进来的条件是配置条件的整数倍的成就类型
MultipleSuccessTypeList = [SuccType_ElderBattlefieldConKill, SuccType_Battlefield_CKillCnt]
MultipleSuccessTypeList = []
#增加进度前需要重置的成就类型
NeedResetSuccessTypeList = [
                            SuccType_InlayStone1,SuccType_InlayStone2,SuccType_InlayRune,
                            SuccType_DogzEquipPlus,
                            SuccType_PetClassLV,SuccType_InlayGatherSoul,
                            ]
#------------------------------------------------------------------------
# 聊天类型, 从100开始, 前100个给c++用
TalkTypeList = (