#!/usr/bin/python  
 | 
# -*- coding: GBK -*-  
 | 
#-------------------------------------------------------------------------------  
 | 
#  
 | 
##@package Player.PlayerCrossYaomoBoss  
 | 
#  
 | 
# @todo:¿ç·þÑýħboss  
 | 
# @author hxp  
 | 
# @date 2022-11-11  
 | 
# @version 1.0  
 | 
#  
 | 
# ÏêϸÃèÊö: ¿ç·þÑýħboss  
 | 
#  
 | 
#-------------------------------------------------------------------------------  
 | 
#"""Version = 2022-11-11 15:30"""  
 | 
#-------------------------------------------------------------------------------  
 | 
  
 | 
import GameWorld  
 | 
import NPCHurtMgr  
 | 
import PlayerControl  
 | 
import IpyGameDataPY  
 | 
import ItemControler  
 | 
import IPY_GameWorld  
 | 
import ShareDefine  
 | 
import ItemCommon  
 | 
import ChConfig  
 | 
import PlayerGubao  
 | 
  
 | 
def OnYaomoBossStateChange(state, tick):  
 | 
    ## »î¶¯×´Ì¬±ä¸ü  
 | 
    if state:  
 | 
        # ¿ªÊ¼µÄ²»ÐèÒª´¦Àí  
 | 
        return  
 | 
    return  
 | 
  
 | 
def OnCrossYaomoBossDead(curNPC):  
 | 
      
 | 
    objID = curNPC.GetID()  
 | 
    npcID = curNPC.GetNPCID()  
 | 
    mapID = GameWorld.GetGameWorld().GetMapID()  
 | 
    lineID = GameWorld.GetGameWorld().GetLineID()  
 | 
    realMapID = GameWorld.GetGameWorld().GetRealMapID()  
 | 
    copyMapID = GameWorld.GetGameWorld().GetCopyMapID()  
 | 
      
 | 
    zoneID = 0  
 | 
    zoneTypeName = ChConfig.Def_CrossZoneMapTableName.get(mapID)  
 | 
    ipyDataMgr = IpyGameDataPY.IPY_Data()  
 | 
    if zoneTypeName and hasattr(ipyDataMgr, "Get%sCount" % zoneTypeName):  
 | 
        for index in range(getattr(ipyDataMgr, "Get%sCount" % zoneTypeName)()):  
 | 
            ipyData = getattr(ipyDataMgr, "Get%sByIndex" % zoneTypeName)(index)  
 | 
            if realMapID == ipyData.GetMapID() and copyMapID == ipyData.GetCopyMapID():  
 | 
                zoneID = ipyData.GetZoneID()  
 | 
                break  
 | 
              
 | 
    npcHurtList = NPCHurtMgr.GetPlayerHurtList(curNPC)  
 | 
    if not npcHurtList or not npcHurtList.GetHurtCount():  
 | 
        GameWorld.ErrLog("¿ç·þÑýħboss½áËãÎÞÉ˺¦Áбí: mapID=%s,lineID=%s,realMapID=%s,copyMapID=%s,zoneID=%s,npcID=%s,objID=%s"   
 | 
                         % (mapID, lineID, realMapID, copyMapID, zoneID, npcID, objID))  
 | 
        return  
 | 
      
 | 
    GameWorld.Log("¿ç·þÑýħbossÉ˺¦½áËã: mapID=%s,lineID=%s,realMapID=%s,copyMapID=%s,zoneID=%s,npcID=%s,objID=%s"   
 | 
                  % (mapID, lineID, realMapID, copyMapID, zoneID, npcID, objID))  
 | 
    npcHurtList.Sort()  #sortÒÔºóÉËѪÁбí´Ó´óµ½Ð¡ÅÅÐò  
 | 
      
 | 
    rank = 0  
 | 
    playerHurtList = []  
 | 
    for index in xrange(npcHurtList.GetHurtCount()):  
 | 
        #»ñµÃÉËѪ¶ÔÏó  
 | 
        hurtObj = npcHurtList.GetHurtAt(index)  
 | 
        hurtType = hurtObj.GetValueType()  
 | 
        hurtID = hurtObj.GetValueID()  
 | 
        hurtValue = hurtObj.GetHurtValue()  
 | 
        hurtName = hurtObj.GetHurtName()  
 | 
        if hurtType != ChConfig.Def_NPCHurtTypePlayer or not hurtID:  
 | 
            continue  
 | 
        rank += 1  
 | 
        playerID = hurtID  
 | 
        GameWorld.Log("    zoneID=%s,rank=%s,playerID=%s,hurtValue=%s" % (zoneID, rank, playerID, hurtValue))  
 | 
        playerHurtList.append([playerID, hurtValue, hurtName])  
 | 
          
 | 
    msgInfo = str([zoneID, npcID, playerHurtList])  
 | 
    GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, "CrossYaomoBossHurtInfo", msgInfo, len(msgInfo))  
 | 
    return  
 | 
  
 | 
def GetCrossYaomoBossHurtAward(curPlayer, awardIndex, tick):  
 | 
      
 | 
    playerID = curPlayer.GetPlayerID()  
 | 
    if not ItemCommon.CheckPackHasSpace(curPlayer, IPY_GameWorld.rptItem, True):  
 | 
        return  
 | 
      
 | 
    if not GameWorld.SetPlayerTickTime(curPlayer, ChConfig.TYPE_Player_Tick_CrossYaomoBoss, tick):  
 | 
        PlayerControl.NotifyCode(curPlayer, "RequestLater")  
 | 
        return  
 | 
      
 | 
    # ·¢ËÍ¿ç·þ·þÎñÆ÷  
 | 
    dataMsg = {"playerID":playerID, "awardIndex":awardIndex}  
 | 
    GameWorld.SendMsgToCrossServer(ShareDefine.ClientServerMsg_CrossYaomoBossHurtAward, dataMsg)  
 | 
    return  
 | 
  
 | 
def GameServer_CrossYaomoBoss_DoResult(curPlayer, msgData):  
 | 
    msgType, dataMsg = msgData[:2]  
 | 
    #ret = msgData[2] if len(msgData) > 2 else None  
 | 
      
 | 
    ## É˺¦Ä¿±ê½±Àø   
 | 
    if msgType == "HurtValueAward":  
 | 
        __DoGiveCrossYaomoBossHurtAward(curPlayer, dataMsg)  
 | 
          
 | 
    ## ²ÎÓë»÷ɱÑýħboss  
 | 
    if msgType == "KillYaomoBoss":  
 | 
        PlayerGubao.AddGubaoItemEffValue(curPlayer, PlayerGubao.GubaoEffType_CrossYaomoBoss, 1)  
 | 
          
 | 
    return  
 | 
  
 | 
def __DoGiveCrossYaomoBossHurtAward(curPlayer, dataMsg):  
 | 
    playerID = curPlayer.GetPlayerID()  
 | 
    awardIndex, awardItemList = dataMsg  
 | 
    GameWorld.Log("¸øÍæ¼Ò¿ç·þÑýħbossÉ˺¦Ä¿±ê½±Àø: awardIndex=%s,awardItemList=%s" % (awardIndex, awardItemList), playerID)  
 | 
    ItemControler.GivePlayerItemOrMail(curPlayer, awardItemList, event=["CrossYaomoBoss", False, {}])  
 | 
    return  
 |