#!/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 PlayerGodWeapon #import PlayerHorse #import PlayerPet import ShareDefine import IpyGameDataPY import PlayerControl import PlayerPrestigeSys import PlayerBillboard import PlayerTreasure import PlayerSignDay #import PlayerGoldGift #import PlayerEquipDecompose #import PlayerCrossChampionship #import PlayerFreeGoods #import FunctionNPCCommon import PlayerActBuyCountGift import PlayerActLoginNew import PlayerActTask import IPY_GameWorld import ItemCommon import ItemControler import PlayerArena #import PlayerLianTi #import PlayerFaQi # ¹¦ÄÜ¿ªÆôÐèÖ´Ðеĺ¯Êý{¹¦ÄÜID:Ö´Ðк¯Êý, ...} º¯ÊýÐè·µ»ØÊÇ·ñ¼¤»î³É¹¦, ¹¦ÄÜ¿ªÆôÓÐÐèÒª´¦Àí¹¦ÄÜÂß¼­µÄÕâÀïÔö¼Óº¯Êýµ÷ÓÃÅäÖü´¿É FuncOpenLogicDict = { ShareDefine.GameFuncID_Official:lambda curObj:PlayerPrestigeSys.DoOfficialOpen(curObj), ShareDefine.GameFuncID_Billboard:lambda curObj:PlayerBillboard.DoBillboardOpen(curObj), ShareDefine.GameFuncID_SignDay:lambda curObj:PlayerSignDay.DoSignDayOpen(curObj), ShareDefine.GameFuncID_Treasure:lambda curObj:PlayerTreasure.DoTreasureOpen(curObj), ShareDefine.GameFuncID_Arena:lambda curObj:PlayerArena.DoArenaOpen(curObj), #ShareDefine.GameFuncID_Horse:lambda curObj:PlayerHorse.DoHorseOpen(curObj), #ShareDefine.GameFuncID_GodWeapon:lambda curObj:PlayerGodWeapon.DoGodWeaponOpen(curObj), #ShareDefine.GameFuncID_Pet:lambda curObj:PlayerPet.DoPetOpen(curObj), #ShareDefine.GameFuncID_FirstGoldTip:lambda curObj:PlayerGoldGift.DoFirstGoldOpen(curObj), #ShareDefine.GameFuncID_EquipDecompose:lambda curObj:PlayerEquipDecompose.DoEquipDecomposeOpen(curObj), #ShareDefine.GameFuncID_FreeGoods:lambda curObj:PlayerFreeGoods.DoFreeGoodsOpen(curObj), #ShareDefine.GameFuncID_OSSail:lambda curObj:FunctionNPCCommon.OSSaleOpenMail(curObj), #ShareDefine.GameFuncID_AddPoint:lambda curObj:PlayerControl.DoAddPointOpen(curObj), #ShareDefine.GameFuncID_FaQi:lambda curObj:PlayerFaQi.DoFaQiOpen(curObj), #ShareDefine.GameFuncID_LianTi:lambda curObj:PlayerLianTi.DoLianTiOpen(curObj), #ShareDefine.GameFuncID_Championship:lambda curObj:PlayerCrossChampionship.DoChampionshipOpen(curObj), } ## ×¢Ò⣺¹¦ÄÜ¿ªÆôÐèÖ´Ðеĺ¯Êý ¼° ¹¦ÄÜ¿ªÆôºóÉý¼¶Âß¼­ Ö»»áÖ´ÐÐÆäÖÐÒ»¸ö ## ×¢Ò⣺¹¦ÄÜ¿ªÆôÐèÖ´Ðеĺ¯Êý ¼° ¹¦ÄÜ¿ªÆôºóÉý¼¶Âß¼­ Ö»»áÖ´ÐÐÆäÖÐÒ»¸ö ## ×¢Ò⣺¹¦ÄÜ¿ªÆôÐèÖ´Ðеĺ¯Êý ¼° ¹¦ÄÜ¿ªÆôºóÉý¼¶Âß¼­ Ö»»áÖ´ÐÐÆäÖÐÒ»¸ö # ¹¦ÄÜ¿ªÆôºóÉý¼¶Âß¼­ ÐèÒª´¦ÀíµÄº¯Êý {¹¦ÄÜID:Ö´Ðк¯Êý, ...} #FuncLVUpLogicDict = { # ShareDefine.GameFuncID_Pet:lambda curObj:PlayerPet.DoLVUPLogic_Pet(curObj), # } # ¹¦ÄÜ¿ªÆôÐèҪͬ²½µ½GameServerµÄ FuncOpenNotifyGameServer = [ShareDefine.GameFuncID_Championship, ShareDefine.GameFuncID_MineArea] def GetFuncOpenLVIpyData(funcID): return IpyGameDataPY.GetIpyGameData("FuncOpenLV", funcID) def DoFuncOpenLogic(curPlayer, finishMissionIDList=[]): '''Ö´Ðд¥·¢¹¦ÄÜ¿ªÆôÂß¼­ @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 limitMissionID in finishMissionIDList: if not curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_MissionFinish % 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) notifyGameServerFuncIDList = [] for funcID in openFuncIDList: if funcID not in FuncOpenNotifyGameServer: continue notifyGameServerFuncIDList.append(funcID) if notifyGameServerFuncIDList: GameWorld.DebugLog("notifyGameServerFuncIDList=%s" % notifyGameServerFuncIDList) msgInfo = str(notifyGameServerFuncIDList) GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, "FuncOpen", msgInfo, len(msgInfo)) PlayerActTask.OnCheckRelateFuncAct(curPlayer, openFuncIDList) PlayerActLoginNew.OnCheckRelateFuncAct(curPlayer, openFuncIDList) PlayerActBuyCountGift.OnCheckRelateFuncAct(curPlayer, openFuncIDList) return ## ¹¦ÄÜÊÇ·ñ¿ÉÓà def GetFuncCanUse(curPlayer, funcID): 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