#!/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 not GameWorld.IsNormalPlayer(curPlayer): 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