#!/usr/bin/python  
 | 
# -*- coding: GBK -*-  
 | 
#-------------------------------------------------------------------------------  
 | 
#  
 | 
#-------------------------------------------------------------------------------  
 | 
#  
 | 
##@package Player.PlayerArrestTask  
 | 
#  
 | 
# @todo:Íæ¼ÒÐüÉÍÈÎÎñ  
 | 
# @author xdh  
 | 
# @date 2017-07-15  
 | 
# @version 2.5  
 | 
#  
 | 
# ÏêϸÃèÊö: Íæ¼ÒÐüÉÍÈÎÎñ  
 | 
#---------------------------------------------------------------------  
 | 
#"""Version = 2017-07-15 17:30"""  
 | 
#---------------------------------------------------------------------  
 | 
  
 | 
import ReadChConfig  
 | 
import ChConfig  
 | 
import ChPyNetSendPack  
 | 
import NetPackCommon  
 | 
import ShareDefine  
 | 
import GameWorld  
 | 
import ItemCommon  
 | 
import IPY_GameWorld  
 | 
import PlayerControl  
 | 
import ItemControler  
 | 
import QuestCommon  
 | 
import EventShell  
 | 
import PlayerActivity  
 | 
import GameFuncComm  
 | 
  
 | 
## OnDay  
 | 
#  @param curPlayer Íæ¼ÒʵÀý  
 | 
#  @return  
 | 
def OnDay(curPlayer):  
 | 
    #ÖØÖý±Àø¡¢»ý·Ö  
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_ArrestTaskAwardRecord, 0)  
 | 
    #PlayerControl.SetPlayerCurrency(curPlayer, ShareDefine.TYPE_Price_ArrestPoint, 0)  
 | 
    #ÉèÖÃÐüÉÍÈÎÎñ´ÎÊý  
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_ArrestTaskFinishCnt, 0)  
 | 
    #ɾ³ýÒÑÁìÈ¡µÄÈÎÎñ  
 | 
    if curPlayer.FindMission(ChConfig.Def_ArrestMissionID):  
 | 
        QuestCommon.DeleteMission(curPlayer, ChConfig.Def_ArrestMissionID)  
 | 
   
 | 
    OnDeleteArrestTask(curPlayer)  
 | 
    return  
 | 
  
 | 
  
 | 
## OnLogin  
 | 
#  @param curPlayer Íæ¼ÒʵÀý  
 | 
#  @return  
 | 
def OnLogin(curPlayer):  
 | 
    taskData = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ArrestTaskData % 1)  
 | 
    if not taskData:  
 | 
        #ÈôδˢйýÔòË¢ÐÂÈÎÎñ  
 | 
        __RefreshArrestTaskNPC(curPlayer)  
 | 
    #֪ͨ¿Í»§¶Ë¿É½ÓÐüÉÍÈÎÎñµÈ¼¶  
 | 
    Sync_ArrestTaskInfo(curPlayer)  
 | 
    return  
 | 
  
 | 
## ÐüÉÍÈÎÎñ¹¦ÄÜ¿ªÆô  
 | 
def DoArrestTaslOpen(curPlayer):  
 | 
    __RefreshArrestTaskNPC(curPlayer)  
 | 
    #֪ͨ¿Í»§¶Ë¿É½ÓÐüÉÍÈÎÎñµÈ¼¶  
 | 
    Sync_ArrestTaskInfo(curPlayer)  
 | 
    return  
 | 
  
 | 
## ÅжÏÍæ¼ÒÐüÉÍÈÎÎñ¹¦ÄÜÊÇ·ñ¿ªÆô  
 | 
#  @param curPlayer Íæ¼ÒʵÀý  
 | 
#  @return None  
 | 
def __IsArrestTaskFuncOpen(curPlayer):  
 | 
    # ÅжÏÍæ¼ÒÐüÉÍÈÎÎñ¹¦ÄÜÊÇ·ñ¿ªÆô  
 | 
    if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_ArrestTask):  
 | 
        return False  
 | 
    return True  
 | 
  
 | 
## Ë¢ÐÂÐüÉÍÈÎÎñ  
 | 
