#!/usr/bin/python  
 | 
# -*- coding: GBK -*-  
 | 
#-------------------------------------------------------------------------------  
 | 
#  
 | 
#-------------------------------------------------------------------------------  
 | 
#  
 | 
##@package Player.PlayerLuckyTreasure  
 | 
#  
 | 
# @todo:ÐÒÔ˼ø±¦  
 | 
# @author xdh  
 | 
# @date 2019-2-12 19:50  
 | 
# @version 1.0  
 | 
#  
 | 
#  
 | 
# ÏêϸÃèÊö: ÐÒÔ˼ø±¦  
 | 
#  
 | 
#---------------------------------------------------------------------  
 | 
"""Version = 2019-2-12 19:50"""  
 | 
#---------------------------------------------------------------------  
 | 
  
 | 
import IPY_GameWorld  
 | 
import GameWorld  
 | 
import ChConfig  
 | 
import IpyGameDataPY  
 | 
import PlayerControl  
 | 
import ChPyNetSendPack  
 | 
import NetPackCommon  
 | 
import ShareDefine  
 | 
import PyGameData  
 | 
import ItemControler  
 | 
import ItemCommon  
 | 
  
 | 
  
 | 
  
 | 
def OnLogin(curPlayer):  
 | 
    isReset = __CheckPlayerLuckyTreasureAction(curPlayer)  
 | 
    if not isReset:  
 | 
        actCostRebateInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_LuckyTreasure, {})  
 | 
        # »î¶¯ÖÐͬ²½»î¶¯ÐÅÏ¢  
 | 
        if actCostRebateInfo.get(ShareDefine.ActKey_State):  
 | 
            SyncLuckyTreasureInfo(curPlayer)  
 | 
            SyncLuckyTreasureResultInfo(curPlayer)  
 | 
          
 | 
    return  
 | 
  
 | 
def RefreshLuckyTreasureAction():  
 | 
    __InitLuckyTreasureRateList()  
 | 
    playerManager = GameWorld.GetPlayerManager()  
 | 
    for i in xrange(playerManager.GetPlayerCount()):  
 | 
        curPlayer = playerManager.GetPlayerByIndex(i)  
 | 
        if curPlayer == None or not curPlayer.GetInitOK():  
 | 
            continue  
 | 
        __CheckPlayerLuckyTreasureAction(curPlayer)  
 | 
    return  
 | 
  
 | 
def __CheckPlayerLuckyTreasureAction(curPlayer):  
 | 
    ## ¼ì²éÍæ¼ÒÐÒÔ˼ø±¦»î¶¯Êý¾ÝÐÅÏ¢  
 | 
    global g_randomWellDict  
 | 
  
 | 
    playerID = curPlayer.GetPlayerID()  
 | 
      
 | 
    actLuckyTreasureInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_LuckyTreasure, {})  
 | 
    LuckyTreasureID = actLuckyTreasureInfo.get(ShareDefine.ActKey_ID, 0)  
 | 
    state = actLuckyTreasureInfo.get(ShareDefine.ActKey_State, 0)  
 | 
    #cfgID = actLuckyTreasureInfo.get(ShareDefine.ActKey_CfgID, 0)  
 | 
    worldLV = actLuckyTreasureInfo.get(ShareDefine.ActKey_WorldLV, 0)  
 | 
    playerLuckyTreasureID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LuckyTreasureID)  # Íæ¼ÒÉíÉϵĻID  
 | 
      
 | 
    # »î¶¯ID ÏàͬµÄ»°²»´¦Àí  
 | 
    if LuckyTreasureID == playerLuckyTreasureID:  
 | 
        #GameWorld.DebugLog("ÐÒÔ˼ø±¦»î¶¯ID²»±ä£¬²»´¦Àí£¡", curPlayer.GetPlayerID())  
 | 
        return  
 | 
    msgStr = str([ShareDefine.Def_UniversalGameRecType_LuckyTreasure, 2])  
 | 
    GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, 'DelUniversalGameRec', msgStr, len(msgStr))  
 | 
    GameWorld.DebugLog("ÐÒÔ˼ø±¦ÖØÖÃ! LuckyTreasureID=%s,playerLuckyTreasureID=%s,state=%s,worldLv=%s"   
 | 
                       % (LuckyTreasureID, playerLuckyTreasureID, state, worldLV), playerID)  
 | 
      
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_LuckyTreasureID, LuckyTreasureID)  
 | 
      
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_LuckyTreasureFree, 0)  
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_LuckyTreasurePoint, 0)  
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_LuckyTreasureCnt, 0)  
 | 
      
 | 
      
 | 
    SyncLuckyTreasureInfo(curPlayer)  
 | 
    SyncLuckyTreasureResultInfo(curPlayer)  
 | 
    return True  
 | 
  
 | 
