#!/usr/bin/python # -*- coding: GBK -*- #--------------------------------------------------------------------- # #--------------------------------------------------------------------- ##@package GameWorldProcess # @todo: ¸±±¾ÊÀ½çÂß¼­Ñ­»·´¦ÀíÆ÷ # # @author eggxp # @date 2010-4-20 # @version 3.1 # # @note: ¸±±¾ÊÀ½çÂß¼­Ñ­»·´¦ÀíÆ÷ # # @change: "2010-08-23 11:30" panwei NPCÖÜÆÚµôÂäÐÂÔö´¦Àí¼ä¸ô # @change: "2010-09-17 14:00" panwei ProcessCurrentChangeMapAskÐÂÔöÕϰ­µãÑéÖ¤ # @change: "2011-04-07 14:30" panwei PsycoÓÅ»¯ # @change: "2011-05-03 20:10" panwei ¸±±¾ÐÂÔöµ÷ÊÔÊä³ö # @change: "2011-05-19 10:00" panwei ¸±±¾¿ªÆôºÍ¹Ø±ÕÂß¼­ÐÞ¸Ä # @change: "2011-06-21 11:00" Alee ÓÅ»¯¸±±¾¹Ø±Õ´úÂë # @change: "2011-06-23 17:30" panwei ChangeMapAskÐÂÔö¸±±¾×´Ì¬ÑéÖ¤, »ØÊÕÖеĸ±±¾²»ÈýøÈë # @change: "2011-07-04 16:30" panwei ¸±±¾¿ªÆôÂß¼­ÐÞ¸Ä, ·À·¶Á¬Ðø¿ªÆô2´Î(2¸öÍæ¼Òͬʱ½øÈë¿ÉÖØÏÖ) # @change: "2011-07-06 10:30" panwei ¸±±¾¿ªÆôÂß¼­ÐÂÔöÇå³ýÍæ¼ÒÀ뿪ʱ¼äÂß¼­, ²¢ÔÚ¸±±¾¹Ø±Õʱ, Ìí¼ÓÊä³ö # @change: "2011-09-13 13:00" panwei ÌØÊ⸱±¾ChangeMapAsk²»ÑéÖ¤ÊÇ·ñ¸±±¾ÒÑÂú # @change: "2012-12-20 20:40" Alee ¶¨Ê±Æ¥Å侺¼¼ºÍ»ã±¨Ö÷ÌâÅÅÐÐ # @change: "2013-06-04 23:00" Alee Ìí¼Ó¼¶Áª¼ÆÊ±Æ÷ ¹¥»÷Âß¼­ # @change: "2014-02-12 16:10" Alee ×ÔÉìËõ¸±±¾¸ù¾ÝÍæ¼Ò½øÈ뿪Æô£¬Ö÷¶¯µ÷ÓÃÒ»´Î£¬±ÜÃâ¼ä¸ôµ÷ÓÃʱ»úδ´¥·¢µ¼ÖÂÂß¼­´íÂÒ # @change: "2014-12-22 21:30" hxp µØÍ¼¶îÍâµôÂÊ´¦Àí # @change: "2015-01-14 00:30" hxp Ôö¼Óʼþ»ã±¨³õʼ»¯ # @change: "2015-03-21 16:00" hxp ÌØÊâ·Ç×ÔÉìËõµØÍ¼Í˳ö¹Ø±Õ¸±±¾¼ì²â # @change: "2015-03-31 01:10" ljd ·ÖÖÓ´¥·¢ºÍÕû°ëСʱ´¥·¢Èë¿Ú¡¢Îå·ÖÖÓ´¥·¢ # @change: "2015-07-28 11:10" ljd ʱЧ¹ó×å·ÖÖÓ´¥·¢ # @change: "2016-07-13 18:00" hxp ÔÚÏßÔùËÍѰ±¦Ãâ·Ñ´ÎÊý´¥·¢ # @change: "2016-07-27 20:00" Alee Ð޸Ĵò¿ªÎļþ³¬Ê±¹Ø±Õ # @change: "2016-08-22 18:00" hxp ͬ²½ÐéÄâ·ÖÏßÈËÊý # @change: "2016-09-02 23:00" hxp ´«ËÍÄ¿±êΪÕϰ­µãʱȡ¸½½üËæ»ú¿ÉÒÆ¶¯µã #--------------------------------------------------------------------- import IPY_GameWorld import GameWorld import ChConfig import PlayerControl import FamilyRobBoss import EventShell import FBLogic import FBCommon import EventReport import ItemCommon import PyGameData import PlayerTeam import GameMap #--------------------------------------------------------------------- ## ¸±±¾¿ªÆô # @param gameWorld IPY_GameWorld # @param tick µ±Ç°Ê±¼ä # @return None # @remarks º¯ÊýÏêϸ˵Ã÷. def __OpenFB(gameWorld, tick): if gameWorld.GetOpenFBTick() != 0: GameWorld.ErrLog("FB Open! lineID = %s, openState = %s, OpenFBTick = %s"%( gameWorld.GetLineID(), gameWorld.GetOpenState(), gameWorld.GetOpenFBTick())) return #¸±±¾¿ªÆô GameWorld.Log("FB Open! lineID = %s, openState = %s"%(gameWorld.GetLineID(), gameWorld.GetOpenState())) #---ÉèÖø±±¾×´Ì¬--- gameWorld.SetOpenState(IPY_GameWorld.fbosOpen) gameWorld.SetOpenFBTick(tick) gameWorld.SetCloseFBTick(0) #³õʼ»¯¸±±¾ gameFB = GameWorld.GetGameFB() gameFB.SetFBStep(0) gameFB.SetFBStepTick(tick) #µ÷Óø±±¾¿ªÆô´¥·¢Æ÷ FBLogic.OnOpenFB(tick) return ## ¸±±¾¹Ø±Õ # @param gameWorld IPY_GameWorld # @param tick µ±Ç°Ê±¼ä # @return None # @remarks º¯ÊýÏêϸ˵Ã÷. def __CloseFB(gameWorld, tick): #¹Ø±Õ¸±±¾ FBLogic.OnCloseFB(tick) gameWorld.SetOpenFBTick(0) gameWorld.SetCloseFBTick(0) gameWorld.SetFBFirstOpen(0) gameFBMgr = gameWorld.GetGameFB() gameFBMgr.SetPlayerLogoffTick(0) gameFBMgr.SetIsSafeClose(0) GameWorld.Log("FB Close! lineID = %s, openState = %s"%(gameWorld.GetLineID(), gameWorld.GetOpenState())) gameWorld.SetOpenState(IPY_GameWorld.fbosClosed) gameMap = gameWorld.GetMap() fbType = gameMap.GetMapFBType() if fbType == 0: return #¸±±¾¹Ø±ÕʱͳһÇå¹Ö FBCommon.ClearFBNPC() mapID = FBCommon.GetRecordMapID(gameMap.GetMapID()) #ÇåÀíÎïÆ· unPickItemDict = {} mapItem_List = [] mapItemManager = GameWorld.GetMapItemManager() for index in xrange(mapItemManager.GetMapItemCount()): curMapItem = mapItemManager.GetMapItemByIndex(index) mapItem_List.append(curMapItem) for mapItem in mapItem_List: if not mapItem or mapItem.IsEmpty(): continue if fbType == IPY_GameWorld.fbtSingle: ownerID = gameFBMgr.GetGameFBDictByKey(ChConfig.Def_FB_SingleFBPlayerID) elif mapItem.GetOwnerType() == ChConfig.Def_NPCHurtTypePlayer: ownerID = mapItem.GetOwnerID() else: ownerID = 0 curItem = mapItem.GetItem() if ownerID and curItem.GetType() != ChConfig.Def_ItemType_Money: mailItemList = unPickItemDict.get(ownerID, []) mailItemList.append(ItemCommon.GetMailItemDict(curItem)) unPickItemDict[ownerID] = mailItemList mapItem.Disappear() #·¢ËÍδʰȡµÄÎïÆ·¸øÍæ¼Ò if mapID in ChConfig.Def_SendUnPickItemMailMapIDList and unPickItemDict: for ownerID, mailItemList in unPickItemDict.items(): GameWorld.Log("·¢ËÍδʰȡµÄÎïÆ·¸øÍæ¼Ò: %s" % mailItemList, ownerID) PlayerControl.SendMailByKey("ItemNoPickUp", [ownerID], mailItemList, [gameWorld.GetMapID()]) playerManager = gameWorld.GetMapCopyPlayerManager() #µØÍ¼¹Ø±Õʱ£¬Íæ¼Ò»¹Ã»Í˳ö£¬ÉèÖÃÑÓ³Ù¹Ø±Õ if playerManager.GetPlayerCount() > 0: gameWorld.SetOpenState(IPY_GameWorld.fbosWaitForClose) return #µØÍ¼Ã»ÓÐÍæ¼Ò, ¹Ø±Õ¸±±¾ gameWorld.SetOpenState(IPY_GameWorld.fbosClosed) #¸ù¾ÝÊÇ·ñÊÕËõÐÍFB´¦Àí FreeOrClearFBByAutoSize(gameWorld) return ##¸ù¾Ý±íÖеÄÊÕËõÀàÐÍÊÍ·Å»òÕßÇå¿Õ¸±±¾×´Ì¬ # @param gameWorld µØÍ¼ÊµÀý # @return ÎÞÒâÒå def FreeOrClearFBByAutoSize(gameWorld): if gameWorld.GetMap().GetAutoSize() == 0: #Çå¿Õ¸±±¾Ïà¹ØÖµ£¨Èç×ֵ䣬ʱÖÓ£¬ÅÅÐеȣ© gameFB = GameWorld.GetGameFB() gameFB.Clear() else: #OnCloseFB ÀïÓд¦ÀíÊͷŵÄÂß¼­ gameWorld.OnCloseFB() ## Ìá³öÍæ¼Ò²¢¹Ø±Õ¸±±¾ # @param gameWorld IPY_GameWorld # @param tick µ±Ç°Ê±¼ä # @return None # @remarks º¯ÊýÏêϸ˵Ã÷. def __KickAllPlayerAndCloseFB(gameWorld, tick): if gameWorld.GetOpenState() != IPY_GameWorld.fbosOpen: #ÒѾ­¹Ø±ÕÁË return #ʱ¼äµ½ÁË, Ìß³ö playerManager = gameWorld.GetMapCopyPlayerManager() for i in range(playerManager.GetPlayerCount()): curPlayer = playerManager.GetPlayerByIndex(i) #À뿪¸±±¾ #FBLogic.DoExitFBLogic(curPlayer,tick) PlayerControl.PlayerLeaveFB(curPlayer) GameWorld.GetGameFB().GameServer_FbInfoRefresh(0) GameWorld.Log("---------------%d"%playerManager.GetPlayerCount()) __CloseFB(gameWorld, tick) return ## ʱ¼äµ½ÁËÌß³öÍæ¼Ò # @param gameWorld IPY_GameWorld # @param tick µ±Ç°Ê±¼ä # @return None # @remarks º¯ÊýÏêϸ˵Ã÷. def __ProcessTimeKickPlayer(gameWorld, tick): #ʱ¼äµ½ÁËÌß³öÍæ¼Ò openTick = gameWorld.GetOpenFBTick() if openTick == 0: #GameWorld.Log('a' + str(openTick)) return existTime = GameWorld.GetMap().GetExistTime() if existTime == 0: #GameWorld.Log('b' + str(existTime)) return if tick - gameWorld.GetOpenFBTick() <= existTime: #GameWorld.Log('c' + str(tick - gameWorld.GetOpenFBTick())) return #¸±±¾´¥·¢Æ÷µ÷Óà FBLogic.DoFBTimeOut(tick) playerManager = gameWorld.GetMapCopyPlayerManager() for i in range(0, playerManager.GetPlayerCount()): curPlayer = playerManager.GetPlayerByIndex(i) playerExistTime = tick - curPlayer.GetLoginTick() if playerExistTime < existTime / 2: #Õâ¸öÍæ¼Ò´æÔÚʱ¼ä¹ý¶Ì, ²»ÄÜ´¥·¢¸±±¾½áÊøµÄʼþ continue #¸±±¾Ê±¼äµ½ÁË, µ÷ÓÃʱ¼äµ½ÏìÓ¦ EventShell.EventResponse_OnFBTimeOut(curPlayer) #Êä³öµ÷ÊÔÐÅÏ¢ GameWorld.Log('__ProcessTimeKickPlayer! LineID = %s, openState = %s'%(gameWorld.GetLineID(), gameWorld.GetOpenState())) ##ÌßÈË __KickAllPlayerAndCloseFB(gameWorld, tick) return ## ¸±±¾Ìß³öÍæ¼ÒÂß¼­ # @param gameWorld IPY_GameWorld # @param tick µ±Ç°Ê±¼ä # @return None # @remarks º¯ÊýÏêϸ˵Ã÷. def __ProcessFBDelayKickPlayer(gameWorld, tick): #¸±±¾ÑÓ³ÙÌß³öÍæ¼ÒÂß¼­ closeFBTick = gameWorld.GetCloseFBTick() if closeFBTick == 0: return #¸±±¾ÒѾ­¹Ø±Õ if gameWorld.GetOpenState() == IPY_GameWorld.fbosClosed: gameWorld.SetCloseFBTick(0) return if tick - closeFBTick <= ChConfig.Def_FBKickPlayerTime: #ʱ¼äûÓе½ return #Êä³öµ÷ÊÔÐÅÏ¢ GameWorld.Log('__ProcessFBDelayKickPlayer! LineID = %s, openState = %s'%(gameWorld.GetLineID(), gameWorld.GetOpenState())) #ÌßÈË __KickAllPlayerAndCloseFB(gameWorld, tick) return ## Åжϸ±±¾ÊÇ·ñ¿ªÆô¸±±¾ # @param gameWorld IPY_GameWorld # @param tick µ±Ç°Ê±¼ä # @return None # @remarks º¯ÊýÏêϸ˵Ã÷. def __ProcessOpen(gameWorld, tick): if not gameWorld.GetFBFirstOpen(): return #µ÷ÓýӿڿªÆô¸±±¾ __OpenFB(gameWorld, tick) #¹Ø±Õ±ê־λ gameWorld.SetFBFirstOpen(0) return ## ×ÔÉìËõ¸±±¾¸ù¾ÝÍæ¼Ò½øÈ뿪Æô£¬Ö÷¶¯µ÷ÓÃÒ»´Î£¬±ÜÃâ¼ä¸ôµ÷ÓÃʱ»úδ´¥·¢µ¼ÖÂÂß¼­´íÂÒ # @param tick # @return None def EnterOpenFB(tick): gameWorld = GameWorld.GetGameWorld() if GameWorld.GetMap().GetAutoSize() == 0: return # C++ÒѾ­ÉèÖø±±¾´ò¿ª±êʶ£¬Õâ±ß²»Åж¨¸±±¾×´Ì¬ __ProcessOpen(gameWorld, tick) ## Åжϸ±±¾ÊÇ·ñ×Ô¶¯¹Ø±Õ # @param gameWorld IPY_GameWorld # @param tick µ±Ç°Ê±¼ä # @return None # @remarks º¯ÊýÏêϸ˵Ã÷. def __ProcessClose(gameWorld, tick): #¸±±¾Î´³õʼ»¯ if not gameWorld.GetInitOK() : return playerManager = gameWorld.GetMapCopyPlayerManager() #¸±±¾Öл¹ÓÐÈË if playerManager.GetPlayerCount() != 0: return #ÌØÊ⸱±¾,²»Ö´ÐÐÕâ¸öÂß¼­ if not GameWorld.GetMap().GetAutoSize(): return gameFB = GameWorld.GetGameFB() fbIndex = gameWorld.GetCurGameWorldIndex() if fbIndex in PyGameData.g_lastExitFBType: '''ÀÏģʽ¸ù¾Ý GetPlayerLogoffTick()¡¢GetIsSafeClose()ÅжϵϰÔÚijЩÇé¿öÏ»áÓÐÒþ²Øbug ÒòΪµ±¸±±¾ÖÐÍæ¼ÒͬʱÍ˳öʱ¿ÉÄܳöÏÖ GameWorld.GetMapCopyPlayerManager().GetPlayerCount() != 1 µÄÇé¿ö ËùÒÔÀÏÂß¼­´æÔÚ¸±±¾ÎÞ·¨¹Ø±ÕµÄbug£¬ÕâÀïֻʹÓÃÐÂģʽ£¬ÀÏģʽÔݲ»×öÐ޸쬽ö×ö¼æÈݺ󱸴¦Àí ''' exitFBType, exitTick = PyGameData.g_lastExitFBType[fbIndex] if exitFBType == 1: passTick = tick - exitTick if passTick < ChConfig.Def_EmptyFBKeepTime: #GameWorld.DebugLog("×îºóÒ»¸öÍæ¼ÒÀëÏßÍ˳öµÄ£¬¸±±¾±£»¤ÖУ¡tick=%s,exitTick=%s,passTick=%s" # % (tick, exitTick, passTick), fbIndex) return #GameWorld.DebugLog("×îºóÒ»¸öÍæ¼ÒÀëÏßÍ˳öµÄ£¬¸±±¾±£»¤³¬Ê±£¬¹Ø±Õ¸±±¾£¡tick=%s,exitTick=%s,passTick=%s" # % (tick, exitTick, passTick), fbIndex) #else: # GameWorld.DebugLog("×îºóÒ»¸öÍæ¼ÒÖ÷¶¯Í˳öµÄ£¬Ö±½Ó¹Ø±Õ¸±±¾£¡", fbIndex) PyGameData.g_lastExitFBType.pop(fbIndex) #GameWorld.DebugLog("PyGameData.g_lastExitFBType=%s" % PyGameData.g_lastExitFBType, fbIndex) else: logOffTick = gameFB.GetPlayerLogoffTick() if logOffTick == 0: return if (not gameFB.GetIsSafeClose()) and tick - logOffTick < ChConfig.Def_EmptyFBKeepTime: #GameWorld.Log(str(tick - logOffTick)) #²»Êǰ²È«¶ÏÏßµÄÇé¿öÏÂ, ·µ»Ø return #Êä³öµ÷ÊÔÐÅÏ¢ GameWorld.Log('__ProcessClose! LineID = %s, openState = %s, isSafeClose = %s'%( gameWorld.GetLineID(), gameWorld.GetOpenState(), gameFB.GetIsSafeClose())) #ÌßÈË __KickAllPlayerAndCloseFB(gameWorld, tick) return ## Ñ­»·Ë¢ÐµØÍ¼·þÎñÆ÷״̬ # @param gameWorld IPY_GameWorld # @param tick µ±Ç°Ê±¼ä # @return None # @remarks º¯ÊýÏêϸ˵Ã÷. def __ProcessRefreshMapServerState(gameWorld, tick): if not PyGameData.g_needRefreshMapServerState: return #¹Ì¶¨Ò»·ÖÖÓË¢ÐÂÒ»´Î if tick - gameWorld.GetSyncMapServerStateTick() < 10*1000: return #Ö»ÓÐÆÕͨµØÍ¼²ÅË¢ÐÂÏß· gameMap = GameWorld.GetMap() if gameMap.GetMapFBType() != IPY_GameWorld.fbtNull: return gameWorld.SetSyncMapServerStateTick(tick) gameWorld.GameServer_MapServerState() PyGameData.g_needRefreshMapServerState = False return ## »Ø±¨µ±Ç°µØÍ¼·þÎñÆ÷ÈËÊý # @param tick µ±Ç°Ê±¼ä # @return None # @remarks º¯ÊýÏêϸ˵Ã÷. def __ProcessMapServerAcPlayer(tick): gameWorld = GameWorld.GetGameWorld() lastTick = gameWorld.GetTickByType(ChConfig.TYPE_Map_Tick_MapAcPlayer) if lastTick == -1: #·þÎñÆ÷δ³õʼ»¯ return if tick - lastTick < ChConfig.TYPE_Map_Tick_Time[ChConfig.TYPE_Map_Tick_MapAcPlayer]: return #ÉèÖõ±Ç°Ê±¼ä gameWorld.SetTickByType(ChConfig.TYPE_Map_Tick_MapAcPlayer , tick) return ## ´¦Àíµ±Ç°Çл»µØÍ¼ÇëÇ󣨵¥¸ö£© # @param gameWorld IPY_GameWorld # @param askStruct ÇëÇóÐÅÏ¢(IPY_BMChangeMapAsk) # @param tick µ±Ç°Ê±¼ä # @return IPY_GameWorld.cmeAccept # @remarks º¯ÊýÏêϸ˵Ã÷. def __ProcessCurrentChangeMapAsk(gameWorld, askStruct, tick): gameMap = GameWorld.GetMap() #¼ì²âÄ¿±êÊÇ·ñΪÕϰ­µã if not gameMap.CanMove(askStruct.GetPosX(), askStruct.GetPosY()): nearPosX, nearPosY = GameMap.GetNearbyPosByDis(askStruct.GetPosX(), askStruct.GetPosY(), ChConfig.Def_RebornPos_Area_Range) if nearPosX == 0 and nearPosY == 0: GameWorld.ErrLog('´«ËÍÖÁÄ¿±êµãΪÕϰ­µã, ´«ËÍʧ°Ü, mapid = %s, posX = %s, posY = %s'%( askStruct.GetMapID(), askStruct.GetPosX(), askStruct.GetPosY())) return IPY_GameWorld.cmeCustom, '04BBF813-7A30-47A8-927DE1ACCC4F378E' #---·Çϵͳ·ÖÅäµÄ·¿¼äÑéÖ¤--- if askStruct.GetMapID() not in ChConfig.Def_FB_SystemAssignMapIDList: if not gameWorld.GetPlayerManager().IsPlayerCanLogin(): #ÈËÊýÒÑÂú return IPY_GameWorld.cmePlayerFull if gameMap.GetAutoSize() and gameWorld.IsMapCopyFull(gameWorld.GetBMChangeMapAskCount()): #ÈËÊýÒÑÂú return IPY_GameWorld.cmePlayerFull #¼ì²é¸±±¾×´Ì¬ÊÇ·ñ¿ÉÒԵǼ checkRet = FBCommon.CheckFBStateCanEnter(askStruct) if type(checkRet) not in [tuple, list]: checkRet = (checkRet, "FB_andyshao_861048") canEnter, notifyMark = checkRet if not canEnter: #¸±±¾¹Ø±ÕÖÐ, ÇëÉÔºó return IPY_GameWorld.cmeCustom, notifyMark changeMapAskResult = FBLogic.OnChangeMapAsk(askStruct, tick) if changeMapAskResult == None: #ÔÊÐí½øÈë return IPY_GameWorld.cmeAccept #¸±±¾´«Ëͽá¹û return changeMapAskResult ## ´¦ÀíÇл»µØÍ¼ÇëÇó # @param tick µ±Ç°Ê±¼ä # @return None # @remarks º¯ÊýÏêϸ˵Ã÷. def __ProcessChangeMapAsk(tick): #´¦ÀíÇл»µØÍ¼ÇëÇó(changemapAsk) gameWorld = GameWorld.GetGameWorld() for i in range(gameWorld.GetBMChangeMapAskCount()): ask = gameWorld.GetBMChangeMapAskAt(i) result = __ProcessCurrentChangeMapAsk(gameWorld, ask, tick) if type(result) == int: result = (result, '') gameWorld.RouteServer_ChangeMapAnswer(ask.GetPlayerID(), result[0] , result[1]) gameWorld.ClearBMChangeMapAsk() return ## ¸±±¾×ÜÈë¿Ú # @param tick µ±Ç°Ê±¼ä # @return None # @remarks º¯ÊýÏêϸ˵Ã÷. def OnGameWorldProcess(tick): GameWorld.GetPsycoFunc(__Func_OnGameWorldProcess)(tick) return ## ¸±±¾×ÜÈë¿Ú # @param tick µ±Ç°Ê±¼ä # @return None # @remarks º¯ÊýÏêϸ˵Ã÷. def __Func_OnGameWorldProcess(tick): gameWorld = GameWorld.GetGameWorld() if not gameWorld.GetInitOK() : return __ProcessOpen(gameWorld, tick) __ProcessTimeKickPlayer(gameWorld, tick) # ´¦Àí¸±±¾Éú´æÖÜÆÚÇ¿¹Ø¸±±¾ __ProcessFBDelayKickPlayer(gameWorld, tick) # ¹Ø±Õ¸±±¾ÑÓ³ÙÌß³öÍæ¼Ò __ProcessClose(gameWorld, tick) # ×ÔÉìËõ¸±±¾¹Ø±ÕÂß¼­ __ProcessMapServerAcPlayer(tick) __ProcessChangeMapAsk(tick) #´¦Àí¸±±¾Âß¼­ FBLogic.OnProcess(tick) #֪ͨMapServer, Ë¢ÐÂ×Ô¼ºµÄ״̬ __ProcessRefreshMapServerState(gameWorld, tick) #֪ͨRouteServer ÏûÏ¢ __ProcessRouteServer(gameWorld, tick) #ÿ·ÖÖÓ´¥·¢ __RefreshOnMinute(tick) #Îå·ÖÖÓ´¥·¢ __RefreshOnFiveMinute(tick) #¶¨Ê±¼ì²â¹Ø±Õ³¬Ê±Îļþ EventReport.OnTimeCloseScribeTxt() #ÏÉÃ˹éÊôboss¶¨Ê±´¦Àí FamilyRobBoss.OnFamilyOwnerBossProcess(tick) return ## ֪ͨRouteServer ÏûÏ¢ # @param gameWorld IPY_GameWorld # @param tick µ±Ç°Ê±¼ä # @return None # @remarks º¯ÊýÏêϸ˵Ã÷. def __ProcessRouteServer(gameWorld, tick): lastTick = gameWorld.GetTickByType(ChConfig.TYPE_Map_Tick_SendMsg_RouteServer) if lastTick == -1: #·þÎñÆ÷δ³õʼ»¯ return if tick - lastTick < ChConfig.TYPE_Map_Tick_Time[ChConfig.TYPE_Map_Tick_SendMsg_RouteServer]: return #ÉèÖõ±Ç°Ê±¼ä gameWorld.SetTickByType(ChConfig.TYPE_Map_Tick_SendMsg_RouteServer , tick) GameWorld.GetGameWorld().SendHeartBeat() return ## ³õʼ»¯gameWorld # @param tick µ±Ç°Ê±¼ä # @return None # @remarks º¯ÊýÏêϸ˵Ã÷. def InitGameWorld(tick): gameWorld = GameWorld.GetGameWorld() ItemCommon.InitPyItem() EventShell.DoReloadRefresh() #´¦Àí¸±±¾Âß¼­ FBLogic.OnInit(tick) #³õʼ»¯µØÍ¼Ê±ÖÓ gameWorld.SetTickTypeCount(ChConfig.TYPE_Map_Tick_Count) #³õʼ»¯Ê¼þ±¨¸æ EventReport.InitDllAppID() #ÏòGameServer×¢²áÆÕͨµØÍ¼Æô¶¯³É¹¦ÐÅÏ¢ GameServer_CommMapServerInitOK(gameWorld) #³õʼ»¯ÓÎÏ·ÊÀ½çµÄ×îºóÒ»²½ gameWorld.SetInitOK(True) #֪ͨBalanceServer×Ô¼º³õʼ»¯ºÃÁË gameWorld.BalanceServer_MapServerInitOK() return def GameServer_CommMapServerInitOK(gameWorld): ''' ֪ͨGameServerµØÍ¼Æô¶¯Íê±Ï GetMapID=10010,GetLineID=0,GetRealMapID=10010,GetCopyMapID=0,GetLineNO=-1 GetMapID=10010,GetLineID=1,GetRealMapID=10010,GetCopyMapID=1,GetLineNO=-1 GetMapID=10010,GetLineID=2,GetRealMapID=10010,GetCopyMapID=2,GetLineNO=-1 GetMapID=10010,GetLineID=3,GetRealMapID=10010,GetCopyMapID=3,GetLineNO=-1 GetMapID=10010,GetLineID=4,GetRealMapID=10010,GetCopyMapID=4,GetLineNO=-1 GetMapID=10010,GetLineID=5,GetRealMapID=10011,GetCopyMapID=0,GetLineNO=-1 GetMapID=10010,GetLineID=6,GetRealMapID=10011,GetCopyMapID=1,GetLineNO=-1 GetMapID=10010,GetLineID=7,GetRealMapID=10011,GetCopyMapID=2,GetLineNO=-1 GameWorld.DebugLog("GetMapID=%s,GetLineID=%s,GetRealMapID=%s,GetCopyMapID=%s,GetLineNO=%s" % (gameWorld.GetMapID(), gameWorld.GetLineID(), gameWorld.GetRealMapID(), gameWorld.GetCopyMapID(), gameWorld.GetLineNO())) ''' # ÆÕͨµØÍ¼Í¨ÖªGameServerÆô¶¯OK if GameWorld.GetMap().GetMapFBType() == IPY_GameWorld.fbtNull: msgInfo = str([gameWorld.GetMapID(), gameWorld.GetLineID(), gameWorld.GetRealMapID(), gameWorld.GetCopyMapID()]) GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, "CommMapServerInitOK", msgInfo, len(msgInfo)) return ## ¹Ø±Õ¸±±¾ # @param tick µ±Ç°Ê±¼ä # @return None # @remarks º¯ÊýÏêϸ˵Ã÷. def CloseFB(tick): GameWorld.GetGameWorld().SetCloseFBTick(tick) return ## Íæ¼ÒÀ뿪µØÍ¼Ê±£¬³¢ÊԹرո±±¾ # @param ÎÞ # @return None # @remarks º¯ÊýÏêϸ˵Ã÷. def OnPlayerLeaveMapCloseFB(): gameWorld = GameWorld.GetGameWorld() #¹Ø±Õ¸±±¾ gameMap = gameWorld.GetMap() if gameMap.GetMapFBType() == 0: return if gameMap.GetAutoSize() == 0: #Ö»´¦Àí×Ô¶¯ÊÇ·ñµÄµØÍ¼ return playerManager = gameWorld.GetMapCopyPlayerManager() if playerManager.GetPlayerCount() == 1: #Èç¹ûÊÇ·þÎñÆ÷ÖÐ×îºóÒ»¸öÈËÀ뿪, Ôò¹Øµô¸±±¾ __CloseFB(GameWorld.GetGameWorld(), GameWorld.GetGameWorld().GetTick()) #//08 06 ¸ù¾Ý¹ú¼Òͳ¼ÆµÄÍæ¼ÒÊýÄ¿#tagMPlayerCountByCountry #tagMPlayerCountByCountry * GettagMPlayerCountByCountry(); # #class IPY_MPlayerCountByCountry #{ #public: # # int GetCountry1Count(); # # int GetCountry2Count(); # # int GetCountry3Count(); # # int GetCountryOtherCount(); #}; ## GameSever»ñµÃ¹ú¼®ÈËÊý # @param index # @param tick # @return None # @remarks º¯ÊýÏêϸ˵Ã÷. def GameSever_PlayerCountByCountry(index, tick): pack = IPY_GameWorld.IPY_MPlayerCountByCountry() gameWorld = GameWorld.GetGameWorld() #GameSever»ñµÃ¹ú¼®ÈËÊý£¬ÉèÖãº1¡¢ÇØ 2¡¢Îº 3¡¢³þ 4¡¢ÎÞ¹ú¼® gameWorld.SetPlayerByCountryCount(1, pack.GetCountry1Count()) gameWorld.SetPlayerByCountryCount(2, pack.GetCountry2Count()) gameWorld.SetPlayerByCountryCount(3, pack.GetCountry3Count()) gameWorld.SetPlayerByCountryCount(0, pack.GetCountryOtherCount()) return #=========================================================================== # //¼¶Áª¼ÆÊ±Æ÷ # //×¢²á(Ãû³Æ(ͬÃû»áɾ³ýÖØ½¨),¼ä¸ô,Py»Øµ÷Ãû,µ÷ÓôÎÊý£¨Ä¬ÈÏΪ-1ÎÞÏÞÑ­»·£¬Îª0ʱ»á±»×Ô¶¯É¾³ý£©, # ÊÇ·ñÖ´Ðв¹×ãµ÷ÓôÎÊýµÄÐÞÕý¹æÔò£¨Ä¬Èϲ»Ö´ÐУ©) # void RegLvTimer( char * Name, int interval, char* szPyModuleName, # char* szPyFuncName, int nTimerKey, # int livecycle = -1, bool isNeedTrigger = false); #=========================================================================== ##×¢²á¼¶Áª¼ÆÊ±Æ÷ # @param tick # @return None def RegLvTimer(tick): GameWorld.Log("×¢²á¼¶Áª¼ÆÊ±Æ÷") GameWorld.GetGameWorld().RegLvTimer("ProcessFight", 130, "PlayerState", "PlayerProcessFight", 1) #Á¢¼´Æô¶¯ GameWorld.GetGameWorld().StartLvTimer("ProcessFight", tick) return #--------------------------------------------------------------------- ## Îå·ÖÖÓˢР# @param tick # @return None def __RefreshOnFiveMinute(tick): gameWorld = GameWorld.GetGameWorld() lastTick = gameWorld.GetTickByType(ChConfig.TYPE_Map_Tick_ProcessFiveMinute) tickInterval = ChConfig.TYPE_Map_Tick_Time[ChConfig.TYPE_Map_Tick_ProcessFiveMinute] if tick - lastTick < tickInterval: return gameWorld.SetTickByType(ChConfig.TYPE_Map_Tick_ProcessFiveMinute, tick) # playerManager = GameWorld.GetMapCopyPlayerManager() # for index in xrange(playerManager.GetPlayerCount()): # curPlayer = playerManager.GetPlayerByIndex(index) # if not curPlayer: # continue return ## °´·ÖÖÓˢР# @param tick # @return None def __RefreshOnMinute(tick): gameWorld = GameWorld.GetGameWorld() lastTick = gameWorld.GetTickByType(ChConfig.TYPE_Map_Tick_ProcessMinute) tickInterval = ChConfig.TYPE_Map_Tick_Time[ChConfig.TYPE_Map_Tick_ProcessMinute] if tick - lastTick < tickInterval: return gameWorld.SetTickByType(ChConfig.TYPE_Map_Tick_ProcessMinute, tick) curTime = GameWorld.GetCurrentTime() __OnMapMinute(curTime, tick) playerManager = GameWorld.GetMapCopyPlayerManager() for index in xrange(playerManager.GetPlayerCount()): curPlayer = playerManager.GetPlayerByIndex(index) if not curPlayer: continue __ProcessHalfHour(curPlayer, curTime, tick) return def __OnMapMinute(curTime, tick): ## µØÍ¼²ã¼¶Ã¿·ÖÖÓ´¦Àí, ÿ·ÖÖÓ×î¶àÖ»»á´¦ÀíÒ»´Î, ÎÞÊÓÐéÄâ·ÖÏß curMinute = curTime.minute if curMinute == PyGameData.g_mapLastProcess_Minute: return PyGameData.g_mapLastProcess_Minute = curMinute PlayerTeam.OnCheckTeamPlayerDisconnectTimeout(tick) return ## Õû°ëСʱ´¥·¢ <00ºÍ30·ÖÖÓʱ´¥·¢> # @param curPlayer # @param curTime µ±Ç°Ê±¼ä¶ÔÏó # @param tick # @return None def __ProcessHalfHour(curPlayer, curTime, tick): if curTime.minute not in [0, 30]: return EventShell.EventResponse_OnHalfHour(curPlayer) return