def OnRefreshArrestTask(index, clientData, tick):  
 | 
    # ¿ç·þ·þÎñÆ÷¹¦ÄÜÏÞÖÆ  
 | 
    if GameWorld.IsCrossServer():  
 | 
        return  
 | 
      
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  
 | 
      
 | 
    if not __IsArrestTaskFuncOpen(curPlayer):  
 | 
        GameWorld.DebugLog("OnRefreshArrestTask() ¹¦ÄÜ먦Æô")  
 | 
        return  
 | 
      
 | 
    if curPlayer.FindMission(ChConfig.Def_ArrestMissionID):  
 | 
        GameWorld.DebugLog("OnRefreshArrestTask Íæ¼ÒÒÑÓÐÐüÉÍÈÎÎñ")  
 | 
        return  
 | 
      
 | 
    if __IsArrestTaskFullCnt(curPlayer):  
 | 
        GameWorld.DebugLog("OnRefreshArrestTask Íæ¼Ò½ñÈÕÐüÉÍÈÎÎñ´ÎÊýÒÑ´ïÉÏÏÞ")  
 | 
        return  
 | 
      
 | 
    curArrestTaskStar = max(1, curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ArrestTaskStar))  # µ±Ç°ÐüÉÍÈÎÎñÐǼ¶  
 | 
      
 | 
    arrestTaskRefreshDict = ReadChConfig.GetEvalChConfig("ArrestTaskRefresh")  
 | 
    if curArrestTaskStar not in arrestTaskRefreshDict:  
 | 
        return  
 | 
      
 | 
    if curArrestTaskStar >= max(arrestTaskRefreshDict):  
 | 
        GameWorld.DebugLog("ÐüÉÍÈÎÎñÒÑÂú¼¶!")  
 | 
        return  
 | 
      
 | 
    refreshMoneyType = clientData.MoneyType #½ðÇ®ÀàÐÍ  
 | 
      
 | 
    costMoneyInfoDict = arrestTaskRefreshDict[curArrestTaskStar]  
 | 
      
 | 
    if refreshMoneyType not in costMoneyInfoDict:  
 | 
        GameWorld.DebugLog("OnRefreshArrestTask ArrestTaskRefresh.txt Î´ÅäÖøýðÇ®ÀàÐÍ curArrestTaskStar=%s,refreshMoneyType=%s" % (curArrestTaskStar, refreshMoneyType))  
 | 
        return  
 | 
      
 | 
  
 | 
    drDict = {"star":curArrestTaskStar}  
 | 
    
 | 
     
 | 
    upLvRate, moneyCnt, upLv, downLv = costMoneyInfoDict[refreshMoneyType]  
 | 
      
 | 
    if not PlayerControl.HaveMoney(curPlayer, refreshMoneyType, moneyCnt):  
 | 
        return  
 | 
      
 | 
      
 | 
    if GameWorld.CanHappen(upLvRate, ChConfig.Def_MaxRateValue):  
 | 
        arrestTaskLv = upLv  
 | 
    else:  
 | 
        arrestTaskLv = downLv  
 | 
      
 | 
    if arrestTaskLv <= 0 or arrestTaskLv > len(arrestTaskRefreshDict):  
 | 
        #ˢкóµÈ¼¶´íÎó  
 | 
        GameWorld.ErrLog("    OnRefreshArrestTask After arrestTaskLv = %s error!" % (arrestTaskLv))  
 | 
        return  
 | 
  
 | 
    drDict[ChConfig.Def_Cost_Reason_SonKey] = "Refresh"  
 | 
    PlayerControl.PayMoney(curPlayer, refreshMoneyType, moneyCnt, ChConfig.Def_Cost_RefreshArrestTask, drDict)  
 | 
      
 | 
    #ÉèÖÃÐüÉÍÈÎÎñµÈ¼¶  
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_ArrestTaskStar, arrestTaskLv)  
 | 
      
 | 
    #Ë¢ÐÂÈÎÎñ  
 | 
    __RefreshArrestTaskNPC(curPlayer)  
 | 
          
 | 
    #֪ͨ¿Í»§¶Ë¿É½ÓÐüÉÍÈÎÎñµÈ¼¶  
 | 
    Sync_ArrestTaskInfo(curPlayer)  
 | 
    GameWorld.DebugLog("    Ë¢Ð½á¹û: upLvRate=%s,updTruckLv=%s,drDict=%s"   
 | 
                       % (upLvRate, arrestTaskLv, drDict), curPlayer.GetPlayerID())   
 | 
    return  
 | 
  
 | 
## Ë¢ÐÂÈÎÎñ¹Ö  
 | 
