#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#-------------------------------------------------------------------------------
|
#
|
#-------------------------------------------------------------------------------
|
#
|
##@package Event.EventSrc.Operate_EquipPlus
|
#
|
# @todo:²¿Î»Ç¿»¯¹«¹²Ä£Ê½Ç¿»¯
|
# @author hxp
|
# @date 2015-12-15
|
# @version 1.2
|
#
|
# ÏêϸÃèÊö: ²¿Î»Ç¿»¯¹«¹²Ä£Ê½Ç¿»¯
|
#
|
# @change: "2016-06-30 21:30" hxp Ç¿»¯´ïÈË¿ª·þ»î¶¯
|
# @change: "2016-10-08 18:00" hxp ×Ô¶¯¹ºÂòÎïÆ·¼Û¸ñͳһȡÉ̳ÇÎïÆ·¼Û¸ñ
|
#
|
#---------------------------------------------------------------------
|
#"""Version = 2016-10-08 18:00"""
|
#---------------------------------------------------------------------
|
import ItemCommon
|
import ShareDefine
|
import PlayerControl
|
import IPY_GameWorld
|
import OpenServerCampaign
|
import DataRecordPack
|
import PlayerActivity
|
import PlayerSuccess
|
import IpyGameDataPY
|
import PlayerActLogin
|
import PlayerActTask
|
import GameWorld
|
import ChConfig
|
import ChEquip
|
import EventShell
|
import ChPyNetSendPack
|
import NetPackCommon
|
import PlayerWeekParty
|
import PlayerActGarbageSorting
|
import PlayerTongTianLing
|
#-------------------------------------------------------------------------------------------
|
|
#===============================================================================
|
# //A3 01 ×°±¸Ç¿»¯ #tagEquipPlus
|
# struct tagEquipPlus
|
# {
|
# tagHead Head;
|
# BYTE PackType; //±³°üÀàÐÍ:rptItem, rptEquip, rptPetEquip1~5
|
# WORD ItemIndex; //ÎïÆ·ÔÚ±³°üÖÐË÷Òý
|
# };
|
#===============================================================================
|
## ×°±¸Ç¿»¯
|
# @param playerIndex: Íæ¼Ò
|
# @param clientData: ·â°ü
|
# @param tick: µ±Ç°Ê±¼ä
|
# @return None
|
def OnEquipMayaPlus(playerIndex, clientData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(playerIndex)
|
playerID = curPlayer.GetPlayerID()
|
|
packType = clientData.PackType
|
index = clientData.ItemIndex
|
|
# ÅÐ¶Ï 1.×°±¸ 2.×î¸ßÇ¿»¯µÈ¼¶£¬ 3.ÍÇ®Êý
|
if packType not in ChConfig.Pack_EquipPart_CanPlusStar:
|
#GameWorld.DebugLog("packType not in ChConfig.Pack_EquipPart_CanPlusStar", playerID)
|
return
|
|
ipyData = IpyGameDataPY.GetIpyGameDataByCondition('EquipPlaceIndexMap', {'GridIndex':index})
|
if not ipyData:
|
return
|
equipPlace = ipyData.GetEquipPlace()
|
equipPlaceList = ChConfig.Pack_EquipPart_CanPlusStar[packType]
|
if equipPlace not in equipPlaceList:
|
#GameWorld.Log("index=%s, equipPlace=%s not in ChConfig.Pack_EquipPart_CanPlusStar" % (index, equipPlace), playerID)
|
return
|
|
# Ôݲ»ÅжϿªÆôµÈ¼¶Óɿͻ§¶Ë´¦Àí
|
# µ±Ç°×°±¸µÈ¼¶ÊÇ·ñµ½´ï×î¸ßµÈ¼¶
|
curPack = curPlayer.GetItemManager().GetPack(packType)
|
curEquip = curPack.GetAt(index)
|
if not curEquip or curEquip.IsEmpty():
|
GameWorld.DebugLog("equip is empty")
|
return
|
|
findType = ChEquip.GetEquipPlusType(curEquip)
|
if not findType:
|
return
|
|
curPartPlusLV = ChEquip.GetEquipPartPlusLV(curPlayer, packType, index)
|
classLV = ItemCommon.GetItemClassLV(curEquip)
|
plusMaxIpyData = IpyGameDataPY.GetIpyGameData("ItemPlusMax", findType, classLV)
|
if not plusMaxIpyData:
|
return
|
plusLVMax = plusMaxIpyData.GetPlusLVMax()
|
if curPartPlusLV >= plusLVMax:
|
#GameWorld.DebugLog("Ç¿»¯´ïµ½±¾½××î´óµÈ¼¶£¬ÎÞ·¨Ç¿»¯! classLV=%s,plusLVMax=%s,curPartPlusLV=%s" % (classLV, plusLVMax, curPartPlusLV))
|
return
|
plusIpyData = IpyGameDataPY.GetIpyGameData("ItemPlus", findType, curPartPlusLV)
|
if not plusIpyData:
|
return
|
costSilver = plusIpyData.GetCostCount()
|
costItemInfo = plusIpyData.GetCostItemInfo()
|
if not costSilver and not costItemInfo:
|
#GameWorld.DebugLog("Òѵ½Ç¿»¯×î´óµÈ¼¶! curPartPlusLV=%s" % curPartPlusLV, playerID)
|
return
|
|
curEvolveLV = ChEquip.GetEquipPartPlusEvolveLV(curPlayer, packType, index) # ½ø»¯µÈ¼¶
|
nextEvolveLV = curEvolveLV + 1
|
evolveIpyData = IpyGameDataPY.GetIpyGameDataNotLog('EquipPlusEvolve', equipPlace, nextEvolveLV)
|
if not evolveIpyData:
|
return
|
maxPlusLV = evolveIpyData.GetNeedPlusLV()
|
if curPartPlusLV >= maxPlusLV:
|
GameWorld.Log("Òѵ½µ±Ç°Ç¿»¯×î´óµÈ¼¶£¬½ø»¯ºóÔö¼ÓÇ¿»¯µÈ¼¶ÉÏÏÞ! curPartPlusLV(%s) >= maxPlusLV(%s), curEvolveLV=%s"
|
% (curPartPlusLV, maxPlusLV, curEvolveLV), playerID)
|
return
|
|
if costSilver and not PlayerControl.HaveMoney(curPlayer, IPY_GameWorld.TYPE_Price_Silver_Money, costSilver):
|
GameWorld.DebugLog("ÍÇ®²»×㣬ÎÞ·¨Ç¿»¯! costSilver=%s" % costSilver)
|
return
|
|
costItemID, costItemCount = 0, 0
|
if costItemInfo:
|
costItemID, costItemCount = costItemInfo
|
itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
|
hasEnough, itemIndexList = ItemCommon.GetItem_FromPack_ByID(costItemID, itemPack, costItemCount)
|
if not hasEnough:
|
GameWorld.DebugLog("²ÄÁϲ»×㣬ÎÞ·¨Ç¿»¯! costItemID=%s, costItemCount=%s" % (costItemID, costItemCount))
|
return
|
|
if costSilver:
|
PlayerControl.PayMoney(curPlayer, IPY_GameWorld.TYPE_Price_Silver_Money, costSilver, isNotify=False)
|
|
if costItemID:
|
ItemCommon.ReduceItem(curPlayer, itemPack, itemIndexList, costItemCount, True, ChConfig.ItemDel_EquipPlus)
|
|
isLVUp = False
|
curExp = 0
|
addExp = plusIpyData.GetAddExp()
|
totalExp = plusIpyData.GetTotalExp()
|
if addExp and totalExp:
|
curExp = ChEquip.GetEquipPartProficiency(curPlayer, packType, index) + addExp
|
if curExp >= totalExp:
|
curExp = curExp - totalExp
|
isLVUp = True
|
else:
|
isLVUp = True
|
|
if isLVUp:
|
curPartPlusLV += 1
|
__EquipMayaPlusChange(curPlayer, packType, curEquip, index, curPartPlusLV)
|
|
#DataRecordPack.DR_UpStarLVSuccess(curPlayer, curExp, curPartPlusLV)
|
ChEquip.SetEquipPartProficiency(curPlayer, packType, index, curExp)
|
ChEquip.NotifyEquipPartPlusLV(curPlayer, packType, index)
|
PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_EquipPlus)
|
PlayerActLogin.AddLoginAwardActionCnt(curPlayer, ChConfig.Def_LoginAct_EquipPlus, 1)
|
PlayerWeekParty.AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_Plus, 1)
|
PlayerTongTianLing.AddTongTianTaskValue(curPlayer, ChConfig.TTLTaskType_Plus, 1)
|
PlayerActTask.AddActTaskValue(curPlayer, ChConfig.ActTaskType_EquipPlus)
|
return
|
|
def __EquipMayaPlusChange(curPlayer, packType, curEquip, index, updPlusLV):
|
## ÂêÑżÓÇ¿µÈ¼¶¸Ä±ä
|
|
ChEquip.SetEquipPartPlusLV(curPlayer, packType, index, curEquip, updPlusLV)
|
|
broadCastLVList = IpyGameDataPY.GetFuncEvalCfg("StrengthenLevelBroadCast", 1)
|
if updPlusLV in broadCastLVList:
|
itemID = curEquip.GetItemTypeID()
|
userData = curEquip.GetUserData()
|
guid = ItemCommon.CacheNotifyEquipDetailInfo(curPlayer, curEquip)
|
msgParamList = [curPlayer.GetPlayerName(), itemID, userData, guid, updPlusLV]
|
PlayerControl.WorldNotify(0, "StrengthenCongratulation", msgParamList)
|
|
classLV = ItemCommon.GetItemClassLV(curEquip)
|
|
DoLogic_OnEquipPartStarLVChange(curPlayer, packType, classLV)
|
# Ç¿»¯³É¾Í
|
__UpdateEquipPlusSuccess(curPlayer, classLV)
|
EventShell.EventRespons_EquipPlus(curPlayer, classLV, updPlusLV)
|
|
# ¿ª·þ»î¶¯Êý¾Ý
|
#OpenServerCampaign.UpdOpenServerCampaignRecordData(curPlayer, ShareDefine.Def_Campaign_Type_Plus, ChEquip.GetTotalPlusLV(curPlayer))
|
return
|
|
def __UpdateEquipPlusSuccess(curPlayer, classLV):
|
ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition('EquipPlaceIndexMap', {'ClassLV':classLV}, True)
|
if not ipyDataList:
|
return
|
|
totalPlusLV = ChEquip.GetTotalPlusLV(curPlayer)
|
classPlusLV = 0
|
packType = IPY_GameWorld.rptEquip
|
plusLVCountDict = {}
|
for ipyData in ipyDataList:
|
index = ipyData.GetGridIndex()
|
plusLV = ChEquip.GetEquipPartPlusLV(curPlayer, packType, index)
|
if not plusLV:
|
continue
|
conditionKey = (classLV, plusLV)
|
plusLVCountDict[conditionKey] = plusLVCountDict.get(conditionKey, 0) + 1
|
classPlusLV += plusLV
|
|
#GameWorld.DebugLog("Ç¿»¯³É¾ÍÊý¾Ý: classLV=%s,plusLVCountDict=%s,classPlusLV=%s,totalPlusLV=%s" % (classLV, plusLVCountDict, classPlusLV, totalPlusLV))
|
PlayerSuccess.UpdateSuccessProgressByConditions(curPlayer, ShareDefine.SuccType_EquipPlus, plusLVCountDict)
|
PlayerSuccess.UptateSuccessProgress(curPlayer, ShareDefine.SuccType_EquipPlusTotal, totalPlusLV)
|
PlayerSuccess.UptateSuccessProgress(curPlayer, ShareDefine.SuccType_EquipPlusClass, classPlusLV, [classLV])
|
PlayerActGarbageSorting.AddActGarbageTaskProgress(curPlayer, ChConfig.Def_GarbageTask_EquipPlus)
|
return
|
|
def DoLogic_OnEquipPartStarLVChange(curPlayer, packType, classLV):
|
#ÏÈË¢×°±¸BUFF ÔÙ¼ÆËãÊôÐÔ
|
curPlayer.SetDict(ChConfig.Def_PlayerKey_AttrActivatyNotify, ChConfig.Def_AttrActivatyNotify_Plus)
|
ChEquip.RefreshPlayerEquipAttribute(curPlayer, classLV)
|
|
#Ë¢ÐÂËùÓÐÊôÐÔ
|
playControl = PlayerControl.PlayerControl(curPlayer)
|
playControl.RefreshPlayerAttrState()
|
return
|
|
#// A3 16 ×°±¸Ç¿»¯½ø»¯ #tagCMEquipPlusEvolve
|
#struct tagCMEquipPlusEvolve
|
#{
|
# tagHead Head;
|
# WORD ItemIndex; //×°±¸ÔÚ±³°üÖÐË÷Òý
|
#};
|
def OnEquipPlusEvolve(playerIndex, clientData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(playerIndex)
|
|
equipPackindex = clientData.ItemIndex
|
|
packType = IPY_GameWorld.rptEquip
|
curPack = curPlayer.GetItemManager().GetPack(packType)
|
curEquip = curPack.GetAt(equipPackindex)
|
if not ItemCommon.CheckItemCanUse(curEquip):
|
return
|
curEvolveLV = ChEquip.GetEquipPartPlusEvolveLV(curPlayer, packType, equipPackindex)
|
nextEvolveLV = curEvolveLV + 1
|
equipPlace = curEquip.GetEquipPlace()
|
ipyData = IpyGameDataPY.GetIpyGameData('EquipPlusEvolve', equipPlace, nextEvolveLV)
|
if not ipyData:
|
return
|
needPlusLV = ipyData.GetNeedPlusLV()
|
curPartPlusLV = ChEquip.GetEquipPartPlusLV(curPlayer, packType, equipPackindex)
|
if curPartPlusLV < needPlusLV:
|
GameWorld.DebugLog("Ç¿»¯µÈ¼¶²»×㣬ÎÞ·¨½ø»¯! curPartPlusLV=%s < needPlusLV=%s, nextEvolveLV=%s"
|
% (curPartPlusLV, needPlusLV, nextEvolveLV))
|
return
|
|
costItemDict = ipyData.GetCostItem()
|
delItemDict = {}
|
itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
|
for itemID, itemCnt in costItemDict.items():
|
hasEnough, indexList, findItemIsBind, lackCnt = ItemCommon.GetItem_FromPack_ByID_ExEx(itemID, itemPack, itemCnt)
|
if not hasEnough:
|
GameWorld.DebugLog('×°±¸Ç¿»¯½ø»¯ ²ÄÁϲ»×ãitemID= %s,itemCnt=%s' % (itemID, itemCnt))
|
return
|
delItemDict[tuple(indexList)] = itemCnt
|
for itemIndexList, delCnt in delItemDict.items():
|
ItemCommon.ReduceItem(curPlayer, itemPack, itemIndexList, delCnt, True, ChConfig.ItemDel_EquipPlus)
|
|
ChEquip.SetEquipPartPlusEvolveLV(curPlayer, packType, equipPackindex, nextEvolveLV)
|
DoLogic_OnEquipPartStarLVChange(curPlayer, packType, ItemCommon.GetItemClassLV(curEquip))
|
ChEquip.NotifyEquipPartPlusLV(curPlayer, packType, equipPackindex)
|
EventShell.EventRespons_EquipPlusEvolve(curPlayer, nextEvolveLV)
|
return
|
|
|
#// A5 C7 ¼¤»î´óʦǿ»¯µÈ¼¶ #tagCMActivateMasterPlusLV
|
#
|
#struct tagCMActivateMasterPlusLV
|
#{
|
# tagHead Head;
|
# BYTE ClassLV; // ËùÊô×°±¸½×
|
# WORD MasterPlusLV; // ´óʦǿ»¯µÈ¼¶
|
#};
|
def OnActivateMasterPlusLV(index, clientData, tick):
|
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
classLV = clientData.ClassLV
|
actMasterPlusLV = clientData.MasterPlusLV
|
|
curMasterPlusLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipPartMasterPlusLV % classLV)
|
if curMasterPlusLV >= actMasterPlusLV:
|
# ÒѾ¼¤»î¹ýÁË
|
GameWorld.DebugLog("ÒѾ¼¤»î¹ý¸ÃÇ¿»¯´óʦµÈ¼¶ÁË! actMasterPlusLV=%s,curMasterPlusLV=%s" % (actMasterPlusLV, curMasterPlusLV))
|
return
|
|
ipyData = IpyGameDataPY.GetIpyGameDataByCondition("ItemPlusMaster", {"ClassLV":classLV, "MasterPlusLV":actMasterPlusLV}, False, False)
|
if not ipyData:
|
GameWorld.DebugLog("²»´æÔÚ¸ÃÇ¿»¯´óʦµÈ¼¶! actMasterPlusLV=%s" % actMasterPlusLV)
|
return
|
|
packType = IPY_GameWorld.rptEquip
|
# ÅжϿɷñ¼¤»î
|
for equipPlace in ChConfig.EquipPlace_Base:
|
ipyData = IpyGameDataPY.GetIpyGameData('EquipPlaceIndexMap', classLV, equipPlace)
|
if not ipyData:
|
return
|
equipIndex = ipyData.GetGridIndex()
|
plusLV = ChEquip.GetEquipPartPlusLV(curPlayer, packType, equipIndex)
|
if plusLV < actMasterPlusLV:
|
GameWorld.DebugLog("²¿Î»Ç¿»¯µÈ¼¶²»×㣬ÎÞ·¨¼¤»îÇ¿»¯´óʦ! equipPlace=%s,equipIndex=%s,plusLV=%s < %s"
|
% (equipPlace, equipIndex, plusLV, actMasterPlusLV))
|
return
|
|
GameWorld.DebugLog("¼¤»îÇ¿»¯´óʦµÈ¼¶! classLV=%s,actMasterPlusLV=%s" % (classLV, actMasterPlusLV))
|
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_EquipPartMasterPlusLV % classLV, actMasterPlusLV)
|
|
SyncEquipMasterPlusLVInfo(curPlayer, classLV)
|
ChEquip.ChangeEquipEffectByPlusMaster(curPlayer, classLV)
|
#Ë¢ÐÂËùÓÐÊôÐÔ
|
DoLogic_OnEquipPartStarLVChange(curPlayer, packType, classLV)
|
return
|
|
def SyncEquipMasterPlusLVInfo(curPlayer, classLV=0, isForce=False):
|
## ͬ²½´óʦǿ»¯µÈ¼¶ÐÅÏ¢
|
if not classLV:
|
needSyncClassLVList = xrange(1, IpyGameDataPY.GetFuncCfg('EquipMaxClasslv') + 1)
|
else:
|
needSyncClassLVList = [classLV]
|
|
masterPlusLVInfoList = []
|
for classLV in needSyncClassLVList:
|
masterPlusLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipPartMasterPlusLV % classLV)
|
if not masterPlusLV and not isForce:
|
continue
|
lvInfo = ChPyNetSendPack.tagMCMasterPlusLV()
|
lvInfo.ClassLV = classLV
|
lvInfo.MasterPlusLV = masterPlusLV
|
masterPlusLVInfoList.append(lvInfo)
|
|
if not masterPlusLVInfoList:
|
return
|
|
clientPack = ChPyNetSendPack.tagMCMasterPlusLVInfo()
|
clientPack.MasterPlusLVInfoList = masterPlusLVInfoList
|
clientPack.Count = len(masterPlusLVInfoList)
|
NetPackCommon.SendFakePack(curPlayer, clientPack)
|
return
|
|
|