#!/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
|
|