| | |
| | | import PlayerBossReborn
|
| | | import PlayerCrossYaomoBoss
|
| | | import PlayerActCollectWords
|
| | | import PlayerActGarbageSorting
|
| | | import PlayerActBossTrial
|
| | | import PlayerTongTianLing
|
| | | import CrossPlayerData
|
| | | import PlayerFeastWish
|
| | |
| | | def GetNPCSeries(curNPC): return curNPC.GetPoisionDef() # 毒防字段代表NPC系,按二进制位区分
|
| | |
|
| | | def DoNPCAttrStrengthen(curNPC, isReborn, isDyn=False):
|
| | | '''NPC属性增强, NPC属性成长由两个因素决定
|
| | | 1.NPC成长等级,成长等级决定成长属性,与成长表结合使用
|
| | | 可设置地图NPC等级动态成长,但是已经刷新出来的NPC等级不变,动态等级变更后刷新的NPC等级才会使用最新等级
|
| | | |
| | | 2.玩家人数因素,决定NPC属性的额外成长系数,可单独使用,或者和1一起使用
|
| | | 可设置马上刷新NPC属性
|
| | | 除血量外,其他属性会根据动态因素直接变更
|
| | | 血量会根据血量百分比动态变更至相应的百分比
|
| | | '''
|
| | | npcID = curNPC.GetNPCID()
|
| | | strengthenIpyData = IpyGameDataPY.GetIpyGameDataNotLog("NPCStrengthen", npcID)
|
| | | if not strengthenIpyData:
|
| | | #GameWorld.DebugLog("该NPC属性不成长!npcID=%s" % npcID)
|
| | | return
|
| | | |
| | | strengthenLV = 0
|
| | | strengthenPlayerCnt = 0
|
| | | |
| | | gameFB = GameWorld.GetGameFB()
|
| | | |
| | | if strengthenIpyData.GetIsStrengthenByPlayerCount():
|
| | | strengthenPlayerCnt = gameFB.GetGameFBDictByKey(ChConfig.Def_FB_NPCStrengthenPlayerCnt)
|
| | | if not strengthenPlayerCnt:
|
| | | GameWorld.ErrLog("NPC配置了按玩家人数成长类型,但是无法获取到对应的玩家人数!npcID=%s" % (npcID))
|
| | | return
|
| | | |
| | | lvStrengthenType = strengthenIpyData.GetLVStrengthenType()
|
| | | # 根据世界等级
|
| | | if lvStrengthenType == 3:
|
| | | strengthenLV = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_WorldAverageLv)
|
| | | # 根据最大等级
|
| | | elif lvStrengthenType == 2:
|
| | | strengthenLV = gameFB.GetGameFBDictByKey(ChConfig.Def_FB_NPCStrengthenMaxLV)
|
| | | # 根据平均等级
|
| | | elif lvStrengthenType == 1:
|
| | | strengthenLV = gameFB.GetGameFBDictByKey(ChConfig.Def_FB_NPCStrengthenAverageLV)
|
| | | # 根据按成长等级的上下限随机
|
| | | elif lvStrengthenType == 4:
|
| | | randMinLV = gameFB.GetGameFBDictByKey(ChConfig.Def_FB_NPCStrengthenMinLV)
|
| | | randMaxLV = gameFB.GetGameFBDictByKey(ChConfig.Def_FB_NPCStrengthenMaxLV)
|
| | | strengthenLV = random.randint(randMinLV, randMaxLV)
|
| | | # 根据境界难度
|
| | | elif lvStrengthenType == 5:
|
| | | realmLV = PlayerControl.GetDifficultyRealmLV(curNPC.GetSightLevel())
|
| | | realmNPCIpyData = IpyGameDataPY.GetIpyGameDataNotLog("NPCRealmStrengthen", npcID, realmLV)
|
| | | if realmNPCIpyData:
|
| | | strengthenLV = realmNPCIpyData.GetLV()
|
| | | else:
|
| | | lvStrengthenType = 0
|
| | | |
| | | # 木桩怪最大、平均成长等级处理,直接取归属玩家等级
|
| | | if lvStrengthenType in [1, 2] and curNPC.GetType() in [ChConfig.ntPriWoodPilePVE, ChConfig.ntPriWoodPilePVP]:
|
| | | owner = None
|
| | | summonPlayerID = curNPC.GetDictByKey(ChConfig.Def_NPC_Dict_PriWoodPilePlayerID)
|
| | | if summonPlayerID:
|
| | | owner = GameWorld.GetObj(summonPlayerID, IPY_GameWorld.gotPlayer)
|
| | | if owner:
|
| | | strengthenLV = owner.GetLV()
|
| | | |
| | | 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
|
| | | |
| | | # 副本特殊指定
|
| | | npcFBAttrDict = FBLogic.GetFBNPCStrengthenAttr(curNPC, isReborn)
|
| | | if "LV" in npcFBAttrDict:
|
| | | strengthenLV = npcFBAttrDict["LV"]
|
| | | |
| | | attrDict = {} #GetNPCStrengthenAttrDict(npcID, strengthenLV, strengthenPlayerCnt, strengthenIpyData)
|
| | | attrDict.update(npcFBAttrDict) # 如果副本有指定属性,则以副本为主
|
| | | if not attrDict:
|
| | | return
|
| | | |
| | | # 成长等级只在重生的时候设置一次
|
| | | if isReborn and curNPC.GetCurLV() != strengthenLV:
|
| | | curNPC.SetCurLV(strengthenLV, False) # 重生的不通知等级变更,属性成长刷新后由NPC出现包通知
|
| | | |
| | | befMaxHP = GameObj.GetMaxHP(curNPC)
|
| | | befHP = GameObj.GetHP(curNPC)
|
| | | #GameWorld.DebugLog("NPC属性成长刷新,isReborn=%s,npcID=%s,LV=%s,curLV=%s,befMaxHP=%s,befHP=%s,attrDict=%s" |
| | | # % (isReborn, npcID, curNPC.GetLV(), curNPC.GetCurLV(), befMaxHP, befHP, attrDict))
|
| | | for attrKey, strengthenValue in attrDict.items():
|
| | | if not hasattr(curNPC, "Set%s" % attrKey):
|
| | | if attrKey == "FightPower":
|
| | | SetSuppressFightPower(curNPC, strengthenValue)
|
| | | continue
|
| | | |
| | | if attrKey == "MaxHP":
|
| | | GameObj.SetMaxHP(curNPC, strengthenValue)
|
| | | else:
|
| | | strengthenValue = min(strengthenValue, ChConfig.Def_UpperLimit_DWord)
|
| | | getattr(curNPC, "Set%s" % attrKey)(strengthenValue)
|
| | | #GameWorld.DebugLog(" %s=%s" % (attrKey, strengthenValue))
|
| | | |
| | | aftMaxHP = GameObj.GetMaxHP(curNPC)
|
| | | if befMaxHP != aftMaxHP:
|
| | | if isReborn:
|
| | | GameObj.SetHP(curNPC, aftMaxHP)
|
| | | elif isDyn:
|
| | | # 动态刷新属性的,血量按百分比继承
|
| | | aftHP = int(aftMaxHP * befHP / befMaxHP)
|
| | | GameObj.SetHP(curNPC, aftHP)
|
| | | curNPC.Notify_HP()
|
| | | curNPC.Notify_MaxHP()
|
| | | #GameWorld.DebugLog(" aftHP=%s,aftMaxHP=%s" % (aftHP, aftMaxHP))
|
| | | |
| | | # 机器人复活初始化给技能
|
| | | if isReborn and curNPC.GetType() == ChConfig.ntRobot:
|
| | | __OnFBRobotReborn(curNPC, strengthenLV)
|
| | | |
| | | return
|
| | |
|
| | | def __OnFBRobotReborn(curNPC, npcLV):
|
| | |
| | | PlayerGubao.AddGubaoItemEffValue(curPlayer, PlayerGubao.GubaoEffType_KillCrossDemonLandBoss, 1)
|
| | | PlayerActTask.AddActTaskValue(curPlayer, ChConfig.ActTaskType_CrossDemonLandBoss, 1)
|
| | | if mapID in [ChConfig.Def_FBMapID_CrossPenglai, ChConfig.Def_FBMapID_CrossDemonLand]:
|
| | | PlayerActGarbageSorting.AddActGarbageTaskProgress(curPlayer, ChConfig.Def_GarbageTask_CrossBoss)
|
| | | PlayerTongTianLing.AddTongTianTaskValue(curPlayer, ChConfig.TTLTaskType_CrossBoss, 1)
|
| | | |
| | | if npcData.GetIsBoss() == ChConfig.Def_NPCType_Boss_Dark:
|
| | | PlayerActGarbageSorting.AddActGarbageTaskProgress(curPlayer, ChConfig.Def_GarbageTask_KillBoss)
|
| | |
|
| | | # 个人首杀记录
|
| | | ipyData = IpyGameDataPY.GetIpyGameDataNotLog("BOSSFirstKill", npcID)
|
| | |
| | | else:
|
| | | if GetNPCLV(curNPC) >= curPlayer.GetLV() - IpyGameDataPY.GetFuncCfg('DailyQuestKillMonster'):
|
| | | PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_KillNPC)
|
| | | PlayerActGarbageSorting.AddActGarbageTaskProgress(curPlayer, ChConfig.Def_GarbageTask_KillNPC)
|
| | | PlayerActTask.AddActTaskValue(curPlayer, ChConfig.ActTaskType_KillNPC)
|
| | | PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_FeastRedPack_KillSpecificNPC, 1, [npcID])
|
| | | #PlayerPrestigeSys.AddRealmTaskValue(curPlayer, PlayerPrestigeSys.RealmTaskType_KillNPC, 1)
|