def __RefreshArrestTaskNPC(curPlayer):  
 | 
    if not __IsArrestTaskFuncOpen(curPlayer):  
 | 
        GameWorld.DebugLog("OnRefreshArrestTask() ¹¦ÄÜ먦Æô")  
 | 
        return  
 | 
      
 | 
    arrestTaskRefreshDict = ReadChConfig.GetEvalChConfig("ArrestTaskRefresh")  
 | 
    needRefreshCnt = len(arrestTaskRefreshDict)  
 | 
    heroLV = curPlayer.GetLV()  
 | 
      
 | 
    arrestTaskNPCIDDict = ReadChConfig.GetEvalChConfig("ArrestTaskNPCID")  
 | 
    arrestTaskNPCIDList = sorted(arrestTaskNPCIDDict.iteritems(), key=lambda asd:asd[1])  
 | 
  
 | 
    findNPCIDList = []  
 | 
    for npcidList, needLV in arrestTaskNPCIDList:  
 | 
  
 | 
        if heroLV < needLV:  
 | 
            #µÍÓÚµØÍ¼½øÈëµÈ¼¶µÄ  
 | 
            break  
 | 
        isOver = False  
 | 
        for npcID, npcCnt in npcidList:  
 | 
            if len(findNPCIDList) < needRefreshCnt -1:  
 | 
                findNPCIDList.append([npcID, npcCnt])  
 | 
            else:  
 | 
                curNPC = GameWorld.GetGameData().FindNPCDataByID(npcID)  
 | 
                NPCLV = curNPC.GetLV()  
 | 
                #GameWorld.Log('npcID=%s, NPCLV=%s'%(npcID,NPCLV))  
 | 
                findNPCIDList.append([npcID, npcCnt])  
 | 
                  
 | 
                if heroLV < NPCLV:  
 | 
                    isOver = True  
 | 
                    break  
 | 
        if isOver:  
 | 
            break  
 | 
      
 | 
    if len(findNPCIDList) < needRefreshCnt:  
 | 
        GameWorld.DebugLog('    ÐüÉÍÈÎÎñˢРÊýÁ¿²»×ã%s¸ö£¬ findNPCIDList=%s' % (needRefreshCnt, findNPCIDList))  
 | 
        return  
 | 
    findNPCIDList = findNPCIDList[-needRefreshCnt:]  
 | 
      
 | 
    GameWorld.DebugLog('    ÐüÉÍÈÎÎñˢР findNPCIDList=%s' % (findNPCIDList))  
 | 
    #¼Ç¼Êý¾Ý  
 | 
    for i, npcinfo in enumerate(findNPCIDList):  
 | 
        npcID, npcCnt = npcinfo  
 | 
        taskData = __GetArrestTaskData(npcID, npcCnt)  
 | 
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_ArrestTaskData % (i+1), taskData)  
 | 
      
 | 
      
 | 
    return   
 | 
  
 | 
  
 | 
  
 | 
## Í¨Öª¿Í»§¶Ë¿É½ÓÐüÉÍÈÎÎñµÈ¼¶  
 | 
def Sync_ArrestTaskInfo(curPlayer):  
 | 
    if not __IsArrestTaskFuncOpen(curPlayer):  
 | 
        GameWorld.DebugLog("OnRefreshArrestTask() ¹¦ÄÜ먦Æô")  
 | 
        return  
 | 
    arrestTaskPack = ChPyNetSendPack.tagMCArrestTaskInfo()  
 | 
    arrestTaskPack.Clear()  
 | 
    arrestTaskPack.TaskStar = max(1, curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ArrestTaskStar))  
 | 
    arrestTaskPack.CompleteCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ArrestTaskFinishCnt)  
 | 
    arrestTaskPack.AwardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ArrestTaskAwardRecord)  
 | 
      
 | 
    arrestTaskPack.TaskDataList = []  
 | 
    arrestTaskRefreshDict = ReadChConfig.GetEvalChConfig("ArrestTaskRefresh")  
 | 
    arrestTaskPack.Count = len(arrestTaskRefreshDict)  
 | 
    for i in range(len(arrestTaskRefreshDict)):  
 | 
        taskData = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ArrestTaskData % (i+1))  
 | 
        arrestTaskPack.TaskDataList.append(taskData)  
 | 
    NetPackCommon.SendFakePack(curPlayer, arrestTaskPack)  
 | 
    return  
 | 
  
 | 
  
 | 
## ½ÓÐüÉÍÈÎÎñ  
 | 
