#!/usr/bin/python  
 | 
# -*- coding: GBK -*-  
 | 
#  
 | 
#  
 | 
##@package HighLadder.py  
 | 
#  
 | 
# @todo:ÌìÌݾº¼¼³¡GameServer  
 | 
#  
 | 
# @author xmnathan  
 | 
# @date 2010-01-01 10:00  
 | 
# @version 2.4  
 | 
# @note:  
 | 
# @change: "2014-08-08 10:30" xmnathan ÌìÌݾº¼¼³¡  
 | 
# @change: "2014-08-11 17:30" xmnathan ÌìÌݾº¼¼³¡Ä¬ÈÏ¿ÉÌôÕ½ÅÅλÁÐ±í  
 | 
# @change: "2014-08-11 18:30" xmnathan ÌìÌݾº¼¼³¡Ôö¼ÓÌôսǰ¼¸Ãû³É¹¦ÏµÍ³Ìáʾ  
 | 
# @change: "2014-08-18 16:30" xmnathan ÌìÌݾº¼¼³¡Ôö¼ÓÌôսʱÅÅÃû±ä¸üϵͳÌáʾ  
 | 
# @change: "2014-08-19 14:30" xmnathan ÌìÌݾº¼¼³¡ÌôÕ½ÁбíËæ»úѡȡ  
 | 
# @change: "2014-08-21 09:39" xmnathan ÌìÌݾº¼¼³¡  ÅÅÐаñID ID2±ØÐë¶¼´æÍ¬Ò»¸öÖµ£¬·â°ü·¢µÄÊÇID2  
 | 
# @change: "2014-09-09 16:40" xmnathan ÌìÌݾº¼¼³¡¿ÉÌôÕ½ÁбíÌí¼Ó¸Ä³ÉÃû´Î  
 | 
# @change: "2014-11-10 10:30" xmnathan PlayerBillboardͳһ¿½±´ÅÅÐаñ×òÈÕ°ñ  
 | 
# @change: "2014-12-22 20:30" xmnathan ¾º¼¼³¡Ã¿ÈÕÅÅÐн±Àø²éѯ·À·¶  
 | 
# @change: "2015-01-14 20:30" hxp Ôö¼Ó¸ù¾ÝÌôÕ½´ÎÊýÒ»¶¨¼¸ÂʸøÎïÆ·  
 | 
# @change: "2015-07-13 10:30" ljd ÅÅÐаñ¼ÓÍæ¼Òƽ̨²ÎÊýName2,ƽ̨ÐÅϢȡֵ  
 | 
# @change: "2016-10-27 16:00" hxp »ñÈ¡¿ÉÌôÕ½Ãû´ÎÁбíÂß¼ÓÅ»¯  
 | 
# @change: "2016-11-07 21:40" xdh Ô¤·À±¨´í  
 | 
# @change: "2016-12-13 21:00" xdh Ôö¼ÓJJCÒ»´ÎÐÔÅÅÃû½±Àø  
 | 
#------------------------------------------------------------------------------   
 | 
#"""Version = 2016-12-13 21:00"""  
 | 
#------------------------------------------------------------------------------   
 | 
  
 | 
import GameWorld  
 | 
import ShareDefine  
 | 
import IPY_GameServer  
 | 
import ReadChConfig  
 | 
import ChGameToMapPyPack  
 | 
import NetPackCommon  
 | 
import PlayerControl  
 | 
import PlayerBillboard  
 | 
import ChPyNetSendPack  
 | 
import random  
 | 
      
 | 
(  
 | 
Def_TopPlayer_Count, # ²é¿´ÌìÌݶ¥¼¶Íæ¼ÒÁбíµÄλÊý  
 | 
Def_StartOrder, # ÌìÌÝÍæ¼ÒĬÈÏÆðʼλÖÃ(Ë÷Òý´Ó0Æð)  
 | 
Def_CanFightCount, #  ¿ÉÌôÕ½Íæ¼ÒÏÔʾ¸öÊý  
 | 
Def_HighOrderAtleastCnt, # ¿ÉÌôÕ½µÄÍæ¼ÒÖÁÉÙÐè°üº¬¶àÉÙÃû×ÔÉíÅÅÃûºóµÄÍæ¼Ò  
 | 
Def_MinOrder, # ÌìÌÝÍæ¼Ò½ø°ñ×îµÍÃû´Î  
 | 
Def_Rec_Count, # ¶ÔÕ½¼Ç¼ÌõÊý  
 | 
Def_CanFightOrderList, # ¿ÉÖ±½ÓÌôÕ½µÄÅÅÃû  
 | 
) = range(7)  
 | 
  
 | 
def GetHighLadderCfg(index):  
 | 
    hladderCfg = ReadChConfig.GetEvalChConfig("HighLadderDef")  
 | 
    if index < 0 or index >= len(hladderCfg):  
 | 
        return 0  
 | 
    return hladderCfg[index]  
 | 
  
 | 
##//1A 11 ÌìÌݾº¼¼³¡²éѯ¶¥¼¶Íæ¼ÒÁбí#tagCHightLadderTopPlayerQuery  
 | 
#struct    tagCHightLadderTopPlayerQuery  
 | 
#{  
 | 
