ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
@@ -52,6 +52,7 @@
import PlayerMagicWeapon
import PlayerBossReborn
import PlayerFairyCeremony
import FamilyRobBoss
import IpyGameDataPY
import PyGameData
import PlayerTeam
@@ -71,9 +72,10 @@
NPCAttr_ParamDict, # 过程参数公式
NPCAttr_AttrStrengthenList, # 等级成长属性公式
NPCAttr_PlayerCntCoefficient, # 地图人数对应属性额外成长系数 {mapID:{"属性名":{组队进入人数:系数, ...}, ...}, ...}
NPCAttr_NPCPlayerCntCoefficient, # NPC特殊成长人数对应属性额外成长系数 {npcID:{"属性名":{人数:系数, ...}, ...}, ...}, 优先级大于地图人数系数
NPCAttr_DynNPCLVMap, # 动态等级的地图ID列表,默认已刷新出来的NPC等级不会再变更,下次刷出来的怪物等级变更 [地图ID, ...]
NPCAttr_DynPCCoefficientMap, # 动态人数系数的地图ID {地图ID:是否马上刷新属性, ...}
) = range(5)
) = range(6)
#---------------------------------------------------------------------
##NPC初始化->出生调用
@@ -139,11 +141,14 @@
    gameFB = GameWorld.GetGameFB()
    
    if strengthenIpyData.GetIsStrengthenByPlayerCount():
        strengthenPlayerCnt = gameFB.GetGameFBDictByKey(ChConfig.Def_FB_NPCStrengthenPlayerCnt)
        if not strengthenPlayerCnt:
            GameWorld.ErrLog("NPC配置了按玩家人数成长类型,但是无法获取到对应的玩家人数!npcID=%s" % (npcID))
            return
        if FamilyRobBoss.IsHorsePetRobBoss(npcID):
            strengthenPlayerCnt = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_HorsePetRobBossPlayerCount)
        else:
            strengthenPlayerCnt = gameFB.GetGameFBDictByKey(ChConfig.Def_FB_NPCStrengthenPlayerCnt)
            if not strengthenPlayerCnt:
                GameWorld.ErrLog("NPC配置了按玩家人数成长类型,但是无法获取到对应的玩家人数!npcID=%s" % (npcID))
                return
    lvStrengthenType = strengthenIpyData.GetLVStrengthenType()
    # 根据世界等级
    if lvStrengthenType == 3:
@@ -155,6 +160,9 @@
    elif lvStrengthenType == 1:
        strengthenLV = gameFB.GetGameFBDictByKey(ChConfig.Def_FB_NPCStrengthenAverageLV)
        
    if strengthenIpyData.GetCmpNPCBaseLV():
        strengthenLV = max(strengthenLV, curNPC.GetLV())
    if lvStrengthenType in [1, 2] and not strengthenLV:
        GameWorld.ErrLog("NPC配置了成长等级类型,但是无法获取到对应的成长等级值!npcID=%s,lvStrengthenType=%s" % (npcID, lvStrengthenType))
        return
@@ -218,6 +226,7 @@
    paramDict = attrStrengthenInfo[NPCAttr_ParamDict] # 过程参数公式字典
    attrStrengthenList = attrStrengthenInfo[NPCAttr_AttrStrengthenList] # 属性成长公式字典
    playerCntCoefficient = attrStrengthenInfo[NPCAttr_PlayerCntCoefficient] # 人数系数
    npcIDPlayerCntCoefficient = attrStrengthenInfo[NPCAttr_NPCPlayerCntCoefficient] # 特殊NPC人数系数
    baseMaxHP = npcData.GetHPEx() * ShareDefine.Def_PerPointValue + npcData.GetHP()
    
    if strengthenLV:
@@ -295,6 +304,8 @@
        playerCntAttrCoefficient = playerCntCoefficient.get(mapID, {})
        if not playerCntAttrCoefficient and dataMapID in playerCntCoefficient:
            playerCntAttrCoefficient = playerCntCoefficient[dataMapID]
        if npcID in npcIDPlayerCntCoefficient:
            playerCntAttrCoefficient = npcIDPlayerCntCoefficient[npcID]
        for attrKey, coefficientDict in playerCntAttrCoefficient.items():
            if attrKey in attrDict:
                attrValue = attrDict[attrKey]
