| | |
| | | import SkillShell
|
| | | import BuffSkill
|
| | | import BaseAttack
|
| | | import PlayerTruck
|
| | | import ChNetSendPack
|
| | | import SkillCommon
|
| | | import AttackCommon
|
| | | import ItemControler
|
| | |
| | | paramDict["AtkReplyCoefficient"])) # 怪物攻击回复调整值
|
| | | MonterHurt = eval(FormulaControl.GetCompileFormula("NPCParam_MonterHurt", paramDict["MonterHurt"])) # 怪物固定伤害
|
| | | LostHPPerSecond = eval(FormulaControl.GetCompileFormula("NPCParam_LostHPPerSecond", paramDict["LostHPPerSecond"])) # 玩家每秒掉血量
|
| | | |
| | | attrStrengthenList = attrStrengthenDict.get(strengthenIpyData.GetLVStrengthenMark(), [])
|
| | | 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
|
| | |
| | | # 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 只掉本职业的
|
| | |
| | | # 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):
|
| | |
| | | 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:概率, ...}
|
| | |
| | | #范围校验
|
| | | 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)
|
| | |
|
| | |
| | | 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
|
| | |
|
| | |
|
| | |
| | | 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
|
| | |
|
| | |
| | | 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
|