def OnAcceptArrestTask(curPlayer):  
 | 
    # ¿ç·þ·þÎñÆ÷¹¦ÄÜÏÞÖÆ  
 | 
    if GameWorld.IsCrossServer():  
 | 
        return  
 | 
    if not __IsArrestTaskFuncOpen(curPlayer):  
 | 
        GameWorld.DebugLog("OnRefreshArrestTask() ¹¦ÄÜ먦Æô")  
 | 
        return  
 | 
    if curPlayer.FindMission(ChConfig.Def_ArrestMissionID):  
 | 
        GameWorld.DebugLog("OnAcceptArrestTask Íæ¼ÒÒÑÓÐÐüÉÍÈÎÎñ")  
 | 
        return  
 | 
      
 | 
    if __IsArrestTaskFullCnt(curPlayer):  
 | 
        GameWorld.DebugLog("OnAcceptArrestTask Íæ¼Ò½ñÈÕÐüÉÍÈÎÎñ´ÎÊýÒÑ´ïÉÏÏÞ")  
 | 
        return  
 | 
      
 | 
    taskStar = max(1, curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ArrestTaskStar))  
 | 
    taskData = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ArrestTaskData % taskStar)  
 | 
    npcid = __GetArrestTaskNPCID(taskData)  
 | 
    npcCnt = __GetArrestTaskNPCCnt(taskData)  
 | 
      
 | 
    curMission = QuestCommon.AddNewMission(curPlayer, ChConfig.Def_ArrestMissionID)  
 | 
      
 | 
    curMission.SetProperty(QuestCommon.Def_Kill_Npc_ID, npcid)  
 | 
    curMission.SetProperty(QuestCommon.Def_Kill_Npc_ID_Count, npcCnt)  
 | 
  
 | 
      
 | 
    QuestCommon.SetPlayerMissionState(curPlayer, curMission, 1)  
 | 
    curMission.SetMissionState(1)  
 | 
    #֪ͨ¿Í»§¶Ë  
 | 
    EventShell.NotifyOneMission(curPlayer, curMission)  
 | 
    GameWorld.DebugLog("½ÓÐüÉÍÈÎÎñ star=%s,npcid=%s,npcCnt=%s" % (taskStar, npcid, npcCnt))  
 | 
    return  
 | 
  
 | 
##»ñÈ¡ÅÜ»·ÈÎÎñ½±Àø  
 | 
# @param curPlayer Íæ¼ÒʵÀý  
 | 
# @param curMission ÈÎÎñʵÀý  
 | 
# @param isQuick ÊÇ·ñÒ»¼ü¿ìËÙÍê³É  
 | 
# @return curExp, curMoney, pfavalue  ÕÒ²»µ½·µ»ØNone  
 | 
def __GetArrestTaskReward(curPlayer, star):  
 | 
    reLV = curPlayer.GetLV()                    #²Î¿¼µÈ¼¶  
 | 
    reExp = PlayerControl.GetPlayerReExp(curPlayer) #²Î¿¼¾Ñé  
 | 
      
 | 
      
 | 
    ArrestTaskAwardDict = ReadChConfig.GetEvalChConfig("ArrestTaskAward")  
 | 
    curExp = eval(ArrestTaskAwardDict['Exp'])  
 | 
    curSoul = eval(ArrestTaskAwardDict['Soul'])  
 | 
    curPoint = eval(ArrestTaskAwardDict['Point'])  
 | 
    return curExp, curSoul, curPoint  
 | 
  
 | 
## ÐüÉÍÈÎÎñÍê³É ¸ø½±Àø  
 | 