@@ -1204,6 +1215,48 @@
        msgInfo = str([itemID, updKilledCnt])
        GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, "GlobalDropRate", msgInfo, len(msgInfo))
         
    # 4. 指定全服击杀次数必掉,算额外掉落
    globalKillDropDict = IpyGameDataPY.GetFuncEvalCfg("GlobalDropCD", 2) # {NPCID:{击杀次数:[是否本职业, [物品ID, ...], [随机物品ID, ...]]}, ...}
    if npcID in globalKillDropDict:
        killCountDropDict = globalKillDropDict[npcID]
        updNPCKilledCount = min(gw.GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_NPCKilledCount % npcID) + 1, ShareDefine.Def_UpperLimit_DWord)
        GameWorld.DebugLog("更新全服击杀次数: %s" % updNPCKilledCount)
        # 通知GameServer记录
        msgInfo = str([npcID, updNPCKilledCount])
        GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, "GlobalKillCount", msgInfo, len(msgInfo))
        if updNPCKilledCount in killCountDropDict:
            isJobLimit, itemIDList, randItemIDList = killCountDropDict[updNPCKilledCount]
            for itemID in itemIDList:
                if isJobLimit:
                    itemData = GameWorld.GetGameData().GetItemByTypeID(itemID)
                    if not itemData:
                        continue
                    itemJob = itemData.GetJobLimit() / 100
                    if itemJob and itemJob != curPlayer.GetJob():
                        # 非本职业可用,不掉落
                        GameWorld.DebugLog("全服击杀次数必掉,非本职业可用,不掉落! itemID=%s" % itemID)
                        continue
                dropItemIDList.append(itemID)
                GameWorld.DebugLog("全服击杀次数必掉物品: itemID=%s" % itemID)
            if randItemIDList:
                if isJobLimit:
                    randJobItemList = []
                    for rItemID in randItemIDList:
                        itemData = GameWorld.GetGameData().GetItemByTypeID(rItemID)
                        if not itemData:
                            continue
                        itemJob = itemData.GetJobLimit() / 100
                        if itemJob and itemJob != curPlayer.GetJob():
                            # 非本职业可用,不掉落
                            GameWorld.DebugLog("全服击杀次数必掉随机,非本职业可用,不掉落! rItemID=%s" % rItemID)
                            continue
                        randJobItemList.append(rItemID)
                    randItemID = random.choice(randJobItemList)
                else:
                    randItemID = random.choice(randItemIDList)
                dropItemIDList.append(randItemID)
                GameWorld.DebugLog("全服击杀次数必掉随机物品: randItemID=%s" % randItemID)
    return dropItemIDList
