#!/usr/bin/python  
 | 
# -*- coding: GBK -*-  
 | 
#-------------------------------------------------------------------------------  
 | 
#  
 | 
##@package Player.PlayerFamilyStore  
 | 
#  
 | 
# @todo:Õ½Ã˱¦¿â  
 | 
# @author hxp  
 | 
# @date 2017-09-09  
 | 
# @version 1.0  
 | 
#  
 | 
# ÏêϸÃèÊö: Õ½Ã˱¦¿â  
 | 
#  
 | 
#-------------------------------------------------------------------------------  
 | 
#"""Version = 2017-09-09 18:30"""  
 | 
#-------------------------------------------------------------------------------  
 | 
import GameWorld  
 | 
import ItemCommon  
 | 
import IPY_GameWorld  
 | 
import IpyGameDataPY  
 | 
import PlayerControl  
 | 
import ItemControler  
 | 
import ShareDefine  
 | 
import ChConfig  
 | 
import PlayerSuccess  
 | 
  
 | 
import math  
 | 
  
 | 
#// A6 09  ¼Ò×å²Ö¿â¾èÔùÎïÆ· #tagCMFamilyStoreDonate  
 | 
#  
 | 
#struct     tagCMFamilyStoreDonate  
 | 
#{  
 | 
#    tagHead        Head;  
 | 
#    BYTE        ItemIndex;    // ¾èÔùÎïÆ·ÔÚ±³°üÖеÄË÷Òý  
 | 
#};  
 | 
def OnFamilyStoreDonate(index, clientData, tick):  
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  
 | 
    itemIndex = clientData.ItemIndex  
 | 
    familyID = curPlayer.GetFamilyID()  
 | 
    if not familyID:  
 | 
        GameWorld.DebugLog("ûÓÐÕ½ÃË£¬ÎÞ·¨¾èÔù£¡", curPlayer.GetPlayerID())  
 | 
        return  
 | 
      
 | 
    itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)  
 | 
    curItem = itemPack.GetAt(itemIndex)  
 | 
    if not ItemCommon.CheckItemCanUse(curItem):  
 | 
        GameWorld.DebugLog("ÎïÆ·²»¿ÉÓã¬ÎÞ·¨¾èÔù£¡itemIndex=%s" % itemIndex)  
 | 
        return  
 | 
    if curItem.GetIsBind():  
 | 
        GameWorld.DebugLog("×°±¸ÒѰ󶨣¬ÎÞ·¨¾èÔù£¡itemIndex=%s" % itemIndex)  
 | 
        return  
 | 
    if curItem.GetEndureReduceType():  
 | 
        GameWorld.DebugLog("ÓÐʱЧÄ;ÃÎïÆ·£¬ÎÞ·¨¾èÔù£¡itemIndex=%s" % itemIndex)  
 | 
        return  
 | 
    if not ItemCommon.CheckItemIsEquip(curItem):  
 | 
        GameWorld.DebugLog("·Ç×°±¸£¬ÎÞ·¨¾èÔù£¡itemIndex=%s" % itemIndex)  
 | 
        return  
 | 
    if ItemCommon.CheckHasStone(curItem):  
 | 
        GameWorld.DebugLog("×°±¸Óб¦Ê¯£¬ÎÞ·¨¾èÔù£¡itemIndex=%s" % itemIndex)  
 | 
        return  
 | 
      
 | 
    curPlaceRule = None  
 | 
    equipPlace = curItem.GetEquipPlace()  
 | 
    # Ôݶ¨×î¶àÖ§³Ö1~5ÖÖ¹æÔò  
 | 
    for i in xrange(1, 6):  
 | 
        itemRule = IpyGameDataPY.GetFuncCfgIpyData("FamilyStoreItemRule%s" % i)  
 | 
        if not itemRule:  
 | 
            break  
 | 
        if equipPlace in itemRule.GetNumerical1():  
 | 
            curPlaceRule = itemRule.GetNumerical2()  
 | 
            break  
 | 
          
 | 
    if not curPlaceRule:  
 | 
        GameWorld.ErrLog("ÕÒ²»µ½¸Ã×°±¸Î»¶ÔÓ¦µÄ¾èÔù¹æÔò£¬ÎÞ·¨¾èÔù!equipPlace=%s" % equipPlace)  
 | 
        return  
 | 
    reqClassLV, reqStar, reqColor = curPlaceRule  
 | 
      
 | 
    itemClassLV = ItemCommon.GetItemClassLV(curItem)  
 | 
    itemStar = curItem.GetItemQuality()  
 | 
    itemColor = curItem.GetItemColor()  
 | 
    if itemClassLV < reqClassLV:  
 | 
        GameWorld.DebugLog("×°±¸½×¼¶²»×㣬²»ÄܾèÔù!itemIndex=%s,equipPlace=%s,reqClassLV=%s > itemClassLV=%s"   
 | 
                           % (itemIndex, equipPlace, reqClassLV, itemClassLV))  
 | 
        return  
 | 
    if itemStar < reqStar:  
 | 
        GameWorld.DebugLog("×°±¸ÐǼ¶²»×㣬²»ÄܾèÔù!itemIndex=%s,equipPlace=%s,reqStar=%s > itemStar=%s"   
 | 
                           % (itemIndex, equipPlace, reqStar, itemStar))  
 | 
        return  
 | 
    if itemColor < reqColor:  
 | 
        GameWorld.DebugLog("×°±¸ÑÕÉ«²»×㣬²»ÄܾèÔù!itemIndex=%s,equipPlace=%s,reqColor=%s > itemColor=%s"   
 | 
                           % (itemIndex, equipPlace, reqColor, itemColor))  
 | 
        return  
 | 
      
 | 
    ipyData = IpyGameDataPY.GetIpyGameData("PetEatEquip", itemColor, itemClassLV)  
 | 
    if not ipyData or not ipyData.GetFamilyStoreItemScore():  
 | 
        GameWorld.DebugLog("¸Ã×°±¸Ã»ÓÐÅäÖþèÔù»ý·Ö£¬ÎÞ·¨¾èÔù£¡itemColor=%s,itemClassLV=%s" % (itemColor, itemClassLV))  
 | 
        return  
 | 
    itemScore = ipyData.GetFamilyStoreItemScore()  
 | 
      
 | 
    if not __CheckCanFamilyStoreOperate(curPlayer, tick):  
 | 
        return  
 | 
      
 | 
    msgList = ["DonateReq", itemIndex, itemScore, curItem.GetGUID()]  
 | 
    GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, "FamilyStore",  
 | 
                                                              '%s' % (msgList), len(str(msgList)))  
 | 
    return  
 | 
  
 | 
  
 | 
