#!/usr/bin/python  
 | 
# -*- coding: GBK -*-  
 | 
#-------------------------------------------------------------------------------  
 | 
#  
 | 
##@package Player.PlayerLianTi  
 | 
#  
 | 
# @todo:Á¶Ìå  
 | 
# @author hxp  
 | 
# @date 2022-22-23  
 | 
# @version 1.0  
 | 
#  
 | 
# ÏêϸÃèÊö: Á¶Ìå  
 | 
#  
 | 
#-------------------------------------------------------------------------------  
 | 
#"""Version = 2022-22-23 15:30"""  
 | 
#-------------------------------------------------------------------------------  
 | 
  
 | 
import GameWorld  
 | 
import IpyGameDataPY  
 | 
import PlayerControl  
 | 
import FunctionNPCCommon  
 | 
import ChPyNetSendPack  
 | 
import NetPackCommon  
 | 
import ItemCommon  
 | 
import ChConfig  
 | 
import SkillCommon  
 | 
  
 | 
def DoLianTiOpen(curPlayer):  
 | 
    ## ¹¦ÄÜ¿ªÆô  
 | 
    lianTiLV = 1  
 | 
    ipyData = IpyGameDataPY.GetIpyGameData("LianTi", lianTiLV)  
 | 
    if not ipyData:  
 | 
        return  
 | 
      
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_LianTiLV, lianTiLV)  
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_LianTiEatItemCount, 0)  
 | 
      
 | 
    GameWorld.DebugLog("Á¶Ì幦ÄÜ¿ªÆô! lianTiLV=%s" % lianTiLV)  
 | 
    SyncLianTiInfo(curPlayer)  
 | 
    RefreshLianTiAttr(curPlayer)  
 | 
    return True  
 | 
  
 | 
def OnPlayerLogin(curPlayer):  
 | 
    if not curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LianTiLV):  
 | 
        return  
 | 
    SyncLianTiInfo(curPlayer)  
 | 
    return  
 | 
  
 | 
#// A5 33 Á¶ÌåÌáÉý #tagCMLianTiUp  
 | 
#  
 | 
#struct    tagCMLianTiUp  
 | 
#{  
 | 
#    tagHead        Head;  
 | 
#    DWORD        UseItemCnt;    //ÏûºÄ²ÄÁϸöÊý  
 | 
#    BYTE        IsAutoBuy;    //ÊÇ·ñ×Ô¶¯¹ºÂò  
 | 
#};  
 | 
def OnLianTiUp(index, clientData, tick):  
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  
 | 
    costItemCount = clientData.UseItemCnt # ÏûºÄ²ÄÁϸöÊý  
 | 
    isAutoBuy = clientData.IsAutoBuy # ÊÇ·ñ×Ô¶¯¹ºÂò  
 | 
      
 | 
    lianTiLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LianTiLV)  
 | 
    curEatItemCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LianTiEatItemCount)  
 | 
      
 | 
    if not lianTiLV:  
 | 
        return  
 | 
      
 | 
    ipyData = IpyGameDataPY.GetIpyGameData("LianTi", lianTiLV)  
 | 
    if not ipyData:  
 | 
        return  
 | 
      
 | 
    needEatCount = ipyData.GetNeedEatCount()  
 | 
    if not needEatCount:  
 | 
        GameWorld.DebugLog("Á¶ÌåÒÑÂú¼¶£¡ lianTiLV=%s" % lianTiLV)  
 | 
        return  
 | 
          
 | 
    if curEatItemCount >= needEatCount:  
 | 
        GameWorld.DebugLog("±¾¼¶ÒѳÔÂú£¡ lianTiLV=%s,curEatItemCount=%s >= %s" % (lianTiLV, curEatItemCount, needEatCount))  
 | 
        return  
 | 
      
 | 
    costItemID = IpyGameDataPY.GetFuncCfg("LianTiUpItem", 1)  
 | 
    if not costItemID or not costItemCount:  
 | 
        return  
 | 
      
 | 
    costItemIndexList, bindCnt, unBindCnt = ItemCommon.GetPackItemBindStateIndexInfo(curPlayer, costItemID, costItemCount)  
 | 
    lackCnt = costItemCount - bindCnt - unBindCnt  
 | 
    if lackCnt > 0 and not isAutoBuy:  
 | 
        GameWorld.DebugLog("µÀ¾ß²»×㣬ÎÞ·¨ÌáÉýÁ¶Ìå! costItemID=%s,costItemCount=%s,bindCnt=%s,unBindCnt=%s,lackCnt=%s"   
 | 
                           % (costItemID, costItemCount, bindCnt, unBindCnt, lackCnt))  
 | 
        return  
 | 
      
 | 
    delCnt = costItemCount  
 | 
    if lackCnt > 0:  
 | 
        autoBuyMoneyType = IpyGameDataPY.GetFuncCfg("LianTiUpItem", 2)  
 | 
        if not autoBuyMoneyType:  
 | 
            return  
 | 
        infoDict = {ChConfig.Def_Cost_Reason_SonKey:costItemID}  
 | 
        if not FunctionNPCCommon.PayAutoBuyItem(curPlayer, {costItemID:lackCnt}, autoBuyMoneyType, ChConfig.Def_Cost_LianTi, infoDict):  
 | 
            return  
 | 
        delCnt -= lackCnt  
 | 
          
 | 
    # ¿Û³ýÏûºÄ  
 | 
    if delCnt:  
 | 
        ItemCommon.DelCostItemByBind(curPlayer, costItemIndexList, bindCnt, unBindCnt, delCnt, ChConfig.ItemDel_LianTi)  
 | 
          
 | 
    updEatItemCount = curEatItemCount + costItemCount  
 | 
    GameWorld.DebugLog("Á¶ÌåÌáÉý: lianTiLV=%s,curEatItemCount=%s,costItemCount=%s,updEatItemCount=%s,needEatCount=%s"   
 | 
                       % (lianTiLV, curEatItemCount, costItemCount, updEatItemCount, needEatCount))  
 | 
      
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_LianTiEatItemCount, updEatItemCount)  
 | 
      
 | 
    SyncLianTiInfo(curPlayer)  
 | 
    RefreshLianTiAttr(curPlayer)  
 | 
    return  
 | 
  
 | 
