From a3fbff8a36974ed768a55eadd353f3d3752f5699 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期二, 04 六月 2024 17:54:28 +0800 Subject: [PATCH] 10173 【主干】【香港】【越南】BOSS凭证(新增任务活动) --- ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py | 41 + ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActivity.py | 2 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py | 5 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py | 418 +++++++++++++++++++ ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py | 418 +++++++++++++++++++ ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActTask.py | 291 +++++++++++++ ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActLoginNew.py | 1 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py | 62 ++ ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py | 6 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py | 3 PySysDB/PySysDBPY.h | 24 + ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py | 5 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py | 4 PySysDB/PySysDBG.h | 17 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py | 16 15 files changed, 1,308 insertions(+), 5 deletions(-) diff --git a/PySysDB/PySysDBG.h b/PySysDB/PySysDBG.h index 69166de..071367f 100644 --- a/PySysDB/PySysDBG.h +++ b/PySysDB/PySysDBG.h @@ -953,6 +953,23 @@ WORD LVLimit; //限制等级 }; +//任务活动时间表 + +struct tagActTask +{ + DWORD _CfgID; //配置ID + list PlatformList; //活动平台列表["平台A", "平台A", ...],配[]代表所有 + list ServerGroupIDList; //服务器ID列表 + BYTE ActNum; //活动分组编号, 活动类型 * 10 + 不同界面编号 + char StartDate; //开启日期 + char EndDate; //结束日期 + dict NotifyInfoStart; //全服提示信息 - 相对开始时间 + dict NotifyInfoEnd; //全服提示信息 - 相对结束时间 + list NotifyInfoLoop; //全服提示信息 - 循环广播[间隔分钟, 广播key] + BYTE IsDayReset; //是否每天重置 + BYTE ResetType; //重置类型,0-0点重置;1-5点重置 +}; + //登录活动奖励时间表新 struct tagActLoginNew diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h index 1b46736..815c973 100644 --- a/PySysDB/PySysDBPY.h +++ b/PySysDB/PySysDBPY.h @@ -2354,6 +2354,30 @@ WORD Point; //积分 }; +//任务活动时间表 + +struct tagActTask +{ + DWORD _CfgID; //配置ID + char StartDate; //开启日期 + char EndDate; //结束日期 + WORD LVLimit; //限制等级 + BYTE IsDayReset; //是否每天重置 + BYTE ResetType; //重置类型,0-0点重置;1-5点重置 + BYTE TemplateID; //登录奖励模板编号 +}; + +//任务活动模板表 + +struct tagActTaskTemp +{ + BYTE _TemplateID; //模板ID + DWORD TaskID; //任务ID + BYTE TaskType; //任务类型 + DWORD NeedValue; //完成任务所需值 + list AwardItemList; //任务奖励列表[[物品ID,个数,是否拍品], ...] +}; + //登录活动奖励时间表新 struct tagActLoginNew diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py index 75209c9..446c1d7 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py @@ -33422,6 +33422,7 @@ _fields_ = [ ("Cmd", c_ubyte), ("SubCmd", c_ubyte), + ("ActNum", c_ubyte), # 活动编号 ("LoginAward", c_int), # 是否已领取,按天索引0代表第1天记录当天是否已领取 ] @@ -33439,6 +33440,7 @@ def Clear(self): self.Cmd = 0xAA self.SubCmd = 0x70 + self.ActNum = 0 self.LoginAward = 0 return @@ -33452,11 +33454,13 @@ DumpString = '''// AA 70 登录活动玩家信息新 //tagMCActLoginPlayerInfoNew: Cmd:%s, SubCmd:%s, + ActNum:%d, LoginAward:%d '''\ %( self.Cmd, self.SubCmd, + self.ActNum, self.LoginAward ) return DumpString @@ -34792,6 +34796,420 @@ #------------------------------------------------------ +# AA 71 任务活动信息 #tagMCActTaskInfo + +class tagMCActTaskItem(Structure): + _pack_ = 1 + _fields_ = [ + ("ItemID", c_int), + ("ItemCount", c_ushort), + ("IsBind", c_ubyte), + ] + + def __init__(self): + self.Clear() + return + + def ReadData(self, stringData, _pos=0, _len=0): + self.Clear() + memmove(addressof(self), stringData[_pos:], self.GetLength()) + return _pos + self.GetLength() + + def Clear(self): + self.ItemID = 0 + self.ItemCount = 0 + self.IsBind = 0 + return + + def GetLength(self): + return sizeof(tagMCActTaskItem) + + def GetBuffer(self): + return string_at(addressof(self), self.GetLength()) + + def OutputString(self): + DumpString = '''// AA 71 任务活动信息 //tagMCActTaskInfo: + ItemID:%d, + ItemCount:%d, + IsBind:%d + '''\ + %( + self.ItemID, + self.ItemCount, + self.IsBind + ) + return DumpString + + +class tagMCActTask(Structure): + TaskID = 0 #(DWORD TaskID)// 任务ID,1~n + TaskType = 0 #(BYTE TaskType)// 任务类型 + NeedValue = 0 #(DWORD NeedValue)// 完成任务所需值 + Count = 0 #(BYTE Count)// 奖励物品数 + AwardItemList = list() #(vector<tagMCActTaskItem> AwardItemList)// 奖励物品列表 + data = None + + def __init__(self): + self.Clear() + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + self.TaskID,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.TaskType,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.NeedValue,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos) + for i in range(self.Count): + temAwardItemList = tagMCActTaskItem() + _pos = temAwardItemList.ReadData(_lpData, _pos) + self.AwardItemList.append(temAwardItemList) + return _pos + + def Clear(self): + self.TaskID = 0 + self.TaskType = 0 + self.NeedValue = 0 + self.Count = 0 + self.AwardItemList = list() + return + + def GetLength(self): + length = 0 + length += 4 + length += 1 + length += 4 + length += 1 + for i in range(self.Count): + length += self.AwardItemList[i].GetLength() + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteDWORD(data, self.TaskID) + data = CommFunc.WriteBYTE(data, self.TaskType) + data = CommFunc.WriteDWORD(data, self.NeedValue) + data = CommFunc.WriteBYTE(data, self.Count) + for i in range(self.Count): + data = CommFunc.WriteString(data, self.AwardItemList[i].GetLength(), self.AwardItemList[i].GetBuffer()) + return data + + def OutputString(self): + DumpString = ''' + TaskID:%d, + TaskType:%d, + NeedValue:%d, + Count:%d, + AwardItemList:%s + '''\ + %( + self.TaskID, + self.TaskType, + self.NeedValue, + self.Count, + "..." + ) + return DumpString + + +class tagMCActTaskInfo(Structure): + Head = tagHead() + ActNum = 0 #(BYTE ActNum)// 活动编号 + StartDate = "" #(char StartDate[10])// 开始日期 y-m-d + EndtDate = "" #(char EndtDate[10])// 结束日期 y-m-d + IsDayReset = 0 #(BYTE IsDayReset)// 是否每天重置 + ResetType = 0 #(BYTE ResetType)// 重置类型,0-0点重置;1-5点重置 + LimitLV = 0 #(WORD LimitLV)// 限制等级 + TaskCount = 0 #(BYTE TaskCount) + TaskList = list() #(vector<tagMCActTask> TaskList)// 任务列表 + data = None + + def __init__(self): + self.Clear() + self.Head.Cmd = 0xAA + self.Head.SubCmd = 0x71 + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + _pos = self.Head.ReadData(_lpData, _pos) + self.ActNum,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.StartDate,_pos = CommFunc.ReadString(_lpData, _pos,10) + self.EndtDate,_pos = CommFunc.ReadString(_lpData, _pos,10) + self.IsDayReset,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.ResetType,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.LimitLV,_pos = CommFunc.ReadWORD(_lpData, _pos) + self.TaskCount,_pos = CommFunc.ReadBYTE(_lpData, _pos) + for i in range(self.TaskCount): + temTaskList = tagMCActTask() + _pos = temTaskList.ReadData(_lpData, _pos) + self.TaskList.append(temTaskList) + return _pos + + def Clear(self): + self.Head = tagHead() + self.Head.Clear() + self.Head.Cmd = 0xAA + self.Head.SubCmd = 0x71 + self.ActNum = 0 + self.StartDate = "" + self.EndtDate = "" + self.IsDayReset = 0 + self.ResetType = 0 + self.LimitLV = 0 + self.TaskCount = 0 + self.TaskList = list() + return + + def GetLength(self): + length = 0 + length += self.Head.GetLength() + length += 1 + length += 10 + length += 10 + length += 1 + length += 1 + length += 2 + length += 1 + for i in range(self.TaskCount): + length += self.TaskList[i].GetLength() + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer()) + data = CommFunc.WriteBYTE(data, self.ActNum) + data = CommFunc.WriteString(data, 10, self.StartDate) + data = CommFunc.WriteString(data, 10, self.EndtDate) + data = CommFunc.WriteBYTE(data, self.IsDayReset) + data = CommFunc.WriteBYTE(data, self.ResetType) + data = CommFunc.WriteWORD(data, self.LimitLV) + data = CommFunc.WriteBYTE(data, self.TaskCount) + for i in range(self.TaskCount): + data = CommFunc.WriteString(data, self.TaskList[i].GetLength(), self.TaskList[i].GetBuffer()) + return data + + def OutputString(self): + DumpString = ''' + Head:%s, + ActNum:%d, + StartDate:%s, + EndtDate:%s, + IsDayReset:%d, + ResetType:%d, + LimitLV:%d, + TaskCount:%d, + TaskList:%s + '''\ + %( + self.Head.OutputString(), + self.ActNum, + self.StartDate, + self.EndtDate, + self.IsDayReset, + self.ResetType, + self.LimitLV, + self.TaskCount, + "..." + ) + return DumpString + + +m_NAtagMCActTaskInfo=tagMCActTaskInfo() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCActTaskInfo.Head.Cmd,m_NAtagMCActTaskInfo.Head.SubCmd))] = m_NAtagMCActTaskInfo + + +#------------------------------------------------------ +# AA 73 任务活动玩家信息 #tagMCActTaskPlayerInfo + +class tagMCActTaskPlayerInfo(Structure): + Head = tagHead() + ActNum = 0 #(BYTE ActNum)// 活动编号 + AwardCount = 0 #(BYTE AwardCount) + AwardRecordList = list() #(vector<DWORD> AwardRecordList)// 任务ID领奖记录值列表,根据任务ID位判断是否已领取,一个记录值存31位 [记录值0, 记录值1, ...] + data = None + + def __init__(self): + self.Clear() + self.Head.Cmd = 0xAA + self.Head.SubCmd = 0x73 + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + _pos = self.Head.ReadData(_lpData, _pos) + self.ActNum,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.AwardCount,_pos = CommFunc.ReadBYTE(_lpData, _pos) + for i in range(self.AwardCount): + value,_pos=CommFunc.ReadDWORD(_lpData,_pos) + self.AwardRecordList.append(value) + return _pos + + def Clear(self): + self.Head = tagHead() + self.Head.Clear() + self.Head.Cmd = 0xAA + self.Head.SubCmd = 0x73 + self.ActNum = 0 + self.AwardCount = 0 + self.AwardRecordList = list() + return + + def GetLength(self): + length = 0 + length += self.Head.GetLength() + length += 1 + length += 1 + length += 4 * self.AwardCount + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer()) + data = CommFunc.WriteBYTE(data, self.ActNum) + data = CommFunc.WriteBYTE(data, self.AwardCount) + for i in range(self.AwardCount): + data = CommFunc.WriteDWORD(data, self.AwardRecordList[i]) + return data + + def OutputString(self): + DumpString = ''' + Head:%s, + ActNum:%d, + AwardCount:%d, + AwardRecordList:%s + '''\ + %( + self.Head.OutputString(), + self.ActNum, + self.AwardCount, + "..." + ) + return DumpString + + +m_NAtagMCActTaskPlayerInfo=tagMCActTaskPlayerInfo() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCActTaskPlayerInfo.Head.Cmd,m_NAtagMCActTaskPlayerInfo.Head.SubCmd))] = m_NAtagMCActTaskPlayerInfo + + +#------------------------------------------------------ +# AA 72 任务活动玩家任务值 #tagMCActTaskPlayerValueInfo + +class tagMCActTaskPlayerValue(Structure): + _pack_ = 1 + _fields_ = [ + ("TaskType", c_ubyte), # 任务类型 + ("TaskValue", c_int), # 当前任务值,所有相同任务类型共享该进度值 + ] + + def __init__(self): + self.Clear() + return + + def ReadData(self, stringData, _pos=0, _len=0): + self.Clear() + memmove(addressof(self), stringData[_pos:], self.GetLength()) + return _pos + self.GetLength() + + def Clear(self): + self.TaskType = 0 + self.TaskValue = 0 + return + + def GetLength(self): + return sizeof(tagMCActTaskPlayerValue) + + def GetBuffer(self): + return string_at(addressof(self), self.GetLength()) + + def OutputString(self): + DumpString = '''// AA 72 任务活动玩家任务值 //tagMCActTaskPlayerValueInfo: + TaskType:%d, + TaskValue:%d + '''\ + %( + self.TaskType, + self.TaskValue + ) + return DumpString + + +class tagMCActTaskPlayerValueInfo(Structure): + Head = tagHead() + ActNum = 0 #(BYTE ActNum)// 活动编号 + TaskCount = 0 #(BYTE TaskCount) + TaskValueList = list() #(vector<tagMCActTaskPlayerValue> TaskValueList)// 有同步的任务类型直接覆盖即可 + data = None + + def __init__(self): + self.Clear() + self.Head.Cmd = 0xAA + self.Head.SubCmd = 0x72 + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + _pos = self.Head.ReadData(_lpData, _pos) + self.ActNum,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.TaskCount,_pos = CommFunc.ReadBYTE(_lpData, _pos) + for i in range(self.TaskCount): + temTaskValueList = tagMCActTaskPlayerValue() + _pos = temTaskValueList.ReadData(_lpData, _pos) + self.TaskValueList.append(temTaskValueList) + return _pos + + def Clear(self): + self.Head = tagHead() + self.Head.Clear() + self.Head.Cmd = 0xAA + self.Head.SubCmd = 0x72 + self.ActNum = 0 + self.TaskCount = 0 + self.TaskValueList = list() + return + + def GetLength(self): + length = 0 + length += self.Head.GetLength() + length += 1 + length += 1 + for i in range(self.TaskCount): + length += self.TaskValueList[i].GetLength() + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer()) + data = CommFunc.WriteBYTE(data, self.ActNum) + data = CommFunc.WriteBYTE(data, self.TaskCount) + for i in range(self.TaskCount): + data = CommFunc.WriteString(data, self.TaskValueList[i].GetLength(), self.TaskValueList[i].GetBuffer()) + return data + + def OutputString(self): + DumpString = ''' + Head:%s, + ActNum:%d, + TaskCount:%d, + TaskValueList:%s + '''\ + %( + self.Head.OutputString(), + self.ActNum, + self.TaskCount, + "..." + ) + return DumpString + + +m_NAtagMCActTaskPlayerValueInfo=tagMCActTaskPlayerValueInfo() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCActTaskPlayerValueInfo.Head.Cmd,m_NAtagMCActTaskPlayerValueInfo.Head.SubCmd))] = m_NAtagMCActTaskPlayerValueInfo + + +#------------------------------------------------------ # AA 1D 累计充值活动信息 #tagMCActTotalRechargeInfo class tagMCTotalRechargeAwardItem(Structure): diff --git a/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py b/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py index a536941..d1e23b0 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py @@ -773,6 +773,20 @@ ("WORD", "LVLimit", 0), ), + "ActTask":( + ("DWORD", "CfgID", 1), + ("list", "PlatformList", 0), + ("list", "ServerGroupIDList", 0), + ("BYTE", "ActNum", 0), + ("char", "StartDate", 0), + ("char", "EndDate", 0), + ("dict", "NotifyInfoStart", 0), + ("dict", "NotifyInfoEnd", 0), + ("list", "NotifyInfoLoop", 0), + ("BYTE", "IsDayReset", 0), + ("BYTE", "ResetType", 0), + ), + "ActLoginNew":( ("DWORD", "CfgID", 1), ("list", "PlatformList", 0), @@ -2057,6 +2071,25 @@ def GetNotifyInfoEnd(self): return self.attrTuple[10] # 全服提示信息 - 相对结束时间 dict def GetLVLimit(self): return self.attrTuple[11] # 限制等级 WORD +# 任务活动时间表 +class IPY_ActTask(): + + def __init__(self): + self.attrTuple = None + return + + def GetCfgID(self): return self.attrTuple[0] # 配置ID DWORD + def GetPlatformList(self): return self.attrTuple[1] # 活动平台列表["平台A", "平台A", ...],配[]代表所有 list + def GetServerGroupIDList(self): return self.attrTuple[2] # 服务器ID列表 list + def GetActNum(self): return self.attrTuple[3] # 活动分组编号, 活动类型 * 10 + 不同界面编号 BYTE + def GetStartDate(self): return self.attrTuple[4] # 开启日期 char + def GetEndDate(self): return self.attrTuple[5] # 结束日期 char + def GetNotifyInfoStart(self): return self.attrTuple[6] # 全服提示信息 - 相对开始时间 dict + def GetNotifyInfoEnd(self): return self.attrTuple[7] # 全服提示信息 - 相对结束时间 dict + def GetNotifyInfoLoop(self): return self.attrTuple[8] # 全服提示信息 - 循环广播[间隔分钟, 广播key] list + def GetIsDayReset(self): return self.attrTuple[9] # 是否每天重置 BYTE + def GetResetType(self): return self.attrTuple[10] # 重置类型,0-0点重置;1-5点重置 BYTE + # 登录活动奖励时间表新 class IPY_ActLoginNew(): @@ -2460,6 +2493,7 @@ self.__LoadFileData("CrossDemonLandZoneMap", onlyCheck) self.__LoadFileData("CrossFamilyFlagwarZoneMap", onlyCheck) self.__LoadFileData("ActWeekParty", onlyCheck) + self.__LoadFileData("ActTask", onlyCheck) self.__LoadFileData("ActLoginNew", onlyCheck) self.__LoadFileData("ActLoginAward", onlyCheck) self.__LoadFileData("ActFeastWeekParty", onlyCheck) @@ -3180,6 +3214,13 @@ self.CheckLoadData("ActWeekParty") return self.ipyActWeekPartyCache[index] + def GetActTaskCount(self): + self.CheckLoadData("ActTask") + return self.ipyActTaskLen + def GetActTaskByIndex(self, index): + self.CheckLoadData("ActTask") + return self.ipyActTaskCache[index] + def GetActLoginNewCount(self): self.CheckLoadData("ActLoginNew") return self.ipyActLoginNewLen diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py index c5cca1b..f68899c 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py @@ -288,6 +288,7 @@ OperationActionName_BuyOne = "ActBuyOne" # 买一送多活动 OperationActionName_BossTrial = "ActBossTrial" # Boss历练 OperationActionName_ActLoginNew = "ActLoginNew" # 登录活动-新 +OperationActionName_ActTask = "ActTask" # 活动任务 #节日活动类型列表 - 该类型无视开服天,日期到了就开启 FeastOperationActionNameList = [OperationActionName_FeastWeekParty, OperationActionName_FeastRedPacket, OperationActionName_RechargeRebateGold, OperationActionName_GrowupBuy, @@ -308,7 +309,7 @@ OperationActionName_Turntable, OperationActionName_HorsePetFeast, OperationActionName_GarbageSorting, OperationActionName_XianXiaMJ, OperationActionName_GodGift, OperationActionName_BuyOne, OperationActionName_BossTrial, - OperationActionName_ActLoginNew, + OperationActionName_ActLoginNew, OperationActionName_ActTask, ] + FeastOperationActionNameList #需要记录开启活动时的世界等级的运营活动 NeedWorldLVOperationActNameList = [OperationActionName_FairyCeremony, OperationActionName_WishingWell, @@ -333,7 +334,7 @@ OperationActionName_Turntable, OperationActionName_HorsePetFeast, OperationActionName_GarbageSorting, OperationActionName_XianXiaMJ, OperationActionName_GodGift, OperationActionName_BuyOne, OperationActionName_BossTrial, - OperationActionName_ActLoginNew, + OperationActionName_ActLoginNew, OperationActionName_ActTask, ] #跨服运营活动表名定义 diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py index 3cadf05..9eef693 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py @@ -4076,6 +4076,12 @@ #登录活动新 Def_PDict_ActLoginNewID = "ActLoginNewID_%s" # 玩家身上的活动ID,唯一标识,取活动开始日期time值,参数:(活动编号) Def_PDict_ActLoginNewAward = "ActLoginNewAward_%s" # 登录活动奖励记录,按位记录登录天是否已领取,参数:(活动编号) + +#任务活动 +Def_PDict_ActTaskID = "ActTaskID_%s" # 玩家身上的活动ID,唯一标识,取活动开始日期time值,参数:(活动编号) +Def_PDict_ActTaskTempID = "ActTaskTempID_%s" # 任务活动模板ID,参数:(活动编号) +Def_PDict_ActTaskValue = "ActTaskValue_%s_%s" # 任务活动当前任务进度值,参数:(活动编号, 任务类型) +Def_PDict_ActTaskAward = "ActTaskAward_%s_%s" # 任务活动奖励记录,按位记录任务ID是否已领取,参数:(活动编号,key编号) #------------------------------------------------------------------------------- #开服活动,Def_PDictType_OpenServerCampaign @@ -5849,7 +5855,8 @@ Def_RewardType_RealmLVUpTask, #境界渡劫任务条件奖励 68 Def_RewardType_MineTreasure, #福地聚宝盆奖励 69 Def_RewardType_ActLoginAwardNew, # 领取登录活动奖励70 -)= range(71) +Def_RewardType_ActTask, # 领取任务活动奖励71 +)= range(72) #boss复活相关活动定义 BossRebornActIDList = ( @@ -5993,6 +6000,13 @@ Def_GarbageTask_CTG, # 充值仙玉 13 ) = range(1, 1 + 13) +#任务活动 - 任务类型 +ActTaskTypeList = ( +ActTaskType_WorldBoss, # 击杀世界boss 1 +ActTaskType_BossHome, # 击杀boss之家 2 +ActTaskType_Activity, # 累计获得活跃度 3 +) = range(1, 1 + 3) + # 套装枚举,普通套装,强化套装 (EquipSuitType_Normal, EquipSuitType_Plus, diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py index 75209c9..446c1d7 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py @@ -33422,6 +33422,7 @@ _fields_ = [ ("Cmd", c_ubyte), ("SubCmd", c_ubyte), + ("ActNum", c_ubyte), # 活动编号 ("LoginAward", c_int), # 是否已领取,按天索引0代表第1天记录当天是否已领取 ] @@ -33439,6 +33440,7 @@ def Clear(self): self.Cmd = 0xAA self.SubCmd = 0x70 + self.ActNum = 0 self.LoginAward = 0 return @@ -33452,11 +33454,13 @@ DumpString = '''// AA 70 登录活动玩家信息新 //tagMCActLoginPlayerInfoNew: Cmd:%s, SubCmd:%s, + ActNum:%d, LoginAward:%d '''\ %( self.Cmd, self.SubCmd, + self.ActNum, self.LoginAward ) return DumpString @@ -34792,6 +34796,420 @@ #------------------------------------------------------ +# AA 71 任务活动信息 #tagMCActTaskInfo + +class tagMCActTaskItem(Structure): + _pack_ = 1 + _fields_ = [ + ("ItemID", c_int), + ("ItemCount", c_ushort), + ("IsBind", c_ubyte), + ] + + def __init__(self): + self.Clear() + return + + def ReadData(self, stringData, _pos=0, _len=0): + self.Clear() + memmove(addressof(self), stringData[_pos:], self.GetLength()) + return _pos + self.GetLength() + + def Clear(self): + self.ItemID = 0 + self.ItemCount = 0 + self.IsBind = 0 + return + + def GetLength(self): + return sizeof(tagMCActTaskItem) + + def GetBuffer(self): + return string_at(addressof(self), self.GetLength()) + + def OutputString(self): + DumpString = '''// AA 71 任务活动信息 //tagMCActTaskInfo: + ItemID:%d, + ItemCount:%d, + IsBind:%d + '''\ + %( + self.ItemID, + self.ItemCount, + self.IsBind + ) + return DumpString + + +class tagMCActTask(Structure): + TaskID = 0 #(DWORD TaskID)// 任务ID,1~n + TaskType = 0 #(BYTE TaskType)// 任务类型 + NeedValue = 0 #(DWORD NeedValue)// 完成任务所需值 + Count = 0 #(BYTE Count)// 奖励物品数 + AwardItemList = list() #(vector<tagMCActTaskItem> AwardItemList)// 奖励物品列表 + data = None + + def __init__(self): + self.Clear() + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + self.TaskID,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.TaskType,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.NeedValue,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos) + for i in range(self.Count): + temAwardItemList = tagMCActTaskItem() + _pos = temAwardItemList.ReadData(_lpData, _pos) + self.AwardItemList.append(temAwardItemList) + return _pos + + def Clear(self): + self.TaskID = 0 + self.TaskType = 0 + self.NeedValue = 0 + self.Count = 0 + self.AwardItemList = list() + return + + def GetLength(self): + length = 0 + length += 4 + length += 1 + length += 4 + length += 1 + for i in range(self.Count): + length += self.AwardItemList[i].GetLength() + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteDWORD(data, self.TaskID) + data = CommFunc.WriteBYTE(data, self.TaskType) + data = CommFunc.WriteDWORD(data, self.NeedValue) + data = CommFunc.WriteBYTE(data, self.Count) + for i in range(self.Count): + data = CommFunc.WriteString(data, self.AwardItemList[i].GetLength(), self.AwardItemList[i].GetBuffer()) + return data + + def OutputString(self): + DumpString = ''' + TaskID:%d, + TaskType:%d, + NeedValue:%d, + Count:%d, + AwardItemList:%s + '''\ + %( + self.TaskID, + self.TaskType, + self.NeedValue, + self.Count, + "..." + ) + return DumpString + + +class tagMCActTaskInfo(Structure): + Head = tagHead() + ActNum = 0 #(BYTE ActNum)// 活动编号 + StartDate = "" #(char StartDate[10])// 开始日期 y-m-d + EndtDate = "" #(char EndtDate[10])// 结束日期 y-m-d + IsDayReset = 0 #(BYTE IsDayReset)// 是否每天重置 + ResetType = 0 #(BYTE ResetType)// 重置类型,0-0点重置;1-5点重置 + LimitLV = 0 #(WORD LimitLV)// 限制等级 + TaskCount = 0 #(BYTE TaskCount) + TaskList = list() #(vector<tagMCActTask> TaskList)// 任务列表 + data = None + + def __init__(self): + self.Clear() + self.Head.Cmd = 0xAA + self.Head.SubCmd = 0x71 + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + _pos = self.Head.ReadData(_lpData, _pos) + self.ActNum,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.StartDate,_pos = CommFunc.ReadString(_lpData, _pos,10) + self.EndtDate,_pos = CommFunc.ReadString(_lpData, _pos,10) + self.IsDayReset,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.ResetType,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.LimitLV,_pos = CommFunc.ReadWORD(_lpData, _pos) + self.TaskCount,_pos = CommFunc.ReadBYTE(_lpData, _pos) + for i in range(self.TaskCount): + temTaskList = tagMCActTask() + _pos = temTaskList.ReadData(_lpData, _pos) + self.TaskList.append(temTaskList) + return _pos + + def Clear(self): + self.Head = tagHead() + self.Head.Clear() + self.Head.Cmd = 0xAA + self.Head.SubCmd = 0x71 + self.ActNum = 0 + self.StartDate = "" + self.EndtDate = "" + self.IsDayReset = 0 + self.ResetType = 0 + self.LimitLV = 0 + self.TaskCount = 0 + self.TaskList = list() + return + + def GetLength(self): + length = 0 + length += self.Head.GetLength() + length += 1 + length += 10 + length += 10 + length += 1 + length += 1 + length += 2 + length += 1 + for i in range(self.TaskCount): + length += self.TaskList[i].GetLength() + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer()) + data = CommFunc.WriteBYTE(data, self.ActNum) + data = CommFunc.WriteString(data, 10, self.StartDate) + data = CommFunc.WriteString(data, 10, self.EndtDate) + data = CommFunc.WriteBYTE(data, self.IsDayReset) + data = CommFunc.WriteBYTE(data, self.ResetType) + data = CommFunc.WriteWORD(data, self.LimitLV) + data = CommFunc.WriteBYTE(data, self.TaskCount) + for i in range(self.TaskCount): + data = CommFunc.WriteString(data, self.TaskList[i].GetLength(), self.TaskList[i].GetBuffer()) + return data + + def OutputString(self): + DumpString = ''' + Head:%s, + ActNum:%d, + StartDate:%s, + EndtDate:%s, + IsDayReset:%d, + ResetType:%d, + LimitLV:%d, + TaskCount:%d, + TaskList:%s + '''\ + %( + self.Head.OutputString(), + self.ActNum, + self.StartDate, + self.EndtDate, + self.IsDayReset, + self.ResetType, + self.LimitLV, + self.TaskCount, + "..." + ) + return DumpString + + +m_NAtagMCActTaskInfo=tagMCActTaskInfo() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCActTaskInfo.Head.Cmd,m_NAtagMCActTaskInfo.Head.SubCmd))] = m_NAtagMCActTaskInfo + + +#------------------------------------------------------ +# AA 73 任务活动玩家信息 #tagMCActTaskPlayerInfo + +class tagMCActTaskPlayerInfo(Structure): + Head = tagHead() + ActNum = 0 #(BYTE ActNum)// 活动编号 + AwardCount = 0 #(BYTE AwardCount) + AwardRecordList = list() #(vector<DWORD> AwardRecordList)// 任务ID领奖记录值列表,根据任务ID位判断是否已领取,一个记录值存31位 [记录值0, 记录值1, ...] + data = None + + def __init__(self): + self.Clear() + self.Head.Cmd = 0xAA + self.Head.SubCmd = 0x73 + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + _pos = self.Head.ReadData(_lpData, _pos) + self.ActNum,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.AwardCount,_pos = CommFunc.ReadBYTE(_lpData, _pos) + for i in range(self.AwardCount): + value,_pos=CommFunc.ReadDWORD(_lpData,_pos) + self.AwardRecordList.append(value) + return _pos + + def Clear(self): + self.Head = tagHead() + self.Head.Clear() + self.Head.Cmd = 0xAA + self.Head.SubCmd = 0x73 + self.ActNum = 0 + self.AwardCount = 0 + self.AwardRecordList = list() + return + + def GetLength(self): + length = 0 + length += self.Head.GetLength() + length += 1 + length += 1 + length += 4 * self.AwardCount + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer()) + data = CommFunc.WriteBYTE(data, self.ActNum) + data = CommFunc.WriteBYTE(data, self.AwardCount) + for i in range(self.AwardCount): + data = CommFunc.WriteDWORD(data, self.AwardRecordList[i]) + return data + + def OutputString(self): + DumpString = ''' + Head:%s, + ActNum:%d, + AwardCount:%d, + AwardRecordList:%s + '''\ + %( + self.Head.OutputString(), + self.ActNum, + self.AwardCount, + "..." + ) + return DumpString + + +m_NAtagMCActTaskPlayerInfo=tagMCActTaskPlayerInfo() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCActTaskPlayerInfo.Head.Cmd,m_NAtagMCActTaskPlayerInfo.Head.SubCmd))] = m_NAtagMCActTaskPlayerInfo + + +#------------------------------------------------------ +# AA 72 任务活动玩家任务值 #tagMCActTaskPlayerValueInfo + +class tagMCActTaskPlayerValue(Structure): + _pack_ = 1 + _fields_ = [ + ("TaskType", c_ubyte), # 任务类型 + ("TaskValue", c_int), # 当前任务值,所有相同任务类型共享该进度值 + ] + + def __init__(self): + self.Clear() + return + + def ReadData(self, stringData, _pos=0, _len=0): + self.Clear() + memmove(addressof(self), stringData[_pos:], self.GetLength()) + return _pos + self.GetLength() + + def Clear(self): + self.TaskType = 0 + self.TaskValue = 0 + return + + def GetLength(self): + return sizeof(tagMCActTaskPlayerValue) + + def GetBuffer(self): + return string_at(addressof(self), self.GetLength()) + + def OutputString(self): + DumpString = '''// AA 72 任务活动玩家任务值 //tagMCActTaskPlayerValueInfo: + TaskType:%d, + TaskValue:%d + '''\ + %( + self.TaskType, + self.TaskValue + ) + return DumpString + + +class tagMCActTaskPlayerValueInfo(Structure): + Head = tagHead() + ActNum = 0 #(BYTE ActNum)// 活动编号 + TaskCount = 0 #(BYTE TaskCount) + TaskValueList = list() #(vector<tagMCActTaskPlayerValue> TaskValueList)// 有同步的任务类型直接覆盖即可 + data = None + + def __init__(self): + self.Clear() + self.Head.Cmd = 0xAA + self.Head.SubCmd = 0x72 + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + _pos = self.Head.ReadData(_lpData, _pos) + self.ActNum,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.TaskCount,_pos = CommFunc.ReadBYTE(_lpData, _pos) + for i in range(self.TaskCount): + temTaskValueList = tagMCActTaskPlayerValue() + _pos = temTaskValueList.ReadData(_lpData, _pos) + self.TaskValueList.append(temTaskValueList) + return _pos + + def Clear(self): + self.Head = tagHead() + self.Head.Clear() + self.Head.Cmd = 0xAA + self.Head.SubCmd = 0x72 + self.ActNum = 0 + self.TaskCount = 0 + self.TaskValueList = list() + return + + def GetLength(self): + length = 0 + length += self.Head.GetLength() + length += 1 + length += 1 + for i in range(self.TaskCount): + length += self.TaskValueList[i].GetLength() + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer()) + data = CommFunc.WriteBYTE(data, self.ActNum) + data = CommFunc.WriteBYTE(data, self.TaskCount) + for i in range(self.TaskCount): + data = CommFunc.WriteString(data, self.TaskValueList[i].GetLength(), self.TaskValueList[i].GetBuffer()) + return data + + def OutputString(self): + DumpString = ''' + Head:%s, + ActNum:%d, + TaskCount:%d, + TaskValueList:%s + '''\ + %( + self.Head.OutputString(), + self.ActNum, + self.TaskCount, + "..." + ) + return DumpString + + +m_NAtagMCActTaskPlayerValueInfo=tagMCActTaskPlayerValueInfo() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCActTaskPlayerValueInfo.Head.Cmd,m_NAtagMCActTaskPlayerValueInfo.Head.SubCmd))] = m_NAtagMCActTaskPlayerValueInfo + + +#------------------------------------------------------ # AA 1D 累计充值活动信息 #tagMCActTotalRechargeInfo class tagMCTotalRechargeAwardItem(Structure): diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py index 4c8f02a..5cd30be 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py @@ -1838,6 +1838,24 @@ ("WORD", "Point", 0), ), + "ActTask":( + ("DWORD", "CfgID", 1), + ("char", "StartDate", 0), + ("char", "EndDate", 0), + ("WORD", "LVLimit", 0), + ("BYTE", "IsDayReset", 0), + ("BYTE", "ResetType", 0), + ("BYTE", "TemplateID", 0), + ), + + "ActTaskTemp":( + ("BYTE", "TemplateID", 1), + ("DWORD", "TaskID", 0), + ("BYTE", "TaskType", 0), + ("DWORD", "NeedValue", 0), + ("list", "AwardItemList", 0), + ), + "ActLoginNew":( ("DWORD", "CfgID", 1), ("char", "StartDate", 0), @@ -4941,6 +4959,34 @@ def GetReward(self): return self.attrTuple[4] # 奖励物品 list def GetPoint(self): return self.attrTuple[5] # 积分 WORD +# 任务活动时间表 +class IPY_ActTask(): + + def __init__(self): + self.attrTuple = None + return + + def GetCfgID(self): return self.attrTuple[0] # 配置ID DWORD + def GetStartDate(self): return self.attrTuple[1] # 开启日期 char + def GetEndDate(self): return self.attrTuple[2] # 结束日期 char + def GetLVLimit(self): return self.attrTuple[3] # 限制等级 WORD + def GetIsDayReset(self): return self.attrTuple[4] # 是否每天重置 BYTE + def GetResetType(self): return self.attrTuple[5] # 重置类型,0-0点重置;1-5点重置 BYTE + def GetTemplateID(self): return self.attrTuple[6] # 登录奖励模板编号 BYTE + +# 任务活动模板表 +class IPY_ActTaskTemp(): + + def __init__(self): + self.attrTuple = None + return + + def GetTemplateID(self): return self.attrTuple[0] # 模板ID BYTE + def GetTaskID(self): return self.attrTuple[1] # 任务ID DWORD + def GetTaskType(self): return self.attrTuple[2] # 任务类型 BYTE + def GetNeedValue(self): return self.attrTuple[3] # 完成任务所需值 DWORD + def GetAwardItemList(self): return self.attrTuple[4] # 任务奖励列表[[物品ID,个数,是否拍品], ...] list + # 登录活动奖励时间表新 class IPY_ActLoginNew(): @@ -5826,6 +5872,8 @@ self.__LoadFileData("CoatChestUp", onlyCheck) self.__LoadFileData("ActWeekParty", onlyCheck) self.__LoadFileData("WeekParty", onlyCheck) + self.__LoadFileData("ActTask", onlyCheck) + self.__LoadFileData("ActTaskTemp", onlyCheck) self.__LoadFileData("ActLoginNew", onlyCheck) self.__LoadFileData("ActLoginNewAward", onlyCheck) self.__LoadFileData("ActLoginAward", onlyCheck) @@ -7334,6 +7382,20 @@ self.CheckLoadData("WeekParty") return self.ipyWeekPartyCache[index] + def GetActTaskCount(self): + self.CheckLoadData("ActTask") + return self.ipyActTaskLen + def GetActTaskByIndex(self, index): + self.CheckLoadData("ActTask") + return self.ipyActTaskCache[index] + + def GetActTaskTempCount(self): + self.CheckLoadData("ActTaskTemp") + return self.ipyActTaskTempLen + def GetActTaskTempByIndex(self, index): + self.CheckLoadData("ActTaskTemp") + return self.ipyActTaskTempCache[index] + def GetActLoginNewCount(self): self.CheckLoadData("ActLoginNew") return self.ipyActLoginNewLen diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py index 8542c3c..8369d7f 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py @@ -65,6 +65,7 @@ import NPCRealmRefresh import NPCHurtManager import PlayerActLogin +import PlayerActTask import FamilyRobBoss import IpyGameDataPY import PlayerGubao @@ -2574,6 +2575,7 @@ PlayerWeekParty.AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_WorldBOSS, 1) PlayerFeastTravel.AddFeastTravelTaskValue(curPlayer, ChConfig.Def_FeastTravel_WorldBoss, 1) PlayerActLogin.AddLoginAwardActionCnt(curPlayer, ChConfig.Def_LoginAct_WorldBOSS, 1) + PlayerActTask.AddActTaskValue(curPlayer, ChConfig.ActTaskType_WorldBoss, 1) PlayerTongTianLing.AddTongTianTaskValue(curPlayer, ChConfig.TTLTaskType_WorldBoss, 1) elif limitIndex == ShareDefine.Def_Boss_Func_Home: @@ -2588,6 +2590,7 @@ PlayerNewFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_BossHome, 1) PlayerWeekParty.AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_BOSSHome, 1) PlayerFeastTravel.AddFeastTravelTaskValue(curPlayer, ChConfig.Def_FeastTravel_BossHome, 1) + PlayerActTask.AddActTaskValue(curPlayer, ChConfig.ActTaskType_BossHome, 1) if mapID == ChConfig.Def_FBMapID_CrossPenglai: #跨服蓬莱仙境 diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py index 3f49413..7ce2d86 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py @@ -157,6 +157,7 @@ import GameObj import PlayerChangeJob import PlayerActLoginNew +import PlayerActTask import datetime import time @@ -860,6 +861,8 @@ PlayerActHorsePetFeast.OnLogin(curPlayer) # 周狂欢活动 PlayerWeekParty.OnLogin(curPlayer) + # 任务活动 + PlayerActTask.OnPlayerLogin(curPlayer) # 登录活动 PlayerActLoginNew.OnPlayerLogin(curPlayer) # 节日巡礼活动 @@ -5665,6 +5668,9 @@ # 领取登录活动奖励 elif rewardType == ChConfig.Def_RewardType_ActLoginAwardNew: PlayerActLoginNew.OnGetActLoginAward(curPlayer, dataEx, dataExStr) + # 领取任务活动奖励 + elif rewardType == ChConfig.Def_RewardType_ActTask: + PlayerActTask.OnGetActTaskAward(curPlayer, dataEx, dataExStr) # 领取跨服充值排行活动达标奖励 elif rewardType == ChConfig.Def_RewardType_CACTGBillboardDabiao: CrossActCTGBillboard.GetDabiaoAward(curPlayer, dataEx) diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActLoginNew.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActLoginNew.py index f230a77..56d75f7 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActLoginNew.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActLoginNew.py @@ -145,6 +145,7 @@ def Sync_ActLoginPlayerInfo(curPlayer, actNum): ## 通知活动玩家信息 clientPack = ChPyNetSendPack.tagMCActLoginPlayerInfoNew() + clientPack.ActNum = actNum clientPack.LoginAward = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ActLoginNewAward % actNum) NetPackCommon.SendFakePack(curPlayer, clientPack) return diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActTask.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActTask.py new file mode 100644 index 0000000..7599b0b --- /dev/null +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActTask.py @@ -0,0 +1,291 @@ +#!/usr/bin/python +# -*- coding: GBK -*- +#------------------------------------------------------------------------------- +# +##@package Player.PlayerActTask +# +# @todo:活动任务 +# @author hxp +# @date 2024-06-04 +# @version 1.0 +# +# 详细描述: 活动任务 +# +#------------------------------------------------------------------------------- +#"""Version = 2024-06-04 18:00""" +#------------------------------------------------------------------------------- + +import PyGameData +import ShareDefine +import PlayerControl +import IpyGameDataPY +import ChPyNetSendPack +import ItemControler +import IPY_GameWorld +import NetPackCommon +import GameWorld +import ChConfig + +def OnPlayerLogin(curPlayer): + + for actInfo in PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_ActTask, {}).values(): + actNum = actInfo.get(ShareDefine.ActKey_ActNum, 0) + isReset = __CheckPlayerActTaskAction(curPlayer, actNum) + # 活动中同步活动信息 + if not isReset and actInfo.get(ShareDefine.ActKey_State): + Sync_ActTaskActionInfo(curPlayer, actNum) + Sync_ActTaskPlayerValueInfo(curPlayer, actNum) + Sync_ActTaskPlayerInfo(curPlayer, actNum) + + return + +def RefreshActTaskActionInfo(actNum): + ## 收到GameServer同步的活动信息,刷新活动信息 + playerManager = GameWorld.GetPlayerManager() + for index in xrange(playerManager.GetPlayerCount()): + curPlayer = playerManager.GetPlayerByIndex(index) + if curPlayer.GetID() == 0: + continue + __CheckPlayerActTaskAction(curPlayer, actNum) + return + +def __CheckPlayerActTaskAction(curPlayer, actNum): + ## 检查玩活动数据信息 + + playerID = curPlayer.GetPlayerID() + + actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_ActTask, actNum) + actID = actInfo.get(ShareDefine.ActKey_ID, 0) + state = actInfo.get(ShareDefine.ActKey_State, 0) + cfgID = actInfo.get(ShareDefine.ActKey_CfgID) + + playerActID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ActTaskID % actNum) # 玩家身上的活动ID + lastTempID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ActTaskTempID % actNum) + + # 活动ID 相同的话不处理 + if actID == playerActID: + GameWorld.DebugLog("任务活动ID不变,不处理! actNum=%s,actID=%s" % (actNum, actID), playerID) + return + GameWorld.DebugLog("任务活动重置! actNum=%s,actID=%s,playerActID=%s,state=%s,lastTempID=%s" + % (actNum, actID, playerActID, state, lastTempID), playerID) + if lastTempID: + __ResetTaskValueByTemplateID(curPlayer, actNum, lastTempID) + + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ActTaskID % actNum, actID) + + if state: + ipyData = IpyGameDataPY.GetIpyGameData("ActTask", cfgID) + if ipyData: + templateID = ipyData.GetTemplateID() + __ResetTaskValueByTemplateID(curPlayer, actNum, templateID) + + Sync_ActTaskActionInfo(curPlayer, actNum) + Sync_ActTaskPlayerValueInfo(curPlayer, actNum) + Sync_ActTaskPlayerInfo(curPlayer, actNum) + + return True + +def __ResetTaskValueByTemplateID(curPlayer, actNum, templateID): + ## 重置活动相关任务数据记录 + + # 进度值 + for taskType in ChConfig.ActTaskTypeList: + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ActTaskValue % (actNum, taskType), 0) + + # 任务领奖记录 + taskAwardKeyNum = __GetTaskAwardRecordKeyNumMax(templateID, 10) + for keyNum in range(taskAwardKeyNum + 1): + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ActTaskAward % (actNum, keyNum), 0) + + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ActTaskTempID % actNum, templateID) + return + +def __GetTaskAwardRecordKeyNumMax(templateID, defKeyNum=2): + ## 获取最大任务奖励记录key编号 + taskIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActTaskTemp", templateID) + if taskIpyDataList: + taskIDMax = 0 + for taskIpyData in taskIpyDataList: + if taskIpyData.GetTaskID() > taskIDMax: + taskIDMax = taskIpyData.GetTaskID() + return taskIDMax / 31 + return defKeyNum + +def AddActTaskValue(curPlayer, taskType, addValue): + ## 增加任务活动进度值 + + playerID = curPlayer.GetPlayerID() + for actInfo in PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_ActTask, {}).values(): + actNum = actInfo.get(ShareDefine.ActKey_ActNum, 0) + if not actInfo.get(ShareDefine.ActKey_State): + continue + + cfgID = actInfo.get(ShareDefine.ActKey_CfgID) + ipyData = IpyGameDataPY.GetIpyGameData("ActTask", cfgID) + if not ipyData: + continue + templateID = ipyData.GetTemplateID() + + taskIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActTaskTemp", templateID) + if not taskIpyDataList: + continue + + needValueMax = 0 + for taskIpyData in taskIpyDataList: + if taskIpyData.GetTaskType() != taskType: + continue + needValue = taskIpyData.GetNeedValue() + if needValue > needValueMax: + needValueMax = needValue + + curValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ActTaskValue % (actNum, taskType)) + if curValue >= needValueMax: + continue + + updValue = min(needValueMax, curValue + addValue) + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ActTaskValue % (actNum, taskType), updValue) + GameWorld.DebugLog("更新任务活动任务进度值: actNum=%s,taskType=%s,addValue=%s,updValue=%s" + % (actNum, taskType, addValue, updValue), playerID) + Sync_ActTaskPlayerValueInfo(curPlayer, actNum, [taskType]) + + return + +def OnGetActTaskAward(curPlayer, taskID, actNum): + ## 领取活动奖励 + + actNum = GameWorld.ToIntDef(actNum) + + actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_ActTask, actNum) + if not actInfo: + GameWorld.DebugLog("没有该任务活动! actNum=%s" % actNum) + return + + if not actInfo.get(ShareDefine.ActKey_State): + GameWorld.DebugLog("非任务活动中! actNum=%s" % actNum) + return + + cfgID = actInfo.get(ShareDefine.ActKey_CfgID) + ipyData = IpyGameDataPY.GetIpyGameData("ActTask", cfgID) + if not ipyData: + return + templateID = ipyData.GetTemplateID() + + taskIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActTaskTemp", templateID) + if not taskIpyDataList: + return + + findIpyData = None + for taskIpyData in taskIpyDataList: + if taskIpyData.GetTaskID() == taskID: + findIpyData = taskIpyData + break + + if not findIpyData: + GameWorld.DebugLog("找不到对应活动任务奖励! actNum=%s,cfgID=%s,templateID=%s,taskID=%s" % (actNum, cfgID, templateID, taskID)) + return + awardItemList = findIpyData.GetAwardItemList() + taskType = findIpyData.GetTaskType() + needValue = findIpyData.GetNeedValue() + curValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ActTaskValue % (actNum, taskType)) + if curValue < needValue: + GameWorld.DebugLog("活动任务未完成,无法领取! actNum=%s,cfgID=%s,templateID=%s,taskID=%s,curValue=%s < %s" + % (actNum, cfgID, templateID, taskID, curValue, needValue)) + return + + awardIndex = taskID + + if GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_ActTaskAward, awardIndex, True, [actNum]): + GameWorld.DebugLog("任务活动该任务已领奖! actNum=%s,cfgID=%s,taskID=%s" % (actNum, cfgID, taskID)) + return + + if not ItemControler.CheckPackSpaceEnough(curPlayer, awardItemList): + return + + GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_ActTaskAward, awardIndex, 1, True, [actNum]) + + Sync_ActTaskPlayerInfo(curPlayer, actNum) + + GameWorld.DebugLog("领取任务活动奖励! actNum=%s,cfgID=%s,taskID=%s,awardItemList=%s" % (actNum, cfgID, taskID, awardItemList)) + + for itemID, itemCount, isAuctionItem in awardItemList: + ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, isAuctionItem, [IPY_GameWorld.rptItem], event=["ActTask", False, {}]) + + return + +def Sync_ActTaskPlayerInfo(curPlayer, actNum): + ## 通知活动玩家信息 + templateID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ActTaskTempID % actNum) + keyNumMax = __GetTaskAwardRecordKeyNumMax(templateID) + + clientPack = ChPyNetSendPack.tagMCActTaskPlayerInfo() + clientPack.ActNum = actNum + clientPack.AwardRecordList = [] + for keyNum in range(keyNumMax + 1): + clientPack.AwardRecordList.append(curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ActTaskAward % (actNum, keyNum))) + clientPack.AwardCount = len(clientPack.AwardRecordList) + NetPackCommon.SendFakePack(curPlayer, clientPack) + return + +def Sync_ActTaskPlayerValueInfo(curPlayer, actNum, taskTypeList=None): + ## 通知活动玩家信息 + if taskTypeList == None: + taskTypeList = ChConfig.ActTaskTypeList + + clientPack = ChPyNetSendPack.tagMCActTaskPlayerValueInfo() + clientPack.ActNum = actNum + clientPack.TaskValueList = [] + for taskType in taskTypeList: + taskValueInfo = ChPyNetSendPack.tagMCActTaskPlayerValue() + taskValueInfo.TaskType = taskType + taskValueInfo.TaskValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ActTaskValue % (actNum, taskType)) + clientPack.TaskValueList.append(taskValueInfo) + clientPack.TaskCount = len(clientPack.TaskValueList) + NetPackCommon.SendFakePack(curPlayer, clientPack) + return + +def Sync_ActTaskActionInfo(curPlayer, actNum): + ## 通知活动信息 + actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_ActTask, actNum) + if not actInfo: + return + if not actInfo.get(ShareDefine.ActKey_State): + return + cfgID = actInfo.get(ShareDefine.ActKey_CfgID) + ipyData = IpyGameDataPY.GetIpyGameData("ActTask", cfgID) + if not ipyData: + return + templateID = ipyData.GetTemplateID() + taskIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActTaskTemp", templateID) + if not taskIpyDataList: + return + + startDateStr, endDateStr = GameWorld.GetOperationActionDateStr(ipyData) + actPack = ChPyNetSendPack.tagMCActTaskInfo() + actPack.Clear() + actPack.ActNum = actNum + actPack.StartDate = startDateStr + actPack.EndtDate = endDateStr + actPack.IsDayReset = ipyData.GetIsDayReset() + actPack.ResetType = ipyData.GetResetType() + actPack.LimitLV = ipyData.GetLVLimit() + + actPack.TaskList = [] + for taskIpyData in taskIpyDataList: + task = ChPyNetSendPack.tagMCActTask() + task.TaskID = taskIpyData.GetTaskID() + task.TaskType = taskIpyData.GetTaskType() + task.NeedValue = taskIpyData.GetNeedValue() + task.AwardItemList = [] + for itemID, itemCount, isAuctionItem in taskIpyData.GetAwardItemList(): + itemInfo = ChPyNetSendPack.tagMCActTaskItem() + itemInfo.ItemID = itemID + itemInfo.ItemCount = itemCount + itemInfo.IsBind = isAuctionItem + task.AwardItemList.append(itemInfo) + task.Count = len(task.AwardItemList) + + actPack.TaskList.append(task) + actPack.TaskCount = len(actPack.TaskList) + NetPackCommon.SendFakePack(curPlayer, actPack) + return + diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActivity.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActivity.py index fb40cbf..65cf636 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActivity.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActivity.py @@ -38,6 +38,7 @@ import PlayerBossReborn import PlayerActGarbageSorting import PlayerTongTianLing +import PlayerActTask import PlayerSuccess import PlayerGubao @@ -313,6 +314,7 @@ __AddCanCostActivityPoint(curPlayer, addValue, isLVUp) PlayerActGarbageSorting.AddActGarbageTaskProgress(curPlayer, ChConfig.Def_GarbageTask_Activity, addValue) PlayerTongTianLing.AddTongTianTaskValue(curPlayer, ChConfig.TTLTaskType_Activity, addValue) + PlayerActTask.AddActTaskValue(curPlayer, ChConfig.ActTaskType_Activity, addValue) PlayerControl.NotifyCode(curPlayer, "GetActivity", [addValue]) SyncDailyActivityInfo(curPlayer) EventShell.EventRespons_AddActivityValue(curPlayer) diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py index a670120..26ed7ea 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py @@ -98,6 +98,7 @@ import PlayerFeastTravel import PlayerFeastLogin import PlayerFeastWish +import PlayerActTask import PlayerActLoginNew import PlayerActLogin import PlayerFlashGiftbag @@ -1456,6 +1457,9 @@ elif actionName == ShareDefine.OperationActionName_WeekParty: PlayerWeekParty.RefreshOperationAction_WeekParty() + elif actionName == ShareDefine.OperationActionName_ActTask: + PlayerActTask.RefreshActTaskActionInfo(actNum) + elif actionName == ShareDefine.OperationActionName_LoginAward: PlayerActLogin.RefreshOperationAction_LoginAward() diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py index c5cca1b..f68899c 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py @@ -288,6 +288,7 @@ OperationActionName_BuyOne = "ActBuyOne" # 买一送多活动 OperationActionName_BossTrial = "ActBossTrial" # Boss历练 OperationActionName_ActLoginNew = "ActLoginNew" # 登录活动-新 +OperationActionName_ActTask = "ActTask" # 活动任务 #节日活动类型列表 - 该类型无视开服天,日期到了就开启 FeastOperationActionNameList = [OperationActionName_FeastWeekParty, OperationActionName_FeastRedPacket, OperationActionName_RechargeRebateGold, OperationActionName_GrowupBuy, @@ -308,7 +309,7 @@ OperationActionName_Turntable, OperationActionName_HorsePetFeast, OperationActionName_GarbageSorting, OperationActionName_XianXiaMJ, OperationActionName_GodGift, OperationActionName_BuyOne, OperationActionName_BossTrial, - OperationActionName_ActLoginNew, + OperationActionName_ActLoginNew, OperationActionName_ActTask, ] + FeastOperationActionNameList #需要记录开启活动时的世界等级的运营活动 NeedWorldLVOperationActNameList = [OperationActionName_FairyCeremony, OperationActionName_WishingWell, @@ -333,7 +334,7 @@ OperationActionName_Turntable, OperationActionName_HorsePetFeast, OperationActionName_GarbageSorting, OperationActionName_XianXiaMJ, OperationActionName_GodGift, OperationActionName_BuyOne, OperationActionName_BossTrial, - OperationActionName_ActLoginNew, + OperationActionName_ActLoginNew, OperationActionName_ActTask, ] #跨服运营活动表名定义 -- Gitblit v1.8.0