def __GetEquipIDList(npcID, classLV, color, placeList, star, itemJobList, tagPlace=None):
@@ -1946,11 +1999,15 @@
            #因为存在boss分流,所以用gameFB字典,但是存活状态还是用GameWorld字典
            GameWorld.GetGameFB().SetGameFBDict(ChConfig.Map_NPC_WorldBossDeadTick % npcid, GameWorld.GetGameWorld().GetTick())
        
            if GetDropOwnerType(curNPC) == ChConfig.DropOwnerType_Family:
                FamilyRobBoss.ClearFamilyOwnerBossHurt(curNPC)
        ChNPC.OnNPCSetDead(curNPC)
    
    # 清除队伍成员伤血列表
    AttackCommon.ClearTeamPlayerHurtValue(curNPC)
    # 清除自定义伤血列表
    BossHurtMng.ClearHurtValueList(curNPC)
    #BossHurtMng.ClearHurtValueList(curNPC)
    # C++设置npc死亡
    curNPC.SetDead(curNPC.GetDictByKey(ChConfig.Def_NPCDead_Reason),
@@ -1984,6 +2041,9 @@
        self.__Killer = None # 击杀者, 由各种规则得出, 一般也是物品归属的代表, 用于广播、记录等确保与归属一致
        self.__AllKillerDict = {} # 所有击杀的玩家ID对应字典, 非队伍, 一般也是归属的拥有者
        self.__FeelPlayerList = [] # 所有摸怪玩家列表,处理任务及某些逻辑用
        self.__OwnerHurtType = 0
        self.__OwnerHurtID = 0
        return
    #---------------------------------------------------------------------
    ## 移动到某一个点的附近点
@@ -2514,7 +2574,7 @@
            self.__AddAngryValue(npcAngry, curObjID, curObjType, plusAngryValue, canPile)
        
        #激活呆滞的NPC
        if curNPC.GetHP() > 0 and not curNPC.GetIsNeedProcess() :
        if GameObj.GetHP(curNPC) > 0 and not curNPC.GetIsNeedProcess() :
            curNPC.SetIsNeedProcess(True)
        
@@ -2829,6 +2889,7 @@
    
    def __GetTeamHurtNPCPlayerIDList(self, refreshPoint, teamID, tick):
        
        curNPC = self.__Instance
        teamHurtPlayerIDList = []
        # 如果没有在线队员在有效范围内,则进一步判断离线队员是否有伤血保护中的
        playerMgr = GameWorld.GetPlayerManager()
@@ -2849,7 +2910,8 @@
                        continue
                    
                #if curTeamPlayer.GetHP() > 0 and self.GetIsInRefreshPoint(curTeamPlayer.GetPosX(), curTeamPlayer.GetPosY(), refreshPoint):
                if self.GetIsInRefreshPoint(curTeamPlayer.GetPosX(), curTeamPlayer.GetPosY(), refreshPoint):
                if self.GetIsInRefreshPoint(curTeamPlayer.GetPosX(), curTeamPlayer.GetPosY(), refreshPoint) \
                    and AttackCommon.CheckKillNPCByCnt(curTeamPlayer, curNPC, False):
                    #GameWorld.DebugLog("有队员在boss范围内,保留队伍伤血!teamID=%s,playerID=%s" % (teamID, curTeamPlayer.GetPlayerID()))
                    teamHurtPlayerIDList.append(playerID)
            else:
@@ -3038,10 +3100,13 @@
        curNPC = self.__Instance
        #清除状态
        self.__ClearNPCAllState(False)
        #初始化召唤兽
        self.__InitNPCSummon()
        #重置技能CD
        self.__NormalNPCInItCD()
        #只在重生或者满血的状态下才重置以下内容
        if isReborn or GameObj.GetHP(curNPC) >= GameObj.GetMaxHP(curNPC):
            #初始化召唤兽
            self.__InitNPCSummon()
            #重置技能CD
            self.__NormalNPCInItCD()
        #重刷属性
        self.RefreshNPCState(isReborn=isReborn)
        #通知血量, 复活的情况不通知血量,由NPC出现包通知
@@ -3359,6 +3424,9 @@
                GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, 'GameWorldBossState',
                                                            '%s' % (msgList), len(str(msgList)))
                
                if GetDropOwnerType(curNPC) == ChConfig.DropOwnerType_Family:
                    FamilyRobBoss.FamilyOwnerBossOnReborn(curNPC)
        # 检查是否有光环, 在重生时处理,不然可能导致有些无战斗逻辑的怪物无法套上光环buff
        skillManager = curNPC.GetSkillManager()
        for index in xrange(skillManager.GetSkillCount()):
@@ -3736,7 +3804,7 @@
        #=====================================================================================================
        
        #boss伤血排行榜击杀逻辑
        BossHurtMng.BossOnKilled(curNPC)
        #BossHurtMng.BossOnKilled(curNPC)
        
        #掉落需要用到摸怪,所以在处理掉落奖励之前设置
        self.__SetFeelNPCPlayerList()
@@ -3752,6 +3820,8 @@
        # 记录boss击杀信息的NPC
        bossIpyData = IpyGameDataPY.GetIpyGameDataListNotLog('BOSSInfo', npcID)
        if bossIpyData:
            if GetDropOwnerType(curNPC) == ChConfig.DropOwnerType_Family:
                killerName = FamilyRobBoss.FamilyOwnerBossOnKilled(curNPC, self.__OwnerHurtID)
            #KillerJob = 0 if not self.__Killer else self.__Killer.GetJob()
            GameServer_KillGameWorldBoss(curNPC.GetNPCID(), killerName, 0)
        #===========================================================================================
