#!/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
|