From f2fc5e799e2edfdbf87c37399033bddbb2f4f36f Mon Sep 17 00:00:00 2001 From: hch <305670599@qq.com> Date: 星期五, 21 九月 2018 21:08:41 +0800 Subject: [PATCH] 3428 子 【开发】神兽技能 / 【后端】神兽技能 --- 修复报错 --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py | 102 +++++++++++++++++++++++++++++++++++++++++--------- 1 files changed, 83 insertions(+), 19 deletions(-) diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py index 4ce8874..5a574e2 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py @@ -72,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初始化->出生调用 @@ -140,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: @@ -219,6 +223,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: @@ -296,6 +301,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] @@ -1205,6 +1212,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): @@ -1949,6 +1998,7 @@ if GetDropOwnerType(curNPC) == ChConfig.DropOwnerType_Family: FamilyRobBoss.ClearFamilyOwnerBossHurt(curNPC) + ChNPC.OnNPCSetDead(curNPC) # 清除队伍成员伤血列表 @@ -2836,6 +2886,7 @@ def __GetTeamHurtNPCPlayerIDList(self, refreshPoint, teamID, tick): + curNPC = self.__Instance teamHurtPlayerIDList = [] # 如果没有在线队员在有效范围内,则进一步判断离线队员是否有伤血保护中的 playerMgr = GameWorld.GetPlayerManager() @@ -2856,7 +2907,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: @@ -3045,10 +3097,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出现包通知 @@ -4246,7 +4301,13 @@ else: GameWorld.ErrLog("NPC归属异常:npcID=%s,hurtType=%s,hurtID=%s" % (npcID, hurtType, hurtID)) - + + if ChConfig.IsGameBoss(curNPC): + 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) @@ -4708,7 +4769,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: @@ -4722,7 +4786,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) @@ -4737,8 +4800,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 #--------------------------------------------------------------------- @@ -4760,10 +4823,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触发摸怪任务事件 @@ -4775,7 +4838,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): -- Gitblit v1.8.0