@@ -4197,7 +4267,9 @@
        self.__MaxHurtPlayer = self.__FindBossMaxHurtObj() # py自定义伤血所得到的Boss最大伤血玩家
        
        self.__AllKillerDict, curTeam, hurtType, hurtID = self.__FindNPCKillerInfo()
        self.__OwnerHurtType, self.__OwnerHurtID = hurtType, hurtID
        isGameBoss = ChConfig.IsGameBoss(curNPC)
        #最后一击处理
        self.__DoLastTimeHurtLogic()
        
@@ -4227,9 +4299,19 @@
        elif curTeam != None:
            self.__KilledByTeamSetPrize(curTeam, hurtType, hurtID)
        
        else:
            GameWorld.ErrLog("NPC归属异常:npcID=%s,hurtType=%s,hurtID=%s" % (npcID, hurtType, hurtID))
        #被仙盟杀死
        elif hurtType == ChConfig.Def_NPCHurtTypeFamily:
            self.__KilledByFamilySetPrize(hurtType, hurtID)
            
        elif isGameBoss:
            GameWorld.ErrLog("NPC归属异常:npcID=%s,hurtType=%s,hurtID=%s" % (npcID, hurtType, hurtID))
        if isGameBoss:
            dataDict = {"objID":curNPC.GetID(), "bossID":npcID, "mapID":GameWorld.GetMap().GetMapID(),
                        "lineID":GameWorld.GetGameWorld().GetLineID(), "teamID":curTeam.GetTeamID() if curTeam else 0,
                            "killerID":self.__AllKillerDict.keys(), "hurtType":hurtType,"hurtID":hurtID}
            DataRecordPack.SendEventPack("KillBossRecord", dataDict)
        if OnNPCDie:
            OnNPCDie(curNPC, hurtType, hurtID)
        
@@ -4621,7 +4703,60 @@
        self.__NPCDropItem(dropPlayer, hurtType, hurtID, ownerPlayerList)
        #GameWorld.Log("队伍杀死怪物奖励,逻辑成功结束")
        return
    def __KilledByFamilySetPrize(self, hurtType, hurtID):
        ## 仙盟杀死NPC奖励逻辑
        curNPC = self.__Instance
        maxLV = 0
        dropPlayer = None
        ownerPlayerList = []
        refreshPoint = curNPC.GetRefreshPosAt(curNPC.GetCurRefreshPointIndex())
        copyPlayerMgr = GameWorld.GetMapCopyPlayerManager()
        for index in xrange(copyPlayerMgr.GetPlayerCount()):
            player = copyPlayerMgr.GetPlayerByIndex(index)
            if not player:
                continue
            if player.GetFamilyID() != hurtID or not self.GetIsInRefreshPoint(player.GetPosX(), player.GetPosY(), refreshPoint):
                continue
            curPlayerLV = player.GetLV()
            if maxLV < curPlayerLV:
                maxLV = curPlayerLV
                dropPlayer = player
            ownerPlayerList.append(player)
        if not ownerPlayerList:
            GameWorld.Log("奖励归属仙盟,但是不存在可获得该奖励的成员!npcID=%s,hurtType=%s,hurtID=%s"
                          % (curNPC.GetNPCID(), hurtType, hurtID))
        # 因为仙盟归属boss归属伤血第一的仙盟,仙盟伤血有保护,可能存在伤血第一仙盟在boss死亡的时候都不在
        # 此时掉落计算玩家算最后一击玩家,归属还是算伤血第一仙盟的
        if not dropPlayer:
            dropPlayer = self.__LastHurtPlayer
        if not dropPlayer:
            GameWorld.ErrLog("奖励归属仙盟,找不到掉落玩家!npcID=%s,hurtType=%s,hurtID=%s"
                             % (curNPC.GetNPCID(), hurtType, hurtID))
            return
        # 赶时间,先简单处理直接取最大等级的,之后可按实际情况来
        if not self.__LastHurtPlayer:
            self.__LastHurtPlayer = dropPlayer
        if not self.__MaxHurtPlayer:
            self.__MaxHurtPlayer = dropPlayer
        if not self.__Killer:
            self.__Killer = dropPlayer
        maxHurtID = dropPlayer.GetPlayerID()
        for curPlayer in ownerPlayerList:
            self.__KillNPCFuncEx(curPlayer, curNPC, maxHurtID, False)
        #调用物品掉落
        self.__NPCDropItem(dropPlayer, hurtType, hurtID, ownerPlayerList)
        return
    ## 队伍或自己击杀NPC扩展功能
    #  @param curPlayer
    #  @return None
