237 【福利内容】每日任务/每周任务/章节奖励-服务端(章节奖励英雄之路,成就系统)
| | |
| | |
|
| | | //成就表
|
| | |
|
| | | 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; //奖励物品列表
|
| | | };
|
| | |
|
| | | //通天令等级表
|
| | |
| | | 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
|
| | |
| | | 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,
|
| | |
| | | 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" # 本轮通天令开始时间戳
|
| | |
| | | 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
|
| | |
| | | PowerDownType_ResetTalent:'ResetTalent',
|
| | | PowerDownType_GatherSoul:'GatherSoul',
|
| | | }
|
| | |
|
| | | # CTG ID 定义
|
| | | Def_CTGID_SuccessPassport = 117 # 成就通行证
|
| | |
|
| | | # 通天令任务类型定义
|
| | | TTLTaskTypeList = (
|
| | |
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # 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):
|
| | |
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # 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):
|
| | |
| | | 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):
|
| | |
| | | _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
|
| | |
| | | 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):
|
| | |
| | | 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
|
| | |
| | | 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):
|
| | |
| | | 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
|
| | |
| | | self.Head.Clear()
|
| | | self.Head.Cmd = 0xA3
|
| | | self.Head.SubCmd = 0x40
|
| | | self.count = 0
|
| | | self.Count = 0
|
| | | self.SuccessInfoList = list()
|
| | | return
|
| | |
|
| | |
| | | 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
|
| | |
| | | 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
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | |
| | | 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):
|
| | |
| | | import ItemControler
|
| | | import IpyGameDataPY
|
| | | import ChConfig
|
| | | import PlayerSuccess
|
| | | import DataRecordPack
|
| | |
|
| | | import random
|
| | |
| | |
|
| | | # 通知合成成功
|
| | | 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("合成失败!")
|
| | |
| | | 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
|
| | |
| | | #"""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
|
| | |
|
| | |
|
| | |
| | | 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())
|
| | |
| | | ),
|
| | |
|
| | | "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":(
|
| | |
| | | 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(): |
| | |
| | | import ChPyNetSendPack
|
| | | import NetPackCommon
|
| | | import IpyGameDataPY
|
| | | import PlayerSuccess
|
| | | import PyGameData
|
| | | import NPCCommon
|
| | | import FBCommon
|
| | |
| | | # PickupItemSysNotify(curPlayer, isTeamNotify, itemMsgList, isEquip)
|
| | | #=======================================================================
|
| | |
|
| | | #成就
|
| | | PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_PickUpItem, curItemCount, [curItemID])
|
| | | |
| | | #物品已经被捡起, 把物品指针置为空
|
| | | mapItem.SetDropItem(None)
|
| | | #通知客户端, 人物捡起该物品, 以及回收物品的逻辑
|
| | |
| | | % (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)
|
| | |
| | | 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, {}]):
|
| | |
| | | #导入
|
| | | import BuffSkill
|
| | | import ItemCommon
|
| | | import PlayerSuccess
|
| | | import PlayerControl
|
| | | import ShareDefine
|
| | | import ChConfig
|
| | |
| | | import DataRecordPack
|
| | | import NetPackCommon
|
| | | import FBCommon
|
| | | import PlayerSuccess
|
| | | import PlayerPrestigeSys
|
| | | import GY_Query_BossFirstKill
|
| | | import FormulaControl
|
| | |
| | | #不是普通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):
|
| | |
| | | # 每日任务奖励
|
| | | 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)
|
| | |
| | | # 跨服妖魔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)
|
| | |
| | | import PlayerBillboard
|
| | | import GameServerRefresh
|
| | | import IPY_GameWorld
|
| | | import IPY_PlayerDefine
|
| | | import ChPyNetSendPack
|
| | | import NetPackCommon
|
| | | import DataRecordPack
|
| | |
| | | import PlayerCostRebate
|
| | | import PlayerActLunhuidian
|
| | | import GY_Query_CrossRealmReg
|
| | | import PlayerTongTianLing
|
| | | import FunctionNPCCommon
|
| | | import PlayerGoldInvest
|
| | | import CrossRealmPlayer
|
| | |
| | | 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)
|
| | |
| | | #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)
|
| | |
| | | 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):
|
| | | ## 获取主线关卡过关进度信息
|
| | |
| | | import PlayerWeekParty
|
| | | import IPY_GameWorld
|
| | | import ItemControler
|
| | | import PlayerSuccess
|
| | | import ItemCommon
|
| | | import GameWorld
|
| | | import ChConfig
|
| | |
| | | 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)
|
| | |
| | | import PassiveBuffEffMng
|
| | | import SkillCommon
|
| | | import SkillShell
|
| | | import PlayerSuccess
|
| | | import DataRecordPack
|
| | | import PlayerWeekParty
|
| | | import ItemControler
|
| | |
| | | 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
|
| | |
| | | # 技能属性,从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):
|
| | |
| | | import PlayerGoldGift
|
| | | import PlayerActivity
|
| | | import FBCommon
|
| | | import PlayerSuccess
|
| | | import PlayerFreeGoods
|
| | | import ChItem
|
| | | import GameLogic_Tianzi
|
| | |
| | |
|
| | | PlayerCoin.OnDay(curPlayer)
|
| | | PlayerTree.PlayerOnDay(curPlayer)
|
| | | #成就
|
| | | PlayerSuccess.SuccOnDay(curPlayer)
|
| | | #投资
|
| | | PlayerGoldInvest.OnDay(curPlayer)
|
| | | #战令
|
| | |
| | |
|
| | | #计算这一周的家族的活跃度
|
| | | CalcFamilyActiveValue(curPlayer)
|
| | | #成就Onweek
|
| | | PlayerSuccess.OnWeek(curPlayer)
|
| | |
|
| | | # 每周提示玩家提示vip等级加入贵宾俱乐部
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_HasVIPClubNote, 0)
|
| | |
| | |
|
| | | import GameWorld
|
| | | import ItemCommon
|
| | | import ShareDefine
|
| | | import PlayerControl
|
| | | import NetPackCommon
|
| | | import ChPyNetSendPack
|
| | | import IpyGameDataPY
|
| | | import PlayerSuccess
|
| | | import IPY_GameWorld
|
| | | import PyGameData
|
| | | import ChConfig
|
| | |
| | | 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
|
| | |
|
| | |
| | | import IPY_GameWorld
|
| | | import ChPyNetSendPack
|
| | | import NetPackCommon
|
| | | import PlayerSuccess
|
| | | import ShareDefine
|
| | | import SkillShell
|
| | | import DataRecordPack
|
| | |
| | | # 默认激活1级的类型
|
| | | for i in IpyGameDataPY.GetFuncEvalCfg('GodWeaponActive'):
|
| | | SetGodWeaponLV(curPlayer, i, 1)
|
| | | PlayerSuccess.UptateSuccessProgress(curPlayer, ShareDefine.SuccType_GodWeapon, 1, [i])
|
| | | Sync_GodWeaponLVInfo(curPlayer)
|
| | | return True
|
| | |
|
| | |
| | | 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')
|
| | |
| | | import GameFuncComm
|
| | | import IpyGameDataPY
|
| | | import CrossPlayerData
|
| | | import PlayerSuccess
|
| | | import PlayerActLunhuidian
|
| | | import PlayerActTask
|
| | | import PlayerPet
|
| | |
| | | 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)
|
| | | # 刷属性,更新排行榜
|
| | |
| | | import SkillShell
|
| | | import ItemControler
|
| | | import PlayerControl
|
| | | import PlayerSuccess
|
| | | import GameFuncComm
|
| | | import ShareDefine
|
| | | import SkillCommon
|
| | |
| | | # 开服活动数据
|
| | | 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)
|
| | |
| | | import ShareDefine
|
| | | import GameWorld
|
| | | import ChConfig
|
| | | import PlayerSuccess
|
| | | import PlayerBillboard
|
| | | import PlayerTongTianLing
|
| | | import PlayerTask
|
| | |
| | | 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)
|
| | | #更新排行榜
|
| | |
| | | import ChPyNetSendPack
|
| | | import NetPackCommon
|
| | | import IpyGameDataPY
|
| | | import PlayerSuccess
|
| | | import IPY_GameWorld
|
| | | import OpenServerCampaign
|
| | | import DataRecordPack
|
| | |
| | | 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):
|
| | |
| | | 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
|
| | |
| | | # -*- 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:
|
| | | # 二次延迟处理
|
| | |
| | |
|
| | | 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:
|
| | |
| | | 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
|
| | | |
| | | |
| | |
| | | import ShareDefine
|
| | | import ItemCommon
|
| | | import GameFuncComm
|
| | | import PlayerSuccess
|
| | | import ItemControler
|
| | | import ChEquip
|
| | |
|
| | | import random
|
| | |
| | | WingProgressUP(curWing, totalPoint, materialItemDict, curPlayer)
|
| | | ChEquip.RefreshPlayerLingQiEquipAttr(curPlayer)
|
| | | PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState()
|
| | | PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_WingRefine, 1)
|
| | | return
|
| | |
|
| | | def __WingCanJingLian(curWing):
|
| | |
| | | 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
|
| | |
| | | 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,
|
| | |
| | |
|
| | | # 成就类型定义
|
| | | 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 = (
|