def __DoFamilyStoreDonateItem(curPlayer, itemIndex, itemScore, itemGUID):  
 | 
    itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)  
 | 
    curItem = itemPack.GetAt(itemIndex)  
 | 
    if not ItemCommon.CheckItemCanUse(curItem):  
 | 
        GameWorld.ErrLog("¾èÔùÏÉÃËÎïÆ·Ê§°Ü!ÎïÆ·²»¿ÉÓÃ!itemIndex=%s,itemGUID=%s" % (itemIndex, itemGUID), curPlayer.GetPlayerID())  
 | 
        return  
 | 
    if itemGUID != curItem.GetGUID():  
 | 
        GameWorld.ErrLog("¾èÔùÏÉÃËÎïÆ·Ê§°Ü!ÎïÆ·GUID²»Ò»ÖÂ!itemIndex=%s,itemGUID=%s,newGUID=%s"   
 | 
                         % (itemIndex, itemGUID, curItem.GetGUID()), curPlayer.GetPlayerID())  
 | 
        return  
 | 
    itemID = curItem.GetItemTypeID()  
 | 
    userData = curItem.GetUserData()  
 | 
    itemDict = {"ItemID":itemID, "IsSuit":int(curItem.GetIsSuite()), "UserData":userData, "EquipGS":ItemCommon.GetEquipGearScore(curItem)}  
 | 
    # É¾³ýÎïÆ·, ¾èÔùµÄĬÈÏΪװ±¸£¬Ö»¿Û³ýÊýÁ¿1  
 | 
    ItemCommon.DelItem(curPlayer, curItem, 1, False, ChConfig.ItemDel_FamilyStore)  
 | 
      
 | 
    # Ôö¼Ó¾èÔù»ý·Ö  
 | 
    PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_FamilyStoreScore, itemScore)  
 | 
      
 | 
    # ¹ã²¥Õ½ÃËÆµµÀ  
 | 
    PlayerControl.FamilyNotify(curPlayer.GetFamilyID(), "TreasuryDonation", [curPlayer.GetName(), itemID, userData])  
 | 
      
 | 
    # Í¬²½µ½GameServer²Ö¿â±£´æ  
 | 
    msgList = ["DonateItem", itemDict]  
 | 
    GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, "FamilyStore",  
 | 
                                                              '%s' % (msgList), len(str(msgList)))  
 | 
    return  
 | 
  
 | 