@@ -4638,7 +4773,10 @@
            #掉落归属
            if mapFBType != IPY_GameWorld.fbtNull:
                FBLogic.DoFB_DropOwner(curPlayer , curNPC)
            else:
                if curNPC.GetLV()>=curPlayer.GetLV() - IpyGameDataPY.GetFuncCfg('DailyQuestKillMonster'):
                    PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_KillNPC)
            killBossCntLimitDict = IpyGameDataPY.GetFuncCfg('KillBossCntLimit', 1)
            limitIndex = GameWorld.GetDictValueByKey(killBossCntLimitDict, npcID)
            if limitIndex != None:
@@ -4652,7 +4790,6 @@
                dataDict = {"objID":curNPC.GetID(), "bossID":npcID, "touchCnt":newCnt,
                            "AccID":curPlayer.GetAccID(), "PlayerID":curPlayer.GetPlayerID()}
                DataRecordPack.SendEventPack("AddKillBossCnt", dataDict, curPlayer)
                if limitIndex == 0:
                    # 世界BOSS击杀成就
                    PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_KillWorldBoss, 1)
@@ -4667,8 +4804,8 @@
                    PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_BOSSHome)
                    PlayerBossReborn.AddBossRebornActionCnt(curPlayer, ChConfig.Def_BRAct_BOSSHome, 1)
                    PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_BossHome, 1)
            #击杀特定NPC成就
            PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_KillSpecificNPC, 1, [npcID])
        return
        
    #---------------------------------------------------------------------
@@ -4690,10 +4827,10 @@
        #不是普通NPC    
        elif npcObjType != IPY_GameWorld.gnotNormal:
            return
        npcID = curNPC.GetNPCID()
        #GameWorld.DebugLog("__MissionOnKillNPC isFeel=%s" % (isFeel), curPlayer.GetPlayerID())
        killBossCntLimitDict = IpyGameDataPY.GetFuncCfg('KillBossCntLimit', 1)
        limitIndex = GameWorld.GetDictValueByKey(killBossCntLimitDict, curNPC.GetNPCID())
        limitIndex = GameWorld.GetDictValueByKey(killBossCntLimitDict, npcID)
        isWorldBoos = limitIndex == 0
        if isFeel:
            #击杀NPC触发摸怪任务事件
@@ -4705,7 +4842,8 @@
            EventShell.EventRespons_OnKillById(curPlayer, curNPC)
            if isWorldBoos:
                EventShell.EventRespons_KillWorldBoss(curPlayer)
        #击杀特定NPC成就
        PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_KillSpecificNPC, 1, [npcID])
        return
        
    def __GetIsLog(self):
@@ -4875,7 +5013,7 @@
    return max(value / pow(10, nlen), 1)
Def_CollNPCCfg_Len = 9
Def_CollNPCCfg_Len = 10
(
Def_CollNPCCfg_CanTogether, # 是否允许同时采集
Def_CollNPCCfg_SysMsgMark, # 不可同时采集提示
@@ -4886,6 +5024,7 @@
Def_CollNPCCfg_ZhenQi, # 获得的真气/魔魂
Def_CollNPCCfg_GiveItemModeID, # 获得的物品信息模板编号
Def_CollNPCCfg_NotCostItemNotify, # 消耗品不足提示
Def_CollNPCCfg_LimitSysMsgMark, #采集上限提示
) = range(Def_CollNPCCfg_Len)
@@ -4960,7 +5099,8 @@
        GameWorld.DebugLog("    maxTime=%s,todayTime=%s" % (limitMaxTime, todayCollTime))
        
    if limitMaxTime > 0 and todayCollTime >= limitMaxTime:
        PlayerControl.NotifyCode(curPlayer, "GeRen_liubo_807125")
        PlayerControl.NotifyCode(curPlayer, collectNPCInfo[Def_CollNPCCfg_LimitSysMsgMark], [limitMaxTime])
        return True
    
    # 采集消耗