#// A5 34 Á¶ÌåÍ»ÆÆ #tagCMLianTiLVUp  
 | 
#  
 | 
#struct    tagCMLianTiLVUp  
 | 
#{  
 | 
#    tagHead        Head;  
 | 
#};  
 | 
def OnLianTiLVUp(index, clientData, tick):  
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  
 | 
          
 | 
    lianTiLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LianTiLV)  
 | 
    curEatItemCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LianTiEatItemCount)  
 | 
      
 | 
    if not lianTiLV:  
 | 
        return  
 | 
      
 | 
    ipyData = IpyGameDataPY.GetIpyGameData("LianTi", lianTiLV)  
 | 
    if not ipyData:  
 | 
        return  
 | 
      
 | 
    needEatCount = ipyData.GetNeedEatCount()  
 | 
    if not needEatCount:  
 | 
        GameWorld.DebugLog("Á¶ÌåÒÑÂú¼¶£¡ lianTiLV=%s" % lianTiLV)  
 | 
        return  
 | 
      
 | 
    if curEatItemCount < needEatCount:  
 | 
        GameWorld.DebugLog("Á¶ÌåÅàÑøÎïÆ·¸öÊý²»×㣬ÎÞ·¨Í»ÆÆ£¡ lianTiLV=%s,curEatItemCount=%s < %s" % (lianTiLV, curEatItemCount, needEatCount))  
 | 
        return  
 | 
      
 | 
    costItemInfo = ipyData.GetLVUpCostItemInfo()  
 | 
    if not costItemInfo or len(costItemInfo) != 2:  
 | 
        return  
 | 
    costItemID, costItemCount = costItemInfo  
 | 
    if not costItemID or not costItemCount:  
 | 
        return  
 | 
    costItemIndexList, bindCnt, unBindCnt = ItemCommon.GetPackItemBindStateIndexInfo(curPlayer, costItemID, costItemCount)  
 | 
    lackCnt = costItemCount - bindCnt - unBindCnt  
 | 
    if lackCnt > 0:  
 | 
        GameWorld.DebugLog("µÀ¾ß²»×㣬ÎÞ·¨Í»ÆÆÁ¶Ìå! costItemID=%s,costItemCount=%s,bindCnt=%s,unBindCnt=%s,lackCnt=%s"   
 | 
                           % (costItemID, costItemCount, bindCnt, unBindCnt, lackCnt))  
 | 
        return  
 | 
      
 | 
    nextLianTiLv = lianTiLV + 1  
 | 
    nextIpyData = IpyGameDataPY.GetIpyGameDataNotLog("LianTi", nextLianTiLv)  
 | 
    if not nextIpyData:  
 | 
        return  
 | 
      
 | 
    curRealmLV = curPlayer.GetOfficialRank()  
 | 
    if nextLianTiLv > curRealmLV:  
 | 
        GameWorld.DebugLog("Á¶ÌåÍ»ÆÆ²»Äܳ¬¹ýµ±Ç°¾³½ç! nextLianTiLv=%s > curRealmLV(%s)" % (nextLianTiLv, curRealmLV))  
 | 
        return  
 | 
      
 | 
    # ¿Û³ýÏûºÄ  
 | 
    ItemCommon.DelCostItemByBind(curPlayer, costItemIndexList, bindCnt, unBindCnt, costItemCount, ChConfig.ItemDel_LianTi)  
 | 
      
 | 
    updEatItemCount = curEatItemCount - needEatCount  
 | 
    activateSkillID = nextIpyData.GetActivateSkillID()  
 | 
    GameWorld.DebugLog("Á¶ÌåÍ»ÆÆ: lianTiLV=%s,curEatItemCount=%s,needEatCount=%s,updEatItemCount=%s,nextLianTiLv=%s,activateSkillID=%s"   
 | 
                       % (lianTiLV, curEatItemCount, needEatCount, updEatItemCount, nextLianTiLv, activateSkillID))  
 | 
      
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_LianTiLV, nextLianTiLv)  
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_LianTiEatItemCount, updEatItemCount)  
 | 
      
 | 
    if activateSkillID:  
 | 
        SkillCommon.GivePlayerSkillByJobSkill(curPlayer, [activateSkillID])  
 | 
          
 | 
    SyncLianTiInfo(curPlayer)  
 | 
    RefreshLianTiAttr(curPlayer)  
 | 
    return  
 | 
  
 | 