def __InitLuckyTreasureRateList():  
 | 
    global g_itemRateList  
 | 
    actLuckyTreasureInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_LuckyTreasure, {})  
 | 
    state = actLuckyTreasureInfo.get(ShareDefine.ActKey_State, 0)  
 | 
    cfgID = actLuckyTreasureInfo.get(ShareDefine.ActKey_CfgID, 0)  
 | 
    worldLV = actLuckyTreasureInfo.get(ShareDefine.ActKey_WorldLV, 0)  
 | 
    if not cfgID or not worldLV or not state:  
 | 
        return  
 | 
    actIpyData = IpyGameDataPY.GetIpyGameData("ActLuckyTreasure", cfgID)  
 | 
    if not actIpyData:  
 | 
        return  
 | 
    templateID = actIpyData.GetTemplateID()  
 | 
    ipyDataList = IpyGameDataPY.GetIpyGameDataList('LuckyTreasureTemplate', templateID)  
 | 
    if not ipyDataList:  
 | 
        return  
 | 
    tWeight = 0  
 | 
    g_itemRateList = []  
 | 
    for ipyData in ipyDataList:  
 | 
        worldLVLimit = ipyData.GetWorldLVLimit()  
 | 
        if worldLV < worldLVLimit[0] or worldLV > worldLVLimit[1]:  
 | 
            continue  
 | 
        itemID = ipyData.GetItemID()  
 | 
        itemCnt = ipyData.GetItemCnt()  
 | 
        isBind = ipyData.GetIsBind()  
 | 
        weight = ipyData.GetWeight()  
 | 
        tWeight += weight  
 | 
        g_itemRateList.append([tWeight, [itemID, itemCnt, isBind]])  
 | 
    return  
 | 
  
 | 
def __GetRandomRateList():  
 | 
    if not g_itemRateList:  
 | 
        __InitLuckyTreasureRateList()  
 | 
    return g_itemRateList  
 | 
  
 | 
  
 | 
#// AA 08 ¿ªÊ¼ÐÒÔ˼ø±¦ #tagCMStartLuckyTreasure  
 | 
#struct    tagCMStartLuckyTreasure  
 | 
#{  
 | 
#    tagHead        Head;  
 | 
#};  
 | 
def OnStartLuckyTreasure(index, clientData, tick):  
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  
 | 
    actBossRebornInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_LuckyTreasure, {})  
 | 
    state = actBossRebornInfo.get(ShareDefine.ActKey_State, 0)  
 | 
    cfgID = actBossRebornInfo.get(ShareDefine.ActKey_CfgID, 0)  
 | 
    if not state or not cfgID:  
 | 
        return  
 | 
    actIpyData = IpyGameDataPY.GetIpyGameData("ActLuckyTreasure", cfgID)  
 | 
    if not actIpyData:  
 | 
        return  
 | 
      
 | 
    hasFree = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LuckyTreasureFree)  
 | 
    if hasFree:  
 | 
        costMoney = IpyGameDataPY.GetFuncCfg('LuckyAppraisal')  
 | 
        if not PlayerControl.HaveMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Money, costMoney):  
 | 
            return  
 | 
    # ¼ì²é±³°ü  
 | 
    needSpace = 1  
 | 
    packSpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem, needSpace)  
 | 
    if needSpace > packSpace:  
 | 
        PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_998371")  
 | 
        return  
 | 
      
 | 
    randomRateList = __GetRandomRateList()  
 | 
    if not randomRateList:  
 | 
        return  
 | 
    greatItem = randomRateList[-1][1]  
 | 
      
 | 
    curLuckyPoint = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LuckyTreasurePoint)  
 | 
    curLuckyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LuckyTreasureCnt)  
 | 
      
 | 
    maxLuckyPoint = actIpyData.GetLuckyPoint()  
 | 
    singlePoint = IpyGameDataPY.GetFuncCfg('LuckyAppraisal', 2)  
 | 
    if curLuckyPoint + singlePoint >= maxLuckyPoint:  
 | 
        giveItem = greatItem  
 | 
        newLuckyPoint = 0  
 | 
    else:  
 | 
        if curLuckyCnt < IpyGameDataPY.GetFuncCfg('LuckyAppraisal', 3):  
 | 
            #ǰX´Î¼ø±¦²»Äܳö´ó½±  
 | 
            randomResultList = GameWorld.GetResultByRandomListEx(randomRateList[:-1], 1, [])  
 | 
        else:  
 | 
            randomResultList = GameWorld.GetResultByRandomListEx(randomRateList, 1, [])  
 | 
        if len(randomResultList) != 1:  
 | 
            GameWorld.DebugLog('    ¿ªÊ¼ÐÒÔ˼ø±¦ Ëæ»ú¿â½á¹û »ñÈ¡´íÎ󠣡')  
 | 
            return  
 | 
        giveItem = randomResultList[0]  
 | 
    if giveItem == greatItem:  
 | 
        newLuckyPoint = 0  
 | 
        playerName = curPlayer.GetName()  
 | 
        PlayerControl.WorldNotify(0, 'LuckyAppraisal_1', [playerName, greatItem[0]])  
 | 
        msgStr = str([ShareDefine.Def_UniversalGameRecType_LuckyTreasure, [], [curPlayer.GetName()], 2, 0])  
 | 
        GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, 'AddUniversalGameRec', msgStr, len(msgStr))  
 | 
  
 | 
    else:  
 | 
        newLuckyPoint = curLuckyPoint + singlePoint  
 | 
    if hasFree:  
 | 
        PlayerControl.PayMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Money, costMoney, ChConfig.Def_Cost_LuckyTreasure)  
 | 
    else:  
 | 
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_LuckyTreasureFree, 1)  
 | 
    #¸üÐÂÐÒÔËÖµ  
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_LuckyTreasurePoint, newLuckyPoint)  
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_LuckyTreasureCnt, curLuckyCnt + 1)  
 | 
      
 | 
    for itemID, itemCount, isBind in [giveItem]:  
 | 
        ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, 0, [IPY_GameWorld.rptItem], event=[ChConfig.ItemGive_LuckyTreasure, False, {"isFree":not hasFree}])  
 | 
      
 | 
    SyncLuckyTreasureResultInfo(curPlayer, giveItem)  
 | 
    return  
 | 
  
 | 
  
 | 
