hch
2019-01-05 dbd01953dab4d70a8854106bc9e0992f8fc04266
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
@@ -24,7 +24,7 @@
import SkillShell
import BuffSkill
import BaseAttack
import PlayerTruck
import ChNetSendPack
import SkillCommon
import AttackCommon
import ItemControler
@@ -47,7 +47,7 @@
import BossHurtMng
import PlayerSuperMarket
import GameLogic_FamilyInvade
#import GameLogic_MunekadoTrial
import GameLogic_GatherSoul
import FormulaControl
import PlayerMagicWeapon
import PlayerBossReborn
@@ -285,7 +285,7 @@
    
    attrDict = {}
    paramDict = attrStrengthenInfo[NPCAttr_ParamDict] # 过程参数公式字典
    attrStrengthenList = attrStrengthenInfo[NPCAttr_AttrStrengthenList] # 属性成长公式字典
    attrStrengthenDict = attrStrengthenInfo[NPCAttr_AttrStrengthenList] # 属性成长公式字典
    playerCntCoefficient = attrStrengthenInfo[NPCAttr_PlayerCntCoefficient] # 人数系数
    npcIDPlayerCntCoefficient = attrStrengthenInfo[NPCAttr_NPCPlayerCntCoefficient] # 特殊NPC人数系数
    baseMaxHP = npcData.GetHPEx() * ShareDefine.Def_PerPointValue + npcData.GetHP()
@@ -348,9 +348,10 @@
                                                                    paramDict["AtkReplyCoefficient"])) # 怪物攻击回复调整值
        MonterHurt = eval(FormulaControl.GetCompileFormula("NPCParam_MonterHurt", paramDict["MonterHurt"])) # 怪物固定伤害
        LostHPPerSecond = eval(FormulaControl.GetCompileFormula("NPCParam_LostHPPerSecond", paramDict["LostHPPerSecond"])) # 玩家每秒掉血量
        LVStrengthenMark = strengthenIpyData.GetLVStrengthenMark()
        attrStrengthenList = attrStrengthenDict.get(LVStrengthenMark, [])
        for attrKey, strengthenFormat in attrStrengthenList:
            strengthenValue = int(eval(FormulaControl.GetCompileFormula("NPCStrengthen_%s" % attrKey, strengthenFormat)))
            strengthenValue = int(eval(FormulaControl.GetCompileFormula("NPCStrengthen_%s_%s" % (attrKey,LVStrengthenMark), strengthenFormat)))
            #GameWorld.DebugLog("    %s=%s" % (attrKey, strengthenValue))
            locals()[attrKey] = strengthenValue # 创建该属性局部变量作为参数提供给后面属性计算时用
            attrDict[attrKey] = strengthenValue
@@ -1168,6 +1169,8 @@
    # 1. 职业物品ID集合
    job = curPlayer.GetJob()
    JobItemDropSets = IpyGameDataPY.GetFuncCfg("JobItemDropSets", 1) # {物品ID集合key:[职业顺序物品ID列表], ...}
    itemDropSets = IpyGameDataPY.GetFuncCfg("JobItemDropSets", 2) # {物品ID集合key:[随机物品ID列表], ...}
    itemDropRateSets = IpyGameDataPY.GetFuncCfg("JobItemDropSets", 3) # {物品ID集合key:[随机物品ID饼图列表], ...}
    ItemKeyMaxDropCountDict = ipyDrop.GetItemKeyMaxDropCount() # {物品ID集合key:随机次数,...}
    
    #     1.1 只掉本职业的
