#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # #------------------------------------------------------------------------------- # ##@package GameWorldLogic.FBProcess.GameLogic_SkyTower # # @todo:ÌìÐÇËþ # @author xdh # @date 2019-05-09 # @version 1.0 # ÏêϸÃèÊö: ÌìÐÇËþ # #--------------------------------------------------------------------- #"""Version = 2019-05-09 11:00""" #--------------------------------------------------------------------- import FBCommon import GameWorld import PlayerControl import ChPyNetSendPack import ItemControler import EventShell import NetPackCommon import ShareDefine import IpyGameDataPY import ChConfig import PlayerActivity import PlayerBillboard import PlayerSuccess def GetTowerIpyData(floor): return IpyGameDataPY.GetIpyGameData('SkyTower', floor) def OnFBPlayerOnLogin(curPlayer): SyncSkyTowerInfo(curPlayer) return def OnMixFirstLogin(curPlayer): curFloorID = __GetSkyTowerCurFloor(curPlayer) if not curFloorID: return passFloorInfo = {} ipyDataMgr = IpyGameDataPY.IPY_Data() for index in range(ipyDataMgr.GetSkyTowerServerChallengeCount()): ipyDataServer = ipyDataMgr.GetSkyTowerServerChallengeByIndex(index) floorID = ipyDataServer.GetFloorID() if floorID > curFloorID: continue maxNeedPassCount = 0 for rank in ipyDataServer.GetPassRankRewardInfo().keys(): maxNeedPassCount = max(maxNeedPassCount, int(rank)) for needPlayerCount in ipyDataServer.GetServerRewardInfo().keys(): maxNeedPassCount = max(maxNeedPassCount, int(needPlayerCount)) passFloorInfo[floorID] = maxNeedPassCount playerID = curPlayer.GetPlayerID() msgInfo = str(["MixFirstLogin", [passFloorInfo]]) GameWorld.Log("ÌìÐÇËþºÏ·þÊ×µÇͬ²½GameServer: %s" % msgInfo, playerID) GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(playerID, 0, 0, "SkyTower", msgInfo, len(msgInfo)) return ## ͬ²½ÌìÐÇËþ¹Ø¿¨ÐÅÏ¢ # @floorID Ϊ0ʱĬÈÏÈ«²¿Í¬²½£¬> 0ʱ½öͬ²½¸Ã¹Ø¿¨ def SyncSkyTowerInfo(curPlayer, serverRewardFloor=None, force=False): syncFloorIDList = [] if serverRewardFloor == None: ipyDataMgr = IpyGameDataPY.IPY_Data() for index in range(ipyDataMgr.GetSkyTowerServerChallengeCount()): ipyDataServer = ipyDataMgr.GetSkyTowerServerChallengeByIndex(index) syncFloorIDList.append(ipyDataServer.GetFloorID()) elif serverRewardFloor > 0: syncFloorIDList = [serverRewardFloor] serverRewardList = [] for floorID in syncFloorIDList: recordValue = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_SkyTowerServerRecord % floorID) if not recordValue and not force: continue serverRewardInfo = ChPyNetSendPack.tagMCSkyTowerServerReward() serverRewardInfo.Floor = floorID serverRewardInfo.ServerRewardRecord = recordValue serverRewardList.append(serverRewardInfo) ttInfo = ChPyNetSendPack.tagMCSkyTowerInfo() ttInfo.Clear() ttInfo.Floor = __GetSkyTowerCurFloor(curPlayer) ttInfo.ServerRewardList = serverRewardList ttInfo.ServerRewardCount = len(ttInfo.ServerRewardList) NetPackCommon.SendFakePack(curPlayer, ttInfo) return ## »ñÈ¡µ±Ç°ÒÑͨ¹Ø¹Ø¿¨ def __GetSkyTowerCurFloor(curPlayer): return curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_SkyTowerFloor) ## ¸üе±Ç°ÒÑͨ¹Ø¹Ø¿¨ def SetSkyTowerCurfloorID(curPlayer, floorID): PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_SkyTowerFloor, floorID) #ÈÎÎñ EventShell.EventRespons_SkyTowerCnt(curPlayer, floorID) #ͨ¹Ø·ûÓ¡Ëþ³É¾Í PlayerSuccess.UptateSuccessProgress(curPlayer, ShareDefine.SuccType_PassSkyTower, floorID) GameWorld.DebugLog(' ¸üÐÂÌìÐÇËþÒÑͨ¹ØÊý %s' % floorID) return def OnTurnFightRequest(curPlayer, mapID, funcLineID, tagType, tagID, valueList): ## »ØºÏÕ½¶·ÇëÇó - µØÍ¼ÑéÖ¤ floorID = funcLineID playerID = curPlayer.GetPlayerID() ipyData = GetTowerIpyData(floorID) if not ipyData: GameWorld.ErrLog("ÌìÐÇËþ¹Ø¿¨(%s)²»´æÔÚ" % (floorID), playerID) return False # ÊÇ·ñÒѹý¹Ø if floorID <= __GetSkyTowerCurFloor(curPlayer): GameWorld.DebugLog("ÌìÐÇËþ±¾¹Ø(%s)Òѹý¹Ø, ÎÞ·¨ÌôÕ½!" % floorID, playerID) return False if curPlayer.GetLV() < ipyData.GetNeedLV(): GameWorld.DebugLog("ÌìÐÇËþ±¾¹Ø µÈ¼¶²»×ã%s, ÎÞ·¨ÌôÕ½!" % ipyData.GetNeedLV(), playerID) return False bossID = ipyData.GetBossID() if tagID != bossID or tagType != ChConfig.TurnBattle_TagType_NPC: GameWorld.ErrLog("Ä¿±êbossID´íÎó£¬ÎÞ·¨ÌôÕ½! mapID=%s,funcLineID=%s,bossID=%s,tagType=%s,tagID=%s" % (mapID, funcLineID, bossID, tagType, tagID), curPlayer.GetPlayerID()) return False return True def OnTurnFightOver(curPlayer, mapID, funcLineID, tagType, tagID, valueList, fightRet): ## »ØºÏÕ½¶·½áÊø # @return: ÊÇ·ñÐèҪͬ²½GameServer, ½±ÀøÁбí, ͬ²½½á¹ûÐÅÏ¢ needSendGameServer = False awardItemList = [] overInfoEx = {} floorID = funcLineID ipyData = GetTowerIpyData(floorID) if not ipyData: return FBCommon.OnFBJoin(curPlayer, mapID, funcLineID) isWin = fightRet[0] if not isWin: return if ipyData.GetIsNotify(): sysMark = 'KillGodTowerInfo_1'# if floorID == maxLevel else 'GeRen_liubo_471172' PlayerControl.WorldNotify(0, sysMark, [curPlayer.GetPlayerName(), floorID]) #¸üйؿ¨ SetSkyTowerCurfloorID(curPlayer, floorID) # ¸ø¹ý¹Ø½±Àø prizeDict = __GiveFBPassPrize(curPlayer, ipyData) __SendSkyTowerOverInfo(curPlayer, floorID, True, prizeDict) PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_SkyTower) SyncSkyTowerInfo(curPlayer, 0) # ͬ²½×îйؿ¨ÐÅÏ¢ if floorID >= 10: PlayerBillboard.UpdatePlayerBillboard(curPlayer, ShareDefine.Def_BT_SkyTower, floorID) # È«·þÄ¿±ê ipyDataServer = IpyGameDataPY.GetIpyGameDataNotLog("SkyTowerServerChallenge", floorID) if ipyDataServer: maxNeedPassCount = 0 rankRewardInfo = ipyDataServer.GetPassRankRewardInfo() for rank in rankRewardInfo.keys(): maxNeedPassCount = max(maxNeedPassCount, int(rank)) for needPlayerCount in ipyDataServer.GetServerRewardInfo().keys(): maxNeedPassCount = max(maxNeedPassCount, int(needPlayerCount)) playerID = curPlayer.GetPlayerID() msgInfo = str(["ServerChallengePass", [floorID, maxNeedPassCount, rankRewardInfo]]) GameWorld.DebugLog("È«·þ¹ý¹ØÐÅϢͬ²½GameServer: %s" % msgInfo, playerID) GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(playerID, 0, 0, "SkyTower", msgInfo, len(msgInfo)) FBCommon.OnFBPass(curPlayer, mapID, funcLineID) overInfoEx.update(prizeDict) return needSendGameServer, awardItemList, overInfoEx ## ¸ø¹ý¹Ø½±Àø def __GiveFBPassPrize(curPlayer, ipyData): giveItemDict = ipyData.GetReward() giveItemList = [[itemID, itemCnt, 0] for itemID, itemCnt in giveItemDict.items()] event = ["SKYTower", False, {}] ItemControler.GivePlayerItemOrMail(curPlayer, giveItemList, None, event) prizeDict = {FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(giveItemList)} return prizeDict ## ·¢ËÍÌôÕ½½á¹ûÐÅÏ¢ def __SendSkyTowerOverInfo(curPlayer, floorID, isPass, overDict={}): overDict[FBCommon.Over_dataMapID] = ChConfig.Def_FBMapID_SkyTower overDict[FBCommon.Over_wheel] = floorID overDict[FBCommon.Over_isPass] = int(isPass) GameWorld.DebugLog("__SendSkyTowerOverInfo overDict=%s" % (str(overDict)), curPlayer.GetPlayerID()) FBCommon.Notify_FB_Over(curPlayer, overDict) return def OnGetSkyTowerServerChallengeReward(curPlayer, floorID, needPlayerCount): ## Áìȡȫ·þÌôÕ½²ã½±Àø needPlayerCount = GameWorld.ToIntDef(needPlayerCount, 1) if needPlayerCount <= 0: # ±ØÐë´óÓÚ0, 0¼Ç¼ÅÅÃû½±ÀøÊÇ·ñÒÑÁìÈ¡ return playerID = curPlayer.GetPlayerID() ipyData = IpyGameDataPY.GetIpyGameData("SkyTowerServerChallenge", floorID) if not ipyData: return rewardInfo = ipyData.GetServerRewardInfo() if str(needPlayerCount) not in rewardInfo: GameWorld.DebugLog("²»´æÔÚ¸ÃÈ«·þ½±Àø:floorID=%s,needPlayerCount=%s" % (floorID, needPlayerCount), playerID) return giveItemList = rewardInfo[str(needPlayerCount)] rewardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_SkyTowerServerRecord % floorID) if rewardRecord & pow(2, needPlayerCount): GameWorld.DebugLog("ÌìÐÇËþÈ«·þÌôÕ½²ãÒÑÁì½±!floorID=%s,needPlayerCount=%s,rewardRecord=%s" % (floorID, needPlayerCount, rewardRecord), playerID) return msgInfo = str(["ServerChallengeReward", [floorID, needPlayerCount, giveItemList]]) GameWorld.DebugLog("ÌìÐÇËþÈ«·þÌôÕ½²ãÁ콱ͬ²½GameServer: %s" % msgInfo, playerID) GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(playerID, 0, 0, "SkyTower", msgInfo, len(msgInfo)) return def GameServer_SkyTowerInfo(curPlayer, resultList): ## GameServer ·µ»ØÐÅÏ¢ playerID = curPlayer.GetPlayerID() msgType, msgData = resultList[:2] GameWorld.Log("ÌìÐÇËþGameServer·µ»Ø: %s" % str(resultList), playerID) if msgType == "ServerChallengePass": floorID, _, rankRewardInfo = msgData rankIndex = resultList[2] if rankIndex < 0: GameWorld.DebugLog("¹ý¹ØÈ«·þÅÅÃûδÉϰñ: floorID=%s,rankIndex=%s" % (floorID, rankIndex), playerID) return rank = rankIndex + 1 orderDict = {} for k, v in rankRewardInfo.items(): orderDict[int(k)] = v giveItemList = GameWorld.GetOrderValueByDict(orderDict, rank, False) if not giveItemList: GameWorld.DebugLog("¸Ã²ã¸ÃÃû´ÎûÓн±Àø: rank=%s" % rank, playerID) return recordIndex = 0 # ÅÅÃû½±ÀøÄ¬ÈÏÓÃ0Ë÷Òýλ¼Ç¼ rewardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_SkyTowerServerRecord % floorID) if rewardRecord & pow(2, recordIndex): GameWorld.Log("¹ý¹ØÅÅÃû½±ÀøÒÑ·¢·Å¹ý!floorID=%s,recordIndex=%s,rewardRecord=%s" % (floorID, recordIndex, rewardRecord), playerID) return updRewardRecord = rewardRecord | pow(2, recordIndex) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_SkyTowerServerRecord % floorID, updRewardRecord) GameWorld.Log("ÌìÐÇËþ·¢·Å¹ý¹ØÈ«·þÅÅÃû½±Àø: floorID=%s,rank=%s,updRewardRecord=%s,giveItemList=%s" % (floorID, rank, updRewardRecord, giveItemList), playerID) paramList = [floorID, rank] PlayerControl.SendMailByKey("SkyTowerPassRank", [playerID], giveItemList, paramList) elif msgType == "ServerChallengeReward": floorID, needPlayerCount, giveItemList = msgData canGet = resultList[2] if not canGet: GameWorld.DebugLog("·µ»ØÊ±ÌìÐÇËþÈ«·þÌôÕ½²ã²»ÄÜÁìÈ¡: floorID=%s,needPlayerCount=%s" % (floorID, needPlayerCount), playerID) return rewardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_SkyTowerServerRecord % floorID) if rewardRecord & pow(2, needPlayerCount): GameWorld.DebugLog("·µ»ØÊ±ÌìÐÇËþÈ«·þÌôÕ½²ãÒÑÁì½±!floorID=%s,needPlayerCount=%s,rewardRecord=%s" % (floorID, needPlayerCount, rewardRecord), playerID) return updRewardRecord = rewardRecord | pow(2, needPlayerCount) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_SkyTowerServerRecord % floorID, updRewardRecord) GameWorld.Log("ÌìÐÇËþ·¢·Å¹ý¹ØÈ«·þ½±Àø: floorID=%s,needPlayerCount=%s,updRewardRecord=%s,giveItemList=%s" % (floorID, needPlayerCount, updRewardRecord, giveItemList), playerID) event = ["SKYTowerServerChallengeReward", False, {"floorID":floorID}] ItemControler.GivePlayerItemOrMail(curPlayer, giveItemList, None, event) SyncSkyTowerInfo(curPlayer, floorID) return