#    tagHead Head;  
 | 
#};  
 | 
#  @param index, tick  
 | 
#  @return None  
 | 
def OnHightLadderTopPlayerQuery(index, tick):  
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  
 | 
    if not curPlayer:  
 | 
        return  
 | 
    curPlayer.Sync_HightLadderTopPlayer(GetHighLadderCfg(Def_TopPlayer_Count))  
 | 
    return  
 | 
  
 | 
  
 | 
##//1A 12 ÌìÌݾº¼¼³¡²éѯµ±Ç°Î»ÖÿÉÌôÕ½Íæ¼ÒÁбí#tagCHightLadderCanFightPlayerQuery  
 | 
#struct    tagCHightLadderCanFightPlayerQuery  
 | 
#{  
 | 
#    tagHead Head;  
 | 
#    DWORD    PlayerID;  
 | 
#};  
 | 
#  @param index, tick  
 | 
#  @return None  
 | 
def OnHightLadderCanFightPlayerQuery(index, tick):  
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  
 | 
    if not curPlayer:  
 | 
        return  
 | 
    recvPack = IPY_GameServer.IPY_CHightLadderCanFightPlayerQuery()  
 | 
      
 | 
    PlayerID = recvPack.GetPlayerID()  
 | 
    Sync_HightLadderCanFightPlayer(curPlayer, PlayerID)  
 | 
    curPlayer.Sync_HighLadderPlayerVsRec()  
 | 
    return  
 | 
##֪ͨ ÌìÌݾº¼¼³¡²éѯµ±Ç°Î»ÖÿÉÌôÕ½Íæ¼ÒÁÐ±í  
 | 
#  @param curPlayer, PlayerID  
 | 
#  @return  
 | 
def Sync_HightLadderCanFightPlayer(curPlayer, PlayerID):  
 | 
              
 | 
    myOrder = GetPlayerOrder(PlayerID)  
 | 
    curPlayer.Begin_AddHightLadderCanFightPlayer(myOrder)  
 | 
    #Ìí¼Ó¿É¶ÔÕ½Íæ¼Ò ¡¡  
 | 
    highOrderList, lowOrderList = GetCanFightOrder(myOrder)  
 | 
    highAtleastCnt = GetHighLadderCfg(Def_HighOrderAtleastCnt)  
 | 
    canFightCnt = GetHighLadderCfg(Def_CanFightCount)  
 | 
    randomList = []  
 | 
    if highAtleastCnt:  
 | 
        if highOrderList:  
 | 
            randomList = random.sample(highOrderList, min(len(highOrderList), highAtleastCnt)) # ÖÁÉÙÐè°üº¬µÄ  
 | 
            for order in randomList:  
 | 
                highOrderList.remove(order) # ÏȰÑÒÑÑ¡³öÀ´µÄÒÆ³ý£¬ºóÃæ¸öÊý²»¹»Ê±»¹ÐèÒª´ÓÖÐÑ¡Ôñ  
 | 
              
 | 
        GameWorld.DebugLog("ÖÁÉÙÐè°üº¬µÄ: highAtleastCnt=%s, randomList=%s, highOrderList=%s"   
 | 
                           % (highAtleastCnt, randomList, highOrderList))  
 | 
      
 | 
    if lowOrderList:  
 | 
        randomList += random.sample(lowOrderList, min(len(lowOrderList), max(0, canFightCnt - len(randomList)))) # »¹ÐèÌí¼ÓµÄ  
 | 
    GameWorld.DebugLog("Ëæ»úÌí¼ÓlowOrderList: randomList=%s" % randomList)  
 | 
      
 | 
    # Èç¹û»¹²»¹»  
 | 
    if len(randomList) < canFightCnt:  
 | 
        if highOrderList:  
 | 
            randomList += random.sample(highOrderList, canFightCnt - len(randomList)) # »¹ÐèÌí¼ÓµÄ  
 | 
        GameWorld.DebugLog("»¹²»¹»ÔòÌí¼Ó֮ǰµÄhighOrderList: randomList=%s" % randomList)  
 | 
          
 | 
    randomList.sort()  
 | 
    GameWorld.DebugLog("×îÖÕËæ»úÌôÕ½Áбí: myOrder=%s,randomList=%s" % (myOrder, randomList))  
 | 
    for orderIndex in randomList:  
 | 
        curPlayer.Add_HightLadderCanFightPlayer(orderIndex)  
 | 
    curPlayer.Sync_HightLadderCanFightPlayer()          
 | 
    return  
 | 
  
 | 
## »ñÈ¡Íæ¼Òµ±Ç°Ãû´Î  
 | 
#  @param PlayerID  
 | 
#  @return myOrder  
 | 
def GetPlayerOrder(PlayerID):  
 | 
    myPlayerData = GameWorld.GetHightLadderMgr().FindPlayerData(PlayerID)  
 | 
    myOrder = GetHighLadderCfg(Def_StartOrder)  
 | 
    if myPlayerData:  
 | 
        myOrder = myPlayerData.GetOrder()  
 | 
    return myOrder  
 | 
  
 | 
## ¸ù¾Ý¹æÔò»ñÈ¡¿ÉÌôÕ½ÅÅÃûÁÐ±í  
 | 