def OnFamilyStoreQueryResult(curPlayer, result):  
 | 
      
 | 
    opType = result[0]  
 | 
    # ¾èÏ×ÇëÇó·µ»Ø  
 | 
    if opType == "DonateReq":  
 | 
        itemIndex, itemScore, itemGUID, hasSpace = result[1:]  
 | 
        if hasSpace:  
 | 
            __DoFamilyStoreDonateItem(curPlayer, itemIndex, itemScore, itemGUID)  
 | 
            return  
 | 
        GameWorld.DebugLog("Õ½Ã˲ֿâûÓпռ䣬ÎÞ·¨¾èÔù!")  
 | 
          
 | 
    # ¾èÏ×ÎïÆ·½á¹û·µ»Ø  
 | 
    elif opType == "DonateItem":  
 | 
        pass  
 | 
      
 | 
    # ¶Ò»»ÎïÆ·  
 | 
    elif opType == "Exchange":  
 | 
        itemID = result[2]  
 | 
        needScore = result[3]  
 | 
        itemDict = result[4]  
 | 
        if itemDict:  
 | 
            # ¶Ò»»×°±¸Ä¬ÈÏ1¸ö£¬²»°ó¶¨  
 | 
            __DoGiveExchangeItem(curPlayer, itemID, 1, False, needScore, itemDict)  
 | 
          
 | 
    curPlayer.SetDict(ChConfig.Def_PlayerKey_QueryFamilyStoreTick, 0)  
 | 
    return  
 | 
  
 | 
  
 | 
#// A6 10  ¼Ò×å²Ö¿â¶Ò»»ÎïÆ· #tagCMFamilyStoreExchange  
 | 
#  
 | 
#struct     tagCMFamilyStoreExchange  
 | 
#{  
 | 
#    tagHead        Head;  
 | 
#    BYTE        StoreItemIndex;    // 0-¶Ò»»¿ÚÁ¸£»>0-¶Ò»»²Ö¿âÎïÆ·£¬1´ú±íË÷Òý0µÄÎïÆ·  
 | 
#    DWORD        ItemID;        // ¶Ò»»µÄÎïÆ·ID  
 | 
#    WORD        ExcangeCount;    // ¶Ò»»¸öÊý  
 | 
#};  
 | 
def OnFamilyStoreExchange(index, clientData, tick):  
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  
 | 
    itemIndex = clientData.StoreItemIndex  
 | 
    itemID = clientData.ItemID  
 | 
    excangeCount = clientData.ExcangeCount  
 | 
      
 | 
    # Áé³è¿ÚÁ¸¶Ò»»  
 | 
    if itemIndex <= 0:  
 | 
        __DoExchangePetFood(curPlayer, excangeCount)  
 | 
        return  
 | 
      
 | 
    # ·Ç¿ÚÁ¸¶Ò»»µÄ»°Ä¬È϶һ»1¸ö  
 | 
    hasSpace = ItemCommon.CheckPackHasSpace(curPlayer, IPY_GameWorld.rptItem)  
 | 
    if not hasSpace:  
 | 
        GameWorld.DebugLog("±³°üûÓпռ䣬ÎÞ·¨¶Ò»»£¡")  
 | 
        return  
 | 
      
 | 
    itemData = GameWorld.GetGameData().GetItemByTypeID(itemID)  
 | 
    if not itemData:  
 | 
        GameWorld.DebugLog("¶Ò»»ÎïÆ·ID²»´æÔÚ£¡itemID=%s" % itemID)  
 | 
        return  
 | 
      
 | 
    itemClassLV = ItemCommon.GetItemClassLV(itemData)  
 | 
    itemColor = itemData.GetItemColor()  
 | 
      
 | 
    ipyData = IpyGameDataPY.GetIpyGameData("PetEatEquip", itemColor, itemClassLV)  
 | 
    if not ipyData or not ipyData.GetFamilyStoreItemScore():  
 | 
        GameWorld.DebugLog("¸Ã×°±¸Ã»ÓÐÅäÖþèÔù»ý·Ö£¬ÎÞ·¨¶Ò»»£¡itemColor=%s,itemClassLV=%s" % (itemColor, itemClassLV))  
 | 
        return  
 | 
      
 | 
    needScore = ipyData.GetFamilyStoreItemScore() # ¶Ò»»ËùÐè»ý·Ö  
 | 
    if not PlayerControl.HaveMoney(curPlayer, ShareDefine.TYPE_Price_FamilyStoreScore, needScore):  
 | 
        GameWorld.DebugLog("²Ö¿â»ý·Ö²»×ã¶Ò»»£¡needScore=%s" % (needScore))  
 | 
        return  
 | 
      
 | 
    if not __CheckCanFamilyStoreOperate(curPlayer, tick):  
 | 
        return  
 | 
      
 | 
    msgList = ["Exchange", itemIndex - 1, itemID, needScore]  
 | 
    GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, "FamilyStore",  
 | 
                                                              '%s' % (msgList), len(str(msgList)))  
 | 
    return  
 | 
  
 | 
