#!/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 FunctionNPCCommon import PlayerActBuyCountGift import PlayerActLoginNew import PlayerActTask import ItemControler import PlayerTravel import PlayerHorse import PlayerArena import PlayerTask import DBDataMgr # ¹¦ÄÜ¿ªÆôÐèÖ´Ðеĺ¯Êý{¹¦ÄÜID:Ö´Ðк¯Êý, ...} º¯ÊýÐè·µ»ØÊÇ·ñ¼¤»î³É¹¦, ¹¦ÄÜ¿ªÆôÓÐÐèÒª´¦Àí¹¦ÄÜÂß¼­µÄÕâÀïÔö¼Óº¯Êýµ÷ÓÃÅäÖü´¿É FuncOpenLogicDict = { ShareDefine.GameFuncID_Arena:lambda curObj:PlayerArena.DoArenaOpen(curObj), ShareDefine.GameFuncID_Shop:lambda curObj:FunctionNPCCommon.DoShopOpen(curObj), ShareDefine.GameFuncID_Horse:lambda curObj:PlayerHorse.DoHorseOpen(curObj), ShareDefine.GameFuncID_Travel:lambda curObj:PlayerTravel.DoTravelOpen(curObj), } def GetFuncOpenLVIpyData(funcID): return IpyGameDataPY.GetIpyGameData("FuncOpenLV", funcID) def DoFuncOpenLogic(curPlayer): '''Ö´Ðд¥·¢¹¦ÄÜ¿ªÆôÂß¼­ @param finishMissionIDList: Íê³ÉµÄÈÎÎñIDÁбí ''' #GameWorld.DebugLog("Ö´Ðд¥·¢¹¦ÄÜ¿ªÆôÂß¼­: finishMissionIDList=%s" % finishMissionIDList, curPlayer.GetPlayerID()) serverDay = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_ServerDay) + 1 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 limitOpenDay = ipyData.GetLimitOpenDay() if limitOpenDay and serverDay < limitOpenDay: 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("FuncOpenLV", funcID) if not ipyData: return getState = GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_GameFuncAwardState, funcID) if getState: GameWorld.DebugLog("¹¦ÄÜ¿ªÆô½±ÀøÒÑÁìÈ¡! funcID=%s" % funcID) return openState = GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_GameFuncFirstTouch, funcID) if not openState: GameWorld.DebugLog("¹¦ÄÜ먦ÆôÎÞ·¨ÁìÈ¡! funcID=%s" % funcID) return itemList = ipyData.GetAwardList() if not itemList: return GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_GameFuncAwardState, funcID, 1) ItemControler.GivePlayerItemOrMail(curPlayer, itemList, event=["FuncOpenAward", False, {}]) 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