#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package Player.GameFuncComm # # @todo:ÓÎÏ·¹¦ÄÜ¿ØÖÆÍ¨Óà # @author hxp # @date 2016-06-02 # @version 1.5 # # @change: "2016-08-19 16:30" hxp Éý¼¶¿ªÆô¹¦ÄÜÂß¼­´¦Àí # @change: "2016-08-30 15:00" hxp Ôö¼Ó¹¦ÄÜ¿ªÆôºóÉý¼¶ÐèÒª´¦ÀíµÄÂß¼­ # @change: "2016-12-08 12:00" hxp ¿ªÆôµÈ¼¶Ï¸»¯ # @change: "2016-12-09 12:00" hxp Éý¼¶´¥·¢¹ó×åÂß¼­ # @change: "2017-12-21 12:00" hxp ÊÖÓΰæÐÞ¸Ä(¼¤»î״̬¸ÄΪ·þÎñ¶Ë¼Ç¼ÊÇ·ñ¼¤»î£¬¼ò»¯Âß¼­£¬Ö§³Ö¶àÖÖ¼¤»î·½Ê½) # # ÏêϸÃèÊö: ÓÎÏ·¹¦ÄÜ¿ØÖÆÍ¨Óà # #------------------------------------------------------------------------------- #"""Version = 2017-12-21 12:00""" #------------------------------------------------------------------------------- import ChConfig import ChPyNetSendPack import GameWorld import NetPackCommon import ShareDefine import IpyGameDataPY import PlayerControl import PlayerSignDay import PlayerActBuyCountGift import PlayerActLoginNew import PlayerActTask import IPY_GameWorld import ItemCommon import ItemControler import PlayerArena import PlayerTask # ¹¦ÄÜ¿ªÆôÐèÖ´Ðеĺ¯Êý{¹¦ÄÜID:Ö´Ðк¯Êý, ...} º¯ÊýÐè·µ»ØÊÇ·ñ¼¤»î³É¹¦, ¹¦ÄÜ¿ªÆôÓÐÐèÒª´¦Àí¹¦ÄÜÂß¼­µÄÕâÀïÔö¼Óº¯Êýµ÷ÓÃÅäÖü´¿É FuncOpenLogicDict = { ShareDefine.GameFuncID_SignDay:lambda curObj:PlayerSignDay.DoSignDayOpen(curObj), ShareDefine.GameFuncID_Arena:lambda curObj:PlayerArena.DoArenaOpen(curObj), } def GetFuncOpenLVIpyData(funcID): return IpyGameDataPY.GetIpyGameData("FuncOpenLV", funcID) def DoFuncOpenLogic(curPlayer): '''Ö´Ðд¥·¢¹¦ÄÜ¿ªÆôÂß¼­ @param finishMissionIDList: Íê³ÉµÄÈÎÎñIDÁбí ''' #GameWorld.DebugLog("Ö´Ðд¥·¢¹¦ÄÜ¿ªÆôÂß¼­: finishMissionIDList=%s" % finishMissionIDList, curPlayer.GetPlayerID()) openFuncIDList = [] curLV = curPlayer.GetLV() ipyGameData = IpyGameDataPY.IPY_Data() funcOpenLVCount = ipyGameData.GetFuncOpenLVCount() for i in xrange(funcOpenLVCount): ipyData = ipyGameData.GetFuncOpenLVByIndex(i) funcID = ipyData.GetFuncId() limitMissionID = ipyData.GetLimitMissionID() if limitMissionID and not curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_MissionFinish % limitMissionID) \ and PlayerTask.IsTaskFinish(curPlayer, limitMissionID): PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_MissionFinish % limitMissionID, 1) GameWorld.DebugLog(" ÉèÖù¦ÄÜ¿ªÆôËùÐèÈÎÎñÍê³É: funcID=%s,limitMissionID=%s" % (funcID, limitMissionID), curPlayer.GetPlayerID()) isOpen = GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_GameFuncFirstTouch, funcID, True) if isOpen: #GameWorld.DebugLog(" ¹¦ÄÜÒѾ­¿ªÆô¹ý, ²»ÐèÒªÖØ¸´´¥·¢¿ªÆô! funcID=%s" % (funcID), curPlayer.GetPlayerID()) continue limitLV = ipyData.GetLimitLV() if limitLV and curLV < limitLV: continue limitRealmLV = ipyData.GetLimiRealmLV() if limitRealmLV and curPlayer.GetOfficialRank() < limitRealmLV: continue limitMissionID = ipyData.GetLimitMissionID() if limitMissionID and not curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_MissionFinish % limitMissionID): continue # ÏȸüÐÂÖµÔÙ´¦Àí¿ªÆôÂß¼­£¬²»ÄÜ¿ÉÄܵ¼ÖÂÔÚ¹¦ÄÜ¿ªÆôÂß¼­ÖÐÔÙ¿ªÆô¹¦ÄÜÒý·¢µÄµÝ¹éËÀÑ­»· befValue, updValue = GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_GameFuncFirstTouch, funcID, 1) if befValue == updValue: continue GameWorld.DebugLog(" ¹¦ÄÜ¿ªÆô£ºfuncID=%s,befValue=%s(%s),updValue=%s(%s)" % (funcID, befValue, str(bin(befValue)[2:]), updValue, str(bin(updValue)[2:])), curPlayer.GetPlayerID()) if funcID in FuncOpenLogicDict: FuncOpenLogicDict[funcID](curPlayer) mailKey = ipyData.GetMailKey() if mailKey: PlayerControl.SendMailByKey(mailKey, [curPlayer.GetPlayerID()], []) openFuncIDList.append(funcID) if openFuncIDList: Sync_FuncOpenState(curPlayer, openFuncIDList) PlayerActTask.OnCheckRelateFuncAct(curPlayer, openFuncIDList) PlayerActLoginNew.OnCheckRelateFuncAct(curPlayer, openFuncIDList) PlayerActBuyCountGift.OnCheckRelateFuncAct(curPlayer, openFuncIDList) return ## ¹¦ÄÜÊÇ·ñ¿ÉÓà def GetFuncCanUse(curPlayer, funcID): if funcID < 0: return False return GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_GameFuncFirstTouch, funcID, True) ## »ñÈ¡¹¦ÄÜÏÞÖÆµÈ¼¶(µÈ¼¶Ìõ¼þΪȫ¾Ö) def GetFuncLimitLV(funcID): ipyData = IpyGameDataPY.GetIpyGameData("FuncOpenLV", funcID) if not ipyData: return 0 return ipyData.GetLimitLV() def GetFuncOpenAward(curPlayer, funcID): ## ÁìÈ¡¹¦ÄÜ¿ªÆô½±Àø ipyData = IpyGameDataPY.GetIpyGameData('FunctionForecast', funcID) if not ipyData: return getState = GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_GameFuncAwardState, funcID) if getState: return awardDict = ipyData.GetAward() job = curPlayer.GetJob() itemList = awardDict.get(str(job)) if not itemList: return # ¼ì²é±³°ü needSpace = len(itemList) packSpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem, needSpace) if needSpace > packSpace: PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_998371") return GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_GameFuncAwardState, funcID, 1) # ¸øÎïÆ· for itemID, itemCount in itemList: ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, 0, [IPY_GameWorld.rptItem]) ItemControler.NotifyGiveAwardInfo(curPlayer, itemList, "FuncOpenAward") Sync_FuncOpenState(curPlayer, [funcID]) return def Sync_FuncOpenState(curPlayer, syncFuncIDList=None, isSyncUnOpen=False): ## ֪ͨ¹¦ÄÜÊ״δ¥·¢Çé¿ö if syncFuncIDList == None: syncFuncIDList = [] ipyGameData = IpyGameDataPY.IPY_Data() for i in xrange(ipyGameData.GetFuncOpenLVCount()): ipyData = ipyGameData.GetFuncOpenLVByIndex(i) funcID = ipyData.GetFuncId() syncFuncIDList.append(funcID) funcStatePack = ChPyNetSendPack.tagMCFuncOpenStateList() funcStatePack.Clear() funcStatePack.FuncStateList = [] for funcID in syncFuncIDList: openState = GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_GameFuncFirstTouch, funcID) if not openState and not isSyncUnOpen: continue funcOpenState = ChPyNetSendPack.tagMCFuncOpenState() funcOpenState.Clear() funcOpenState.FuncID = funcID funcOpenState.State = openState funcOpenState.AwardState = GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_GameFuncAwardState, funcID) funcStatePack.FuncStateList.append(funcOpenState) funcCount = len(funcStatePack.FuncStateList) funcStatePack.FuncCount = funcCount if funcCount: NetPackCommon.SendFakePack(curPlayer, funcStatePack) #GameWorld.DebugLog("Sync_FuncFirstTouch funcCount=%s" % funcCount) return