@@ -5000,7 +5140,7 @@
    PlayerControl.Sync_PrepareBegin(curPlayer, prepareTime, IPY_GameWorld.pstMissionCollecting, \
                                    prepareID=curNPC.GetID())
    FBLogic.OnBeginCollect(curPlayer, curNPC)
    ##添加这个NPC的伤血列表,用于判断可否同时采集,改为字典判断
    AttackCommon.AddHurtValue(curNPC, curPlayer.GetPlayerID(), ChConfig.Def_NPCHurtTypePlayer, 1)
    return
@@ -5252,7 +5392,8 @@
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CollNpcIDCollTime % npcID, updCollTime)
            SyncCollNPCTime(curPlayer, npcIDList=[npcID])
        GameWorld.DebugLog("        增加当日采集次数: todayCollTime=%s,updCollTime=%s" % (todayCollTime, updCollTime))
        #采集成就
        PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_Collect, successCnt, [npcID])
    SyncCollectionItemInfo(curPlayer, addExp, addMoney, addZhenQi, giveItemInfoList, npcID)
    #DataRecordPack.DR_CollectNPCOK(curPlayer, npcID, addMoney, addExp, addZhenQi, giveItemInfoList)
    return True
@@ -5311,38 +5452,38 @@
    GameWorld.DebugLog("    最终可得到物品giveItemInfoList=%s" % giveItemInfoList)
    
    syncItemInfoList = [] # 同步的采集到的物品信息列表
    for itemType, itemID, itemCnt, isBind in giveItemInfoList:
    for itemID, itemCnt, isBind in giveItemInfoList:
        if not ItemCommon.CheckPackHasSpace(curPlayer, IPY_GameWorld.rptItem):
            break
        
        isBind = setBind or isBind
        if itemType == 0:
            getItemObj = ItemControler.GetOutPutItemObj(itemID)
        elif itemType == 1:
            itemDictData = ItemControler.GetAppointItemDictData(itemID, isBind)
            getItemObj = ItemControler.GetItemByData(itemDictData)
        elif itemType == 2:
            quality = ItemCommon.GetRandEquipQualityByTable(itemID, "CollectEquipRandQuality")
            if quality == 0:
                isBroadcast = False
                getItemObj = ItemCommon.RandNormalEquip(curPlayer, itemID, isBind, "CollectNormalEquip")
            else:
                getItemObj, isBroadcast = ItemCommon.RandGreateEquip(curPlayer, itemID, isBind, "CollectGreateEquip", quality)
            if getItemObj == None:
                continue
            itemID = getItemObj.GetItemTypeID()
        getItemObj = ItemControler.GetOutPutItemObj(itemID)
#        elif itemType == 1:
#            itemDictData = ItemControler.GetAppointItemDictData(itemID, isBind)
#            getItemObj = ItemControler.GetItemByData(itemDictData)
#        elif itemType == 2:
#            quality = ItemCommon.GetRandEquipQualityByTable(itemID, "CollectEquipRandQuality")
#            if quality == 0:
#                isBroadcast = False
#                getItemObj = ItemCommon.RandNormalEquip(curPlayer, itemID, isBind, "CollectNormalEquip")
#            else:
#                getItemObj, isBroadcast = ItemCommon.RandGreateEquip(curPlayer, itemID, isBind, "CollectGreateEquip", quality)
#            if getItemObj == None:
#                continue
#
#            itemID = getItemObj.GetItemTypeID()
        userData = getItemObj.GetUserData()
        getItemObj.SetCount(itemCnt)
        getItemObj.SetIsBind(isBind)
        ItemCommon.NotifyItemDropByKill(curPlayer, getItemObj, npcID)
            
        SendGameServerGoodItemRecord(mapID, npcID, curPlayer.GetPlayerName(), curPlayer.GetPlayerID(), itemID)
        #SendGameServerGoodItemRecord(mapID, npcID, curPlayer.GetPlayerName(), curPlayer.GetPlayerID(), itemID)
        #可以放入背包
        if not ItemControler.DoLogic_PutItemInPack(curPlayer, getItemObj, True, True,
                                                   event=["CollectNPC", False, {"npcID":npcID}]):
            break
        syncItemInfoList.append([itemType, itemID, itemCnt, isBind, userData])
        syncItemInfoList.append([itemID, itemCnt, isBind, userData])
    return syncItemInfoList
## 采集结果同步