def __DoExchangePetFood(curPlayer, excangeCount):  
 | 
    petFoodExchange = IpyGameDataPY.GetFuncCfgIpyData("PetFoodExchange")  
 | 
    petFoodID = petFoodExchange.GetNumerical1()  
 | 
    petFoodCount = petFoodExchange.GetNumerical2() # µ¥´Î¶Ò»»»ñµÃµÄ¸öÊý  
 | 
    petFoodScore = petFoodExchange.GetNumerical3()  
 | 
      
 | 
    itemData = GameWorld.GetGameData().GetItemByTypeID(petFoodID)  
 | 
    if not itemData:  
 | 
        return  
 | 
      
 | 
    totalCount = excangeCount * petFoodCount  
 | 
    packCount = itemData.GetPackCount() # ¶ÑµþÉÏÏÞ  
 | 
    needSpace = int(math.ceil((totalCount) / float(packCount)))  
 | 
    spaceCount = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem, needSpace)  
 | 
      
 | 
    if spaceCount < needSpace:  
 | 
        GameWorld.DebugLog("±³°ü¿Õ¼ä²»×㣬ÎÞ·¨¶Ò»»¿ÚÁ¸£¡excangeCount=%s,needSpace=%s > spaceCount=%s"   
 | 
                           % (excangeCount, needSpace, spaceCount))  
 | 
        return  
 | 
      
 | 
    costScore = petFoodScore * excangeCount  
 | 
    if not PlayerControl.HaveMoney(curPlayer, ShareDefine.TYPE_Price_FamilyStoreScore, costScore):  
 | 
        GameWorld.DebugLog("²Ö¿â»ý·Ö²»×ã¶Ò»»£¡costScore=%s" % (costScore))  
 | 
        return  
 | 
      
 | 
    # ¶Ò»»¿ÚÁ¸Ä¬ÈÏ°ó¶¨  
 | 
    __DoGiveExchangeItem(curPlayer, petFoodID, totalCount, True, costScore)  
 | 
    return  
 | 
  
 | 
def __DoGiveExchangeItem(curPlayer, itemID, itemCount, isBind, costScore, itemDict={}):  
 | 
    # ¿ÛÇ®  
 | 
    PlayerControl.PayMoney(curPlayer, ShareDefine.TYPE_Price_FamilyStoreScore, costScore)  
 | 
      
 | 
    # ¸øÎïÆ·  
 | 
    if itemDict:  
 | 
        itemDict['IsBind'] = isBind  
 | 
        ItemControler.GivePlayerEquip(curPlayer, itemDict, event=[ChConfig.ItemGive_FamilyStore, False, {}])  
 | 
    else:  
 | 
        ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, isBind, [IPY_GameWorld.rptItem],   
 | 
                                     event=[ChConfig.ItemGive_FamilyStore, False, {}])  
 | 
          
 | 
    # ¹ã²¥Õ½ÃËÆµµÀ  
 | 
    PlayerControl.FamilyNotify(curPlayer.GetFamilyID(), "TreasuryExchange",   
 | 
                               [curPlayer.GetName(), costScore, itemID, itemDict.get("UserData","")])  
 | 
      
 | 
    GameWorld.DebugLog("__DoGiveExchangeItem, itemID=%s,itemCount=%s,isBind=%s,costScore=%s,itemDict=%s"   
 | 
                       % (itemID, itemCount, isBind, costScore, itemDict))  
 | 
    return  
 | 
  
 | 
      
 | 
def __CheckCanFamilyStoreOperate(curPlayer, tick):  
 | 
    ## ¼ì²éÕ½Ã˲ֿâ²Ù×÷CD  
 | 
    lastTick = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_QueryFamilyStoreTick)  
 | 
    if lastTick and tick - lastTick < 5000:  
 | 
        GameWorld.DebugLog("Õ½Ã˲ֿâ²Ù×÷CDÖÐ..., ÎÞ·¨´¦Àí£¡", curPlayer.GetPlayerID())  
 | 
        return False  
 | 
    curPlayer.SetDict(ChConfig.Def_PlayerKey_QueryFamilyStoreTick, tick)  
 | 
    return True  
 | 
  
 | 
  
 |