#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#-------------------------------------------------------------------------------
|
#
|
##@package Player.PlayerGubao
|
#
|
# @todo:¹Å±¦ÏµÍ³
|
# @author hxp
|
# @date 2023-01-05
|
# @version 1.0
|
#
|
# ÏêϸÃèÊö: ¹Å±¦ÏµÍ³
|
#
|
#-------------------------------------------------------------------------------
|
#"""Version = 2023-01-05 15:30"""
|
#-------------------------------------------------------------------------------
|
|
import GameWorld
|
import ItemCommon
|
import SkillCommon
|
import PlayerControl
|
import IpyGameDataPY
|
import ChPyNetSendPack
|
import NetPackCommon
|
import IPY_GameWorld
|
import ChConfig
|
|
def GetGubaoLVInfo(curPlayer, gubaoID):
|
lvInfo = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GubaoLVInfo % gubaoID)
|
lv = lvInfo / 100
|
star = lvInfo % 100
|
return lv, star
|
def SetGubaoLVInfo(curPlayer, gubaoID, lv, star):
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GubaoLVInfo % gubaoID, lv * 100 + star)
|
return
|
|
def OnPlayerLogin(curPlayer):
|
Sync_GubaoInfo(curPlayer)
|
return
|
|
#// B2 16 ¹Å±¦¼¤»î #tagCMGubaoActivate
|
#
|
#struct tagCMGubaoActivate
|
#{
|
# tagHead Head;
|
# WORD GubaoID;
|
#};
|
def OnGubaoActivate(index, curPackData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
playerID = curPlayer.GetPlayerID()
|
gubaoID = curPackData.GubaoID
|
ipyData = IpyGameDataPY.GetIpyGameData("Gubao", gubaoID)
|
if not ipyData:
|
return
|
needItemID = ipyData.GetUnlockItemID()
|
needItemCnt = ipyData.GetUnlockItemCnt()
|
if not needItemID or not needItemCnt:
|
return
|
|
lv, star = GetGubaoLVInfo(curPlayer, gubaoID)
|
if lv or star:
|
GameWorld.DebugLog("¹Å±¦ÒѾ¼¤»î¹ý£¡ gubaoID=%s" % gubaoID, playerID)
|
return
|
|
itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
|
hasEnough, itemList = ItemCommon.GetItem_FromPack_ByID(needItemID, itemPack, needItemCnt)
|
if not hasEnough:
|
GameWorld.DebugLog("¼¤»î¹Å±¦µÀ¾ß²»×ã! needItemID=%s,needItemCnt=%s" % (needItemID, needItemCnt), playerID)
|
return
|
ItemCommon.ReduceItem(curPlayer, itemPack, itemList, needItemCnt, False, "Gubao")
|
|
lv, star = 1, 1
|
SetGubaoLVInfo(curPlayer, gubaoID, lv, star)
|
GameWorld.Log("¹Å±¦¼¤»î³É¹¦£¡ gubaoID=%s" % gubaoID, playerID)
|
giveSkillIDInfo = ipyData.GetGiveSkillIDInfo()
|
if giveSkillIDInfo:
|
SkillCommon.GivePlayerSkillByJobSkill(curPlayer, giveSkillIDInfo)
|
|
RefreshGubaoAttr(curPlayer)
|
Sync_GubaoInfo(curPlayer, [gubaoID])
|
return
|
|
#// B2 17 ¹Å±¦ÉýÐÇ #tagCMGubaoStarUp
|
#
|
#struct tagCMGubaoStarUp
|
#{
|
# tagHead Head;
|
# WORD GubaoID;
|
#};
|
def OnGubaoStarUp(index, curPackData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
playerID = curPlayer.GetPlayerID()
|
gubaoID = curPackData.GubaoID
|
|
lv, star = GetGubaoLVInfo(curPlayer, gubaoID)
|
if not star:
|
GameWorld.DebugLog("¹Å±¦Î´¼¤»î£¬ÎÞ·¨ÉýÐÇ£¡ gubaoID=%s" % gubaoID, playerID)
|
return
|
|
if not IpyGameDataPY.GetIpyGameDataNotLog("GubaoStar", gubaoID, star + 1):
|
GameWorld.DebugLog("¹Å±¦ÒÑÂúÐÇ£¡ gubaoID=%s,star=%s" % (gubaoID, star), playerID)
|
return
|
|
ipyData = IpyGameDataPY.GetIpyGameData("GubaoStar", gubaoID, star)
|
if not ipyData:
|
return
|
needItemList = ipyData.GetStarUPNeedItemInfo()
|
if not needItemList:
|
return
|
|
itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
|
lackItemDict, delInfoDict = ItemCommon.GetCostItemIndexList(needItemList, itemPack)
|
if lackItemDict:
|
GameWorld.DebugLog("¹Å±¦ÉýÐÇËùÐèÎïÆ·²»×㣡 star=%s,needItemList=%s,lackItemDict=%s" % (star, needItemList, lackItemDict), playerID)
|
return
|
#¿ÛÏûºÄ
|
ItemCommon.DelCostItem(curPlayer, itemPack, delInfoDict, "Gubao")
|
|
updStar = star + 1
|
SetGubaoLVInfo(curPlayer, gubaoID, lv, updStar)
|
GameWorld.Log("¹Å±¦ÉýÐÇ: gubaoID=%s,updStar=%s" % (gubaoID, updStar), playerID)
|
RefreshGubaoAttr(curPlayer)
|
Sync_GubaoInfo(curPlayer, [gubaoID])
|
return
|
|
#// B2 18 ¹Å±¦Éý¼¶ #tagCMGubaoLVUp
|
#
|
#struct tagCMGubaoLVUp
|
#{
|
# tagHead Head;
|
# WORD GubaoID;
|
#};
|
def OnGubaoLVUp(index, curPackData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
playerID = curPlayer.GetPlayerID()
|
gubaoID = curPackData.GubaoID
|
|
lv, star = GetGubaoLVInfo(curPlayer, gubaoID)
|
if not star:
|
GameWorld.DebugLog("¹Å±¦Î´¼¤»î£¬ÎÞ·¨Éý¼¶£¡ gubaoID=%s" % gubaoID, playerID)
|
return
|
|
ipyData = IpyGameDataPY.GetIpyGameData("Gubao", gubaoID)
|
if not ipyData:
|
return
|
quality = ipyData.GetGubaoQuality()
|
|
if not IpyGameDataPY.GetIpyGameDataNotLog("GubaoLV", quality, lv + 1):
|
GameWorld.DebugLog("¹Å±¦ÒÑÂú¼¶£¡ gubaoID=%s,quality=%s,lv=%s" % (gubaoID, quality, lv), playerID)
|
return
|
|
lvIpyData = IpyGameDataPY.GetIpyGameData("GubaoLV", quality, lv)
|
if not lvIpyData:
|
return
|
needItemList = lvIpyData.GetLVUPNeedItemInfo()
|
if not needItemList:
|
return
|
|
itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
|
lackItemDict, delInfoDict = ItemCommon.GetCostItemIndexList(needItemList, itemPack)
|
if lackItemDict:
|
GameWorld.DebugLog("¹Å±¦Éý¼¶ËùÐèÎïÆ·²»×㣡 quality=%s,lv=%s,needItemList=%s,lackItemDict=%s"
|
% (quality, lv, needItemList, lackItemDict), playerID)
|
return
|
#¿ÛÏûºÄ
|
ItemCommon.DelCostItem(curPlayer, itemPack, delInfoDict, "Gubao")
|
|
updLV = lv + 1
|
SetGubaoLVInfo(curPlayer, gubaoID, updLV, star)
|
GameWorld.Log("¹Å±¦Éý¼¶: gubaoID=%s,quality=%s,updLV=%s" % (gubaoID, quality, updLV), playerID)
|
RefreshGubaoAttr(curPlayer)
|
Sync_GubaoInfo(curPlayer, [gubaoID])
|
return
|
|
def RefreshGubaoAttr(curPlayer):
|
CalcGubaoAttr(curPlayer)
|
PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState()
|
return
|
|
def CalcGubaoAttr(curPlayer):
|
|
allAttrList = [{} for _ in range(4)]
|
|
ipyDataMgr = IpyGameDataPY.IPY_Data()
|
for index in xrange(ipyDataMgr.GetGubaoCount()):
|
ipyData = ipyDataMgr.GetGubaoByIndex(index)
|
gubaoID = ipyData.GetGubaoID()
|
lv, star = GetGubaoLVInfo(curPlayer, gubaoID)
|
if not star:
|
continue
|
|
quality = ipyData.GetGubaoQuality()
|
lvIpyData = IpyGameDataPY.GetIpyGameData("GubaoLV", quality, lv)
|
if lvIpyData:
|
lvAttrTypeList = lvIpyData.GetLVAttrTypeList()
|
lvAttrValueList = lvIpyData.GetLVAttrValueList()
|
for i, attrID in enumerate(lvAttrTypeList):
|
attrValue = lvAttrValueList[i]
|
PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrList)
|
|
starIpyData = IpyGameDataPY.GetIpyGameData("GubaoStar", gubaoID, star)
|
if starIpyData:
|
starAttrTypeList = starIpyData.GetStarAttrTypeList()
|
starAttrValueList = starIpyData.GetStarAttrValueList()
|
for i, attrID in enumerate(starAttrTypeList):
|
attrValue = starAttrValueList[i]
|
PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrList)
|
|
# ±£´æ¼ÆËãÖµ
|
PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Gubao, allAttrList)
|
return
|
|
def Sync_GubaoInfo(curPlayer, gubaoIDList=None):
|
if gubaoIDList == None:
|
syncIDList = []
|
ipyDataMgr = IpyGameDataPY.IPY_Data()
|
for index in range(ipyDataMgr.GetGubaoCount()):
|
ipyData = ipyDataMgr.GetGubaoByIndex(index)
|
syncIDList.append(ipyData.GetGubaoID())
|
else:
|
syncIDList = gubaoIDList
|
|
gubaoInfoList = []
|
for gubaoID in syncIDList:
|
lv, star = GetGubaoLVInfo(curPlayer, gubaoID)
|
if not lv and not star and gubaoIDList == None:
|
# ûÓÐÖ¸¶¨Ê±Ö»Í¬²½¼¤»îµÄ
|
continue
|
gubao = ChPyNetSendPack.tagMCGubao()
|
gubao.GubaoID = gubaoID
|
gubao.GubaoLV = lv
|
gubao.GubaoStar = star
|
gubaoInfoList.append(gubao)
|
|
if not gubaoInfoList:
|
return
|
|
clientPack = ChPyNetSendPack.tagMCGubaoInfo()
|
clientPack.GubaoInfoList = gubaoInfoList
|
clientPack.Count = len(clientPack.GubaoInfoList)
|
NetPackCommon.SendFakePack(curPlayer, clientPack)
|
return
|