#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package GameWorldLogic.FBProcess.GameLogic_CrossDemonKing # # @todo:±¾·þ¡¢¿ç·þÑýÍõ # @author hxp # @date 2019-04-13 # @version 1.0 # # ÏêϸÃèÊö: ±¾·þ¡¢¿ç·þÑýÍõ # #------------------------------------------------------------------------------- #"""Version = 2019-04-13 11:00""" #------------------------------------------------------------------------------- import FBCommon import GameWorld import ItemCommon import IPY_GameWorld import IpyGameDataPY import PlayerFairyDomain import GameWorldProcess import PlayerControl import ShareDefine import PyGameData import ChConfig import ChItem FBDict_IsOver = 'FBDict_IsOver' #ÊÇ·ñÒѽáËã, ½áËãʱµÄtick g_ownerInfo = {} # ¹éÊôÕßÐÅÏ¢ {funcLineID:[ownerID, ownerName], } def __SetDemonKingVisitState(curPlayer, mapID, lineID, state): ipyData = IpyGameDataPY.GetIpyGameDataByCondition("FairyDomain", {"MapID":mapID, "LineID":lineID}) if not ipyData: return False eventID = ipyData.GetID() if not PlayerFairyDomain.SetFairyDomainEventState(curPlayer, eventID, state): return False return True ## ÊÇ·ñÄܹ»Í¨¹ý»î¶¯²éѯ½øÈë def OnEnterFBEvent(curPlayer, mapID, lineID, tick): if not __SetDemonKingVisitState(curPlayer, mapID, lineID, PlayerFairyDomain.FDEventState_Visiting): return False return True ## ²éѯÊÇ·ñ¿ÉÒÔ½øÈëµØÍ¼ def OnChangeMapAsk(ask, tick): return IPY_GameWorld.cmeAccept ## ¿ªÆô¸±±¾ def OnOpenFB(tick): return ## ¸±±¾Íæ¼Ò½øÈëµã # @return posX, posY, Ëæ»ú°ë¾¶(¿ÉÑ¡) def OnGetFBEnterPos(curPlayer, mapID, lineId, ipyEnterPosInfo, tick): return ipyEnterPosInfo def GetCurFBLineBOSSID(lineID=-1): #¸Ã·ÖÏßË¢µÄBOSSID if lineID == -1: lineID = GetCurFBFuncLineID() if lineID == -1: return 0 mapID = ChConfig.Def_FBMapID_CrossDemonKing if GameWorld.IsCrossServer() else ChConfig.Def_FBMapID_DemonKing ipyData = IpyGameDataPY.GetIpyGameDataByCondition("FairyDomain", {"MapID":mapID, "LineID":lineID}) if not ipyData: return 0 bossID = ipyData.GetBossID() return bossID def GetCurFBFuncLineID(): ## »ñÈ¡±¾Ïß·¹¦ÄÜÏß·ID if GameWorld.IsCrossServer(): return GameWorld.GetGameWorld().GetPropertyID() % 1000 return GameWorld.GetGameWorld().GetPropertyID() - 1 def GetCurFBLineZoneID(): ## »ñÈ¡±¾Ïß·ËùÊô¿ç·þ·ÖÇø if GameWorld.IsCrossServer(): return GameWorld.GetGameWorld().GetPropertyID() / 1000 return 0 ## ½ø¸±±¾ def DoEnterFB(curPlayer, tick): playerID = curPlayer.GetPlayerID() zoneID = GetCurFBLineZoneID() funcLineID = GetCurFBFuncLineID() bossID = GetCurFBLineBOSSID(funcLineID) visitCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainVisitCnt) GameWorld.Log("DoEnterFB zoneID=%s,funcLineID=%s,bossID=%s,visitCount=%s" % (zoneID, funcLineID, bossID, visitCount), playerID) PyGameData.g_fbPickUpItemDict.pop(playerID, 0) return ## ¸±±¾×ÜÂß¼­¼ÆÊ±Æ÷ def OnProcess(tick): gameFB = GameWorld.GetGameFB() overTick = gameFB.GetGameFBDictByKey(FBDict_IsOver) if overTick and tick - overTick >= ChConfig.Def_FBPickupItemTime: GameWorld.Log("Ç¿ÖÆÌß³öÍæ¼Ò¹Ø±Õ¸±±¾: overTick=%s,tick=%s" % (overTick, tick)) FBCommon.DoLogic_FBKickAllPlayer() return return ## ¹Ø±Õ¸±±¾ def OnCloseFB(tick): funcLineID = GetCurFBFuncLineID() g_ownerInfo.pop(funcLineID, None) GameWorld.GetGameWorld().SetPropertyID(0) return ## Íæ¼ÒÍ˳ö¸±±¾ def DoExitFB(curPlayer, tick): gameFB = GameWorld.GetGameFB() overTick = gameFB.GetGameFBDictByKey(FBDict_IsOver) gameWorld = GameWorld.GetGameWorld() #×îºóÒ»ÈËÍ˳ö¸±±¾Ôò¹Ø±ÕµØÍ¼ if overTick and gameWorld.GetMapCopyPlayerManager().GetPlayerCount() == 1: GameWorldProcess.CloseFB(tick) return ##Íæ¼ÒÖ÷¶¯À뿪¸±±¾. def DoPlayerLeaveFB(curPlayer, tick): gameWorld = GameWorld.GetGameWorld() #×îºóÒ»ÈËÍ˳ö¸±±¾Ôò¹Ø±ÕµØÍ¼ if gameWorld.GetMapCopyPlayerManager().GetPlayerCount() == 1: GameWorldProcess.CloseFB(tick) return ## ÊÇ·ñ¸±±¾¸´»î def OnPlayerReborn(): return True ## »ñµÃ¸±±¾°ïÖúÐÅÏ¢ def DoFBHelp(curPlayer, tick): return def DoFB_Npc_KillNPC(attacker, curNPC, tick): __FBNPCOnKilled(curNPC, tick) return def DoFB_Player_KillNPC(curPlayer, curNPC, tick): __FBNPCOnKilled(curNPC, tick) return ## Ö´Ðи±±¾É±¹ÖÂß¼­ def __FBNPCOnKilled(curNPC, tick): bossID = curNPC.GetNPCID() funcLineID = GetCurFBFuncLineID() if bossID != GetCurFBLineBOSSID(funcLineID): return zoneID = GetCurFBLineZoneID() gameFB = GameWorld.GetGameFB() gameFB.SetGameFBDict(FBDict_IsOver, tick) ownerType = curNPC.GetDictByKey(ChConfig.Def_NPC_Dict_LastDropOwnerType) ownerID = curNPC.GetDictByKey(ChConfig.Def_NPC_Dict_LastDropOwnerID) if ownerType == ChConfig.Def_NPCHurtTypePlayer else 0 isCrossServer = GameWorld.IsCrossServer() mapID = ChConfig.Def_FBMapID_CrossDemonKing if isCrossServer else ChConfig.Def_FBMapID_DemonKing GameWorld.Log("»÷ɱÑýÍõ: zoneID=%s,mapID=%s,funcLineID=%s,ownerID=%s,bossID=%s" % (zoneID, mapID, funcLineID, ownerID, bossID)) ipyData = IpyGameDataPY.GetIpyGameDataByCondition("FairyDomain", {"MapID":mapID, "LineID":funcLineID}) if not ipyData: return eventID = ipyData.GetID() ownerName = "" dropPosX, dropPosY = curNPC.GetPosX(), curNPC.GetPosY() serverGroupIDList = [] msgInfo = {} playerManager = GameWorld.GetMapCopyPlayerManager() for index in xrange(playerManager.GetPlayerCount()): curPlayer = playerManager.GetPlayerByIndex(index) if not curPlayer: continue playerID = curPlayer.GetPlayerID() isOwner = playerID == ownerID if isOwner: ownerName = curPlayer.GetPlayerName() giveItemList = __GetDemonKingPrizeItemList(curPlayer, mapID, funcLineID, eventID, isOwner) GameWorld.Log("Íæ¼Ò½±Àø: %s" % giveItemList, playerID) ChItem.DropItem(curPlayer, giveItemList, bossID, dropPosX, dropPosY, isOnlySelfSee=True, isDropDisperse=True) #curPlayer.Sync_TimeTick(ChConfig.tttPickupItem, 0, ChConfig.Def_FBPickupItemTime, True) if not isCrossServer: __SetDemonKingVisitState(curPlayer, mapID, funcLineID, PlayerFairyDomain.FDEventState_Visited) else: serverGroupID = PlayerControl.GetPlayerServerGroupID(curPlayer) if serverGroupID not in serverGroupIDList: serverGroupIDList.append(serverGroupID) msgInfo[playerID] = [serverGroupID, mapID, funcLineID] g_ownerInfo[funcLineID] = [ownerID, ownerName] if msgInfo: GameWorld.SendMsgToClientServer(ShareDefine.CrossServerMsg_FBEnd, msgInfo, serverGroupIDList) return ## ½áÊø¿ç·þ¸±±¾ def OnEndCrossFB(curPlayer, mapID, lineID, exData): __SetDemonKingVisitState(curPlayer, mapID, lineID, PlayerFairyDomain.FDEventState_Visited) return def OnPickUpItem(curPlayer, curItem, tick): mapItemType = curItem.GetType() if mapItemType == ChConfig.Def_ItemType_Money: return playerID = curPlayer.GetID() isEquip = ItemCommon.CheckItemIsEquip(curItem) jsonItem = ItemCommon.GetJsonItem(curItem) if playerID in PyGameData.g_fbPickUpItemDict: if isEquip or jsonItem.get("IsAuctionItem"): PyGameData.g_fbPickUpItemDict[playerID].append(jsonItem) else: isIn = False for itemInfo in PyGameData.g_fbPickUpItemDict[playerID]: if itemInfo["ItemID"] == jsonItem["ItemID"] and itemInfo.get("IsAuctionItem") == jsonItem.get("IsAuctionItem"): itemInfo["Count"] = itemInfo.get("Count", 1) + jsonItem.get("Count", 1) isIn = True break if not isIn: PyGameData.g_fbPickUpItemDict[playerID].append(jsonItem) else: PyGameData.g_fbPickUpItemDict[playerID] = [jsonItem] playerItemCount = 0 mapItemManager = GameWorld.GetMapItemManager() for index in xrange(mapItemManager.GetMapItemCount()): mapItem = mapItemManager.GetMapItemByIndex(index) if not mapItem or mapItem.IsEmpty(): continue # »¹ÓÐÊôÓÚ×Ô¼ºµÄ¶«Î÷û¼ñ²»Í¨Öª½áÊø if mapItem.GetOwnerID() == curPlayer.GetPlayerID(): playerItemCount += 1 isItemAllPickUp = (playerItemCount <= 1) if not isItemAllPickUp: return isPass = 1 mapID = ChConfig.Def_FBMapID_CrossDemonKing if GameWorld.IsCrossServer() else ChConfig.Def_FBMapID_DemonKing funcLineID = GetCurFBFuncLineID() leaveTick = FBCommon.GetFBLineStepTime(mapID, funcLineID) * 1000 ownerID, ownerName = g_ownerInfo.pop(funcLineID, [0, ""]) jsonItemList = PyGameData.g_fbPickUpItemDict.pop(playerID, []) overDict = {FBCommon.Over_ownerID:ownerID, FBCommon.Over_ownerName:ownerName, FBCommon.Over_itemInfo:jsonItemList} FBCommon.NotifyFBOver(curPlayer, mapID, funcLineID, isPass, overDict) curPlayer.Sync_TimeTick(IPY_GameWorld.tttLeaveMap, 0, leaveTick, True) return ## ¿Í»§¶Ë½øÈë×Ô¶¨Ò峡¾° def OnEnterCustomScene(curPlayer, mapID, lineID): __SetDemonKingVisitState(curPlayer, mapID, lineID, PlayerFairyDomain.FDEventState_Visiting) return ## ¿Í»§¶Ë·¢ËÍË¢ÐÂ×Ô¶¨Ò帱±¾½±Àø def OnRefreshCustomFBPrize(curPlayer, mapID, lineID): visitCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainVisitCnt) fakeImmortalCount = IpyGameDataPY.GetFuncCfg("FakeImmortalCount", 1) if visitCount > fakeImmortalCount: GameWorld.DebugLog("µ±Ç°Ñ°·Ã´ÎÊý²»ÄÜ»ñÈ¡×Ô¶¨Ò帱±¾½±Àø!visitCount=%s" % visitCount) return [] if not __SetDemonKingVisitState(curPlayer, mapID, lineID, PlayerFairyDomain.FDEventState_Visiting): GameWorld.DebugLog("Ѱ·Ã״̬Òì³£²»ÄÜ»ñÈ¡×Ô¶¨Ò帱±¾½±Àø!") return [] ipyData = IpyGameDataPY.GetIpyGameDataByCondition("FairyDomain", {"MapID":mapID, "LineID":lineID}) if not ipyData: return [] eventID = ipyData.GetID() isOwner = True giveItemList = __GetDemonKingPrizeItemList(curPlayer, mapID, lineID, eventID, isOwner) return giveItemList ## ¸ø×Ô¶¨Ò帱±¾½±ÀøºóÐø´¦Àí def OnGiveCustomFBPrizeOK(curPlayer, mapID, lineID): __SetDemonKingVisitState(curPlayer, mapID, lineID, PlayerFairyDomain.FDEventState_Visited) return def __GetDemonKingPrizeItemList(curPlayer, mapID, lineID, eventID, isOwner): giveItemList = PlayerFairyDomain.GetFairyAppointAward(curPlayer, eventID) if giveItemList: return giveItemList # ûÓж¨Öƽ±ÀøÔòÈ¡³£¹æ½±Àø # {ÎïÆ·ID:[¹éÊôÕß»ñµÃ¸öÊý±ýͼ[[¸ÅÂÊ, ¸öÊý], ...], ·Ç¹éÊôÕß»ñµÃ¸öÊý±ýͼ[[¸ÅÂÊ, ¸öÊý], ...], ÊÇ·ñÅÄÆ·], ...} giveItemList = [] awardDict = FBCommon.GetFBLineReward(mapID, lineID) for itemID, itemInfo in awardDict.items(): ownerCountRateList, notOwnerCountRateList, isAuctionItem = itemInfo if isOwner: itemCount = GameWorld.GetResultByRandomList(ownerCountRateList) else: itemCount = GameWorld.GetResultByRandomList(notOwnerCountRateList) if not itemCount: continue giveItemList.append([itemID, itemCount, isAuctionItem]) return giveItemList