#  @param myOrder  
 | 
#  @return None  
 | 
def GetCanFightOrder(myOrder):  
 | 
    '''  
 | 
    @todo: ¸ù¾ÝÍæ¼ÒÅÅÃû»ñÈ¡¿ÉÌôÕ½µÄÍæ¼ÒÅÅÃûÁÐ±í  
 | 
    @param myOrder: Íæ¼ÒÃû´Î  
 | 
    @return: ¿ÉÌôÕ½µÄ½Ï¸ßÅÅÃûÍæ¼ÒÁбí, ¿ÉÌôÕ½µÄ½ÏµÍÅÅÃûÍæ¼ÒÁÐ±í  
 | 
    @note:   
 | 
            Ãû´ÎÔ½¸ßʵÁ¦Ô½²î, µÚÒ»ÃûµÄÃû´ÎΪ0  
 | 
    '''  
 | 
    HightLadderCanFightDict = ReadChConfig.GetEvalChConfig("HighLadderCanFight")  
 | 
    #»ñÈ¡¿ÉÌôÕ½·¶Î§  
 | 
    orderRange = GameWorld.GetDictValueByRangeKey(HightLadderCanFightDict, myOrder, [-10, 10])  
 | 
    highOrder = max(0, min(myOrder - orderRange[0], GetHighLadderCfg(Def_MinOrder)))  
 | 
    lowOrder = max(0, myOrder - orderRange[1])  
 | 
      
 | 
    highOrderList = range(myOrder + 1, highOrder + 1)  
 | 
    lowOrderList = range(lowOrder, myOrder)  
 | 
      
 | 
    GameWorld.DebugLog("¿ÉÌôÕ½Áбí: myOrder=%s, highOrderList=%s, lowOrderList=%s"   
 | 
                       % (myOrder, highOrderList, lowOrderList))  
 | 
    return highOrderList, lowOrderList  
 | 
  
 | 
##//03 02 ÌìÌݾº¼¼³¡Íæ¼Ò·¢ÆðÌôÕ½#tagMGHighLadderChallenge  
 | 
#  @param routeIndex, mapID, curPackData, tick  
 | 
#  @return None  
 | 
