ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -6193,7 +6193,18 @@ TaskType_EquipDecompose, # 分解装备x次 3 TaskType_FBPass, # 副本过关到xxx 4 TaskType_Arena, # 挑战竞技场x次 5 ) = range(1, 1 + 5) TaskType_EquipColorItem, # 穿戴X品质装备x件 6 TaskType_TreeLV, # 仙树达到X级 7 TaskType_RealmLV, # 境界达到X级 8 TaskType_MineItemSelf, # 采集自己福地物品x次 9 TaskType_MineWorkerCnt, # 拥有x只福地老鼠 10 TaskType_MineItemRob, # 采集他人福地物品x次 11 TaskType_FBChallenge, # 副本xxx挑战x次 12 TaskType_CreateOrJoinFamily, # 创建或申请加入仙盟 13 TaskType_HorseUp, # 坐骑升级x次 14 TaskType_RefineItem, # 炼丹x次 15 TaskType_FairyDomain, # 缥缈仙域x次 16 ) = range(1, 1 + 16) # 任务分组 TaskGroupList = ( ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Task.py
@@ -26,14 +26,15 @@ # @param playerList 参数列表 [ missionID] # @return None # @remarks 函数详细说明. def OnExec(curPlayer, playerList): def OnExec(curPlayer, paramList): if len(playerList) == 0: if len(paramList) == 0: GameWorld.DebugAnswer(curPlayer, "重置主线: Task 0") GameWorld.DebugAnswer(curPlayer, "输出任务: Task 1") GameWorld.DebugAnswer(curPlayer, "设置任务: Task 任务ID 进度") return taskID = playerList[0] taskID = paramList[0] if not taskID: taskGroup = ChConfig.TaskGroup_Main PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TaskIDLast % taskGroup, 0) @@ -43,7 +44,11 @@ PlayerTask.__giveNewTask(curPlayer, taskGroup) return taskValue = playerList[1] if len(playerList) > 1 else 0 if len(paramList) == 1 and paramList[0] == 1: __ShowTask(curPlayer) return taskValue = paramList[1] if len(paramList) > 1 else 0 ipyData = IpyGameDataPY.GetIpyGameData("Task", taskID) if not ipyData: GameWorld.DebugAnswer(curPlayer, "该任务ID不存在:%s" % taskID) @@ -59,3 +64,23 @@ GameWorld.DebugAnswer(curPlayer, "设置任务ID:%s 进度:%s/%s" % (taskID, curValue, needValue)) return def __ShowTask(curPlayer): taskCount = 0 for taskGroup in ChConfig.TaskGroupList: taskID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskID % taskGroup) if not taskID: continue ipyData = IpyGameDataPY.GetIpyGameData("Task", taskID) if not ipyData: continue curState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskState % taskGroup) curValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskValue % taskGroup) needValue = ipyData.GetNeedValue() GameWorld.DebugAnswer(curPlayer, "任务ID:%s 进度:%s/%s 状态:%s" % (taskID, curValue, needValue, curState)) taskCount += 1 if not taskCount: GameWorld.DebugAnswer(curPlayer, "当前没有任务!") return ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChEquip.py
@@ -333,6 +333,35 @@ return def GetPlayerEquipItemCount(curPlayer, classLV, itemColor, includeHigh=True): ## 获取玩家穿戴的装备数量 haveCnt = 0 classlVList = [classLV] if classLV else range(1, IpyGameDataPY.GetFuncCfg('EquipMaxClasslv')+1) equipPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip) for classLV in classlVList: ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition('EquipPlaceIndexMap', {'ClassLV':classLV}, True, False) if not ipyDataList: continue for ipyData in ipyDataList: gridIndex = ipyData.GetGridIndex() curEquip = equipPack.GetAt(gridIndex) if not ItemCommon.CheckItemCanUse(curEquip): continue if itemColor != None: if includeHigh: if curEquip.GetItemColor() < itemColor: continue else: if curEquip.GetItemColor() != itemColor: continue # 可扩展套装 haveCnt += 1 return haveCnt ## 刷新所有装备对人物属性的改变 # @param self 类实例 # @return 返回值无意义 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py
@@ -37,6 +37,7 @@ import DataRecordPack import PlayerGubao import EventShell import PlayerTask import PlayerVip import ChEquip @@ -830,6 +831,7 @@ dataDict = {'dotype':'EquipItem', 'desItemID':desItemID, 'desUserData':desUserData,'srcItemID':srcItemID,'srcUserData':srcUserData} DataRecordPack.Cache_FightPowerChangeInfo(curPlayer, ChConfig.PowerDownType_EquipChange, dataDict) self.__UpdEquipOrangeCount(befIsOrangeEquip, aftIsOrangeEquip) PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_EquipColorItem) self.RefreshStartEquipCount() return equipPlace if result else -1 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
@@ -4316,7 +4316,7 @@ aftBaseCON = curPlayer.GetBaseCON() if aftLV > befLV: curPlayer.SetLV(aftLV, False) # 这里不再通知GameServer PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_LV, aftLV) PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_LV) PlayerSuccess.UptateSuccessProgress(curPlayer, ShareDefine.SuccType_HeroLV, aftLV) PlayerActivity.DoAddActivityByLV(curPlayer, befLV, aftLV) ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCutTree.py
@@ -333,6 +333,8 @@ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreeLVUPRefreshTime, 0) GameWorld.DebugLog("执行仙树升级! updTreeLV=%s" % updTreeLV, playerID) SyncTreeInfo(curPlayer) PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_TreeLV) return def SyncTreeInfo(curPlayer): ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFairyDomain.py
@@ -32,6 +32,7 @@ import PlayerNewFairyCeremony import ItemControler import ItemCommon import PlayerTask import PyGameData import EventShell import FBCommon @@ -360,6 +361,8 @@ # GameWorld.Log('缥缈仙域事件状态设置错误,fdeventID=%s, state=%s, curState=%s' % (fdeventID, state, curState)) # return EventShell.EventRespons_FairyDomain(curPlayer, ipyData.GetEventType()) PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_FairyDomain, 1) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyDomainEventState % fdeventID, state) NotifyVisitFairyDomainInfo(curPlayer, [fdeventID], 0) return True ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py
@@ -42,6 +42,7 @@ import GameFuncComm import PlayerTJG import IpyGameDataPY import PlayerTask import cPickle import time @@ -140,7 +141,10 @@ #刚进家族并为族长,触发建家族事件 if curPlayer.GetFamilyMemberLV() == IPY_GameWorld.fmlLeader: EventShell.EventResponse_OnCreateFamily(curPlayer) PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_CreateOrJoinFamily) else: PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_CreateOrJoinFamily, 1) #进入家族触发事件 __OnEnterFamily(curPlayer, tick) ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py
@@ -36,6 +36,7 @@ import IpyGameDataPY import CrossPlayerData import PlayerSuccess import PlayerTask import PlayerPet import time @@ -634,6 +635,7 @@ # 升阶 EventShell.EventRespons_HorseUp(curPlayer) # 改为使用就算 PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_HorseUp, 1) if updClassLV > horseLV: EventShell.EventRespons_HorseLV(curPlayer, updClassLV) # 玩家马匹进阶 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerMineArea.py
@@ -24,6 +24,7 @@ import ItemControler import ItemCommon import GameWorld import PlayerTask # 聚宝盆默认最大进度 MineTreasureProgressMax = 100 @@ -159,6 +160,8 @@ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MineWorkerCount, updEmployCount) SyncPlayerMineAreaInfo(curPlayer) GameWorld.DebugLog("福地雇佣工人! costItemID=%s,costItemCount=%s,updEmployCount=%s" % (costItemID, costItemCount, updEmployCount), playerID) PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_MineWorkerCnt) return def SendToGameServer_MineArea(curPlayer, msgType, dataMsg=""): @@ -206,6 +209,9 @@ if robCount: OnAddMineTreasureProgress(curPlayer, robCount, False) PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_MineItemRob, 1) else: PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_MineItemSelf, 1) SyncPlayerMineAreaInfo(curPlayer) ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPrestigeSys.py
@@ -33,6 +33,7 @@ import EventShell import DataRecordPack import SkillCommon import PlayerTask import time #------------------------------------------------------------------------------ @@ -385,6 +386,7 @@ # 记录开服活动 #OpenServerCampaign.UpdOpenServerCampaignRecordData(curPlayer, ShareDefine.Def_Campaign_Type_RealmLV, nextRealmLv) EventShell.EventRespons_RealmUp(curPlayer, nextRealmLv) PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_RealmLV) #流向 DataRecordPack.DR_RealmLVUp(curPlayer, nextRealmLv) return True ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerRefineStove.py
@@ -33,6 +33,7 @@ import PlayerNewFairyCeremony import PlayerActGarbageSorting import PlayerActLogin import PlayerTask import PlayerVip import copy @@ -146,7 +147,8 @@ #日常任务 costItemCnt = sum(needMaterialDict.values()) #PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_RefineStove, costItemCnt) PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_RefineItem, refineTimes) elif doType == 2: if curAlchemyItemID != alchemyItemID: GameWorld.DebugLog('停止丹药ID错误 curAlchemyItemID=%s' % curAlchemyItemID) ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTask.py
@@ -25,10 +25,77 @@ import GameFuncComm import ShareDefine import ChConfig import ChEquip def GetTaskIDList(taskGroup): ## 获取某个任务分组所有任务ID列表 key = "TaskIDListDict" taskIDListDict = IpyGameDataPY.GetConfigEx(key) if not taskIDListDict: taskIDListDict = {} ipyDataMgr = IpyGameDataPY.IPY_Data() for index in xrange(ipyDataMgr.GetTaskCount()): ipyData = ipyDataMgr.GetTaskByIndex(index) taskGroup = ipyData.GetTaskGroup() taskID = ipyData.GetTaskID() if taskGroup not in taskIDListDict: taskIDListDict[taskGroup] = [] taskIDList = taskIDListDict[taskGroup] if taskID not in taskIDList: taskIDList.append(taskID) IpyGameDataPY.SetConfigEx(key, taskIDListDict) GameWorld.Log("任务ID列表: %s" % taskIDListDict) return taskIDListDict.get(taskGroup, []) def OnPlayerLogin(curPlayer): __fixRefreshTask(curPlayer) if not __giveNewTask(curPlayer, ChConfig.TaskGroup_Main): SyncTaskInfo(curPlayer) return def __fixRefreshTask(curPlayer): ## 纠正刷新任务值状态等,一般用于修改任务配置等,玩家登录检查 playerID = curPlayer.GetPlayerID() fixGroupList = [] for taskGroup in ChConfig.TaskGroupList: taskID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskID % taskGroup) if not taskID: continue ipyData = IpyGameDataPY.GetIpyGameData("Task", taskID) if not ipyData: continue curValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskValue % taskGroup) curState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskState % taskGroup) if curState == ChConfig.TaskState_Finish: continue needFix = False needValue = ipyData.GetNeedValue() taskValue = __GetTaskValue(curPlayer, ipyData) # 可能修改条件配置后,导致任务值不一致,需要修正 if taskValue and taskValue != curValue: GameWorld.Log("需要修正任务进度: taskID=%s,curValue=%s,taskValue=%s" % (taskID, curValue, taskValue), playerID) curValue = taskValue needFix = True # 可能修改降低了所需任务值,需要修正下完成状态 if curValue >= needValue and curState != ChConfig.TaskState_Finish: GameWorld.Log("需要修正任务状态: taskID=%s,curValue=%s,needValue=%s,curState=%s" % (taskID, curValue, needValue, curState), playerID) needFix = True if not needFix: continue SetTaskValue(curPlayer, ipyData, taskValue, False) fixGroupList.append(taskGroup) if fixGroupList: SyncTaskInfo(curPlayer, fixGroupList) return def __giveNewTask(curPlayer, taskGroup=ChConfig.TaskGroup_Main): @@ -51,81 +118,79 @@ return lastIndex = taskIDList.index(lastTaskID) if lastIndex >= len(taskIDList) - 1: GameWorld.DebugLog("已经完成了所有任务: lastTaskID=%s,lastTaskID=%s" % (lastTaskID, lastTaskID), playerID) GameWorld.DebugLog("已经完成了所有任务: taskGroup=%s,lastTaskID=%s" % (taskGroup, lastTaskID), playerID) return newTaskID = taskIDList[lastIndex + 1] GameWorld.DebugLog("给下一个任务: lastTaskID=%s,newTaskID=%s,lastTaskID=%s" % (lastTaskID, newTaskID, lastTaskID), playerID) GameWorld.DebugLog("给下一个任务: taskGroup=%s,newTaskID=%s,lastTaskID=%s" % (taskGroup, newTaskID, lastTaskID), playerID) if not newTaskID: return ipyData = IpyGameDataPY.GetIpyGameData("Task", newTaskID) if not ipyData: return taskType = ipyData.GetTaskType() conds = ipyData.GetTaskConds() taskValue = 0 taskValue = __GetTaskValue(curPlayer, ipyData) if taskType == ChConfig.TaskType_LV: taskValue = curPlayer.GetLV() elif taskType == ChConfig.TaskType_FBPass: if len(conds) != 2: return mapID, lineID = conds grade = GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_PlayerFBStar_MapId, lineID, False, [mapID]) taskValue = 1 if grade > 0 else 0 PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TaskID % taskGroup, newTaskID) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TaskValue % taskGroup, 0) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TaskState % taskGroup, ChConfig.TaskState_Doing) GameWorld.DebugLog("接到新任务: taskGroup=%s,newTaskID=%s" % (taskGroup, newTaskID), playerID) return SetTaskValue(curPlayer, ipyData, taskValue) def GetTaskIDList(taskGroup): ## 获取某个任务分组所有任务ID列表 key = "TaskIDListDict" taskIDListDict = IpyGameDataPY.GetConfigEx(key) if not taskIDListDict: taskIDListDict = {} ipyDataMgr = IpyGameDataPY.IPY_Data() for index in xrange(ipyDataMgr.GetTaskCount()): ipyData = ipyDataMgr.GetTaskByIndex(index) taskGroup = ipyData.GetTaskGroup() taskID = ipyData.GetTaskID() if taskGroup not in taskIDListDict: taskIDListDict[taskGroup] = [] taskIDList = taskIDListDict[taskGroup] if taskID not in taskIDList: taskIDList.append(taskID) IpyGameDataPY.SetConfigEx(key, taskIDListDict) GameWorld.Log("任务ID列表: %s" % taskIDListDict) return taskIDListDict.get(taskGroup, []) def __GetTaskValue(curPlayer, ipyData): ## 获取任务类型当前进度值,一般直接 UpdTaskValue 的类型会用到 taskValue = 0 # 默认0 taskType = ipyData.GetTaskType() conds = ipyData.GetTaskConds() if taskType == ChConfig.TaskType_LV: taskValue = curPlayer.GetLV() elif taskType == ChConfig.TaskType_FBPass: if len(conds) != 2: return 0 mapID, lineID = conds grade = GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_PlayerFBStar_MapId, lineID, False, [mapID]) taskValue = 1 if grade > 0 else 0 elif taskType == ChConfig.TaskType_EquipColorItem: if not conds: return 0 itemColor = conds[0] taskValue = ChEquip.GetPlayerEquipItemCount(curPlayer, None, itemColor) elif taskType == ChConfig.TaskType_TreeLV: taskValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreeLV) elif taskType == ChConfig.TaskType_RealmLV: taskValue = curPlayer.GetOfficialRank() elif taskType == ChConfig.TaskType_MineWorkerCnt: taskValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineWorkerCount) elif taskType == ChConfig.TaskType_CreateOrJoinFamily: taskValue = 1 if curPlayer.GetFamilyID() else 0 return taskValue def UpdTaskValue(curPlayer, taskType, setValue, conds=None): def UpdTaskValue(curPlayer, taskType): ## 更新任务进度 for taskGroup in ChConfig.TaskGroupList: taskID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskID % taskGroup) if not taskID: continue ipyData = IpyGameDataPY.GetIpyGameData("Task", taskID) ipyData = __GetDoingTaskIpyData(curPlayer, taskGroup, taskType) if not ipyData: continue if ipyData.GetTaskType() != taskType: curValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskValue % taskGroup) taskValue = __GetTaskValue(curPlayer, ipyData) if taskValue <= curValue: # 有增长才更新 continue if not __CheckTaskCondition(ipyData, conds): continue SetTaskValue(curPlayer, ipyData, setValue) SetTaskValue(curPlayer, ipyData, taskValue) return def AddTaskValue(curPlayer, taskType, addValue=1, conds=None): ## 增加任务进度 for taskGroup in ChConfig.TaskGroupList: taskID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskID % taskGroup) if not taskID: continue ipyData = IpyGameDataPY.GetIpyGameData("Task", taskID) ipyData = __GetDoingTaskIpyData(curPlayer, taskGroup, taskType) if not ipyData: continue if ipyData.GetTaskType() != taskType: continue if not __CheckTaskCondition(ipyData, conds): continue @@ -133,21 +198,46 @@ SetTaskValue(curPlayer, ipyData, curValue) return def __GetDoingTaskIpyData(curPlayer, taskGroup, taskType): ## 获取正在进行中的任务ipyData taskID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskID % taskGroup) if not taskID: return curState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskState % taskGroup) if curState == ChConfig.TaskState_Finish: return ipyData = IpyGameDataPY.GetIpyGameData("Task", taskID) if not ipyData: return if ipyData.GetTaskType() != taskType: return return ipyData def __CheckTaskCondition(ipyData, conds=None): ## 检查任务条件是否满足 taskType = ipyData.GetTaskType() # 副本xxx过关 if taskType == ChConfig.TaskType_FBPass: taskConds = ipyData.GetTaskConds() if not conds or len(conds) != 2 or len(taskConds) != 2: if not conds or len(conds) != len(taskConds) or len(conds) < 2: return if conds[0] != taskConds[0]: return if conds[1] < taskConds[1]: return # 副本xxx挑战 elif taskType == ChConfig.TaskType_FBChallenge: taskConds = ipyData.GetTaskConds() if not conds or len(conds) != len(taskConds) or len(conds) < 1: return if conds[0] != taskConds[0]: return return True def SetTaskValue(curPlayer, taskIpyData, value=0): def SetTaskValue(curPlayer, taskIpyData, value=0, isNotify=True): ## 设置当前任务进度值,统一处理任务状态、触发额外逻辑等 if not taskIpyData: return @@ -168,7 +258,9 @@ if value >= finishNeedValue: __OnTaskFinish(curPlayer, taskGroup, taskID, taskIpyData) SyncTaskInfo(curPlayer, taskGroup) if isNotify: SyncTaskInfo(curPlayer, [taskGroup]) return True def __OnTaskFinish(curPlayer, taskGroup, taskID, taskIpyData): @@ -227,11 +319,11 @@ ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, isAuctionItem, [IPY_GameWorld.rptItem]) if not __giveNewTask(curPlayer, taskGroup): SyncTaskInfo(curPlayer, taskGroup) SyncTaskInfo(curPlayer, [taskGroup]) return def SyncTaskInfo(curPlayer, taskGroup=None): syncGroupList = [taskGroup] if taskGroup != None else ChConfig.TaskGroupList def SyncTaskInfo(curPlayer, taskGroupList=None): syncGroupList = taskGroupList if taskGroupList != None else ChConfig.TaskGroupList if not syncGroupList: return