#!/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 PlayerFamily import PlayerControl import IPY_GameWorld import ChPyNetSendPack import IpyGameDataPY import NetPackCommon import ItemCommon import PlayerHero import PlayerHJG import ChConfig import ObjPool 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 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 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, isFree=False): if faceID <= 0: return playerID = curPlayer.GetPlayerID() ipyData = IpyGameDataPY.GetIpyGameData("PlayerFace", faceID) if not ipyData: return if ipyData.GetUnlockWay() != 2: GameWorld.DebugLog("·ÇµÀ¾ß¼¤»îµÄ²»ÓÃÌí¼Ó: faceID=%s" % (faceID), playerID) return if not isFree: itemID = ipyData.GetUnlockValue() itemCount = ipyData.GetUnlockNeedCnt() if not itemID or not itemCount: return needItemList = [[itemID, itemCount]] itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem) lackItemDict, delInfoDict = ItemCommon.GetCostItemIndexList(needItemList, itemPack) if lackItemDict: GameWorld.DebugLog("¼¤»îËùÐèÎïÆ·²»×ã! faceID=%s,lackItemDict=%s" % (faceID, lackItemDict), playerID) return ItemCommon.DelCostItem(curPlayer, itemPack, delInfoDict, "AddFace") 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 not GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_FaceState, faceID): 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) PlayerFamily.RefreshFamilyMember(curPlayer) 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 ipyData.GetUnlockWay() != 1: continue defaultFaceIDList.append(faceID) return defaultFaceIDList 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: unlockWay = ipyData.GetUnlockWay() unlockValue = ipyData.GetUnlockValue() if unlockWay == 1: # ĬÈϼ¤»îµÄ return True if unlockWay == 3: # ¹ØÁªÎ佫 heroID = unlockValue return True if PlayerHero.GetHeroActivite(curPlayer, heroID) else False return False def RefreshFaceAttr(curPlayer): PlayerHJG.RefreshHJGAttr(curPlayer) return def OnUseFace(curPlayer, faceID): playerID = curPlayer.GetPlayerID() if not IsFaceCanUse(curPlayer, faceID): GameWorld.DebugLog("¸ÃÍ·Ïñ²»¿ÉÓÃ! faceID=%s" % (faceID), playerID) return GameWorld.DebugLog("Í·Ïñ»Ã»¯! faceID=%s" % (faceID), playerID) curPlayer.SetFace(faceID) PlayerFamily.RefreshFamilyMember(curPlayer) return def OnFaceStarUP(curPlayer, faceID): playerID = curPlayer.GetPlayerID() if not IsFaceCanUse(curPlayer, faceID): GameWorld.DebugLog("¸ÃÍ·Ïñ²»¿ÉÓÃ! faceID=%s" % (faceID), playerID) return ipyData = IpyGameDataPY.GetIpyGameData("PlayerFace", faceID) if not ipyData: return starMax = ipyData.GetStarMax() curStar = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FaceStar % faceID) if curStar >= starMax: GameWorld.DebugLog("Í·ÏñÐǼ¶ÒÑÂú! faceID=%s,curStar=%s >= %s" % (faceID, curStar, starMax), playerID) return if ipyData.GetUnlockWay() != 2: return itemID = ipyData.GetUnlockValue() itemCount = ipyData.GetUnlockNeedCnt() if not itemID or not itemCount: return needItemList = [[itemID, itemCount]] itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem) lackItemDict, delInfoDict = ItemCommon.GetCostItemIndexList(needItemList, itemPack) if lackItemDict: GameWorld.DebugLog("Í·ÏñÉýÐÇËùÐèÎïÆ·²»×ã! faceID=%s,lackItemDict=%s" % (faceID, lackItemDict), playerID) return ItemCommon.DelCostItem(curPlayer, itemPack, delInfoDict, "FaceStarUP") nextStar = curStar + 1 GameWorld.DebugLog("Í·ÏñÉýÐÇ! faceID=%s,nextStar=%s" % (faceID, nextStar), playerID) SetFaceStar(curPlayer, faceID, nextStar) return def SetFaceStar(curPlayer, faceID, setStar): if not IsFaceCanUse(curPlayer, faceID): return ipyData = IpyGameDataPY.GetIpyGameData("PlayerFace", faceID) if not ipyData: return setStar = min(setStar, ipyData.GetStarMax()) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FaceStar % faceID, setStar) RefreshFaceAttr(curPlayer) SyncFaceInfo(curPlayer, [faceID]) return True 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 = ObjPool.GetPoolMgr().acquire(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 = ObjPool.GetPoolMgr().acquire(ChPyNetSendPack.tagMCFaceInfo) clientPack.FaceList = faceList clientPack.Count = len(clientPack.FaceList) NetPackCommon.SendFakePack(curPlayer, clientPack) return ## ------------------------------------------------------------------------------------------------ def AddFacePic(curPlayer, facePicID, setExpireTimes=None, isFree=False): if facePicID <= 0: return playerID = curPlayer.GetPlayerID() ipyData = IpyGameDataPY.GetIpyGameData("PlayerFacePic", facePicID) if not ipyData: return if ipyData.GetUnlockWay() != 2: GameWorld.DebugLog("·ÇµÀ¾ß¼¤»îµÄ²»ÓÃÌí¼Ó: facePicID=%s" % (facePicID), playerID) return if not isFree: itemID = ipyData.GetUnlockValue() itemCount = ipyData.GetUnlockNeedCnt() if not itemID or not itemCount: return needItemList = [[itemID, itemCount]] itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem) lackItemDict, delInfoDict = ItemCommon.GetCostItemIndexList(needItemList, itemPack) if lackItemDict: GameWorld.DebugLog("¼¤»îËùÐèÎïÆ·²»×ã! facePicID=%s,lackItemDict=%s" % (facePicID, lackItemDict), playerID) return ItemCommon.DelCostItem(curPlayer, itemPack, delInfoDict, "AddFacePic") 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 not GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_FacePicState, facePicID): 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) PlayerFamily.RefreshFamilyMember(curPlayer) if isRefreshAttr: RefreshFacePicAttr(curPlayer) SyncFacePicInfo(curPlayer, [facePicID]) if notifyMail: PlayerControl.SendMailByKey(notifyMail, [playerID], [], [facePicID]) return True def GetDefaultFacePicIDList(): defaultFacePicIDList = [] ipyDataMgr = IpyGameDataPY.IPY_Data() for index in range(ipyDataMgr.GetPlayerFacePicCount()): ipyData = ipyDataMgr.GetPlayerFacePicByIndex(index) facePicID = ipyData.GetFacePicID() if ipyData.GetUnlockWay() != 1: continue defaultFacePicIDList.append(facePicID) return defaultFacePicIDList 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: unlockWay = ipyData.GetUnlockWay() if unlockWay == 1: # ĬÈϼ¤»îµÄ return True return False def RefreshFacePicAttr(curPlayer): PlayerHJG.RefreshHJGAttr(curPlayer) return def OnUseFacePic(curPlayer, facePicID): playerID = curPlayer.GetPlayerID() if not IsFacePicCanUse(curPlayer, facePicID): GameWorld.DebugLog("¸ÃÍ·Ïñ¿ò²»¿ÉÓÃ! facePicID=%s" % (facePicID), playerID) return GameWorld.DebugLog("Í·Ïñ¿ò»Ã»¯! facePicID=%s" % (facePicID), playerID) curPlayer.SetFacePic(facePicID) PlayerFamily.RefreshFamilyMember(curPlayer) return def OnFacePicStarUP(curPlayer, facePicID): playerID = curPlayer.GetPlayerID() if not IsFacePicCanUse(curPlayer, facePicID): GameWorld.DebugLog("¸ÃÍ·Ïñ¿ò²»¿ÉÓÃ! facePicID=%s" % (facePicID), playerID) return ipyData = IpyGameDataPY.GetIpyGameData("PlayerFacePic", facePicID) if not ipyData: return starMax = ipyData.GetStarMax() curStar = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FacePicStar % facePicID) if curStar >= starMax: GameWorld.DebugLog("Í·Ïñ¿òÐǼ¶ÒÑÂú! facePicID=%s,curStar=%s >= %s" % (facePicID, curStar, starMax), playerID) return if ipyData.GetUnlockWay() != 2: return itemID = ipyData.GetUnlockValue() itemCount = ipyData.GetUnlockNeedCnt() if not itemID or not itemCount: return needItemList = [[itemID, itemCount]] itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem) lackItemDict, delInfoDict = ItemCommon.GetCostItemIndexList(needItemList, itemPack) if lackItemDict: GameWorld.DebugLog("Í·Ïñ¿òÉýÐÇËùÐèÎïÆ·²»×ã! facePicID=%s,lackItemDict=%s" % (facePicID, lackItemDict), playerID) return ItemCommon.DelCostItem(curPlayer, itemPack, delInfoDict, "FacePicStarUP") nextStar = curStar + 1 GameWorld.DebugLog("Í·Ïñ¿òÉýÐÇ! facePicID=%s,nextStar=%s" % (facePicID, nextStar), playerID) SetFacePicStar(curPlayer, facePicID, nextStar) return def SetFacePicStar(curPlayer, facePicID, setStar): if not IsFacePicCanUse(curPlayer, facePicID): return ipyData = IpyGameDataPY.GetIpyGameData("PlayerFacePic", facePicID) if not ipyData: return setStar = min(setStar, ipyData.GetStarMax()) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FacePicStar % facePicID, setStar) RefreshFacePicAttr(curPlayer) SyncFacePicInfo(curPlayer, [facePicID]) return True 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 = ObjPool.GetPoolMgr().acquire(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 = ObjPool.GetPoolMgr().acquire(ChPyNetSendPack.tagMCFacePicInfo) clientPack.FacePicList = facePicList clientPack.Count = len(clientPack.FacePicList) NetPackCommon.SendFakePack(curPlayer, clientPack) return