def OnMGHighLadderChallenge(routeIndex, mapID, curPackData, tick):  
 | 
    GameWorld.DebugLog("HighLadder### OnMGHighLadderChallenge in")  
 | 
    myPlayerID = curPackData.PlayerID  
 | 
    curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(myPlayerID)  
 | 
    myOrder = GetPlayerOrder(myPlayerID)  
 | 
    GameWorld.DebugLog("HighLadder### OnMGHighLadderChallenge in myOrder %s VSOrder %s"%(myOrder, curPackData.VSOrder))  
 | 
    highOrderList, lowOrderList = GetCanFightOrder(myOrder)  
 | 
    canFightOrderList = highOrderList + lowOrderList  
 | 
    #УÑé Íæ¼ÒÄÜ·ñÌôÕ½¸ÃÅÅλ  ¸ù¾Ý×ÔÉíÅÅλËã³öÀ´µÄ¿ÉÌôÕ½ÁÐ±í            Ä¬ÈÏÅäÖõĿÉÌôÕ½ÁÐ±í  
 | 
    if(curPackData.VSOrder not in canFightOrderList) and (curPackData.VSOrder not in GetHighLadderCfg(Def_CanFightOrderList)):  
 | 
        #ÄúµÄλÖÃÒѱä¸ü£¬ÇëÖØÐÂÑ¡ÔñÌôÕ½µÄÍæ¼Ò  
 | 
        Sync_HightLadderCanFightPlayer(curPlayer, myPlayerID)  
 | 
        PlayerControl.NotifyCode(curPlayer, "Arena_liubo_807125")  
 | 
        GameWorld.DebugLog("HighLadder### OnMGHighLadderChallenge canFightOrderList %s"%canFightOrderList)  
 | 
        GameWorld.DebugLog("HighLadder### OnMGHighLadderChallenge out order err")  
 | 
        return  
 | 
    #Õ½¶·ÊôÐÔ  
 | 
    curFightPropertyDict = eval(curPackData.FightPropertyData)   
 | 
    curFightPropertyDict["FightPower"] = curPackData.FightPower  
 | 
    curVsFightPropertyDict = GetFightPropertyDictByOrder(curPackData.VSOrder)  
 | 
      
 | 
    hadFightCnt = curFightPropertyDict["HadFightCnt"]  
 | 
    awardItemList = __GetFightCntAwardItemList(hadFightCnt)  
 | 
    GameWorld.DebugLog("OnMGHighLadderChallenge hadFightCnt=%s,awardItemList=%s"   
 | 
                       % (hadFightCnt, str(awardItemList)))  
 | 
    historyMaxOrder = curFightPropertyDict["HistoryMaxOrder"]#ÀúÊ·×î¸ßÅÅÃûĬÈÏ1¿ªÊ¼,0´ú±íδ¼Ç¼¹ý  
 | 
    result = DoFight(curFightPropertyDict, curVsFightPropertyDict)   
 | 
    #ÏÈ֪ͨ¶ÔÕ½½á¹û   
 | 
    curVsHightLadderPlayer = GameWorld.GetHightLadderMgr().FindPlayerDataByOrder(curPackData.VSOrder)  
 | 
    curVsPlayerID = 0  
 | 
    curVsPlayerName = ""  
 | 
    # ¸½¼ÓÐÅÏ¢  
 | 
    PlusInfoDict = {}  
 | 
    PlusInfoDict["Order"] = myOrder  
 | 
    PlusInfoDict["VSOrder"] = curPackData.VSOrder  
 | 
    PlusInfoDict["AwardItemList"] = awardItemList    
 | 
    myNewOrder = min(myOrder, curPackData.VSOrder) if result else myOrder   
 | 
    if historyMaxOrder == 0:  
 | 
        upOrder = GetHighLadderCfg(Def_StartOrder) - myNewOrder  
 | 
    else:  
 | 
        upOrder = max(0, historyMaxOrder - 1 - myNewOrder) # ÌáÉýµÄÅÅÃû  
 | 
      
 | 
    newMaxOrder = (historyMaxOrder - upOrder) if historyMaxOrder else (myNewOrder + 1)  
 | 
    PlusInfoDict["HistoryMaxOrder"] = newMaxOrder  
 | 
    PlusInfoDict["upOrder"] = upOrder  
 | 
    strPlusInfoDict = str(PlusInfoDict)  
 | 
      
 | 
    if curVsHightLadderPlayer:  
 | 
        curVsPlayerID = curVsHightLadderPlayer.GetPlayerID()  
 | 
        curVsPlayerName = curVsHightLadderPlayer.GetPlayerName();  
 | 
    curPlayer.Sync_HightLadderVSPlayerInfo(curVsPlayerID, result, strPlusInfoDict, len(strPlusInfoDict))  
 | 
      
 | 
    GameWorld.DebugLog("HighLadder### OnMGHighLadderChallenge Send tagGMHighLadderChallengeReuslt")  
 | 
    #·¢°üµ½µØÍ¼·þÎñÆ÷¸ø½±Àø  
 | 
    sendPack = ChGameToMapPyPack.tagGMHighLadderChallengeReuslt()   
 | 
    sendPack.PlayerID = myPlayerID  
 | 
    sendPack.Result = result  
 | 
    sendPack.PlusInfo = strPlusInfoDict  
 | 
    sendPack.PlusInfoSize = len(strPlusInfoDict)  
 | 
    NetPackCommon.SendPyPackToMapServer(routeIndex, mapID, sendPack)   
 | 
    GameWorld.DebugLog("HighLadder### OnMGHighLadderChallenge Send tagGMHighLadderChallengeReuslt OK")     
 | 
  
 | 
    #Ìí¼Ó¶ÔÕ½¼Ç¼»º´æ  
 | 
    GameWorld.GetHightLadderMgr().AddPlayerVsRec(myPlayerID, curVsPlayerID, curVsPlayerName, \  
 | 
                                                 myOrder, curPackData.VSOrder, 0, result)   
 | 
    myRec = GameWorld.GetHightLadderMgr().GetPlayerVsRec(myPlayerID)  
 | 
    #ɾ³ý¶àÓà³öÀ´µÄÌõÊý     
 | 
    DelUselessRec(myRec)  
 | 
          
 | 
    curPlayer.Sync_HighLadderPlayerVsRec()  
 | 
      
 | 
    if curVsPlayerID:#±»ÌôÕ½Íæ¼ÒÒ²Òª¼Ç¼ ½á¹ûÐèÒª·´¹ýÀ´ ÒÔ±»ÌôÕ½Õ߽Ƕȿ´  
 | 
        GameWorld.GetHightLadderMgr().AddPlayerVsRec(curVsPlayerID, myPlayerID, curPackData.PlayerName, \  
 | 
                                                     curPackData.VSOrder, myOrder, 1, not result)  
 | 
        vsRec = GameWorld.GetHightLadderMgr().GetPlayerVsRec(curVsPlayerID)  
 | 
        DelUselessRec(vsRec)  
 | 
          
 | 
        VsPlayer = GameWorld.GetPlayerManager().FindPlayerByID(curVsPlayerID)  
 | 
        if VsPlayer:  
 | 
            VsPlayer.Sync_HighLadderPlayerVsRec()  
 | 
              
 | 
    GameWorld.DebugLog("HighLadder### OnMGHighLadderChallenge AddPlayerVsRec OK")    
 | 
      
 | 
    #ÔÙͬ²½Êý¾Ý  
 | 
    if result:    #»ñʤ£¬ÐèÒªÌæ»»Î»Ö㬸üÐÂÊý¾Ý  
 | 
        newOrder = curPackData.VSOrder  
 | 
        WinMsgDict = ReadChConfig.GetEvalChConfig("HighLadderWinMsg")  
 | 
        winMsg = WinMsgDict.get(newOrder, "")  
 | 
        if myOrder > GetHighLadderCfg(Def_MinOrder): #ÅÅÃûÖ®Íâ½øÈëÅÅÃû  
 | 
            GameWorld.GetHightLadderMgr().DelPlayerDataByOrder(newOrder)  
 | 
            GameWorld.GetHightLadderMgr().AddPlayerData(myPlayerID, newOrder)  
 | 
            if winMsg != "":  
 | 
                PlayerControl.WorldNotify(0, winMsg, [curPlayer.GetName(), "%s"%(newOrder+1)])  
 | 
        else:  
 | 
            if curVsPlayerID: #½»»»Íæ¼ÒλÖà  
 | 
                if newOrder < myOrder:  
 | 
                    GameWorld.GetHightLadderMgr().ExchangePlayerOrder(myPlayerID, curVsPlayerID)  
 | 
                    if winMsg != "":  
 | 
                        PlayerControl.WorldNotify(0, winMsg, [curPlayer.GetName(), "%s"%(newOrder+1)])  
 | 
            else:    #Õ¼¾ÝNPCλÖà  
 | 
                if newOrder < myOrder:  
 | 
                    GameWorld.GetHightLadderMgr().AddPlayerData(myPlayerID, newOrder)  
 | 
                    if winMsg != "":  
 | 
                        PlayerControl.WorldNotify(0, winMsg, [curPlayer.GetName(), "%s"%(newOrder+1)])  
 | 
        #¸üÐÂÍæ¼ÒÊý¾Ý  
 | 
        UpdataHightLadderPlayer(myPlayerID, curPackData)  
 | 
    else:  
 | 
        #ʧ°Ü£¬¸üÐÂ×ÔÉíÕ½¶·ÊôÐÔ£¬ÆäÓ಻±ä  
 | 
        if myOrder > GetHighLadderCfg(Def_MinOrder): #ÅÅÃûÖ®Íâδ»ñʤ²»ÄܽøÈë½øÈëÅÅÃû  
 | 
            GameWorld.DebugLog("HighLadder### OnMGHighLadderChallenge out Result 0")  
 | 
            return  
 | 
        #¸üÐÂÍæ¼ÒÊý¾Ý  
 | 
        UpdataHightLadderPlayer(myPlayerID, curPackData)  
 | 
    GameWorld.DebugLog("HighLadder### OnMGHighLadderChallenge out Result %s"%result)  
 | 
  
 | 
    return  
 | 
  
 | 
  
 | 
