#!/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) and curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ActTaskID % actNum):
|
Sync_ActTaskActionInfo(curPlayer, actNum)
|
Sync_ActTaskPlayerValueInfo(curPlayer, actNum)
|
Sync_ActTaskPlayerInfo(curPlayer, actNum)
|
|
return
|
|
def OnDay(curPlayer):
|
OnCheckRelateFuncAct(curPlayer)
|
return
|
|
def OnCheckRelateFuncAct(curPlayer, openFuncIDList=None):
|
## ¼ì²é¹ØÁª¹¦ÄÜID¿ªÆôµÄ»î¶¯
|
for actInfo in PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_ActTask, {}).values():
|
if not actInfo.get(ShareDefine.ActKey_State):
|
continue
|
cfgID = actInfo.get(ShareDefine.ActKey_CfgID)
|
ipyData = IpyGameDataPY.GetIpyGameData("ActTask", cfgID)
|
if not ipyData:
|
continue
|
if not hasattr(ipyData, "GetRelateFuncID"):
|
continue
|
relateFuncID = ipyData.GetRelateFuncID()
|
if not relateFuncID:
|
continue
|
if openFuncIDList and relateFuncID not in openFuncIDList:
|
continue
|
actNum = actInfo.get(ShareDefine.ActKey_ActNum, 0)
|
__CheckPlayerActTaskAction(curPlayer, actNum)
|
|
return
|
|
def RefreshActTaskActionInfo(actNum):
|
## ÊÕµ½GameServerͬ²½µÄ»î¶¯ÐÅÏ¢£¬Ë¢Ð»ÐÅÏ¢
|
playerManager = GameWorld.GetPlayerManager()
|
for index in xrange(playerManager.GetPlayerCount()):
|
curPlayer = playerManager.GetPlayerByIndex(index)
|
if not GameWorld.IsNormalPlayer(curPlayer):
|
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)
|
|
funcActInfo = GameWorld.GetActRelateFuncInfo(curPlayer, "ActTask", actInfo, playerActID)
|
if funcActInfo:
|
isInAct, actID = funcActInfo
|
if not isInAct:
|
return
|
|
# »î¶¯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)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ActTaskRound % actNum, 0)
|
|
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)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ActTaskRound % actNum, 1)
|
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 UpdActTaskValue(curPlayer, taskType, updValue):
|
## ¸üÐÂÈÎÎñ»î¶¯½ø¶ÈÖµ
|
|
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
|
if not curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ActTaskID % actNum):
|
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 updValue == curValue or needValueMax <= 0:
|
continue
|
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ActTaskValue % (actNum, taskType), updValue)
|
GameWorld.DebugLog("¸üÐÂÈÎÎñ»î¶¯ÈÎÎñ½ø¶ÈÖµ: actNum=%s,taskType=%s,updValue=%s" % (actNum, taskType, updValue), playerID)
|
Sync_ActTaskPlayerValueInfo(curPlayer, actNum, [taskType])
|
|
return
|
|
def AddActTaskValue(curPlayer, taskType, addValue=1):
|
## Ôö¼ÓÈÎÎñ»î¶¯½ø¶ÈÖµ
|
|
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
|
if not curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ActTaskID % actNum):
|
continue
|
cfgID = actInfo.get(ShareDefine.ActKey_CfgID)
|
ipyData = IpyGameDataPY.GetIpyGameData("ActTask", cfgID)
|
if not ipyData:
|
continue
|
roundMax = ipyData.GetRoundMax()
|
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 roundMax > 1:
|
needValueMax *= roundMax
|
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
|
roundMax = ipyData.GetRoundMax()
|
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])
|
|
roundNum = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ActTaskRound % actNum)
|
GameWorld.DebugLog("ÁìÈ¡ÈÎÎñ»î¶¯½±Àø£¡ actNum=%s,cfgID=%s,roundNum=%s,taskID=%s,awardItemList=%s" % (actNum, cfgID, roundNum, taskID, awardItemList))
|
|
for itemID, itemCount, isAuctionItem in awardItemList:
|
ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, isAuctionItem, [IPY_GameWorld.rptItem], event=["ActTask", False, {}])
|
|
# ¼ì²é½øÈëÏÂÒ»ÂÖ
|
if roundMax > 1 and roundNum < roundMax:
|
roundFinish = True
|
taskMaxValueInfo = {}
|
for taskIpyData in taskIpyDataList:
|
rTaskID = taskIpyData.GetTaskID()
|
rTaskType = taskIpyData.GetTaskType()
|
rNeedValue = taskIpyData.GetNeedValue()
|
if rNeedValue > taskMaxValueInfo.get(rTaskType, 0):
|
taskMaxValueInfo[rTaskType] = rNeedValue
|
rAwardIndex = rTaskID
|
if not GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_ActTaskAward, rAwardIndex, True, [actNum]):
|
roundFinish = False
|
GameWorld.DebugLog("»¹ÓÐÈÎÎñδÁìÈ¡£¬²»½øÈëÏÂÒ»ÂÖ´Î! actNum=%s,cfgID=%s,roundNum=%s,rTaskID=%s" % (actNum, cfgID, roundNum, rTaskID))
|
break
|
|
if roundFinish:
|
nextRound = roundNum + 1
|
GameWorld.DebugLog("±¾ÂÖÈÎÎñÁìÈ¡Íê±Ï£¬½øÈëÏÂÒ»ÂÖ! nextRound=%s" % (nextRound))
|
for rTaskType, rMaxValue in taskMaxValueInfo.items():
|
curValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ActTaskValue % (actNum, taskType))
|
updValue = max(0, curValue - rMaxValue)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ActTaskValue % (actNum, taskType), updValue)
|
GameWorld.DebugLog(" ¸üÐÂÐÂÒ»ÂÖÈÎÎñÖµ! rTaskType=%s,rMaxValue=%s,curValue=%s,updValue=%s"
|
% (rTaskType, rMaxValue, curValue, updValue))
|
Sync_ActTaskPlayerValueInfo(curPlayer, actNum, taskMaxValueInfo.keys())
|
|
# ÈÎÎñÁì½±¼Ç¼
|
taskAwardKeyNum = __GetTaskAwardRecordKeyNumMax(templateID, 10)
|
for keyNum in range(taskAwardKeyNum + 1):
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ActTaskAward % (actNum, keyNum), 0)
|
GameWorld.DebugLog(" ÖØÖÃÐÂÒ»ÂÖÁì½±¼Ç¼! taskAwardKeyNum=%s" % (taskAwardKeyNum))
|
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ActTaskRound % actNum, nextRound)
|
|
Sync_ActTaskPlayerInfo(curPlayer, actNum)
|
return
|
|
def GetActTaskTypeList(actNum):
|
taskTypeList = []
|
actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_ActTask, actNum)
|
if not actInfo:
|
return taskTypeList
|
if not actInfo.get(ShareDefine.ActKey_State):
|
return taskTypeList
|
cfgID = actInfo.get(ShareDefine.ActKey_CfgID)
|
ipyData = IpyGameDataPY.GetIpyGameData("ActTask", cfgID)
|
if not ipyData:
|
return taskTypeList
|
templateID = ipyData.GetTemplateID()
|
taskIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActTaskTemp", templateID)
|
if not taskIpyDataList:
|
return taskTypeList
|
for taskIpyData in taskIpyDataList:
|
taskType = taskIpyData.GetTaskType()
|
if taskType not in taskTypeList:
|
taskTypeList.append(taskType)
|
return taskTypeList
|
|
def Sync_ActTaskPlayerInfo(curPlayer, actNum):
|
## ֪ͨ»î¶¯Íæ¼ÒÐÅÏ¢
|
templateID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ActTaskTempID % actNum)
|
keyNumMax = __GetTaskAwardRecordKeyNumMax(templateID)
|
|
clientPack = ChPyNetSendPack.tagMCActTaskPlayerInfo()
|
clientPack.ActNum = actNum
|
clientPack.RoundNum = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ActTaskRound % 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 = GetActTaskTypeList(actNum)
|
|
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
|
playerActID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ActTaskID % actNum) # Íæ¼ÒÉíÉϵĻID
|
if not playerActID:
|
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
|
|
if hasattr(ipyData, "GetRelateFuncID") and ipyData.GetRelateFuncID():
|
startDateStr, endDateStr = GameWorld.GetActRelateFuncDate(ipyData, playerActID, True)
|
else:
|
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.RoundMax = ipyData.GetRoundMax()
|
|
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
|
|