def RefreshLianTiAttr(curPlayer):  
 | 
    CalcLianTiAttr(curPlayer)  
 | 
    PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState()  
 | 
    return  
 | 
  
 | 
def CalcLianTiAttr(curPlayer):  
 | 
      
 | 
    lianTiLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LianTiLV)  
 | 
    if not lianTiLV:  
 | 
        return  
 | 
      
 | 
    allAttrList = [{} for _ in range(4)]  
 | 
      
 | 
    ipyDataMgr = IpyGameDataPY.IPY_Data()  
 | 
    for index in xrange(ipyDataMgr.GetLianTiCount()):  
 | 
        lvupIpyData = ipyDataMgr.GetLianTiByIndex(index)  
 | 
        dataLV = lvupIpyData.GetLianTiLV()  
 | 
        if dataLV > lianTiLV:  
 | 
            break  
 | 
          
 | 
        upItemCount = lvupIpyData.GetNeedEatCount()  
 | 
        if dataLV == lianTiLV:  
 | 
            upItemCount = min(curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LianTiEatItemCount), upItemCount)  
 | 
        #GameWorld.DebugLog("dataLV=%s,upItemCount=%s" % (dataLV, upItemCount))  
 | 
          
 | 
        # ¹Ì¶¨ÊôÐÔ  
 | 
        fixedAttrTypeList = lvupIpyData.GetFixedAttrType()  
 | 
        fixedAttrValueList = lvupIpyData.GetFixedAttrValue()  
 | 
        for i, attrID in enumerate(fixedAttrTypeList):  
 | 
            attrValue = fixedAttrValueList[i] if len(fixedAttrValueList) > i else 0  
 | 
            PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrList)  
 | 
            #GameWorld.DebugLog("    %s, attrID=%s,attrValue=%s,%s" % (i, attrID, attrValue, allAttrList))  
 | 
              
 | 
        # ÅàÑøµ¤Ôö¼ÓÊôÐÔ  
 | 
        upItemPerCount = lvupIpyData.GetEatPerCount()  
 | 
        if upItemCount and upItemPerCount:  
 | 
            upItemAttrTypeList = lvupIpyData.GetEatItemAttrType()  
 | 
            upItemAttrValueList = lvupIpyData.GetEatItemAttrValue()  
 | 
            attrMultiple = upItemCount / upItemPerCount  
 | 
            #GameWorld.DebugLog("    upItemCount=%s,upItemPerCount=%s,attrMultiple=%s" % (upItemCount, upItemPerCount, attrMultiple))  
 | 
            for i, attrID in enumerate(upItemAttrTypeList):  
 | 
                attrValue = upItemAttrValueList[i] if len(upItemAttrValueList) > i else 0  
 | 
                attrValue *= attrMultiple  
 | 
                PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrList)  
 | 
                #GameWorld.DebugLog("    %s, attrID=%s,attrValue=%s,%s" % (i, attrID, attrValue, allAttrList))  
 | 
                  
 | 
        # ÔöÇ¿ÊôÐÔÍò·ÖÂÊÀÛ¼Ó  
 | 
        plusAttrTypeList = lvupIpyData.GetPlusAttrType()  
 | 
        plusAttrRateList = lvupIpyData.GetPlusAttrRate()  
 | 
        for i, attrID in enumerate(plusAttrTypeList):  
 | 
            attrValue = plusAttrRateList[i] if len(plusAttrRateList) > i else 0  
 | 
            PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrList)  
 | 
              
 | 
    #GameWorld.DebugLog("    allAttrList=%s" % allAttrList)  
 | 
    # ±£´æ¼ÆËãÖµ  
 | 
    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_LianTi, allAttrList)  
 | 
    return  
 | 
  
 | 
def SyncLianTiInfo(curPlayer):  
 | 
    clientPack = ChPyNetSendPack.tagMCLianTiInfo()  
 | 
    clientPack.LianTiLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LianTiLV)  
 | 
    clientPack.EatItemCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LianTiEatItemCount)  
 | 
    NetPackCommon.SendFakePack(curPlayer, clientPack)  
 | 
    return  
 |