## É¾³ý¶àÓàÌõÊý  
 | 
#  @param   
 | 
#  @return None  
 | 
def DelUselessRec(myRec):  
 | 
    if not myRec:  
 | 
        return  
 | 
      
 | 
    delcnt = max(myRec.RecCount() - GetHighLadderCfg(Def_Rec_Count), 0)  
 | 
    for i in range(delcnt):  
 | 
        myRec.DelRec(0)  
 | 
  
 | 
    return  
 | 
  
 | 
  
 | 
##¸ù¾ÝÌôÕ½´ÎÊý»ñÈ¡½±ÀøÎïÆ·  
 | 
#  @param playerFightCnt Íæ¼ÒÒÑÌôÕ½´ÎÊý  
 | 
#  @return None  
 | 
def __GetFightCntAwardItemList(playerFightCnt):  
 | 
    fightCntAwardDict = ReadChConfig.GetEvalChConfig("HighLadderFightCntAward")  
 | 
    fightCntList = fightCntAwardDict.keys()  
 | 
    fightCntList.sort()  
 | 
      
 | 
    for fCnt in fightCntList:  
 | 
          
 | 
        if playerFightCnt <= fCnt:  
 | 
            happenRate, awardItemList = fightCntAwardDict[fCnt]  
 | 
            if GameWorld.CanHappen(happenRate):  
 | 
                return awardItemList  
 | 
              
 | 
            return []  
 | 
          
 | 
    return []  
 | 
  
 | 
##¸üÐÂÍæ¼ÒÊý¾Ý  
 | 
#  @param curPlayerID, infoPack  
 | 
#  @return None  
 | 
