#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package Player.PlayerTask # # @todo:Íæ¼ÒÈÎÎñ # @author hxp # @date 2023-12-20 # @version 1.0 # # ÏêϸÃèÊö: Íæ¼ÒÈÎÎñ # #------------------------------------------------------------------------------- #"""Version = 2023-12-20 12:30""" #------------------------------------------------------------------------------- import GameWorld import IpyGameDataPY import PlayerControl import NetPackCommon import ChPyNetSendPack import ItemControler import IPY_GameWorld import GameFuncComm import ShareDefine import ChConfig def OnPlayerLogin(curPlayer): if not __giveNewTask(curPlayer, ChConfig.TaskGroup_Main): SyncTaskInfo(curPlayer) return def __giveNewTask(curPlayer, taskGroup=ChConfig.TaskGroup_Main): ## ¸øÐÂÈÎÎñ taskIDList = GetTaskIDList(taskGroup) if not taskIDList: return playerID = curPlayer.GetPlayerID() taskID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskID % taskGroup) lastTaskID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskIDLast % taskGroup) newTaskID = 0 if not taskID and not lastTaskID: newTaskID = taskIDList[0] GameWorld.DebugLog("¸øµÚÒ»¸öÈÎÎñ: taskGroup=%s,newTaskID=%s" % (taskGroup, newTaskID), playerID) elif not taskID and lastTaskID: # ûÓе±Ç°ÈÎÎñ£¬¸øÏÂÒ»¸öÈÎÎñ if lastTaskID not in taskIDList: GameWorld.ErrLog("ÕÒ²»µ½ÉÏÒ»´ÎÍê³ÉµÄÈÎÎñID! taskGroup=%s,lastTaskID=%s" % (taskGroup, lastTaskID), playerID) return lastIndex = taskIDList.index(lastTaskID) if lastIndex >= len(taskIDList) - 1: GameWorld.DebugLog("ÒѾ­Íê³ÉÁËËùÓÐÈÎÎñ: lastTaskID=%s,lastTaskID=%s" % (lastTaskID, lastTaskID), playerID) return newTaskID = taskIDList[lastIndex + 1] GameWorld.DebugLog("¸øÏÂÒ»¸öÈÎÎñ: lastTaskID=%s,newTaskID=%s,lastTaskID=%s" % (lastTaskID, newTaskID, lastTaskID), playerID) if not newTaskID: return ipyData = IpyGameDataPY.GetIpyGameData("Task", newTaskID) if not ipyData: return taskType = ipyData.GetTaskType() conds = ipyData.GetTaskConds() taskValue = 0 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): ## »ñȡij¸öÈÎÎñ·Ö×éËùÓÐÈÎÎñ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 UpdTaskValue(curPlayer, taskType, setValue, conds=None): ## ¸üÐÂÈÎÎñ½ø¶È 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 if ipyData.GetTaskType() != taskType: continue if not __CheckTaskCondition(ipyData, conds): continue SetTaskValue(curPlayer, ipyData, setValue) 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) if not ipyData: continue if ipyData.GetTaskType() != taskType: continue if not __CheckTaskCondition(ipyData, conds): continue curValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskValue % taskGroup) + addValue SetTaskValue(curPlayer, ipyData, curValue) return def __CheckTaskCondition(ipyData, conds=None): ## ¼ì²éÈÎÎñÌõ¼þÊÇ·ñÂú×ã taskType = ipyData.GetTaskType() if taskType == ChConfig.TaskType_FBPass: taskConds = ipyData.GetTaskConds() if not conds or len(conds) != 2 or len(taskConds) != 2: return if conds[0] != taskConds[0]: return if conds[1] < taskConds[1]: return return True def SetTaskValue(curPlayer, taskIpyData, value=0): ## ÉèÖõ±Ç°ÈÎÎñ½ø¶ÈÖµ£¬Í³Ò»´¦ÀíÈÎÎñ״̬¡¢´¥·¢¶îÍâÂß¼­µÈ if not taskIpyData: return playerID = curPlayer.GetPlayerID() taskGroup = taskIpyData.GetTaskGroup() taskID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskID % taskGroup) if taskIpyData.GetTaskID() != taskID: return curState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskState % taskGroup) if curState == ChConfig.TaskState_Finish: return taskType = taskIpyData.GetTaskType() finishNeedValue = taskIpyData.GetNeedValue() value = min(value, finishNeedValue, ShareDefine.Def_UpperLimit_DWord) GameWorld.DebugLog("¸üÐÂÈÎÎñ½ø¶È: taskGroup=%s,taskType=%s,taskID=%s,value=%s/%s" % (taskGroup, taskType, taskID, value, finishNeedValue), playerID) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TaskValue % taskGroup, value) if value >= finishNeedValue: __OnTaskFinish(curPlayer, taskGroup, taskID, taskIpyData) SyncTaskInfo(curPlayer, taskGroup) return True def __OnTaskFinish(curPlayer, taskGroup, taskID, taskIpyData): GameWorld.DebugLog("ÈÎÎñÍê³É: taskGroup=%s,taskID=%s" % (taskGroup, taskID), curPlayer.GetPlayerID()) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TaskState % taskGroup, ChConfig.TaskState_Finish) GameFuncComm.DoFuncOpenLogic(curPlayer, [taskID]) return def IsTaskFinish(curPlayer, taskID): ## ÈÎÎñÊÇ·ñÒÑÍê³É ipyData = IpyGameDataPY.GetIpyGameData("Task", taskID) if not ipyData: return taskGroup = ipyData.GetTaskGroup() nowTaskID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskID % taskGroup) if nowTaskID and curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskState % taskGroup) == ChConfig.TaskState_Finish: finishTaskID = nowTaskID else: finishTaskID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskIDLast % taskGroup) if taskID == finishTaskID: return True taskIDList = GetTaskIDList(taskGroup) if finishTaskID not in taskIDList or taskID not in taskIDList: return return taskIDList.index(finishTaskID) >= taskIDList.index(taskID) def GetTaskAward(curPlayer, taskID): ## ÁìÈ¡ÈÎÎñ½±Àø playerID = curPlayer.GetPlayerID() ipyData = IpyGameDataPY.GetIpyGameData("Task", taskID) if not ipyData: return taskGroup = ipyData.GetTaskGroup() curTaskID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskID % taskGroup) if taskID != curTaskID: GameWorld.DebugLog("·Çµ±Ç°ÈÎÎñ: curTaskID=%s" % curTaskID, playerID) return needValue = ipyData.GetNeedValue() awardItemList = ipyData.GetAwardItemList() curState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskState % taskGroup) curValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskValue % taskGroup) if curState != ChConfig.TaskState_Finish: GameWorld.DebugLog("ÈÎÎñδÍê³ÉÎÞ·¨Áì½±: taskID=%s,curValue=%s/%s,curState=%s" % (taskID, curValue, needValue, curState), playerID) return if not ItemControler.CheckPackSpaceEnough(curPlayer, awardItemList): return PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TaskIDLast % taskGroup, taskID) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TaskID % taskGroup, 0) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TaskValue % taskGroup, 0) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TaskState % taskGroup, 0) for itemID, itemCount, isAuctionItem in awardItemList: ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, isAuctionItem, [IPY_GameWorld.rptItem]) if not __giveNewTask(curPlayer, taskGroup): SyncTaskInfo(curPlayer, taskGroup) return def SyncTaskInfo(curPlayer, taskGroup=None): syncGroupList = [taskGroup] if taskGroup != None else ChConfig.TaskGroupList if not syncGroupList: return taskList = [] for taskGroup in syncGroupList: task = ChPyNetSendPack.tagMCTask() task.TaskGroup = taskGroup task.TaskID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskID % taskGroup) task.CurValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskValue % taskGroup) task.State = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TaskState % taskGroup) taskList.append(task) if not taskList: return clientPack = ChPyNetSendPack.tagMCTaskInfo() clientPack.TaskList = taskList clientPack.TaskCount = len(clientPack.TaskList) NetPackCommon.SendFakePack(curPlayer, clientPack) return