def SyncLuckyTreasureInfo(curPlayer):  
 | 
    ##ͬ²½ÐÒÔ˼ø±¦»î¶¯ÐÅÏ¢  
 | 
    actBossRebornInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_LuckyTreasure, {})  
 | 
    state = actBossRebornInfo.get(ShareDefine.ActKey_State, 0)  
 | 
    cfgID = actBossRebornInfo.get(ShareDefine.ActKey_CfgID, 0)  
 | 
    if not state or not cfgID:  
 | 
        return  
 | 
    actIpyData = IpyGameDataPY.GetIpyGameData("ActLuckyTreasure", cfgID)  
 | 
    if not actIpyData:  
 | 
        return  
 | 
    openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay) + 1  
 | 
    actInfo = ChPyNetSendPack.tagMCLuckyTreasureInfo()  
 | 
    actInfo.Clear()  
 | 
    actInfo.StartDate = GameWorld.GetOperationActionDateStr(actIpyData.GetStartDate(), openServerDay)  
 | 
    actInfo.EndtDate = GameWorld.GetOperationActionDateStr(actIpyData.GetEndDate(), openServerDay)  
 | 
    actInfo.ResetType = actIpyData.GetResetType()  
 | 
    actInfo.LimitLV = actIpyData.GetLVLimit()  
 | 
    actInfo.LuckyPoint = actIpyData.GetLuckyPoint()  
 | 
    actInfo.ItemList = []  
 | 
    randomItemList = __GetRandomRateList()  
 | 
    for itemInfo in randomItemList:  
 | 
        itemID, itemCnt, isBind = itemInfo[1]  
 | 
        wellItemInfo = ChPyNetSendPack.tagMCLuckyTreasureItem()  
 | 
        wellItemInfo.ItemID = itemID  
 | 
        wellItemInfo.ItemCnt = itemCnt  
 | 
        wellItemInfo.IsBind = isBind  
 | 
        actInfo.ItemList.append(wellItemInfo)  
 | 
    actInfo.Count = len(actInfo.ItemList)  
 | 
    NetPackCommon.SendFakePack(curPlayer, actInfo)  
 | 
    return  
 | 
  
 | 
  
 | 
def SyncLuckyTreasureResultInfo(curPlayer, itemInfo=[]):  
 | 
    ##ͬ²½ÐÒÔ˼ø±¦Íæ¼ÒÐÅÏ¢  
 | 
    packInfo = ChPyNetSendPack.tagMCLuckyTreasureResultInfo()  
 | 
    packInfo.Clear()  
 | 
    packInfo.LuckyPoint = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LuckyTreasurePoint)  
 | 
    packInfo.HasFree = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LuckyTreasureFree)  
 | 
    if itemInfo:  
 | 
        packInfo.ItemID = itemInfo[0]  
 | 
        packInfo.ItemCnt = itemInfo[1]  
 | 
        packInfo.IsBind = itemInfo[2]  
 | 
    NetPackCommon.SendFakePack(curPlayer, packInfo)  
 | 
    return  
 |