def UpdataHightLadderPlayer(curPlayerID, infoPack):  
 | 
    curHightLadderPlayer = GameWorld.GetHightLadderMgr().FindPlayerData(curPlayerID)  
 | 
    #¸üÐÂÍæ¼ÒÊý¾Ý  
 | 
    curHightLadderPlayer.SetPlayerName(infoPack.PlayerName)   
 | 
    curHightLadderPlayer.SetPlayerLV(infoPack.PlayerLV)         
 | 
    curHightLadderPlayer.SetFightPower(infoPack.FightPower)   
 | 
    curHightLadderPlayer.SetFightPropertyData(infoPack.FightPropertyData, infoPack.FightPropertyDataLen)  
 | 
      
 | 
    #¸üÐÂÍæ¼Ò×°±¸Êý¾Ý  
 | 
    curHightLadderPlayer.ClearPlayerEquipt()   
 | 
    GameWorld.DebugLog("HighLadder### UpdataHightLadderPlayer EquipCount %s"%infoPack.EquipCount)  
 | 
    for i in xrange(infoPack.EquipCount):  
 | 
        curEquipInfo = infoPack.EquipList[i]  
 | 
        curEquipData = IPY_GameServer.IpyHighLadderPlayerItem()  
 | 
        curEquipData.ItemID = curEquipInfo.ItemTypeID  
 | 
        curEquipData.ItemPlaceType = curEquipInfo.ItemPlaceType  
 | 
        curEquipData.ItemPlaceIndex = curEquipInfo.ItemPlaceIndex  
 | 
        curEquipData.Count = curEquipInfo.Count  
 | 
        curEquipData.ItemStarLV = curEquipInfo.ItemStarLV  
 | 
        curEquipData.IdentifyPar = curEquipInfo.IdentifyPar  
 | 
        curEquipData.CurDurg = curEquipInfo.CurDurg  
 | 
        curEquipData.MaxDurg = curEquipInfo.MaxDurg  
 | 
        curEquipData.CanPlaceStoneCount = curEquipInfo.CanPlaceStoneCount  
 | 
        curEquipData.ItemProperty = curEquipInfo.ItemProperty  
 | 
        curEquipData.SoulProperty = curEquipInfo.SoulProperty  
 | 
        curEquipData.Maker = curEquipInfo.Maker  
 | 
        curEquipData.MakerName = curEquipInfo.MakerName  
 | 
        curEquipData.Stone1 = curEquipInfo.Stone1  
 | 
        curEquipData.Stone2 = curEquipInfo.Stone2  
 | 
        curEquipData.Stone3 = curEquipInfo.Stone3  
 | 
        curEquipData.Stone4 = curEquipInfo.Stone4  
 | 
        curEquipData.Stone5 = curEquipInfo.Stone5  
 | 
        curEquipData.Stone6 = curEquipInfo.Stone6  
 | 
        curEquipData.Stone7 = curEquipInfo.Stone7  
 | 
        curEquipData.Stone8 = curEquipInfo.Stone8  
 | 
        curEquipData.Stone9 = curEquipInfo.Stone9  
 | 
#        curEquipData.IsRenZhu = curEquipInfo.IsRenZhu  
 | 
        curEquipData.EquipDefenseValue = curEquipInfo.EquipDefenseValue  
 | 
        curEquipData.EquipMinAtkValue = curEquipInfo.EquipMinAtkValue  
 | 
        curEquipData.EquipMaxAtkValue = curEquipInfo.EquipMaxAtkValue  
 | 
        curEquipData.UserData = curEquipInfo.UserData  
 | 
        curEquipData.FitLV = curEquipInfo.FitLV  
 | 
        curEquipData.Proficiency = curEquipInfo.Proficiency  
 | 
        curEquipData.IsSuite = curEquipInfo.IsSuite  
 | 
        curEquipData.BaseHP = curEquipInfo.BaseHP  
 | 
        curEquipData.BaseMagicDef = curEquipInfo.BaseMagicDef  
 | 
        curEquipData.MaxAddSkillCnt = curEquipInfo.MaxAddSkillCnt  
 | 
#        curEquipData.PetID = curEquipInfo.PetID  
 | 
        curEquipData.EquipMagicDefValue = curEquipInfo.EquipMagicDefValue  
 | 
        curEquipData.EquipMinMagicAtkValue = curEquipInfo.EquipMinMagicAtkValue  
 | 
        curEquipData.EquipMaxMagicAtkValue = curEquipInfo.EquipMaxMagicAtkValue  
 | 
        curHightLadderPlayer.AddEquipIpyData(curEquipData)  
 | 
  
 | 
    #curHightLadderPlayer.DumpEquipData()  
 | 
          
 | 
    return  
 | 
  
 | 
##»ñȡָ¶¨Íæ¼ÒµÄÕ½¶·ÊôÐÔ  
 | 
#  @param orderIndex  
 | 
#  @return None  
 | 
def GetFightPropertyDictByOrder(orderIndex):  
 | 
    curVsFightPropertyDict = {}  
 | 
    curVsPlayer = GameWorld.GetHightLadderMgr().FindPlayerDataByOrder(orderIndex)  
 | 
    if not curVsPlayer:  
 | 
        curVsFightPropertyDict = GetNPCFightPropertyByOrder(orderIndex)  
 | 
    else:  
 | 
        curVsFightPropertyDict = eval(curVsPlayer.GetFightPropertyData())  
 | 
        curVsFightPropertyDict["FightPower"] = curVsPlayer.GetFightPower()  
 | 
    return curVsFightPropertyDict  
 | 
  
 | 
##»ñȡָ¶¨ÅÅλNPCµÄÕ½¶·ÊôÐÔ  
 | 
#  @param order  
 | 
#  @return None  
 | 