@@ -1198,20 +1201,14 @@
    #     1.2 随机掉落一个
    ItemKeyDropRateDict = ipyDrop.GetItemKeyDropRate() # {物品ID集合key:概率, ...}, 随机掉一个,优先级低
    if ItemKeyDropRateDict:
        for jobItemKey, dropRate in ItemKeyDropRateDict.items():
            if jobItemKey not in JobItemDropSets:
                continue
            jobItemList = JobItemDropSets[jobItemKey]
            if len(jobItemList) < job:
                GameWorld.ErrLog("职业物品集合key没有配置对应职业ID: npcID=%s,jobItemKey=%s,job=%s" % (npcID, jobItemKey, job))
                continue
        for itemKey, dropRate in ItemKeyDropRateDict.items():
            # 在只掉本职业里的不处理
            if jobItemKey in ItemKeyDropRateJobDict:
            if itemKey in ItemKeyDropRateJobDict:
                continue
            mustDropCount = dropRate / Def_NPCMaxDropRate
            dropRate = dropRate % Def_NPCMaxDropRate # 基础概率
            canDropCount = mustDropCount
            doCnt = ItemKeyMaxDropCountDict.get(jobItemKey, 1) # 默认1个
            doCnt = ItemKeyMaxDropCountDict.get(itemKey, 1) # 默认1个
            doCnt = __GetNPCDropDoCountChange(doCnt, doCountRate, doCountAdd)
            for _ in xrange(doCnt):
                if not GameWorld.CanHappen(dropRate, maxRate=Def_NPCMaxDropRate):
@@ -1219,9 +1216,20 @@
                canDropCount += 1
                
            for _ in xrange(canDropCount):
                randJobItemID = random.choice(jobItemList)
                dropItemIDList.append(randJobItemID)
                #GameWorld.DebugLog("掉落随机职业指定物品ID: jobItemKey=%s,randJobItemID=%s" % (jobItemKey, randJobItemID))
                if itemKey in itemDropRateSets:
                    randItemRateList = itemDropRateSets[itemKey]
                    randItemID = GameWorld.GetResultByRandomList(randItemRateList)
                    #GameWorld.DebugLog("掉落饼图物品ID: itemKey=%s,randItemRateList=%s,randItemID=%s" % (itemKey, randItemRateList, randItemID))
                elif itemKey in itemDropSets:
                    randItemList = itemDropSets[itemKey]
                    randItemID = random.choice(randItemList)
                    #GameWorld.DebugLog("掉落随机物品ID: itemKey=%s,randItemList=%s,randItemID=%s" % (itemKey, randItemList, randItemID))
                else:
                    continue
                if not randItemID:
                    continue
                dropItemIDList.append(randItemID)
                #GameWorld.DebugLog("掉落随机指定物品ID: itemKey=%s,randItemID=%s" % (itemKey, randItemID))
                
    # 2. 指定掉落ID处理, 受全局设定影响
    itemIDDropRateDict = ipyDrop.GetItemIDDropRate() # {物品ID:概率, ...}
@@ -3370,7 +3378,12 @@
        #范围校验
        posMapX = posMap.GetPosX()
        posMapY = posMap.GetPosY()
        posMapArea = posMap.GetArea()
        if curNPC.GetType() == IPY_GameWorld.ntFunctionNPC: #功能NPC
            posMapArea = 0
        else:
            posMapArea = posMap.GetArea()
        #获取范围内一点可以移动的点
        posX, poxY = GameMap.GetNearbyPosByDis(posMapX, posMapY, posMapArea)
        
@@ -3788,11 +3801,13 @@
        if not speedPer:
            if curNPC.GetDictByKey(ChConfig.Def_NPC_Dict_SpeedPer):
                curNPC.SetDict(ChConfig.Def_NPC_Dict_SpeedPer, 0)
            return
        speed = int(curNPC.GetSpeed() * (ShareDefine.Def_MaxRateValue) / max(100.0, float(ShareDefine.Def_MaxRateValue + speedPer)))
        curNPC.SetSpeed(speed)
        curNPC.SetDict(ChConfig.Def_NPC_Dict_SpeedPer, speedPer)
        else:
            speed = int(curNPC.GetSpeed() * (ShareDefine.Def_MaxRateValue) / max(100.0, float(ShareDefine.Def_MaxRateValue + speedPer)))
            curNPC.SetSpeed(speed)
            curNPC.SetDict(ChConfig.Def_NPC_Dict_SpeedPer, speedPer)
        if GameWorld.GetMap().GetMapID() == ChConfig.Def_FBMapID_GatherSoul:
            #目前只在聚魂副本里通知
            NPCSpeedChangeNotify(curNPC, curNPC.GetSpeed())
        return
    
    
