#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#-------------------------------------------------------------------------------
|
#
|
#-------------------------------------------------------------------------------
|
#
|
##@package Player.PlayerCoat
|
#
|
# @todo:Íæ¼ÒʱװÍâÌ×
|
# @author hxp
|
# @date 2015-6-15
|
# @version 1.1
|
#
|
# @change: "2015-08-10 10:00" ljd Ï·¢ÖÜÎ§Íæ¼Òʱװ´©´÷״̬
|
# ÏêϸÃèÊö: Íæ¼ÒʱװÍâÌ×
|
#
|
#---------------------------------------------------------------------
|
"""Version = 2015-08-10 10:00"""
|
#---------------------------------------------------------------------
|
|
import ReadChConfig
|
import NetPackCommon
|
import IPY_GameWorld
|
import PlayerControl
|
import ItemControler
|
import ChPyNetSendPack
|
import ShareDefine
|
import ItemCommon
|
import EventReport
|
import GameWorld
|
import ChConfig
|
import ChEquip
|
|
import math
|
|
## 怬
|
# @param curPlayer
|
# @return None
|
def OnLogin_Coat(curPlayer):
|
Sync_ClothesCoatSkinInfo(curPlayer)
|
return
|
|
|
## ¼¤»îʱװÒ·þƤ·ô
|
# @param curPlayer
|
# @return None
|
def ActivateClothesCoatSkinItem(curPlayer, clothesCoatSkinID):
|
|
playerID = curPlayer.GetPlayerID()
|
|
clothesCoatSkinDict = ReadChConfig.GetEvalChConfig("ClothesCoatSkin")
|
if clothesCoatSkinID not in clothesCoatSkinDict:
|
GameWorld.ErrLog("¼¤»îʱװƤ·ôÒì³££¬ÎÞ¸ÃʱװƤ·ôÎïÆ·ÐÅÏ¢£¡ClothesCoatSkin.txt! ID=%s" % clothesCoatSkinID, playerID)
|
return False
|
|
clotherSkinInfo = clothesCoatSkinDict[clothesCoatSkinID]
|
if not clotherSkinInfo:
|
return False
|
|
curSkinIndex = clotherSkinInfo[0]
|
skinOpenState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ClothesSkinOpenState)
|
curSkinState = skinOpenState & pow(2, curSkinIndex)
|
|
if curSkinState:
|
# GameWorld.Log("¸ÃʱװƤ·ôÒѾ¼¤»î¹ý£¡clothesCoatSkinID=%s,index=%s,skinOpenState=%s"
|
# % (clothesCoatSkinID, curSkinIndex, skinOpenState), playerID)
|
# PlayerControl.NotifyCode(curPlayer, "GeRen_hgg_850801")
|
#µ±Ê¹ÓÃÒѼ¤»î¹ýµÄʱװ¼¤»îµÀ¾ßʱ£¬½«»ñµÃÒ»¶¨ÊýÁ¿µÄÎïÆ· ·µ»ØTure¿Û³ýÎïÆ·
|
clothesCoatUpDict = ReadChConfig.GetEvalChConfig("ClothesCoatUp")
|
if curSkinIndex not in clothesCoatUpDict:
|
PlayerControl.NotifyCode(curPlayer, "GeRen_hgg_850801")
|
return False
|
packSpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem, 1)
|
if packSpace < 1:
|
PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_998371")
|
return False
|
itemId, getItemCntList = clothesCoatUpDict[curSkinIndex]
|
if not getItemCntList:
|
return False
|
getItemCnt = getItemCntList[0]
|
|
packIndexList = [IPY_GameWorld.rptItem]
|
ItemControler.GivePlayerItem(curPlayer, itemId, getItemCnt, True, packIndexList, True, showSysInfo=True)
|
return True
|
|
isOK = ItemControler.PutItemInTempSwap(curPlayer, clothesCoatSkinID)
|
if not isOK:
|
GameWorld.Log("ʱװ·ÅÈëÁÙʱ½»»»±³°üʧ°Ü£¡", playerID)
|
return False
|
|
#===========================================================================
|
# # »ñµÃ·ÅÈëµÄʱװ
|
# clothesItem = ItemCommon.FindItemInPackByItemID(curPlayer, clothesCoatSkinID,
|
# ShareDefine.rptTempSwap)
|
# if not clothesItem:
|
# return False
|
#
|
# tick = GameWorld.GetGameWorld().GetTick()
|
# ChEquip.DoPlayerEquipItem(curPlayer, clothesItem, IPY_GameWorld.retClothesCoat, tick)
|
#===========================================================================
|
|
# ¸üлû¯×´Ì¬
|
updSkinOpenState = skinOpenState | pow(2, curSkinIndex)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ClothesSkinOpenState, updSkinOpenState)
|
Sync_ClothesCoatSkinInfo(curPlayer, curSkinIndex)
|
GameWorld.Log("ʱװ¼¤»î³É¹¦£¡clothesCoatSkinID=%s,index=%s,skinOpenState=%s,updSkinOpenState=%s"
|
% (clothesCoatSkinID, curSkinIndex, skinOpenState, updSkinOpenState), playerID)
|
|
# Ë¢ÊôÐÔ
|
PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState()
|
|
ClothesCoaSkinNotifyDict = ReadChConfig.GetEvalChConfig("ClothesCoaSkinNotify")
|
if clothesCoatSkinID in ClothesCoaSkinNotifyDict:
|
notifyMark = ClothesCoaSkinNotifyDict[clothesCoatSkinID]
|
PlayerControl.WorldNotify(0, notifyMark, [curPlayer.GetPlayerName(), clothesCoatSkinID])
|
|
return True
|
|
|
#// A5 0B Íæ¼ÒʱװÉý¼¶ #tagCMCoatUp
|
#
|
#struct tagCMCoatUp
|
#{
|
# tagHead Head;
|
# BYTE CoatIndex; // ʱװË÷Òý
|
#};
|
def OnPlayerCoatUp(index, clientData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
playerID = curPlayer.GetPlayerID()
|
coatIndex = clientData.CoatIndex
|
clothesCoatUpDict = ReadChConfig.GetEvalChConfig("ClothesCoatUp")
|
if coatIndex not in clothesCoatUpDict:
|
GameWorld.DebugLog("clothesCoatUpDict.txt δÅäÖøÃË÷Òý coatIndex=%s" % (coatIndex), playerID)
|
return
|
|
skinOpenState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ClothesSkinOpenState)
|
if not skinOpenState & pow(2, coatIndex):
|
GameWorld.DebugLog("¸Ãʱװδ¼¤»î, ÎÞ·¨Éý¼¶! coatIndex=%s" % (coatIndex), playerID)
|
return
|
costItemID, needCntList = clothesCoatUpDict[coatIndex]
|
|
curSkinLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ClothesSkinLV % coatIndex)
|
|
|
if curSkinLV >= len(needCntList) - 1:
|
GameWorld.DebugLog("¸ÃʱװÒÑÂú¼¶£¬ÎÞ·¨Éý¼¶!coatIndex=%s,curSkinLV=%s" % (coatIndex, curSkinLV), playerID)
|
return
|
plusCost = needCntList[curSkinLV + 1]
|
curBless = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ClothesSkinCurBless % coatIndex)
|
lackCnt = plusCost - curBless
|
|
curPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
|
hasEnough, itemIndexList = ItemCommon.GetItem_FromPack_ByID(costItemID, curPack, lackCnt)
|
if not itemIndexList:
|
GameWorld.DebugLog("OnPlayerCoatUp() ʱװÉý¼¶²ÄÁϲ»×ã, needCnt=%s" % (lackCnt))
|
return
|
if hasEnough:
|
reduceCnt = lackCnt
|
aftBless = 0 #Éý¼¶ºóµÄ¾ÑéÖµ
|
aftlv = curSkinLV + 1
|
else:
|
reduceCnt = 0
|
for itemIndex in itemIndexList:
|
curItem = curPack.GetAt(itemIndex)
|
itemCount = curItem.GetCount()
|
reduceCnt += itemCount
|
|
aftBless = curBless + reduceCnt
|
aftlv = curSkinLV
|
|
#¿Û³ýÎïÆ·
|
ItemCommon.ReduceItem(curPlayer, curPack, itemIndexList, reduceCnt, True)
|
if aftlv != curSkinLV:
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ClothesSkinLV % coatIndex, aftlv)
|
if aftBless != curBless:
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ClothesSkinCurBless % coatIndex, aftBless)
|
|
Sync_ClothesCoatSkinInfo(curPlayer, coatIndex)
|
# Ë¢ÊôÐÔ
|
PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState()
|
|
clothesID = GetClothesIDByIndex(coatIndex)
|
itemData = GameWorld.GetGameData().GetItemByTypeID(clothesID)
|
coatName = clothesID if not itemData else itemData.GetName()
|
EventReport.WriteEvent_coat_lv(curPlayer, coatName, curSkinLV, curBless, reduceCnt, aftlv, aftBless)
|
GameWorld.DebugLog("ʱװÉý¼¶!coatIndex=%s,coatName=%s,curSkinLV=%s,curBless=%s,reduceCnt=%s,aftlv=%s,aftBless=%s"
|
% (coatIndex, coatName, curSkinLV, curBless, reduceCnt, aftlv, aftBless), playerID)
|
return
|
|
|
## ¼ÆËãʱװÊôÐÔ
|
# @param curPlayer Íæ¼Ò
|
# @param allAttrList ÊôÐÔÁбí
|
# @return None
|
def CalcClothesCoatSkinAttr(curPlayer, allAttrList):
|
skinOpenState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ClothesSkinOpenState)
|
|
if not skinOpenState:
|
return
|
|
clothesCoatSkinDict = ReadChConfig.GetEvalChConfig("ClothesCoatSkin")
|
clothesCoatUpDict = ReadChConfig.GetEvalChConfig("ClothesCoatUp")
|
for clothesInfo in clothesCoatSkinDict.values():
|
curIndex, attrDict = clothesInfo
|
|
if not skinOpenState & pow(2, curIndex):
|
continue
|
skinLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ClothesSkinLV % curIndex)
|
curExp = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ClothesSkinCurBless % curIndex)
|
if curIndex not in clothesCoatUpDict:
|
expPer = 0
|
else:
|
itemCntList = clothesCoatUpDict[curIndex][1]
|
maxExp = itemCntList[skinLV + 1] if skinLV + 1 < len(itemCntList) else 0
|
expPer = float(curExp) / maxExp if maxExp != 0 else 0
|
for attrName, attrLVList in attrDict.items():
|
attrValue = attrLVList[skinLV] if skinLV < len(attrLVList) else attrLVList[-1]
|
nextValue = attrLVList[skinLV + 1] if skinLV + 1 < len(attrLVList) else attrLVList[-1]
|
addValue = int(math.ceil((nextValue-attrValue) * expPer))
|
PlayerControl.CalcAttrDict_Type(attrName, attrValue + addValue, allAttrList)
|
GameWorld.DebugLog(' ʱװÊôÐÔcurIndex=%s attrName=%s,expPer=%s,attrValue=%s,addValue=%s' % (curIndex, attrName, expPer, attrValue, addValue))
|
|
return
|
|
|
##´©ÉÏ/ÍÑÏÂʱװ
|
# @param curPlayer Íæ¼ÒʵÀý
|
# @param srcBackpack Æðµã±³°ü
|
# @param desBackPack Ä¿±ê±³°ü
|
# @param srcIndex ÆðµãË÷Òý
|
# @param destIndex Ä¿±êË÷Òý
|
# @return
|
def SwitchCoat(curPlayer, srcBackpack, desBackPack, srcIndex, destIndex):
|
if not ((desBackPack == IPY_GameWorld.rptEquip and srcBackpack == ShareDefine.rptTempSwap and destIndex == IPY_GameWorld.retClothesCoat) \
|
or (srcBackpack == IPY_GameWorld.rptEquip and desBackPack == ShareDefine.rptTempSwap and srcIndex == IPY_GameWorld.retClothesCoat)):
|
return False
|
|
#===============================================================================================
|
# # ²»¿ÉÒÔ½»»»Ê±×°
|
# if curPlayer.GetMapID() in [ChConfig.Def_FBMapID_RedFort]:
|
# PlayerControl.NotifyCode(curPlayer, "GeRen_liubo_422737")
|
# return True
|
#===============================================================================================
|
|
playerID = curPlayer.GetPlayerID()
|
clothesIndex = IPY_GameWorld.retClothesCoat
|
|
# ´©Ê±×°
|
if desBackPack == IPY_GameWorld.rptEquip:
|
# ´©µÄʱºòsrcIndex´ú±íʱװµÄË÷Òý
|
skinOpenState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ClothesSkinOpenState)
|
if not skinOpenState & pow(2, srcIndex):
|
GameWorld.Log("ʱװδ¼¤»î£¬²»ÄÜ´©£¡state=%s,srcIndex=%s" % (skinOpenState, srcIndex), playerID)
|
return True
|
|
findSwichClothesID = GetClothesIDByIndex(srcIndex)
|
|
if findSwichClothesID <= 0:
|
GameWorld.Log("ÕÒ²»µ½Ê±×°ID£¬²»ÄÜ´©£¡srcIndex=%s" % (srcIndex), playerID)
|
return True
|
|
# ÕÒµ½Ê±×°IDºó£¬srcIndexת»¯Îª½»»»ÎïÆ·µÄ¸ñ×ÓË÷Òý£¬Ä¬ÈÏ0
|
srcIndex, destIndex = 0, clothesIndex
|
|
# ¸øÁÙʱ½»»»ÎïÆ·
|
if not ItemControler.PutItemInTempSwap(curPlayer, findSwichClothesID):
|
GameWorld.Log("ʱװID(%s)·ÅÈëÁÙʱ½»»»±³°üʧ°Ü!" % (findSwichClothesID), playerID)
|
return True
|
|
# ÍÑʱװ
|
else:
|
ItemControler.ClearPack(curPlayer, ShareDefine.rptTempSwap)
|
srcIndex, destIndex = clothesIndex, 0
|
|
isOK = ItemCommon.DoLogicSwitchItemEx(curPlayer, srcBackpack, desBackPack, srcIndex, destIndex)
|
# Ï·¢ÖÜÎ§Íæ¼Òʱװ´©´÷״̬
|
if isOK:
|
if desBackPack == IPY_GameWorld.rptEquip:
|
packIndex = IPY_GameWorld.rptEquip
|
itemPlace = IPY_GameWorld.retClothesCoat
|
itemPack = curPlayer.GetItemManager().GetPack(packIndex)
|
curItem = itemPack.GetAt(itemPlace)
|
itemId = curItem.GetItemTypeID()
|
itemStarLV = 0#curItem.GetItemStarLV()
|
itemHoleCnt = 0#curItem.GetCanPlaceStoneCount()
|
itemStoneCnt = 0#curItem.GetUseStoneCount()
|
itemUseData = curItem.GetUserData()
|
curPlayer.ChangeEquip(itemId, itemPlace, itemStarLV, itemHoleCnt, itemStoneCnt, itemUseData)
|
else:
|
packIndex = ShareDefine.rptTempSwap
|
itemPack = curPlayer.GetItemManager().GetPack(packIndex)
|
curItem = itemPack.GetAt(0)
|
if curItem:
|
curPlayer.Sync_UnEquipItem(curItem.GetItemTypeID(), IPY_GameWorld.retClothesCoat)
|
GameWorld.DebugLog("SwitchCoat isOK=%s" % isOK)
|
return True
|
|
## ¸ù¾ÝË÷Òý»ñȡװ±¸Ê±×°ID
|
def GetClothesIDByIndex(coatIndex):
|
findSwichClothesID = 0
|
clothesCoatSkinDict = ReadChConfig.GetEvalChConfig("ClothesCoatSkin")
|
for clothesID, clothesInfo in clothesCoatSkinDict.items():
|
index = clothesInfo[0]
|
if index == coatIndex:
|
findSwichClothesID = clothesID
|
break
|
return findSwichClothesID
|
|
## ֪ͨ¿Í»§¶Ëʱװ¿ªÆô״̬
|
# @param curPlayer
|
# @return None
|
def Sync_ClothesCoatSkinInfo(curPlayer, coatIndex= -1):
|
stateData = ChPyNetSendPack.tagMCClothesCoatSkinState()
|
stateData.Clear()
|
stateData.SkinOpenState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ClothesSkinOpenState)
|
stateData.CoatInfoList = []
|
|
if coatIndex == -1:
|
clothesCoatSkinDict = ReadChConfig.GetEvalChConfig("ClothesCoatSkin")
|
for index in range(len(clothesCoatSkinDict)):
|
coatInfo = ChPyNetSendPack.tagMCClothesCoatLVInfo()
|
coatInfo.Clear()
|
coatInfo.CoatIndex = index
|
coatInfo.CoatLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ClothesSkinLV % index)
|
coatInfo.CoatExp = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ClothesSkinCurBless % index)
|
stateData.CoatInfoList.append(coatInfo)
|
else:
|
coatInfo = ChPyNetSendPack.tagMCClothesCoatLVInfo()
|
coatInfo.Clear()
|
coatInfo.CoatIndex = coatIndex
|
coatInfo.CoatLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ClothesSkinLV % coatIndex)
|
coatInfo.CoatExp = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ClothesSkinCurBless % coatIndex)
|
stateData.CoatInfoList.append(coatInfo)
|
|
stateData.CoatNum = len(stateData.CoatInfoList)
|
NetPackCommon.SendFakePack(curPlayer, stateData)
|
return
|
|