def GetNPCFightPropertyByOrder(order):  
 | 
    HighLadderNPCPropertyDict = ReadChConfig.GetEvalChConfig("HighLadderNPCProperty")  
 | 
    curPropertyDict = {}  
 | 
    curPropertyDict["Atk"] = eval(HighLadderNPCPropertyDict["Atk"])  
 | 
    curPropertyDict["Def"] = eval(HighLadderNPCPropertyDict["Def"])  
 | 
    curPropertyDict["MaxHP"] = eval(HighLadderNPCPropertyDict["MaxHP"])  
 | 
    curPropertyDict["Hit"] = eval(HighLadderNPCPropertyDict["Hit"])  
 | 
    curPropertyDict["Miss"] = eval(HighLadderNPCPropertyDict["Miss"])  
 | 
    curPropertyDict["AtkSpeed"] = eval(HighLadderNPCPropertyDict["AtkSpeed"])  
 | 
    curPropertyDict["GreatHitRate"] = eval(HighLadderNPCPropertyDict["GreatHitRate"])  
 | 
    curPropertyDict["GreatHit"] = eval(HighLadderNPCPropertyDict["GreatHitRate"])  
 | 
    curPropertyDict["LuckyHitRate"] = eval(HighLadderNPCPropertyDict["LuckyHitRate"])  
 | 
    curPropertyDict["LuckyHit"] = eval(HighLadderNPCPropertyDict["LuckyHit"])  
 | 
    curPropertyDict["SuperHitRate"] = eval(HighLadderNPCPropertyDict["SuperHitRate"])  
 | 
    curPropertyDict["SuperHit"] = eval(HighLadderNPCPropertyDict["SuperHit"])  
 | 
    curPropertyDict["IgnoreDefRate"] = eval(HighLadderNPCPropertyDict["IgnoreDefRate"])  
 | 
    curPropertyDict["DamageReduceRate"] = eval(HighLadderNPCPropertyDict["DamageReduceRate"])  
 | 
    curPropertyDict["FightPower"] = eval(HighLadderNPCPropertyDict["FightPower"])  
 | 
    return curPropertyDict  
 | 
  
 | 
##Ö´ÐжÔÕ½ »ñÈ¡½á¹û  
 | 
#  @param curFightPropertyDict, curVsFightPropertyDict  
 | 
#  @return None  
 | 
def DoFight(curFightPropertyDict, curVsFightPropertyDict):  
 | 
    #Õ½¶·¹«Ê½¼ÆËã  
 | 
    HighLadderFightFormula = ReadChConfig.GetChConfig("HighLadderFightFormula")  
 | 
  
 | 
    Atk = curFightPropertyDict["Atk"]  
 | 
    Def = curFightPropertyDict["Def"]  
 | 
    MaxHP = curFightPropertyDict["MaxHP"]  
 | 
    Hit = curFightPropertyDict["Hit"]  
 | 
    Miss = curFightPropertyDict["Miss"]  
 | 
    AtkSpeed = curFightPropertyDict["AtkSpeed"]  
 | 
    GreatHitRate = curFightPropertyDict["GreatHitRate"]  
 | 
    GreatHit = curFightPropertyDict["GreatHit"]  
 | 
    LuckyHitRate = curFightPropertyDict["LuckyHitRate"]  
 | 
    LuckyHit = curFightPropertyDict["LuckyHit"]  
 | 
    SuperHitRate = curFightPropertyDict["SuperHitRate"]  
 | 
    SuperHit = curFightPropertyDict["SuperHit"]  
 | 
    IgnoreDefRate = curFightPropertyDict["IgnoreDefRate"]  
 | 
    DamageReduceRate = curFightPropertyDict["DamageReduceRate"]  
 | 
    FightPower = curFightPropertyDict["FightPower"]  
 | 
    RandomRate = random.randint(0, 10000)  
 | 
      
 | 
    VS_Atk = curVsFightPropertyDict["Atk"]  
 | 
    VS_Def = curVsFightPropertyDict["Def"]  
 | 
    VS_MaxHP = curVsFightPropertyDict["MaxHP"]  
 | 
    VS_Hit = curVsFightPropertyDict["Hit"]  
 | 
    VS_Miss = curVsFightPropertyDict["Miss"]  
 | 
    VS_AtkSpeed = curVsFightPropertyDict["AtkSpeed"]  
 | 
    VS_GreatHitRate = curVsFightPropertyDict["GreatHitRate"]  
 | 
    VS_GreatHit = curVsFightPropertyDict["GreatHit"]  
 | 
    VS_LuckyHitRate = curVsFightPropertyDict["LuckyHitRate"]  
 | 
    VS_LuckyHit = curVsFightPropertyDict["LuckyHit"]  
 | 
    VS_SuperHitRate = curVsFightPropertyDict["SuperHitRate"]  
 | 
    VS_SuperHit = curVsFightPropertyDict["SuperHit"]  
 | 
    VS_IgnoreDefRate = curVsFightPropertyDict["IgnoreDefRate"]  
 | 
    VS_DamageReduceRate = curVsFightPropertyDict["DamageReduceRate"]  
 | 
    VS_FightPower = curVsFightPropertyDict["FightPower"]  
 | 
    VS_RandomRate = random.randint(0, 10000)  
 | 
    return bool(eval(HighLadderFightFormula))  
 | 
  
 | 
###FightPropertyData¸½´øÊôÐÔ  
 | 
#  Íæ¼ÒÖ°Òµ  
 | 
#  ¹¥»÷  
 | 
#  ·ÀÓù  
 | 
#  ÉúÃü  
 | 
#  ÃüÖÐ  
 | 
#  ÉÁ±Ü  
 | 
#  ¹¥ËÙ  
 | 
#  ×¿Ô½Ò»»÷ ±¶ÂÊ  
 | 
#  ÐÒÔËÒ»»÷ ±¶ÂÊ  
 | 
#  ±©»÷     ±¶ÂÊ  
 | 
#  ÎÞÊÓ·ÀÓù   
 | 
###  
 | 
  
 | 
## ¹ýÌì´¦Àí  
 | 
#  @param None  
 | 
#  @return None  
 | 
