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