@@ -4184,9 +4199,16 @@
                ownerType, ownerID = hurtType, hurtID
                itemCnt = moneyValue if itemID == moneyID else 1
                isBind = dropIDBindDict.get(itemID, 1)
            curItem = self.__CreateDropItem(curNPC, itemID, itemCnt, isBind)
            if not curItem:
                continue
            if mapID == ChConfig.Def_FBMapID_GatherSoul:#聚魂副本特殊处理
                GameLogic_GatherSoul.KillGatherSoulNPCDropAward(itemID, itemCnt, isBind)
                dropItemDataStr = ChItem.GetMapDropItemDataStr(curItem)
                self.SendVirtualItemDrop(ownerPlayer, itemID, resultX, resultY, dropItemDataStr)
                curItem.Clear()
                continue
            
            if isDropInItemPack:
@@ -4196,17 +4218,22 @@
                if ItemControler.DoLogic_PutItemInPack(ownerPlayer, curItem, True, True,
                                                       event=["NPCDrop", False, {"npcID":npcID}]):
                    #通知客户端
                    vItemDrop = ChPyNetSendPack.tagMCVirtualItemDrop()
                    vItemDrop.ItemTypeID = itemID
                    vItemDrop.PosX = resultX
                    vItemDrop.PosY = resultY
                    vItemDrop.UserData = dropItemDataStr
                    vItemDrop.UserDataLen = len(vItemDrop.UserData)
                    NetPackCommon.SendFakePack(ownerPlayer, vItemDrop)
                    self.SendVirtualItemDrop(ownerPlayer, itemID, resultX, resultY, dropItemDataStr)
            else:
                self.__MapCreateItem(curItem, resultX, resultY, ownerType, ownerID)
        return
    
    def SendVirtualItemDrop(self, player, itemID, posX, posY, userDataStr):
        #通知客户端
        vItemDrop = ChPyNetSendPack.tagMCVirtualItemDrop()
        vItemDrop.ItemTypeID = itemID
        vItemDrop.PosX = posX
        vItemDrop.PosY = posY
        vItemDrop.UserData = userDataStr
        vItemDrop.UserDataLen = len(vItemDrop.UserData)
        NetPackCommon.SendFakePack(player, vItemDrop)
        return
    #---------------------------------------------------------------------
    ## NPC被杀死逻辑处理
    #  @param self 类实例
@@ -4607,6 +4634,13 @@
                hurtID = killerDict.keys()[0]
                if isGameBoss:
                    GameWorld.Log("    归属默认玩家, npcID=%s,playerID=%s" % (npcID, hurtID))
            elif GameWorld.GetMap().GetMapID() == ChConfig.Def_FBMapID_GatherSoul:
                player = FBCommon.GetCurSingleFBPlayer()
                if player:
                    hurtID = player.GetPlayerID()
                    killerDict[hurtID] = player
                    hurtType = ChConfig.Def_NPCHurtTypePlayer
                    #GameWorld.Log("    聚魂副本归属默认玩家, npcID=%s,playerID=%s" % (npcID, hurtID))
                
        return killerDict, killTeam, hurtType, hurtID
    
@@ -6067,3 +6101,13 @@
    GameWorld.DebugLog("通知GameServer地图Boss分流信息: mapID=%s,lineID=%s,shuntPlayerDict=%s" % (mapID, lineID, shuntPlayerDict), lineID)
    return
def NPCSpeedChangeNotify(curNPC, speed):
    ##通知NPC速度
    sendPack = ChNetSendPack.tagObjInfoRefresh()
    sendPack.Clear()
    sendPack.ObjID = curNPC.GetID()
    sendPack.ObjType = curNPC.GetGameObjType()
    sendPack.RefreshType = IPY_GameWorld.CDBPlayerRefresh_Speed
    sendPack.Value = speed
    curNPC.NotifyAll(sendPack.GetBuffer(), sendPack.GetLength())
    return