#!/usr/bin/python # -*- coding: GBK -*- #--------------------------------------------------------------------- # #--------------------------------------------------------------------- ##@package PlayerMergeRegister.py # @todo: Íæ¼Ò¿ç·þÈü±¨Ãû # # @author: wdb # @date 2012-10-31 16:50 # @version 2.2 # @note: # @change: "2013-03-13 17:00" wdb ɾ³ý·â°ü # @change: "2015-09-11 15:00" hxp »Ö¸´¿ç·þÊý¾ÝÉÏ´«£¬¿ç·þÕ˺Ųéѯ£»Ôö¼Ó¿ç·þboss # @change: "2015-09-21 20:00" hxp ¿ç·þÕ˺ÅÐÅÏ¢¼Ç¼Ôö¼Ó±¾·þÕ˺ÅÐÅÏ¢ # @change: "2015-09-24 20:00" hxp Ôö¼ÓIsMergeOpenÅжÏ; Ôö¼Ó»î¶¯Î´¿ªÆô¼°Ìáǰ½áÊøÌáʾ # @change: "2015-09-26 15:30" hxp ¿ç·þÖ÷·þÎñÆ÷²»ÔÊÐíÉÏ´«±¨ÃûÊý¾Ý # @change: "2015-10-28 00:00" hxp Ôö¼Ó¿ç·þPK # @change: "2015-11-05 12:00" hxp ¿ç·þÐÂÕ˺Åͬ²½Ôö¼ÓÕ½Á¦ÐÅÏ¢ # @change: "2015-11-13 17:00" hxp Ôö¼ÓÍõÕßÕù°Ô # @change: "2015-12-02 16:00" hxp Ôö¼ÓÉÏ´«¼°²éѯ¿ç·þÕ˺ÅÈÕÖ¾ # @change: "2016-12-20 17:30" hxp ÓÀºã°æÐÞ¸Ä # @change: "2017-06-22 15:00" hxp ¿ç·þºé»ÄÖ®Á¦Ö§³Ö; ¿ç·þ»î¶¯µØÍ¼·ÖÅ乿Ôò¸ÄΪÔÚGameServerÅäÖà # @change: "2017-07-06 20:30" hxp ¿ç·þboss½ø³¡·ÖÅäÈËÊý·½Ê½Ð޸ģ»Ö§³ÖÖ¸¶¨µØÍ¼¼°°´ÈËÊý·ÖÅäµØÍ¼Á½ÖÖģʽ²¢´æ #--------------------------------------------------------------------- #"""Version = 2017-07-06 20:30""" #--------------------------------------------------------------------- import ChConfig import GameWorld import ChPyNetSendPack import NetPackCommon import ShareDefine import PlayerUniversalGameRec import GameWorldMergeBoss import GameWorldMergeKing import GameWorldMergePK import PlayerControl import MergeChildMsg import ReadChConfig import random import time #--------------------------------------------------------------------- #//C0 11 ÉÏ´«Êý¾ÝµÄ»î¶¯ÀàÐÍ #tagActionMergeRegister # #struct tagActionMergeRegister #{ # tagHead Head; # BYTE ActionType; //»î¶¯ÀàÐÍ #}; #--------------------------------------------------------------------- ## ¿ç·þÈü±¨Ãû£¨ÉÏ´«Êý¾Ý£© # @param index Íæ¼ÒË÷Òý # @param tick µ±Ç°Ê±¼ä # @return None def MergeWarRegisterPack(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) if not curPlayer: return playerID = curPlayer.GetPlayerID() actionType = clientData.ActionType GameWorld.Log("MergeWarRegisterPack actionType=%s" % actionType, playerID) if GameWorld.IsMergeServer(): GameWorld.Log(" ¿ç·þ·þÎñÆ÷²»ÔÊÐíÉÏ´«±¨ÃûÊý¾Ý!", playerID) return if actionType >= ShareDefine.Def_MergeAction_TypeMax: return #¼ä¸ôδµ½ if not GameWorld.RefurbishPlayerTick(curPlayer, ChConfig.TYPE_Player_Tick_MergeRegister, tick): GameWorld.Log(" ÉÏ´«¼ä¸ôδµ½ %s" % actionType, playerID) return # µ±Ç°»î¶¯µÄÉÏ´«Êý¾ÝÊÇ·ñ¿ªÆô if not IsCurActionRegisterOpen(actionType, curPlayer, True): GameWorld.Log(" µ±Ç°»î¶¯µÄÉÏ´«Êý¾Ý먦Æô %s" % actionType, playerID) return # Íæ¼ÒÊÇ·ñÓе±Ç°»î¶¯µÄÉÏ´«Êý¾Ý×ʸñ if not CheckPlayerCanMergeRegister(curPlayer, actionType): GameWorld.Log(" Íæ¼ÒûÓе±Ç°»î¶¯µÄÉÏ´«Êý¾Ý×ʸñ %s" % actionType, playerID) return mapPosInfo = [ChConfig.Def_MergeTransMapID, ChConfig.Def_MergeTransMapID, 0] + ChConfig.Def_MergeTransMapPos #if actionType in [ShareDefine.Def_MergeAction_Boss]: # mapPosInfo = GetMergeActionMapPos(actionType) SendMergeActionReg(curPlayer, actionType, mapPosInfo) return def SendMergeActionReg(curPlayer, actionType, mapPosInfo): # ·¢ËÍ¿ç·þÕ˺Å×¢²áÉÏ´«Êý¾Ý # ÉèÖÃÉÏ´«Êý¾ÝµÄÀàÐÍ curPlayer.SetDict(ChConfig.Def_PlayerKey_MergeRegisterType, actionType) sysMsg = str([actionType] + mapPosInfo) curPlayer.MapServer_QueryPlayerResult(0, 0, 'MergeWarRegister', sysMsg, len(sysMsg)) GameWorld.Log(" MapServer_QueryPlayerResult MergeWarRegister actionType=%s, sysMsg=%s" % (actionType, sysMsg), curPlayer.GetPlayerID()) return def GetMergeActionMapPos(actionType): # »ñÈ¡¿ç·þ»î¶¯¶ÔÓ¦ÉÏ´«Êý¾ÝµØÍ¼×ø±ê # @return: [mapID,dataMapID,copyMapID,posX,posY] MergeActionMapPosDict = ReadChConfig.GetEvalChConfig("MergeActionMapPos") if actionType not in MergeActionMapPosDict: #GameWorld.ErrLog("¿ç·þÉÏ´«Êý¾ÝÕÒ²»µ½»î¶¯ÀàÐÍ(%s)¶ÔÓ¦µØÍ¼×ø±êÅäÖ㬼ì²éMergeActionMapPos.txt!" % actionType) return mapPosDict = MergeActionMapPosDict[actionType] if not mapPosDict: #GameWorld.ErrLog("¿ç·þÉÏ´«Êý¾ÝÕÒ²»µ½»î¶¯ÀàÐÍ(%s)¶ÔÓ¦µØÍ¼×ø±êÅäÖ㬼ì²éMergeActionMapPos.txt!!" % actionType) return mapPosList = [] # Íæ¼ÒËùÊôԭʼ·þÎñÆ÷ID mergeServerID = GameWorld.GetMergeServerID() for serverIDTupleKey, posList in mapPosDict.items(): for serverID in serverIDTupleKey: if (isinstance(serverID, int) and serverID == mergeServerID) or \ (isinstance(serverID, tuple) and len(serverID) == 2 \ and serverID[0] <= mergeServerID <= serverID[1]): mapPosList = posList break if mapPosList: break if not mapPosList: #GameWorld.ErrLog("¿ç·þÉÏ´«Êý¾ÝÕÒ²»µ½»î¶¯ÀàÐÍ(%s),serverID=%s,¶ÔÓ¦µØÍ¼×ø±êÅäÖ㬼ì²éMergeActionMapPos.txt!!" # % (actionType, mergeServerID)) return mapPosInfo = random.choice(mapPosList) if len(mapPosInfo) != 5: GameWorld.ErrLog("¿ç·þÉÏ´«Êý¾Ý»î¶¯ÀàÐÍ(%s),serverID=%s,¶ÔÓ¦µØÍ¼×ø±êÅäÖôíÎ󣬼ì²éMergeActionMapPos.txt!" % (actionType, mergeServerID)) return return mapPosInfo ## ¿ç·þÈü±¨Ãû»ñµÃÐÂÕ˺Š# @param playerID: Íæ¼ÒʵÀý # @param msgList: ±»É±Íæ¼Òid # @param tick # @return: None def MergeWarRegisterNewAcc(playerID, msgList, tick): actionType = ShareDefine.Def_MergeAction_MergeWar accID = "" curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID) if curPlayer != None: # ÉèÖÃÉÏ´«Êý¾ÝµÄÀàÐÍ actionType = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_MergeRegisterType) accID = curPlayer.GetAccID() # ÐÂÕ˺Å, ĿǰÕ˺ÅÒÑÈ·±£ÔÚËùÓÐÆ½Ì¨ÖÐΨһ£¬¹Ê¿ç·þÕ˺ÅÖ±½ÓÓñ¾·þÕ˺ż´¿É newAccID, newPwd, fightPower, playerLV, maxHP = msgList if not accID: accID = newAccID #¿ç·þÈüÊý¾Ý universalRecMgr = GameWorld.GetUniversalRecMgr() recTypeListData = universalRecMgr.GetTypeList(ShareDefine.Def_UniversalGameRecType_MergeRegister) # ²éÕÒÊÇ·ñÒÑÓмǼ playerRec = None for index in xrange(recTypeListData.Count()): universalRecData = recTypeListData.At(index) if universalRecData.GetValue1() == playerID: playerRec = universalRecData break if playerRec == None: #»¹Î´¼Ç¼£¬ÔòÌí¼ÓÒ»¸ö¼Ç¼¶ÔÏó playerRec = recTypeListData.AddRec() playerRec.SetValue1(playerID) curTime = int(time.time()) playerRec.SetTime(curTime) playerRec.SetStrValue2(newPwd) PlayerUniversalGameRec.SetUniversalGameRecStrValue3(playerRec, newAccID) GameWorld.Log("¿ç·þÈü±¨Ãû»ñµÃÐÂÕ˺ŠnewAccID=%s, newPwd=%s, actionType=%s, curTime=%s" % (newAccID, newPwd, actionType, curTime), playerID) if not curPlayer: return playerID = curPlayer.GetPlayerID() # ¿ç·þPKÉÏ´«Êý¾ÝÍê±Ï£¬Í¨Öª¿ç·þ·þÎñÆ÷£¬×¼±¸Íê±Ï if actionType == ShareDefine.Def_MergeAction_MergePK: regVSRoomID = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_MergeRegisterRoomID) vsRoomID = curPlayer.GetVsRoomId() if regVSRoomID != vsRoomID: GameWorld.Log("ÉÏ´«¿ç·þ·þÎñÆ÷µÄregVSRoomID=%s£¬ÓëÍæ¼Òµ±Ç°µÄroomID=%s²»Í¬!²»·¢ËÍ×¼±¸Íê±Ï£¡" % (regVSRoomID, vsRoomID), playerID) return dataMsg = { "playerAccID":accID, # ½ÇÉ«Õ˺ÅID "playerID":playerID, # ½ÇÉ«ID "playerName":curPlayer.GetName(), # ½ÇÉ«Ãû "playerJob":curPlayer.GetJob(), # ½Çɫְҵ "vsRoomID":vsRoomID, # ËùÊô¶ÔÕ½·¿¼äID "fightPower":fightPower, # Õ½¶·Á¦ "playerLV":playerLV, # Íæ¼ÒµÈ¼¶ "maxHP":maxHP, # ×î´óѪÁ¿ } MergeChildMsg.SendMergerChildToCenterStringData(ChConfig.Def_MergePKPrepareOK, dataMsg) GameWorld.Log("֪ͨ¿ç·þ·þÎñÆ÷, Íæ¼ÒÆ¥ÅäPK×¼±¸Íê±Ï£¡%s" % str(dataMsg), playerID) # ÉÏ´«Êý¾ÝÍê±Ï£¬Í¨ÖªÍæ¼Ò½øÈë¿ç·þÍõÕßÕù°Ô elif actionType == ShareDefine.Def_MergeAction_MergeKing: GameWorldMergeKing.Notify_PlayerEnterMergeKing(curPlayer) #elif actionType == ShareDefine.Def_MergeAction_Boss: # # Ôݲ»´¦Àí # pass # ÆäËûµÄ£¬ÔÚÉÏ´«Êý¾ÝÍê±Ïºó£¬Ê¹ÓÃͨÓõÄ֪ͨ¿É½øÈë¿ç·þ else: NotifyCanEnterMergeServer(curPlayer, actionType, newAccID, newPwd) # hxp 2015.09.10 ¿ç·þboss£¬ºóÃæµÄÔÝʱ²»ÐèÒª return def GetMergeRegRecAccID(recData): return recData.GetStrValue3() ## ¿ç·þÈü±¨Ãû»ñµÃÍæ¼Ò¼Ç¼ # @param playerID: Íæ¼ÒʵÀý # @return: None def GetRegisterPlayerRec(playerID): #¿ç·þÈüÊý¾Ý recType = ShareDefine.Def_UniversalGameRecType_MergeRegister universalRecMgr = GameWorld.GetUniversalRecMgr() recTypeListData = universalRecMgr.GetTypeList(recType) # ²éÕÒÊÇ·ñÒÑÓмǼ for index in xrange(recTypeListData.Count()): universalRecData = recTypeListData.At(index) if universalRecData.GetValue1() != playerID: continue # ÐÂÕ˺Å,ÃÜÂë return universalRecData return None def GetRegisterPlayerID(newAccID): ## ¸ù¾Ý¿ç·þÈüÐÂÕ˺ŻñµÃÍæ¼Òid if not newAccID: return 0 #¿ç·þÈüÊý¾Ý recType = ShareDefine.Def_UniversalGameRecType_MergeRegister universalRecMgr = GameWorld.GetUniversalRecMgr() recTypeListData = universalRecMgr.GetTypeList(recType) # ²éÕÒÊÇ·ñÒÑÓмǼ for index in xrange(recTypeListData.Count()): universalRecData = recTypeListData.At(index) if universalRecData.GetStrValue3() != newAccID: continue return universalRecData.GetValue1() return 0 def NotifyCanEnterMergeServer(curPlayer, actionType, newAccID, newPwd): # ͨÓðü£¬Í¨Öª¿Í»§¶Ë¿É½øÈë¿ç·þ·þÎñÆ÷ mapID, lineID = 0, 0 mapPosInfo = GetMergeActionMapPos(actionType) if mapPosInfo: mapID = mapPosInfo[0] lineID = mapPosInfo[2] canEnterMServer = ChPyNetSendPack.tagCanEnterMergeServer() canEnterMServer.Clear() canEnterMServer.ActionType = actionType canEnterMServer.MapID = mapID canEnterMServer.LineID = lineID canEnterMServer.NewAccID = newAccID canEnterMServer.NewAccIDLen = len(canEnterMServer.NewAccID) canEnterMServer.NewPsw = newPwd canEnterMServer.NewPswLen = len(canEnterMServer.NewPsw) NetPackCommon.SendFakePack(curPlayer, canEnterMServer) return #---------------------------------------------------------------------- #//C0 12 ¿ç·þÈüÕ˺Ųéѯ #tagMergeWarAccQuery # #struct tagMergeWarAccQuery #{ # tagHead Head; #}; #---------------------------------------------------------------------- ## ¿ç·þÈüÕ˺Ųéѯ # @param index Íæ¼ÒË÷Òý # @param tick µ±Ç°Ê±¼ä # @return None def MergeWarAccQueryPack(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) actionType = clientData.ActionType if actionType >= ShareDefine.Def_MergeAction_TypeMax: GameWorld.ErrLog(" ·Ç·¨¿ç·þ»î¶¯ÀàÐÍ£¡actionType=%s" % actionType, curPlayer.GetPlayerID()) return # µ±Ç°»î¶¯µÄÉÏ´«Êý¾ÝÊÇ·ñ¿ªÆô if not IsCurActionRegisterOpen(actionType, curPlayer): GameWorld.Log("¿ç·þÈüÕ˺Ųéѯ£º ÉÏ´«Êý¾Ý먦Æô£¡actionType=%s" % actionType, curPlayer.GetPlayerID()) return # ¿ç·þÈü±¨Ãû»ñµÃÍæ¼Ò¼Ç¼ newPlayerInfo = GetRegisterPlayerRec(curPlayer.GetID()) if newPlayerInfo == None: GameWorld.Log(" ÕÒ²»µ½¿ç·þÕ˺ÅÊý¾Ý£¡", curPlayer.GetPlayerID()) return newAccID = newPlayerInfo.GetStrValue3() newPsw = newPlayerInfo.GetStrValue2() resultPack = ChPyNetSendPack.tagMergeRegisterQueryResult() resultPack.Clear() resultPack.NewAccIDLen = len(newAccID) resultPack.NewAccID = newAccID resultPack.NewPswLen = len(newPsw) resultPack.NewPsw = newPsw NetPackCommon.SendFakePack(curPlayer, resultPack) GameWorld.Log("¿ç·þÈüÕ˺ŲéѯactionType=%s,newAccID=%s,newPsw=%s" % (actionType, newAccID, newPsw), curPlayer.GetPlayerID()) return ## µ±Ç°»î¶¯µÄÉÏ´«Êý¾ÝÊÇ·ñ¿ªÆô # @param actionType »î¶¯ÀàÐÍ # @return bool def IsCurActionRegisterOpen(actionType, curPlayer, isNotify=False): if not GameWorld.IsMergeOpen(): GameWorld.Log("IsCurActionRegisterOpen False!(Because IsMergeOpen() return False!)") return False # ¿ç·þboss if actionType == ShareDefine.Def_MergeAction_Boss: return GameWorldMergeBoss.IsMergeBossOpen(curPlayer, isNotify) # ¿ç·þPK elif actionType == ShareDefine.Def_MergeAction_MergePK: return GameWorldMergePK.IsMergePKMatchOpen() # ¿ç·þÍõÕßÕù°Ô elif actionType == ShareDefine.Def_MergeAction_MergeKing: return GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_Merge_King) > 0 if isNotify: PlayerControl.NotifyCode(curPlayer, "GeRen_hgg_21675") return False ## Íæ¼Òµ±Ç°»î¶¯ÊÇ·ñ¿ÉÒÔÉÏ´«Êý¾Ý # @param curPlayer Íæ¼ÒʵÀý # @param actionType »î¶¯ÀàÐÍ # @return bool def CheckPlayerCanMergeRegister(curPlayer, actionType): # ¿ç·þboss if actionType == ShareDefine.Def_MergeAction_Boss: return __CheckCanJoinMergeBoss(curPlayer) return True ## ¿ªÆô¿ç·þÈü±¨Ãû # @param None # @return: None def __CheckCanJoinMergeBoss(curPlayer): joinCondition = ReadChConfig.GetEvalChConfig("MergeBoss_Condition") needLV = joinCondition[0] needFPOrder = joinCondition[1] playerLV = curPlayer.GetLV() if needLV > 0 and playerLV < needLV: return False if needFPOrder > 0: fpBillboardType = ShareDefine.Def_BT_FightPower billBoard = GameWorld.GetBillboard().FindBillboard(fpBillboardType) if not billBoard: GameWorld.ErrLog("__CheckCanJoinMergeBoss ÕÒ²»µ½ÅÅÐаñÊý¾Ý(%s)" % fpBillboardType) return False order = billBoard.IndexOfByID(curPlayer.GetPlayerID()) + 1 # Íæ¼ÒÔÚÅÅÐаñÖеÄÃû´Î if order > needFPOrder or order <= 0: return False return True