#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package Player.PlayerFace # # @todo:Í·ÏñÍ·Ïñ¿ò # @author hxp # @date 2024-09-12 # @version 1.0 # # ÏêϸÃèÊö: Í·ÏñÍ·Ïñ¿ò # #------------------------------------------------------------------------------- #"""Version = 2024-09-12 12:00""" #------------------------------------------------------------------------------- import GameWorld import ShareDefine import PlayerControl import IPY_GameWorld import ChPyNetSendPack import IpyGameDataPY import NetPackCommon import ItemCommon import ChConfig import random import time def OnPlayerLogin(curPlayer): SyncFaceInfo(curPlayer) SyncFacePicInfo(curPlayer) return def OnMinute(curPlayer): curTime = int(time.time()) delFaceList = [] ipyDataMgr = IpyGameDataPY.IPY_Data() for index in range(ipyDataMgr.GetPlayerFaceCount()): ipyData = ipyDataMgr.GetPlayerFaceByIndex(index) faceID = ipyData.GetFaceID() if ipyData.GetUnlockDefault(): # ĬÈϼ¤»îµÄ²»´¦Àí continue if ipyData.GetCustomPlayerID(): # Íæ¼Ò¶¨ÖƵIJ»´¦Àí continue if not GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_FaceState, faceID): # δ¼¤»îµÄ²»´¦Àí continue endTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FaceEndTime % faceID) if not endTime or endTime > curTime: # ÓÀ¾Ã»òδ¹ýÆÚ continue if DelFace(curPlayer, faceID, False, "FaceTimeout"): delFaceList.append(faceID) if delFaceList: RefreshFaceAttr(curPlayer) delFacePicList = [] for index in range(ipyDataMgr.GetPlayerFacePicCount()): ipyData = ipyDataMgr.GetPlayerFacePicByIndex(index) facePicID = ipyData.GetFacePicID() if ipyData.GetUnlockDefault(): # ĬÈϼ¤»îµÄ²»´¦Àí continue if not GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_FacePicState, facePicID): # δ¼¤»îµÄ²»´¦Àí continue endTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FacePicEndTime % facePicID) if not endTime or endTime > curTime: # ÓÀ¾Ã»òδ¹ýÆÚ continue if DelFacePic(curPlayer, facePicID, False, "FacePicTimeout"): delFacePicList.append(facePicID) if delFacePicList: RefreshFacePicAttr(curPlayer) return def AddFace(curPlayer, faceID, setExpireTimes=None): if faceID <= 0: return playerID = curPlayer.GetPlayerID() ipyData = IpyGameDataPY.GetIpyGameData("PlayerFace", faceID) if not ipyData: return if ipyData.GetUnlockDefault(): GameWorld.DebugLog("ĬÈϽâËøµÄÍ·Ïñ²»ÓÃÌí¼Ó: faceID=%s" % (faceID), playerID) return if ipyData.GetCustomPlayerID(): GameWorld.DebugLog("Íæ¼Ò¶¨ÖƵÄÍ·Ïñ²»ÓÃÌí¼Ó: faceID=%s" % (faceID), playerID) return ipyExpireSeconds = ipyData.GetExpireMinutes() * 60 curTime = int(time.time()) state = GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_FaceState, faceID) endTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FaceEndTime % faceID) GameWorld.Log("Ìí¼ÓÍ·Ïñ: faceID=%s,setExpireTimes=%s,state=%s,endTime=%s,ipyExpireSeconds=%s,curTime=%s" % (faceID, setExpireTimes, state, endTime, ipyExpireSeconds, curTime), playerID) updEndTime = endTime # Ö¸¶¨Ê±³¤µÄ£¬ÈçGMÖ¸¶¨ if setExpireTimes > 0: updEndTime = curTime + setExpireTimes GameWorld.Log(" Ö¸¶¨Í·Ïñʱ³¤: faceID=%s,updEndTime=%s" % (faceID, updEndTime), playerID) # ÓÀ¾Ã elif ipyExpireSeconds == 0 or setExpireTimes == 0: updEndTime = 0 GameWorld.Log(" Ìí¼ÓÓÀ¾ÃÍ·Ïñ: faceID=%s,updEndTime=%s" % (faceID, updEndTime), playerID) else: # δ¹ýÆÚ if endTime > curTime: updEndTime = endTime + ipyExpireSeconds GameWorld.Log(" ÀÛ¼ÓÍ·Ïñʱ³¤: faceID=%s,updEndTime=%s" % (faceID, updEndTime), playerID) else: updEndTime = curTime + ipyExpireSeconds GameWorld.Log(" ÖØÐ¼¤»îÍ·Ïñ: faceID=%s,updEndTime=%s" % (faceID, updEndTime), playerID) GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_FaceState, faceID, 1) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FaceEndTime % faceID, updEndTime) RefreshFaceAttr(curPlayer) SyncFaceInfo(curPlayer, [faceID]) return True def DelFace(curPlayer, faceID, isRefreshAttr=True, notifyMail=""): playerID = curPlayer.GetPlayerID() ipyData = IpyGameDataPY.GetIpyGameData("PlayerFace", faceID) if not ipyData: return if ipyData.GetUnlockDefault(): return if ipyData.GetCustomPlayerID(): return GameWorld.Log("ɾ³ýÍ·Ïñ: faceID=%s,notifyMail=%s" % (faceID, notifyMail), playerID) GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_FaceState, faceID, 0) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FaceEndTime % faceID, 0) # ÐǼ¶²»ÖØÖã¬ÖØÐ¼¤»îºóÔÙ´ÎÉúЧ if curPlayer.GetFace() == faceID: defaultFaceIDList = GetDefaultFaceIDList() randFace = random.choice(defaultFaceIDList) if defaultFaceIDList else 0 curPlayer.SetFace(randFace) GameWorld.DebugLog("Íæ¼ÒÅå´÷µÄÍ·Ïñ±»É¾³ý£¬Ëæ»úÖØÖÃĬÈÏÍ·Ïñ! randFace=%s" % randFace, playerID) if isRefreshAttr: RefreshFaceAttr(curPlayer) SyncFaceInfo(curPlayer, [faceID]) if notifyMail: PlayerControl.SendMailByKey(notifyMail, [playerID], [], [faceID]) return True def GetDefaultFaceIDList(): defaultFaceIDList = [] ipyDataMgr = IpyGameDataPY.IPY_Data() for index in range(ipyDataMgr.GetPlayerFaceCount()): ipyData = ipyDataMgr.GetPlayerFaceByIndex(index) faceID = ipyData.GetFaceID() if not ipyData.GetUnlockDefault(): continue defaultFaceIDList.append(faceID) return defaultFaceIDList def GetDefaultFacePicIDList(): defaultFacePicIDList = [] ipyDataMgr = IpyGameDataPY.IPY_Data() for index in range(ipyDataMgr.GetPlayerFacePicCount()): ipyData = ipyDataMgr.GetPlayerFacePicByIndex(index) facePicID = ipyData.GetFacePicID() if not ipyData.GetUnlockDefault(): continue defaultFacePicIDList.append(facePicID) return defaultFacePicIDList def AddFacePic(curPlayer, facePicID, setExpireTimes=None): if facePicID <= 0: return playerID = curPlayer.GetPlayerID() ipyData = IpyGameDataPY.GetIpyGameData("PlayerFacePic", facePicID) if not ipyData: return if ipyData.GetUnlockDefault(): GameWorld.DebugLog("ĬÈϽâËøµÄÍ·Ïñ¿ò²»ÓÃÌí¼Ó: facePicID=%s" % (facePicID), playerID) return ipyExpireSeconds = ipyData.GetExpireMinutes() * 60 curTime = int(time.time()) state = GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_FacePicState, facePicID) endTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FacePicEndTime % facePicID) GameWorld.Log("Ìí¼ÓÍ·Ïñ¿ò: facePicID=%s,setExpireTimes=%s,state=%s,endTime=%s,ipyExpireSeconds=%s,curTime=%s" % (facePicID, setExpireTimes, state, endTime, ipyExpireSeconds, curTime), playerID) updEndTime = endTime # Ö¸¶¨Ê±³¤µÄ£¬ÈçGMÖ¸¶¨ if setExpireTimes > 0: updEndTime = curTime + setExpireTimes GameWorld.Log(" Ö¸¶¨Í·Ïñ¿òʱ³¤: facePicID=%s,updEndTime=%s" % (facePicID, updEndTime), playerID) # ÓÀ¾Ã elif ipyExpireSeconds == 0 or setExpireTimes == 0: updEndTime = 0 GameWorld.Log(" Ìí¼ÓÓÀ¾ÃÍ·Ïñ¿ò: facePicID=%s,updEndTime=%s" % (facePicID, updEndTime), playerID) else: # δ¹ýÆÚ if endTime > curTime: updEndTime = endTime + ipyExpireSeconds GameWorld.Log(" ÀÛ¼ÓÍ·Ïñ¿òʱ³¤: facePicID=%s,updEndTime=%s" % (facePicID, updEndTime), playerID) else: updEndTime = curTime + ipyExpireSeconds GameWorld.Log(" ÖØÐ¼¤»îÍ·Ïñ¿ò: facePicID=%s,updEndTime=%s" % (facePicID, updEndTime), playerID) GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_FacePicState, facePicID, 1) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FacePicEndTime % facePicID, updEndTime) RefreshFacePicAttr(curPlayer) SyncFacePicInfo(curPlayer, [facePicID]) return True def DelFacePic(curPlayer, facePicID, isRefreshAttr=True, notifyMail=""): playerID = curPlayer.GetPlayerID() ipyData = IpyGameDataPY.GetIpyGameData("PlayerFacePic", facePicID) if not ipyData: return if ipyData.GetUnlockDefault(): return GameWorld.Log("ɾ³ýÍ·Ïñ¿ò: facePicID=%s,notifyMail=%s" % (facePicID, notifyMail), playerID) GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_FacePicState, facePicID, 0) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FacePicEndTime % facePicID, 0) # ÐǼ¶²»ÖØÖã¬ÖØÐ¼¤»îºóÔÙ´ÎÉúЧ if curPlayer.GetFacePic() == facePicID: defaultFacePicIDList = GetDefaultFacePicIDList() randFacePic = random.choice(defaultFacePicIDList) if defaultFacePicIDList else 0 curPlayer.SetFacePic(randFacePic) GameWorld.DebugLog("Íæ¼ÒÅå´÷µÄÍ·Ïñ¿ò¹ýÆÚ£¬Ëæ»úÖØÖÃĬÈÏÍ·Ïñ¿ò! randFacePic=%s" % randFacePic, playerID) if isRefreshAttr: RefreshFacePicAttr(curPlayer) SyncFacePicInfo(curPlayer, [facePicID]) if notifyMail: PlayerControl.SendMailByKey(notifyMail, [playerID], [], [facePicID]) return True def IsFaceCanUse(curPlayer, faceID, ipyData=None): ## Í·ÏñÊÇ·ñ¿ÉÓà state = GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_FaceState, faceID) if state: return True if not ipyData: ipyData = IpyGameDataPY.GetIpyGameData("PlayerFace", faceID) if ipyData: if ipyData.GetUnlockDefault(): return True if ipyData.GetCustomPlayerID() and ipyData.GetCustomPlayerID() == curPlayer.GetPlayerID(): return True return False def IsFacePicCanUse(curPlayer, facePicID, ipyData=None): ## Í·Ïñ¿òÊÇ·ñ¿ÉÓà state = GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_FacePicState, facePicID) if state: return True if not ipyData: ipyData = IpyGameDataPY.GetIpyGameData("PlayerFacePic", facePicID) if ipyData: if ipyData.GetUnlockDefault(): return True return False def RefreshFaceAttr(curPlayer): CalcFaceAttr(curPlayer) PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState() return def RefreshFacePicAttr(curPlayer): CalcFacePicAttr(curPlayer) PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState() return def CalcFaceAttr(curPlayer): ## ¼ÆËãÍ·ÏñÊôÐÔ fightPowerEx = 0 allAttrList = [{} for i in range(4)] ipyDataMgr = IpyGameDataPY.IPY_Data() for index in range(ipyDataMgr.GetPlayerFaceCount()): ipyData = ipyDataMgr.GetPlayerFaceByIndex(index) faceID = ipyData.GetFaceID() if not IsFaceCanUse(curPlayer, faceID, ipyData): continue fightPowerEx += ipyData.GetLightFightPower() # ¼¤»îÊôÐÔ lightAttrType = ipyData.GetLightAttrType() lightAttrValue = ipyData.GetLightAttrValue() for i, attrID in enumerate(lightAttrType): attrValue = lightAttrValue[i] PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrList) # ÐǼ¶ÊôÐÔ faceStar = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FaceStar % faceID) starIpyData = IpyGameDataPY.GetIpyGameDataNotLog("PlayerFaceStar", faceID, faceStar) if starIpyData: starAttrType = starIpyData.GetStarAttrType() starAttrValue = starIpyData.GetStarAttrValue() for i, attrID in enumerate(starAttrType): attrValue = starAttrValue[i] PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrList) # ±£´æ¼ÆËãÖµ PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Face, allAttrList) curPlayer.SetDict(ChConfig.Def_PlayerKey_MFPEx % ShareDefine.Def_MFPType_Face, fightPowerEx) return def CalcFacePicAttr(curPlayer): ## ¼ÆËãÍ·Ïñ¿òÊôÐÔ fightPowerEx = 0 allAttrList = [{} for _ in range(4)] ipyDataMgr = IpyGameDataPY.IPY_Data() for index in range(ipyDataMgr.GetPlayerFacePicCount()): ipyData = ipyDataMgr.GetPlayerFacePicByIndex(index) facePicID = ipyData.GetFacePicID() if not IsFacePicCanUse(curPlayer, facePicID, ipyData): continue fightPowerEx += ipyData.GetLightFightPower() # ¼¤»îÊôÐÔ lightAttrType = ipyData.GetLightAttrType() lightAttrValue = ipyData.GetLightAttrValue() for i, attrID in enumerate(lightAttrType): attrValue = lightAttrValue[i] PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrList) # ÐǼ¶ÊôÐÔ facePicStar = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FacePicStar % facePicID) starIpyData = IpyGameDataPY.GetIpyGameDataNotLog("PlayerFacePicStar", facePicID, facePicStar) if starIpyData: starAttrType = starIpyData.GetStarAttrType() starAttrValue = starIpyData.GetStarAttrValue() for i, attrID in enumerate(starAttrType): attrValue = starAttrValue[i] PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrList) # ±£´æ¼ÆËãÖµ PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_FacePic, allAttrList) curPlayer.SetDict(ChConfig.Def_PlayerKey_MFPEx % ShareDefine.Def_MFPType_FacePic, fightPowerEx) return #// B2 26 Í·Ïñ»Ã»¯ #tagCMFaceChange # #struct tagCMFaceChange #{ # tagHead Head; # DWORD FaceID; // »Ã»¯µÄID #}; def OnFaceChange(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) playerID = curPlayer.GetPlayerID() faceID = clientData.FaceID if not IsFaceCanUse(curPlayer, faceID): GameWorld.DebugLog("¸ÃÍ·Ïñ²»¿ÉÓÃ! faceID=%s" % (faceID), playerID) return GameWorld.DebugLog("Í·Ïñ»Ã»¯! faceID=%s" % (faceID), playerID) curPlayer.SetFace(faceID) return #// B2 27 Í·ÏñÉýÐÇ #tagCMFaceStarUP # #struct tagCMFaceStarUP #{ # tagHead Head; # DWORD FaceID; #}; def OnFaceStarUP(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) playerID = curPlayer.GetPlayerID() faceID = clientData.FaceID if not IsFaceCanUse(curPlayer, faceID): GameWorld.DebugLog("¸ÃÍ·Ïñ²»¿ÉÓÃ! faceID=%s" % (faceID), playerID) return curStar = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FaceStar % faceID) nextStar = curStar + 1 nextIpyData = IpyGameDataPY.GetIpyGameData("PlayerFaceStar", faceID, nextStar) if not nextIpyData: GameWorld.DebugLog("²»´æÔÚ¸ÃÍ·ÏñÐǼ¶! faceID=%s,nextStar=%s" % (faceID, nextStar), playerID) return needItemList = nextIpyData.GetStarUpNeedItemList() if not needItemList: return itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem) lackItemDict, delInfoDict = ItemCommon.GetCostItemIndexList(needItemList, itemPack) if lackItemDict: GameWorld.DebugLog("Í·ÏñÉýÐÇËùÐèÎïÆ·²»×ã! faceID=%s,nextStar=%s,needItemList=%s,lackItemDict=%s" % (faceID, nextStar, needItemList, lackItemDict), playerID) return ItemCommon.DelCostItem(curPlayer, itemPack, delInfoDict, "FaceStarUP") PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FaceStar % faceID, nextStar) GameWorld.DebugLog("Í·ÏñÉýÐÇ! faceID=%s,curStar=%s,nextStar=%s" % (faceID, curStar, nextStar), playerID) RefreshFaceAttr(curPlayer) SyncFaceInfo(curPlayer, [faceID]) return #// B2 28 Í·Ïñ¿ò»Ã»¯ #tagCMFacePicChange # #struct tagCMFacePicChange #{ # tagHead Head; # DWORD FacePicID; // »Ã»¯µÄID #}; def OnFacePicChange(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) playerID = curPlayer.GetPlayerID() facePicID = clientData.FacePicID if not IsFacePicCanUse(curPlayer, facePicID): GameWorld.DebugLog("¸ÃÍ·Ïñ¿ò²»¿ÉÓÃ! facePicID=%s" % (facePicID), playerID) return GameWorld.DebugLog("Í·Ïñ¿ò»Ã»¯! facePicID=%s" % (facePicID), playerID) curPlayer.SetFacePic(facePicID) return #// B2 29 Í·Ïñ¿òÉýÐÇ #tagCMFacePicStarUP # #struct tagCMFacePicStarUP #{ # tagHead Head; # DWORD FacePicID; #}; def OnFacePicStarUP(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) playerID = curPlayer.GetPlayerID() facePicID = clientData.FacePicID if not IsFacePicCanUse(curPlayer, facePicID): GameWorld.DebugLog("¸ÃÍ·Ïñ¿ò²»¿ÉÓÃ! facePicID=%s" % (facePicID), playerID) return curStar = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FacePicStar % facePicID) nextStar = curStar + 1 nextIpyData = IpyGameDataPY.GetIpyGameData("PlayerFacePicStar", facePicID, nextStar) if not nextIpyData: GameWorld.DebugLog("²»´æÔÚ¸ÃÍ·Ïñ¿òÐǼ¶! facePicID=%s,nextStar=%s" % (facePicID, nextStar), playerID) return needItemList = nextIpyData.GetStarUpNeedItemList() if not needItemList: return itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem) lackItemDict, delInfoDict = ItemCommon.GetCostItemIndexList(needItemList, itemPack) if lackItemDict: GameWorld.DebugLog("Í·Ïñ¿òÉýÐÇËùÐèÎïÆ·²»×ã! facePicID=%s,nextStar=%s,needItemList=%s,lackItemDict=%s" % (facePicID, nextStar, needItemList, lackItemDict), playerID) return ItemCommon.DelCostItem(curPlayer, itemPack, delInfoDict, "FacePicStarUP") PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FacePicStar % facePicID, nextStar) GameWorld.DebugLog("Í·Ïñ¿òÉýÐÇ! facePicID=%s,curStar=%s,nextStar=%s" % (facePicID, curStar, nextStar), playerID) RefreshFacePicAttr(curPlayer) SyncFacePicInfo(curPlayer, [facePicID]) return def SyncFaceInfo(curPlayer, faceIDList=None): if faceIDList == None: syncIDList = [] ipyDataMgr = IpyGameDataPY.IPY_Data() for index in range(ipyDataMgr.GetPlayerFaceCount()): ipyData = ipyDataMgr.GetPlayerFaceByIndex(index) syncIDList.append(ipyData.GetFaceID()) else: syncIDList = faceIDList faceList = [] for faceID in syncIDList: state = GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_FaceState, faceID) if not state and faceIDList == None: continue face = ChPyNetSendPack.tagMCFace() face.FaceID = faceID face.State = state face.EndTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FaceEndTime % faceID) face.Star = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FaceStar % faceID) faceList.append(face) if not faceList: return clientPack = ChPyNetSendPack.tagMCFaceInfo() clientPack.FaceList = faceList clientPack.Count = len(clientPack.FaceList) NetPackCommon.SendFakePack(curPlayer, clientPack) return def SyncFacePicInfo(curPlayer, facePicIDList=None): if facePicIDList == None: syncIDList = [] ipyDataMgr = IpyGameDataPY.IPY_Data() for index in range(ipyDataMgr.GetPlayerFacePicCount()): ipyData = ipyDataMgr.GetPlayerFacePicByIndex(index) syncIDList.append(ipyData.GetFacePicID()) else: syncIDList = facePicIDList facePicList = [] for facePicID in syncIDList: state = GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_FacePicState, facePicID) if not state and facePicIDList == None: continue facePic = ChPyNetSendPack.tagMCFacePic() facePic.FacePicID = facePicID facePic.State = state facePic.EndTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FacePicEndTime % facePicID) facePic.Star = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FacePicStar % facePicID) facePicList.append(facePic) if not facePicList: return clientPack = ChPyNetSendPack.tagMCFacePicInfo() clientPack.FacePicList = facePicList clientPack.Count = len(clientPack.FacePicList) NetPackCommon.SendFakePack(curPlayer, clientPack) return