| #!/usr/bin/python | 
| # -*- coding: GBK -*- | 
| #------------------------------------------------------------------------------- | 
| # | 
| ##@package Player.PlayerFamilyZhenfa | 
| # | 
| # @todo:ÏÉÃËÕó·¨ | 
| # @author hxp | 
| # @date 2023-10-11 | 
| # @version 1.0 | 
| # | 
| # ÏêϸÃèÊö: ÏÉÃËÕó·¨ | 
| # | 
| #------------------------------------------------------------------------------- | 
| #"""Version = 2023-10-11 16:30""" | 
| #------------------------------------------------------------------------------- | 
|   | 
| import GameWorld | 
| import ItemCommon | 
| import ShareDefine | 
| import PlayerControl | 
| import NetPackCommon | 
| import ChPyNetSendPack | 
| import IpyGameDataPY | 
| import PlayerSuccess | 
| import IPY_GameWorld | 
| import PyGameData | 
| import ChConfig | 
|   | 
| ZhenfaKey_LV = "LV" | 
| ZhenfaKey_Exp = "Exp" | 
|   | 
| def OnPlayerLogin(curPlayer): | 
|     Sync_FamilyZhenfaInfo(curPlayer) | 
|     return | 
|   | 
| def OnLeaveFamily(curPlayer): | 
|     #Sync_FamilyZhenfaInfo(curPlayer) | 
|     RefreshZhenfaAttr(curPlayer) | 
|     return | 
|   | 
| def OnEnterFamily(curPlayer): | 
|     Sync_FamilyZhenfaInfo(curPlayer) | 
|     RefreshZhenfaAttr(curPlayer) | 
|     return | 
|   | 
| def GetFamilyZhenfaInfo(familyID, zhenfaType, key, defValue=0): | 
|     ## »ñÈ¡¼Ò×åÕó·¨ÐÅÏ¢ | 
|     zhenfaInfo = PyGameData.g_familyZhenfaInfo.get(familyID, {}) | 
|     info = zhenfaInfo.get(zhenfaType, {}) | 
|     return info.get(key, defValue) | 
|   | 
| def GameServer_FamilyZhenfa(msgDict): | 
|     zhenfaInfo = msgDict.get("zhenfaInfo", {}) # {familyID:{zhenfaType:{k:v, }, ...}, ...} | 
|     msgType = msgDict.get("msgType", "") | 
|     familyID = msgDict.get("familyID", 0) # Ö¸¶¨¸üеÄÏÉÃË | 
|     playerID = msgDict.get("playerID", 0) # ´¥·¢¸üеÄÍæ¼ÒID | 
|     refreshAttr = msgDict.get("refreshAttr", 1) | 
|      | 
|     # ËùÓÐÏÉÃË£¬Ö±½ÓÌæ»» | 
|     if msgType == "allFamily": | 
|         PyGameData.g_familyZhenfaInfo = zhenfaInfo | 
|     # µ¥¸öÏÉÃ˸üР| 
|     else: | 
|         PyGameData.g_familyZhenfaInfo.update(zhenfaInfo) | 
|          | 
|     #GameWorld.DebugLog("¸üÐÂÕó·¨ÐÅÏ¢: %s" % PyGameData.g_familyZhenfaInfo) | 
|     playerManager = GameWorld.GetPlayerManager() | 
|     for index in xrange(playerManager.GetPlayerCount()): | 
|         curPlayer = playerManager.GetPlayerByIndex(index) | 
|         if curPlayer.GetID() == 0: | 
|             continue | 
|          | 
|         if familyID and curPlayer.GetFamilyID() != familyID: | 
|             continue | 
|          | 
|         OnFamilyZhenfaRefresh(curPlayer, refreshAttr, playerID) | 
|          | 
|     return | 
|   | 
| def SendGameServer_FamilyZhenfa(curPlayer, familyID, playerID, msgType, msgData): | 
|     GameWorld.DebugLog("ÏÉÃËÕó·¨Í¬²½GameServer: familyID=%s,msgType=%s,%s" % (familyID, msgType, msgData), playerID) | 
|     msgInfo = str([familyID, playerID, msgType, msgData]) | 
|     GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(playerID, 0, 0, "FamilyZhenfa", msgInfo, len(msgInfo)) | 
|     return | 
|   | 
| #// A6 14 ¼Ò×åÕó·¨Éý¼¶ #tagCMFamilyZhenfaLVUP | 
| # | 
| #struct     tagCMFamilyZhenfaLVUP | 
| #{ | 
| #    tagHead        Head; | 
| #    BYTE        ZhenfaType;    // Õó·¨ÀàÐÍ | 
| #    DWORD        ItemID;        // ÏûºÄµÄÎïÆ·ID | 
| #    WORD        ItemCount;    // ÏûºÄ¸öÊý£¬Ä¬ÈÏ1 | 
| #}; | 
| def OnFamilyZhenfaLVUP(index, clientData, tick): | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) | 
|     playerID = curPlayer.GetPlayerID() | 
|     familyID = curPlayer.GetFamilyID() | 
|     zhenfaType = clientData.ZhenfaType | 
|     useItemID = clientData.ItemID | 
|     useItemCount = clientData.ItemCount | 
|     if not familyID: | 
|         GameWorld.DebugLog("ûÓÐÏÉÃË£¬ÎÞ·¨Éý¼¶Õó·¨", playerID) | 
|         return | 
|     if not useItemID or useItemCount <= 0: | 
|         GameWorld.DebugLog("ûÓÐÖ¸¶¨Éý¼¶Õó·¨ÎïÆ·: useItemID=%s,useItemCount=%s" % (useItemID, useItemCount), playerID) | 
|         return | 
|     zhenfaLV = GetFamilyZhenfaInfo(familyID, zhenfaType, ZhenfaKey_LV) | 
|     ipyData = IpyGameDataPY.GetIpyGameData("FamilyZhenfa", zhenfaType, zhenfaLV) | 
|     if not ipyData: | 
|         return | 
|     LVUpNeedExp = ipyData.GetLVUpNeedExp() | 
|     if not LVUpNeedExp: | 
|         GameWorld.DebugLog("¸ÃÕó·¨ÒÑÂú¼¶:zhenfaType=%s,zhenfaLV=%s" % (zhenfaType, zhenfaLV), playerID) | 
|         return | 
|     expItemDict = IpyGameDataPY.GetFuncEvalCfg("FamilyZhenfa", 1) | 
|     if str(zhenfaType) not in expItemDict: | 
|         GameWorld.DebugLog("²»´æÔÚ¸ÃÕó·¨ÀàÐÍ: zhenfaType=%s" % zhenfaType, playerID) | 
|         return | 
|     expItemList = expItemDict[str(zhenfaType)] | 
|      | 
|     if useItemID not in expItemList: | 
|         GameWorld.DebugLog("¸ÃÎïÆ·²»ÄÜÉý¼¶¸ÃÕó·¨:zhenfaType=%s,useItemID=%s not in %s" % (zhenfaType, useItemID, expItemList), playerID) | 
|         return | 
|      | 
|     itemData = GameWorld.GetGameData().GetItemByTypeID(useItemID) | 
|     if not itemData: | 
|         return | 
|     itemExp = itemData.GetEffectByIndex(0).GetEffectValue(0) # Ä¬ÈÏЧ¹û1 AֵΪ¿É¼Ó¾Ñé | 
|     if not itemExp: | 
|         GameWorld.DebugLog("¸ÃÎïÆ·Ã»ÓÐÕ󷨾Ñé:useItemID=%s" % useItemID, playerID) | 
|         return | 
|      | 
|     itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem) | 
|     lackItemDict, delInfoDict = ItemCommon.GetCostItemIndexList({useItemID:useItemCount}, itemPack) | 
|     if lackItemDict: | 
|         GameWorld.DebugLog("Õó·¨Éý¼¶ÎïÆ·²»×ã:useItemID=%s,useItemCount=%s,lackItemDict=%s" % (useItemID, useItemCount, lackItemDict), playerID) | 
|         return | 
|      | 
|     if not GameWorld.SetPlayerTickTime(curPlayer, ChConfig.TYPE_Player_Tick_FamilyZhenfa, tick): | 
|         GameWorld.DebugLog("Õó·¨Éý¼¶²Ù×÷CDÖÐ...", playerID) | 
|         PlayerControl.NotifyCode(curPlayer, "RequestLater") | 
|         return | 
|      | 
|     ItemCommon.DelCostItem(curPlayer, itemPack, delInfoDict, "FamilyZhenfaLVUP") | 
|      | 
|     addTotalExp = itemExp * useItemCount | 
|     PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_FamilyZhenfaExp, addTotalExp) | 
|      | 
|     SendGameServer_FamilyZhenfa(curPlayer, familyID, playerID, "AddExp", [zhenfaType, addTotalExp]) | 
|     return | 
|   | 
| def OnFamilyZhenfaRefresh(curPlayer, refreshAttr, opPlayerID): | 
|     if curPlayer.GetPlayerID() == opPlayerID: | 
|         curPlayer.SetTickByType(ChConfig.TYPE_Player_Tick_FamilyZhenfa, 0) | 
|          | 
|     Sync_FamilyZhenfaInfo(curPlayer, opPlayerID) | 
|      | 
|     if refreshAttr: | 
|         RefreshZhenfaAttr(curPlayer) | 
|     return | 
|   | 
| def RefreshZhenfaAttr(curPlayer): | 
|     CalcZhenfaAttr(curPlayer) | 
|     PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState() | 
|     return | 
|   | 
| def CalcZhenfaAttr(curPlayer): | 
|      | 
|     allAttrList = [{} for i in range(4)] | 
|      | 
|     familyID = curPlayer.GetFamilyID() | 
|     if familyID: | 
|         expItemDict = IpyGameDataPY.GetFuncEvalCfg("FamilyZhenfa", 1) | 
|         zhenfaInfo = PyGameData.g_familyZhenfaInfo.get(familyID, {}) | 
|         for zhenfaTypeStr in expItemDict.keys(): | 
|             zhenfaType = int(zhenfaTypeStr) | 
|             info = zhenfaInfo.get(zhenfaType, {}) | 
|             zhenfaLV = info.get(ZhenfaKey_LV, 0) | 
|             ipyData = IpyGameDataPY.GetIpyGameData("FamilyZhenfa", zhenfaType, zhenfaLV) | 
|             if not ipyData: | 
|                 continue | 
|             attrTypeList, attrValueList = ipyData.GetLVAttrType(), ipyData.GetLVAttrValue() | 
|             for i, attrID in enumerate(attrTypeList): | 
|                 PlayerControl.CalcAttrDict_Type(attrID, attrValueList[i], allAttrList) | 
|                  | 
|     # ±£´æ¼ÆËãÖµ | 
|     PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_FamilyZhenfa, allAttrList)    | 
|     return | 
|   | 
| def Sync_FamilyZhenfaInfo(curPlayer, playerID=0): | 
|     familyID = curPlayer.GetFamilyID() | 
|     if not familyID: | 
|         return | 
|      | 
|     zhenfaInfoList = [] | 
|     zhenfaInfo = PyGameData.g_familyZhenfaInfo.get(familyID, {}) | 
|     for zhenfaType, info in zhenfaInfo.items(): | 
|         zhenfa = ChPyNetSendPack.tagMCFamilyZhenfa() | 
|         zhenfa.Clear() | 
|         zhenfa.ZhenfaType = zhenfaType | 
|         zhenfa.ZhenfaLV = info.get(ZhenfaKey_LV, 0) | 
|         zhenfa.ZhenfaExp = info.get(ZhenfaKey_Exp, 0) | 
|         zhenfaInfoList.append(zhenfa) | 
|          | 
|     clientPack = ChPyNetSendPack.tagMCFamilyZhenfaInfo() | 
|     clientPack.Clear() | 
|     clientPack.PlayerID = playerID | 
|     clientPack.ZhenfaInfoList = zhenfaInfoList | 
|     clientPack.Count = len(clientPack.ZhenfaInfoList) | 
|     NetPackCommon.SendFakePack(curPlayer, clientPack) | 
|     return |