def OnArrestTaskOver(curPlayer):  
 | 
    #»îÔ¾  
 | 
    #PlayerActivity.AddActivityFinishCnt(curPlayer, ShareDefine.ActivityNum_ArrestMission)  
 | 
      
 | 
    #½±Àø  
 | 
    curMission = curPlayer.FindMission(ChConfig.Def_ArrestMissionID)  
 | 
    taskStar = max(1, curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ArrestTaskStar))  
 | 
    exp, soul, point = __GetArrestTaskReward(curPlayer, taskStar)  
 | 
      
 | 
    playerControl = PlayerControl.PlayerControl(curPlayer)  
 | 
    if exp > 0:  
 | 
        playerControl.AddExp(exp)  
 | 
    #ÐüÉÍ»ý·Ö  
 | 
    if point:  
 | 
        PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_ArrestPoint, point, ChConfig.Def_GiveMoney_Mission)  
 | 
    if soul:  
 | 
        PlayerControl.PlayerAddZhenQi(curPlayer, soul, True, True, "Mission", {"MissionID":ChConfig.Def_ArrestMissionID})  
 | 
      
 | 
      
 | 
      
 | 
      
 | 
    #ÀÛ¼Ó´ÎÊý  
 | 
    finishCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ArrestTaskFinishCnt)  
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_ArrestTaskFinishCnt, finishCnt+1)  
 | 
      
 | 
    GameWorld.DebugLog("ÐüÉÍÈÎÎñ£º%d taskStar=%s, »ñµÃ¾Ñé:%d,»ý·Ö=%s,ÁéÁ¦=%s,finishCnt=%s"   
 | 
                       % (curMission.GetMissionID(), taskStar, exp, point, soul, finishCnt+1))  
 | 
      
 | 
    #ÖØÖÃ  
 | 
    OnDeleteArrestTask(curPlayer)  
 | 
    return  
 | 
  
 | 
## ·ÅÆúÈÎÎñºó´¦Àí  
 | 
def OnDeleteArrestTask(curPlayer):  
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_ArrestTaskStar, 1)  
 | 
    #Ë¢ÐÂÈÎÎñ  
 | 
    __RefreshArrestTaskNPC(curPlayer)  
 | 
    #֪ͨ¿Í»§¶Ë¿É½ÓÐüÉÍÈÎÎñµÈ¼¶  
 | 
    Sync_ArrestTaskInfo(curPlayer)  
 | 
    return  
 | 
  
 | 
## ÐüÉÍÈÎÎñ½ñÈÕ´ÎÊýÊÇ·ñÒÑÂú  
 | 
def __IsArrestTaskFullCnt(curPlayer):  
 | 
    finishCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ArrestTaskFinishCnt)  
 | 
    return finishCnt >= ReadChConfig.GetEvalChConfig("ArrestTaskMaxCnt")  
 | 
  
 | 
  
 | 
## ÁìÈ¡ÐüÉÍ»ý·Ö½±Àø  
 | 
def OnGetArrestPointAward(curPlayer, scoreIndex):  
 | 
    arrestPointPrizeList = ReadChConfig.GetEvalChConfig("ArrestPointPrize")  
 | 
    if scoreIndex < 0 or scoreIndex >= len(arrestPointPrizeList):  
 | 
        return  
 | 
    needScore, awardItemList = arrestPointPrizeList[scoreIndex]  
 | 
    curScore = PlayerControl.GetMoney(curPlayer, ShareDefine.TYPE_Price_ArrestPoint)  
 | 
    if curScore < needScore:  
 | 
        GameWorld.DebugLog('    ÁìÈ¡ÐüÉÍ»ý·Ö½±Àø, »ý·Ö²»×㣬curScore=%s,needScore=%s' % (curScore, needScore))  
 | 
        return  
 | 
    awardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ArrestTaskAwardRecord)  
 | 
    if awardRecord & pow(2, scoreIndex):  
 | 
        GameWorld.DebugLog('    ÁìÈ¡ÐüÉÍ»ý·Ö½±Àø, ÒÑÁìÈ¡¹ý£¬scoreIndex=%s' % (scoreIndex))  
 | 
        return  
 | 
      
 | 
    emptySpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem)  
 | 
    if emptySpace < len(awardItemList):  
 | 
        return  
 | 
      
 | 
    for itemID, itemCnt, isBind in awardItemList:  
 | 
            ItemControler.GivePlayerItem(curPlayer, itemID, itemCnt, 0, [IPY_GameWorld.rptItem, IPY_GameWorld.rptAnyWhere])  
 | 
      
 | 
    #¸üмǼ  
 | 
    awardRecord |= pow(2, scoreIndex)  
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_ArrestTaskAwardRecord, awardRecord)  
 | 
      
 | 
    Sync_ArrestTaskInfo(curPlayer)  
 | 
    return  
 | 
  
 | 
  
 | 
## »ñÈ¡ÐüÉÍÈÎÎñÊý¾Ý   
 | 
def __GetArrestTaskData(npcid, npcCnt):return npcid + npcCnt * 100000  
 | 
def __GetArrestTaskNPCID(taskData):return taskData % 100000  
 | 
def __GetArrestTaskNPCCnt(taskData):return taskData / 100000  
 |