#!/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