def OnDay():  
 | 
    #¸üÐÂÅÅÐаñ  
 | 
    RefreshBillboard()  
 | 
#    #¸üоº¼¼³¡×òÈÕÅÅÐаñ  
 | 
#    PlayerBillboard.CopyBillboard(ShareDefine.Def_BT_HighLadder_Yester, ShareDefine.Def_BT_HighLadder)  
 | 
    return  
 | 
  
 | 
## Ã¿Ð¡Ê±´¦Àí  
 | 
#  @param None  
 | 
#  @return None  
 | 
def OnHour():  
 | 
    #¸üÐÂÅÅÐаñ  
 | 
    RefreshBillboard()  
 | 
    return  
 | 
  
 | 
## Ë¢ÐÂÅÅÐаñ  
 | 
#  @param None  
 | 
#  @return None  
 | 
def RefreshBillboard():  
 | 
    billboardType = ShareDefine.Def_BT_HighLadder  
 | 
    PlayerBillboard.ClearBillboardByIndex(billboardType)  
 | 
    billboardMgr = GameWorld.GetBillboard()  
 | 
    billBoard = billboardMgr.FindBillboard(billboardType)  
 | 
    highLadderMgr = GameWorld.GetHightLadderMgr()  
 | 
    minOrder = GetHighLadderCfg(Def_MinOrder)  
 | 
    for Order in xrange(minOrder):  
 | 
        playerData = highLadderMgr.FindPlayerDataByOrder(Order)  
 | 
        if not playerData:  
 | 
            #playerID = Order + 1   #Íæ¼ÒIDÊÇ´Ó10000£¬¿ªÊ¼Ð¡ÓÚ10000µÄ¶¼²»ÊÇÍæ¼Ò£¬Ö»ÊÇռλNPC  
 | 
            continue  
 | 
        playerID = playerData.GetPlayerID()  
 | 
        billBoardData = billBoard.AddToBillboard(playerID)  
 | 
        billBoardData.SetType(billboardType)  
 | 
        #¸½ÊôÀàÐÍ  
 | 
        billBoardData.SetID(playerID)  
 | 
        billBoardData.SetID2(playerID)  
 | 
        billBoardData.SetName1(playerData.GetPlayerName())  
 | 
        curFightPropertyDict = eval(playerData.GetFightPropertyData())  
 | 
        billBoardData.SetName2(str(curFightPropertyDict.get("OperateInfo", 0)))  
 | 
        #SetValue1´æ´¢¿Õ¼äΪWord  
 | 
        billBoardData.SetValue1(Order + 1)  #ÓÃÓÚÏÔʾµÄÅÅÃû ÐèÒª+1  
 | 
        #SetValue2´æ´¢¿Õ¼äΪDWord  
 | 
        billBoardData.SetValue2(playerData.GetFightPower())  
 | 
        #±È½ÏÓõÄÖµ  
 | 
        billBoardData.SetCmpValue(max(0, minOrder - Order + 1))          
 | 
    billBoard.Sort()     
 | 
    return  
 | 
  
 | 
  
 | 
## µØÍ¼²éѯ½±Àø  
 | 
#  @param curPlayer, msgList  
 | 
#  @return None  
 | 
def MapServer_HighLadderReward(curPlayer, msgList):    
 | 
    PlayerID = msgList[0]    
 | 
    queryType = msgList[1]  #0 ²éѯ  1 ÁìÈ¡  
 | 
    hadGot = msgList[2]    #ÊÇ·ñÒѾÁìÈ¡  
 | 
    billboardMgr = GameWorld.GetBillboard()  
 | 
    billBoardYester = billboardMgr.FindBillboard(ShareDefine.Def_BT_HighLadder_Yester)  
 | 
    highLadderMgr = GameWorld.GetHightLadderMgr()  
 | 
      
 | 
    order = GetPlayerOrder(PlayerID) #Íæ¼Òµ±Ç°ÅÅÃû  
 | 
      
 | 
    if billBoardYester:#Èç¹ûÓÐ×òÈÕÅÅÐУ¬ÔòÈ¡×òÈÕÅÅÐÐ  
 | 
        billBoardData = billBoardYester.FindByID(PlayerID)  
 | 
        if billBoardData:  
 | 
            order = billBoardData.GetValue1() - 1#ÓÃÓÚÅÅÐò£¬°ÑÏÔʾÓõÄÅÅÃûÖµ -1  
 | 
        else:  
 | 
            order = GetHighLadderCfg(Def_StartOrder)  
 | 
          
 | 
    if queryType == 0:#²éѯ Ö±½ÓÍ¨ÖªÍæ¼Ò  
 | 
          
 | 
        sendPack = ChPyNetSendPack.tagGCHighLadderRewardInfo()  
 | 
        sendPack.hadGot = hadGot  
 | 
        sendPack.Order = order  
 | 
        if curPlayer:  
 | 
            NetPackCommon.SendFakePack(curPlayer, sendPack)  
 | 
        return False, "%s"%[PlayerID, hadGot, order]  
 | 
    else:            #Áì½± ÐèҪ֪ͨµ½µØÍ¼  
 | 
        return  True, "%s"%[PlayerID, hadGot, order]  
 | 
  
 | 
  
 | 
  
 |